From 4c8ef97760f0b82da6e019cfb8f8892e9498ea94 Mon Sep 17 00:00:00 2001 From: Derek Worthen Date: Tue, 27 Jan 2026 10:23:45 -0800 Subject: [PATCH 1/3] V3/main (#2190) * Remove graph embedding and UMAP (#2048) * Remove umap/layout operation * Remove graph embedding * Bump unified-search to GR 2.5.0 * Remove graph vis from unified-search * Remove file filtering (#2050) * Remove document filtering * Semver * Fix integ tests * Fix file find tuple * Fix another dangling find tuple * Remove text unit grouping (#2052) * Remove text unit group_by_columns * Semver * Fix default token split test * Fix models in config test samples * Fix token length in context sort test * Fix document sort * Re-implement hierarchical Leiden (#2049) * Use graspologic-native hierarchical leiden * Re-implement largest_connected_component * Copy in modularity * Use graspologic-native directly in pyproject * Remove directed graph tests (we don't use this) * Semver * Remove graspologic dep * Use 4.1 and text-embedding-3-large as defaults * Update comment * Clean vector store (#2077) * clean vector store code * fix * fix launch.json --------- Co-authored-by: Gaudy Blanco * Update v3/main missing config + functions (#2082) * reduce schema fields (#2089) * reduce schema fields * fix launch.json --------- Co-authored-by: Gaudy Blanco * Remove strategy dicts (#2090) * Remove "strategy" from community reports config/workflow * Remove extraction strategy from extract_graph * Remove summarization strategy from extract_graph * Remove strategy from claim extraction * Strongly type prompt templates * Remove strategy from embed_text * Push hydrated params into community report workflows * Push hyrdated params into extract covariates * Push hydrated params into extract graph NLP * Push hydrated params into extract graph * Push hydrated params into text embeddings * Remove a few more low-level defaults * Semver * Remove configurable prompt delimiters * Update smoke tests * Remove fnllm (#2095) * Sort deps alpha * Remove multi search (#2093) * Remove multi-search from CLI * Remove multi-search from API * Flatten vector_store config * Push hydrated vector store down to embed_text * Remove outputs from config * Remove multi-search notebook/docs * Add missing response_type in basic search API * Fix basic search context and id mapping * Fix v1 migration notebook * Fix query entity search tests * V3 docs and cleanup (#2100) * Remove community contrib notebooks * Add migration notebook and breaking changes page edits * Update/polish docs * Make model instance name configurable * Add vector schema updates to v3 migration notebook * Spellcheck * Bump smoke test runtimes * Remove document overwrite (#2101) * remove document overwrite from vector store configuration * remove document overwrite and refactor load documents method * fix test * fix test * fix test --------- Co-authored-by: Gaudy Blanco * Unified factory (#2105) * Simplify Factory interface * Migrate CacheFactory to standard base class * Migrate LoggerFactory to standard base class * Migrate StorageFactory to standard base class * Migrate VectorStoreFactory to standard base class * Update vector store example notebook * Delete notebook outputs * Move default providers into factories * Move retry/limit tests into integ * Split language model factories * Set smoke test tpm/rpm * Fix factory integ tests * Add method to smoke test, switch text to 'fast' * Fix text smoke config for fast workflow * Add new workflows to text smoke test * Convert input readers to a proper factory * Remove covariates from fast smoke test * Update docs for input factory * Bump smoke runtime * Even longer runtime * min-csv timeout * Remove unnecessary lambdas * Prefix vector store (#2106) * add prefix to vector store configuration and removal of container name * docs updated * change prefix property name * change prefix property name * feedback implemented --------- Co-authored-by: Gaudy Blanco * fix for container name * Restructure project as monorepo. (#2111) * Restructure project as monorepo. * Fix formatting * Storage fixes and cleanup (#2118) * Fix pipeline recursion * Remove base_dir from storage.find * Remove max_count from storage.find * Remove prefix on storage integ test * Add base_dir in creation_date test * Wrap base_dir in Path * Use constants for input/update directories * Nov 2025 housekeeping (#2120) * Remove gensim sideload * Split CI build/type checks from unit tests * Thorough review of docs to align with v3 * Format * Fix version * Fix type * Graphrag config (#2119) * Add load_config to graphrag-common package. * Empty graph guards (#2126) * Remove networkx from graph_extractor and clean out redundancy * Bubble pipeline error to console * Remove embeddings optional new (#2128) * remove optional embeddings * fix test * fix tests * fix pipeline * fix test * fix test * fix test * fix tests --------- Co-authored-by: Gaudy Blanco * Format * Add empty checks for NLP graphs (#2133) * Init command asks for models (#2137) * Add init prompting for models * Remove hard-coded model config validation * Switch to typer option prompt for full CLI use with models * Update getting started for init model input * Bump request timeout and overall smoke test timeout * Add graphrag-storage. (#2127) * Add graphrag-storage. * Python update (3.13) (#2149) * Update to python 3.14 as default, with range down to 3.10 * Fix enum value in query cli * Update pyarrow * Update py version for storage package * Remove 3.10 * add fastuuid * Update Python support to 3.11-3.14 with stricter dependency constraints - Set minimum Python version to 3.11 (removed 3.10 support) - Added support for Python 3.14 - Updated CI workflows: single-version jobs use 3.14, matrix jobs use 3.11 and 3.14 - Fixed license format to use SPDX-compatible format for Python 3.14 - Updated pyarrow to >=22.0.0 for Python 3.14 wheel support - Added explicit fastuuid~=0.14 and blis~=1.3 for Python 3.14 compatibility - Replaced all loose version constraints (>=) with compatible release (~=) for better lock file control - Applied stricter versioning to all packages: graphrag, graphrag-common, graphrag-storage, unified-search-app * update uv lock * Pin blis to ~=1.3.3 to ensure Python 3.14 wheel availability * Update uv lock * Update numpy to >=2.0.0 for Python 3.14 Windows compatibility Numpy 1.25.x has access violation issues on Python 3.14 Windows. Numpy 2.x has proper Python 3.14 support including Windows wheels. * update uv lock * Update pandas to >=2.3.0 for numpy 2.x compatibility Pandas 2.2.x was compiled against numpy 1.x and causes ABI incompatibility errors with numpy 2.x. Pandas 2.3.0+ supports numpy 2.x properly. * update uv.lock * Add scipy>=1.15.0 for numpy 2.x compatibility Scipy versions < 1.15.0 have C extensions built against numpy 1.x and are incompatible with numpy 2.x, causing dtype size errors. * update uv lock * Update Python support to 3.11-3.13 with compatible dependencies - Set Python version range to 3.11-3.13 (removed 3.14 support) - Updated CI workflows: single-version jobs use 3.13, matrix jobs use 3.11 and 3.13 - Dependencies optimized for Python 3.13 compatibility: - pyarrow~=22.0 (has Python 3.13 wheels) - numpy~=1.26 - pandas~=2.2 - blis~=1.0 - fastuuid~=0.13 - Applied stricter version constraints using ~= operator throughout - Updated uv.lock with resolved dependencies * Update numpy to 2.1+ and pandas to 2.3+ for Python 3.13 Windows compatibility Numpy 1.26.x causes access violations on Python 3.13 Windows. Numpy 2.1+ has proper Python 3.13 support with Windows wheels. Pandas 2.3+ is required for numpy 2.x compatibility. * update vsts.yml python version * Add GraphRAG Cache package. (#2153) * Add GraphRAG Cache package. * Fix a bunch of module comments and function visibility (#2154) * Issue #2004 fix (#2159) * fix issue #2004 using KeenhoChu idea in his PR * add unit test for dynamic community selection * add unit test for dynamic community selection implementing #2158 logic --------- Co-authored-by: Gaudy Blanco * Mismatch between header in community report generation prompt examples and input data (id vs human_readable_id) (#2161) * fix issue #860 for mismatch in prompts and input * fix format --------- Co-authored-by: Gaudy Blanco * Chunker factory (#2156) * Delete NoopTextSplitter * Delete unused check_token_limit * Add base chunking factory and migrate workflow to use it * Split apart chunker module * Co-locate chunking/splitting * Collapse token splitting functionality into one class/function * Restore create_base_text_units parameterization * Move Tokenizer base class to common package * Move pre-pending into chunkers * Streamline config * Fix defaults construction * Add prepending tests * Remove chunk_size_includes_metadata config * Revert ChunkingDocument interface * Move metadata prepending to a util * Move Tokenizer back to GR core * Fix tokenizer removal from chunker * Set defaults for chunking config * Move chunking to monorepo package * Format * Typo * Add ChunkResult model * Streamline chunking config * Add missing version updates for graphrag_chunking * Input factory (#2168) * Update input factory to match other factories * Move input config alongside input readers * Move file pattern logic into InputReader * Set encoding default * Clean up optional column configs * Combine structured data extraction * Remove pandas from input loading * Throw if empty documents * Add json lines (jsonl) input support * Store raw data * Fix merge imports * Move metadata handling entirely to chunking * Nicer automatic title * Typo * Add get_property utility for nested dictionary access with dot notation * Update structured_file_reader to use get_property utility * Extract input module into new graphrag-input monorepo package - Create new graphrag-input package with input loading utilities - Move InputConfig, InputFileType, InputReader, TextDocument, and file readers (CSV, JSON, JSONL, Text) - Add get_property utility for nested dictionary access with dot notation - Include hashing utility for document ID generation - Update all imports throughout codebase to use graphrag_input - Add package to workspace configuration and release tasks - Remove old graphrag.index.input module * Rename ChunkResult to TextChunk and add transformer support - Rename chunk_result.py to text_chunk.py with ChunkResult -> TextChunk - Add 'original' field to TextChunk to track pre-transform text - Add optional transform callback to chunker.chunk() method - Add add_metadata transformer for prepending metadata to chunks - Update create_chunk_results to apply transforms and populate original - Update sentence_chunker and token_chunker with transform support - Refactor create_base_text_units to use new transformer pattern - Rename pluck_metadata to get/collect methods on TextDocument * Back-compat comment * Align input config type name with other factory configs * Add MarkItDown support * Remove pattern default from MarkItDown reader * Remove plugins flag (implicit disabled) * Format * Update verb tests * Separate storage from input config * Add empty objects for NaN raw_data * Fix smoke tests * Fix BOM in csv smoke * Format * DRIFT fixes (#2171) * Use stable ids for community reports * Remove deprecated title from embedding flow * Remove embedding column from df loaders * Fix lancedb insertion * Add drift back to smoke tests * Fix mock embedder to match default embedding length * Fix DRIFT notebook * Push drift_k_followups through to prompt * Format * Vector package (#2172) * Extract graphrag-vectors package * Simplify vector factory usage and config defaults * Update factory integ initializers * Fix mock patch * Format * Register vector stores in tests * Set a default vector store name * Update vector readme * Remove impls from init * Move some validation into impls * Remove index_prefix * Move duplicate method to base class * Fix smoke vector config * Update index bug (#2173) * fix update index bug * blob storage bug fix --------- Co-authored-by: Gaudy Blanco * Add GraphRAG LLM package. (#2174) * Update documentation for v3 release (#2176) update documentation for v3 release Co-authored-by: Gaudy Blanco * Graphrag llm cleanup (#2181) * Migration update (#2180) * fix formatting. --------- Co-authored-by: Nathan Evans Co-authored-by: gaudyb <85708998+gaudyb@users.noreply.github.com> Co-authored-by: Gaudy Blanco Co-authored-by: Andres Morales <86074752+andresmor-ms@users.noreply.github.com> --- .github/workflows/gh-pages.yml | 4 +- .github/workflows/python-checks.yml | 78 + .../workflows/python-integration-tests.yml | 7 +- .github/workflows/python-notebook-tests.yml | 8 +- .github/workflows/python-publish.yml | 14 +- .github/workflows/python-smoke-tests.yml | 7 +- .../{python-ci.yml => python-unit-tests.yml} | 15 +- .gitignore | 5 + .../major-20260123143225940955.json | 4 + .vscode/launch.json | 41 +- .vsts-ci.yml | 2 +- breaking-changes.md | 29 + dictionary.txt | 1 + docs/config/env_vars.md | 219 -- docs/config/models.md | 97 +- docs/config/overview.md | 1 - docs/config/yaml.md | 299 ++- docs/developing.md | 2 +- docs/examples_notebooks/api_overview.ipynb | 24 +- .../custom_vector_store.ipynb | 280 +- docs/examples_notebooks/drift_search.ipynb | 57 +- docs/examples_notebooks/global_search.ipynb | 1 - ...rch_with_dynamic_community_selection.ipynb | 1 - .../index_migration_to_v1.ipynb | 58 +- .../index_migration_to_v2.ipynb | 1 - .../index_migration_to_v3.ipynb | 146 + docs/examples_notebooks/input_documents.ipynb | 21 +- .../operation dulce/communities.parquet | Bin 13291 -> 14094 bytes .../operation dulce/community_reports.parquet | Bin 51718 -> 88785 bytes .../inputs/operation dulce/covariates.parquet | Bin 21453 -> 26494 bytes .../embeddings.community_full_content.parquet | Bin 0 -> 220010 bytes .../inputs/operation dulce/entities.parquet | Bin 12361 -> 19483 bytes .../auxiliary.idx | Bin 0 -> 12931 bytes .../index.idx | Bin 0 -> 12626 bytes ...0-a943ac34-0e87-43c2-80d0-8f83fb80f4f5.txn | Bin 0 -> 283 bytes ...1-ec798d7b-a8bf-4985-a5d0-784434802168.txn | Bin 0 -> 146 bytes ...2-78887911-d792-4dc9-b28d-f2858db1139a.txn | Bin 0 -> 64 bytes ...3-c16be721-5d7e-46a0-98c2-34d5d9c29383.txn | Bin 0 -> 107 bytes .../_versions/1.manifest | Bin 0 -> 358 bytes .../_versions/2.manifest | Bin 0 -> 467 bytes .../_versions/3.manifest | Bin 0 -> 294 bytes .../_versions/4.manifest | Bin 0 -> 360 bytes ...667cccff-01b5-4b70-a2a6-8cf4d6ada077.lance | Bin 0 -> 12853 bytes ...a84d995f-111c-45d1-ba5a-32b3747b8a18.lance | Bin 0 -> 124729 bytes ...0-2fed1d8b-daac-41b0-a93a-e115cda75be3.txn | 2 - ...1-61dbb7c2-aec3-4796-b223-941fc7cc93cc.txn | Bin 107 -> 0 bytes ...2-60012692-a153-48f9-8f4e-c479b44cbf3f.txn | 2 - ...3-0d2dc9a1-094f-4220-83c7-6ad6f26fac2b.txn | Bin 107 -> 0 bytes .../_versions/1.manifest | Bin 303 -> 0 bytes .../_versions/2.manifest | Bin 367 -> 0 bytes .../_versions/3.manifest | Bin 302 -> 0 bytes .../_versions/4.manifest | Bin 366 -> 0 bytes ...1e7b2d94-ed06-4aa0-b22e-86a71d416bc6.lance | Bin 38577 -> 0 bytes ...1ed9f301-ce30-46a8-8c0b-9c2a60a3cf43.lance | Bin 28592 -> 0 bytes ...0-92c031e5-7558-451e-9d0f-f5514db9616d.txn | 2 - ...1-7b3cb8d8-3512-4584-a003-91838fed8911.txn | Bin 107 -> 0 bytes ...2-7de627d2-4c57-49e9-bf73-c17a9582ead4.txn | 2 - ...3-9ad29d69-9a69-43a8-8b26-252ea267958d.txn | Bin 107 -> 0 bytes .../_versions/1.manifest | Bin 303 -> 0 bytes .../_versions/2.manifest | Bin 367 -> 0 bytes .../_versions/3.manifest | Bin 303 -> 0 bytes .../_versions/4.manifest | Bin 367 -> 0 bytes ...a34575c4-5260-457f-bebe-3f40bc0e2ee3.lance | Bin 120119 -> 0 bytes ...eabd7580-86f5-4022-8aa7-fe0aff816d98.lance | Bin 119927 -> 0 bytes ...0-fd0434ac-e5cd-4ddd-9dd5-e5048d4edb59.txn | 2 - ...1-14bb4b1d-cc00-420b-9b14-3626f0bd8c0b.txn | Bin 107 -> 0 bytes ...2-8e74264c-f72d-44f5-a6f4-b3b61ae6a43b.txn | 2 - ...3-7516fb71-9db3-4666-bdef-ea04c1eb9697.txn | Bin 107 -> 0 bytes .../_versions/1.manifest | Bin 302 -> 0 bytes .../_versions/2.manifest | Bin 366 -> 0 bytes .../_versions/3.manifest | Bin 302 -> 0 bytes .../_versions/4.manifest | Bin 366 -> 0 bytes ...2794bf5b-de3d-4202-ab16-e76bc27c8e6a.lance | Bin 80120 -> 0 bytes ...2f74c8e8-3f35-4209-889c-a13cf0780eb3.lance | Bin 80120 -> 0 bytes .../auxiliary.idx | Bin 0 -> 12931 bytes .../index.idx | Bin 0 -> 12626 bytes ...0-5b75ba0a-bae9-4244-8a6b-31de09f7e03d.txn | Bin 0 -> 283 bytes ...1-71f2ac8d-a101-467d-b57d-2dea6d14f7a7.txn | Bin 0 -> 146 bytes ...2-d621e621-8e92-419f-99e4-f1c7d163bcc2.txn | Bin 0 -> 64 bytes ...3-4ada922f-cf85-44df-bc8b-b132e35009d0.txn | Bin 0 -> 107 bytes ...4-dcac110d-2a49-4777-a51e-5078fed1b0df.txn | 1 + ...5-ec86af9f-b799-4457-b07a-24a3459dd952.txn | Bin 0 -> 107 bytes ...6-c2afb84c-4b3a-4ccd-8843-0deaa25bd971.txn | 1 + ...7-6798041f-3283-4b54-8313-54f80e00d338.txn | Bin 0 -> 107 bytes .../_versions/1.manifest | Bin 0 -> 358 bytes .../_versions/2.manifest | Bin 0 -> 467 bytes .../_versions/3.manifest | Bin 0 -> 295 bytes .../_versions/4.manifest | Bin 0 -> 361 bytes .../_versions/5.manifest | Bin 0 -> 360 bytes .../_versions/6.manifest | Bin 0 -> 426 bytes .../_versions/7.manifest | Bin 0 -> 427 bytes .../_versions/8.manifest | Bin 0 -> 493 bytes ...2677858d-16a4-4c0c-9515-ed5a9ee32fd7.lance | Bin 0 -> 86776 bytes ...4ed23c16-d11c-49b5-869d-653cfbd9c271.lance | Bin 0 -> 12853 bytes ...5370b2ef-efd3-434e-9745-9d046b53bb4a.lance | Bin 0 -> 197754 bytes ...ec59d894-a2a6-4a44-8266-d07bbd684c33.lance | Bin 0 -> 197754 bytes .../auxiliary.idx | Bin 0 -> 12931 bytes .../index.idx | Bin 0 -> 12626 bytes ...0-9abee4db-9914-4c35-b600-d995235f8e27.txn | Bin 0 -> 283 bytes ...1-302f5740-fbd0-4887-9933-13a2842ec8e4.txn | Bin 0 -> 146 bytes ...2-551a917c-5ab9-46a7-9085-fd82aa879717.txn | Bin 0 -> 64 bytes ...3-b0b6e7bb-a152-4148-be3b-d1ab50215bda.txn | Bin 0 -> 107 bytes .../text_unit_text.lance/_versions/1.manifest | Bin 0 -> 357 bytes .../text_unit_text.lance/_versions/2.manifest | Bin 0 -> 466 bytes .../text_unit_text.lance/_versions/3.manifest | Bin 0 -> 294 bytes .../text_unit_text.lance/_versions/4.manifest | Bin 0 -> 360 bytes ...4105076e-7a55-4549-b86a-51c6bfa68ea5.lance | Bin 0 -> 12853 bytes ...a28d4629-848b-4e1d-854d-cad6297a0c1a.lance | Bin 0 -> 62584 bytes .../operation dulce/relationships.parquet | Bin 13354 -> 21686 bytes .../inputs/operation dulce/text_units.parquet | Bin 28854 -> 30769 bytes docs/examples_notebooks/local_search.ipynb | 8 +- .../multi_index_search.ipynb | 558 ---- docs/get_started.md | 81 +- docs/index/architecture.md | 24 +- docs/index/byog.md | 4 +- docs/index/default_dataflow.md | 111 +- docs/index/inputs.md | 70 +- docs/index/methods.md | 6 +- docs/index/outputs.md | 4 +- docs/index/overview.md | 3 +- docs/prompt_tuning/auto_prompt_tuning.md | 24 +- docs/prompt_tuning/overview.md | 4 +- docs/query/drift_search.md | 2 +- docs/query/global_search.md | 2 +- docs/query/local_search.md | 2 +- docs/query/multi_index_search.md | 20 - docs/query/overview.md | 17 +- docs/query/question_generation.md | 2 +- docs/visualization_guide.md | 7 - .../community_contrib/README.md | 5 - .../neo4j/graphrag_import_neo4j_cypher.ipynb | 1215 --------- .../graph-visualization.ipynb | 523 ---- .../_latest.manifest | Bin 305 -> 0 bytes ...0-498c6e24-dd0a-42b9-8f7e-5e3d2ab258b0.txn | 1 - ...1-bf5aa024-a229-461f-8d78-699841a302fe.txn | Bin 100 -> 0 bytes .../_versions/1.manifest | Bin 249 -> 0 bytes .../_versions/2.manifest | Bin 305 -> 0 bytes ...fe64774f-5412-4c9c-8dea-f6ed55c81119.lance | Bin 1394345 -> 0 bytes graphrag/api/query.py | 1226 --------- graphrag/cache/__init__.py | 4 - graphrag/cache/factory.py | 115 - graphrag/cli/query.py | 534 ---- graphrag/config/create_graphrag_config.py | 43 - graphrag/config/embeddings.py | 48 - graphrag/config/enums.py | 176 -- graphrag/config/environment_reader.py | 155 -- graphrag/config/get_embedding_settings.py | 38 - graphrag/config/load_config.py | 191 -- graphrag/config/models/cache_config.py | 38 - graphrag/config/models/chunking_config.py | 42 - graphrag/config/models/embed_graph_config.py | 45 - graphrag/config/models/graph_rag_config.py | 416 --- graphrag/config/models/input_config.py | 50 - .../config/models/language_model_config.py | 403 --- graphrag/config/models/storage_config.py | 52 - .../config/models/text_embedding_config.py | 52 - graphrag/config/models/umap_config.py | 17 - graphrag/config/models/vector_store_config.py | 111 - graphrag/config/read_dotenv.py | 25 - graphrag/factory/factory.py | 68 - graphrag/index/input/__init__.py | 4 - graphrag/index/input/csv.py | 43 - graphrag/index/input/factory.py | 56 - graphrag/index/input/json.py | 47 - graphrag/index/input/text.py | 35 - graphrag/index/input/util.py | 86 - .../index/operations/chunk_text/__init__.py | 4 - .../index/operations/chunk_text/chunk_text.py | 140 - .../index/operations/chunk_text/strategies.py | 69 - .../index/operations/chunk_text/typing.py | 27 - .../index/operations/embed_graph/__init__.py | 4 - .../operations/embed_graph/embed_graph.py | 50 - .../operations/embed_graph/embed_node2vec.py | 43 - .../index/operations/embed_graph/typing.py | 12 - .../index/operations/embed_text/embed_text.py | 246 -- .../embed_text/strategies/__init__.py | 4 - .../operations/embed_text/strategies/mock.py | 35 - .../embed_text/strategies/typing.py | 28 - .../extract_covariates/claim_extractor.py | 236 -- .../extract_graph/graph_extractor.py | 300 --- .../graph_intelligence_strategy.py | 102 - .../index/operations/extract_graph/typing.py | 57 - .../index/operations/layout_graph/__init__.py | 4 - .../operations/layout_graph/layout_graph.py | 84 - .../index/operations/layout_graph/typing.py | 27 - .../index/operations/layout_graph/umap.py | 132 - .../index/operations/layout_graph/zero.py | 96 - .../summarize_communities/strategies.py | 85 - .../graph_intelligence_strategy.py | 65 - .../summarize_descriptions/typing.py | 48 - .../index/text_splitting/check_token_limit.py | 15 - .../index/text_splitting/text_splitting.py | 173 -- graphrag/index/validate_config.py | 53 - .../index/workflows/create_base_text_units.py | 163 -- graphrag/language_model/__init__.py | 4 - graphrag/language_model/cache/__init__.py | 4 - graphrag/language_model/cache/base.py | 36 - graphrag/language_model/events/__init__.py | 4 - graphrag/language_model/events/base.py | 19 - graphrag/language_model/factory.py | 123 - graphrag/language_model/manager.py | 153 -- graphrag/language_model/protocol/__init__.py | 4 - graphrag/language_model/protocol/base.py | 166 -- graphrag/language_model/providers/__init__.py | 4 - .../language_model/providers/fnllm/cache.py | 44 - .../language_model/providers/fnllm/events.py | 26 - .../language_model/providers/fnllm/models.py | 443 ---- .../language_model/providers/fnllm/utils.py | 165 -- .../providers/litellm/__init__.py | 4 - .../providers/litellm/chat_model.py | 414 --- .../providers/litellm/embedding_model.py | 280 -- .../providers/litellm/get_cache_key.py | 140 - .../litellm/request_wrappers/__init__.py | 4 - .../litellm/request_wrappers/with_cache.py | 107 - .../litellm/request_wrappers/with_logging.py | 56 - .../request_wrappers/with_rate_limiter.py | 97 - .../litellm/request_wrappers/with_retries.py | 54 - .../providers/litellm/services/__init__.py | 4 - .../litellm/services/rate_limiter/__init__.py | 4 - .../rate_limiter/rate_limiter_factory.py | 22 - .../rate_limiter/static_rate_limiter.py | 133 - .../litellm/services/retry/__init__.py | 4 - .../services/retry/exponential_retry.py | 83 - .../services/retry/incremental_wait_retry.py | 81 - .../services/retry/native_wait_retry.py | 66 - .../services/retry/random_wait_retry.py | 79 - .../providers/litellm/services/retry/retry.py | 33 - .../litellm/services/retry/retry_factory.py | 18 - .../language_model/providers/litellm/types.py | 235 -- graphrag/language_model/response/__init__.py | 4 - graphrag/language_model/response/base.py | 71 - graphrag/language_model/response/base.pyi | 50 - graphrag/logger/factory.py | 113 - graphrag/prompts/index/extract_graph.py | 129 - graphrag/storage/factory.py | 83 - graphrag/storage/pipeline_storage.py | 99 - graphrag/tokenizer/tokenizer.py | 53 - graphrag/utils/api.py | 287 -- graphrag/vector_stores/__init__.py | 4 - graphrag/vector_stores/azure_ai_search.py | 214 -- graphrag/vector_stores/base.py | 90 - graphrag/vector_stores/factory.py | 96 - graphrag/vector_stores/lancedb.py | 176 -- packages/graphrag-cache/README.md | 109 + .../graphrag-cache/graphrag_cache/__init__.py | 20 + .../graphrag-cache/graphrag_cache/cache.py | 17 +- .../graphrag_cache/cache_config.py | 26 + .../graphrag_cache/cache_factory.py | 95 + .../graphrag_cache/cache_key.py | 36 + .../graphrag_cache/cache_type.py | 15 + .../graphrag_cache/json_cache.py | 39 +- .../graphrag_cache/memory_cache.py | 21 +- .../graphrag_cache/noop_cache.py | 13 +- .../graphrag-cache/graphrag_cache/py.typed | 0 packages/graphrag-cache/pyproject.toml | 43 + packages/graphrag-chunking/README.md | 41 + .../graphrag_chunking}/__init__.py | 2 + .../graphrag_chunking/bootstrap_nltk.py | 0 .../graphrag_chunking/chunk_strategy_type.py | 13 + .../graphrag_chunking/chunker.py | 24 + .../graphrag_chunking/chunker_factory.py | 77 + .../graphrag_chunking/chunking_config.py | 36 + .../graphrag_chunking/create_chunk_results.py | 32 + .../graphrag_chunking/sentence_chunker.py | 48 + .../graphrag_chunking/text_chunk.py | 29 + .../graphrag_chunking/token_chunker.py | 69 + .../graphrag_chunking/transformers.py | 25 + packages/graphrag-chunking/pyproject.toml | 43 + packages/graphrag-common/README.md | 125 + .../graphrag_common}/__init__.py | 2 +- .../graphrag_common/config/__init__.py | 8 + .../graphrag_common/config/load_config.py | 205 ++ .../graphrag_common/factory/__init__.py | 8 + .../graphrag_common/factory/factory.py | 113 + .../graphrag_common/hasher/__init__.py | 18 + .../graphrag_common/hasher/hasher.py | 59 + .../graphrag-common/graphrag_common/py.typed | 0 packages/graphrag-common/pyproject.toml | 43 + packages/graphrag-input/README.md | 72 + .../graphrag-input/graphrag_input/__init__.py | 20 + packages/graphrag-input/graphrag_input/csv.py | 38 + .../graphrag_input/get_property.py | 36 + .../graphrag-input/graphrag_input/hashing.py | 27 + .../graphrag_input/input_config.py | 40 + .../graphrag_input/input_reader.py | 75 + .../graphrag_input/input_reader_factory.py | 90 + .../graphrag_input/input_type.py | 25 + .../graphrag-input/graphrag_input/json.py | 38 + .../graphrag-input/graphrag_input/jsonl.py | 38 + .../graphrag_input/markitdown.py | 49 + .../graphrag_input/structured_file_reader.py | 65 + .../graphrag-input/graphrag_input/text.py | 43 + .../graphrag_input/text_document.py | 59 + packages/graphrag-input/pyproject.toml | 44 + packages/graphrag-llm/README.md | 87 + packages/graphrag-llm/graphrag_llm/README.md | 83 + .../graphrag-llm/graphrag_llm/__init__.py | 8 + .../graphrag_llm/cache/__init__.py | 10 + .../graphrag_llm/cache/create_cache_key.py | 71 + .../graphrag_llm/completion/__init__.py | 16 + .../graphrag_llm/completion/completion.py | 276 ++ .../completion/completion_factory.py | 150 ++ .../completion/lite_llm_completion.py | 314 +++ .../completion/mock_llm_completion.py | 134 + .../graphrag_llm/config/__init__.py | 42 + .../graphrag_llm/config/metrics_config.py | 57 + .../graphrag_llm/config/model_config.py | 111 + .../graphrag_llm/config/rate_limit_config.py | 60 + .../graphrag_llm/config/retry_config.py | 69 + .../config/template_engine_config.py | 69 + .../graphrag_llm/config/tokenizer_config.py | 51 + .../graphrag-llm/graphrag_llm/config/types.py | 72 + .../graphrag_llm/embedding/__init__.py | 16 + .../graphrag_llm/embedding/embedding.py | 191 ++ .../embedding/embedding_factory.py | 150 ++ .../embedding/lite_llm_embedding.py | 198 ++ .../embedding/mock_llm_embedding.py | 81 + .../graphrag_llm/metrics/__init__.py | 34 + .../metrics/default_metrics_processor.py | 130 + .../metrics/file_metrics_writer.py | 37 + .../metrics/log_metrics_writer.py | 39 + .../metrics/memory_metrics_store.py | 112 + .../metrics/metrics_aggregator.py | 142 + .../graphrag_llm/metrics/metrics_processor.py | 59 + .../metrics/metrics_processor_factory.py | 79 + .../graphrag_llm/metrics/metrics_store.py | 81 + .../metrics/metrics_store_factory.py | 91 + .../graphrag_llm/metrics/metrics_writer.py | 32 + .../metrics/metrics_writer_factory.py | 91 + .../metrics/noop_metrics_store.py | 41 + .../graphrag_llm/middleware/__init__.py | 24 + .../graphrag_llm/middleware/with_cache.py | 153 ++ .../middleware/with_errors_for_testing.py | 83 + .../graphrag_llm/middleware/with_logging.py | 73 + .../graphrag_llm/middleware/with_metrics.py | 98 + .../middleware/with_middleware_pipeline.py | 154 ++ .../middleware/with_rate_limiting.py | 79 + .../middleware/with_request_count.py | 81 + .../graphrag_llm/middleware/with_retries.py | 60 + .../model_cost_registry/__init__.py | 11 + .../model_cost_registry.py | 65 + packages/graphrag-llm/graphrag_llm/py.typed | 0 .../graphrag_llm/rate_limit/__init__.py | 16 + .../rate_limit/rate_limit_factory.py | 84 + .../graphrag_llm/rate_limit}/rate_limiter.py | 13 +- .../rate_limit/sliding_window_rate_limiter.py | 143 + .../graphrag_llm/retry/__init__.py | 13 + .../graphrag_llm/retry/exceptions_to_skip.py | 22 + .../graphrag_llm/retry/exponential_retry.py | 119 + .../graphrag_llm/retry/immediate_retry.py | 85 + .../graphrag-llm/graphrag_llm/retry/retry.py | 32 + .../graphrag_llm/retry/retry_factory.py | 86 + .../graphrag_llm/templating/__init__.py | 24 + .../templating/file_template_manager.py | 76 + .../templating/jinja_template_engine.py | 55 + .../templating/template_engine.py | 53 + .../templating/template_engine_factory.py | 95 + .../templating/template_manager.py | 65 + .../templating/template_manager_factory.py | 82 + .../graphrag_llm/threading/__init__.py | 10 + .../threading/completion_thread.py | 91 + .../threading/completion_thread_runner.py | 243 ++ .../threading/embedding_thread.py | 88 + .../threading/embedding_thread_runner.py | 216 ++ .../graphrag_llm/tokenizer/__init__.py | 16 + .../tokenizer/lite_llm_tokenizer.py | 25 +- .../tokenizer/tiktoken_tokenizer.py | 28 +- .../graphrag_llm/tokenizer/tokenizer.py | 111 + .../tokenizer/tokenizer_factory.py | 89 + .../graphrag_llm/types/__init__.py | 58 + .../graphrag-llm/graphrag_llm/types/types.py | 265 ++ .../graphrag_llm/utils/__init__.py | 40 + .../utils/completion_messages_builder.py | 328 +++ .../utils/create_completion_response.py | 45 + .../utils/create_embedding_response.py | 39 + .../utils/function_tool_manager.py | 138 + .../utils/gather_completion_response.py | 57 + .../graphrag_llm/utils/structure_response.py | 29 + .../graphrag-llm/notebooks/01_basic.ipynb | 415 +++ .../notebooks/02_encoding_decoding.ipynb | 169 ++ .../notebooks/03_structured_responses.ipynb | 170 ++ .../graphrag-llm/notebooks/04_metrics.ipynb | 595 +++++ .../graphrag-llm/notebooks/05_caching.ipynb | 264 ++ .../graphrag-llm/notebooks/06_retries.ipynb | 115 + .../notebooks/07_rate_limiting.ipynb | 129 + .../graphrag-llm/notebooks/08_batching.ipynb | 536 ++++ .../09_message_builder_and_history.ipynb | 199 ++ .../notebooks/10_tool_calling.ipynb | 387 +++ .../notebooks/11_templating.ipynb | 149 ++ .../graphrag-llm/notebooks/12_mocking.ipynb | 164 ++ packages/graphrag-llm/notebooks/README.md | 11 + .../templates/weather_listings.jinja | 3 + packages/graphrag-llm/pyproject.toml | 46 + packages/graphrag-storage/README.md | 92 + .../graphrag_storage/__init__.py | 20 + .../graphrag_storage/azure_blob_storage.py | 233 +- .../graphrag_storage/azure_cosmos_storage.py | 115 +- .../graphrag_storage/file_storage.py | 97 +- .../graphrag_storage/memory_storage.py | 21 +- .../graphrag_storage/py.typed | 0 .../graphrag_storage/storage.py | 141 + .../graphrag_storage/storage_config.py | 48 + .../graphrag_storage/storage_factory.py | 78 + .../graphrag_storage/storage_type.py | 16 + packages/graphrag-storage/pyproject.toml | 48 + packages/graphrag-vectors/README.md | 111 + .../graphrag_vectors/__init__.py | 34 + .../graphrag_vectors/azure_ai_search.py | 173 ++ .../graphrag_vectors}/cosmosdb.py | 127 +- .../graphrag_vectors/index_schema.py | 22 +- .../graphrag_vectors/lancedb.py | 128 + .../graphrag_vectors/types.py | 8 + .../graphrag_vectors/vector_store.py | 81 + .../graphrag_vectors/vector_store_config.py | 53 + .../graphrag_vectors/vector_store_factory.py | 99 + .../graphrag_vectors/vector_store_type.py | 14 + packages/graphrag-vectors/pyproject.toml | 49 + packages/graphrag/README.md | 76 + .../graphrag/graphrag}/__init__.py | 0 .../graphrag/graphrag}/__main__.py | 0 .../graphrag/graphrag}/api/__init__.py | 8 - .../graphrag/graphrag}/api/index.py | 7 +- .../graphrag/graphrag}/api/prompt_tune.py | 28 +- packages/graphrag/graphrag/api/query.py | 546 ++++ .../graphrag/graphrag/cache}/__init__.py | 2 +- .../graphrag/cache/cache_key_creator.py | 44 + .../graphrag/graphrag}/callbacks/__init__.py | 0 .../callbacks/console_workflow_callbacks.py | 4 + .../graphrag}/callbacks/llm_callbacks.py | 0 .../callbacks/noop_query_callbacks.py | 0 .../callbacks/noop_workflow_callbacks.py | 3 + .../graphrag}/callbacks/query_callbacks.py | 0 .../graphrag}/callbacks/workflow_callbacks.py | 4 + .../callbacks/workflow_callbacks_manager.py | 8 +- .../graphrag/graphrag}/cli/__init__.py | 0 .../graphrag/graphrag}/cli/index.py | 44 +- .../graphrag/graphrag}/cli/initialize.py | 30 +- .../graphrag/graphrag}/cli/main.py | 168 +- .../graphrag/graphrag}/cli/prompt_tune.py | 17 +- packages/graphrag/graphrag/cli/query.py | 396 +++ .../graphrag/graphrag}/config/__init__.py | 0 .../graphrag/graphrag}/config/defaults.py | 255 +- .../graphrag/graphrag/config/embeddings.py | 19 + packages/graphrag/graphrag/config/enums.py | 77 + .../graphrag/graphrag}/config/errors.py | 9 - .../graphrag/graphrag}/config/init_content.py | 110 +- .../graphrag/graphrag/config/load_config.py | 47 + .../graphrag}/config/models/__init__.py | 0 .../config/models/basic_search_config.py | 4 +- .../config/models/cluster_graph_config.py | 0 .../config/models/community_reports_config.py | 56 +- .../config/models/drift_search_config.py | 4 +- .../config/models/embed_text_config.py | 33 + .../config/models/extract_claims_config.py | 43 +- .../config/models/extract_graph_config.py | 45 +- .../config/models/extract_graph_nlp_config.py | 0 .../config/models/global_search_config.py | 4 +- .../config/models/graph_rag_config.py | 325 +++ .../config/models/local_search_config.py | 4 +- .../config/models/prune_graph_config.py | 0 .../config/models/reporting_config.py | 2 +- .../config/models/snapshots_config.py | 0 .../models/summarize_descriptions_config.py | 46 +- .../graphrag/graphrag}/data_model/__init__.py | 0 .../graphrag}/data_model/community.py | 0 .../graphrag}/data_model/community_report.py | 0 .../graphrag}/data_model/covariate.py | 0 .../graphrag/graphrag}/data_model/document.py | 0 .../graphrag/graphrag}/data_model/entity.py | 0 .../graphrag}/data_model/identified.py | 0 .../graphrag/graphrag}/data_model/named.py | 0 .../graphrag}/data_model/relationship.py | 0 .../graphrag/graphrag}/data_model/schemas.py | 12 +- .../graphrag}/data_model/text_unit.py | 8 +- .../graphrag/graphrag}/data_model/types.py | 0 .../graphrag/graphrag}/index/__init__.py | 0 .../graphrag}/index/operations/__init__.py | 0 .../operations/build_noun_graph/__init__.py | 0 .../build_noun_graph/build_noun_graph.py | 25 +- .../np_extractors/__init__.py | 0 .../build_noun_graph/np_extractors/base.py | 0 .../np_extractors/cfg_extractor.py | 3 +- .../build_noun_graph/np_extractors/factory.py | 0 .../np_extractors/np_validator.py | 0 .../np_extractors/regex_extractor.py | 3 +- .../np_extractors/resource_loader.py | 0 .../np_extractors/stop_words.py | 0 .../syntactic_parsing_extractor.py | 0 .../index/operations/cluster_graph.py | 4 +- .../index/operations/compute_degree.py | 2 +- .../compute_edge_combined_degree.py | 2 +- .../index/operations/create_graph.py | 0 .../index/operations/embed_text/__init__.py | 0 .../index/operations/embed_text/embed_text.py | 89 + .../operations/embed_text/run_embed_text.py | 87 +- .../operations/extract_covariates/__init__.py | 0 .../extract_covariates/claim_extractor.py | 193 ++ .../extract_covariates/extract_covariates.py | 88 +- .../operations/extract_covariates/typing.py | 5 +- .../operations/extract_graph/__init__.py | 0 .../operations/extract_graph/extract_graph.py | 98 +- .../extract_graph/graph_extractor.py | 188 ++ .../operations/finalize_community_reports.py | 7 +- .../index/operations/finalize_entities.py | 22 +- .../operations/finalize_relationships.py | 0 .../index/operations/graph_to_dataframes.py | 2 +- .../graphrag}/index/operations/prune_graph.py | 10 +- .../index/operations/snapshot_graphml.py | 5 +- .../summarize_communities/__init__.py | 0 .../build_mixed_context.py | 5 +- .../community_reports_extractor.py | 30 +- .../explode_communities.py | 0 .../graph_context/__init__.py | 0 .../graph_context/context_builder.py | 24 +- .../graph_context/sort_context.py | 2 +- .../summarize_communities.py | 104 +- .../text_unit_context/__init__.py | 0 .../text_unit_context/context_builder.py | 8 +- .../text_unit_context/prep_text_units.py | 3 +- .../text_unit_context/sort_context.py | 2 +- .../summarize_communities/typing.py | 26 +- .../operations/summarize_communities/utils.py | 0 .../summarize_descriptions/__init__.py | 0 .../description_summary_extractor.py | 31 +- .../summarize_descriptions.py | 68 +- .../summarize_descriptions/typing.py | 21 + .../graphrag/graphrag}/index/run/__init__.py | 0 .../graphrag}/index/run/run_pipeline.py | 24 +- .../graphrag/graphrag}/index/run/utils.py | 32 +- .../index/text_splitting/__init__.py | 0 .../index/text_splitting/text_splitting.py | 102 + .../graphrag}/index/typing/__init__.py | 0 .../graphrag}/index/typing/context.py | 12 +- .../graphrag}/index/typing/error_handler.py | 0 .../graphrag}/index/typing/pipeline.py | 0 .../index/typing/pipeline_run_result.py | 2 +- .../graphrag/graphrag}/index/typing/state.py | 0 .../graphrag/graphrag}/index/typing/stats.py | 0 .../graphrag}/index/typing/workflow.py | 0 .../graphrag}/index/update/__init__.py | 0 .../graphrag}/index/update/communities.py | 0 .../graphrag}/index/update/entities.py | 5 +- .../index/update/incremental_index.py | 14 +- .../graphrag}/index/update/relationships.py | 3 +- .../graphrag}/index/utils/__init__.py | 0 .../graphrag}/index/utils/dataframes.py | 0 .../graphrag}/index/utils/derive_from_rows.py | 8 +- .../graphrag/graphrag}/index/utils/dicts.py | 0 .../graphrag/graphrag}/index/utils/graphs.py | 170 +- .../graphrag/graphrag}/index/utils/hashing.py | 0 .../graphrag/graphrag}/index/utils/is_null.py | 0 .../graphrag}/index/utils/stable_lcc.py | 5 +- .../graphrag/graphrag}/index/utils/string.py | 0 .../graphrag/graphrag}/index/utils/uuid.py | 0 .../graphrag/index/validate_config.py | 41 + .../graphrag}/index/workflows/__init__.py | 2 +- .../index/workflows/create_base_text_units.py | 118 + .../index/workflows/create_communities.py | 3 +- .../workflows/create_community_reports.py | 71 +- .../create_community_reports_text.py | 65 +- .../index/workflows/create_final_documents.py | 22 +- .../workflows/create_final_text_units.py | 11 +- .../index/workflows/extract_covariates.py | 62 +- .../index/workflows/extract_graph.py | 108 +- .../index/workflows/extract_graph_nlp.py | 43 +- .../graphrag}/index/workflows/factory.py | 0 .../index/workflows/finalize_graph.py | 10 +- .../workflows/generate_text_embeddings.py | 125 +- .../index/workflows/load_input_documents.py | 22 +- .../index/workflows/load_update_documents.py | 17 +- .../graphrag}/index/workflows/prune_graph.py | 11 + .../index/workflows/update_clean_state.py | 0 .../index/workflows/update_communities.py | 9 +- .../workflows/update_community_reports.py | 8 +- .../index/workflows/update_covariates.py | 8 +- .../update_entities_relationships.py | 33 +- .../index/workflows/update_final_documents.py | 0 .../index/workflows/update_text_embeddings.py | 31 +- .../index/workflows/update_text_units.py | 8 +- .../graphrag/graphrag}/logger/__init__.py | 0 .../graphrag}/logger/blob_workflow_logger.py | 14 +- packages/graphrag/graphrag/logger/factory.py | 64 + .../graphrag/graphrag}/logger/progress.py | 0 .../graphrag}/logger/standard_logging.py | 26 +- .../graphrag}/prompt_tune/__init__.py | 0 .../graphrag}/prompt_tune/defaults.py | 2 +- .../prompt_tune/generator/__init__.py | 0 .../generator/community_report_rating.py | 16 +- .../community_report_summarization.py | 0 .../generator/community_reporter_role.py | 17 +- .../graphrag}/prompt_tune/generator/domain.py | 17 +- .../generator/entity_relationship.py | 25 +- .../generator/entity_summarization_prompt.py | 0 .../prompt_tune/generator/entity_types.py | 39 +- .../generator/extract_graph_prompt.py | 3 +- .../prompt_tune/generator/language.py | 17 +- .../prompt_tune/generator/persona.py | 17 +- .../graphrag}/prompt_tune/loader/__init__.py | 0 .../graphrag}/prompt_tune/loader/input.py | 52 +- .../graphrag}/prompt_tune/prompt/__init__.py | 0 .../prompt/community_report_rating.py | 0 .../prompt/community_reporter_role.py | 0 .../graphrag}/prompt_tune/prompt/domain.py | 0 .../prompt_tune/prompt/entity_relationship.py | 236 +- .../prompt_tune/prompt/entity_types.py | 0 .../graphrag}/prompt_tune/prompt/language.py | 0 .../graphrag}/prompt_tune/prompt/persona.py | 0 .../prompt_tune/template/__init__.py | 0 .../community_report_summarization.py | 4 +- .../template/entity_summarization.py | 0 .../prompt_tune/template/extract_graph.py | 16 +- .../graphrag/graphrag}/prompt_tune/types.py | 0 .../graphrag/graphrag}/prompts/__init__.py | 0 .../graphrag}/prompts/index/__init__.py | 0 .../prompts/index/community_report.py | 4 +- .../index/community_report_text_units.py | 0 .../graphrag}/prompts/index/extract_claims.py | 18 +- .../graphrag/prompts/index/extract_graph.py | 129 + .../prompts/index/summarize_descriptions.py | 0 .../graphrag}/prompts/query/__init__.py | 0 .../query/basic_search_system_prompt.py | 4 +- .../query/drift_search_system_prompt.py | 2 +- .../global_search_knowledge_system_prompt.py | 0 .../query/global_search_map_system_prompt.py | 0 .../global_search_reduce_system_prompt.py | 0 .../query/local_search_system_prompt.py | 0 .../query/question_gen_system_prompt.py | 0 .../graphrag/graphrag}/py.typed | 0 .../graphrag/graphrag}/query/__init__.py | 0 .../query/context_builder/__init__.py | 0 .../query/context_builder/builders.py | 0 .../context_builder/community_context.py | 2 +- .../context_builder/conversation_history.py | 2 +- .../dynamic_community_selection.py | 17 +- .../context_builder/entity_extraction.py | 14 +- .../query/context_builder/local_context.py | 2 +- .../query/context_builder/rate_prompt.py | 0 .../query/context_builder/rate_relevancy.py | 37 +- .../query/context_builder/source_context.py | 2 +- .../graphrag/graphrag}/query/factory.py | 100 +- .../graphrag}/query/indexer_adapters.py | 42 +- .../graphrag}/query/input/__init__.py | 0 .../graphrag}/query/input/loaders/__init__.py | 0 .../graphrag}/query/input/loaders/dfs.py | 8 +- .../graphrag}/query/input/loaders/utils.py | 0 .../query/input/retrieval/__init__.py | 0 .../input/retrieval/community_reports.py | 0 .../query/input/retrieval/covariates.py | 0 .../query/input/retrieval/entities.py | 0 .../query/input/retrieval/relationships.py | 0 .../query/input/retrieval/text_units.py | 0 .../graphrag/graphrag}/query/llm/__init__.py | 0 .../graphrag}/query/llm/text_utils.py | 8 +- .../graphrag}/query/question_gen/__init__.py | 0 .../graphrag}/query/question_gen/base.py | 14 +- .../graphrag}/query/question_gen/local_gen.py | 74 +- .../query/structured_search/__init__.py | 0 .../graphrag}/query/structured_search/base.py | 13 +- .../basic_search/__init__.py | 0 .../basic_search/basic_context.py | 46 +- .../structured_search/basic_search/search.py | 72 +- .../drift_search/__init__.py | 0 .../structured_search/drift_search/action.py | 12 +- .../drift_search/drift_context.py | 24 +- .../structured_search/drift_search/primer.py | 57 +- .../structured_search/drift_search/search.py | 104 +- .../structured_search/drift_search/state.py | 0 .../global_search/__init__.py | 0 .../global_search/community_context.py | 3 +- .../structured_search/global_search/search.py | 98 +- .../local_search/__init__.py | 0 .../local_search/mixed_context.py | 18 +- .../structured_search/local_search/search.py | 70 +- .../graphrag/graphrag}/tokenizer/__init__.py | 0 .../graphrag}/tokenizer/get_tokenizer.py | 33 +- .../graphrag/graphrag}/utils/__init__.py | 0 packages/graphrag/graphrag/utils/api.py | 75 + .../graphrag/graphrag}/utils/cli.py | 0 .../graphrag/graphrag}/utils/storage.py | 11 +- packages/graphrag/pyproject.toml | 70 + pyproject.toml | 156 +- .../providers/fnllm => scripts}/__init__.py | 3 +- scripts/copy_build_assets.py | 25 + .../update_workspace_dependency_versions.py | 58 + tests/__init__.py | 10 - tests/fixtures/azure/config.json | 3 +- tests/fixtures/azure/settings.yml | 11 +- tests/fixtures/min-csv/config.json | 19 +- tests/fixtures/min-csv/settings.yml | 46 +- tests/fixtures/text/config.json | 45 +- .../text/prompts/community_report.txt | 4 +- tests/fixtures/text/settings.yml | 46 +- tests/integration/cache/test_factory.py | 161 +- .../language_model/test_factory.py | 153 +- .../language_model}/test_rate_limiter.py | 117 +- .../language_model/test_retries.py | 243 ++ .../language_model}/utils.py | 0 tests/integration/logging/test_factory.py | 19 +- .../logging/test_standard_logging.py | 23 +- ...peline_storage.py => test_blob_storage.py} | 38 +- .../storage/test_cosmosdb_storage.py | 24 +- tests/integration/storage/test_factory.py | 120 +- ...peline_storage.py => test_file_storage.py} | 30 +- .../vector_stores/test_azure_ai_search.py | 78 +- .../vector_stores/test_cosmosdb.py | 68 +- .../integration/vector_stores/test_factory.py | 116 +- .../integration/vector_stores/test_lancedb.py | 96 +- tests/mock_provider.py | 125 - tests/notebook/test_notebooks.py | 44 +- tests/smoke/test_fixtures.py | 18 +- .../operations => chunking}/__init__.py | 0 tests/unit/chunking/test_chunker.py | 190 ++ tests/unit/chunking/test_prepend_metadata.py | 44 + .../fixtures/minimal_config/settings.yaml | 12 +- .../settings.yaml | 12 +- tests/unit/config/test_config.py | 164 +- tests/unit/config/test_metrics_config.py | 29 + tests/unit/config/test_model_config.py | 110 + tests/unit/config/test_rate_limit_config.py | 66 + tests/unit/config/test_retry_config.py | 67 + .../config/test_template_engine_config.py | 44 + tests/unit/config/test_tokenizer_config.py | 39 + tests/unit/config/utils.py | 254 +- .../__init__.py | 0 tests/unit/graphrag_factory/test_factory.py | 66 + .../text_splitting => hasher}/__init__.py | 0 tests/unit/hasher/test_hasher.py | 104 + .../cache/test_file_pipeline_cache.py | 18 +- .../community_reports/test_sort_context.py | 4 +- .../indexing/graph/utils/test_stable_lcc.py | 27 - .../indexing/input/data/one-html/input.html | 8 + .../indexing/input/data/one-jsonl/input.jsonl | 3 + tests/unit/indexing/input/test_csv_loader.py | 76 +- tests/unit/indexing/input/test_json_loader.py | 94 +- .../unit/indexing/input/test_jsonl_loader.py | 42 + .../indexing/input/test_markitdown_loader.py | 26 + .../unit/indexing/input/test_text_document.py | 76 + tests/unit/indexing/input/test_text_loader.py | 36 + tests/unit/indexing/input/test_txt_loader.py | 51 - .../operations/chunk_text/test_chunk_text.py | 181 -- .../operations/chunk_text/test_strategies.py | 127 - tests/unit/indexing/test_init_content.py | 6 +- .../text_splitting/test_text_splitting.py | 170 -- .../test_gi_entity_extraction.py | 251 +- tests/unit/indexing/verbs/helpers/mock_llm.py | 13 - tests/unit/litellm_services/test_retries.py | 148 -- .../verbs/helpers => load_config}/__init__.py | 0 tests/unit/load_config/config.py | 27 + tests/unit/load_config/fixtures/config.yaml | 10 + .../load_config/fixtures/config_with_env.yaml | 10 + .../load_config/fixtures/invalid_config.yaml | 1 + .../fixtures/invalid_config_format.yaml | 8 + tests/unit/load_config/fixtures/settings.yaml | 10 + tests/unit/load_config/fixtures/test.env | 1 + tests/unit/load_config/test_load_config.py | 157 ++ .../dynamic_community_selection.py | 205 ++ .../context_builder/test_entity_extraction.py | 105 +- tests/unit/utils/test_embeddings.py | 21 - tests/unit/utils/test_encoding.py | 4 +- tests/verbs/data/communities.parquet | Bin 25391 -> 71503 bytes tests/verbs/data/community_reports.parquet | Bin 156921 -> 894887 bytes tests/verbs/data/covariates.parquet | Bin 59240 -> 137091 bytes tests/verbs/data/documents.parquet | Bin 126826 -> 125443 bytes tests/verbs/data/entities.parquet | Bin 41136 -> 119565 bytes tests/verbs/data/relationships.parquet | Bin 37492 -> 126576 bytes tests/verbs/data/text_units.parquet | Bin 148830 -> 202236 bytes tests/verbs/data/text_units_metadata.parquet | Bin 128451 -> 0 bytes ...text_units_metadata_included_chunk.parquet | Bin 128513 -> 0 bytes tests/verbs/test_create_base_text_units.py | 54 +- tests/verbs/test_create_communities.py | 6 +- tests/verbs/test_create_community_reports.py | 22 +- tests/verbs/test_create_final_documents.py | 30 +- tests/verbs/test_create_final_text_units.py | 6 +- tests/verbs/test_extract_covariates.py | 27 +- tests/verbs/test_extract_graph.py | 37 +- tests/verbs/test_extract_graph_nlp.py | 10 +- tests/verbs/test_finalize_graph.py | 37 +- tests/verbs/test_generate_text_embeddings.py | 32 +- tests/verbs/test_pipeline_state.py | 8 +- tests/verbs/test_prune_graph.py | 8 +- tests/verbs/util.py | 42 +- unified-search-app/README.md | 21 +- unified-search-app/app/app_logic.py | 3 +- unified-search-app/app/home_page.py | 13 +- .../data_sources/blob_source.py | 6 +- .../data_sources/local_source.py | 3 +- .../knowledge_loader/data_sources/typing.py | 1 - unified-search-app/app/ui/full_graph.py | 56 - unified-search-app/app/ui/report_details.py | 3 +- unified-search-app/app/ui/report_list.py | 2 +- unified-search-app/app/ui/search.py | 3 +- unified-search-app/pyproject.toml | 26 +- unified-search-app/uv.lock | 2348 ++++++++--------- uv.lock | 2188 ++++----------- 794 files changed, 24133 insertions(+), 22125 deletions(-) create mode 100644 .github/workflows/python-checks.yml rename .github/workflows/{python-ci.yml => python-unit-tests.yml} (83%) create mode 100644 .semversioner/next-release/major-20260123143225940955.json delete mode 100644 docs/config/env_vars.md create mode 100644 docs/examples_notebooks/index_migration_to_v3.ipynb create mode 100644 docs/examples_notebooks/inputs/operation dulce/embeddings.community_full_content.parquet create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_indices/dd5917d9-d48d-4af3-bc2e-43a53b2fdbe6/auxiliary.idx create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_indices/dd5917d9-d48d-4af3-bc2e-43a53b2fdbe6/index.idx create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_transactions/0-a943ac34-0e87-43c2-80d0-8f83fb80f4f5.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_transactions/1-ec798d7b-a8bf-4985-a5d0-784434802168.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_transactions/2-78887911-d792-4dc9-b28d-f2858db1139a.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_transactions/3-c16be721-5d7e-46a0-98c2-34d5d9c29383.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/1.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/2.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/3.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/4.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/data/667cccff-01b5-4b70-a2a6-8cf4d6ada077.lance create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/data/a84d995f-111c-45d1-ba5a-32b3747b8a18.lance delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/0-2fed1d8b-daac-41b0-a93a-e115cda75be3.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/1-61dbb7c2-aec3-4796-b223-941fc7cc93cc.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/2-60012692-a153-48f9-8f4e-c479b44cbf3f.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/3-0d2dc9a1-094f-4220-83c7-6ad6f26fac2b.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/1.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/2.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/3.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/4.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/data/1e7b2d94-ed06-4aa0-b22e-86a71d416bc6.lance delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/data/1ed9f301-ce30-46a8-8c0b-9c2a60a3cf43.lance delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/0-92c031e5-7558-451e-9d0f-f5514db9616d.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/1-7b3cb8d8-3512-4584-a003-91838fed8911.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/2-7de627d2-4c57-49e9-bf73-c17a9582ead4.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/3-9ad29d69-9a69-43a8-8b26-252ea267958d.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/1.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/2.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/3.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/4.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/data/a34575c4-5260-457f-bebe-3f40bc0e2ee3.lance delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/data/eabd7580-86f5-4022-8aa7-fe0aff816d98.lance delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/0-fd0434ac-e5cd-4ddd-9dd5-e5048d4edb59.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/1-14bb4b1d-cc00-420b-9b14-3626f0bd8c0b.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/2-8e74264c-f72d-44f5-a6f4-b3b61ae6a43b.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/3-7516fb71-9db3-4666-bdef-ea04c1eb9697.txn delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_versions/1.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_versions/2.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_versions/3.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_versions/4.manifest delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/data/2794bf5b-de3d-4202-ab16-e76bc27c8e6a.lance delete mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/data/2f74c8e8-3f35-4209-889c-a13cf0780eb3.lance create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_indices/b1bd07f3-ad25-40bc-b91c-14215386e477/auxiliary.idx create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_indices/b1bd07f3-ad25-40bc-b91c-14215386e477/index.idx create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/0-5b75ba0a-bae9-4244-8a6b-31de09f7e03d.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/1-71f2ac8d-a101-467d-b57d-2dea6d14f7a7.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/2-d621e621-8e92-419f-99e4-f1c7d163bcc2.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/3-4ada922f-cf85-44df-bc8b-b132e35009d0.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/4-dcac110d-2a49-4777-a51e-5078fed1b0df.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/5-ec86af9f-b799-4457-b07a-24a3459dd952.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/6-c2afb84c-4b3a-4ccd-8843-0deaa25bd971.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/7-6798041f-3283-4b54-8313-54f80e00d338.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/1.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/2.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/3.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/4.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/5.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/6.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/7.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/8.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/data/2677858d-16a4-4c0c-9515-ed5a9ee32fd7.lance create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/data/4ed23c16-d11c-49b5-869d-653cfbd9c271.lance create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/data/5370b2ef-efd3-434e-9745-9d046b53bb4a.lance create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/data/ec59d894-a2a6-4a44-8266-d07bbd684c33.lance create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_indices/f5099c4f-df9a-476d-a736-1eac0a498173/auxiliary.idx create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_indices/f5099c4f-df9a-476d-a736-1eac0a498173/index.idx create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_transactions/0-9abee4db-9914-4c35-b600-d995235f8e27.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_transactions/1-302f5740-fbd0-4887-9933-13a2842ec8e4.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_transactions/2-551a917c-5ab9-46a7-9085-fd82aa879717.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_transactions/3-b0b6e7bb-a152-4148-be3b-d1ab50215bda.txn create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/1.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/2.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/3.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/4.manifest create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/data/4105076e-7a55-4549-b86a-51c6bfa68ea5.lance create mode 100644 docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/data/a28d4629-848b-4e1d-854d-cad6297a0c1a.lance delete mode 100644 docs/examples_notebooks/multi_index_search.ipynb delete mode 100644 docs/query/multi_index_search.md delete mode 100644 examples_notebooks/community_contrib/README.md delete mode 100644 examples_notebooks/community_contrib/neo4j/graphrag_import_neo4j_cypher.ipynb delete mode 100644 examples_notebooks/community_contrib/yfiles-jupyter-graphs/graph-visualization.ipynb delete mode 100644 examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_latest.manifest delete mode 100644 examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_transactions/0-498c6e24-dd0a-42b9-8f7e-5e3d2ab258b0.txn delete mode 100644 examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_transactions/1-bf5aa024-a229-461f-8d78-699841a302fe.txn delete mode 100644 examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_versions/1.manifest delete mode 100644 examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_versions/2.manifest delete mode 100644 examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/data/fe64774f-5412-4c9c-8dea-f6ed55c81119.lance delete mode 100644 graphrag/api/query.py delete mode 100644 graphrag/cache/__init__.py delete mode 100644 graphrag/cache/factory.py delete mode 100644 graphrag/cli/query.py delete mode 100644 graphrag/config/create_graphrag_config.py delete mode 100644 graphrag/config/embeddings.py delete mode 100644 graphrag/config/enums.py delete mode 100644 graphrag/config/environment_reader.py delete mode 100644 graphrag/config/get_embedding_settings.py delete mode 100644 graphrag/config/load_config.py delete mode 100644 graphrag/config/models/cache_config.py delete mode 100644 graphrag/config/models/chunking_config.py delete mode 100644 graphrag/config/models/embed_graph_config.py delete mode 100644 graphrag/config/models/graph_rag_config.py delete mode 100644 graphrag/config/models/input_config.py delete mode 100644 graphrag/config/models/language_model_config.py delete mode 100644 graphrag/config/models/storage_config.py delete mode 100644 graphrag/config/models/text_embedding_config.py delete mode 100644 graphrag/config/models/umap_config.py delete mode 100644 graphrag/config/models/vector_store_config.py delete mode 100644 graphrag/config/read_dotenv.py delete mode 100644 graphrag/factory/factory.py delete mode 100644 graphrag/index/input/__init__.py delete mode 100644 graphrag/index/input/csv.py delete mode 100644 graphrag/index/input/factory.py delete mode 100644 graphrag/index/input/json.py delete mode 100644 graphrag/index/input/text.py delete mode 100644 graphrag/index/input/util.py delete mode 100644 graphrag/index/operations/chunk_text/__init__.py delete mode 100644 graphrag/index/operations/chunk_text/chunk_text.py delete mode 100644 graphrag/index/operations/chunk_text/strategies.py delete mode 100644 graphrag/index/operations/chunk_text/typing.py delete mode 100644 graphrag/index/operations/embed_graph/__init__.py delete mode 100644 graphrag/index/operations/embed_graph/embed_graph.py delete mode 100644 graphrag/index/operations/embed_graph/embed_node2vec.py delete mode 100644 graphrag/index/operations/embed_graph/typing.py delete mode 100644 graphrag/index/operations/embed_text/embed_text.py delete mode 100644 graphrag/index/operations/embed_text/strategies/__init__.py delete mode 100644 graphrag/index/operations/embed_text/strategies/mock.py delete mode 100644 graphrag/index/operations/embed_text/strategies/typing.py delete mode 100644 graphrag/index/operations/extract_covariates/claim_extractor.py delete mode 100644 graphrag/index/operations/extract_graph/graph_extractor.py delete mode 100644 graphrag/index/operations/extract_graph/graph_intelligence_strategy.py delete mode 100644 graphrag/index/operations/extract_graph/typing.py delete mode 100644 graphrag/index/operations/layout_graph/__init__.py delete mode 100644 graphrag/index/operations/layout_graph/layout_graph.py delete mode 100644 graphrag/index/operations/layout_graph/typing.py delete mode 100644 graphrag/index/operations/layout_graph/umap.py delete mode 100644 graphrag/index/operations/layout_graph/zero.py delete mode 100644 graphrag/index/operations/summarize_communities/strategies.py delete mode 100644 graphrag/index/operations/summarize_descriptions/graph_intelligence_strategy.py delete mode 100644 graphrag/index/operations/summarize_descriptions/typing.py delete mode 100644 graphrag/index/text_splitting/check_token_limit.py delete mode 100644 graphrag/index/text_splitting/text_splitting.py delete mode 100644 graphrag/index/validate_config.py delete mode 100644 graphrag/index/workflows/create_base_text_units.py delete mode 100644 graphrag/language_model/__init__.py delete mode 100644 graphrag/language_model/cache/__init__.py delete mode 100644 graphrag/language_model/cache/base.py delete mode 100644 graphrag/language_model/events/__init__.py delete mode 100644 graphrag/language_model/events/base.py delete mode 100644 graphrag/language_model/factory.py delete mode 100644 graphrag/language_model/manager.py delete mode 100644 graphrag/language_model/protocol/__init__.py delete mode 100644 graphrag/language_model/protocol/base.py delete mode 100644 graphrag/language_model/providers/__init__.py delete mode 100644 graphrag/language_model/providers/fnllm/cache.py delete mode 100644 graphrag/language_model/providers/fnllm/events.py delete mode 100644 graphrag/language_model/providers/fnllm/models.py delete mode 100644 graphrag/language_model/providers/fnllm/utils.py delete mode 100644 graphrag/language_model/providers/litellm/__init__.py delete mode 100644 graphrag/language_model/providers/litellm/chat_model.py delete mode 100644 graphrag/language_model/providers/litellm/embedding_model.py delete mode 100644 graphrag/language_model/providers/litellm/get_cache_key.py delete mode 100644 graphrag/language_model/providers/litellm/request_wrappers/__init__.py delete mode 100644 graphrag/language_model/providers/litellm/request_wrappers/with_cache.py delete mode 100644 graphrag/language_model/providers/litellm/request_wrappers/with_logging.py delete mode 100644 graphrag/language_model/providers/litellm/request_wrappers/with_rate_limiter.py delete mode 100644 graphrag/language_model/providers/litellm/request_wrappers/with_retries.py delete mode 100644 graphrag/language_model/providers/litellm/services/__init__.py delete mode 100644 graphrag/language_model/providers/litellm/services/rate_limiter/__init__.py delete mode 100644 graphrag/language_model/providers/litellm/services/rate_limiter/rate_limiter_factory.py delete mode 100644 graphrag/language_model/providers/litellm/services/rate_limiter/static_rate_limiter.py delete mode 100644 graphrag/language_model/providers/litellm/services/retry/__init__.py delete mode 100644 graphrag/language_model/providers/litellm/services/retry/exponential_retry.py delete mode 100644 graphrag/language_model/providers/litellm/services/retry/incremental_wait_retry.py delete mode 100644 graphrag/language_model/providers/litellm/services/retry/native_wait_retry.py delete mode 100644 graphrag/language_model/providers/litellm/services/retry/random_wait_retry.py delete mode 100644 graphrag/language_model/providers/litellm/services/retry/retry.py delete mode 100644 graphrag/language_model/providers/litellm/services/retry/retry_factory.py delete mode 100644 graphrag/language_model/providers/litellm/types.py delete mode 100644 graphrag/language_model/response/__init__.py delete mode 100644 graphrag/language_model/response/base.py delete mode 100644 graphrag/language_model/response/base.pyi delete mode 100644 graphrag/logger/factory.py delete mode 100644 graphrag/prompts/index/extract_graph.py delete mode 100644 graphrag/storage/factory.py delete mode 100644 graphrag/storage/pipeline_storage.py delete mode 100644 graphrag/tokenizer/tokenizer.py delete mode 100644 graphrag/utils/api.py delete mode 100644 graphrag/vector_stores/__init__.py delete mode 100644 graphrag/vector_stores/azure_ai_search.py delete mode 100644 graphrag/vector_stores/base.py delete mode 100644 graphrag/vector_stores/factory.py delete mode 100644 graphrag/vector_stores/lancedb.py create mode 100644 packages/graphrag-cache/README.md create mode 100644 packages/graphrag-cache/graphrag_cache/__init__.py rename graphrag/cache/pipeline_cache.py => packages/graphrag-cache/graphrag_cache/cache.py (80%) create mode 100644 packages/graphrag-cache/graphrag_cache/cache_config.py create mode 100644 packages/graphrag-cache/graphrag_cache/cache_factory.py create mode 100644 packages/graphrag-cache/graphrag_cache/cache_key.py create mode 100644 packages/graphrag-cache/graphrag_cache/cache_type.py rename graphrag/cache/json_pipeline_cache.py => packages/graphrag-cache/graphrag_cache/json_cache.py (58%) rename graphrag/cache/memory_pipeline_cache.py => packages/graphrag-cache/graphrag_cache/memory_cache.py (71%) rename graphrag/cache/noop_pipeline_cache.py => packages/graphrag-cache/graphrag_cache/noop_cache.py (82%) create mode 100644 packages/graphrag-cache/graphrag_cache/py.typed create mode 100644 packages/graphrag-cache/pyproject.toml create mode 100644 packages/graphrag-chunking/README.md rename {tests/unit/litellm_services => packages/graphrag-chunking/graphrag_chunking}/__init__.py (66%) rename graphrag/index/operations/chunk_text/bootstrap.py => packages/graphrag-chunking/graphrag_chunking/bootstrap_nltk.py (100%) create mode 100644 packages/graphrag-chunking/graphrag_chunking/chunk_strategy_type.py create mode 100644 packages/graphrag-chunking/graphrag_chunking/chunker.py create mode 100644 packages/graphrag-chunking/graphrag_chunking/chunker_factory.py create mode 100644 packages/graphrag-chunking/graphrag_chunking/chunking_config.py create mode 100644 packages/graphrag-chunking/graphrag_chunking/create_chunk_results.py create mode 100644 packages/graphrag-chunking/graphrag_chunking/sentence_chunker.py create mode 100644 packages/graphrag-chunking/graphrag_chunking/text_chunk.py create mode 100644 packages/graphrag-chunking/graphrag_chunking/token_chunker.py create mode 100644 packages/graphrag-chunking/graphrag_chunking/transformers.py create mode 100644 packages/graphrag-chunking/pyproject.toml create mode 100644 packages/graphrag-common/README.md rename {graphrag/storage => packages/graphrag-common/graphrag_common}/__init__.py (70%) create mode 100644 packages/graphrag-common/graphrag_common/config/__init__.py create mode 100644 packages/graphrag-common/graphrag_common/config/load_config.py create mode 100644 packages/graphrag-common/graphrag_common/factory/__init__.py create mode 100644 packages/graphrag-common/graphrag_common/factory/factory.py create mode 100644 packages/graphrag-common/graphrag_common/hasher/__init__.py create mode 100644 packages/graphrag-common/graphrag_common/hasher/hasher.py create mode 100644 packages/graphrag-common/graphrag_common/py.typed create mode 100644 packages/graphrag-common/pyproject.toml create mode 100644 packages/graphrag-input/README.md create mode 100644 packages/graphrag-input/graphrag_input/__init__.py create mode 100644 packages/graphrag-input/graphrag_input/csv.py create mode 100644 packages/graphrag-input/graphrag_input/get_property.py create mode 100644 packages/graphrag-input/graphrag_input/hashing.py create mode 100644 packages/graphrag-input/graphrag_input/input_config.py create mode 100644 packages/graphrag-input/graphrag_input/input_reader.py create mode 100644 packages/graphrag-input/graphrag_input/input_reader_factory.py create mode 100644 packages/graphrag-input/graphrag_input/input_type.py create mode 100644 packages/graphrag-input/graphrag_input/json.py create mode 100644 packages/graphrag-input/graphrag_input/jsonl.py create mode 100644 packages/graphrag-input/graphrag_input/markitdown.py create mode 100644 packages/graphrag-input/graphrag_input/structured_file_reader.py create mode 100644 packages/graphrag-input/graphrag_input/text.py create mode 100644 packages/graphrag-input/graphrag_input/text_document.py create mode 100644 packages/graphrag-input/pyproject.toml create mode 100644 packages/graphrag-llm/README.md create mode 100644 packages/graphrag-llm/graphrag_llm/README.md create mode 100644 packages/graphrag-llm/graphrag_llm/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/cache/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/cache/create_cache_key.py create mode 100644 packages/graphrag-llm/graphrag_llm/completion/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/completion/completion.py create mode 100644 packages/graphrag-llm/graphrag_llm/completion/completion_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/completion/lite_llm_completion.py create mode 100644 packages/graphrag-llm/graphrag_llm/completion/mock_llm_completion.py create mode 100644 packages/graphrag-llm/graphrag_llm/config/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/config/metrics_config.py create mode 100644 packages/graphrag-llm/graphrag_llm/config/model_config.py create mode 100644 packages/graphrag-llm/graphrag_llm/config/rate_limit_config.py create mode 100644 packages/graphrag-llm/graphrag_llm/config/retry_config.py create mode 100644 packages/graphrag-llm/graphrag_llm/config/template_engine_config.py create mode 100644 packages/graphrag-llm/graphrag_llm/config/tokenizer_config.py create mode 100644 packages/graphrag-llm/graphrag_llm/config/types.py create mode 100644 packages/graphrag-llm/graphrag_llm/embedding/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/embedding/embedding.py create mode 100644 packages/graphrag-llm/graphrag_llm/embedding/embedding_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/embedding/lite_llm_embedding.py create mode 100644 packages/graphrag-llm/graphrag_llm/embedding/mock_llm_embedding.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/default_metrics_processor.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/file_metrics_writer.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/log_metrics_writer.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/memory_metrics_store.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/metrics_aggregator.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/metrics_processor.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/metrics_processor_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/metrics_store.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/metrics_store_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/metrics_writer.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/metrics_writer_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/metrics/noop_metrics_store.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/with_cache.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/with_errors_for_testing.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/with_logging.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/with_metrics.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/with_middleware_pipeline.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/with_rate_limiting.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/with_request_count.py create mode 100644 packages/graphrag-llm/graphrag_llm/middleware/with_retries.py create mode 100644 packages/graphrag-llm/graphrag_llm/model_cost_registry/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/model_cost_registry/model_cost_registry.py create mode 100644 packages/graphrag-llm/graphrag_llm/py.typed create mode 100644 packages/graphrag-llm/graphrag_llm/rate_limit/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/rate_limit/rate_limit_factory.py rename {graphrag/language_model/providers/litellm/services/rate_limiter => packages/graphrag-llm/graphrag_llm/rate_limit}/rate_limiter.py (66%) create mode 100644 packages/graphrag-llm/graphrag_llm/rate_limit/sliding_window_rate_limiter.py create mode 100644 packages/graphrag-llm/graphrag_llm/retry/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/retry/exceptions_to_skip.py create mode 100644 packages/graphrag-llm/graphrag_llm/retry/exponential_retry.py create mode 100644 packages/graphrag-llm/graphrag_llm/retry/immediate_retry.py create mode 100644 packages/graphrag-llm/graphrag_llm/retry/retry.py create mode 100644 packages/graphrag-llm/graphrag_llm/retry/retry_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/templating/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/templating/file_template_manager.py create mode 100644 packages/graphrag-llm/graphrag_llm/templating/jinja_template_engine.py create mode 100644 packages/graphrag-llm/graphrag_llm/templating/template_engine.py create mode 100644 packages/graphrag-llm/graphrag_llm/templating/template_engine_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/templating/template_manager.py create mode 100644 packages/graphrag-llm/graphrag_llm/templating/template_manager_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/threading/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/threading/completion_thread.py create mode 100644 packages/graphrag-llm/graphrag_llm/threading/completion_thread_runner.py create mode 100644 packages/graphrag-llm/graphrag_llm/threading/embedding_thread.py create mode 100644 packages/graphrag-llm/graphrag_llm/threading/embedding_thread_runner.py create mode 100644 packages/graphrag-llm/graphrag_llm/tokenizer/__init__.py rename graphrag/tokenizer/litellm_tokenizer.py => packages/graphrag-llm/graphrag_llm/tokenizer/lite_llm_tokenizer.py (56%) rename {graphrag => packages/graphrag-llm/graphrag_llm}/tokenizer/tiktoken_tokenizer.py (52%) create mode 100644 packages/graphrag-llm/graphrag_llm/tokenizer/tokenizer.py create mode 100644 packages/graphrag-llm/graphrag_llm/tokenizer/tokenizer_factory.py create mode 100644 packages/graphrag-llm/graphrag_llm/types/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/types/types.py create mode 100644 packages/graphrag-llm/graphrag_llm/utils/__init__.py create mode 100644 packages/graphrag-llm/graphrag_llm/utils/completion_messages_builder.py create mode 100644 packages/graphrag-llm/graphrag_llm/utils/create_completion_response.py create mode 100644 packages/graphrag-llm/graphrag_llm/utils/create_embedding_response.py create mode 100644 packages/graphrag-llm/graphrag_llm/utils/function_tool_manager.py create mode 100644 packages/graphrag-llm/graphrag_llm/utils/gather_completion_response.py create mode 100644 packages/graphrag-llm/graphrag_llm/utils/structure_response.py create mode 100644 packages/graphrag-llm/notebooks/01_basic.ipynb create mode 100644 packages/graphrag-llm/notebooks/02_encoding_decoding.ipynb create mode 100644 packages/graphrag-llm/notebooks/03_structured_responses.ipynb create mode 100644 packages/graphrag-llm/notebooks/04_metrics.ipynb create mode 100644 packages/graphrag-llm/notebooks/05_caching.ipynb create mode 100644 packages/graphrag-llm/notebooks/06_retries.ipynb create mode 100644 packages/graphrag-llm/notebooks/07_rate_limiting.ipynb create mode 100644 packages/graphrag-llm/notebooks/08_batching.ipynb create mode 100644 packages/graphrag-llm/notebooks/09_message_builder_and_history.ipynb create mode 100644 packages/graphrag-llm/notebooks/10_tool_calling.ipynb create mode 100644 packages/graphrag-llm/notebooks/11_templating.ipynb create mode 100644 packages/graphrag-llm/notebooks/12_mocking.ipynb create mode 100644 packages/graphrag-llm/notebooks/README.md create mode 100644 packages/graphrag-llm/notebooks/templates/weather_listings.jinja create mode 100644 packages/graphrag-llm/pyproject.toml create mode 100644 packages/graphrag-storage/README.md create mode 100644 packages/graphrag-storage/graphrag_storage/__init__.py rename graphrag/storage/blob_pipeline_storage.py => packages/graphrag-storage/graphrag_storage/azure_blob_storage.py (51%) rename graphrag/storage/cosmosdb_pipeline_storage.py => packages/graphrag-storage/graphrag_storage/azure_cosmos_storage.py (79%) rename graphrag/storage/file_pipeline_storage.py => packages/graphrag-storage/graphrag_storage/file_storage.py (51%) rename graphrag/storage/memory_pipeline_storage.py => packages/graphrag-storage/graphrag_storage/memory_storage.py (79%) create mode 100644 packages/graphrag-storage/graphrag_storage/py.typed create mode 100644 packages/graphrag-storage/graphrag_storage/storage.py create mode 100644 packages/graphrag-storage/graphrag_storage/storage_config.py create mode 100644 packages/graphrag-storage/graphrag_storage/storage_factory.py create mode 100644 packages/graphrag-storage/graphrag_storage/storage_type.py create mode 100644 packages/graphrag-storage/pyproject.toml create mode 100644 packages/graphrag-vectors/README.md create mode 100644 packages/graphrag-vectors/graphrag_vectors/__init__.py create mode 100644 packages/graphrag-vectors/graphrag_vectors/azure_ai_search.py rename {graphrag/vector_stores => packages/graphrag-vectors/graphrag_vectors}/cosmosdb.py (65%) rename graphrag/config/models/vector_store_schema_config.py => packages/graphrag-vectors/graphrag_vectors/index_schema.py (74%) create mode 100644 packages/graphrag-vectors/graphrag_vectors/lancedb.py create mode 100644 packages/graphrag-vectors/graphrag_vectors/types.py create mode 100644 packages/graphrag-vectors/graphrag_vectors/vector_store.py create mode 100644 packages/graphrag-vectors/graphrag_vectors/vector_store_config.py create mode 100644 packages/graphrag-vectors/graphrag_vectors/vector_store_factory.py create mode 100644 packages/graphrag-vectors/graphrag_vectors/vector_store_type.py create mode 100644 packages/graphrag-vectors/pyproject.toml create mode 100644 packages/graphrag/README.md rename {graphrag => packages/graphrag/graphrag}/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/__main__.py (100%) rename {graphrag => packages/graphrag/graphrag}/api/__init__.py (79%) rename {graphrag => packages/graphrag/graphrag}/api/index.py (94%) rename {graphrag => packages/graphrag/graphrag}/api/prompt_tune.py (87%) create mode 100644 packages/graphrag/graphrag/api/query.py rename {graphrag/factory => packages/graphrag/graphrag/cache}/__init__.py (78%) create mode 100644 packages/graphrag/graphrag/cache/cache_key_creator.py rename {graphrag => packages/graphrag/graphrag}/callbacks/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/callbacks/console_workflow_callbacks.py (90%) rename {graphrag => packages/graphrag/graphrag}/callbacks/llm_callbacks.py (100%) rename {graphrag => packages/graphrag/graphrag}/callbacks/noop_query_callbacks.py (100%) rename {graphrag => packages/graphrag/graphrag}/callbacks/noop_workflow_callbacks.py (89%) rename {graphrag => packages/graphrag/graphrag}/callbacks/query_callbacks.py (100%) rename {graphrag => packages/graphrag/graphrag}/callbacks/workflow_callbacks.py (89%) rename {graphrag => packages/graphrag/graphrag}/callbacks/workflow_callbacks_manager.py (85%) rename {graphrag => packages/graphrag/graphrag}/cli/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/cli/index.py (69%) rename {graphrag => packages/graphrag/graphrag}/cli/initialize.py (75%) rename {graphrag => packages/graphrag/graphrag}/cli/main.py (81%) rename {graphrag => packages/graphrag/graphrag}/cli/prompt_tune.py (90%) create mode 100644 packages/graphrag/graphrag/cli/query.py rename {graphrag => packages/graphrag/graphrag}/config/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/config/defaults.py (59%) create mode 100644 packages/graphrag/graphrag/config/embeddings.py create mode 100644 packages/graphrag/graphrag/config/enums.py rename {graphrag => packages/graphrag/graphrag}/config/errors.py (80%) rename {graphrag => packages/graphrag/graphrag}/config/init_content.py (52%) create mode 100644 packages/graphrag/graphrag/config/load_config.py rename {graphrag => packages/graphrag/graphrag}/config/models/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/config/models/basic_search_config.py (90%) rename {graphrag => packages/graphrag/graphrag}/config/models/cluster_graph_config.py (100%) rename {graphrag => packages/graphrag/graphrag}/config/models/community_reports_config.py (55%) rename {graphrag => packages/graphrag/graphrag}/config/models/drift_search_config.py (97%) create mode 100644 packages/graphrag/graphrag/config/models/embed_text_config.py rename {graphrag => packages/graphrag/graphrag}/config/models/extract_claims_config.py (55%) rename {graphrag => packages/graphrag/graphrag}/config/models/extract_graph_config.py (50%) rename {graphrag => packages/graphrag/graphrag}/config/models/extract_graph_nlp_config.py (100%) rename {graphrag => packages/graphrag/graphrag}/config/models/global_search_config.py (96%) create mode 100644 packages/graphrag/graphrag/config/models/graph_rag_config.py rename {graphrag => packages/graphrag/graphrag}/config/models/local_search_config.py (93%) rename {graphrag => packages/graphrag/graphrag}/config/models/prune_graph_config.py (100%) rename {graphrag => packages/graphrag/graphrag}/config/models/reporting_config.py (95%) rename {graphrag => packages/graphrag/graphrag}/config/models/snapshots_config.py (100%) rename {graphrag => packages/graphrag/graphrag}/config/models/summarize_descriptions_config.py (56%) rename {graphrag => packages/graphrag/graphrag}/data_model/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/community.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/community_report.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/covariate.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/document.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/entity.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/identified.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/named.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/relationship.py (100%) rename {graphrag => packages/graphrag/graphrag}/data_model/schemas.py (95%) rename {graphrag => packages/graphrag/graphrag}/data_model/text_unit.py (89%) rename {graphrag => packages/graphrag/graphrag}/data_model/types.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/build_noun_graph.py (90%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/base.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/cfg_extractor.py (98%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/factory.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/np_validator.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/regex_extractor.py (97%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/resource_loader.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/stop_words.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/build_noun_graph/np_extractors/syntactic_parsing_extractor.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/cluster_graph.py (94%) rename {graphrag => packages/graphrag/graphrag}/index/operations/compute_degree.py (86%) rename {graphrag => packages/graphrag/graphrag}/index/operations/compute_edge_combined_degree.py (94%) rename {graphrag => packages/graphrag/graphrag}/index/operations/create_graph.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/embed_text/__init__.py (100%) create mode 100644 packages/graphrag/graphrag/index/operations/embed_text/embed_text.py rename graphrag/index/operations/embed_text/strategies/openai.py => packages/graphrag/graphrag/index/operations/embed_text/run_embed_text.py (66%) rename {graphrag => packages/graphrag/graphrag}/index/operations/extract_covariates/__init__.py (100%) create mode 100644 packages/graphrag/graphrag/index/operations/extract_covariates/claim_extractor.py rename {graphrag => packages/graphrag/graphrag}/index/operations/extract_covariates/extract_covariates.py (56%) rename {graphrag => packages/graphrag/graphrag}/index/operations/extract_covariates/typing.py (93%) rename {graphrag => packages/graphrag/graphrag}/index/operations/extract_graph/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/extract_graph/extract_graph.py (50%) create mode 100644 packages/graphrag/graphrag/index/operations/extract_graph/graph_extractor.py rename {graphrag => packages/graphrag/graphrag}/index/operations/finalize_community_reports.py (82%) rename {graphrag => packages/graphrag/graphrag}/index/operations/finalize_entities.py (59%) rename {graphrag => packages/graphrag/graphrag}/index/operations/finalize_relationships.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/graph_to_dataframes.py (95%) rename {graphrag => packages/graphrag/graphrag}/index/operations/prune_graph.py (91%) rename {graphrag => packages/graphrag/graphrag}/index/operations/snapshot_graphml.py (83%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/build_mixed_context.py (95%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/community_reports_extractor.py (76%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/explode_communities.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/graph_context/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/graph_context/context_builder.py (96%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/graph_context/sort_context.py (99%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/summarize_communities.py (55%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/text_unit_context/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/text_unit_context/context_builder.py (97%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/text_unit_context/prep_text_units.py (94%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/text_unit_context/sort_context.py (98%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/typing.py (57%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_communities/utils.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_descriptions/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_descriptions/description_summary_extractor.py (84%) rename {graphrag => packages/graphrag/graphrag}/index/operations/summarize_descriptions/summarize_descriptions.py (66%) create mode 100644 packages/graphrag/graphrag/index/operations/summarize_descriptions/typing.py rename {graphrag => packages/graphrag/graphrag}/index/run/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/run/run_pipeline.py (90%) rename {graphrag => packages/graphrag/graphrag}/index/run/utils.py (63%) rename {graphrag => packages/graphrag/graphrag}/index/text_splitting/__init__.py (100%) create mode 100644 packages/graphrag/graphrag/index/text_splitting/text_splitting.py rename {graphrag => packages/graphrag/graphrag}/index/typing/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/typing/context.py (79%) rename {graphrag => packages/graphrag/graphrag}/index/typing/error_handler.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/typing/pipeline.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/typing/pipeline_run_result.py (94%) rename {graphrag => packages/graphrag/graphrag}/index/typing/state.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/typing/stats.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/typing/workflow.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/update/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/update/communities.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/update/entities.py (96%) rename {graphrag => packages/graphrag/graphrag}/index/update/incremental_index.py (87%) rename {graphrag => packages/graphrag/graphrag}/index/update/relationships.py (97%) rename {graphrag => packages/graphrag/graphrag}/index/utils/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/utils/dataframes.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/utils/derive_from_rows.py (96%) rename {graphrag => packages/graphrag/graphrag}/index/utils/dicts.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/utils/graphs.py (61%) rename {graphrag => packages/graphrag/graphrag}/index/utils/hashing.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/utils/is_null.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/utils/stable_lcc.py (94%) rename {graphrag => packages/graphrag/graphrag}/index/utils/string.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/utils/uuid.py (100%) create mode 100644 packages/graphrag/graphrag/index/validate_config.py rename {graphrag => packages/graphrag/graphrag}/index/workflows/__init__.py (98%) create mode 100644 packages/graphrag/graphrag/index/workflows/create_base_text_units.py rename {graphrag => packages/graphrag/graphrag}/index/workflows/create_communities.py (98%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/create_community_reports.py (75%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/create_community_reports_text.py (67%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/create_final_documents.py (81%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/create_final_text_units.py (93%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/extract_covariates.py (62%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/extract_graph.py (58%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/extract_graph_nlp.py (64%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/factory.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/finalize_graph.py (83%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/generate_text_embeddings.py (62%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/load_input_documents.py (67%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/load_update_documents.py (79%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/prune_graph.py (90%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/update_clean_state.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/update_communities.py (91%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/update_community_reports.py (92%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/update_covariates.py (93%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/update_entities_relationships.py (78%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/update_final_documents.py (100%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/update_text_embeddings.py (73%) rename {graphrag => packages/graphrag/graphrag}/index/workflows/update_text_units.py (94%) rename {graphrag => packages/graphrag/graphrag}/logger/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/logger/blob_workflow_logger.py (89%) create mode 100644 packages/graphrag/graphrag/logger/factory.py rename {graphrag => packages/graphrag/graphrag}/logger/progress.py (100%) rename {graphrag => packages/graphrag/graphrag}/logger/standard_logging.py (76%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/defaults.py (91%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/community_report_rating.py (66%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/community_report_summarization.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/community_reporter_role.py (66%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/domain.py (55%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/entity_relationship.py (70%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/entity_summarization_prompt.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/entity_types.py (59%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/extract_graph_prompt.py (98%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/language.py (55%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/generator/persona.py (60%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/loader/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/loader/input.py (65%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/prompt/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/prompt/community_report_rating.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/prompt/community_reporter_role.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/prompt/domain.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/prompt/entity_relationship.py (57%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/prompt/entity_types.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/prompt/language.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/prompt/persona.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/template/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/template/community_report_summarization.py (98%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/template/entity_summarization.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/template/extract_graph.py (84%) rename {graphrag => packages/graphrag/graphrag}/prompt_tune/types.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/index/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/index/community_report.py (99%) rename {graphrag => packages/graphrag/graphrag}/prompts/index/community_report_text_units.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/index/extract_claims.py (64%) create mode 100644 packages/graphrag/graphrag/prompts/index/extract_graph.py rename {graphrag => packages/graphrag/graphrag}/prompts/index/summarize_descriptions.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/query/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/query/basic_search_system_prompt.py (96%) rename {graphrag => packages/graphrag/graphrag}/prompts/query/drift_search_system_prompt.py (94%) rename {graphrag => packages/graphrag/graphrag}/prompts/query/global_search_knowledge_system_prompt.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/query/global_search_map_system_prompt.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/query/global_search_reduce_system_prompt.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/query/local_search_system_prompt.py (100%) rename {graphrag => packages/graphrag/graphrag}/prompts/query/question_gen_system_prompt.py (100%) rename {graphrag => packages/graphrag/graphrag}/py.typed (100%) rename {graphrag => packages/graphrag/graphrag}/query/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/builders.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/community_context.py (99%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/conversation_history.py (99%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/dynamic_community_selection.py (94%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/entity_extraction.py (92%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/local_context.py (99%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/rate_prompt.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/rate_relevancy.py (73%) rename {graphrag => packages/graphrag/graphrag}/query/context_builder/source_context.py (98%) rename {graphrag => packages/graphrag/graphrag}/query/factory.py (74%) rename {graphrag => packages/graphrag/graphrag}/query/indexer_adapters.py (84%) rename {graphrag => packages/graphrag/graphrag}/query/input/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/input/loaders/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/input/loaders/dfs.py (96%) rename {graphrag => packages/graphrag/graphrag}/query/input/loaders/utils.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/input/retrieval/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/input/retrieval/community_reports.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/input/retrieval/covariates.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/input/retrieval/entities.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/input/retrieval/relationships.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/input/retrieval/text_units.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/llm/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/llm/text_utils.py (93%) rename {graphrag => packages/graphrag/graphrag}/query/question_gen/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/question_gen/base.py (84%) rename {graphrag => packages/graphrag/graphrag}/query/question_gen/local_gen.py (79%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/base.py (89%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/basic_search/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/basic_search/basic_context.py (73%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/basic_search/search.py (75%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/drift_search/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/drift_search/action.py (96%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/drift_search/drift_context.py (93%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/drift_search/primer.py (74%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/drift_search/search.py (87%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/drift_search/state.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/global_search/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/global_search/community_context.py (99%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/global_search/search.py (88%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/local_search/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/local_search/mixed_context.py (97%) rename {graphrag => packages/graphrag/graphrag}/query/structured_search/local_search/search.py (75%) rename {graphrag => packages/graphrag/graphrag}/tokenizer/__init__.py (100%) rename {graphrag => packages/graphrag/graphrag}/tokenizer/get_tokenizer.py (56%) rename {graphrag => packages/graphrag/graphrag}/utils/__init__.py (100%) create mode 100644 packages/graphrag/graphrag/utils/api.py rename {graphrag => packages/graphrag/graphrag}/utils/cli.py (100%) rename {graphrag => packages/graphrag/graphrag}/utils/storage.py (73%) create mode 100644 packages/graphrag/pyproject.toml rename {graphrag/language_model/providers/fnllm => scripts}/__init__.py (70%) create mode 100644 scripts/copy_build_assets.py create mode 100644 scripts/update_workspace_dependency_versions.py rename tests/{unit/litellm_services => integration/language_model}/test_rate_limiter.py (77%) create mode 100644 tests/integration/language_model/test_retries.py rename tests/{unit/litellm_services => integration/language_model}/utils.py (100%) rename tests/integration/storage/{test_blob_pipeline_storage.py => test_blob_storage.py} (70%) rename tests/integration/storage/{test_file_pipeline_storage.py => test_file_storage.py} (65%) delete mode 100644 tests/mock_provider.py rename tests/unit/{indexing/operations => chunking}/__init__.py (100%) create mode 100644 tests/unit/chunking/test_chunker.py create mode 100644 tests/unit/chunking/test_prepend_metadata.py create mode 100644 tests/unit/config/test_metrics_config.py create mode 100644 tests/unit/config/test_model_config.py create mode 100644 tests/unit/config/test_rate_limit_config.py create mode 100644 tests/unit/config/test_retry_config.py create mode 100644 tests/unit/config/test_template_engine_config.py create mode 100644 tests/unit/config/test_tokenizer_config.py rename tests/unit/{indexing/operations/chunk_text => graphrag_factory}/__init__.py (100%) create mode 100644 tests/unit/graphrag_factory/test_factory.py rename tests/unit/{indexing/text_splitting => hasher}/__init__.py (100%) create mode 100644 tests/unit/hasher/test_hasher.py create mode 100644 tests/unit/indexing/input/data/one-html/input.html create mode 100644 tests/unit/indexing/input/data/one-jsonl/input.jsonl create mode 100644 tests/unit/indexing/input/test_jsonl_loader.py create mode 100644 tests/unit/indexing/input/test_markitdown_loader.py create mode 100644 tests/unit/indexing/input/test_text_document.py create mode 100644 tests/unit/indexing/input/test_text_loader.py delete mode 100644 tests/unit/indexing/input/test_txt_loader.py delete mode 100644 tests/unit/indexing/operations/chunk_text/test_chunk_text.py delete mode 100644 tests/unit/indexing/operations/chunk_text/test_strategies.py delete mode 100644 tests/unit/indexing/text_splitting/test_text_splitting.py delete mode 100644 tests/unit/indexing/verbs/helpers/mock_llm.py delete mode 100644 tests/unit/litellm_services/test_retries.py rename tests/unit/{indexing/verbs/helpers => load_config}/__init__.py (100%) create mode 100644 tests/unit/load_config/config.py create mode 100644 tests/unit/load_config/fixtures/config.yaml create mode 100644 tests/unit/load_config/fixtures/config_with_env.yaml create mode 100644 tests/unit/load_config/fixtures/invalid_config.yaml create mode 100644 tests/unit/load_config/fixtures/invalid_config_format.yaml create mode 100644 tests/unit/load_config/fixtures/settings.yaml create mode 100644 tests/unit/load_config/fixtures/test.env create mode 100644 tests/unit/load_config/test_load_config.py create mode 100644 tests/unit/query/context_builder/dynamic_community_selection.py delete mode 100644 tests/unit/utils/test_embeddings.py delete mode 100644 tests/verbs/data/text_units_metadata.parquet delete mode 100644 tests/verbs/data/text_units_metadata_included_chunk.parquet delete mode 100644 unified-search-app/app/ui/full_graph.py diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index b41be1ef03..e6c38fa4fa 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -6,7 +6,7 @@ permissions: contents: write env: - PYTHON_VERSION: "3.11" + PYTHON_VERSION: "3.13" jobs: build: @@ -31,7 +31,7 @@ jobs: - name: Install dependencies shell: bash - run: uv sync + run: uv sync --all-packages - name: mkdocs build shell: bash diff --git a/.github/workflows/python-checks.yml b/.github/workflows/python-checks.yml new file mode 100644 index 0000000000..ae11854e33 --- /dev/null +++ b/.github/workflows/python-checks.yml @@ -0,0 +1,78 @@ +name: Python Build and Type Check +on: + push: + branches: + - "**/main" # match branches like feature/main + - "main" # match the main branch + pull_request: + types: + - opened + - reopened + - synchronize + - ready_for_review + branches: + - "**/main" + - "main" + paths-ignore: + - "**/*.md" + - ".semversioner/**" + +permissions: + contents: read + pull-requests: read + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + # Only run the for the latest commit + cancel-in-progress: true + +jobs: + python-ci: + # skip draft PRs + if: github.event.pull_request.draft == false + strategy: + matrix: + python-version: ["3.11", "3.13"] + os: [ubuntu-latest, windows-latest] + fail-fast: false # Continue running all jobs even if one fails + env: + DEBUG: 1 + + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + + - uses: dorny/paths-filter@v3 + id: changes + with: + filters: | + python: + - 'graphrag/**/*' + - 'uv.lock' + - 'pyproject.toml' + - '**/*.py' + - '**/*.toml' + - '**/*.ipynb' + - '.github/workflows/python*.yml' + - 'tests/**/*' + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install uv + uses: astral-sh/setup-uv@v6 + + - name: Install dependencies + shell: bash + run: | + uv sync --all-packages + + - name: Check + run: | + uv run poe check + + - name: Build + run: | + uv build --all-packages \ No newline at end of file diff --git a/.github/workflows/python-integration-tests.yml b/.github/workflows/python-integration-tests.yml index 48634f7b06..c1d112ee86 100644 --- a/.github/workflows/python-integration-tests.yml +++ b/.github/workflows/python-integration-tests.yml @@ -32,7 +32,7 @@ jobs: if: github.event.pull_request.draft == false strategy: matrix: - python-version: ["3.10"] + python-version: ["3.13"] os: [ubuntu-latest, windows-latest] fail-fast: false # continue running all jobs even if one fails env: @@ -67,12 +67,11 @@ jobs: - name: Install dependencies shell: bash run: | - uv sync - uv pip install gensim + uv sync --all-packages - name: Build run: | - uv build + uv build --all-packages - name: Install and start Azurite shell: bash diff --git a/.github/workflows/python-notebook-tests.yml b/.github/workflows/python-notebook-tests.yml index aae1f5c3a2..9808d690f2 100644 --- a/.github/workflows/python-notebook-tests.yml +++ b/.github/workflows/python-notebook-tests.yml @@ -32,12 +32,13 @@ jobs: if: github.event.pull_request.draft == false strategy: matrix: - python-version: ["3.10"] + python-version: ["3.13"] os: [ubuntu-latest, windows-latest] fail-fast: false # Continue running all jobs even if one fails env: DEBUG: 1 - GRAPHRAG_API_KEY: ${{ secrets.OPENAI_NOTEBOOK_KEY }} + GRAPHRAG_API_KEY: ${{ secrets.OPENAI_API_KEY }} + GRAPHRAG_API_BASE: ${{ secrets.GRAPHRAG_API_BASE }} runs-on: ${{ matrix.os }} steps: @@ -67,8 +68,7 @@ jobs: - name: Install dependencies shell: bash run: | - uv sync - uv pip install gensim + uv sync --all-packages - name: Notebook Test run: | diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 7973c1281f..9cd729eb2f 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -7,7 +7,7 @@ on: branches: [main] env: - PYTHON_VERSION: "3.10" + PYTHON_VERSION: "3.13" jobs: publish: @@ -17,8 +17,6 @@ jobs: environment: name: pypi - url: https://pypi.org/p/graphrag - permissions: id-token: write @@ -38,14 +36,14 @@ jobs: - name: Install dependencies shell: bash - run: uv sync + run: uv sync --all-packages - name: Export Publication Version run: echo "version=$(uv version --short)" >> $GITHUB_OUTPUT - name: Build Distributable shell: bash - run: uv build + run: uv run poe build - name: Inspect all distribution members and metadata shell: bash @@ -99,8 +97,4 @@ jobs: PY - name: Publish package distributions to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - packages-dir: dist - skip-existing: true - verbose: true + run: uv publish diff --git a/.github/workflows/python-smoke-tests.yml b/.github/workflows/python-smoke-tests.yml index ec420d310b..e055c66b67 100644 --- a/.github/workflows/python-smoke-tests.yml +++ b/.github/workflows/python-smoke-tests.yml @@ -32,7 +32,7 @@ jobs: if: github.event.pull_request.draft == false strategy: matrix: - python-version: ["3.10"] + python-version: ["3.13"] os: [ubuntu-latest, windows-latest] fail-fast: false # Continue running all jobs even if one fails env: @@ -72,12 +72,11 @@ jobs: - name: Install dependencies shell: bash run: | - uv sync - uv pip install gensim + uv sync --all-packages - name: Build run: | - uv build + uv build --all-packages - name: Install and start Azurite shell: bash diff --git a/.github/workflows/python-ci.yml b/.github/workflows/python-unit-tests.yml similarity index 83% rename from .github/workflows/python-ci.yml rename to .github/workflows/python-unit-tests.yml index 37651589e8..b2577bae0c 100644 --- a/.github/workflows/python-ci.yml +++ b/.github/workflows/python-unit-tests.yml @@ -1,4 +1,4 @@ -name: Python CI +name: Python Unit Tests on: push: branches: @@ -32,7 +32,7 @@ jobs: if: github.event.pull_request.draft == false strategy: matrix: - python-version: ["3.10", "3.11"] # add 3.12 once gensim supports it. TODO: watch this issue - https://github.com/piskvorky/gensim/issues/3510 + python-version: ["3.13"] os: [ubuntu-latest, windows-latest] fail-fast: false # Continue running all jobs even if one fails env: @@ -67,16 +67,7 @@ jobs: - name: Install dependencies shell: bash run: | - uv sync - uv pip install gensim - - - name: Check - run: | - uv run poe check - - - name: Build - run: | - uv build + uv sync --all-packages - name: Unit Test run: | diff --git a/.gitignore b/.gitignore index f050557b3a..77ee0a6eb8 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,8 @@ output/lancedb venv/ .conda .tmp +packages/graphrag-llm/notebooks/metrics +packages/graphrag-llm/notebooks/cache .env build.zip @@ -58,3 +60,6 @@ docsite/ # Jupyter notebook .ipynb_checkpoints/ + +# Root build assets +packages/*/LICENSE diff --git a/.semversioner/next-release/major-20260123143225940955.json b/.semversioner/next-release/major-20260123143225940955.json new file mode 100644 index 0000000000..76089e1e50 --- /dev/null +++ b/.semversioner/next-release/major-20260123143225940955.json @@ -0,0 +1,4 @@ +{ + "type": "major", + "description": "Monorepo restructure\n\n New Packages:\n - graphrag-cache\n - graphrag-chunking\n - graphrag-common\n - graphrag-input\n - graphrag-llm\n - graphrag-storage\n - graphrag-vectors\n\n Changes:\n - New config: run graphrag init --force to reinitialize config with new layout and options." +} diff --git a/.vscode/launch.json b/.vscode/launch.json index 9434ab0ef5..a2e2254c84 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,19 @@ "args": [ "index", "--root", - "" + "${input:root_folder}" + ], + "console": "integratedTerminal" + }, + { + "name": "Update", + "type": "debugpy", + "request": "launch", + "module": "graphrag", + "args": [ + "update", + "--root", + "${input:root_folder}" ], "console": "integratedTerminal" }, @@ -21,10 +33,10 @@ "module": "graphrag", "args": [ "query", + "${input:query}", "--root", - "", - "--method", "basic", - "--query", "What are the top themes in this story", + "${input:root_folder}", + "--method", "${input:query_method}" ] }, { @@ -35,7 +47,7 @@ "args": [ "poe", "prompt-tune", "--config", - "/settings.yaml", + "${input:root_folder}/settings.yaml", ] }, { @@ -74,5 +86,22 @@ "console": "integratedTerminal", "justMyCode": false }, - ] + ], + "inputs": [ + { + "id": "root_folder", + "type": "promptString", + "description": "Enter the root folder path" + }, + { + "id": "query_method", + "type": "promptString", + "description": "Enter the query method (e.g., 'global', 'local')" + }, + { + "id": "query", + "type": "promptString", + "description": "Enter the query text" + } + ] } \ No newline at end of file diff --git a/.vsts-ci.yml b/.vsts-ci.yml index 2a1e0964ce..5299ff91e3 100644 --- a/.vsts-ci.yml +++ b/.vsts-ci.yml @@ -10,7 +10,7 @@ trigger: variables: isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/main')] - pythonVersion: "3.10" + pythonVersion: "3.13" poetryVersion: "1.6.1" nodeVersion: "18.x" artifactsFullFeedName: "Resilience/resilience_python" diff --git a/breaking-changes.md b/breaking-changes.md index 4c0505d6dd..93430cbfe4 100644 --- a/breaking-changes.md +++ b/breaking-changes.md @@ -12,6 +12,35 @@ There are five surface areas that may be impacted on any given release. They are > TL;DR: Always run `graphrag init --path [path] --force` between minor version bumps to ensure you have the latest config format. Run the provided migration notebook between major version bumps if you want to avoid re-indexing prior datasets. Note that this will overwrite your configuration and prompts, so backup if necessary. +# v3 +Run the [migration notebook](./docs/examples_notebooks/index_migration_to_v3.ipynb) to convert older tables to the v3 format. Our main goals with v3 were to slim down the core library to minimize long-term maintenance of features that are either largely unused or should have been out of scope for a long time anyway. + +## Data Model +We made minimal data model changes that will affect your index for v3. The primary breaking change is that we removed a rarely-used document-grouping capability that resulted in the `text_units` table having a `document_ids` column with a list instead of a single entry in a column called `document_id`. v3 fixes that, and the migration notebook applies the change so you don't need to re-index. + +Most of the other changes we made are removal of fields that are no longer used or are out of scope. For example, we removed the UMAP step that generates x/y coordinates for the entities - new indexes will not produce these columns, but they won't hurt anything if they are in your existing tables. + +## API +We have removed the multi-search variant from each search method in the API. + +## Config + +We did make several changes to the configuration model. The best way forward is to re-run `init`, which we always recommend for minor and major version bumps. + +This is a summary of changes: +- Removed fnllm as underlying model manager, so the model types "openai_chat", "azure_openai_chat", "openai_embedding", and "azure_openai_embedding" are all invalid. Use "chat" or "embedding". +- fnllm also had an experimental rate limiting "auto" setting, which is no longer allowed. Use `null` in your config as a default, or set explicit limits to tpm/rpm. +- LiteLLM does require a model_provider, so add yours as appropriate. For example, if you previously used "openai_chat" for your model type, this would be "openai", and for "azure_openai_chat" this would be "azure". +- Collapsed the `vector_store` dict into a single root-level object. This is because we no longer support multi-search, and this dict required a lot of downstream complexity for that single use case. +- Removed the `outputs` block that was also only used for multi-search. +- Most workflows had an undocumented `strategy` config dict that allowed fine tuning of internal settings. These fine tunings are never used and had associated complexity, so we removed it. +- Vector store configuration now allows custom schema per embedded field. This overrides the need for the `container_name` prefix, which caused confusion anyway. Now, the default container name will simply be the embedded field name - if you need something custom, add the `index_schema` block and populate as needed. +- We previously supported the ability to embed any text field in the data model. However, we only ever use text_unit_text, entity_description, and community_full_content, so all others have been removed. +- Removed the `umap` and `embed_graph` blocks which were only used to add x/y fields to the entities. This fixed a long-standing dependency issue with graspologic. If you need x/y positions, see the [visualization guide](https://microsoft.github.io/graphrag/visualization_guide/) for using gephi. +- Removed file filtering from input document loading. This was essentially unused. +- Removed the groupby ability for text chunking. This was intended to allow short documents to be grouped before chunking, but is never used and added a bunch of complexity to the chunking process. + + # v2 Run the [migration notebook](./docs/examples_notebooks/index_migration_to_v2.ipynb) to convert older tables to the v2 format. diff --git a/dictionary.txt b/dictionary.txt index 32c6f1ebe4..5d30e2e850 100644 --- a/dictionary.txt +++ b/dictionary.txt @@ -26,6 +26,7 @@ noqa dtypes ints genid +isinstance # Azure abfs diff --git a/docs/config/env_vars.md b/docs/config/env_vars.md deleted file mode 100644 index 004b3757e1..0000000000 --- a/docs/config/env_vars.md +++ /dev/null @@ -1,219 +0,0 @@ -# Default Configuration Mode (using Env Vars) - -As of version 1.3, GraphRAG no longer supports a full complement of pre-built environment variables. Instead, we support variable replacement within the [settings.yml file](yaml.md) so you can specify any environment variables you like. - -The only standard environment variable we expect, and include in the default settings.yml, is `GRAPHRAG_API_KEY`. If you are already using a number of the previous GRAPHRAG_* environment variables, you can insert them with template syntax into settings.yml and they will be adopted. - -> **The environment variables below are documented as an aid for migration, but they WILL NOT be read unless you use template syntax in your settings.yml. We also WILL NOT be updating this page as the main config object changes.** - ---- - -### Text-Embeddings Customization - -By default, the GraphRAG indexer will only export embeddings required for our query methods. However, the model has embeddings defined for all plaintext fields, and these can be generated by setting the `GRAPHRAG_EMBEDDING_TARGET` environment variable to `all`. - -#### Embedded Fields - -- `text_unit.text` -- `document.text` -- `entity.title` -- `entity.description` -- `relationship.description` -- `community.title` -- `community.summary` -- `community.full_content` - -### Input Data - -Our pipeline can ingest .csv or .txt data from an input folder. These files can be nested within subfolders. To configure how input data is handled, what fields are mapped over, and how timestamps are parsed, look for configuration values starting with `GRAPHRAG_INPUT_` below. In general, CSV-based data provides the most customizability. Each CSV should at least contain a `text` field (which can be mapped with environment variables), but it's helpful if they also have `title`, `timestamp`, and `source` fields. Additional fields can be included as well, which will land as extra fields on the `Document` table. - -### Base LLM Settings - -These are the primary settings for configuring LLM connectivity. - -| Parameter | Required? | Description | Type | Default Value | -| --------------------------- | ------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----- | ------------- | -| `GRAPHRAG_API_KEY` | **Yes for OpenAI. Optional for AOAI** | The API key. (Note: `OPENAI_API_KEY` is also used as a fallback). If not defined when using AOAI, managed identity will be used. | `str` | `None` | -| `GRAPHRAG_API_BASE` | **For AOAI** | The API Base URL | `str` | `None` | -| `GRAPHRAG_API_VERSION` | **For AOAI** | The AOAI API version. | `str` | `None` | -| `GRAPHRAG_API_ORGANIZATION` | | The AOAI organization. | `str` | `None` | -| `GRAPHRAG_API_PROXY` | | The AOAI proxy. | `str` | `None` | - -### Text Generation Settings - -These settings control the text generation model used by the pipeline. Any settings with a fallback will use the base LLM settings, if available. - -| Parameter | Required? | Description | Type | Default Value | -| ------------------------------------------------- | ------------------------ | ------------------------------------------------------------------------------ | ------- | --------------------- | -| `GRAPHRAG_LLM_TYPE` | **For AOAI** | The LLM operation type. Either `openai_chat` or `azure_openai_chat` | `str` | `openai_chat` | -| `GRAPHRAG_LLM_DEPLOYMENT_NAME` | **For AOAI** | The AOAI model deployment name. | `str` | `None` | -| `GRAPHRAG_LLM_API_KEY` | Yes (uses fallback) | The API key. If not defined when using AOAI, managed identity will be used. | `str` | `None` | -| `GRAPHRAG_LLM_API_BASE` | For AOAI (uses fallback) | The API Base URL | `str` | `None` | -| `GRAPHRAG_LLM_API_VERSION` | For AOAI (uses fallback) | The AOAI API version. | `str` | `None` | -| `GRAPHRAG_LLM_API_ORGANIZATION` | For AOAI (uses fallback) | The AOAI organization. | `str` | `None` | -| `GRAPHRAG_LLM_API_PROXY` | | The AOAI proxy. | `str` | `None` | -| `GRAPHRAG_LLM_MODEL` | | The LLM model. | `str` | `gpt-4-turbo-preview` | -| `GRAPHRAG_LLM_MAX_TOKENS` | | The maximum number of tokens. | `int` | `4000` | -| `GRAPHRAG_LLM_REQUEST_TIMEOUT` | | The maximum number of seconds to wait for a response from the chat client. | `int` | `180` | -| `GRAPHRAG_LLM_MODEL_SUPPORTS_JSON` | | Indicates whether the given model supports JSON output mode. `True` to enable. | `str` | `None` | -| `GRAPHRAG_LLM_THREAD_COUNT` | | The number of threads to use for LLM parallelization. | `int` | 50 | -| `GRAPHRAG_LLM_THREAD_STAGGER` | | The time to wait (in seconds) between starting each thread. | `float` | 0.3 | -| `GRAPHRAG_LLM_CONCURRENT_REQUESTS` | | The number of concurrent requests to allow for the embedding client. | `int` | 25 | -| `GRAPHRAG_LLM_TOKENS_PER_MINUTE` | | The number of tokens per minute to allow for the LLM client. 0 = Bypass | `int` | 0 | -| `GRAPHRAG_LLM_REQUESTS_PER_MINUTE` | | The number of requests per minute to allow for the LLM client. 0 = Bypass | `int` | 0 | -| `GRAPHRAG_LLM_MAX_RETRIES` | | The maximum number of retries to attempt when a request fails. | `int` | 10 | -| `GRAPHRAG_LLM_MAX_RETRY_WAIT` | | The maximum number of seconds to wait between retries. | `int` | 10 | -| `GRAPHRAG_LLM_SLEEP_ON_RATE_LIMIT_RECOMMENDATION` | | Whether to sleep on rate limit recommendation. (Azure Only) | `bool` | `True` | -| `GRAPHRAG_LLM_TEMPERATURE` | | The temperature to use generation. | `float` | 0 | -| `GRAPHRAG_LLM_TOP_P` | | The top_p to use for sampling. | `float` | 1 | -| `GRAPHRAG_LLM_N` | | The number of responses to generate. | `int` | 1 | - -### Text Embedding Settings - -These settings control the text embedding model used by the pipeline. Any settings with a fallback will use the base LLM settings, if available. - -| Parameter | Required ? | Description | Type | Default | -| ------------------------------------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------- | ------- | ------------------------ | -| `GRAPHRAG_EMBEDDING_TYPE` | **For AOAI** | The embedding client to use. Either `openai_embedding` or `azure_openai_embedding` | `str` | `openai_embedding` | -| `GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME` | **For AOAI** | The AOAI deployment name. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_KEY` | Yes (uses fallback) | The API key to use for the embedding client. If not defined when using AOAI, managed identity will be used. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_BASE` | For AOAI (uses fallback) | The API base URL. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_VERSION` | For AOAI (uses fallback) | The AOAI API version to use for the embedding client. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_ORGANIZATION` | For AOAI (uses fallback) | The AOAI organization to use for the embedding client. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_API_PROXY` | | The AOAI proxy to use for the embedding client. | `str` | `None` | -| `GRAPHRAG_EMBEDDING_MODEL` | | The model to use for the embedding client. | `str` | `text-embedding-3-small` | -| `GRAPHRAG_EMBEDDING_BATCH_SIZE` | | The number of texts to embed at once. [(Azure limit is 16)](https://learn.microsoft.com/en-us/azure/ai-ce) | `int` | 16 | -| `GRAPHRAG_EMBEDDING_BATCH_MAX_TOKENS` | | The maximum tokens per batch [(Azure limit is 8191)](https://learn.microsoft.com/en-us/azure/ai-services/openai/reference) | `int` | 8191 | -| `GRAPHRAG_EMBEDDING_TARGET` | | The target fields to embed. Either `required` or `all`. | `str` | `required` | | -| `GRAPHRAG_EMBEDDING_THREAD_COUNT` | | The number of threads to use for parallelization for embeddings. | `int` | | -| `GRAPHRAG_EMBEDDING_THREAD_STAGGER` | | The time to wait (in seconds) between starting each thread for embeddings. | `float` | 50 | -| `GRAPHRAG_EMBEDDING_CONCURRENT_REQUESTS` | | The number of concurrent requests to allow for the embedding client. | `int` | 25 | -| `GRAPHRAG_EMBEDDING_TOKENS_PER_MINUTE` | | The number of tokens per minute to allow for the embedding client. 0 = Bypass | `int` | 0 | -| `GRAPHRAG_EMBEDDING_REQUESTS_PER_MINUTE` | | The number of requests per minute to allow for the embedding client. 0 = Bypass | `int` | 0 | -| `GRAPHRAG_EMBEDDING_MAX_RETRIES` | | The maximum number of retries to attempt when a request fails. | `int` | 10 | -| `GRAPHRAG_EMBEDDING_MAX_RETRY_WAIT` | | The maximum number of seconds to wait between retries. | `int` | 10 | -| `GRAPHRAG_EMBEDDING_SLEEP_ON_RATE_LIMIT_RECOMMENDATION` | | Whether to sleep on rate limit recommendation. (Azure Only) | `bool` | `True` | - -### Input Settings - -These settings control the data input used by the pipeline. Any settings with a fallback will use the base LLM settings, if available. - -#### Plaintext Input Data (`GRAPHRAG_INPUT_FILE_TYPE`=text) - -| Parameter | Description | Type | Required or Optional | Default | -| ----------------------------- | --------------------------------------------------------------------------------- | ----- | -------------------- | ---------- | -| `GRAPHRAG_INPUT_FILE_PATTERN` | The file pattern regexp to use when reading input files from the input directory. | `str` | optional | `.*\.txt$` | - -#### CSV Input Data (`GRAPHRAG_INPUT_FILE_TYPE`=csv) - -| Parameter | Description | Type | Required or Optional | Default | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ---------- | -| `GRAPHRAG_INPUT_TYPE` | The input storage type to use when reading files. (`file` or `blob`) | `str` | optional | `file` | -| `GRAPHRAG_INPUT_FILE_PATTERN` | The file pattern regexp to use when reading input files from the input directory. | `str` | optional | `.*\.txt$` | -| `GRAPHRAG_INPUT_TEXT_COLUMN` | The 'text' column to use when reading CSV input files. | `str` | optional | `text` | -| `GRAPHRAG_INPUT_METADATA` | A list of CSV columns, comma-separated, to incorporate as JSON in a metadata column. | `str` | optional | `None` | -| `GRAPHRAG_INPUT_TITLE_COLUMN` | The 'title' column to use when reading CSV input files. | `str` | optional | `title` | -| `GRAPHRAG_INPUT_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | `None` | -| `GRAPHRAG_INPUT_CONNECTION_STRING` | The connection string to use when reading CSV input files from Azure Blob Storage. | `str` | optional | `None` | -| `GRAPHRAG_INPUT_CONTAINER_NAME` | The container name to use when reading CSV input files from Azure Blob Storage. | `str` | optional | `None` | -| `GRAPHRAG_INPUT_BASE_DIR` | The base directory to read input files from. | `str` | optional | `None` | - -### Data Mapping Settings - -| Parameter | Description | Type | Required or Optional | Default | -| -------------------------- | -------------------------------------------------------- | ----- | -------------------- | ------- | -| `GRAPHRAG_INPUT_FILE_TYPE` | The type of input data, `csv` or `text` | `str` | optional | `text` | -| `GRAPHRAG_INPUT_ENCODING` | The encoding to apply when reading CSV/text input files. | `str` | optional | `utf-8` | - -### Data Chunking - -| Parameter | Description | Type | Required or Optional | Default | -| ------------------------------- | ------------------------------------------------------------------------------------------- | ----- | -------------------- | ----------------------------- | -| `GRAPHRAG_CHUNK_SIZE` | The chunk size in tokens for text-chunk analysis windows. | `str` | optional | 1200 | -| `GRAPHRAG_CHUNK_OVERLAP` | The chunk overlap in tokens for text-chunk analysis windows. | `str` | optional | 100 | -| `GRAPHRAG_CHUNK_BY_COLUMNS` | A comma-separated list of document attributes to groupby when performing TextUnit chunking. | `str` | optional | `id` | -| `GRAPHRAG_CHUNK_ENCODING_MODEL` | The encoding model to use for chunking. | `str` | optional | The top-level encoding model. | - -### Prompting Overrides - -| Parameter | Description | Type | Required or Optional | Default | -| --------------------------------------------- | ------------------------------------------------------------------------------------------ | -------- | -------------------- | ---------------------------------------------------------------- | -| `GRAPHRAG_ENTITY_EXTRACTION_PROMPT_FILE` | The path (relative to the root) of an entity extraction prompt template text file. | `str` | optional | `None` | -| `GRAPHRAG_ENTITY_EXTRACTION_MAX_GLEANINGS` | The maximum number of redrives (gleanings) to invoke when extracting entities in a loop. | `int` | optional | 1 | -| `GRAPHRAG_ENTITY_EXTRACTION_ENTITY_TYPES` | A comma-separated list of entity types to extract. | `str` | optional | `organization,person,event,geo` | -| `GRAPHRAG_ENTITY_EXTRACTION_ENCODING_MODEL` | The encoding model to use for entity extraction. | `str` | optional | The top-level encoding model. | -| `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_PROMPT_FILE` | The path (relative to the root) of an description summarization prompt template text file. | `str` | optional | `None` | -| `GRAPHRAG_SUMMARIZE_DESCRIPTIONS_MAX_LENGTH` | The maximum number of tokens to generate per description summarization. | `int` | optional | 500 | -| `GRAPHRAG_CLAIM_EXTRACTION_ENABLED` | Whether claim extraction is enabled for this pipeline. | `bool` | optional | `False` | -| `GRAPHRAG_CLAIM_EXTRACTION_DESCRIPTION` | The claim_description prompting argument to utilize. | `string` | optional | "Any claims or facts that could be relevant to threat analysis." | -| `GRAPHRAG_CLAIM_EXTRACTION_PROMPT_FILE` | The claim extraction prompt to utilize. | `string` | optional | `None` | -| `GRAPHRAG_CLAIM_EXTRACTION_MAX_GLEANINGS` | The maximum number of redrives (gleanings) to invoke when extracting claims in a loop. | `int` | optional | 1 | -| `GRAPHRAG_CLAIM_EXTRACTION_ENCODING_MODEL` | The encoding model to use for claim extraction. | `str` | optional | The top-level encoding model | -| `GRAPHRAG_COMMUNITY_REPORTS_PROMPT_FILE` | The community reports extraction prompt to utilize. | `string` | optional | `None` | -| `GRAPHRAG_COMMUNITY_REPORTS_MAX_LENGTH` | The maximum number of tokens to generate per community reports. | `int` | optional | 1500 | - -### Storage - -This section controls the storage mechanism used by the pipeline used for exporting output tables. - -| Parameter | Description | Type | Required or Optional | Default | -| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ------- | -| `GRAPHRAG_STORAGE_TYPE` | The type of storage to use. Options are `file`, `memory`, or `blob` | `str` | optional | `file` | -| `GRAPHRAG_STORAGE_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | -| `GRAPHRAG_STORAGE_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_STORAGE_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_STORAGE_BASE_DIR` | The base path to data outputs outputs. | `str` | optional | None | - -### Cache - -This section controls the cache mechanism used by the pipeline. This is used to cache LLM invocation results. - -| Parameter | Description | Type | Required or Optional | Default | -| ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ------- | -| `GRAPHRAG_CACHE_TYPE` | The type of cache to use. Options are `file`, `memory`, `none` or `blob` | `str` | optional | `file` | -| `GRAPHRAG_CACHE_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | -| `GRAPHRAG_CACHE_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_CACHE_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_CACHE_BASE_DIR` | The base path to the cache files. | `str` | optional | None | - -### Reporting - -This section controls the reporting mechanism used by the pipeline, for common events and error messages. The default is to write reports to a file in the output directory. However, you can also choose to write reports to an Azure Blob Storage container. - -| Parameter | Description | Type | Required or Optional | Default | -| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----- | -------------------- | ------- | -| `GRAPHRAG_REPORTING_TYPE` | The type of reporter to use. Options are `file` or `blob` | `str` | optional | `file` | -| `GRAPHRAG_REPORTING_STORAGE_ACCOUNT_BLOB_URL` | The Azure Storage blob endpoint to use when in `blob` mode and using managed identity. Will have the format `https://.blob.core.windows.net` | `str` | optional | None | -| `GRAPHRAG_REPORTING_CONNECTION_STRING` | The Azure Storage connection string to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_REPORTING_CONTAINER_NAME` | The Azure Storage container name to use when in `blob` mode. | `str` | optional | None | -| `GRAPHRAG_REPORTING_BASE_DIR` | The base path to the reporting outputs. | `str` | optional | None | - -### Node2Vec Parameters - -| Parameter | Description | Type | Required or Optional | Default | -| ------------------------------- | ---------------------------------------- | ------ | -------------------- | ------- | -| `GRAPHRAG_NODE2VEC_ENABLED` | Whether to enable Node2Vec | `bool` | optional | False | -| `GRAPHRAG_NODE2VEC_NUM_WALKS` | The Node2Vec number of walks to perform | `int` | optional | 10 | -| `GRAPHRAG_NODE2VEC_WALK_LENGTH` | The Node2Vec walk length | `int` | optional | 40 | -| `GRAPHRAG_NODE2VEC_WINDOW_SIZE` | The Node2Vec window size | `int` | optional | 2 | -| `GRAPHRAG_NODE2VEC_ITERATIONS` | The number of iterations to run node2vec | `int` | optional | 3 | -| `GRAPHRAG_NODE2VEC_RANDOM_SEED` | The random seed to use for node2vec | `int` | optional | 597832 | - -### Data Snapshotting - -| Parameter | Description | Type | Required or Optional | Default | -| -------------------------------------- | ----------------------------------------------- | ------ | -------------------- | ------- | -| `GRAPHRAG_SNAPSHOT_EMBEDDINGS` | Whether to enable embeddings snapshots. | `bool` | optional | False | -| `GRAPHRAG_SNAPSHOT_GRAPHML` | Whether to enable GraphML snapshots. | `bool` | optional | False | -| `GRAPHRAG_SNAPSHOT_RAW_ENTITIES` | Whether to enable raw entity snapshots. | `bool` | optional | False | -| `GRAPHRAG_SNAPSHOT_TOP_LEVEL_NODES` | Whether to enable top-level node snapshots. | `bool` | optional | False | -| `GRAPHRAG_SNAPSHOT_TRANSIENT` | Whether to enable transient table snapshots. | `bool` | optional | False | - -# Miscellaneous Settings - -| Parameter | Description | Type | Required or Optional | Default | -| --------------------------- | --------------------------------------------------------------------- | ------ | -------------------- | ------------- | -| `GRAPHRAG_ASYNC_MODE` | Which async mode to use. Either `asyncio` or `threaded`. | `str` | optional | `asyncio` | -| `GRAPHRAG_ENCODING_MODEL` | The text encoding model, used in tiktoken, to encode text. | `str` | optional | `cl100k_base` | -| `GRAPHRAG_MAX_CLUSTER_SIZE` | The maximum number of entities to include in a single Leiden cluster. | `int` | optional | 10 | -| `GRAPHRAG_UMAP_ENABLED` | Whether to enable UMAP layouts | `bool` | optional | False | diff --git a/docs/config/models.md b/docs/config/models.md index eaa4eea0e7..0339b7f235 100644 --- a/docs/config/models.md +++ b/docs/config/models.md @@ -6,78 +6,62 @@ This page contains information on selecting a model to use and options to supply GraphRAG was built and tested using OpenAI models, so this is the default model set we support. This is not intended to be a limiter or statement of quality or fitness for your use case, only that it's the set we are most familiar with for prompting, tuning, and debugging. -GraphRAG also utilizes a language model wrapper library used by several projects within our team, called fnllm. fnllm provides two important functions for GraphRAG: rate limiting configuration to help us maximize throughput for large indexing jobs, and robust caching of API calls to minimize consumption on repeated indexes for testing, experimentation, or incremental ingest. fnllm uses the OpenAI Python SDK under the covers, so OpenAI-compliant endpoints are a base requirement out-of-the-box. +GraphRAG uses [LiteLLM](https://docs.litellm.ai/) for calling language models. LiteLLM provides support for 100+ models though it is important to note that when choosing a model it must support returning [structured outputs](https://openai.com/index/introducing-structured-outputs-in-the-api/) adhering to a [JSON schema](https://docs.litellm.ai/docs/completion/json_mode). -Starting with version 2.6.0, GraphRAG supports using [LiteLLM](https://docs.litellm.ai/) instead of fnllm for calling language models. LiteLLM provides support for 100+ models though it is important to note that when choosing a model it must support returning [structured outputs](https://openai.com/index/introducing-structured-outputs-in-the-api/) adhering to a [JSON schema](https://docs.litellm.ai/docs/completion/json_mode). - -Example using LiteLLm as the language model tool for GraphRAG: +Example using LiteLLM as the language model manager for GraphRAG: ```yaml -models: - default_chat_model: - type: chat - auth_type: api_key - api_key: ${GEMINI_API_KEY} +completion_models: + default_completion_model: model_provider: gemini model: gemini-2.5-flash-lite - default_embedding_model: - type: embedding - auth_type: api_key + auth_method: api_key api_key: ${GEMINI_API_KEY} + +embedding_models: + default_embedding_model: model_provider: gemini model: gemini-embedding-001 + auth_method: api_key + api_key: ${GEMINI_API_KEY} ``` -To use LiteLLM one must - -- Set `type` to either `chat` or `embedding`. -- Provide a `model_provider`, e.g., `openai`, `azure`, `gemini`, etc. -- Set the `model` to a one supported by the `model_provider`'s API. -- Provide a `deployment_name` if using `azure` as the `model_provider`. - -See [Detailed Configuration](yaml.md) for more details on configuration. [View LiteLLm basic usage](https://docs.litellm.ai/docs/#basic-usage) for details on how models are called (The `model_provider` is the portion prior to `/` while the `model` is the portion following the `/`). +See [Detailed Configuration](yaml.md) for more details on configuration. [View LiteLLM basic usage](https://docs.litellm.ai/docs/#basic-usage) for details on how models are called (The `model_provider` is the portion prior to `/` while the `model` is the portion following the `/`). ## Model Selection Considerations -GraphRAG has been most thoroughly tested with the gpt-4 series of models from OpenAI, including gpt-4 gpt-4-turbo, gpt-4o, and gpt-4o-mini. Our [arXiv paper](https://arxiv.org/abs/2404.16130), for example, performed quality evaluation using gpt-4-turbo. As stated above, non-OpenAI models are now supported with GraphRAG 2.6.0 and onwards through the use of LiteLLM but the suite of gpt-4 series of models from OpenAI remain the most tested and supported suite of models for GraphRAG. +GraphRAG has been most thoroughly tested with the gpt-4 series of models from OpenAI, including gpt-4 gpt-4-turbo, gpt-4o, and gpt-4o-mini. Our [arXiv paper](https://arxiv.org/abs/2404.16130), for example, performed quality evaluation using gpt-4-turbo. As stated above, non-OpenAI models are supported through the use of LiteLLM but the suite of gpt-4 series of models from OpenAI remain the most tested and supported suite of models for GraphRAG – in other words, these are the models we know best and can help resolve issues with. Versions of GraphRAG before 2.2.0 made extensive use of `max_tokens` and `logit_bias` to control generated response length or content. The introduction of the o-series of models added new, non-compatible parameters because these models include a reasoning component that has different consumption patterns and response generation attributes than non-reasoning models. GraphRAG 2.2.0 now supports these models, but there are important differences that need to be understood before you switch. - Previously, GraphRAG used `max_tokens` to limit responses in a few locations. This is done so that we can have predictable content sizes when building downstream context windows for summarization. We have now switched from using `max_tokens` to use a prompted approach, which is working well in our tests. We suggest using `max_tokens` in your language model config only for budgetary reasons if you want to limit consumption, and not for expected response length control. We now also support the o-series equivalent `max_completion_tokens`, but if you use this keep in mind that there may be some unknown fixed reasoning consumption amount in addition to the response tokens, so it is not a good technique for response control. - Previously, GraphRAG used a combination of `max_tokens` and `logit_bias` to strictly control a binary yes/no question during gleanings. This is not possible with reasoning models, so again we have switched to a prompted approach. Our tests with gpt-4o, gpt-4o-mini, and o1 show that this works consistently, but could have issues if you have an older or smaller model. - The o-series models are much slower and more expensive. It may be useful to use an asymmetric approach to model use in your config: you can define as many models as you like in the `models` block of your settings.yaml and reference them by key for every workflow that requires a language model. You could use gpt-4o for indexing and o1 for query, for example. Experiment to find the right balance of cost, speed, and quality for your use case. -- The o-series models contain a form of native native chain-of-thought reasoning that is absent in the non-o-series models. GraphRAG's prompts sometimes contain CoT because it was an effective technique with the gpt-4* series. It may be counterproductive with the o-series, so you may want to tune or even re-write large portions of the prompt templates (particularly for graph and claim extraction). +- The o-series models contain a form of native native chain-of-thought reasoning that is absent in the non-o-series models. GraphRAG's prompts sometimes contain CoT because it was an effective technique with the gpt-4\* series. It may be counterproductive with the o-series, so you may want to tune or even re-write large portions of the prompt templates (particularly for graph and claim extraction). Example config with asymmetric model use: ```yaml -models: - extraction_chat_model: - api_key: ${GRAPHRAG_API_KEY} - type: openai_chat - auth_type: api_key +completion_models: + extraction_completion_model: + model_provider: openai model: gpt-4o - model_supports_json: true - query_chat_model: + auth_method: api_key api_key: ${GRAPHRAG_API_KEY} - type: openai_chat - auth_type: api_key + query_completion_model: + model_provider: openai model: o1 - model_supports_json: true - + auth_method: api_key + api_key: ${GRAPHRAG_API_KEY} ... - extract_graph: - model_id: extraction_chat_model + completion_model_id: extraction_completion_model prompt: "prompts/extract_graph.txt" - entity_types: [organization,person,geo,event] + entity_types: [organization, person, geo, event] max_gleanings: 1 - ... - - global_search: - chat_model_id: query_chat_model + completion_model_id: query_completion_model map_prompt: "prompts/global_search_map_system_prompt.txt" reduce_prompt: "prompts/global_search_reduce_system_prompt.txt" knowledge_prompt: "prompts/global_search_knowledge_system_prompt.txt" @@ -85,9 +69,9 @@ global_search: Another option would be to avoid using a language model at all for the graph extraction, instead using the `fast` [indexing method](../index/methods.md) that uses NLP for portions of the indexing phase in lieu of LLM APIs. -## Using Non-OpenAI Models +## Using Custom Models -As shown above, non-OpenAI models may be used via LiteLLM starting with GraphRAG version 2.6.0 but cases may still exist in which some users wish to use models not supported by LiteLLM. There are two approaches one can use to connect to unsupported models: +LiteLLM supports hundreds of models, but cases may still exist in which some users wish to use models not supported by LiteLLM. There are two approaches one can use to connect to unsupported models: ### Proxy APIs @@ -95,36 +79,37 @@ Many users have used platforms such as [ollama](https://ollama.com/) and [LiteLL ### Model Protocol -As of GraphRAG 2.0.0, we support model injection through the use of a standard chat and embedding Protocol and an accompanying ModelFactory that you can use to register your model implementation. This is not supported with the CLI, so you'll need to use GraphRAG as a library. +We support model injection through the use of a standard completion and embedding Protocol and accompanying factories that you can use to register your model implementation. This is not supported with the CLI, so you'll need to use GraphRAG as a library. -- Our Protocol is [defined here](https://github.com/microsoft/graphrag/blob/main/graphrag/language_model/protocol/base.py) -- Our base implementation, which wraps fnllm, [is here](https://github.com/microsoft/graphrag/blob/main/graphrag/language_model/providers/fnllm/models.py) -- We have a simple mock implementation in our tests that you can [reference here](https://github.com/microsoft/graphrag/blob/main/tests/mock_provider.py) +- Our Protocol is [defined here](https://github.com/microsoft/graphrag/blob/main/packages/graphrag-llm/graphrag_llm/completion/completion.py) +- We have a simple mock implementation in our tests that you can [reference here](https://github.com/microsoft/graphrag/blob/main/packages/graphrag-llm/graphrag_llm/completion/mock_llm_completion.py) -Once you have a model implementation, you need to register it with our ModelFactory: +Once you have a model implementation, you need to register it with our completion model factory or embedding model factory: ```python -class MyCustomModel: +from graphrag_llm.completion import LLMCompletion, register_completion + +class MyCustomCompletionModel(LLMCompletion): ... # implementation # elsewhere... -ModelFactory.register_chat("my-custom-chat-model", lambda **kwargs: MyCustomModel(**kwargs)) +register_completion("my-custom-completion-model", MyCustomCompletionModel) ``` Then in your config you can reference the type name you used: ```yaml -models: - default_chat_model: - type: my-custom-chat-model - +completion_models: + default_completion_model: + type: my-custom-completion-model + ... extract_graph: - model_id: default_chat_model + completion_model_id: default_completion_model prompt: "prompts/extract_graph.txt" - entity_types: [organization,person,geo,event] + entity_types: [organization, person, geo, event] max_gleanings: 1 ``` -Note that your custom model will be passed the same params for init and method calls that we use throughout GraphRAG. There is not currently any ability to define custom parameters, so you may need to use closure scope or a factory pattern within your implementation to get custom config values. \ No newline at end of file +Note that your custom model will be passed the same params for init and method calls that we use throughout GraphRAG. There is not currently any ability to define custom parameters, so you may need to use closure scope or a factory pattern within your implementation to get custom config values. diff --git a/docs/config/overview.md b/docs/config/overview.md index 025f5d718e..278d939ce2 100644 --- a/docs/config/overview.md +++ b/docs/config/overview.md @@ -8,4 +8,3 @@ The default configuration mode is the simplest way to get started with the Graph - [Init command](init.md) (recommended first step) - [Edit settings.yaml for deeper control](yaml.md) -- [Purely using environment variables](env_vars.md) (not recommended) diff --git a/docs/config/yaml.md b/docs/config/yaml.md index 6440eb0520..38ceac652d 100644 --- a/docs/config/yaml.md +++ b/docs/config/yaml.md @@ -6,12 +6,12 @@ Many of these config values have defaults. Rather than replicate them here, plea For example: -``` +```bash # .env GRAPHRAG_API_KEY=some_api_key # settings.yml -llm: +default_chat_model: api_key: ${GRAPHRAG_API_KEY} ``` @@ -21,54 +21,54 @@ llm: ### models -This is a dict of model configurations. The dict key is used to reference this configuration elsewhere when a model instance is desired. In this way, you can specify as many different models as you need, and reference them differentially in the workflow steps. +This is a set of dicts, one for completion model configuration and one for embedding model configuration. The dict keys are used to reference the model configuration elsewhere when a model instance is desired. In this way, you can specify as many different models as you need, and reference them independently in the workflow steps. For example: + ```yml -models: - default_chat_model: +completion_models: + default_completion_model: + model_provider: openai + model: gpt-4.1 + auth_method: api_key api_key: ${GRAPHRAG_API_KEY} - type: openai_chat - model: gpt-4o - model_supports_json: true + +embedding_models: default_embedding_model: + model_provider: openai + model: text-embedding-3-large + auth_method: api_key api_key: ${GRAPHRAG_API_KEY} - type: openai_embedding - model: text-embedding-ada-002 ``` #### Fields -- `api_key` **str** - The OpenAI API key to use. -- `auth_type` **api_key|azure_managed_identity** - Indicate how you want to authenticate requests. -- `type` **chat**|**embedding**|**openai_chat|azure_openai_chat|openai_embedding|azure_openai_embedding|mock_chat|mock_embeddings** - The type of LLM to use. -- `model_provider` **str|None** - The model provider to use, e.g., openai, azure, anthropic, etc. Required when `type == chat|embedding`. When `type == chat|embedding`, [LiteLLM](https://docs.litellm.ai/) is used under the hood which has support for calling 100+ models. [View LiteLLm basic usage](https://docs.litellm.ai/docs/#basic-usage) for details on how models are called (The `model_provider` is the portion prior to `/` while the `model` is the portion following the `/`). [View Language Model Selection](models.md) for more details and examples on using LiteLLM. +- `type` **litellm|mock** - The type of LLM provider to use. GraphRAG uses [LiteLLM](https://docs.litellm.ai/) for calling language models. +- `model_provider` **str** - The model provider to use, e.g., openai, azure, anthropic, etc. [LiteLLM](https://docs.litellm.ai/) is used under the hood which has support for calling 100+ models. [View LiteLLm basic usage](https://docs.litellm.ai/docs/#basic-usage) for details on how models are called (The `model_provider` is the portion prior to `/` while the `model` is the portion following the `/`). [View Language Model Selection](models.md) for more details and examples on using LiteLLM. - `model` **str** - The model name. -- `encoding_model` **str** - The text encoding model to use. Default is to use the encoding model aligned with the language model (i.e., it is retrieved from tiktoken if unset). -- `api_base` **str** - The API base url to use. -- `api_version` **str** - The API version. -- `deployment_name` **str** - The deployment name to use (Azure). -- `organization` **str** - The client organization. -- `proxy` **str** - The proxy URL to use. -- `audience` **str** - (Azure OpenAI only) The URI of the target Azure resource/service for which a managed identity token is requested. Used if `api_key` is not defined. Default=`https://cognitiveservices.azure.com/.default` -- `model_supports_json` **bool** - Whether the model supports JSON-mode output. -- `request_timeout` **float** - The per-request timeout. -- `tokens_per_minute` **int** - Set a leaky-bucket throttle on tokens-per-minute. -- `requests_per_minute` **int** - Set a leaky-bucket throttle on requests-per-minute. -- `retry_strategy` **str** - Retry strategy to use, "native" is the default and uses the strategy built into the OpenAI SDK. Other allowable values include "exponential_backoff", "random_wait", and "incremental_wait". -- `max_retries` **int** - The maximum number of retries to use. -- `max_retry_wait` **float** - The maximum backoff time. -- `concurrent_requests` **int** The number of open requests to allow at once. -- `async_mode` **asyncio|threaded** The async mode to use. Either `asyncio` or `threaded`. -- `responses` **list[str]** - If this model type is mock, this is a list of response strings to return. -- `n` **int** - The number of completions to generate. -- `max_tokens` **int** - The maximum number of output tokens. Not valid for o-series models. -- `temperature` **float** - The temperature to use. Not valid for o-series models. -- `top_p` **float** - The top-p value to use. Not valid for o-series models. -- `frequency_penalty` **float** - Frequency penalty for token generation. Not valid for o-series models. -- `presence_penalty` **float** - Frequency penalty for token generation. Not valid for o-series models. -- `max_completion_tokens` **int** - Max number of tokens to consume for chat completion. Must be large enough to include an unknown amount for "reasoning" by the model. o-series models only. -- `reasoning_effort` **low|medium|high** - Amount of "thought" for the model to expend reasoning about a response. o-series models only. +- `call_args`: **dict[str, Any]** - Default arguments to send with every model request. Example, `{"n": 5, "max_completion_tokens": 1000, "temperature": 1.5, "organization": "..." }` +- `api_key` **str|None** - The OpenAI API key to use. +- `api_base` **str|None** - The API base url to use. +- `api_version` **str|None** - The API version. +- `auth_method` **api_key|azure_managed_identity** - Indicate how you want to authenticate requests. +- `azure_deployment_name` **str|None** - The deployment name to use if your model is hosted on Azure. Note that if your deployment name on Azure matches the model name, this is unnecessary. +- retry **RetryConfig|None** - Retry settings. default=`None`, no retries. + - type **exponential_backoff|immediate** - Type of retry approach. default=`exponential_backoff` + - max_retries **int|None** - Max retries to take. default=`7`. + - base_delay **float|None** - Base delay when using `exponential_backoff`. default=`2.0`. + - jitter **bool|None** - Add jitter to retry delays when using `exponential_backoff`. default=`True` + - max_delay **float|None** - Maximum retry delay. default=`None`, no max. +- rate_limit **RateLimitConfig|None** - Rate limit settings. default=`None`, no rate limiting. + - type **sliding_window** - Type of rate limit approach. default=`sliding_window` + - period_in_seconds **int|None** - Window size for `sliding_window` rate limiting. default=`60`, limit requests per minute. + - requests_per_period **int|None** - Maximum number of requests per period. default=`None` + - tokens_per_period **int|None** - Maximum number of tokens per period. default=`None` +- metrics **MetricsConfig|None** - Metric settings. default=`MetricsConfig()`. View [metrics notebook](https://github.com/microsoft/graphrag/blob/main/packages/graphrag-llm/notebooks/04_metrics.ipynb) for more details on metrics. + - type **default** - The type of `MetricsProcessor` service to use for processing request metrics. default=`default` + - store **memory** - The type of `MetricsStore` service. default=`memory`. + - writer **log|file** - The type of `MetricsWriter` to use. Will write out metrics at the end of the process. default`log`, log metrics out using python standard logging at the end of the process. + - log_level **int|None** - The log level when using `log` writer. default=`20`, log `INFO` messages for metrics. + - base_dir **str|None** - The directory to write metrics to when using `file` writer. default=`Path.cwd()`. ## Input Files and Chunking @@ -79,33 +79,31 @@ Our pipeline can ingest .csv, .txt, or .json data from an input location. See th #### Fields - `storage` **StorageConfig** - - `type` **file|blob|cosmosdb** - The storage type to use. Default=`file` + - `type` **file|memory|blob|cosmosdb** - The storage type to use. Default=`file` + - `encoding`**str** - The encoding to use for file storage. - `base_dir` **str** - The base directory to write output artifacts to, relative to the root. - `connection_string` **str** - (blob/cosmosdb only) The Azure Storage connection string. - `container_name` **str** - (blob/cosmosdb only) The Azure Storage container name. - - `storage_account_blob_url` **str** - (blob only) The storage account blob URL to use. - - `cosmosdb_account_blob_url` **str** - (cosmosdb only) The CosmosDB account blob URL to use. -- `file_type` **text|csv|json** - The type of input data to load. Default is `text` + - `account_url` **str** - (blob only) The storage account blob URL to use. + - `database_name` **str** - (cosmosdb only) The database name to use. +- `type` **text|csv|json** - The type of input data to load. Default is `text` - `encoding` **str** - The encoding of the input file. Default is `utf-8` -- `file_pattern` **str** - A regex to match input files. Default is `.*\.csv$`, `.*\.txt$`, or `.*\.json$` depending on the specified `file_type`, but you can customize it if needed. -- `file_filter` **dict** - Key/value pairs to filter. Default is None. -- `text_column` **str** - (CSV/JSON only) The text column name. If unset we expect a column named `text`. -- `title_column` **str** - (CSV/JSON only) The title column name, filename will be used if unset. -- `metadata` **list[str]** - (CSV/JSON only) The additional document attributes fields to keep. +- `file_pattern` **str** - A regex to match input files. Default is `.*\.csv$`, `.*\.txt$`, or `.*\.json$` depending on the specified `type`, but you can customize it if needed. +- `id_column` **str** - The input ID column to use. +- `title_column` **str** - The input title column to use. +- `text_column` **str** - The input text column to use. -### chunks +### chunking These settings configure how we parse documents into text chunks. This is necessary because very large documents may not fit into a single context window, and graph extraction accuracy can be modulated. Also note the `metadata` setting in the input document config, which will replicate document metadata into each chunk. #### Fields +- `type` **tokens|sentence** - The chunking type to use. +- `encoding_model` **str** - The text encoding model to use for splitting on token boundaries. - `size` **int** - The max chunk size in tokens. - `overlap` **int** - The chunk overlap in tokens. -- `group_by_columns` **list[str]** - Group documents by these fields before chunking. -- `strategy` **str**[tokens|sentences] - How to chunk the text. -- `encoding_model` **str** - The text encoding model to use for splitting on token boundaries. -- `prepend_metadata` **bool** - Determines if metadata values should be added at the beginning of each chunk. Default=`False`. -- `chunk_size_includes_metadata` **bool** - Specifies whether the chunk size calculation should include metadata tokens. Default=`False`. +- `prepend_metadata` **list[str]** - Metadata fields from the source document to prepend on each chunk. ## Outputs and Storage @@ -116,24 +114,30 @@ This section controls the storage mechanism used by the pipeline used for export #### Fields - `type` **file|memory|blob|cosmosdb** - The storage type to use. Default=`file` +- `encoding`**str** - The encoding to use for file storage. - `base_dir` **str** - The base directory to write output artifacts to, relative to the root. - `connection_string` **str** - (blob/cosmosdb only) The Azure Storage connection string. - `container_name` **str** - (blob/cosmosdb only) The Azure Storage container name. -- `storage_account_blob_url` **str** - (blob only) The storage account blob URL to use. -- `cosmosdb_account_blob_url` **str** - (cosmosdb only) The CosmosDB account blob URL to use. +- `account_url` **str** - (blob only) The storage account blob URL to use. +- `database_name` **str** - (cosmosdb only) The database name to use. +- `type` **text|csv|json** - The type of input data to load. Default is `text` +- `encoding` **str** - The encoding of the input file. Default is `utf-8` -### update_index_output +### update_output_storage The section defines a secondary storage location for running incremental indexing, to preserve your original outputs. #### Fields - `type` **file|memory|blob|cosmosdb** - The storage type to use. Default=`file` +- `encoding`**str** - The encoding to use for file storage. - `base_dir` **str** - The base directory to write output artifacts to, relative to the root. - `connection_string` **str** - (blob/cosmosdb only) The Azure Storage connection string. - `container_name` **str** - (blob/cosmosdb only) The Azure Storage container name. -- `storage_account_blob_url` **str** - (blob only) The storage account blob URL to use. -- `cosmosdb_account_blob_url` **str** - (cosmosdb only) The CosmosDB account blob URL to use. +- `account_url` **str** - (blob only) The storage account blob URL to use. +- `database_name` **str** - (cosmosdb only) The database name to use. +- `type` **text|csv|json** - The type of input data to load. Default is `text` +- `encoding` **str** - The encoding of the input file. Default is `utf-8` ### cache @@ -141,12 +145,15 @@ This section controls the cache mechanism used by the pipeline. This is used to #### Fields -- `type` **file|memory|blob|cosmosdb** - The storage type to use. Default=`file` -- `base_dir` **str** - The base directory to write output artifacts to, relative to the root. -- `connection_string` **str** - (blob/cosmosdb only) The Azure Storage connection string. -- `container_name` **str** - (blob/cosmosdb only) The Azure Storage container name. -- `storage_account_blob_url` **str** - (blob only) The storage account blob URL to use. -- `cosmosdb_account_blob_url` **str** - (cosmosdb only) The CosmosDB account blob URL to use. +- `type` **json|memory|none** - The storage type to use. Default=`json` +- `storage` **StorageConfig** + - `type` **file|memory|blob|cosmosdb** - The storage type to use. Default=`file` + - `encoding`**str** - The encoding to use for file storage. + - `base_dir` **str** - The base directory to write output artifacts to, relative to the root. + - `connection_string` **str** - (blob/cosmosdb only) The Azure Storage connection string. + - `container_name` **str** - (blob/cosmosdb only) The Azure Storage container name. + - `account_url` **str** - (blob only) The storage account blob URL to use. + - `database_name` **str** - (cosmosdb only) The database name to use. ### reporting @@ -158,7 +165,7 @@ This section controls the reporting mechanism used by the pipeline, for common e - `base_dir` **str** - The base directory to write reports to, relative to the root. - `connection_string` **str** - (blob only) The Azure Storage connection string. - `container_name` **str** - (blob only) The Azure Storage container name. -- `storage_account_blob_url` **str** - The storage account blob URL to use. +- `account_url` **str** - The storage account blob URL to use. ### vector_store @@ -167,13 +174,41 @@ Where to put all vectors for the system. Configured for lancedb by default. This #### Fields - `type` **lancedb|azure_ai_search|cosmosdb** - Type of vector store. Default=`lancedb` -- `db_uri` **str** (only for lancedb) - The database uri. Default=`storage.base_dir/lancedb` -- `url` **str** (only for AI Search) - AI Search endpoint -- `api_key` **str** (optional - only for AI Search) - The AI Search api key to use. -- `audience` **str** (only for AI Search) - Audience for managed identity token if managed identity authentication is used. -- `container_name` **str** - The name of a vector container. This stores all indexes (tables) for a given dataset ingest. Default=`default` +- `db_uri` **str** (lancedb only) - The database uri. Default=`storage.base_dir/lancedb` +- `url` **str** (blob/cosmosdb only) - Database / AI Search to be used. +- `api_key` **str** (optional - AI Search only) - The AI Search api key to use. +- `audience` **str** (AI Search only) - Audience for managed identity token if managed identity authentication is used. +- `connection_string` **str** - (cosmosdb only) The Azure Storage connection string. - `database_name` **str** - (cosmosdb only) Name of the database. -- `overwrite` **bool** (only used at index creation time) - Overwrite collection if it exist. Default=`True` + +- `index_schema` **dict[str, dict[str, str]]** (optional) - Enables customization for each of your embeddings. + - ``: + - `index_name` **str**: (optional) - Name for the specific embedding index table. + - `id_field` **str**: (optional) - Field name to be used as id. Default=`id` + - `vector_field` **str**: (optional) - Field name to be used as vector. Default=`vector` + - `vector_size` **int**: (optional) - Vector size for the embeddings. Default=`3072` + +The supported embeddings are: + +- `text_unit_text` +- `entity_description` +- `community_full_content` + +For example: + +```yaml +vector_store: + type: lancedb + db_uri: output/lancedb + index_schema: + text_unit_text: + index_name: "text-unit-embeddings" + id_field: "id_custom" + vector_field: "vector_custom" + vector_size: 3072 + entity_description: + id_field: "id_custom" +``` ## Workflow Configurations @@ -189,19 +224,14 @@ By default, the GraphRAG indexer will only export embeddings required for our qu Supported embeddings names are: -- `text_unit.text` -- `document.text` -- `entity.title` -- `entity.description` -- `relationship.description` -- `community.title` -- `community.summary` -- `community.full_content` +- `text_unit_text` +- `entity_description` +- `community_full_content` #### Fields -- `model_id` **str** - Name of the model definition to use for text embedding. -- `vector_store_id` **str** - Name of vector store definition to write to. +- `embedding_model_id` **str** - Name of the model definition to use for text embedding. +- `model_instance_name` **str** - Name of the model singleton instance. Default is "text_embedding". This primarily affects the cache storage partitioning. - `batch_size` **int** - The maximum batch size to use. - `batch_max_tokens` **int** - The maximum batch # of tokens. - `names` **list[str]** - List of the embeddings names to run (must be in supported list). @@ -212,7 +242,8 @@ Tune the language model-based graph extraction process. #### Fields -- `model_id` **str** - Name of the model definition to use for API calls. +- `completion_model_id` **str** - Name of the model definition to use for API calls. +- `model_instance_name` **str** - Name of the model singleton instance. Default is "extract_graph". This primarily affects the cache storage partitioning. - `prompt` **str** - The prompt file to use. - `entity_types` **list[str]** - The entity types to identify. - `max_gleanings` **int** - The maximum number of gleaning cycles to use. @@ -221,7 +252,8 @@ Tune the language model-based graph extraction process. #### Fields -- `model_id` **str** - Name of the model definition to use for API calls. +- `completion_model_id` **str** - Name of the model definition to use for API calls. +- `model_instance_name` **str** - Name of the model singleton instance. Default is "summarize_descriptions". This primarily affects the cache storage partitioning. - `prompt` **str** - The prompt file to use. - `max_length` **int** - The maximum number of output tokens per summarization. - `max_input_length` **int** - The maximum number of tokens to collect for summarization (this will limit how many descriptions you send to be summarized for a given entity or relationship). @@ -233,17 +265,19 @@ Defines settings for NLP-based graph extraction methods. #### Fields - `normalize_edge_weights` **bool** - Whether to normalize the edge weights during graph construction. Default=`True`. +- `concurrent_requests` **int** - The number of threads to use for the extraction process. +- `async_mode` **asyncio|threaded** - The async mode to use. Either `asyncio` or `threaded`. - `text_analyzer` **dict** - Parameters for the NLP model. - - extractor_type **regex_english|syntactic_parser|cfg** - Default=`regex_english`. - - model_name **str** - Name of NLP model (for SpaCy-based models) - - max_word_length **int** - Longest word to allow. Default=`15`. - - word_delimiter **str** - Delimiter to split words. Default ' '. - - include_named_entities **bool** - Whether to include named entities in noun phrases. Default=`True`. - - exclude_nouns **list[str] | None** - List of nouns to exclude. If `None`, we use an internal stopword list. - - exclude_entity_tags **list[str]** - List of entity tags to ignore. - - exclude_pos_tags **list[str]** - List of part-of-speech tags to ignore. - - noun_phrase_tags **list[str]** - List of noun phrase tags to ignore. - - noun_phrase_grammars **dict[str, str]** - Noun phrase grammars for the model (cfg-only). + - `extractor_type` **regex_english|syntactic_parser|cfg** - Default=`regex_english`. + - `model_name` **str** - Name of NLP model (for SpaCy-based models) + - `max_word_length` **int** - Longest word to allow. Default=`15`. + - `word_delimiter` **str** - Delimiter to split words. Default ' '. + - `include_named_entities` **bool** - Whether to include named entities in noun phrases. Default=`True`. + - `exclude_nouns` **list[str] | None** - List of nouns to exclude. If `None`, we use an internal stopword list. + - `exclude_entity_tags` **list[str]** - List of entity tags to ignore. + - `exclude_pos_tags` **list[str]** - List of part-of-speech tags to ignore. + - `noun_phrase_tags` **list[str]** - List of noun phrase tags to ignore. + - `noun_phrase_grammars` **dict[str, str]** - Noun phrase grammars for the model (cfg-only). ### prune_graph @@ -251,13 +285,13 @@ Parameters for manual graph pruning. This can be used to optimize the modularity #### Fields -- min_node_freq **int** - The minimum node frequency to allow. -- max_node_freq_std **float | None** - The maximum standard deviation of node frequency to allow. -- min_node_degree **int** - The minimum node degree to allow. -- max_node_degree_std **float | None** - The maximum standard deviation of node degree to allow. -- min_edge_weight_pct **float** - The minimum edge weight percentile to allow. -- remove_ego_nodes **bool** - Remove ego nodes. -- lcc_only **bool** - Only use largest connected component. +- `min_node_freq` **int** - The minimum node frequency to allow. +- `max_node_freq_std` **float | None** - The maximum standard deviation of node frequency to allow. +- `min_node_degree` **int** - The minimum node degree to allow. +- `max_node_degree_std` **float | None** - The maximum standard deviation of node degree to allow. +- `min_edge_weight_pct` **float** - The minimum edge weight percentile to allow. +- `remove_ego_nodes` **bool** - Remove ego nodes. +- `lcc_only` **bool** - Only use largest connected component. ### cluster_graph @@ -274,7 +308,8 @@ These are the settings used for Leiden hierarchical clustering of the graph to c #### Fields - `enabled` **bool** - Whether to enable claim extraction. Off by default, because claim prompts really need user tuning. -- `model_id` **str** - Name of the model definition to use for API calls. +- `completion_model_id` **str** - Name of the model definition to use for API calls. +- `model_instance_name` **str** - Name of the model singleton instance. Default is "extract_claims". This primarily affects the cache storage partitioning. - `prompt` **str** - The prompt file to use. - `description` **str** - Describes the types of claims we want to extract. - `max_gleanings` **int** - The maximum number of gleaning cycles to use. @@ -283,40 +318,20 @@ These are the settings used for Leiden hierarchical clustering of the graph to c #### Fields -- `model_id` **str** - Name of the model definition to use for API calls. -- `prompt` **str** - The prompt file to use. +- `completion_model_id` **str** - Name of the model definition to use for API calls. +- `model_instance_name` **str** - Name of the model singleton instance. Default is "community_reporting". This primarily affects the cache storage partitioning. +- `graph_prompt` **str | None** - The community report extraction prompt to use for graph-based summarization. +- `text_prompt` **str | None** - The community report extraction prompt to use for text-based summarization. - `max_length` **int** - The maximum number of output tokens per report. - `max_input_length` **int** - The maximum number of input tokens to use when generating reports. -### embed_graph - -We use node2vec to embed the graph. This is primarily used for visualization, so it is not turned on by default. - -#### Fields - -- `enabled` **bool** - Whether to enable graph embeddings. -- `dimensions` **int** - Number of vector dimensions to produce. -- `num_walks` **int** - The node2vec number of walks. -- `walk_length` **int** - The node2vec walk length. -- `window_size` **int** - The node2vec window size. -- `iterations` **int** - The node2vec number of iterations. -- `random_seed` **int** - The node2vec random seed. -- `strategy` **dict** - Fully override the embed graph strategy. - -### umap - -Indicates whether we should run UMAP dimensionality reduction. This is used to provide an x/y coordinate to each graph node, suitable for visualization. If this is not enabled, nodes will receive a 0/0 x/y coordinate. If this is enabled, you *must* enable graph embedding as well. - -#### Fields - -- `enabled` **bool** - Whether to enable UMAP layouts. - ### snapshots #### Fields - `embeddings` **bool** - Export embeddings snapshots to parquet. -- `graphml` **bool** - Export graph snapshots to GraphML. +- `graphml` **bool** - Export graph snapshot to GraphML. +- `raw_graph` **bool** - Export raw extracted graph before merging. ## Query @@ -324,10 +339,10 @@ Indicates whether we should run UMAP dimensionality reduction. This is used to p #### Fields -- `chat_model_id` **str** - Name of the model definition to use for Chat Completion calls. -- `embedding_model_id` **str** - Name of the model definition to use for Embedding calls. - `prompt` **str** - The prompt file to use. -- `text_unit_prop` **float** - The text unit proportion. +- `completion_model_id` **str** - Name of the model definition to use for Chat Completion calls. +- `embedding_model_id` **str** - Name of the model definition to use for Embedding calls. +- `text_unit_prop` **float** - The text unit proportion. - `community_prop` **float** - The community proportion. - `conversation_history_max_turns` **int** - The conversation history maximum turns. - `top_k_entities` **int** - The top k mapped entities. @@ -338,14 +353,10 @@ Indicates whether we should run UMAP dimensionality reduction. This is used to p #### Fields -- `chat_model_id` **str** - Name of the model definition to use for Chat Completion calls. -- `map_prompt` **str** - The mapper prompt file to use. -- `reduce_prompt` **str** - The reducer prompt file to use. +- `map_prompt` **str** - The global search mapper prompt to use. +- `reduce_prompt` **str** - The global search reducer to use. +- `completion_model_id` **str** - Name of the model definition to use for Chat Completion calls. - `knowledge_prompt` **str** - The knowledge prompt file to use. -- `map_prompt` **str | None** - The global search mapper prompt to use. -- `reduce_prompt` **str | None** - The global search reducer to use. -- `knowledge_prompt` **str | None** - The global search general prompt to use. -- `max_context_tokens` **int** - The maximum context size to create, in tokens. - `data_max_tokens` **int** - The maximum tokens to use constructing the final response from the reduces responses. - `map_max_length` **int** - The maximum length to request for map responses, in words. - `reduce_max_length` **int** - The maximum length to request for reduce responses, in words. @@ -359,12 +370,13 @@ Indicates whether we should run UMAP dimensionality reduction. This is used to p #### Fields -- `chat_model_id` **str** - Name of the model definition to use for Chat Completion calls. -- `embedding_model_id` **str** - Name of the model definition to use for Embedding calls. - `prompt` **str** - The prompt file to use. - `reduce_prompt` **str** - The reducer prompt file to use. +- `completion_model_id` **str** - Name of the model definition to use for Chat Completion calls. +- `embedding_model_id` **str** - Name of the model definition to use for Embedding calls. - `data_max_tokens` **int** - The data llm maximum tokens. - `reduce_max_tokens` **int** - The maximum tokens for the reduce phase. Only use if a non-o-series model. +- `reduce_temperature` **float** - The temperature to use for token generation in reduce. - `reduce_max_completion_tokens` **int** - The maximum tokens for the reduce phase. Only use for o-series models. - `concurrency` **int** - The number of concurrent requests. - `drift_k_followups` **int** - The number of top global results to retrieve. @@ -386,7 +398,8 @@ Indicates whether we should run UMAP dimensionality reduction. This is used to p #### Fields -- `chat_model_id` **str** - Name of the model definition to use for Chat Completion calls. -- `embedding_model_id` **str** - Name of the model definition to use for Embedding calls. - `prompt` **str** - The prompt file to use. -- `k` **int | None** - Number of text units to retrieve from the vector store for context building. +- `completion_model_id` **str** - Name of the model definition to use for Chat Completion calls. +- `embedding_model_id` **str** - Name of the model definition to use for Embedding calls. +- `k` **int** - Number of text units to retrieve from the vector store for context building. +- `max_context_tokens` **int** - The maximum context size to create, in tokens. diff --git a/docs/developing.md b/docs/developing.md index 5e7b6671a3..eea14d00b0 100644 --- a/docs/developing.md +++ b/docs/developing.md @@ -13,7 +13,7 @@ ```sh # install python dependencies -uv sync +uv sync --all-packages ``` ## Execute the Indexing Engine diff --git a/docs/examples_notebooks/api_overview.ipynb b/docs/examples_notebooks/api_overview.ipynb index 7e219e7688..2a0c0f15de 100644 --- a/docs/examples_notebooks/api_overview.ipynb +++ b/docs/examples_notebooks/api_overview.ipynb @@ -16,7 +16,7 @@ "source": [ "## API Overview\n", "\n", - "This notebook provides a demonstration of how to interact with graphrag as a library using the API as opposed to the CLI. Note that graphrag's CLI actually connects to the library through this API for all operations. " + "This notebook provides a demonstration of how to interact with graphrag as a library using the API as opposed to the CLI. Note that graphrag's CLI actually connects to the library through this API for all operations.\n" ] }, { @@ -28,9 +28,8 @@ "from pathlib import Path\n", "from pprint import pprint\n", "\n", - "import pandas as pd\n", - "\n", "import graphrag.api as api\n", + "import pandas as pd\n", "from graphrag.config.load_config import load_config\n", "from graphrag.index.typing.pipeline_run_result import PipelineRunResult" ] @@ -49,16 +48,17 @@ "metadata": {}, "source": [ "## Prerequisite\n", + "\n", "As a prerequisite to all API operations, a `GraphRagConfig` object is required. It is the primary means to control the behavior of graphrag and can be instantiated from a `settings.yaml` configuration file.\n", "\n", - "Please refer to the [CLI docs](https://microsoft.github.io/graphrag/cli/#init) for more detailed information on how to generate the `settings.yaml` file." + "Please refer to the [CLI docs](https://microsoft.github.io/graphrag/cli/#init) for more detailed information on how to generate the `settings.yaml` file.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Generate a `GraphRagConfig` object" + "### Generate a `GraphRagConfig` object\n" ] }, { @@ -78,14 +78,14 @@ "source": [ "## Indexing API\n", "\n", - "*Indexing* is the process of ingesting raw text data and constructing a knowledge graph. GraphRAG currently supports plaintext (`.txt`) and `.csv` file formats." + "_Indexing_ is the process of ingesting raw text data and constructing a knowledge graph. GraphRAG currently supports plaintext (`.txt`) and `.csv` file formats.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Build an index" + "## Build an index\n" ] }, { @@ -108,7 +108,7 @@ "source": [ "## Query an index\n", "\n", - "To query an index, several index files must first be read into memory and passed to the query API. " + "To query an index, several index files must first be read into memory and passed to the query API.\n" ] }, { @@ -139,7 +139,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The response object is the official reponse from graphrag while the context object holds various metadata regarding the querying process used to obtain the final response." + "The response object is the official reponse from graphrag while the context object holds various metadata regarding the querying process used to obtain the final response.\n" ] }, { @@ -155,7 +155,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Digging into the context a bit more provides users with extremely granular information such as what sources of data (down to the level of text chunks) were ultimately retrieved and used as part of the context sent to the LLM model)." + "Digging into the context a bit more provides users with extremely granular information such as what sources of data (down to the level of text chunks) were ultimately retrieved and used as part of the context sent to the LLM model).\n" ] }, { @@ -170,7 +170,7 @@ ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "graphrag-monorepo", "language": "python", "name": "python3" }, @@ -184,7 +184,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/docs/examples_notebooks/custom_vector_store.ipynb b/docs/examples_notebooks/custom_vector_store.ipynb index 4c3d223c69..2e79c66d86 100644 --- a/docs/examples_notebooks/custom_vector_store.ipynb +++ b/docs/examples_notebooks/custom_vector_store.ipynb @@ -28,7 +28,7 @@ "\n", "### What You'll Learn\n", "\n", - "1. Understanding the `BaseVectorStore` interface\n", + "1. Understanding the `VectorStore` interface\n", "2. Implementing a custom vector store class\n", "3. Registering your vector store with the `VectorStoreFactory`\n", "4. Testing and validating your implementation\n", @@ -50,36 +50,13 @@ "```" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from typing import Any\n", - "\n", - "import numpy as np\n", - "import yaml\n", - "\n", - "from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig\n", - "from graphrag.data_model.types import TextEmbedder\n", - "\n", - "# GraphRAG vector store components\n", - "from graphrag.vector_stores.base import (\n", - " BaseVectorStore,\n", - " VectorStoreDocument,\n", - " VectorStoreSearchResult,\n", - ")\n", - "from graphrag.vector_stores.factory import VectorStoreFactory" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Step 2: Understand the BaseVectorStore Interface\n", + "## Step 2: Understand the VectorStore Interface\n", "\n", - "Before using a custom vector store, let's examine the `BaseVectorStore` interface to understand what methods need to be implemented." + "Before using a custom vector store, let's examine the `VectorStore` interface to understand what methods need to be implemented." ] }, { @@ -88,18 +65,31 @@ "metadata": {}, "outputs": [], "source": [ - "# Let's inspect the BaseVectorStore class to understand the required methods\n", "import inspect\n", "\n", - "print(\"BaseVectorStore Abstract Methods:\")\n", - "print(\"=\" * 40)\n", + "# Let's inspect the VectorStore class to understand the required methods\n", + "from typing import Any\n", + "\n", + "import numpy as np\n", + "import yaml\n", + "from graphrag_vectors import (\n", + " IndexSchema,\n", + " TextEmbedder,\n", + " VectorStore,\n", + " VectorStoreDocument,\n", + " VectorStoreFactory,\n", + " VectorStoreSearchResult,\n", + ")\n", + "\n", + "print(\"VectorStore Abstract Methods:\")\n", + "print(\"=\" * 80)\n", "\n", "abstract_methods = []\n", - "for name, method in inspect.getmembers(BaseVectorStore, predicate=inspect.isfunction):\n", + "for name, method in inspect.getmembers(VectorStore, predicate=inspect.isfunction):\n", " if getattr(method, \"__isabstractmethod__\", False):\n", - " signature = inspect.signature(method)\n", - " abstract_methods.append(f\"• {name}{signature}\")\n", - " print(f\"• {name}{signature}\")\n", + " abstract_methods.append(name)\n", + " print(f\"\\n{name}:\")\n", + " print(f\" {inspect.signature(method)}\")\n", "\n", "print(f\"\\nTotal abstract methods to implement: {len(abstract_methods)}\")" ] @@ -113,7 +103,7 @@ "Now let's implement a simple in-memory vector store as an example. This vector store will:\n", "\n", "- Store documents and vectors in memory using Python data structures\n", - "- Support all required BaseVectorStore methods\n", + "- Support all required VectorStore methods\n", "\n", "**Note**: This is a simplified example for demonstration. Production vector stores would typically use optimized libraries like FAISS, more sophisticated indexing, and persistent storage." ] @@ -124,7 +114,7 @@ "metadata": {}, "outputs": [], "source": [ - "class SimpleInMemoryVectorStore(BaseVectorStore):\n", + "class SimpleInMemoryVectorStore(VectorStore):\n", " \"\"\"A simple in-memory vector store implementation for demonstration purposes.\n", "\n", " This vector store stores documents and their embeddings in memory and provides\n", @@ -148,118 +138,90 @@ " self.vectors: dict[str, np.ndarray] = {}\n", " self.connected = False\n", "\n", - " print(f\"🚀 SimpleInMemoryVectorStore initialized for index: {self.index_name}\")\n", - "\n", " def connect(self, **kwargs: Any) -> None:\n", - " \"\"\"Connect to the vector storage (no-op for in-memory store).\"\"\"\n", + " \"\"\"Connect to the vector store (simulated for in-memory store).\"\"\"\n", + " print(\"Connecting to in-memory vector store...\")\n", " self.connected = True\n", - " print(f\"✅ Connected to in-memory vector store: {self.index_name}\")\n", + " print(\"Connected successfully!\")\n", + "\n", + " def create_index(self, **kwargs: Any) -> None:\n", + " \"\"\"Create an index (simulated for in-memory store).\n", + "\n", + " In a real vector database, this would create the necessary data structures\n", + " and indexes for efficient vector search.\n", + " \"\"\"\n", + " print(f\"Creating index: {self.index_name}\")\n", + " # For in-memory store, we just ensure our storage dictionaries are ready\n", + " if not isinstance(self.documents, dict):\n", + " self.documents = {}\n", + " if not isinstance(self.vectors, dict):\n", + " self.vectors = {}\n", + " print(\"Index created successfully!\")\n", "\n", " def load_documents(\n", - " self, documents: list[VectorStoreDocument], overwrite: bool = True\n", + " self, documents: list[VectorStoreDocument], overwrite: bool = False\n", " ) -> None:\n", " \"\"\"Load documents into the vector store.\"\"\"\n", - " if not self.connected:\n", - " msg = \"Vector store not connected. Call connect() first.\"\n", - " raise RuntimeError(msg)\n", - "\n", " if overwrite:\n", + " print(\"Clearing existing documents...\")\n", " self.documents.clear()\n", " self.vectors.clear()\n", "\n", - " loaded_count = 0\n", + " print(f\"Loading {len(documents)} documents...\")\n", " for doc in documents:\n", - " if doc.vector is not None:\n", - " doc_id = str(doc.id)\n", - " self.documents[doc_id] = doc\n", - " self.vectors[doc_id] = np.array(doc.vector, dtype=np.float32)\n", - " loaded_count += 1\n", - "\n", - " print(f\"📚 Loaded {loaded_count} documents into vector store\")\n", - "\n", - " def _cosine_similarity(self, vec1: np.ndarray, vec2: np.ndarray) -> float:\n", - " \"\"\"Calculate cosine similarity between two vectors.\"\"\"\n", - " # Normalize vectors\n", - " norm1 = np.linalg.norm(vec1)\n", - " norm2 = np.linalg.norm(vec2)\n", - "\n", - " if norm1 == 0 or norm2 == 0:\n", - " return 0.0\n", + " self.documents[doc.id] = doc\n", + " if doc.vector:\n", + " self.vectors[doc.id] = np.array(doc.vector)\n", "\n", - " return float(np.dot(vec1, vec2) / (norm1 * norm2))\n", + " print(f\"Successfully loaded {len(documents)} documents!\")\n", "\n", " def similarity_search_by_vector(\n", " self, query_embedding: list[float], k: int = 10, **kwargs: Any\n", " ) -> list[VectorStoreSearchResult]:\n", - " \"\"\"Perform similarity search using a query vector.\"\"\"\n", - " if not self.connected:\n", - " msg = \"Vector store not connected. Call connect() first.\"\n", - " raise RuntimeError(msg)\n", - "\n", + " \"\"\"Search for similar documents using a query vector.\"\"\"\n", " if not self.vectors:\n", " return []\n", "\n", - " query_vec = np.array(query_embedding, dtype=np.float32)\n", - " similarities = []\n", + " query_vector = np.array(query_embedding)\n", "\n", - " # Calculate similarity with all stored vectors\n", - " for doc_id, stored_vec in self.vectors.items():\n", - " similarity = self._cosine_similarity(query_vec, stored_vec)\n", + " # Calculate cosine similarity for all documents\n", + " similarities = []\n", + " for doc_id, doc_vector in self.vectors.items():\n", + " # Cosine similarity\n", + " similarity = np.dot(query_vector, doc_vector) / (\n", + " np.linalg.norm(query_vector) * np.linalg.norm(doc_vector)\n", + " )\n", " similarities.append((doc_id, similarity))\n", "\n", - " # Sort by similarity (descending) and take top k\n", + " # Sort by similarity (highest first) and take top k\n", " similarities.sort(key=lambda x: x[1], reverse=True)\n", - " top_k = similarities[:k]\n", + " top_results = similarities[:k]\n", "\n", - " # Create search results\n", + " # Convert to search results\n", " results = []\n", - " for doc_id, score in top_k:\n", - " document = self.documents[doc_id]\n", - " result = VectorStoreSearchResult(document=document, score=score)\n", - " results.append(result)\n", + " for doc_id, score in top_results:\n", + " doc = self.documents[doc_id]\n", + " results.append(VectorStoreSearchResult(document=doc, score=float(score)))\n", "\n", " return results\n", "\n", " def similarity_search_by_text(\n", - " self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any\n", + " self,\n", + " text: str,\n", + " text_embedder: TextEmbedder,\n", + " k: int = 10,\n", + " **kwargs: Any,\n", " ) -> list[VectorStoreSearchResult]:\n", - " \"\"\"Perform similarity search using text (which gets embedded first).\"\"\"\n", - " # Embed the text first\n", + " \"\"\"Search for similar documents using a text query.\"\"\"\n", + " # Embed the query text\n", " query_embedding = text_embedder(text)\n", "\n", - " # Use vector search with the embedding\n", + " # Use vector search\n", " return self.similarity_search_by_vector(query_embedding, k, **kwargs)\n", "\n", - " def filter_by_id(self, include_ids: list[str] | list[int]) -> Any:\n", - " \"\"\"Build a query filter to filter documents by id.\n", - "\n", - " For this simple implementation, we return the list of IDs as the filter.\n", - " \"\"\"\n", - " return [str(id_) for id_ in include_ids]\n", - "\n", - " def search_by_id(self, id: str) -> VectorStoreDocument:\n", - " \"\"\"Search for a document by id.\"\"\"\n", - " doc_id = str(id)\n", - " if doc_id not in self.documents:\n", - " msg = f\"Document with id '{id}' not found\"\n", - " raise KeyError(msg)\n", - "\n", - " return self.documents[doc_id]\n", - "\n", - " def get_stats(self) -> dict[str, Any]:\n", - " \"\"\"Get statistics about the vector store (custom method).\"\"\"\n", - " return {\n", - " \"index_name\": self.index_name,\n", - " \"document_count\": len(self.documents),\n", - " \"vector_count\": len(self.vectors),\n", - " \"connected\": self.connected,\n", - " \"vector_dimension\": len(next(iter(self.vectors.values())))\n", - " if self.vectors\n", - " else 0,\n", - " }\n", - "\n", - "\n", - "print(\"✅ SimpleInMemoryVectorStore class defined!\")" + " def search_by_id(self, id: str) -> VectorStoreDocument | None:\n", + " \"\"\"Retrieve a document by its ID.\"\"\"\n", + " return self.documents.get(id)" ] }, { @@ -281,15 +243,15 @@ "CUSTOM_VECTOR_STORE_TYPE = \"simple_memory\"\n", "\n", "# Register the vector store class\n", - "VectorStoreFactory.register(CUSTOM_VECTOR_STORE_TYPE, SimpleInMemoryVectorStore)\n", + "VectorStoreFactory().register(CUSTOM_VECTOR_STORE_TYPE, SimpleInMemoryVectorStore)\n", "\n", "print(f\"✅ Registered custom vector store with type: '{CUSTOM_VECTOR_STORE_TYPE}'\")\n", "\n", "# Verify registration\n", - "available_types = VectorStoreFactory.get_vector_store_types()\n", + "available_types = VectorStoreFactory().keys()\n", "print(f\"\\n📋 Available vector store types: {available_types}\")\n", "print(\n", - " f\"🔍 Is our custom type supported? {VectorStoreFactory.is_supported_type(CUSTOM_VECTOR_STORE_TYPE)}\"\n", + " f\"🔍 Is our custom type supported? {CUSTOM_VECTOR_STORE_TYPE in VectorStoreFactory()}\"\n", ")" ] }, @@ -318,27 +280,19 @@ "sample_documents = [\n", " VectorStoreDocument(\n", " id=\"doc_1\",\n", - " text=\"GraphRAG is a powerful knowledge graph extraction and reasoning framework.\",\n", " vector=create_mock_embedding(),\n", - " attributes={\"category\": \"technology\", \"source\": \"documentation\"},\n", " ),\n", " VectorStoreDocument(\n", " id=\"doc_2\",\n", - " text=\"Vector stores enable efficient similarity search over high-dimensional data.\",\n", " vector=create_mock_embedding(),\n", - " attributes={\"category\": \"technology\", \"source\": \"research\"},\n", " ),\n", " VectorStoreDocument(\n", " id=\"doc_3\",\n", - " text=\"Machine learning models can process and understand natural language text.\",\n", " vector=create_mock_embedding(),\n", - " attributes={\"category\": \"AI\", \"source\": \"article\"},\n", " ),\n", " VectorStoreDocument(\n", " id=\"doc_4\",\n", - " text=\"Custom implementations allow for specialized behavior and integration.\",\n", " vector=create_mock_embedding(),\n", - " attributes={\"category\": \"development\", \"source\": \"tutorial\"},\n", " ),\n", "]\n", "\n", @@ -352,17 +306,24 @@ "outputs": [], "source": [ "# Test creating vector store using the factory\n", - "schema = VectorStoreSchemaConfig(index_name=\"test_collection\")\n", + "schema = IndexSchema(index_name=\"test_collection\")\n", "\n", "# Create vector store instance using factory\n", - "vector_store = VectorStoreFactory.create_vector_store(\n", - " CUSTOM_VECTOR_STORE_TYPE, vector_store_schema_config=schema\n", + "vector_store = VectorStoreFactory().create(\n", + " CUSTOM_VECTOR_STORE_TYPE, {\"index_schema\": schema}\n", ")\n", "\n", "print(f\"✅ Created vector store instance: {type(vector_store).__name__}\")\n", "print(f\"📊 Initial stats: {vector_store.get_stats()}\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -371,6 +332,7 @@ "source": [ "# Connect and load documents\n", "vector_store.connect()\n", + "vector_store.create_index()\n", "vector_store.load_documents(sample_documents)\n", "\n", "print(f\"📊 Updated stats: {vector_store.get_stats()}\")" @@ -395,9 +357,7 @@ "for i, result in enumerate(search_results, 1):\n", " doc = result.document\n", " print(f\"{i}. ID: {doc.id}\")\n", - " print(f\" Text: {doc.text[:60]}...\")\n", " print(f\" Similarity Score: {result.score:.4f}\")\n", - " print(f\" Category: {doc.attributes.get('category', 'N/A')}\")\n", " print()" ] }, @@ -412,14 +372,8 @@ " found_doc = vector_store.search_by_id(\"doc_2\")\n", " print(\"✅ Found document by ID:\")\n", " print(f\" ID: {found_doc.id}\")\n", - " print(f\" Text: {found_doc.text}\")\n", - " print(f\" Attributes: {found_doc.attributes}\")\n", "except KeyError as e:\n", - " print(f\"❌ Error: {e}\")\n", - "\n", - "# Test filter by ID\n", - "id_filter = vector_store.filter_by_id([\"doc_1\", \"doc_3\"])\n", - "print(f\"\\n🔧 ID filter result: {id_filter}\")" + " print(f\"❌ Error: {e}\")" ] }, { @@ -450,7 +404,8 @@ " # Other GraphRAG configuration...\n", " \"models\": {\n", " \"default_embedding_model\": {\n", - " \"type\": \"openai_embedding\",\n", + " \"type\": \"embedding\",\n", + " \"model_provider\": \"openai\",\n", " \"model\": \"text-embedding-3-small\",\n", " }\n", " },\n", @@ -485,24 +440,21 @@ " print(\"🚀 Simulating GraphRAG pipeline with custom vector store...\\n\")\n", "\n", " # 1. GraphRAG creates vector store using factory\n", - " schema = VectorStoreSchemaConfig(index_name=\"graphrag_entities\")\n", + " schema = IndexSchema(index_name=\"graphrag_entities\")\n", "\n", - " store = VectorStoreFactory.create_vector_store(\n", + " store = VectorStoreFactory().create(\n", " CUSTOM_VECTOR_STORE_TYPE,\n", - " vector_store_schema_config=schema,\n", - " similarity_threshold=0.3,\n", + " {\"index_schema\": schema, \"similarity_threshold\": 0.3},\n", " )\n", " store.connect()\n", - "\n", + " store.create_index()\n", " print(\"✅ Step 1: Vector store created and connected\")\n", "\n", " # 2. During indexing, GraphRAG loads extracted entities\n", " entity_documents = [\n", " VectorStoreDocument(\n", " id=f\"entity_{i}\",\n", - " text=f\"Entity {i} description: Important concept in the knowledge graph\",\n", " vector=create_mock_embedding(),\n", - " attributes={\"type\": \"entity\", \"importance\": i % 3 + 1},\n", " )\n", " for i in range(10)\n", " ]\n", @@ -551,12 +503,12 @@ "\n", " # Test 1: Basic functionality\n", " print(\"Test 1: Basic functionality\")\n", - " store = VectorStoreFactory.create_vector_store(\n", + " store = VectorStoreFactory().create(\n", " CUSTOM_VECTOR_STORE_TYPE,\n", - " vector_store_schema_config=VectorStoreSchemaConfig(index_name=\"test\"),\n", + " {\"index_schema\": IndexSchema(index_name=\"test\")},\n", " )\n", " store.connect()\n", - "\n", + " store.create_index()\n", " # Load test documents\n", " test_docs = sample_documents[:2]\n", " store.load_documents(test_docs)\n", @@ -592,17 +544,11 @@ "\n", " print(\"✅ Search by ID test passed\")\n", "\n", - " # Test 4: Filter functionality\n", - " print(\"\\nTest 4: Filter functionality\")\n", - " filter_result = store.filter_by_id([\"doc_1\", \"doc_2\"])\n", - " assert filter_result == [\"doc_1\", \"doc_2\"], \"Should return filtered IDs\"\n", - " print(\"✅ Filter functionality test passed\")\n", - "\n", - " # Test 5: Error handling\n", + " # Test 4: Error handling\n", " print(\"\\nTest 5: Error handling\")\n", - " disconnected_store = VectorStoreFactory.create_vector_store(\n", + " disconnected_store = VectorStoreFactory().create(\n", " CUSTOM_VECTOR_STORE_TYPE,\n", - " vector_store_schema_config=VectorStoreSchemaConfig(index_name=\"test2\"),\n", + " {\"index_schema\": IndexSchema(index_name=\"test2\")},\n", " )\n", "\n", " try:\n", @@ -641,16 +587,24 @@ "- ✅ **Configuration Examples**: Learned how to configure GraphRAG to use your vector store\n", "\n", "### Key Takeaways\n", - "1. **Interface Compliance**: Always implement all methods from `BaseVectorStore`\n", + "1. **Interface Compliance**: Always implement all methods from `VectorStore`\n", "2. **Factory Pattern**: Use `VectorStoreFactory.register()` to make your vector store available\n", - "3. **Configuration**: Vector stores are configured in GraphRAG settings files\n", - "4. **Testing**: Thoroughly test all functionality before deploying\n", - "\n", - "### Next Steps\n", - "Check out the API Overview notebook to learn how to index and query data via the graphrag API.\n", + "3. **Testing**: Validate your implementation thoroughly before production use\n", + "4. **Configuration**: Use YAML or environment variables for flexible configuration\n", + "\n", + "### Production Considerations\n", + "For production use, consider:\n", + "- **Persistence**: Add data persistence mechanisms\n", + "- **Scalability**: Use optimized vector search libraries (FAISS, HNSW)\n", + "- **Error Handling**: Implement robust error handling and logging\n", + "- **Performance**: Add caching, batching, and connection pooling\n", + "- **Security**: Implement authentication and authorization\n", + "- **Monitoring**: Add metrics and health checks\n", "\n", "### Resources\n", "- [GraphRAG Documentation](https://microsoft.github.io/graphrag/)\n", + "- [Vector Store Examples](https://github.com/microsoft/graphrag/tree/main/packages/graphrag-vectors)\n", + "- [GraphRAG GitHub Repository](https://github.com/microsoft/graphrag)\n", "\n", "Happy building! 🚀" ] @@ -658,7 +612,7 @@ ], "metadata": { "kernelspec": { - "display_name": "graphrag", + "display_name": "Python 3", "language": "python", "name": "python3" }, diff --git a/docs/examples_notebooks/drift_search.ipynb b/docs/examples_notebooks/drift_search.ipynb index 1283018fb0..8d53c7d9cc 100644 --- a/docs/examples_notebooks/drift_search.ipynb +++ b/docs/examples_notebooks/drift_search.ipynb @@ -17,14 +17,11 @@ "outputs": [], "source": [ "import os\n", - "from pathlib import Path\n", "\n", "import pandas as pd\n", - "\n", "from graphrag.config.enums import ModelType\n", "from graphrag.config.models.drift_search_config import DRIFTSearchConfig\n", "from graphrag.config.models.language_model_config import LanguageModelConfig\n", - "from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig\n", "from graphrag.language_model.manager import ModelManager\n", "from graphrag.query.indexer_adapters import (\n", " read_indexer_entities,\n", @@ -38,7 +35,7 @@ ")\n", "from graphrag.query.structured_search.drift_search.search import DRIFTSearch\n", "from graphrag.tokenizer.get_tokenizer import get_tokenizer\n", - "from graphrag.vector_stores.lancedb import LanceDBVectorStore\n", + "from graphrag_vectors.lancedb import LanceDBVectorStore\n", "\n", "INPUT_DIR = \"./inputs/operation dulce\"\n", "LANCEDB_URI = f\"{INPUT_DIR}/lancedb\"\n", @@ -63,18 +60,16 @@ "# load description embeddings to an in-memory lancedb vectorstore\n", "# to connect to a remote db, specify url and port values.\n", "description_embedding_store = LanceDBVectorStore(\n", - " vector_store_schema_config=VectorStoreSchemaConfig(\n", - " index_name=\"default-entity-description\"\n", - " ),\n", + " db_uri=LANCEDB_URI,\n", + " index_name=\"entity_description\",\n", ")\n", - "description_embedding_store.connect(db_uri=LANCEDB_URI)\n", + "description_embedding_store.connect()\n", "\n", "full_content_embedding_store = LanceDBVectorStore(\n", - " vector_store_schema_config=VectorStoreSchemaConfig(\n", - " index_name=\"default-community-full_content\"\n", - " )\n", + " db_uri=LANCEDB_URI,\n", + " index_name=\"community_full_content\",\n", ")\n", - "full_content_embedding_store.connect(db_uri=LANCEDB_URI)\n", + "full_content_embedding_store.connect()\n", "\n", "print(f\"Entity count: {len(entity_df)}\")\n", "entity_df.head()\n", @@ -89,7 +84,11 @@ "text_units = read_indexer_text_units(text_unit_df)\n", "\n", "print(f\"Text unit records: {len(text_unit_df)}\")\n", - "text_unit_df.head()" + "text_unit_df.head()\n", + "\n", + "report_df = pd.read_parquet(f\"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet\")\n", + "reports = read_indexer_reports(report_df, community_df, COMMUNITY_LEVEL)\n", + "read_indexer_report_embeddings(reports, full_content_embedding_store)" ] }, { @@ -119,7 +118,7 @@ " api_key=api_key,\n", " type=ModelType.Embedding,\n", " model_provider=\"openai\",\n", - " model=\"text-embedding-3-small\",\n", + " model=\"text-embedding-3-large\",\n", " max_retries=20,\n", ")\n", "\n", @@ -130,31 +129,6 @@ ")" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "def read_community_reports(\n", - " input_dir: str,\n", - " community_report_table: str = COMMUNITY_REPORT_TABLE,\n", - "):\n", - " \"\"\"Embeds the full content of the community reports and saves the DataFrame with embeddings to the output path.\"\"\"\n", - " input_path = Path(input_dir) / f\"{community_report_table}.parquet\"\n", - " return pd.read_parquet(input_path)\n", - "\n", - "\n", - "report_df = read_community_reports(INPUT_DIR)\n", - "reports = read_indexer_reports(\n", - " report_df,\n", - " community_df,\n", - " COMMUNITY_LEVEL,\n", - " content_embedding_col=\"full_content_embeddings\",\n", - ")\n", - "read_indexer_report_embeddings(reports, full_content_embedding_store)" - ] - }, { "cell_type": "code", "execution_count": null, @@ -162,12 +136,9 @@ "outputs": [], "source": [ "drift_params = DRIFTSearchConfig(\n", - " temperature=0,\n", - " max_tokens=12_000,\n", " primer_folds=1,\n", " drift_k_followups=3,\n", " n_depth=3,\n", - " n=1,\n", ")\n", "\n", "context_builder = DRIFTSearchContextBuilder(\n", @@ -217,7 +188,7 @@ ], "metadata": { "kernelspec": { - "display_name": "graphrag", + "display_name": "Python 3", "language": "python", "name": "python3" }, diff --git a/docs/examples_notebooks/global_search.ipynb b/docs/examples_notebooks/global_search.ipynb index c95a037df0..605f704bd2 100644 --- a/docs/examples_notebooks/global_search.ipynb +++ b/docs/examples_notebooks/global_search.ipynb @@ -19,7 +19,6 @@ "import os\n", "\n", "import pandas as pd\n", - "\n", "from graphrag.config.enums import ModelType\n", "from graphrag.config.models.language_model_config import LanguageModelConfig\n", "from graphrag.language_model.manager import ModelManager\n", diff --git a/docs/examples_notebooks/global_search_with_dynamic_community_selection.ipynb b/docs/examples_notebooks/global_search_with_dynamic_community_selection.ipynb index bb0e0f0975..6b3763d73b 100644 --- a/docs/examples_notebooks/global_search_with_dynamic_community_selection.ipynb +++ b/docs/examples_notebooks/global_search_with_dynamic_community_selection.ipynb @@ -19,7 +19,6 @@ "import os\n", "\n", "import pandas as pd\n", - "\n", "from graphrag.config.enums import ModelType\n", "from graphrag.config.models.language_model_config import LanguageModelConfig\n", "from graphrag.language_model.manager import ModelManager\n", diff --git a/docs/examples_notebooks/index_migration_to_v1.ipynb b/docs/examples_notebooks/index_migration_to_v1.ipynb index ecff51929a..c5b582d38d 100644 --- a/docs/examples_notebooks/index_migration_to_v1.ipynb +++ b/docs/examples_notebooks/index_migration_to_v1.ipynb @@ -20,7 +20,7 @@ "\n", "NOTE: we recommend regenerating your settings.yml with the latest version of GraphRAG using `graphrag init`. Copy your LLM settings into it before running this notebook. This ensures your config is aligned with the latest version for the migration. This also ensures that you have default vector store config, which is now required or indexing will fail.\n", "\n", - "WARNING: This will overwrite your parquet files, you may want to make a backup!" + "WARNING: This will overwrite your parquet files, you may want to make a backup!\n" ] }, { @@ -67,7 +67,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -87,7 +87,8 @@ " nodes[\"parent\"] = nodes[\"parent\"].fillna(-1).astype(int)\n", "\n", " join = (\n", - " nodes.groupby([\"community\", \"level\", \"parent\"])\n", + " nodes\n", + " .groupby([\"community\", \"level\", \"parent\"])\n", " .agg({\"title\": list})\n", " .reset_index()\n", " )\n", @@ -96,7 +97,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -168,7 +169,8 @@ " final_communities = final_communities.merge(parent_df, on=\"community\", how=\"left\")\n", "if \"entity_ids\" not in final_communities.columns:\n", " node_mapping = (\n", - " final_nodes.loc[:, [\"community\", \"id\"]]\n", + " final_nodes\n", + " .loc[:, [\"community\", \"id\"]]\n", " .groupby(\"community\")\n", " .agg(entity_ids=(\"id\", list))\n", " )\n", @@ -202,45 +204,51 @@ "metadata": {}, "outputs": [], "source": [ - "from graphrag.index.flows.generate_text_embeddings import generate_text_embeddings\n", - "\n", "from graphrag.cache.factory import CacheFactory\n", "from graphrag.callbacks.noop_workflow_callbacks import NoopWorkflowCallbacks\n", - "from graphrag.config.embeddings import get_embedded_fields, get_embedding_settings\n", + "from graphrag.index.workflows.generate_text_embeddings import generate_text_embeddings\n", + "from graphrag.language_model.manager import ModelManager\n", + "from graphrag.tokenizer.get_tokenizer import get_tokenizer\n", "\n", "# We only need to re-run the embeddings workflow, to ensure that embeddings for all required search fields are in place\n", "# We'll construct the context and run this function flow directly to avoid everything else\n", "\n", - "\n", - "embedded_fields = get_embedded_fields(config)\n", - "text_embed = get_embedding_settings(config)\n", + "model_config = config.get_language_model_config(config.embed_text.model_id)\n", "callbacks = NoopWorkflowCallbacks()\n", "cache_config = config.cache.model_dump() # type: ignore\n", "cache = CacheFactory().create_cache(\n", " cache_type=cache_config[\"type\"], # type: ignore\n", - " root_dir=PROJECT_DIRECTORY,\n", - " kwargs=cache_config,\n", + " **cache_config,\n", + ")\n", + "model = ModelManager().get_or_create_embedding_model(\n", + " name=\"text_embedding\",\n", + " model_type=model_config.type,\n", + " config=model_config,\n", + " callbacks=callbacks,\n", + " cache=cache,\n", ")\n", "\n", + "tokenizer = get_tokenizer(model_config)\n", + "\n", "await generate_text_embeddings(\n", - " final_documents=None,\n", - " final_relationships=None,\n", - " final_text_units=final_text_units,\n", - " final_entities=final_entities,\n", - " final_community_reports=final_community_reports,\n", + " text_units=final_text_units,\n", + " entities=final_entities,\n", + " community_reports=final_community_reports,\n", " callbacks=callbacks,\n", - " cache=cache,\n", - " storage=storage,\n", - " text_embed_config=text_embed,\n", - " embedded_fields=embedded_fields,\n", - " snapshot_embeddings_enabled=False,\n", + " model=model,\n", + " tokenizer=tokenizer,\n", + " batch_size=config.embed_text.batch_size,\n", + " batch_max_tokens=config.embed_text.batch_max_tokens,\n", + " num_threads=model_config.concurrent_requests,\n", + " vector_store_config=config.vector_store,\n", + " embedded_fields=config.embed_text.names,\n", ")" ] } ], "metadata": { "kernelspec": { - "display_name": ".venv", + "display_name": "graphrag", "language": "python", "name": "python3" }, @@ -254,7 +262,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.9" + "version": "3.12.10" } }, "nbformat": 4, diff --git a/docs/examples_notebooks/index_migration_to_v2.ipynb b/docs/examples_notebooks/index_migration_to_v2.ipynb index dad9011696..0681d1a0b2 100644 --- a/docs/examples_notebooks/index_migration_to_v2.ipynb +++ b/docs/examples_notebooks/index_migration_to_v2.ipynb @@ -70,7 +70,6 @@ "outputs": [], "source": [ "import numpy as np\n", - "\n", "from graphrag.utils.storage import (\n", " delete_table_from_storage,\n", " load_table_from_storage,\n", diff --git a/docs/examples_notebooks/index_migration_to_v3.ipynb b/docs/examples_notebooks/index_migration_to_v3.ipynb new file mode 100644 index 0000000000..a0e50be432 --- /dev/null +++ b/docs/examples_notebooks/index_migration_to_v3.ipynb @@ -0,0 +1,146 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Index Migration (v2 to v3)\n", + "\n", + "This notebook is used to maintain data model parity with older indexes for version 3.0 of GraphRAG. If you have a pre-3.0 index and need to migrate without re-running the entire pipeline, you can use this notebook to only update the pieces necessary for alignment. If you have a pre-2.0 index, please run the v2 migration notebook first!\n", + "\n", + "NOTE: we recommend regenerating your settings.yml with the latest version of GraphRAG using `graphrag init`. Copy your LLM settings into it before running this notebook. This ensures your config is aligned with the latest version for the migration. The config changes from v2 to v3 are significant in places!\n", + "\n", + "WARNING: This will overwrite your parquet files, you may want to make a backup!" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This is the directory that has your settings.yaml\n", + "PROJECT_DIRECTORY = \"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "\n", + "from graphrag.config.models.graph_rag_config import GraphRagConfig\n", + "from graphrag_common.config import load_config\n", + "from graphrag_storage.storage_factory import create_storage\n", + "\n", + "config = load_config(GraphRagConfig, config_path=Path(PROJECT_DIRECTORY))\n", + "storage = create_storage(config.output_storage)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def remove_columns(df, columns):\n", + " \"\"\"Remove columns from a DataFrame, suppressing errors.\"\"\"\n", + " df.drop(labels=columns, axis=1, errors=\"ignore\", inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from graphrag.utils.storage import (\n", + " load_table_from_storage,\n", + " write_table_to_storage,\n", + ")\n", + "\n", + "text_units = await load_table_from_storage(\"text_units\", storage)\n", + "\n", + "text_units[\"document_id\"] = text_units[\"document_ids\"].apply(lambda ids: ids[0])\n", + "remove_columns(text_units, [\"document_ids\"])\n", + "\n", + "await write_table_to_storage(text_units, \"text_units\", storage)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Update settings.yaml\n", + "If you have left the default settings for your vector store schema, you may need to set explicit values that map each embedding type to a vector schema name. If you have already customized your vector store schema it may not be necessary.\n", + "\n", + "Old default index names:\n", + "- default-text_unit-text\n", + "- default-entity-description\n", + "- default-community-full_content\n", + "\n", + "(if you left all of the defaults, check your output/lancedb folder to confirm the above)\n", + "\n", + "v3 versions are:\n", + "- text_unit_text\n", + "- entity_description\n", + "- community_full_content\n", + "\n", + "Therefore, with a v2 index need to explicitly set the old index names so it connects correctly. We no longer support the \"prefix\" - you can just set an explicit index_name for each embedding.\n", + "\n", + "NOTE: we are also setting the default vector_size for each index below, under the assumption that you are using a prior default with 1536 dimensions. Our new default of text-embedding-3-large has 3072 dimensions, which will be populated as the default if unset. Again, if you have a more complicated situation you may want to manually configure this.\n", + "\n", + "Here is an example of the new vector store config block that you may need in your settings.yaml:\n", + "\n", + "```yaml\n", + "vector_store:\n", + " type: lancedb\n", + " db_uri: output/lancedb\n", + " index_schema:\n", + " text_unit_text:\n", + " index_name: default-text_unit-text\n", + " vector_size: 1536\n", + " entity_description:\n", + " index_name: default-entity-description\n", + " vector_size: 1536\n", + " community_full_content:\n", + " index_name: default-community-full_content\n", + " vector_size: 1536\n", + "```\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/examples_notebooks/input_documents.ipynb b/docs/examples_notebooks/input_documents.ipynb index 1135cb9eb0..5657770eaf 100644 --- a/docs/examples_notebooks/input_documents.ipynb +++ b/docs/examples_notebooks/input_documents.ipynb @@ -18,7 +18,7 @@ "\n", "Newer versions of GraphRAG let you submit a dataframe directly instead of running through the input processing step. This notebook demonstrates with regular or update runs.\n", "\n", - "If performing an update, the assumption is that your dataframe contains only the new documents to add to the index." + "If performing an update, the assumption is that your dataframe contains only the new documents to add to the index.\n" ] }, { @@ -30,9 +30,8 @@ "from pathlib import Path\n", "from pprint import pprint\n", "\n", - "import pandas as pd\n", - "\n", "import graphrag.api as api\n", + "import pandas as pd\n", "from graphrag.config.load_config import load_config\n", "from graphrag.index.typing.pipeline_run_result import PipelineRunResult" ] @@ -55,7 +54,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Generate a `GraphRagConfig` object" + "### Generate a `GraphRagConfig` object\n" ] }, { @@ -73,14 +72,14 @@ "source": [ "## Indexing API\n", "\n", - "*Indexing* is the process of ingesting raw text data and constructing a knowledge graph. GraphRAG currently supports plaintext (`.txt`) and `.csv` file formats." + "_Indexing_ is the process of ingesting raw text data and constructing a knowledge graph. GraphRAG currently supports plaintext (`.txt`) and `.csv` file formats.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Build an index" + "## Build an index\n" ] }, { @@ -110,7 +109,7 @@ "source": [ "## Query an index\n", "\n", - "To query an index, several index files must first be read into memory and passed to the query API. " + "To query an index, several index files must first be read into memory and passed to the query API.\n" ] }, { @@ -141,7 +140,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The response object is the official reponse from graphrag while the context object holds various metadata regarding the querying process used to obtain the final response." + "The response object is the official reponse from graphrag while the context object holds various metadata regarding the querying process used to obtain the final response.\n" ] }, { @@ -157,7 +156,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Digging into the context a bit more provides users with extremely granular information such as what sources of data (down to the level of text chunks) were ultimately retrieved and used as part of the context sent to the LLM model)." + "Digging into the context a bit more provides users with extremely granular information such as what sources of data (down to the level of text chunks) were ultimately retrieved and used as part of the context sent to the LLM model).\n" ] }, { @@ -172,7 +171,7 @@ ], "metadata": { "kernelspec": { - "display_name": "graphrag", + "display_name": "graphrag-monorepo", "language": "python", "name": "python3" }, @@ -186,7 +185,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.10" + "version": "3.12.9" } }, "nbformat": 4, diff --git a/docs/examples_notebooks/inputs/operation dulce/communities.parquet b/docs/examples_notebooks/inputs/operation dulce/communities.parquet index 885ced1b15504055f3f516aa08538f57ddc33959..4f4c1a864f253fbb48184cf94db873fe3e2a0231 100644 GIT binary patch literal 14094 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 literal 13291 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 diff --git a/docs/examples_notebooks/inputs/operation dulce/community_reports.parquet b/docs/examples_notebooks/inputs/operation dulce/community_reports.parquet index d633ec0047960d462c38ae58682f460b23cc4921..e6e45e947b16a8675e5879261093c720b42206f0 100644 GIT binary patch literal 88785 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૎u7Y= zv;)o*jVPsdQNx&8SPDZshj_zIEk`jkPCz?Y%#Sm-tTOHzkFF~_7s7;!W;1ifV0fQm zqr5xTqas$fX;@2bTNV1m54Fd`q$0g;fUeVgrP?3X44BNw)HS9{O?^nAFvS%&vFv0uQ{TW`_bJPD)8>1ojzLy1YthG{;RBl%J8Gf4Mxz=%_PGyz7-rfG zAaOP<1u9KSBtI4Q^w*<`QTWRM=8Va3C7N{|y7d^Eigg|30%K32lN)i|1Cm<1U82)X zpyr36GX?k_we*Pgi4^>R?AlySu%Ora30zaPDLd7A)kwe{c%7${+##%BMl;fd=oN46 z&4I16jGviNaa3ijE?7z*bA);&g)QKAhXAtUjLM1Z&|E^N6dHNUi%iHcm>yz_7}^%j z+~ch&YtLj_OA)c{Ik5|;@6w<%gJ8*S$zfuQG;(}RiXp@u{os=kd*D@JIEu=|Pd@;5 z?9!D8XlSkvpwCu0ksSvINguJBwwI;7Ap>GZ=Ma(DaV2p?!U}0q(^KS}HlTSHMS#D~ zsneQwxdx8cP>k1NRN>XqM5ii}s$FyPf#Jcwj{p%fh`Dz%Fg)mYJsl>^L7eG{yc=+U z%Ayk~9$u>ukbZT{`zxhqxNlTw-xxGk_2Y{u#fx4t1bwGE9V1daJSO9BmH@?Lb_(}R zntai*9|ZcqVTMN?vtj>f+fjCv>~f@WQ_Q(2{7jyt-W={;*-CxEFO;2o$8r+PxHYp!yhX<@?aR3vnrhCPU)C2uq8G$f!mg?8GzhFa1?^$ zfOWvM(rQOk0iffFNSnoqKBaXhE9+tH6lD!{t8t)D2g2TKX2%!+bkxluDpqZ2Z~{8E zNzejJw~a=dQxWCG-x$oS=bGX-+>OFv^gw^0m(+ATnxhd;p>QR0VvT9IjGSB~fR2`I zSa^d?(A|KJ{S9ovgTN{{se{v0+S#F5VV$-FE$;L;5A@3Xday|6s96jX7O`Vn6J#HYpEM=44xHknkq-j2MFuUjFD-STlC~`1pqom%s}r1D+!KpZKH?hwU}{z5h5%&^^0kr7k~z3u4Xsj0L}wU2OG_{Dvbe&Ab`@Ybd_AejoKe9P zC85cwe1(D@qu>rCCk*G@{5Gs^-H%2pS{_{DikAE2J;oTzQCo;%)L{B~#*kM}eI=<| zU1srGGT5-g6Ac6{w3vyTLQja3Mzl7ig;KmEnvF?Bs~^-pe;+E(;-|L&g5wKU^m!T} zI4;P`!jw74+#<3!79_zm$aD{1Lk#4b-f_GV+fWh>(S+joP<16x7!6c5dT zC0|D#UeKtbM>B|(Yd*ERs!XkG&`F(>zA>o0y)~-?{WySrV3_8rNtMi=Q{5PiHu{5Q z7e5EF88qKPVz=Njkd{kF9{fE)4&ve_QgBbENG9m=X;SIChy8y(q*+lhgAA|ABz z^Zwf7a+oLPRJ=`wUxHan#;*l$QVY-Td7G}0XD4}wzt{eIQX2tvynG*(o?4i+*3i)@ zH_);n5?kOJcE(hobc}Un7AVo(Be}mQQl|+`BBkRIZ_2-LRBGLlPJX3#sIMVWpEDUx z%cO5k*uDuM9a=Sd7C`p)3iM3~-8R>fR`t0%w_c9!moX8ZU7U{8rFip1PUeXgeR74{HqBlF@TFzpt4jtB2l9}XVye$>jt*ILm!!kuQVAFJb=>S>B#r~b~QrXvU9x-9;$Y3vnn!z-|z>B|89 z9AsW!f-_cIXS8;izpvKqf&PjfbGLz zJxOgthr^i*tUa^R7vLSwDRAYzC{T$$A9!pobD5>TXtL}@W9q}r6w*-&U21I0u9nrb zs*2GE2cG3eu&L)d)}g>h@X|Q?`Pc(*>JB?ZY{yrF&=CeQd*ML0aytr%M_VGz?aIvc zN=eiw`Y~GbKx&r^x?wX8*!H6jTC23aE7eQ`n#$Eqs;Xr?+K#n%2ei!v1Bw}s*bit5 zPDdDqxLuBB4$D)Y;7-sPIssbJ)rrht>?C=7au1L^R>zgR zjpgfe!c%|1Gdb`8jX5}O#>v+hC%7L7)9nj9;)zs#^2z)(AMHf?VgS?OUAPP%&}jTF z55U2t$Qp$jWO#`jCT}WzB*h&F{Bl#e?Brni-oVMaXQZ0(hSm`JZ3ULbYo>?8rfqId z5X@B*h6i|sPV(d>p4uYM$~QBA7a1N2%FJsK!0_1Y^}*v_k}N(f!FYJ2B$rVJaHpRE zV{Z#1$4-;%nTJtIB7JaVXpJF4!zgIU|vl}TQZoo7PHO;m-|bageRF2Ii2}5y;?4VeWa+v3n#~DWc;&wyz_A(nNRc- z4&eD-ItNbryOjA{P8Tdj_eXFi0-I9MZqJrP4MM|x+l~R?L))xGo3fdrD)dSMKtAT- z&;6-PbPf*KRa9sy(3i#1=eX_W6GH*=aY72+nTuD^WxxD&@vFu@isEHBJppStp-#v| z+mvW%0#t4LQ<_;^5K3rX63s*hB84vs$wdCj)(zBeKN|Q?d1~yeL%I)??0Kc;ZC!a7 zzgpnK0?1VEr%c*?+=jtaTGDwM-7A-W&D6-BUdHj`?hmvf*mx3w3ScEojV~#v#!wBL zrG|sVY`zz6^kSqK?NZ>l0Q|GMki1?^Cv8KAP!?rmyEer>R=RE@#i{>9-KI3RXZ? zK+CnE_9XNclKy}W`((zA%kZVEXk<-JIFTO%j%gDr1fv_kBpyrXK{m|S;+GoqLtwUN zmgzMNThy3D1-0L@N>bV>1z%~z_m8c*8r@W(3|SC(?I8Z|9nzqv-U_FqMU9 zFW9zcV%LQ|W-d!S&e&-7+JdBxErmqa^4p^E zcpai2CbXA?WYma3x!l}_ljE6H8%^t6>8s(4Vl0ji5Zw3cHFr}uM+s9F_#VtwCve-t zbyF4HpqCVwFs_1pn2mylilCSLHI;+f2#l?E7aANVytsdUH|2$ogT;IB-Bz5TWi2C9 zKkAG*QpNnd7`+roPU~4(B>4TI2$O@*=afk=ai|^Bf0Z`{!8z|+Xcx3w4Qv+|1GqPu z*K*Xbkty8K+Ohfv^ah#xqVEqx>K*u#k)Y^8H%Y%ety;}XpSAnod+E?}=*uEgCAO9z zO)|`ydKiT)OD>wOK!b+>*k#gqsi1k59X9MXu*;T-hIChIk4A$eY5Y6wy}2&$7oxet zm{9>J!m}6HWnU6{(4T-^I#@82YlG}Z+XZ7LuM3PY91X_zyirg_DT?EwtL_rr8d?Adn=RQZ)Nh?m1$6BCtb}GCBmtTrC2ioHD6`_%|i&(@&l;H*!owt2LJsPC?CLTKLEB zhJp8<5~av;QTWl3Y0?aOZ997*5?C&umXutSQhT>POP$$qSiT#$RFC`e@ywA&v_s;d zp9?BP8)6VU1cvs^biDBi7(JpYjP9`*#$awF28hdpScJG}D2=ayML#n1+e&`0()I*|our>o^$B zi=%DPV1iTx)4#_6?`7|Bm{&S?G}Hq%g>2~^rBg!d))&_FN0k(ZRM9! zj2Z(Sa34jLyuFWm{VwB28Z@mO5N(na?m;EDhGpXd7T5+zCP)S5tP-tHLT&4?DTA>O z5WLYyzwjvhA&Z_%gwaWQ$mM}-r`!?;wRF#;?62~zpMd-J_++**6X?y#Ja{E-h!X_! zDJ^43eu#ulhDanY_`Ag}1mHad0p~4eX zbX$n#3@qTWk%RFDH9G3AeQ7zpnWdI%e(ZQ9D-gB8`9Sn*657h><}8p#u%96Ledw$0 zCjglj1t=IjMqh*z6wIyx_%|;t$^{h6fsuwQk!%!g`JNjUh~jl9{Q>4RYj`V~k6>>t zwm-pcHo+R9u|vh3$wfi2{Jrw`8I2%(q)E^KD`utp5)K`QjY*p=F5!nI zlao4#8uqJli;X$DPRg_^g>C498k&Bd&f8Nm5pB+;qZJ!B8PLlzw%K!u2TC_es)W0# zZ%TgkfWk`J=+*KK_F$MZv!PLKSGX11x#v7%Q`ljvXiJcYktyM}jyIlFYzU5ANJUdm z7@OB=*D`5Mu56_CffuU6l-k|lv$D)l0lFVO+cuzcFQai===BF-8Wj8l;K)oTMJA&T zC^84=Y)`{Io`fRfiN83+xf-c4TgPr~W}fgy?+uX#?KnXQGI*%6?J43TCB%Z3#)2A} z5=D(Qc}{|n4iIFP`B14`^(Y|7T;d*GY?ir-^cYX`qJuz>F}-10bzCY*)tXKwWzU=qdQD^)CqZefO;}|?M4R7}p zhAb#ihi^7D5Uk7*4@NN|aY5!unw}VvGN=5XeUh;)#s|>g@-}rEQ;*Am? z%}?|kPlU%YXJ?|Faypb}$NQqRY_LlJhkfo4{hbd}EpM5dnj+j&nbFoMseL~bM`@^m z>}5aIRkA`kIH~n8J5VVdyW^0PEK}1=SEbN(0V@mfo>V%=hn|&_c9?)=>X7-c3$F0Y zJr$Bq4fy@x#Ay#FW?~n#RL6{^4M$zjJq!6pd4h{(#{2+kNYX%rK4;uIy=Q;U_(jt% zRiFT}@7l}+N612QtI<8jkhPFe^W1oU{)Z=*xeb7Yub@cj&bDcQGyMix)%>P4Ij!<@ z!bOzHpn?_XI_B4V<<&_n#+7TV9v+}ucI2R4D6>u{ABB`l3$A%x20~#!hp&$3z z^Fr$s&BJU_B)2h=Gv`?xYafZdj4}hb4`bP!fiR+}M(cL6`3%g_R5_$7`{WamX#ar| zS`?E5$B^cvx*Oit$zT6+62NpPXP7v2nhc{uo1|i2$CUGygG0|K`kEm5gh1VI?!KACRv_Q8%&BQ8Nc-vbK~ysMao(GfRRIxIUN@qWh$T zW({bIG7BdOD&X*Z>nGh~-0#Bv>YFJEgk^L|pqoDKD64G!7F8U~Mjd*ukm5^iYr*1bw`U#gePVy%NR0%7qJ z{mP<})_508}h@OjuA8IpM!2L(}cIe%GO zt9G5*_>9|W0m)R;=7t*%xu~wDns2PCca06%p0AmWc2A&pP1M<>_6#$oj{L?Hz9 zo-#1>TeQM~lsM^vi)OE(6`Z5gAzLW=WzLTHK5YgHJAUO0`?j3@r~e|U;9AY$mop!hX!a)U z1h-ymKW-a?U>(1fKCa@uW}|2y{L6CbypD<4E;&0YEnZFe9mjcJ|J+Hg=hCT@x)+bB zue2RRdxL=1V|$A~i;@;q(^Dr2!AJEn&_gv<=LqSml8|ib8TK_Tb1@|NYxLDSC{lywHqeLs@h>UN8@?JvEJY{RQ`*>I<8JB! zH`QJlxEP}C!??)$Ywl>FQu;i4lEr2fRT{jI3WUQdTw9{yk_Xno+Q4J|51xNeW1W;==wrFJKl8}~|dt@4jXs!hn1(Rv-(2Bp&!Y~T0T^=Bj&y9;;$ z&NzVHub{7t;6|!vT}A7>HGZa{>R-;F4i#GKjqZO`qd>mF$mMY2^+I)PMr>#7Z`wdL ztkC9tRr!!{4AyP8Uyr^+4cty?P*0^4a+t}xATv7GOWa2GyZg06Vur$<_D zFj9Q%kmfVVSbE6->KRT-{Om=@QToO0WNst{QKObv>HJW*yCxcy zZ$^Ke%Y*lcy8R8Nd^R=*_(@R+o3WFhv<5u5u-jA*Y@&VDnvBT5;U!+^y&&q9b}ejI z=!nBlq@zy@F;wwa5@EK58V7d;KmO}F-9ah3UMh)XuARqY)X4W7Jthcz?7S)A5|zMD z`U*`>A^fD2N?jZU9p?^z(*@Ud&+xU>Mave(Z6;V>cb9WsM{s;D=9MP~Nq=T9ALXSde|Cv!J9wfePcR1d@J<^KIW6xwqUIb zdYN9mWrrtq(^N`v@9ynfl3lh~`nSp}SGO$5mej1gvieaxeE@%tER{0l-pgbq;Af^- zs;=FjE>e$Wjo05Fc}h3qQp-b(n~eL=he|?Il`zgspD1adKY1r~pM1Yz_Y*Q_?|7RxZ<(d8GYB zfN^hxK@vi@0^ngx0Biy$&ZE)VkkkW`CgV?@&0o0*x$Q4ko|e>VeUZ@shs)=Ge06x? zGMxztS1;iYhRU%k6J|0N1^{d6dkSwko%20T^XZg{tfd8S zqReReJ|Ap-l?6AzX9cZcvm14>z9~c3N_pi2~2xJO|QA36-Z)bnb%O0o;4`AvjOaA*k+P3{KmW+oA4KVG*KH? zz{&jiKC5Tocf5c!_#yg9k8%@XfR>hxRWfiS0w$lEmYRU)7K4ShX^8L%RHW1Y zF&`!yhf;};YxCvC?Jj9+-Po1BTI-;W0KCXc=jVo8eb9u6S%NMiR!Lm$f%ESWzrhiH zzCFw)a8mC*!UcZ&Qf^Xj!^DP1;cvjD1o?%G^>gu)V2K395Gacw%3zF)(nso}ArS0G z_YP!;;?~oEUVn?;z2za!;3;1cZjImgv3^JlH{Q)nBBvy-at}9&LM4+(;eQvEY=j(Q zBR}rWe{=ZjtU!GK_0q~9RZ=ny1_X&M{S*-i}Pg|GceD-p@^B)pK$8l!c8v&2b$dylH|C92X#mFZCMPncFlGP?Hd>rc+;Dg z1oTxehVcp&{=Aivm;ml3$wBFb)yi!L$PtWgQk)_7xywIt38H{zoW zwwPE;oZc31i%PKB5=snlvGFkmV|1Lso?wi!=wtP^61zPvF3uirv&WZM?ZweXt5shd zT^t*$H(29iqvK*@^a(L>`gluRd_ue>rlc5Nv_;3n$HvClN^Ev}v|Vqt1uUYXEbvA= z1ZYW!GsMQ&EwNE?R$EL=oY9_8Y}Lm_TVwQAgWeKb3?IhDmsnz=6B4YJ7;CK69u=1m z4o%C z#nIN{7(3MHzzAqY5>kyM(289oBj`oGf$o94#20EA$ws%XZ0uWw#azAMLOpt)7AIxKb@|w#@#EbS3>yT2SQZc85bb?d)E)i!oGL^*{I@sl!vG=dfKE59YB9a z(LYf9Mvi|+b6a+LbVWzw-i6nFx8Im~U$?+C(CF>tyr;7Q{v_#BJ(ustp*Q2QK?S9>;f_GTkuyO+fg@*2NR6WbJi}MOK`v`VNGTk& zA+iwufS4dBV2{wtAa}c{a83>d^;st)$~23_y}?-4Z|=L|TDU zlAa8J$e_<9Z}w!)?PXR{592BaERZ_0ia3FVf+18#aPLQ$XSMY+f%iyq*eNgYADl2W zlHyj!$*v3W z0sD`-0_>q+KuOsNLIj=*-l(x2w`3} zh>7gY4S_vyU>!LbDnyzt+=uf<7iIF6MBq6O3P5Cub`@M#YbG@a%3WkHc4s=Ig&@tq z2|akzBXw}Lh%~Fag*5xKYB%TsQjLhaJy8eTs_)>+j8r7JK{BEjsO?rE)e^>G-_Cn| zdA|zoHd9a3a#!}a)7w6B;dj2{%AaolMb}SYTXwtO7Mh~V6cFu0F%;-PzNGk5=Un+k z=UjU_FK$$KH^z>-)p_;4+n?;W_5ac z`3X|IVq3aY93a$Y*2D1* z@{-deCYqcYO0B)?GUxT%~Cbf4sDZAVu1YxO?bbUf?NFzq3Cq0 zobH5mB|z*Cx;4G17DQd$TO~wAb6|A_N4X}8I*+8g~fqp1U(Oo2T025tIDgY z=T!9(+yju>2$Gl|!l_Ibd5_ zY6G@=&*fmiVQ+-VvWoi3Dv`T3mjl4HjlllEGMs7WB0{(-7_`BSDwtM-D;SH+u7gW( ze*=G4*TA28=ihem@A*^VfiuAAV(9j+aBmL=5SSIV>9^l=$~C>NsYav?!uIQ8VCae> z)K}It^*jLB2k?N&{YrZsOg+|FK!~{<0W1;g1unR}iD{AX-27g`+%5&@u#xX?lcMY1 zza<69r1=pbOjpXdJ~O0!qwV*VJEVZYqcNs$PW0UFl@WbJ=&`-}Mt$3(KQT&izPE35 zJ-7eFsGQTuedD@y|4)ppd&0VJbiJS45h0n-o-CHsRPtTb|Gh5vDMBZKvrmQXxqU~B z|60rG6I<7$df!C$dhqAQ*n3vIZ?tzl{d40cs{(!F?7n+PTqPCNmVR4euLu9AEjmYT zz1JQ3i<*p7?tJGCLH^Am?q1^P8+-33cf=`HWT*1|f3C^B%Tiqb=tqKH>o+~G+#$-p znSAFuOW&w(-T!mrBa1kFW9z&=a8GJJQv#Gov!L)LM{7-l?}0G}ewy797RVxuwNbIdD&y({tBB91wnOk8`&u=F26hzlLtd(hXMHArL^jN($eNJsg za%QEaAiuUKEup@!Kwm-LvsUHTT9YB1Dl^Chal;apeUe#xmQj^oZz;%bC`!+B5Lw{e zy5i9lCAQHObHs3yGaCwlMO+x2<9uF_A5~b8TWU*BC24~E$geLnB$PwitHiWdVG|2C?=1I}HvBe-GV zNpWR9dDmf0&oAkgp{TN=!kV62(v#Q8nbifJgl)+;3SJ=`aOpv*!>_$h`W{mDt*2$S=u#Q}Qw?nMI{ne*h%cSh60)w;OO!^bsfi1lv z%G#w1`l(YDv3T9`+=(5e^kf%eXqZ|_Mgye#g%FGmL{zP7Tl2Ks($cN_RK+iel)QA13w=Z?tdTCL%(U~=cRrygxlSJDxj?)H}b&lIx;LrE{!MN5BRpbwj8n@eL*4 zi|KX7mn>%8t@z9&spcl}n@U^BonZ*$#P17-HFTACBZ*14Gk!5VvCo3?fh0koh2&r7 z&rEYh_xD}$i%-P-alRpD@SVC)e3UwI=&)f4F?W1_XMGt>-tDm`a?G{l{p#^?x78Q1 zyn59aGs%k4xiz-*#tQO%1$jTd4C4Fe>PIh|kbEvQlJAH0e4pHZ`I1P@5NCd!_)$s< zd_&?BL~(@VvaajYKlr|@eLL-AsPA`tpZ0(Io-{zS)1D`>X5R6A#+~1j2G>=q$zK9d z1?Jvk6u3@F1)+&P=xX1|@m<&5`k|IQ>Q&xitGDz&b|bGs{h33WCX{P;CF;r_2n5=# zvwqDX3QZJFtkm$Q`49971SJSCE`;AXM2=haUr0=p1cbos@2q-zU1V`hO{6&C5z;lG a5#pTcfX%e9i}_#rPvRRXk&G8|_5TMnBo6}s literal 51718 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%0Ahe>c;DS0lw;`0i>(ecEuvsk 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 F{lDz(#^wM3 diff --git a/docs/examples_notebooks/inputs/operation dulce/embeddings.community_full_content.parquet b/docs/examples_notebooks/inputs/operation dulce/embeddings.community_full_content.parquet new file mode 100644 index 0000000000000000000000000000000000000000..d9dd43ce6fcf1de96861435c3ae39e63dba6d97f GIT binary patch literal 220010 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 COug0s literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/entities.parquet b/docs/examples_notebooks/inputs/operation dulce/entities.parquet index 4378317c7adc611f1c1d72ff8278f9b187d9c9bd..466f5058aed4575d328db4cb0ffcc72da5aa3c5d 100644 GIT binary patch literal 19483 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 literal 12361 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 NqprU;{vWUW{{yn;(53(Y diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_indices/dd5917d9-d48d-4af3-bc2e-43a53b2fdbe6/auxiliary.idx b/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_indices/dd5917d9-d48d-4af3-bc2e-43a53b2fdbe6/auxiliary.idx new file mode 100644 index 0000000000000000000000000000000000000000..57eee5fba5a54a17161bb005a3f859127b08a500 GIT binary patch literal 12931 zcmeIw-AV#M6bJB~EzAxTbtE!_l7+s!Ftw<#B13|p=mGj*8{AzPSa(Cm(jxF(dWLR# zxw2gQpo_?>F8&9GnKR5e2Yw6-BPGPqz+pr&XoG$|b_hTK0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##{;vQ%30mQp zT@P=SlYZ%k$i$i|(3=}Mu`SL<9M_XgU(+rRd%o03@%3fOQ!UrA8|u!rebvxK&kv<8 zuIIK2->NecH0sNs;uh77$0DCe(74lm|8`~T_O;8VU&t)cWJ8B_S#|B2tED5gWIng< zFDysZF0A*q57yUG)vs2O9TIK^lqV!}gFx5y#dXVVwHsG@NBhwzo!oIvDL&Azj*>FJIC)#m+-iL%D{512$hEy`p&BIJ zz8@v`qiVAsXT9XiaulaF-kV=~l^|Ayn%q!3#C?5F2 zbM`#EY>j&<&A6c+X+m@3`z0aBQ&U z+IVSOv z{<;evo}KNc@ano4rhM>mzLS!!$qDA!Rq7Ff!V}>bAW8 SM;W4ZW0#MZSh1BBU#2heUtRwI literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_transactions/1-ec798d7b-a8bf-4985-a5d0-784434802168.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_transactions/1-ec798d7b-a8bf-4985-a5d0-784434802168.txn new file mode 100644 index 0000000000000000000000000000000000000000..f4850f70d7a451c23a018e83a55573aae64446fc GIT binary patch literal 146 zcmd;J6jDh|Hn+4$F;CJ>v`9+RHLhd@u&^+gyXBAFmDo#SRYS literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_transactions/3-c16be721-5d7e-46a0-98c2-34d5d9c29383.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_transactions/3-c16be721-5d7e-46a0-98c2-34d5d9c29383.txn new file mode 100644 index 0000000000000000000000000000000000000000..add345bded9798cd7d55376a627576a6a8caaa8a GIT binary patch literal 107 zcmWN=F%H5o3;;kV5}=G3nL02b8P$p1*bIoTIB_~59>p*EiM|O=y7M7k8_u))U0c#D`FnhYXMBX43ArjSfQSu<9ibW<M literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/1.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/1.manifest new file mode 100644 index 0000000000000000000000000000000000000000..f9e39ec20b84f8e4edd1a1a3864cc697faa84cfd GIT binary patch literal 358 zcmZvU%}T>S0EDvXps`cBc328G?fXL zoTMo>yb=n!4j3*ya>=V4fdR<+z2}$5cW>wE?eha%^sbyDSke<3a}iTS6iX3}MT8iU z1ToEGT`;1l9%DPJ?za8S-(Qd5IK<(+zX~=YOcvnK-}~t??`)k5qj=Tb=2tOmh+uBM3rZ#@WqgcM?$)ZInYS4!N^gW_Ml*a6<7&{cOFjZJBh#flmcX+_t%z)~hvdr=vY>YT&5 z+mqL`>&ovAiYBm?%F_RjfMq*3%{1F!kX!3Nq)J3f8#IgU-sEBU)mu!`wvu6bts&Ik>ufVxaj3ID_)+L{DLa6ZXtZ}V(K3xN)=Ffp9oo=RHAAy0GHg4Z6npsr c97iMHIMd9i=C07#a@ltG6Ym1SulbdQH={$2ssI20 literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/3.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/3.manifest new file mode 100644 index 0000000000000000000000000000000000000000..408240bf4d2a52417bd0e4839c227aa215223cf7 GIT binary patch literal 294 zcmWe)WMJS@5n{?rQTPu7j9P5PB}JKe=?07zOi}D9scDI&IVD_nLTqKJ$tC$k5{$@d zrP4AhQd8oKGpkbLb25udtkQDw6HBa&4a|*z`WfN+C77+aIo55OcA8D#$NlEq0FDTT zBrPLda|;U#b4x=*-4t_6BVCh}WJ}#7Ba0N>G$RXBiLbFR`>FKR!7pH8HQWKrcThCABENBqK3Th|SO> kC9$%&iBXYD8jH%zypq(Svcw!ACL;p|IACP(arAQr05Az(F#rGn literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/4.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/community_full_content.lance/_versions/4.manifest new file mode 100644 index 0000000000000000000000000000000000000000..0769fe9c6f3338b36b6bd9530e22008d9b7185cd GIT binary patch literal 360 zcmZvU%}T>S0EDwq)3ORmPNgDL5QM@m`;#<32T{C=c<>-z!e)1)ktLC2TWU|zgOA`d zc=F)QXApcPElP_A2j(&}-&_L6fd{@@s=?P%VCc2BDXSX-V)weEbRovZ!Xw|CXld)F z2mWsRMLE?fYs;C=OxfDBFtxBLClOolV8#2#UErs1DB?gRNmw9CsYF4jD9S}B5NA1$ zf+&v#jj<7x)V}M0{=x&7ynl8Eu(zIWc3Do11Z{5~^b$jpNF*kZq*C>g7xe{v z2hm`+Rq!D8dg zw8qkRO7FuETZJTz{qVLT_T}}I<9c>4NU6?+2e+F>u_3;Whh4YqhTX`?rzGW86!h-HQH)YrgH2!MnL58y`LO;))xD`z@{_FcOww$?(S5mySuv=X0NHcySux)e)r1z{DJRW zR}Y0GGqd+za?7H_9pPbN5zcUjD>5Q1$m_!=BEp=(VZk0>kR!|&7VdL+ zBfMd*sE8nUs3#;cJSa3WDk{_w?1*qjMFqP&Vcw`Hmoqrr>vKkihTwX^VWGkJHaHYl z_Xb6J@Eo4dsEFVQpDWabj|aQmQBI#L9Jg_Xx$rnqj^OYJUqqzW9fSw=2D_u&A+9J_ zq{HXNg9mwoeZg2^q}vth@OndW|KQM&NZi%q@r8#+gh%3S5g|^eE8OFa^aVwQI-Sm7 zXGlnBR8UxmGu-Qp42p6FIm5yuqZ}dFn4n-+IR1{yhlNHu9H9|3bU>x&5Tgh#sE z?qCnz5RUDN40A+;hI>37yv-FB5$OnuaJqfrE}Tq|Daii!+zxPrpMBRs)T z-ryidWJI_(JS5ER3=0c&1$*2<-iVM;pDPMqT%kU1P*6y4gv04^1>ul=zEHO_C@eDA z>2(EpykWuEafjE9MTGl;B7%b*E@!yM=W>QddVQgeATRFii||Ha55j`5cb@PNkH--e z66AD5Mj;-8gMxxXgTh?ipfE?IC(7$}`y3%5Arav?*YF5$WQZ>cdy9JohlGSjhD3!# z1-Y;~cSNWo+~*KbC^$IS6&W6hSoI=0f+L+_ z?ocOI;SCEz=m$r5gPlG3*3U2bov≪8iV6z$`JCRc5S)-F$`|Ag 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Μ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 N;^*WiMhqz*_AkQq?ymp< literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/0-2fed1d8b-daac-41b0-a93a-e115cda75be3.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/0-2fed1d8b-daac-41b0-a93a-e115cda75be3.txn deleted file mode 100644 index 4ae06f643c..0000000000 --- a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/0-2fed1d8b-daac-41b0-a93a-e115cda75be3.txn +++ /dev/null @@ -1,2 +0,0 @@ -$2fed1d8b-daac-41b0-a93a-e115cda75be3$id *string08Zdefault(text *string08Zdefault>vector *fixed_size_list:float:153608Zdefault. -attributes *string08Zdefault \ No newline at end of file diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/1-61dbb7c2-aec3-4796-b223-941fc7cc93cc.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/1-61dbb7c2-aec3-4796-b223-941fc7cc93cc.txn deleted file mode 100644 index 7af4506c1fd12300ff5ecae286e6cf89eb54a614..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmW;Cu?~Vj3;<98V+`YsP7F>YHT14&JqN?Dw7oJBKFTjOy1eOKyL4x4X5tw%yZ}jM zu$&82!p+6K7WdC(9pC9S&KP33Rf1>>1F0^*9PnfnY=msik6jOsbUtvector *fixed_size_list:float:153608Zdefault. -attributes *string08Zdefault \ No newline at end of file diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/3-0d2dc9a1-094f-4220-83c7-6ad6f26fac2b.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_transactions/3-0d2dc9a1-094f-4220-83c7-6ad6f26fac2b.txn deleted file mode 100644 index 63c1b2f07dbc08b95e94eb61401da9568ba2e133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmW;6F%H5o3;;lyB7{0-?9_p&l96LaCh36s71xO;#G`mAQg68X7$4ZES=9tsvqL6A zC~PkfZQ>-ZM#t~APw%)*YwE2!V*=}pkVOj=!vm_33M!jtetz_8Jzg(E80YgPEa4Al Ca~IVB diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/1.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/1.manifest deleted file mode 100644 index 321504ba88dea88f09114e4bbebcbfccb0c73cd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmb1UWMJS@5n{?rQTPu7j9P5PB}JKe=?07zOi}D9scDI&IVD^gLM$bz6(tgk1XbDz zv6ZDJm*f{oFd?gzO3SQBO^GkgtV)f~$t*6hO3TSlEU_{)H8um<#E7s-PlzkA1n7dK z(vs9-31(z7u(?cv(Tay-*Y`R5*aU9O+c=XkNy|XjC@nR`FvTKCHzhGKS=Yoc$v`*J z(l}8!)zHv1IVI8DG%3|sucRU`i=T@%CowNMRfx?%&&WW}po#}3z-**vzyJq~3_gy2 F&H!)sYr+5k diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/2.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/2.manifest deleted file mode 100644 index 6cf8a61ee37bf2c513233ef056cdb1a2257a6c63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 zcmaiuO-jQ+0EIJ?8YL8zS%t2$a3O&iW+ri_$)X@`#RKS~%wHrDQfQ_UdIAs8lPGuz z593m+Qtd+UE#Bhs_};q(K@guJ*x2-aCy+(GUpCzx1ygu)XkD#Vt&h*p$h*NO;NRv9 zMGwyS#WI2W-AUaH&d&R0?dEOM`>Jji%2(_>7uzN9yF^f|{PuxfdDkc5KI5-vXojjd zV@_&r%K|$~1um4LSaa_1R4B=8!Gtz~w5l@>jRF9}$(N@v4HH<6kDlH(FVV^4>+=Ta zjA6m7*3xjSoXK$^OYup|aapk1NMp*}7~+TS{y0APhDMZdO6YpL3qnq4@FNghU0h#& E01^dwYXATM diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/3.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/3.manifest deleted file mode 100644 index 022bec343992b6bbe2a0f9a6d824c793e37eccaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmb1QWMJS@5n{?rQTPu7j9P5PB}JKe=?07zOi}D9scDI&IVD^gLM$bz6(tgk1XbDz zv6ZDJm*f{oFd?gzO3SQBO^GkgtV)f~$t*6hO3TSlEU_{)H8um<#E7s-PlzkA1n7dK z(vs9-31(z7u(?cv*@~NE*Z(>D*aQ~*n;4j+Wu$9nU|?uuW@)6G2sB;S#3Id7*CNd% zRX5qh+%n0;BsnR~I8CplA}@=di!~=PFF93+%|Oq{K+m9x2PVL5q-VeY2aF6pj(*Mn DlYeS1 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/4.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/_versions/4.manifest deleted file mode 100644 index ce22c6edb5041eb612c9b4879b90ed9652bdab8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366 zcmaiuO-jQ+9K|z}7$pkItU^~^xRAhve`eyCWKj^e;sLTLllhQHNTHcZ=owsi08i3| z7xECbDAg_m-{LJEKi+#a^1SGh;8st!d!Zy8+_LQ-0TsAD*2c6ILqLq;Bk=&ZDF6&Ja=tDXh=-fzML#euTXH+lRYP Dd$f1u diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/data/1e7b2d94-ed06-4aa0-b22e-86a71d416bc6.lance b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/data/1e7b2d94-ed06-4aa0-b22e-86a71d416bc6.lance deleted file mode 100644 index 92d80e6d5232896d935dc9e6650ececba3a3e58d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38577 zcmce81yohryRTv+Vs~M;Vo+;-%kIQFb`TpuDG3!DyIZiuZtP&sZ`s{qcVKrP+xMG$ zgW}P1|M%Ya#yev$kj>g_&H2SIzPULLDXjn1O#I$G@q5Gn=6~Lf9!^eGs(8A(c~-6F z<>lj9wThRstE0EKtB+?DFGpt|Pm{^Vu}T$hHy6ihCO0p)YE`TFIC}edJ9@f#IQjVa zI97JSg|04@J*rf5_4f9x>Rj2Ws<)e?vzv#TlegP{T1I##>w=HuO8j2j`u#t>FX{Ki z99jgMLOjC!f&w*%y5as_CI^o|@5F!A_6RjO)aw`QA7s74*0znW$-yfqARs)@FD$|# z#MCFqzmF-@!6PIn9Pj$)t;#!iIE4E32=w#u^YRD`a|rMY4aI{TaIGmM%%hhn(7`jp zAq@9)_XzO_3O{tiJt4t;%t0O!9&Jlet2~HF)qMx{iprrg&w6!hvr*wu|p5TS;hakL(PqMZBXR_1^ z)l!l!v_uf=MznqLs~=e}kF*Den6Nv`8vm~|T+u-V>&Grswyj0=GwmuCzb77{^9w_Q z5fGG@s^Cx+SO?$m01s83<#8)-%Wo1>^B+T*7#r(~RBlTlBp#u?RHy?z`lt%DECo*v z5A+H`eI#Wm)Z`Un!eSD0^0OMPwI1pfgos(f`(vZH_s`xyc01Me2=mY!>LnF!X{R#f z9a@?EtvmDe3l4QCUDdI?Lp9ejU9748S<<*yV%P$Z7HiIa6qT**&kL<(*b5C3U<&Xw zg(NN5Qpkz7Kv)BRYvqa#4N(ND_Wiv4f-P%Omw5(-`Tn{sO9!bsvbKfw%HPBCqs~K7 z@|GkfRe4`O)SD{0WJqJpNXRe2@HB<>H318fZB8{W7KCkC_G8^5nmRPx%h$mp^ncd( zKH(vjTbTlaeLX_``kO2ZP3n%2Ab-<8;{1CCD_8k*3adDmcc@woUoQA^OG;<5qQP1{ z90DRj!%$&C;rIa?vz8b@$-zI!TJE;C$=-q>{x{wN%uyw4&5g-B34Sf%LXtcbNQPRY zt$+-5WeW7`5r8aup##Fgfqx#}-l*iDqy#0Qky>JKP?$mmpiGEgXfG@%G&IP|53ud+ zpt5Rt%P&3lhZ<3jRm-w2u*k>s6~xX7QxXiWl2 zw66)&i0`U_e?x|UKtTClGVza=N4qD>gnDOECK7?eQWU>s#qIa3RIQfOP1a0USRIK7 zH1+kdNEDPLqzAev&=eY)ln2XI|D!YjQ+$K^s?_}X&i^q@Dx4|`$uZ5^B-VwiApgvz z<!#(_e=opI#`S%Q}-z4h?m4*LG8CxXgACqa( z=IZUqp7l$2sMozsRviiJlK7+mzc7o^O2j7%fBuF~m0f;MgGId+`!D>CdcZ$J`=5N5 zTI0VuDCKD!Ovr)Bp$BYQutm`(F|w(j$t&C9uaVniT44cmCSOrhL5s#RC(pJkW6^K zK#RhH!B8>?a?3Ns&*Y;pHzWvN3=$;RA9t~41b6g=O0aAVDE3de2WR2YLoLDj)IjfWuOz32r~c6Pp;m$ZuQ^eysgjm-d!?F^`tRT0 zg!TUZCaVZdz7=KA5?c>JQ;z8WBFngO^4hUJCpah+Rf5|8f0gdOK_R`6&>kl258^!t zsxwq+%>WaGXSlzTz$({)KO>)*Z#7M@_TX~un7ou@w3zOn?h%Rp5sIHWBoVIv z(@5eMjSmd*g4Xg0S4zNwHrAZ|6H`#Ny~D8@>obzpmmHQtd-?f;A%1Ci6hL{0B#WlX z!_pxknEfc}k!V?dREUx}6_bQbt6%J7>7=~0QqC?B*J~#sPAede6@`C!32YZ)nSUws zm83nA?AZ?y@~<7Ou+F3`)t^!G2MVGgy!}GG!b7c_x4<6u`FqJH0;MUik6%boU~-1~ z6+4k#Z_YW?{ZTARo-O zpz{=ln!JDLg)j?(T4sXD<|N739m&AJDHtO{HRQ46KNPd9FcZdqiIak)a!IT_SlHiM zvGO10Db*?`He)ib0_rF0258owG-j2oKX@)V2>cg0_5elnF=6A_LDKXDg_^kXUvTZ0 z2Kl*{hRBz7J9`Ww$5#od7!bmIVGO5|BWhC~4<`UZsU1FX1 z{-Qe*%l`)gB!b~DBU?+zD<%^BuR&9BN}9c4UXge=^=Jow6GEY0QOuhtqEtiwFbPR8 z;GNVy0Og;NNX+U#T34m<|F@>Hj+n5KQojifcOg_TW5Wiib6$Nx>yk|u)}ig&sl@2DnHyB+5G1u z$15l_03)F!o37Rs3Wn?! zylAq^e|EQzUk{}|5`*_&v^EwC-=ad;Bis*?HgQP*Pd@q;%lrbv!m*D;Bnt}(4-HFd zqhI*Mx}s_r^X`>(xn%v{coK2sx8q6!w#R5$$5C>B!n3J(cUotZShu#A?} zj+58^?{xXQa&=4^_57?yJF2$P6q_G#Sh8sqP zaDMm$p4A)@U}zDmSV5qdI@+|Ls|sAu zZ(aO*LstDgpFbu-|D=>s4xxAeJSom?5iuMb`gvkXfQRGA;UDy4&2QrMNL;UfblFd0 z$CiS9BSL}HmiQnb)+V&N$)tt@ZmE-4b=%}LsvM#Ug@q9Qd={tz@}o_Z?X^C^5=N^X z2vEnZDvco~AOFNovswg{l1Z6yf1DaxpN}&i%ZxYhUnabY8v(xm1~=uC#Vs*|iKpO5 zZnCtafzb6RvC!XB_J`A>%2jXx2&ZD5FSJomp4^otqV-Q;wtAMIKPPr0cB;;TRf^To z^zTQ!|4Y8NATTm#mFp^B*eaf4krsGejiQsQ3baF_Q?vSqKM|63grnYxSpBkF-0-Js z_yrjit$6oQe2kMPlLzLI_&kA1d=HZcApM63wyY3A{O#Zhm;OrHsHG$s`g@|BfA1|E z{Us*JJ(-|!NYX0F@l6HIny3H2a_JZRSHVfnw7wonXZ@natazhPK*=dBoS9OhviGJ_DkEqtyx zF!56ozxLXX`2X2R;CQ`id50fDrBcYy^xrnG67rKpD>~FxC+&$c47II}fUU#53=vOPKH*$sS?27ABfBey_WQWrvKshYR#vJT~}AJYu>8lGB>yJe(+gd+G7@txOz#X zNk2~ecxnl!w`*a%ej0B+(LRHIertJSNa}88n~<9F+toheuNyh^(W~nk0e!tVaQ8B| z+s~$PmHh>c)kF3QuPG-)OpBhf>FPITuNhJFcddsUzHl9dU7ICW_N_(^aie6LctcJ) z=t4t}5swY%z;*0mH1G2VIo0+!s#s+{cX=I7x4K=F(Umr7uLHO9jd^=Tp!PweEHl{L ztanScdD)3a$7T|;Q5ktK+*N8a?C_SS&-SHpI<;&W7~Z!UdH&m!_w zND4i3@sFHy?`h4gV}jf4=U+wJ+4*T#7kk=knkO!NDq(c#w}iewi6XxZ8AQ*ro#mJp zx_0+n4A=hh-L+k@NoHIx!i!|nOSaCb?_1u~7#HD4MF!4|8}!9pzj|h&?Dgy=Z!Xe} z%iTUs`(M}_jh9#ClkR_u=GA=MhNLgeAI6oXshv|&saccwKx{{u!pASpzI1KQQZ26$ zmi4ua-k8hqZdXpwn$5!P(l?nVy)BD}3)K2({)h%~V*@VBMqQp_uVFmx$~;=KG?h_# z%U6+Q(-uB`#n0?sca#V|Tva=>r~&QuXia5`rsNb4Pw<)f->Ad7p@eI=_TamO98mlG zU%1GpZ5(svBn1sO3sa%7h*gyIeY8f5a}1;_wzYNp)g?LYuxsWFrxMJIFJGe?>-(|G z+-Md)nwT^(C!M&kls}{%M0HP9;|jfMaLPVoWr-;%$;YU8OJDNmxVHGL^iH{XgS3;Ho1=Jy_ieQvX_Nd`B14d8${;i*F~m; zhH+;KCorxvTw1k_o4coq@V0+sE|%6_)=JTc`+vwt^`fSUeu1;)$m02TeMo@1{l~ZOgDm*L3^P7~A zRjUUxYK~@jXBI8K+Zl^H?V+y;>E*7gWkiVsmucMR8EVfobJ;HWrvD^Hy~tI(PBwY6 zLLdg_lkR=x6!)_F=ZhQ7#Y7J=Xz*4V=oHGM{ASS3C`Vecr7+#8Vy9>BJ%SsRo-WWw z*vae+gl7xK(f#oat=3{ubKfZDctb*JTgX~ZmXaZf7d zdbfmM#bxx)?Fz37?Zs!;E#LyB(&}~7Uu5^ai^P$-OXCiIzOBW3U!&5wR%@lRdC2^C z?6`2)M4EQttU%pRpw>?t==274@rZg)o+^8;-L3X-iBshvODSWAzo_P}JiNO@J!;jk z34Mx6X_TDcBARSUqj&J$DX-Y><$bGX(zcLFa!S+N9MSVM&mVD!fEQfOYomClFOi#z z+|(*OTf!=CQ*x)5jf*!H`SPzvkNWA6lg_Bux#O}x${I0^U32#2$Z2zUUvXcy&9huQ zIo*w0e4ik)?aXML%)fwBRyZVce3vr*{%*ei@gAWMxpK;}RDW6{UewK2!~NVojJhqb zF4@Rqt3+?}yfIVg%>2Q0(<=seXv;V6rFKKz7z>WnG*F{5eU?0Ao2Ml2e{z7IoGWdV z%@-se?6(t3=Dp%W=8e2I!&Z7Y{1V$n?cw0Vo2lrY8PfUEFs-^%Nri3Zylq;t$At6- zV$A4qLY|DF$5{56>y0%yF}^cu!kpuC2qpAQWBA;jPpENmX=n>dpJf(ZvCk-0IH%TY z^e=4qd3_V;Il{B$$Cl~2n@ui#wo6U6bJ(J-YaUAnHZ740rYs6+=fOW3f2W{a_A z=ka|x&s3(P8EtfhBfxyK+IPg}X|$-@I9a`N7sW*~bAU8AEWkn@s!KJ#3LLA}Qx#&t!7xO<*d?$?bzO$sw2db(S<@$9Pe`rulPb*<-c)eM%`ew1rsqXA@Tu<6a?J7pz{!@B_kxo=vUeAu_6S-)7PqO#!SzoG zRbTFP(~3==(-kIh^J@1gchfqA9P@=w%VEBD!D25`_v!@EFAt z%(rBQwpkUw$pIlZqLo5$kj{33DOV}5n z25q})uU1^9pfn2ww18BcqA(7+L>{O%h7|tg`1~3e*^OGJo6Fms_R9K%7!eWp)lwZ75iS5dk{=Xq$eMdW?Hz8<|XN^uHJFB~P$ zJ#TK5u%9PKbTQ;tkEOgQ+jpum;Hm{z$GQ$>)H7dgA$W18TC{BCVeZ}_vvJYTSmp6* z3n^6pqvrH>#q5p4gX&u}-;NKLgdTWUKqH_BNaUNJU1$rh@xbjDWiIy#ii-`W!=C6X zdmWgj<2C50v7)(oI(eQ+xdWUimFAi>ai)Mq1dbJw1Gl%M<1vpT^U;4HOlv#XfbFdA0Bj2t&a=dZwXvjP0)7)T|sXuAE%C` z&T0`4dr@2W%LLuZemxFhU(tMi>so=j;=Au01m446J&KE#sp2h|a4L6O+VXUyrBA(% z1X=O~eGW~%j83%K&5gSFiz>Cty zp2cvQo`DXO?}HpZl;9tF;ZueSKAyv>R;RUjp`kaZ`L?5Ro4Ot~?^~VIyyYP&UZCMo z-Dug`ti}hs%=+~FC&ag_?}gtzPeM&`>Fc9KO?gUeUDHy|?H8;;4{*m)tpz-hG3r4j zaPvscyu6EexBZ=jww6j`Kb~BPa%RjfoyY$zH{FUA4qJ78^)kPOcTVOn#2vh=3+GEV zz>$eOc$}R9{l^(jd2!VYxpk~1PU-Cwm8bCE`a%3mh2wL-m>)I7B`joKw14w<)*mjKwjZILS4fb`qknW1$%&NyYS3aV?@>6=eSw# zGc+z@gQ_#~|2l=C)9C%Mc}f$=90zBMy$LQxjs6P>eIWDAZj2f!Of&A3l}b~=H$gvd zksf1qF}$oqY_W6*vvy^ZCbnbhr%eIU+hns6zuO*8RYzCh@ipy9_20AUZyElG*JtWa(A|39t`X+FrUJ^N$UyGQM-Gk=(9mLb zuqV~eVxof)kyMc8cfP4~pz?ZT9yNpB?n=i>Q=vYQ zj|Z|#zhd%YjfEU(7XYp+px=I$jiFNs^+}HopAmKoPRXY^JD63CgTJ)G!FBn4iXDV~ zh%XB=)A8(C2%3R`QG8|3cX_1dRkO-9{%w9XJxp(NVH7PXT3Bf=^nxMp28HUX@7L^? zbf(x^ZuZ8B;FAeHlxjE1C=oLb%_)fOsvGK_MoSlX^oQ)fr8$*ou+zdd5tS>F@-^+} z-xBLPj^x_)_CkM8Aj|_8+8p}qfSkE1JwYdEbNjs%@F}$Enu+i2aMI&_OYrE``{hD= zjW(B9Nzm(xhgpB>Wp3iPPp*8|LMk8gX__llOVgY;oV&>2AXzvplW1K0D64)|yep4Q zl+KfP)3t1;6$jH_ogEFth1Xwl;3ubV3Z+f9Z|p&MCyvw9~7j2yDw6k=! z+myE1a60djRqcb6M?pdoMPxR`m$g$bVH<6UJlRT%)L`Hd=a%Axs4rn9Hd+$ z?~!d(ExLRps}7!FXkAffUl;59oep3nUOEXI?Wz2O1 zbQqz|wX*qMh%I+RE%Sy}N7u{GZBOu*0&B#%*U{W2V|P+IBKG(Zv3Z4^1}{LTy64t6 z6wGJ*H8Y-|bzQT&-auYT^Uy|@$I_-!B;r3y@kbJb500Ife9WF`wN3{=|)Lx?A*I zg-2H`_~mx30q=Q`f@*v)3)h^F;X%qv;G1T*c$VT*%)NFf&CN&Z7ROwqFijYlPO5rx z-&;gr*23^Fbmvhc@g>h4x2&;GEE*pC2HXth@+A)v^t;NVR9s`U9V%2WQkfQ1af7R+ zUepZhXvSf@;K1Kf^$hAz9CB^ON)Nf_-OSC+*$r?T!87x;_B*hL{?wt|JhgufGZzE1 zBty+83RRk6nK|_+8LegpO4rDy<=Y#zQcsg@PrennKSReTA1c6uQfZ7i1Ko`2^Eb-a z=_>^8$C%A2%;VW{OIdljd)gcoa|!;_6-Q@vJT0MjXcd z+bt@?lMZf&4(@N6p+KkeiYkJ@Sqd*D`qMz4Q@;F_z{wL7Zptq2cXGoy?F42yuPFi=kXuikNbtxMJH3>ivQGvBo?daG zfL}%aV?=D@d#>PeBV8l2n(0W~lR8&j4ZYIB;t|^BPhq?Y8EWxVD*qo+e-+RLYUZSB zM8|we&6(7!Ml@c0Pbhp-d^b6rFAqC=RN)ctn%0BAl^!NlpDI3`^*%Fw?hqxQft0tE z&VMbCz%=Ex3G0@*(lxf=5@v7Uj+UZi>zU@=4ogIVMePao!o%m3rozGd#nkLIB=n#L zy`<(r=GK|Zn4xW<0kY`lHzo)*_e`7OgFx+D=F{L`%RCJ8VguNYx!W>2p7{{X+1g2A zh*bFQ<7GpN>k=yNqamZ}NO*W&R??d>JJK&2X0!5DU-Ed0=Gz+cjY2EvVTMt({M9&x zm1>4Wohy03Yd@pxsnQs0cZUef$juLGm$uXi@~u3$P@WDxLPve+!wXDgcy58YshTTN zfnqvlM&ATHIl(()#*~4+6ey=P4zSZ7XFA58JLEDD6M6rm37YXbDLjYAH=aft8hA%I zWi6rlNX!ab!&9erjgHzy3-=QclU2AMJ7A#Gk=#h6o~4j;bi zPmiv&=XYm!;vRuQURo~x+L~X~*fNaIXPrdvMMZ8tx)kL)yIP1G^(biLAzA)iZaMh$ zTl1dBo8_V>4R~svVpM9cGmp;aPCZU_;=lZ+ljwdzn7Ibcy0L=Y^EDBpU(6Mg3uYnD z%Uk)bqm*H9-f2^>_Mo9LXUU~eYq{%141XV)ff`-Uz-?15HQ%oLP7LZlK@{;`#OC1b zVnL7IEas2l7MnVe<}{mXPOnIwu_=ulshU!!Zf??R;yUR+=LF%txZhbyx3~{#Fs+Wb zK(m)LcQ3m}K0UaA$F*7z*L1=Ra%gDgw3*NH$fyXy`?NguKFO3Pmd4%6yGOfaI>Hx+ zUl-Hrw4)yRy=lbu6ZEd|A!@&&qA_~ObZY;_nS;Kz(3_@eN#Fby^LX<_d7k!?wzjSD z{PbX%HKq~Q)0@gCMZ(Ng(k+t?UpCT%0x9Llw`2G~%2@L*pDveoR z+jOd&D}*10_;Koi>t(~I7pP8LI4zbX%_Tb?l2ux-BlmjW<)z)TsMh+KoOj(L+VFV= zue)18%uJYJ4xbf6w<8^C+vy15-Y%^+?eCL3CSxkSrE?Y8HF`ALe7HpR%eK*saUndj z(tMuSY@>R=$XX_o-mF(mnWtWVw`#>EQ0l`j`jicuIoH{;^61~KsYm;TwDS3A`FPT4 zth=I^=WxNS_G|N@z3`vYOv)BsVybsJfn3W1_qJ2D<~0RshNIjDafiuQL+WPT9oVC4T+p--tXp7_i1zF-%IB6 z%Q8jiuA^Z4S35<6(?NpX1k2)wiqVOL+0>{_eYS}#uxrQDTYPfw0Z}GHD-J!phiiLf zqDNi@sPYp-B(%)T)ed|y+c?c&BkCK?%5aURuc>eN^zdg_EiKQ99mU)34CQ{dFU9qq z&eD`MwK1mMc-s1^8U4MaAWyyez>6f=29rVVD)87(TE${1WRwT^n_)Ngw6rreo%WMQ37Pb*Hg zSN1dR%g@1Fp{d?cc<3o^!mvr z8R*s2EV^+vj^gU2lDAIm;MPaZ^W$UVxoDkc^6ZW$+BclV#qR4swXYlzll*2e>J~T< zOHC)_!1I^#t9oNludij7*PXd*LS{4KN*mV~HX_s4F?$%z#q$n(sqDi+GB7^Bp5^Ho zZFjpY+R>r8siti&J$#k}H)bc9LW`s)?`tqQmghEsLq)~!eL48r09sWym~GacmM)|0 zji_iljxW)WAKW}Z-)3CkxT)g_(dSl=%g~ab1+r7oZ^HAkle`gMLL0p#JA3p#sJ*Q@ zmzQmeBS*VzD(2KMra2!hn3M9HH2BKkmt3OKblxe-@aPx$`BYgaZt)_QktKX4H$S^x zb{v|?xcS`9nEo)5I#)OGgwBK6Y1?`_y5^WrHM!pQoqV@)95;U8$7kP_M6Z7npIVg` z-~5UiO!Y}HJb)JhLM zUfuno%zV11%C$^ka^g&S1MV^)1~ol}4vidPMh}T7x38LW&r&?JOtic)^RbxY-d7xI z*oZH-U&Z-6ZYyjjV848oz8N1sR7Lyv*i|5J1fJmfuj)`$IZsS~m{NcL?X@}2k_<-6 zbviW#p@R|6`Flc!0qHGZ*%TCGphJY?53 zzhU}5P^dLvZDyrG&L2p_!Fjif&*t2sUjNbb^7<@Jd7`*wJ^dQ2;n0>NDQ#1G{mE(< z+5XEm^1nES^X0s3*>A3IT`9V(qjqZ1D{^0AFTjtghY7hdnvY(=J4bJ%CYRI0>0bn1wm`X z1!?28?<2=rY6e=x7}VcR)?X%NKigmerbyHYC$yYQ;0qqIXN8$-MyWdBN09FoLuXT?7r>!mrYw5DL%xmfKHLz6ibZxMvpq^7_FC zdHP0qs3xh6Hl06esdDTVH5L!x{rBo?z2qXUHs>&B zpL>nJ6iugZEZJE-myRFWBn!{jt6iz$tD&yr6t~_eR8e@kLwj^QBhS0RexoPPQ$QaE&Cc~{z4@){+i87;C62{%VhP0RDoo#5_^dI-g7SzNDZ)tc`%qfcq% z+w_!bzQVUuI%<+sZx>3rP+NBwKJ}BmF>(JhQ8_G#?oOw&>7TVjYm>#mWBQ-1RswKSnPK8nyrhBti)1@cJY3apG;M7Kp zz9RG>jTu&hS4F}vV1G}utw0SIkk4MV5*>$5l$ItJK6zcU&aYN{gaY@cw zHCuchbd7rs_95?8Iaq1bhT-`PtX1?1nl0-VF>&k`JKg={Uf#ZEEkk!{5hdF(G#h0b z@{WO1+VYwAl@8#pmcjV5S4v_qQ=>?z|&TMo;DHO{c?G zjHTw^5;)4f5oK}h$X~aXCDjv+rlu51U-=iCs)fA?=T6{%>3T=jID(D@s5z$4xf)1JX^46Q}?nii!`NA9xH&`#SbiAPs1G5CMn;G-iHG%7ox2Zh2$_yWGE*{)_WJiTS%Ft}{J?iC@WG4L%+Chjmx}9+J*V*6xLPc~0SzWQ^%aYBD%#A)lzU zSS~6(oKy`e-U27lx=uYgg=s7FMlkzdOmC!bPz0LmoA3)8#o%4N?)lEuZJctLl{Qd1 zx=rT@#+uBf+}_BjCL?J1Op{1`csqDxsWd-$1D^leZPeLnRPkk5i@tbsX^qn999?z; zAs>vmnBU_35jr~VQ_cW3eg7gV;cTII-ChFv4W6YVfmigJJ3SeEz|eczfcIOWol-H@ zDh{2o<5F&+41Zw`oj(ztcbk0Pp*BS?^5+5XokZLH4~66K=2W_EM*&@ro@>c@hi#?q zH;NkYRub_Ms%|?~OJmWezIM^{(Rq)^5Ym?5uV~uPX?!^JtBChZ#RIby)aR|rOD|)( z5bAFCgC#V49RYp&9n^tF5s2|q4E9?g`{Kt>C(P+aK*a&)7f{+8Qzk>TMQf%%PRDNM~$P+%Q19@DA4(>7}u&0 zrGE3oGLx`dT}*G=tUQBj81n(SY0@z&*sPSymflU_k@@D=4icU`uB81gTJ2PfTD8hc zh!H~*G4vGW*j|T~M?<{1YLyPk{{vGmDKDtc^S{AEpI(*sQ_N93BCDs!2(O*ffVNg~ zG^0m&T+RdruTb7$PCJ!m$o|0F61!FlicpcsZ6$h_{(iBH;HeGNv^MTYNAi2JSKEEE zDY$o$>OJ#;{UMa%+AFQx#M1DTq13bWCZ*%_Gxg^&`o;}0C2xl_lzwLyc*)P^^}Zu0 zw%ie(*w3UD&iI|TyZR|?2VQGZ>11Gx7@syutX|uVjKa0$zO-`*9!{)jY0EJ#r={|# z&>H4hZSP_&wJkG(_oKH__Dj)f?*tFU;xImf;?Pt8=LGZ>?Vr7qS`RwGZ&G!)Xs3PV zY}~G3Ml~-Y?sb&Ub%~OgAE9T*$Vs=_=qgS-u1^8cN-6+(~1Cc+i9V`FS_okpPv+M9a^E3$$#hZ?$ z)$e8QA&-sg3*H_>ZTI_f{y~QY{0KDaVDxFYOyjshq6U<2(b`n5#{o7573ds>dBGBT z;G024Ubk0Rq;OwTKDbvow_OO2-SlYd{T1@H4lKU zF!uHATA zHCtNo^&G9sd`Ha*1bW^K403}`qzYZq#X+0PIhV~;CPO@}el#ZzzE$Oit6fZ`H?3)> zIF`5bDopQwW3jo~fq^{cRbt>lJs4FU_PtO(^Zj zn0FXYyRMghx%#rJNwesnw{NFWz6JA?RyV%g>S{P_C_`#y0WZTvk7q$|Mloh$ymOPu z$TfN~$6ww>vHLD7KgY+q)q(Dx3qQY>F*7t!CvLcx89XY=`?n#~F{^c8_Qw~NZj^WC z=awk0s1HOoqbv?|`2AJi=DQ`kw_V*RwG&j@(ugmO-*{8?ebT$01@u2gd!HJ_mv7k4#Jptk+G^8?#Yz}al1 zd}v^y;>NM;(p24;7UEE=+G?>%t}la>^V!pv?6skv;>*Hf(K8JJPVZ9SM*&BrXWp)QqX zsTp1zv=`wGQ*@s^V^{4WvjT&8E z`49AOJ2IVXNEvHyk(g;x{#G;8eT33XwY?@v^gBHMLJ5x~(bqCQHY1(SY7d|9s29#S zL|~>P;jvu`?oS}-P6nRw)%)ET-p&|!{x)|iI+#Z1J56d%pkj#_lB!QNS5dQ4#e3!4 z1GshCsa(ER3_0KSB8BlQM&+RgH|sHG%;2aT1iU6SdwpE{Fe&bKJF!Y(jq-#NGcVPP zmRZF2FZCFD1p9V_=UAiXZ^f?i|v+6`Q))p$7jJs1Y3+ z(P**hD%*OE;mGv+e&EiY96%txC>)At53oF!M_ zbx^x)9~jpY;t=;_ZGO5DR+?(e+)BZlpHTL$WBJ2fd)+N|4SV^yvtRX1@@(GpT<};+ zdNsWS&9LdkrakG5^4?h}eh0ZN-e!_p8f=!H@e`yudrD(=%?wmn^l z6mEBrK3^-yyHhRX?!EVjBKh-h2YW|jdxbgt$Z-by=O0Ot+cNOvk-KHTTO)XU`Y3wg zu!)clX_Rcrh#h@xF_mA9n@Zh%D{#!#+BC4sdVW-Ds2Fv$FLKq3iZ}yfn@7_56)u<^ zZ{zwO4pNN;jfiGs;}7X?QoWwhRNpoTF`2|3-DZ=2jq{>j=o%_HDj)B*t143SHnORh zPDft(cE`+o{BR+&>DoS8IpeBqwPpdAeN{kA={bToT-(5FhF=h$y656MCv5l%{_Y~{ zos{N*KKtlX_b8F$3eKY|K{wQQ=0~+zAg|Qw;1ynx=NwH+v5adEC?H1`nIMmx&djPd z!ao({BF^V%U#1J~T=8yCX8R%Ydlr8{$ugr(GLUo$Z|`XRS=G>g$YT98lsCLFr>J~g_rj_TiE z0KSgKnb%@--#*L4CGBB3e+s$d@z^h;|#2_&jl*upVDkD zFjJVIgT~~|&$-_Rp)ND%1HO1k`!92Z+UK*w{l&nbivoEtPWbjguQZe1^@h^50N> zno-bIpw_S-U#@y+5tkd&olti)Wng(7Yo{S~a_I*zrO?r*a(nSnJTRyo;!m^_*hX#%lYgy^XJsZ(cK@r*OQj84*LTnHOm{J<-A|3YK zlHoZ!GSUCIb@kgz` z?F%w;6xR>FA@RUih95#Bj?C!gcJESR~ zMXY@9)$h_kO8*cYM~e z#_O_=2sNSQ`YVsYYOCq=Nu@`FYIlN@mW_3+qLK9^KJ2*Uti3MyE><>A9(M9a;DJc*E!HzjIMAYXLwb`CzCa7AX=`p|N(W-epsW=4NL72npJ`)XD8>+oF6 ztu%rn&m7Re5j1+oDd~7>8mYLJoBEb#Jcz~m9#S5^1le)f8?#=mCpW7(PatOUMVb1D zU2AG_@|c`!8Yrht?n^~w5UJ;p{xhJgzbM zZm^+hl~dAEhkD@5NV<2jgn6p%HL+*Od;WH=y!xGMhy3}%N&`aZ`xhsqCR~ZQF zqju}=vR1VLJ!*58TksNgX?BY;R(?q>4!E$|>#AX!Su4AlS3k|hOVeb~+fGd*z@a*N z#?9Zk7T0{Af^wvL$GZLvF{%U1f5q#rPLxeAFi#v&khi!uaEtZRIc|R!28Qv*p0{{o zdsn$RZaCe$b%HJ}tk18%j-WJ+efV;P_oy3wQ^km>$4scv=BjpLn z10G8)TX1EHU!H?&hm4WeUQ8gDDoYi&^H9wO=cQwKdE^uh%05GmDYuU%4#>bOGVf;K zESZkx=NT_+v*~Ol%yaP>-n6^u_%2&r^>zc#<%FN(`iyC2j8C6SWK2Cldw8lLzfPN1 zhlT;Zcye4!CPQgFo0`xJZM-RF>t5Bf9J3@}oWkfubwcF6&+EA3yqk2*_6UP>Ida=r zfjw$&+jogx8<%n8j!vA=X_JUswTMe)+$M~IJ7m6lkNM+(R=j*%aeYPEffhZ7I4T~O zr~$WrsoN@TMrZ3k6~Ifg!t9EH4Jhl|RkZH=b^5!1C01MsURJtBzfi0OSGX0;gP+_G znZ~YQd;2C3=y3M#Ntb6A)~SN({-Pe&Y&ymVS$AOwmeI zynxVKttq7C+mY6s#&sune=cfcslrYDGG<(XF)`4EDfMv^Cdn-QimLnqe*$@?m$Sk? zv8eE3%QY8QUWu!EdMoPqkSsa5A|pqH*A%a_{hLu7C_9r&-Q#rM^hmwW+-v1j3Y{H~ zzv;`*PY$&+Ukx3}jc!z+>yz)&hNEM6RRsPHG1X@`Ir;h{Tx&C!qIe*JSXd_Kx-vnG!^&`-4A~4#{cu}Pz zf7^>Wm7jsSwu=LQa*YK?fcLBUk=sh4I5%eJ1(7XyqjX-Ep6nf-@VfU$sMsd_9q|0= zVmkgN6VDci30J8-ikt4wp&vi9NnVLQ&*+6XRTu4t4prFB3cIgm@8Y(1j3yo)+(H-1 zx28AquR-IVCg=qTTwtX&@EikpW-e5IzT2rIwV)9+sy$+Z>LWUSr9KyO+Njb`Rk)Z+Aa*nepOGA2-bcV!%1-09P6)XQE)>}QS<#!Qr-eyQQ$gD{myNDPAH#n zDAM1&w8}I19%lwt0t;Hk?Y7&@t&D>_vfed@&!T>}QX>bB68J(`yEJ1&b$&rH0nC+s zhr|ixO_Z<6U(H^hlp#)eR?gGCg#b3|$ng&FB}043Cp&TW7c@ycYT_Q}@>iIEh7`VW zQLHq_qf#koZmqSXdZVdK0iC*3qVDPDgZ#$oZ)RCDEBfO@3~jHmR|A&P(XRNry8*2P zI9Gb!twtN$?_g+cU{EK;VfqQ*_Zn(eK({MDCzMXP`EtEnK7EI{b8|JY^pKoeDYf!) zO4}(6(ThbFX3uy#3eS0k>O9XZHeYW|xtgV>GK0&Q?;Xg>SU3Che4~7yJovb@xM_1q zGze?Xx4o7?8;z46C-$d)kMh9Z9~a#cvg+t5>fmrmgKpD`+fHZjybiywZ}d1$moqG9 z=wgxet3d}Z4W;cZ9}DmR8yTla@8&s-!G|U>bghIhW#}WK^(Sf0Nmngq=U)_(aS0bG zz7{ak4&4+w85Mqv) z9hLCk!lhYv`8xADt;MZ3bSnNlW(`GlG{fHmLL10AJcXXDoy#e2;ta5*J?GmoN?u4m zoWArt!F#5jq+PRjDc#P|CuV}=%{1z(K8#l-@j1tBlM}L`F(~|Jq}GGww?DR%m&QSuT0dq zNIpeT!EGW?|OyR%t4Rca+E>DgKKX+L=_2m2R#1J%`?YT4{m@B-=3~ z1o}>S88xdA;AZMzzd_vjbl>b>Jg-F~qEDo~{XTj>;i9OzbE25Aumd^1xg+(wvC7k_ z-cxfHZB75$46iTlyox8~qYwiPcxtHLx!}};OD~Qf)G&khM5}`x;r()>xAN)E+X@(? z*Gqy{kib7(d7jPpd$8N?vudyOWXWh=IsOoB+ovf^5b(Tw!!rfDl*wY;_A16D2aO_N zmFPRfO>U{a(88G`wwGtr5LfFF!I*K8!dvX!fHEM^{9Q1deQY7MnSYrCaYGd#1J0jT+d!bR|%sJ@~L z_j@#pUX(dV=}W~)ctC~ETw{19eOTQ%-ktLh@N9(g^T<~r%yaSz%qh6oszU;EJXGehB`9FZ?Qe>KB7P9>egf#-*q#vYtmO?0E-&3B8TKndv3a*NmQJv+h(Q;nNFE3*LL~>KW%L5AySqqW{>DMJDU4HB{owVo;d~#y2R!?HY1z1akJ6x?1tDhy zZl?xeCmA(E=u-*J!@vqv|7PXKp6~MEh`=ojjMWvEU7A=((u`?B%?#nq)cj4KbMd&E zKN;w2ZR-8;a%q_kq-Gv!mJ&zT;t4CC5#}ml z-|N{@)hyhRJ7M`r0D^a_2Ie&AhIOcMS zX`C_F7R|f)3=LQ;R^W4j39Sn0@P;DO(Coa;yj;W%xCb0N!0Vf*G-B3Pe^!*L5r!m5n-0Xn5EI` zr_|dj;>Km*jjjnJBUdPz* z{F2*>A`gX{Iql^8!u-$CwTl~^&g*J*Wf&-R(e~g!Feov zSCfOd2EaAw#Lw=*?Tsw%1)l92H*Kh=HGbMk z8Z6Yze7ZlC_G52>xe~WC8bz$lm_(_~EX*vReVgzj1Q#|1Q#(*FH590MoEk=ZjknNi zkJ(*?y6q{TTHAqYLhg)B2?Pf-hYdLQNVF{gF~(4-c&r7s`~o0CET*3e}Yk)P;B>gx2J5Noo_6=coE z7B{j7-8RCzqYnl`)`VENy7$Gb;dQ)dlhQ)?z}|JG4NehwVVm}(Kx@pSoaYS#t)*98 z`?Elj19QRk_Oqo^@D>eM_ks5WGh)SEGufofhcep^8Kz{}r?wY2+bdZd9}A3T&GJoi z*F^FKs)9Dojhiw{>fmZE?Bx`DEwu|7_lvzIz98OYm-gPm^%~z_SSvB{&8&^Z~SCn2h1m>BEXbv>ix9o6yut2nvR@VFhnA z*H~fN*a}FV`0q8QO=!oC`*sAiVIW4ywwknPqZ;#>)BSvY~}W4$=5ypnDb<4c!@=EX*(G=VnWQ(VaDc zqS{|Di@9?D)$7-8Kuelzsh5&mnKMuGB_ry*hu=Fp8YLI$dD279Ts9Fo*$a5qB4P+j zz1gC<^k`vBl&MZ4beiaq5vm&xjA(k4j*ua8x}jQTaWPl1Yn|*%k`78pg2YKIF+w90 zo+T1gPiRK2m8S2KSY4~?G-`aEfY!4#Lxw|JKh<|4u=Q^ftu#MH^y(CiR-b9m_%OXq z20|O}rd{MX=}aC=R6D5bgA|Rl((pYJuWo7eEe$^T#^hi58n7Nkx=Di}F)Zu0H2aHbvRG->p~tg^GC8pcrE>MI%$0>FjU77kzdB diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/data/1ed9f301-ce30-46a8-8c0b-9c2a60a3cf43.lance b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-community-full_content.lance/data/1ed9f301-ce30-46a8-8c0b-9c2a60a3cf43.lance deleted file mode 100644 index afc4df25e9ed043d99fd557dbb6f02efb172fdff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28592 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 LI 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 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/0-92c031e5-7558-451e-9d0f-f5514db9616d.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/0-92c031e5-7558-451e-9d0f-f5514db9616d.txn deleted file mode 100644 index 9e3261cb97..0000000000 --- a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/0-92c031e5-7558-451e-9d0f-f5514db9616d.txn +++ /dev/null @@ -1,2 +0,0 @@ -$92c031e5-7558-451e-9d0f-f5514db9616d$id *string08Zdefault(text *string08Zdefault>vector *fixed_size_list:float:153608Zdefault. -attributes *string08Zdefault \ No newline at end of file diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/1-7b3cb8d8-3512-4584-a003-91838fed8911.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/1-7b3cb8d8-3512-4584-a003-91838fed8911.txn deleted file mode 100644 index daf150cc074bfd012cc52fdcfbf220e027325053..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmW;CF%H5o3;;k{Dug;_Wa`if$;gTA#$`Z!B~G2G>Z5omh~=icc45v&)pS!Ji3wPg zp&$~hQAwL`y2kjqyvJ8~j`u<=St^611%Ej=FgFKkj8@T;J3aPtR1d?c>(95pQ$K|- D9Ca5A diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/2-7de627d2-4c57-49e9-bf73-c17a9582ead4.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/2-7de627d2-4c57-49e9-bf73-c17a9582ead4.txn deleted file mode 100644 index f4f8f42725..0000000000 --- a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/2-7de627d2-4c57-49e9-bf73-c17a9582ead4.txn +++ /dev/null @@ -1,2 +0,0 @@ -$7de627d2-4c57-49e9-bf73-c17a9582ead4$id *string08Zdefault(text *string08Zdefault>vector *fixed_size_list:float:153608Zdefault. -attributes *string08Zdefault \ No newline at end of file diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/3-9ad29d69-9a69-43a8-8b26-252ea267958d.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_transactions/3-9ad29d69-9a69-43a8-8b26-252ea267958d.txn deleted file mode 100644 index d3497cbd54370dd9a6cad6f89129bee8db93dc69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmW;6F%E)25Cu>HV+`e%RuohwW0sMfov|=p<>TyD#6xjXh_86pE{q0eb1^a;%}*%l z!a|(5fF)Z}-!7m29bWytVDX$Zl1fc9M`ltWQ!Np->LhOZSn>Ooa6UC{cl$rIL)ZaA C{ugWj diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/1.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/1.manifest deleted file mode 100644 index b35c6002ee2567b8763ca0615d5a85925e6f9203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmb1UWMJS@5n{?rQTPu7j9P5PB}JKe=?07zOi}D9scDI&IVD^gLM$bz6(tgk1XbDz zv6ZDJm*f{oFd?gzO3SQBO^GkgtV)f~$t*6hO3TSlEU_{)H8um<#E7s-PlzkA1n7dK z(vs9-31(z7u(?cv(Tay-=l41L*aR-j-@S?{Ny|Xj(kR)$*f7;p*WA?9Lf6F9Fjdzw z#UM>L&D7M;Bqhnx%+M@FucRU`i=T@%CowNMRfx?%&&WW}po#}3z-**vzyJq~3_gy2 F&Hw_2YDxeA diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/2.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/2.manifest deleted file mode 100644 index 6837b2effb94083f6e13bbf3b604cbed6e9a8dea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 zcmaiuK}y3w7=<&F8YL8zS%t2$a3O&iW->`T&7vS~#RKS~%q0IvB&5(xCG-fM!DF~_ z<83^H?ldUXE(G7==jZYG-n&7b7oHMaSMkSACyPHG*73T4!@-a3{Yt^Zb}X*fMktsOCTc;VSn;!#fU}e{z8&ujKV{te5%Mn2 HuP#0T?jv{4 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/3.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/3.manifest deleted file mode 100644 index 4cafb59f5bf8d75026ef2411252a666f02f595ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303 zcmb1UWMJS@5n{?rQTPu7j9P5PB}JKe=?07zOi}D9scDI&IVD^gLM$bz6(tgk1XbDz zv6ZDJm*f{oFd?gzO3SQBO^GkgtV)f~$t*6hO3TSlEU_{)H8um<#E7s-PlzkA1n7dK z(vs9-31(z7u(?cv*@}l_=l?nT*aQ~roi>d*Ny|vrJSEl4$UMbJ*Cg50T-U@h)lxSp z&D>Zw+0Z=E($vBzH8I6RucRU`i=T@%CowNMRfx?%&&WW}po#}3z-**vzyJq~3_gy2 F&HxzwYNr4I diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/4.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/_versions/4.manifest deleted file mode 100644 index 95defe4551b6b0513e564098587df5f26d38a3fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367 zcmah@!AiqG6wD?ul~7Rj6ne_Rg9LWjZko*|heGixet;gzOLtcyA%$iupwTkx#pd{$*rf%;UlJ4zDX#?BFhL_m4y0;PfH#x__ zqh8tdCUTFn6I1tEExUTBmrdQ-(ll$ZC=S6652~%zUF02i{PhgaaTz8W zDwSuF5h+YYW{h(p0ditA17qY=s6x^P+Lgw>gIsU&#jzXX$S=pIZ~N!>;QZtD>BXy( zloX(Np+qr=fo3U4A}cNk&$tFI@*qq C*?0N? diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/data/a34575c4-5260-457f-bebe-3f40bc0e2ee3.lance b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-entity-description.lance/data/a34575c4-5260-457f-bebe-3f40bc0e2ee3.lance deleted file mode 100644 index 6777f9c87a01fb8b73c91c24210c1ffb5747f0c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120119 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%0A>oV;>$BG$U1xVxiM!d# zw1aT^-$AKl@n?l2?H~%Xn0+deXJDIC&q!u z*rHGN1yYGSU1Hxq^IxnvtdEp$9d12Dj zf2eiZhEtu9r&xleS?7Upko@j8dMCIUuYP+HR;<4OUE@=c{0eJV@l+B0Ot}`PoCWFr z72+J!N^nBLEg*hFd;670{mTjaX}piwi}j0ZIr3tM=4w&UBgz%eQNFMOb5=!h^0ktv z-|VM#CGsN>n%@otmWcc$d*??KTzahORY~{|`X1q#dHT`&%5vXe5c)Oo)Brd;cLH6% zAyTeFXQ`MX<%2AMA}{zdbVfB0bqail0tbw4rMuv^bx#> z_J-##r^w{B;bG@an0`LLb{#2W!>Bt?km^_HSheAO57bP2%E&8%(COcL1d2=m#N1DF zwnEZ~;PWt#i~8I!Cy}&;21@4yk>+^_Blh`1a^I)eGyIc=yfJ0M(}iyro(c3v28!&N zk!R(U12E!7oINZNKcv%MmyUy_E|oTl?x)RY;X6wv>?18X7?&ibfHZR-UfeziOqRaU zOq{zCa+qE!M5N&{XsY zWr{bYCIbxt)?LS_x7R5XZ;YFw*H8`^Kv_{3lHP=lZ~MZi(rmnz8Kxv)I<77va} zFyvAe|NCek-Z%d){qp~a8L{Q8$J;QdaQ}&oBRb))8_jXxl+Q}3!w9>6=FQ zV^;g|_}bwPzdB69S;0H-`Y=04n{fa~yKaRQ=?36mq>DC%p|~bL9zQv>lG&;slF@^a#i_ah2wL-7=H8LH`I!lhx@weu$0j6%un|ft{QUzcO9VT z{Z>|BoaY;O8qf#AmVZE9c^O{|%6zxf_npFu{x$jpbC&c%0eP z4hFgor9Slq-MPVVVnzt~Na6T)TV3^9W+T~pR3iNM;|_dvIm80S)P?!dNNiu&o_C$x zi0RX_=I(dwW&d9n;pV^9s>yMKj!V`-<8Hs3FQT!Kf<9G{WaZ6wDCwNoyokm5qkefM4AJ>!|D{qTE)TEUwhft zNB<#x7TOz)g{S%|#AO_Y=ga-kdVrq%?a^ga^vs|~#BAnkcvOZv(0_bzjuj*>^?^$T?s)V?C)nk=8YVR@ z;@xfkuq94V}qx1lK~IV(9#h#zFX;Rgfb`^7A$?sYlU;kgDh^d zolObu0?{EsRIeUP^u~c=j@NScu@RMC*nR#EuqdhIw}&-VU2`(v{_-=@L$5lDRn2<{ zj(I3qzr7A&-N*wB_QXo_NZzn+D$@PIKll3ZWO+Ov)W=3H_`C${jqc%BhbS<%w82V; z9B}Z712fAAmK~c59>I&)XP1*yBOBqZgDW_>Ze)LNG=g@cY~fklP-dDy`ZIv`jv4F* zueTY>vNn0?A5jn<(h8TgsUy}}YP8A#-@3mC3ma4QWO60m{r3dJ4_t<-Q_0w?#uyq! z^kUT0be=#vsO*r;_3Os-lT{}4_x4~_*qsHJ)s@GVw#29ZQsL*E!H^j`kQ)T-#GnuD zRM$%v@Pe5(-N#3kHr%xxo%4Bs)>@kr4nlV3Y;05WlkakSjyIk4 z)lS-TabQ{t=rH*tJ4AT}^_#lk!!@yKW1_ z0ov89d(=(7?89H^+UgruGRMQ^?)z{-`e`_wTq^nxC+=U2n-}i|!e>r%#Fk5)pupK2 zK6WsJnQi*XRTExwt%N^fz93+lDbRiJ_!(77Sj<^gb+`%C3%J5x=pW=pb+yzt`VHk& zw=K-DZev*7#z0=0zK3tj_h$v=6IB;Y zx36H?hm9b3W>mTs+KLhZi%UQgXX$_t~T+ym#5!J6g z6fHkbwY`uLpR(&-{UnIm!?;-*cd^aj#a;$#y~mpchk{L^9?UE9WrU}^pT`1z)wu%~ zeIa-@K=+}Pa@7D@3~)wF&Jk;=X<0G_em&}f9Sh9_55nVrXIMqtLG~pttxwX@w@8=* zj(vP!@WLOQu*k_gi_VF;um<%kM^OeG0{O|>cxM*HaOFKg+~=1(ddEDy4(o8Cp8U$Z zvm|i%+sbOeo5;K0n@#7j73VG!*}^ilK?r}cwJ%TvK&etqa3q)1-T zb3~n>Q&dONA5B%k4Yu>Us3%|eOYsNl%f=TLz+0DxNLWRCLV4n`;w@Bf@x0#S`f`@p zB{n^HAB>*TofUi0^P9vw;JOS)xbDKl41G!T9PuM|(yl-nE2A~RBK>8Uo$SE~TX=oL zVl2}?fx)!D=GD)?;ok&vY?d{Y&2GA%6W6j?(T90P>@1;~lx@G7h<;YC6*!3dlt}-` zJ%iFQ;c7odb;_-^SE2cZf$Wr-2h7g@CQVtW4UR$kVOiOH2wB{umKP$dTwr0*Qr6w4 zgZeEm5ohb@<9@f}F!6^il7>?E(HR(T<4hst#Th2%mv{kr`@V$ZJCNpy|8!}@jxV)Q ziQi!4+E+-|Lor7|zp`=C!YF~uFgaL*@A5oArso7>t;|)@WpK!CCpJ$AL8>VT(!E}* z?}(>y-Cz^!{PrY|cKfLLal=~e7ga}fXf+A9{OZhzU)aw%`8a&aF!6JErGU<-SXjwp zO*YeYCJwNs$9>#b?qVgvI4OVU96M_ffLC;<)U5^W$@+|He)pswbnlOin`Ot|N z$-^@yfaQhW;9}GO3qOx#o2|am&)1dRTu%Vu8+>&zV)B9QRl$Qu^xQ8(S!76 zGHI$YxbJFD`EvU(?49<6U+CUN=sggeN!m;yEaL8TZuKj3`kjc^cG7Bge6z_jXzAFJ z`_R56E7G@v;J?YibY}13i#&O02`4=dtxG)cO^5E_(yE0-7z~puLxtXic<4!*;S7A4 zvlv}lX=!%Fgt2-7LvYiycC|e#{DoGvLeFqVXZQ8^j#YDhv4Cm2gw|FE*~T!!5LzEo z^~tO)*y>1Kw5!puL~O&?=QmdWth|Y@w?$wQHkEJW8pHQFMNV(G1>lAD&0*ab8};zg zLTH?Tf(uwq`|C*hnyH!Bv0-&nbiH#Q0z*8|q16-OpI6wR?in`5qY3x>pep&vK}eqg zhFLF_x)Zm7-FJ%cln}>{!t2fW=8yiSr8lUk&RtSqJ$P# z2DAzX!dOndl0$sO8fI-o;z+#h)e)&?l=l<95??jv9+v_X>j9w{?>2<~yFz^#M(>zK zBlS9A<^5XhCCo$8kI;7hR9K@lP^qSbmf^y$kpAHRm3GD#|H6gVldt8rmWbc*=I7~D z&;2CoLm&?4q_Mc*Fw%JH+7I`|*r3xWBfL|fkNzL*!DHbi_Tk2O%nm&YuTDL{H+iLe zQ^*v;;=bVj;RGj5jHE-rEBZBtnq206TAkPUIhew3(uRWHNT0-nP3rpGg%pNFwXuRhnXX+P4=vUGmGU@GFz3X3Q3B*nC z>YtWO{Hq}?Fa2>hhG*Lx2^)>Xn7CHN8zg_GI=TKuJM9rbxI*3~6{xp>`WA&xA&&;6 z4H(TM>m7BPa4(NES1LHS>V)K9)$vp4ciR`fOEfQ1yHRP%O1lOcP4{OwA^5VA+x;?7 zO+fXWX|NmmvHhOsrH8Yc;mQxo$X_hs)bHrE|Ci9DKpI@7I>beTi&@>eBVoT=S4Ch% z)!|6kVX_a5ZDgwPUaTbUJ`&b~@RZ_D!3D&vT=-}4y}}ogM(0A~(`TupJzCcV@F&exolNHijOw=*WyVS+U1xepwsMRC>xO_WgE=}M<-~IbKSa6-dEPQHy zo0}DuOJ_6BGV*?m>JB!oFJOXGhh92@eTfaQY$Pt2fwlz$!N0@qS}XObq-CVd>qM2!lZ7kr!PdxDcj2GY1l_yfeZDrsn> zxx&lNreQ1nRgX9nbn(b;t-wi^%&XY{(~lFoxB0b7Lb;Z=D#G)J5G1|&Qyf}lsklx7o&3j^?{ z(){8Xy-byK1QL!49lS1RsMm&&DeCH6yRdNel7yMF*5|3)66LS~#bi0b5NT55|Tj z!r$SuZCSXs>_V-s5M=XK*0g2liMR!{zCy2~WmY@kYm^3-B}_M>zZwHK`CtF%8mdK>gwa5?kMo)~B_A1$-Gd|` zZsw#>pjdyV(5Ybkb~saWpRtR>iiqz{h>Q$MJIq4rFZ|<9=PZVP2f`Q1SBylT@EOWS z*0C^_&9NIoImjec_#=T;ie4-Phqw~PyvJCR`e2@AFT5KU9#v??q4aKQ!-Qf+8We|> zj>gBIlSp%&<{$E0vBiK~n7n^lZH@X!jiJMZKoDA0WQ9pHipAFiX0eCn3xqB}(zPIT zgUD8N1CEo<-GY=mG4f1!;KeP`=WuygK9G)3pXd)&YhFKMQz=fr%doV@v=Y8ktWspankPCKL<&hR5S9dDtSmz2Quks@^J<*hTe&%depQy z5&?|@+9K(C@YI>WB4IB6SvjH>`zg;LZL-#hbR!J8a}CLRgI2Y~-CXSjf8)?JEt&d- zYUw3Ao1BIs{}p-B)cr-ICC9;g_h%Ai!%Dq~Ckpv2*}e24^fF?2%y%gG>aM_=*At+D z3cc;(|Up;JMNt}Ng>~%kQNahK^6BUJhsr?Z3ZMm zo0@gCYasl#X@nMk@VP4%{~L)9$}NEM3e6Mqr?viG>+udG?qgP1d3 ze9#4MhrL5uCq~zm-4?BYd%5e;qS+#}n%EK2EG@vXeO);vr7s?u+!_X-w_;Rd^z6-O z&7)Oqa79=&+*!C8#@K{FP0#M=|MMnGq32Kj`I%xWJr$b&*k%zp7QxF)PLH`=>PwM z&J9$&KXf*ZGd;*>`JdtsZ0o?F)~PsXlNY>9Z$s~%TC2@FdVs@^!C<-DA5+ub!oeF2 z`GOanTJc>qYW= zzb&}=qI|IY^90v=yyW>&p?qFk2yARf&xKj!0O1QeHa!BHcf7;5Od2Q;>G&5@v@dZn zUbjVGF#h#FHfV#LQhw$e{0f%Gc;GfzXPs&|$}O8eNLeD@b}Q7 zS_iWyEyeu*-tlFwiO5&F;`hhJSlqt}Rw}Pp*N2ws{>0=yMM@#7dcPX!2`(r}wdd5+ zn#bNv)MICN!qMLMcqi2oe;sKAb@jFQvIhT{J>@1Z7I*@4smphNZj2%Sa?yE(v0ORc z(TQpVFAp=3{f-4P_vbgD;EJm(=8^6fzCZTV>&gNjw@2yfiru>y$ z*VN^NgXlBsDvZeA!S=40Px$o~OgH$WMTU|19MwqG0m})`QS@xTnO?Xs^d<;C$$LK( z?Hp;pz*Gx(-Zl#c(tFK?&n#d@!UvqyCJ=9WJ(hgiUsMDaB-jk)-P*}`C8ie=UXsRn z#4459Xxpd)Ma^|pt#N;%&lV&Gng|^dKo8$x=rER9DlN|C4(_#R<(2`ZYo%Z z>dSYVrtwv4jzh!cZE0-NVFf*7R<^E*x;JwxsEVWxnbi_r_nU^a?yS{dUr|rB7^5{W z7I0ryaE&Fhldp}>^F>h z`cTe?@-_nNu;9ui%p0+uo=JQo(>)P)1ZkYc8S{+)#zOg-)v$NPTR!Gp1&d4@15_*M z*vU>YYL(4;CeWV2ZHJ?)V;>sFX64heFiv%hgo#r5ml!-;XAcv6u)6gajG3JbMan3o zTBgr)6>G#x8kTYI*3R5C{xw`Y+nGPl+f4XK=eJxuA^4e1aMi`6EzLk@0K(G`hq&Oq zIkz@4;y#)qYn5siMs`_@w1!S5U(dnWp`(DX1C6F?$x$QdT%-3P7=HexvbU1#M4=iPx(TdMEZU7VirglDDegknRkT` z{j>#*&UKflmoV7J52l>YfmcqAl+5D<^%{8S;E4_IZy?_C;Z%2A_ts%_$o_+b2hhpl z0AZ;f(%OOEL?iX}lg&6VVh4zNn&9RDS08tlz5W@az`Zp?!KWUZ|IS8-FdR z6xvMaB9-n3h3=w$CY{z3wY`1VqvAqTe`~9x6-b-JLD}OxmOfj;RV{2-&D}ccaMp=< zU>N;;43c&P;yP^JE(I38zAMrCE6p#r#pE@Q@V^(vD(N;JQtvI)Yjz(zrfh`WF%6{& zZl~b)@L)cP_Ax0MzaI>JqS&|3vsvZ%tXfTVY`P&_PY)%%VG9B;4SkG2=sLPzW?QKx zId{LpZzUEIPq&kXo|=pQp0wa}ZEk-#8?Rrl!j}8T$^Gi3Dy=)2aiK#kn)HV{?V>O& zqDZVGSPx&smUsnf-tSA}U7f#6gxk{c$_qH_`3%ye{xTv2wMsC>XZx~V?Gtzym-4qWw z*^JJVK1|Op)Yp@v*KUQ27sm3eGehO>x^-E`$fLCylQ2gjtU`~ydpU7C1{)_!-?oR5 zX0uQeu9LR@REk^sHI&8o7|%RLe6xUmww#357vxF32Fw+@gPpq4jSGw@e6|Nj6Yxca z7hv8vXJtmhVi;I;p1Ddh@LE72uXpOO=u1vL0755}_G}@ayA#2W7AHg34Q7n4N6+@y z1HV@dq8@jD(?Gpb9iXkrNhIC_=OWs7zh9X|V<#`smoGbT5Q)qAB0D#hc;+YOAAv z9$?0op5R1xZ!XsJ$j(PNj^1_uQ&X%647we*fO>d{LKx28Y@xmPyy@J?a@ynYc@ppF zlR_A)4WvhLM5h6;(|-zfiB2KzF$U7wD$OO39uWG6wBi8}oFUel?jOnL2ya6Er!8JK zSdFi0^3e6+Nn8<;>qPvN^YKjq#z6+7dviM3RuA8H-GHQzai(twBcG)bcd^mqQVHiw zu|uI2-hXojq@Vh1*ls&jXS0qvu!jM^7Q9~QeSZ8{2BxH(1^MG2_|!~CemX2oL)a)U zqP_j^-hL+Pnh`!>d!034KdXUCI#3pTC$RN+sy5g;S^=$>(#L2ojUz)^;zkxW3xb7p&YTuPzeSDO# zbaHLYkyoho4)1@Tz|xputaq0OKstdLygST#`ELPQL-cC3mM7R%v)GZ%*f@(3AZjr9 zOrrQVzH538hE<=$y^ZM{Lf31;t1*+YpLv_RuaSHLD<9PYO*d%4suo8W)fc~E{ECq` zQN-u%{^rET&s;3l4FygMy+<_xV(ltkPIT_1Ca}9JC)SSJG=2{GtstQ;W%C?HoYxjXGXWCQXUQ>CB8NvrggWB}Zz#GwE1H z`dcO31k;DXQ2M!$4Xo;4tFbotyWw1uulPQ`4h;J-xwhYgj&ofT0B2LiV)DJx+8kn< z{zKx(Ke#3(T6kbye}6ypF8RX6y#D!Ot04^JUXz+5c`(xJ$8b{gT_A0slD-wa2g2t( zsh>r>;;0fw!PnWp+4|l#cuU?7|G6|r@=1gr@6hJba-m1Tw$WT{d)mKt9k*z%3VtGA z`BG>}X#d(s6<=RsF_W;N9?PwBf;jvGidt-Q3x#h}Jqy!?Ul-mgch0T9kaM6MsBZu7 z&oBSr0>j$NSKy$90j{E1d0 zF;?au*NRd9*6IfGNg&pI-ZulbZ_*=$dJN+FXv^e(SgWo1P^Tk`Oh_g_trCW6$kWg} z8n=Kv273m}gmwVZhd{m+Nw4C?HWN9gcc%p2TmG5EN&h>MZ=*et4ner?UWnk)Rw<&#>iX@AlNyInA*eV%400?Sw}A08E50PC11Jv-(_I^GA9qbC6M zu1dAbXkMVJ(`x*Y*Bbh#eP{J*ox`-c4(RqU5j~ncpjR4AO zlo5*@Dc9O35jK-w9R$;zuB}mA zr{L1i<#8(UDpIfW&$HG;kA)AIs2!ccdN8nemSlRTHlDxH0A6g;aU`tAu6Oncoh%u4 z)CJ#v$C%L5gtc7cK;)H0wtx%6f54*5ZLr*4L%2By26Y&%#UJvN@;x(GIOoC zhYNg3Zx<{)qBdWnd8YpNr}IP`0AVQnt19G16C=^{xlA6uyTB~A>Vmt-nb1GD253EL z{eSR{SLR}mI$Lmb!eHXzsa#|t9!q_+dPrn{KYe0>@&Lh+oVW!Z)SZT;ule5Ro0#ZB zp|xlp6iu_soO&CM_dKrLH|WhoF6hH@ME(M#XQ0ob_9|&yRrpiVz0&A}%iQO#36dv5 z@^}(uDcr{40i&D;h!26Z9X~Lx8~LLzNS*{GT$nv&S{=ck7`tdK3VhfQ@R^Y&q73OT zYqm3zeD4h5^BHA*Ahe#~Q=tU{GtH6KNUKe6N8CI2Prk~?>w)mWiP)~hF z>U)&KOL*VxAdvPOieBR)H>P>T4hd#xcl;cFPTI?Z)XxgxtwL+SDKB6hYLzhJMd<&g zx!k>Yy3iFOr&Y)!i2M;rkEwyCrF`v|hd8OXJCgT>+DUJuw0Te2i<*1%?5`zxt`snN zZOxYGRfrlF+>dlE7-By{>!T^hV^mXFl;z-%lQMjL$AR>fHs@snQenOGCW-2rkylWK zC!*Rx!XA;2lfUVU#NCXvFOuex1+S9_#PiV~pm)bqPI(ml>?qND8EIAG+G&DMCBx30 z`MF=tGI<5wddxZDcQjsCx4_l`ixtWQw0KOOhJ}0AWt1V{Tb=t--pd1YulpOJy}*3? zAa>aM0MdLS;f+EVz<1P{fFWHiQGCzM12LSkb@Hq4MD_-x6~J;pb1m0fM@>hUBZ-s| z7{bOYFFAQc6c{Kn_^sbZ;F^=)&@i$o{%7A^T~;?6?>I!ljN2PwNy2+pzfU>;)y@<< zeocj`*VlsX8lF4BpUs zo77-nC+xjUPj0#UCq|X-f*mH4uz-F)_;(OM^U?NrIVuJR4fn<1)>|-fU@KhilY;kk z2f~zRNoabt5O#(w$L7}Ad}Xa!=)Qk1R!wKHXx$Ku)r-NF;kDEu69+-br+UzMei>Bn zuc!UIxjUaT@!Er9p7M#Bolu8rufOXXEcq0|oflB=1xMhsqy~`cR?1?#hqGCI2V?&? zYoJlh44%^HpAyr)5AW(&i=WKc4N2$j;h2#<#VM7D8rfX4)Xrs({QA%6>h$f4D|hYwmz~0^LN1E`F&xaAIS8*@`C$xR?cz< zdLFMYzO?KJCPovu@x@4NIc+;12{#$dH_9c}xca|6(tv{x701RoSXE~TkL_L`+D=pW z`YTpglp7AM+@|nW<;7TG(Hl?n(ov6GOy{f47PDK+ys*dQj@T&pqcqL#EqqG)k15Ua zl%JOl0j)KiS^hvfKkVUu=jz^^#GmG$hW^!l{JhINw)mI}+b&rmd$C z#}a1HBi}<)9Wy74g%2Y~p*8oG=sVcdg%L2TNhzpvrm!`u1C?4gQ)s{KWC&D3(CKGe zUZ8J{L7j&)hbSwY7Vrqi+V9Y`4L^gy=Xc=Wgs$MCYl*G9sIX>O7}6M-&5N6`J=zqe z^lgq!Cj{W)V;9bKUHplK^*g4Bdd>4U0lI#8(Z86^v>paucUp7$J~qv6A?Z2;`M~dw zEcAIM>+!S+l(n=+^U*#$knUZu9I_AZ)Y(lnK{vvBM6h?`tiYvf8+@%)}4nnbDeSTmv@SMunV4; z{~s&RKZ2=kZ$jSKXl3g4pSZY|15j_VKDXZTk5g>rsvW%`xOFYL=h#a2FZ&OE3~i74 zt(Rk+_TORmU~drD3b`X>3*MPg53d>a&kchU~i8BWgXd*fhiyt_#B2h>!TbMbu>(~ok^r@df#p*y<2JnL9p?2ixg zb-1X5`5im4tBup(*0M@o5E2Q#+Yds;@RLxf8;$2;j^fq0mN>4>Q%Ff|iq3RDd#w?D z*`WiW(7R#DfjF89tcxd zK}aLD=bM7KXd1-WuW}_cDQp zXnQ;gVsGx{8s|Q^d6*NvY2zjB@}_ep!#*=M)0=*-ME#mAKy$+1rSHP_bT8U)UVZ*5j~ z%okPE32dNDeTf{viGP@3pG1KlJZj8Vke6k^aqDE5QyC2LHHVl(t~t=0GQo%K_8HOh zV0{Eu;HVE0o4rTD{|wIY34dL%f3+@7*A%eOsYAhGW@j+J>yEu$gTa3jXTRFT^3QhO z8v0y}v*loA_ygSTO<|kNFY>f~(sOSfA{)Bj+8H2VOz5jE+Ejh4JS)@%-aw zq+iGU@cil8>}Ov`*1C(Vaen#*?Hil$6$9$Zc4ie^aL`?g=bW&UpLx-Y6aG2nmUWb= zH#n_j8o-ZsL4|sfw^5s!KbYAe7Tm9Kg z8191GXSaa?C1WvE0qEv&oo}@&!qBjMfpN6&c@SGApXK9|%9wO?Gd#Oq2aX!8Q(pM? zCk`;+OShD8zki8Xy*~tK&a`+=HOz)o+q24wR_d*iOE72MZt7zju)S3e8eWazbUhfi zwTt|;O%m1GVOkF(_WAD<;`|YC;G!QF{F1!10BM}CrAkLl=#!5X!@Gf)t2Qx#iqJ(b z_XE!|7hfW4hoyays?TBDk0pjD31k@kYT*q1O6r z4e1;_RX;?bHI`34ZiF{m`lyTAjYaAq{P-*yettINQHkbsm-Gq3)<_hZhx(6ADqe}= z^@sFUQLP>UpH_+N+4XHW&=0|S+G`~Il&JQh;g4{nJ`h+TdI6t1d=i)rC54UEnV~*x z^!451JviB(?%|K!g}ol;;isYh@R1GeMcDZ-&b0rJP1g*-1M?fGWi8VMhAM>j@b6>* zpL(eltXNV@y*$$l^F7XkLvB1CUDG^^xQNr|N2ZU@| zz{cL*CvXRzwy{LtvvGuXb6Bv|TAiX(>L;bGahsBIU=75@e7f;4OgqvK zvQ`?fLst#t6-%~IZzsW&Y&)4a8%lGX>1@C&py$1d?Rqy4{71RKj06+hHr|zqKHolj zKW?i!4RzYD=6@5?=+yoy$4EU*=Sjy(T7?l_gMJ;uau!?%KnqK#l&SE+OWy_KPT3+B*hHD5vbXEOx zbx~;6M`<_N>`Q0xaHDIu;A9Lx;uen%Gf&`Wy9bPTko2$}7Tdt)Q5$D!Wi z-Ww+}(hx!)6aJ^*>UrJp@AAwn!eio|4zMeFwc7bmE-vh?i!BVBBk53RXkABL9$^Xb zjrK#t`M!jCErf0m8iSEG;KcWM_VEQQdSeK~K5WN;u*RhI>dE7;4-xf?#E&56=TEEt z*s&->^cbVh#YQzXyp`J{&7MAu2_xofK2Ax7caI{l)X|f!rL%M_XA07~5l8Bw&|Xir zJywX@U{k>;+}LmtfBK;lUg&Tc$)kaOO)XAdgj4MaER>fdEatA$TQSi)0bx-B(|~x8 z`Jd>8ZucHRO z!Szedz%K6~ET`Q4RQ-C|z9N4r#U{7Mp>xeyXwU1C|D9CwVKbdf2TsIl-^O71-WIN8 zFJL7wfBL_4gui15?>EIs>yD zrZh2!mzKvIlg>>Po`$>~()$fyILb&KkU55of-TKI;w{(v7}Nfoz)-&Iel9=vK8|G# zG3K`pxAWRdl{6+JPGT8r)<6vuGLr{Yyi&KRI&0y1(&>SMquANUE^xCYoyks`9NrAZ zHy`e?(SIW)@`t3iJs|&hPxwCNF0MGXOlUDk3Z71%<;rv34<#)hiIqp&sg^^`kg$*E z#N5VlQ|ds2r5%8B15WD*R3k#$0pSs*-*wUm|Es@ZmP9fJ-CA()#t z6;?EFsFLPnB3B?!FaC{nsDG8WNVU}ZjSrT0`0m6~PW{9vn~i-S*ngP_a99elz4aO%x`KH{5+9H`V|yAwwcE}VpYH?M-H=`?m!M-OdW zin#D6CxZ@Xa|Y60A`_q*Hbe3tGHC$PEXAa8w}S8hUyNx_$kX)ut!eYcTyv^r(z(6V zJ84!(WTB@3?&_bP_r>8sBbsvlKwGi4_5b72pD z?evRm@w!#puVaV$Za|ofgt18cK{bC-5!}1^aCh1-B132!xNRe0^xi8ddQ zJN*3DM`&nVA{&VRWb5!6Y&hCaChwYUXk;re8A*#tROi@T|E$_NsGIudZ4q7R+UlKqvnlmDhqrNK4!pA50Nz>VW2F03t=8mHoldodsSzXF5`VBkH-eD&mnm!Oz+i$+iqwna7#P?RPSn@e;AS%BrWxU zd+ompEmD&tb~UL1UtY(2aI9e zt4o5*a9dz5g!StvG7J!zBxP|_`;XbSGmdEdF_>~3Gj(yTOl=lO{10~vX`dYbHZoxa z5U%i`8xy!EzJtK$`XVEgM#f$S(kz_DDQODZYilBFWdMfu9Ek}=#dz)X9KlC~B^=$- zW~ux23L){e4HK9>z-FjeOI2_L;hVO8Nw34yg$+^oGt!}K;v);ePski+Xgxgn8Q!@p z3n&vL4s9qrJ8@kG^trVVsP3dipS>YvbfWOt*er4-T>rU)lc!YXYE~d|Wpw(f7OBa(nRjc4>xib`6d!KsKi;EbO96i9=3N6 zi2RP`nN`&(LejY?G{&4rA+}lT!T| zS7FbCwk)!BPmODxj-(4V6TgfnZe4@q@A$>{zcl;3v)G;o2c(GE?m}NGBCp-B$w>Y@ z?j~Hf*^c!iFJ`~rzfjC4Wm5)f<;;yhe~0DHx4FsIMZ(`h&$79k@&gbWU+^N;fHu!+ zty4grzzzGx-6h`GM)}rg;Y-ALfO1yM`;!2sODov<#ZLr(igo9we@sQnkwDa@otY7RIK-bPh=0ey4E$;5efoYkH zJfgh6d#+ZS3f^dQ;4i1li~RUcM0$oNr1ov0!B}}=e?AlrlSa`6(%DcRS4^3_sn)X# zOcR+N@fH7kGpo9?qD}?|-Re5u;wCT>JxE*4<@MrH7$yMmBr3><#~1N#}ruf8-x4LebI3 zo!>RCt<=c+Y>Z7P+q>@`xIFaZ(#ea8=e=m$J;wpxdC?OccP^vD;640z`4Jq{nX_H9 zqqDB`kAw9Kw(+(lDY$ZbK5x7C5@w|B!Ukpyamea)?i^*LdVUVX7vsm{vPJYf@o9fL zPlopH9h1YZO)lY{bYG7eoeS#pd+dRY!mcGB;)aQTn4$SD9J;0)c5M#C#MvV>*T3xH zjJ#l&!D#r~HXeR>4Z}0Ecf}c>^U!_PSD1AqA80O>M!gTQj}^wMRj;w^!sNz$M(8QH z?_5vbVs0d#o^GM)vKwq~i8){TUj;0e-S8uCrOx+_Wy?OU0Gcm+(f2uTpcjw7eK+xK z3ujq3dWi_F>!4Je>ku@Z_C-8y9vB7$`KxnH|Gn3ZLvjJIlHuWwx~Hq^Mt-R zBVcfs`{2B0xAfoG8+>_?uDWbdgRGv-nn6zLY1mRx!4F;81vFQX8#5I<)|g_+v0AwK zwLV*6wT?vve1K`=jJQcz3p`O>3rbzrYZ|}k3 z-_rOeLG7(DN+ZJHCnOc|C=u zdyUzZA3k_IwjM4ux`a_@d&;-MkFyH{Ef9WzoZiD5r{@37ZtbALGn474+3*-%y$=BD zFW3mP;BAK!>{s?qcx$A9xJGx|CU7mH2d6awF{T?2hTyQ2b2#O5KiEe5l9lD3)fnjO z!{Zg7Si9#=Y(wB)$E?$9xqaL(_V`F|_0ypup0S|rtgz{A-{tKI{#fvJZ-y!KYSd_!kR*_T#{2){KtzON{HuEdK4F z-sz&^i3r}h4YNBK}nNUu=iO6wjUP62p{AFt;dPE!x4=xumNe0kZ>cL zt`DBx`-A(QpJwKBpK!y9Y0$oOp;~$`2&rzBIrX~0j}Eg@{~!am2YYGG53*6`b=7|( zx1iplv24WmQueoYXMX?w6P7-71a3cY84PZ;l|-K_HJhZB+xx@WpY_SZSgUy_KS?h` zR6eGlhWU@&p{$cE)dk}Q;;ryb?4F5@_RpzO#|Xfia*Yztr1NjP-sV|;S#JG}jG5cJz=hmQ`& z!1Sg2wQJRM-VmAk5R1RNKzYZ5{FRyjZRWUO@GEmP(D&z)yqAM!!!*=g&`h#)JBC!R za_6B5;QDw5i0=v=Q3qX8o%qRatyTIr_-8mAod)%iXNNDvgToP`v%U~^%|^OLj2Z3+ zqV@@2@JYRcu%=QW3|hh`9ks>nSrYqVp)a>@*#Q?NA*bsUYXGxyGa#ywLj>4 zf_m;B5Z*$AS1DR-JT&4jQau6N^%?D-bl3PyaKp70ky!noF;pKNOZ)0Mz&a@jTE4sp zlg}g69l4J!?VwSb&MN|oXZxi~UpM2w$~n009G%Nfe||rP&LPyJ{WOR9Qhk2o+0F9V z$3!|`c4#ynDY?U%?d!sNoOVOPE-BK#6a_DuUp10H82@IOmpdW-#}AFz2siszpznvC zFr@1S*l%BlUf%;gI87B;FO8#Tte#m{fMMbWEdO?&hqkfAg=j(;8%$@|c4x|(5P{=B z*TaJK8o{276WLThKpQ_{pLK2F;u=@BaQriYL9G6P%Iv8o8BCLwgoP=cr1kAb1K}a> z|ERrUxiJ(s1tHeY8pJI!@5-mUBT#SP_=c0{Y=vBfxQhCQW9;j-yx;T};M4I1_4Yi; zq4_OF7?m~m{3^^T>;R-E;Oxc~nza^<)KwL6g!9Qb<8UJDw=+evxDNe3_vS(H={EuD zIv&TES9bs})`Fk%TA0+_~EhPi(r!#kEcQGF@m4=pRFS&wCbt+$DkS zZy5`O`BImblX(kW+FOPClekx`11AoWM<<_Rru(m<_$451wt}$BG+ea{rMHaR1pwyi@aiIMO?t z&$G(I)Z)`nPkICGUp&$fo{V)}e5&~mM?b+FRV{puuqhK|>2+jL!g2PXb^XQk3Z1_Xue+)u!Yi)Xdt$Pt` zo1wv7ZKe?K##0|!An~(&z-=$a_p}9p6Jp*pRoeu%K=)I2D(NWrc`yP0Rt#cKjn50* zz|+$YqUp6pD)kiBev^)~kIvx41uD$}-dVL4PZTu-KKQcGKBVWC;=4OvQPje<k~j0uz;;r!3*aX?i*nD_Yy#38W0eYxOt==3+4 zJ5N2ry6?({(hJR?bB}IJ=pEau7ip|?ug|$7KpK*{?R=)yJ5;CehkKzOe3Hs1(D}*< zL0DrM#pC9Vp`O)Int1d^;&!UzpSevo}bvX9HP3ShWlE*rnQi#*FrIFHlEAW2Ii)f>p~$5gvI`@B8s- z^}X;=x)mOG8-o`IRfAL43)wca??c-yUW~Lc5H_)g{Yu2o!~-QjHHJ4H6p6kC-<(oj zFr_D?Y?Sz#cb$nda;PR&GO9`9)xmT>R5wN%2|oqjQuG$xQf}YTQJuQFU~R>nGU+O1 zNvuRTYW^r zNdCciy|`vP+`NInH#Yfh8oyGt1Wz?D=J)Gg=8M!c{PI3e>y5};aG^ymkUD&^{J0lM!@Qe4@eK(spoe@v)n!EQw_%^y$HgxJV5V$#hnI5Dy+orU9 zIS}Jp^?~B=bRVdPEf5b%0w1PW8EE+6!Q`FFS%+2yd^HXR(rxN8uQt$XcsM8h31?4@ z$K04I@?FifweIPkEmWaPp4#iK!u1lFe`6{*+)vot5&l( z-KTe$?t7{dJS-EYOY1+pV@X#XAyhw|KML&t$9w{L-@%pmY;1E7x}|DjmEal8f^io) z``KD`Xg(Ho>n;NQ>{N-y04?I*OGERw2~3a(8x@f=%({IPhyzF~d|{;H@Yl97*gc{@ z>C`qr*nq@2QhJNm%9A^^pD*dN;8*bqtpk!~VWG-z@JZ5DNz1~Rf*IOep?~2iBwkd> zduiv@zL?Gsou>=4jf@%TV>WW79hU592ttDpRzNGgJ4jkm)HDzugWbQOjOIrr&+HgM z`$CZC;Eplrv~ExM?EhNg+)wwgjbDbS7s+DZ92_~|5~mCU)1&qIu&99&c_YF3usWFb zJDKqwMPATj_XJ4U)mdmVJl66$&^&|CP^8^e@;)#urB4pk4+!0CkvRbc9+8((gzuTZ zy$)7(nvTy*s)2ez%X_4$kbDN^DqG=wy@@oRBhaQ;Ppg^jhUhp_J;`G33=OQb`i69a z?3JI7gljx?^Li-mbQGI9K2@j>RpKX3+#!=chCb1aWYRO7uv5A6;|cM|a!F`vp&M7f zttSWWuMMx3Ef8zPyXd@u<1+^XVK#Z686uxS@{mBErwYGKSb&r-kf-A!A7L3Ys(H#r zMfguVS2PSM^I=b&tib8_1DroL31=+JVJm${3ao)8x2J18j>skk{rbi(98t-LC{;7=CAOF790L=|fj-cm*JqN%Ft6x+b{$f3Vv>2PY{1GRP z1A*zZ4yyQf@-aehWs~1U!W$U=5SW@wV46)}ebgd3Ijmat291iZOGM zEmHldVor0b&I0KM(#e$n$J?+Sj<-4GI#B<*Ms+WIE%YAM%wY+N#sO(W6nwwF?qj4( z3+#(?6yjHzd_E99qfbZ!!l&AT%P_lHe;}U-8EMUNVB=$K=$g@7WLSi^Nb{fw&*HXo z7Tn%3OlWYVY((ABb{2R{+RY-irh&(g57G~>E99S>flIU-r&?lnFO+FLyvU&fMx6rE zFPv}&3Hvc{e<1ifwxRLa$dm`N6V+Rg)*aj$=zxyYgEEncA|nA>6a2#~`D~+5!uDa5 zC3VFBi>o|hYgZ|{^?o3(SLVu*TsI&{xfXF6C>JG7lT9AOUL}92+Qjt*;!k{;bW)+u z;BWuCq~!#W*(y`xfU+8iydD#tO6aPUN+7PQLuZ;1C%jVIF@b@z^KL37E6rtE7ofa= z-8p|!WIYgfCWH~@@RZ@-$g|nWgI%xT?HyN8T-U0^O!)uo_6+U4{oQDVs5gx+p(XLTvn!teIRq|Le`ll%nb6Cm)kM9p#s*XAUWO{{pnF3ikHw1`M&rgs#YkMr zC|{ErI&1;rKbZWS}B~nlKBtG^+ z;SVSm7QCb7@^Ct1CH}{;1zRrc7ElfF%m`IwM2gh@S&Plo-&drPVmJ&kvmw=>w0t_*d8{*&58wt z4Q4C8*x-Sd8@W}>629SQ8QfH@)S$(25Wf5Z+Bt>7V>e57GSHJ}J^IJf&IDk5m?=J| zJ^P$OuJSql$P3|B=zS5R%vNYagb;($x#umqo4cRZrSu z;m#4d{>yB8b92_wB>?ISwZ)Q7X?(fGM|OV^<)P2R>2nXD{RUlmLQp%_NK1 z-+ah_FUyA{CmHmP?8m`6&D60s{CL}wCh~cmLLMiZ;3(aT{9buAW~Ma3VVS-7p+lpA z#sqEh+R5FizeX|Idp9;)DSWsedU|-^z~X*thfdQVprRWZ#L(VsOLwAu|4d9Gp`B8eX?m55LYN&MHWSU|=k$NcQ@#@as6%c?f6v)Q6Zx~rH>=jdd1nu=mh?N*7O?Hr#LMU3gy{4j1;G8*?R=5eJ(uPQ|4l#1b^f+sKMg`4BK$kUSG2EU2MGdNH&>l*^hEQWzBqnu zpr}8Ho|4I-Q#Xa`6u-}FhbQwaz|`*qjBqv*^{5u~&)}cRyWM_({!o83g}M#B zmGmtWvGo*vmBxeoP&>#v+KSn&T!O1>n#f_ZZSczH3Hbc15Bgt<2K~Iz81(KbA7u9k zM9+^w!)D8xZ@qJm3X*00y*Z~kc{~%1+KUuYH=7~>tG?sa6ATFri z6|XPc$I|gAzD*dzBYo09^g~XRiE4JHHng7NFXjNgWa_GO$JduTp1+ovd@zAaS!euluCjfPqGN8{(X8QHrNJHW&VANVN68=ra=3OvGJ zZ7GMCT1!pYV9yd`v&7i&+7i0&@wy)7zdsFxL-1?7i58Eadbz4GKh5Q}^=9&YA3G!U z13xo164vGy@n5&ePcM$-RzAbY{3LgqR%g>QO^eD}*>STXw!|Nio=RJyUd zJS;NOe>gon7P!*&pO;a0Z~obB_AiC)=#GKX(3>kZVS(v80J>HM)TF!cRqo;pQO zZhY!JuM-)8gcXQ$E7@)Hd^CF6ST<-n2Bg80focNBS^HBjbpyXECUQ>kQZSi1i__o1 z#DuXDVLb87HEdO{mK?igK1*8=kKH|saNg4|%B@DnfW|D!nqm$7ZzO9?l1c>VQTVe{8p5HY5S{Njd=oaCf} zt9gO4$l+gBv*nH8<>WcAs=;LT;DS3pebSf_mcg@qsqDe;J!myL4w5~8^7XyifZ)Qf z{pKp7hnBnvV6yRMOs?!Aa6wHd)0gYES9@*^x(4v? z@h?t&MEIQpwv#xnyu6Yywu-%58H#oEE?_sEOH6gD2M%lMV9d{W!52Wa#|eiyX#n27 zO(D`6tArEszvNih(9e+*F97r@hDRM1V8;;$k+*+``({i=v)8Y++QI8XchY&W%H_aB zq`HBmfF$^%+ZbAI=!v`B6IlIUrP|juiOS<|+Xu5b{4Xpo9Yb*R7Te2h8ch+BpsVLp;pfb)Y=6;(eME>jkH&bS9mIlcyh97@<5Iv1+N zu?>*&`!D{weTTWPS`3COK5_HAx9EO>TM(OfgNw2HPVNJN9n-nM;=N=0YnIb_4Y~t2 z^P`_8vBgFXXiE1?uG)Ws{n4xvdI-bQ>Z^iRTG*cE;|3n z>C#7V7Ia8y$_W!md$gu=L`qt63RX*h{b2#O%}HbR847QLEa-WXTYSJuXO-#+scyK@ z$5fcKGECsP^7x7`)#eNIN-koAPcU|*I}&H{K}!p9id`3IzPFn0tu^Nx*7-wKju$V; ze9DL$8EGnRxsmp6Gc%P-|Even2uf3n9k?m6l8?T$8txz4&BC573R_vqNpME+V=AGLfG*-)Ljv?&nwN%TH6>F7tiegzLl`q4L3gu1mj)uu13p+c zTht*Jc(QNF5A7J`i@Ra4$tfV6sCn1T3fqs3!nFf?paphRbBaF#aV?6vU6Gb2G$g%m z4c8sj8n0|g7CMd-Kg#sE=sR*B2tLv~lLcw^H<0EQ<~?1(?-pKS-@I$nXS`9&?8`aM z^@6nnPb(FZw!wjxf3y9rgt3lwG<@0cL(C|}Rl8QdJKv}Ca_QNtre0_jvJne5=%~ZJ zHH48-IBlR0zc;OiGWEZyNPWQPHa;q?t7@gTpOMM~TJK_=haCl>&8S}C>fi@JS~UAb zNE`${9ttzJT~~+;nW+0s6BmKrTYV7vCUw^w6ngc;n6FZ;xLWGRziXlPL={Ne5r)_c zEJVV5PTa{w-O}2C&`qR;aPz7V>^3M3299gU{36f8xBEAgoBClaI!>4MKNSMiH3N*zZG4H&~_c^kq}sQ{`QkHh5?oN(T(WLgt@Zf!jW z-VFDI-X+0=Ev^E`(b@VeUiv;7x{Pyy1CMv3;C|AxjK+(kv9V~U3{z?b!u5=;Ao}m| z&JbqbyA_y=#5pF46CpZ}T$Jg!OUU;WB0HZU@pH8yMk+O7jWx6+38SSXcFi z^Mr5dNct7`==Gy>i;6jG6U|A>ag&a^qVK@wR~vlRdad-i)oy_oOlan!gSWZWp3TtO z$`SMyTt}e`Y9}VK14pki;(8k2MWGqt`PnDZlEd+0t#Hm2XLVDDy0o9wcG5LZQ1s#) z`9CJ~dD@z6pm_z$tdmOV#pX!(gNp#v1s2}qxfJFm|o-Cq~=tmZ+~-(7UJlet=$ zG!kF0HNfnQOr(C6NMB~rSb;Pr*l+NI;jayWyc3Mwoym5N+QYp1?B?Wul!dK_XuXW_ z#q~lbLcwo09Co3U6L#{KBTLxTqK4eISq0EF;+e6HR5uTE+^2~qud)-e9&KX8XQ*$; z@mP2vJA5?+3{U1tI)8U-Iel>GZ`SzKV!T|kU0^NEzXz}VvL5g8KAmdiFQYzZeKY(; zKZDz@0L3`0Ic`n)rqzm#R~w1%BW|9Ny(*#+CIwiM4h=->sTnj+|A`)faBhnqH>I({ zhi#;hsV-uSFng7XwDyd!gfBMA_|=-FJ{*C+QyW0YY9{;!Vecy-51M@|VmS)0D!dQjkmyS+ zPNnk(NUuBCCqU~KZPX{v!+`LC@kx?g-@y#K(6h}qi}S$wkvp2%kH%NldTRJ`m+bAa z^B8G6fklioBopBU{d17R3*<{Wl-vW7UNQg{XU>3>VYQ^1JN)HZ>Yd>I`P zE^6iKjsl^NS@rl_NVE*1^^b%P5iTm>00?gI(_6->z9-;**ONfL9}*uN0HNnd-wM4$ zzT-Y4pN|0*bgr-2AnZRkNz$`=Mf%(TJ@=&n)h8DGz6!hNj1}HM5&rZM-TP1dPFT|$ zi&uoB=JP~Y5cU&k+~oD+(I>N(O#O(01JhUJ0cn5mhJK_iZqm7+&w0kp2T*j^Qu+)brJIm`u&2S@wb~WtiK*kymyFE z{h`26@)Jm7Q(Fp!k^_}6B^;Rfv){YUUQH?I+8)Fot`oco*R|@4Ce1zL! z%91t+4GE%G$wLU8j;HR9LCTESmrOrAJ;w^0o5eE1B2IY+%-7wCcMAu>Ipfo4-qeyw zMUfJD3>3M7;JdbStdZ7TPBx3-C$4AU`S7Mlehe|0 zL-JK}n>7*&O*k=!f|HoA|7 z;uZDfzx7i=WFw@Jp!(nu;)|b>=*OPHW&le}>9ZAy#*H8U{>1EG`;amPXy9^A(_zVA zx$m2~0?W0Ye5lPVG?eS(6?Q=tnoW4GYki88qMfQl-c)WFs}a}-9iIG9ytf`><|V*A zr&r_7dbD2_t*7vaDFt!aabIcgg6MZBu!QhOXccX*#T)y;yKaY>=)Fs8f;3bsNZJDg zrwU#0Cg>ng#wQ&fb{lBz(Z{A2l6Iw@vQ))9FU~Jf9@A|H0;dS4QD6ksrN|7BJTz`I z(i55$a!=%oOor!WKO`L(h7R97Veaj_{G{PF*!poYP+e!UHcc6=gZeMoRA_0^Aq{b6 zX%;4oxDK~&-DBkK$wxL+MHbN887U93RoiX3&;2)dfljaLsup+*&g;0Mm}43jwkl{v ze)&ArMh}&I09vd#PkBlm;U&o9he3i%Zy-OU<#QSn-00~cGAcN@ev9z%I8H5modw$`8>p1kXt}*|ZU_9&j_!lBG*pR8 zx#ROZ;XQDB*;$yn=_L619|7|FsGRqZD0hK4IZV>lR^d-bjCBO!G$t~EkDIzOw_OJ4 z+uTE|?Z25GfCZOag`Oi#vx1Q}md;)r!bCqW@M^|9_jMJT9!@nq1TR8b0{Lzb{Z3;> z;ysyOhvf5d)Mr~I!1XZ_zOwRW3GD2~YVyHBxaPk!7E;@YkygZ{ZZ7i>?zi zZgtN=kLq2lZ98Z9qa0_ZgQhal@^HDNu52n@l&EiruZzVTJCa9+R{fuAHG$|m$}FiS zvqip0yeV05gKfN@01*vNkQVvJDqp;32iMoa&W-M&?IcF?Tt+o+ zg)Mu#p~#IXhk?0mF97)`APobyv4%jL$SFe=ypEYm=w9XZdV;@!Fi&V^%3I4szJWz| zli+Q8BiNd<3drNDL#CxOk$Z^DZPvU*6q;sQ=ukXUA9=P5MYX;kqCSD{o zF2A37hLO&M#sP;(50nGxFO{^eI@;?J2tQ7m1_c*>t{MiKe)Q~aw;CQ_riXQXUg1oK zEVTBFgoF3u@a==id{A*WteuC<*hQZ`+GWFSrEpgEw1UsenGStF9l+G9+hCq;RdKNxa>AJpk7ov%L^zSTCAS8QsJllBjQPv2y)T=9*M8f?M(OgzD3T20_h zEssm*4Fj>Qk)HZ|&2Si_=?QnFHE`m;1ngnfOQp}|;bFhI-oM-I_m0zWN$+H4+c#Iy zwdr)UUek$H&fbRy)hDoj2JMf&^19OZln2Y1&mp$VhFyyYMWfH=;P@$@uH_Mv%p%a$ zz6CSM+`_Jwc2vwPYio2~cE(W04EVid9nfo${tZ8UQ`tq@Z}>&Gy}aD7Enb}J$NAeM zIJa&3yJ4VWyNa;?v4y$arNG^r#IU|Q_D`Q z=e#&ECMfqi022*TamBO+(6d$#nh#@Gqs+#&b%x`IHObO3t7CB6XejNoxgCNc%W-&3 zeYs)J=4{~lVu-&ri|2oy3C$CoSjf>$NRL3ngPqGc)d2tUKtb=Ho^7c~W=n{(Jlf7<_N{7QIy zX$-c!5-hF$(;I?Ud0=flW4WT#ABS-lzRSv&jf@(F|6K~_*75ncR5u(lrWWxzXWZ1t z^ADlA89?nkz?c3$^n2mkFu3h^@EGuxy-aM0{WJ9NcSf-^$Cu6`|L-C@-rb2$-r7&L zy+QYGWNzVZua`jH-d8NA;~Q`v8-{I@|KP^vv24eWT|B?BncCCM2dwh%v(9_ouz{Li znBT_%uT1L1{+YO3Yk^@B%t?81J@7b=H2#zgUKcCxw=&J4eIy} zz}KnWkUopkoG3eV*1>6YFVg$j#7>1Et~=!r;+U;ZSsQG_`^_?E18UOY+lw+j;=Lul z+ezmW7<>T?$WgAeyoavuFGJSI`!M8GXVG_fx?m#=%xx)~?7E6OuYLxr7b~E+APQ-I zG3HAidXDZ5ol-;D#qYa8|1RlDT9bexW7Z&Xy0Wsl1aBTu%ALw+KVom{mslKK)kmxe zni?IYeLx1GOTPfLF#Ansbnp2eN7o(KQy0cdLq-Tmi9!)&hq~vvmB`AdjO=8;_TD2E zN`pwHZInuB2>tGPt_Vpfdt{fr_a^Ui`s4k)($D?f^PK1Tj_00x4yXE%sXp)K)Jy2axUIyTc(fN{bv<=Q|VnMn47z8Jz$E2e6q{9NYk!lw7bwcsfN>6-W zWu*2CIRWn$?v@tKJOkHEPY}jtXol}|7V#3b3ctUb;+ePp;QDA2YN~hgpKo;V+>e&h zGyRd^+D}g*oI>jtUme9g*>-#f>lLWcBse@d4yMbN%-V<0p2Og z;yPAKS<~OtKi62o(vwa|*w0zVRCdEvN2Z!nX0F}_{L%;b+2=U-wP+~vpA%294{JJM z=eaUpFrf>M8!$xikhf#ieigs%HV_=CcKiGslC_SqE-yUsxXyP@7zR?M3$v!R1?_^O zQL3qAD?cT(#kWrjUJ_g@-80<{o$?p4(8u^iq1zREQJ*{2 ztSJ!h@!vjm=>3G#Sl~Gc=N!EV0;d+3JYY2EsApr1vGHv|tL&THJun^!Ymmk-*U8w) z+w}Rz3A0qnZ5)&mCC16uCC|XNJAUzSUoGt6qr*h4Q;oCUhJ%QAHYr!eU32Vc{y~7(KbH0k zNyQ%hhI4^)Wql*it#B`=Jj6F{=i!;v7VJ?u1NC->NfRG616#L)nBbo%a)whKvIqK~ zSr1xMO&rJ%wD7^db6Wz91!+tw8&=4K&M|We=GnIrrJohUv1-FXSUtC2KSq~`J*vQflK6LO| z_-a`nR`|X_!W~>{@KGurUWJ(-+sYnteLS@24($mbtDSe;M89^KNSM#M`n_a5%=2+- z_${P)f!R}Z8R0$>FLS~gG>oQqZ$Hx+K))W~+uzNB^cZ18f2LKo5@)^E!|9#(E2Qf% z!K@Eyu0+JC*7D6eW~3iZfkFXaE23iD}=&#v*`u+8Y+w8Gy| zCQOxnrRM|bK2Dky&s@3)#?fi)a@>CAnG+;YEHJYL$2nL0@qzv_{v$CFZdjG$SIh0( zwWhaBIL<$tdt<=k9q2VUnXtzXOIBt9lRYe-feQ)>0e!g5=c#>U3(qxYB& z=Rx{1Ls?)g=@jNhJ$#i;G>+CMD+T8`~ZB8aV zFdxPS%p}ZskEF@*Tfsic#TK=7q@OYPp#!H}WIOIw zDU>tV(5iw{P7`i7LmD3nU1zuATCKJxEeT!=G+h7b4bt3p8i$I`+*0ZZHtCgoOtC$E z*FuH#ltj3TG*>K5bru?(#?T7A-}}*fUG=g0!+v_EavCa*rEt=A1=@Xg@%M>EVDi)u zEPcwL$%pd_)h$vTlg86UiaW2krBo20LXhpl()lQM-m-bVa-}$M)#92uxAV>OvLipr|7;`A!!JlG-?-mEpS8{ zFHl?@jZ*jUdro#hK0-rW2lSmtW91YJ2-fvN(;x<vrr*f@M<`vMw0?E(3$JL(O0V#~&kRp{P;h9TFb`@t52+F-d4aD4*@Z1qP4~##i5cneZ3HLFjuAaP;bt!Z&h?A8a^i zLUG$Jyj$PqRd@Ib7)9QJ_PWmcuF<_ySexgio9TSW|6&DSLrY_sH8qVCxe3Zz8@zq~ z7r(Ny9+>QD zbE|2Myn&u7uyw~>UvRCA=Y(IJ{8_EmdSI2#slKIoJ$#+=-VWsyYcBAgc%RPx&IX~^ ziA%xfn=@atxHr8M9K!|P&bd+t=k=)KLNk#5!dFr*dfsST>&G4kDcE>i4v@wNP2J9% z{2mgXfcZiP(%dtNLsO*O7=KX@EUCXgCtjwxc4WEL_RucKL>|_)AI?fU&Yn00apFaR z1H}7#xYpTb5Z%86ez{1zsVHNz5Cm2Y!6IdH%5y==>cQ1Ty_u{3oOCp=@j8=r+$ zGcD*$z@tjAVj-WlO9IkMob)AIRbCgICkC;I(^HV*BVXwCKtpu|HHD9AYrgTR81kIk z8Rd_lLm+&jU11ZZ#X(?3(!5PMQa1u zbByPNNkB0b+6M9(Xk)LAL#aMaYWxPd;p%oC5NEI9(i29?GLKCLQg4-Xd< z9KEmmG@KLO>mM0$_qX-`ZqNh@K+;v7eoA~uVY&kBpRu79l25|+gQTAn*hRZ-2 z7p8Y^N18O97ucPFt!>88^^U@(`42?Apz9e2sJL?yL?4Cb69-$Y2C8Gqk&DcDDXmX< z+MN;S0{M0gjR}l`e8^*5kPN%cK+0t#%}3hcv!kdn5hKA>$9Dc8?yv&kN$q0?bK}wD zfqDoSl}Gyu^qHUv{1VzQ;$ft~Wbt=QXcA-Whk@%l;<9y%sMj+K%UwGHdFR@g?dx96 zg+8cR(N*+J(BGgFh&sB^$PFL-YYg3t5((!9LgP~{CF&vYc5Wq1dy;Lfm-x1V)^;o` z;G^`e;L?*P6&e#B7~d7i+i8f)xxd$4iE=;@Ji2bLw)j3NynktJ{0aMjdO*St@v&1b zvWMuxiDQ()2ad2Pt*J_}Vjo7+`y%bW2g<#2PfQ~&ZxIhs{={*sHAn&RfGOJL7JT>-!(=1 z`zA8wFyHQVLU?SI`e^d9y(!3>oVd$ZX@jI$ueWgj#YUocq#kdZCGZn2G&;v4X}=cIGk7;O66%EB5qcO&4{5r;(bbUd zr}=p=a104cF!6E#%t%NEs&Ap4;P!rBJY82G*C@}K;M%oaW|5A4fEK9^+U za|p%_xPbMXu1J(~Ox$CFe;dljYt(lzuk}+Y&WGVtWL;=EuAwUWK*C4X`Qi$lzMmwo z70N{qNON`qk|qQ4p0%27{E739qK+52be6=pgr*U?(f1y*JI0Uj>dU$^{aa}2)CFU8 z>tn|^HnPy&KN8z8;tL@BX2eOHekYM;6TX|YL;}V>8-15hs#MZJw^eiA$H7)#ilT+0KL zV=ybAb*(olnpB~X_g1Q}&S#`6`B~R8N$~&M-;p>ZClks42v6!TY{^c1Tvku?LLsg( zJ>Q1F8X;-EUyxu)s;n`t7xsRdi!Y(WR#2{{q zYrPNY3>5zQwv8Vg%Iie=U!)M93g0S^bv#P_t#F_@M(UeNT?}8toeWx#Xwq z3d@&hJp9J44vP1FPwcjx&dB<88Izl3Bkvdf`#WrInBK;k2|EL8Hp8Xi^uDqkZmzfBxeie{y=8UZz0*5$ zdivC-=}?@!Xa~#4zus6!1jSpP}Qoz z<|#I~-3BmtxHq8Yvy|0+jqf*$D;>^cqEQNCGr{G?PWZaN<7_OeQXTRz{1lwR6_5IM6 zP*AB4B3`{~w&O7C5$db`_F!fHTxz-V5*qK=hw{(QxZO03duUg&9wYPl!lBw=LHx46 zA+@wSC4uh5RJJLs2_E>C?|5@T2x^5Ng7-`pJDiEft@0i`bml1ZY^4XmPW>g@800SN z8j1OUU+3c-+chs{U$u9F?yy}f;({I8#sCUkJba2q#WmbgQYV@hgd~SjjsDWRC~_g+dp_jOq<7BOTcB-l8pH*EuKjE(Z>lQ) zMq-Dm0Z4Jd@hhp9ec%Wl%C~^(4iC9W>P@EoUqfj0cK}`HC~+R6Jt`} z(td88aEjMWzJ1^f{Q2fM)TMVBoy%v^v!BJF;NST7XalJE;{&=`-h*z?>9CB)f4Uxug_fzH^KDR)>Qw~B&*5;ni<90!TP&9 zZxM6^Lc32!_2Yk{R@tX6ZR9qC&SP~4A1sVXVjUAV^ZGjVxzW)^(COL({A%IAM(t`W zh3k%_b1+J9@XGIS@QNu;vI~QucBeVbwOrr%4jbCKi%j3EUO#af{WoRstH}*9{mvYG zR%fZ0FRC#MNPRH^-w%zE26(qswGuclH9mkxN4l$~^X&Pi+h5r1`s;CAXeoZ|pMtXr zO|Y-A3-ntaCu*0!Og{wAK2JvN%u77ar7xRRVT)sDX(M43&zbLry=&^D_4hK~Dq;iO z(-tvL(ukkV7&EaRSmzrE+)#R(AB8t@r}48%G{)N)FngbGgdsk3kDp-awoTahb|>7_a8Hjrl&*O#cqVdV9LIBEP4 zBn+i}EN4Jl$0|-32B#wIaH>Hv?O)gtBW|C9+kq|uv)K9e_26Ou@hEc4_i-TKvSa}5 zovy$|yKzW4i!R&uGr}$S8)pc6-TZ;-OeOwcgx?yf8Sw2*&4+8JVeW=Hvctau-t5IZ zTv0C;hO#kqW_zRq-8-~ve+TLf9FEPtZ$i(Lty%exH0Zp!E_-rPOQpGx7ScMxSGj|6 z=>R|x4?JcHHw&v7%^$QVTf*g6K5#mFG)e(-#MN z9Dxa2ypigZ^Ri?{ScI1i=E1Zkr@3{05bb}`4FV=KhN5-W5VzI`{zb-O&-EX$&Nh3M z=9b1R!K>Ytj)dua)aSL>_FDq@z$IpPd#d|^?`U-d3?Pt8|dSTtA8KG!t3wp zjIeun`IReNrgs(yb3x$Lsb%!;X6r6U*OPU2+`yr&v*7ORfxN`fABI_1;E@?tpf^`x z$Mp6v$|+vz`Vi~nFUIVMsYpD_`Hx93`@93JtaAtik9YVtA48h<#!qdw%Y+q#2ZQ)N zdjDfg!8ppPYrNu`p}O{z5ph#nX!iXd@!%)EsDHSaPxe@Q02U8E2q9k@V!*aC7FjyM z;c9XyTif&{QtZ^bvx{-#=|U#8c*p*o9*f$mld-H(4iK(L?^&Q@r)yKt-e)C-d~=Uj|YqN)CG&o)y_LxL6Bt}_M$##T4GE5-qH>HGoP_Hn*S(%Er9Y6NEad9 zBkccs2s46=YGbL_rvbKHdI-NvTPICfyb+s~o`H88&r8SOhcV&>{NAyWCv`dwmaR0< zpn)wTzG84>2UJ`OW0f8eK;I2EcRax?_#PwP-@V^HOV9A93 zFmdAyBwd8#$Hf8hF@70vjmNEhh{lP>YH^O{k~GmYR&KurL<~3k`m^U1MM#(-I0s3u zsEZD+!JKvD6~YX{n)%R*&LNIxy7EoMwVVSnvb|^g5vs? ztsI%_K5rmy0>Tz>AODwq^wJ0nti`qat#@+LW!O9)2|K!yZk$<*JA`vG)iT9MLedMe z&}{!s-vm6H1y9PG%ayr*NGGQ8YumR741k~a_dD*{7R~6s1ir|Ix&?UYVk{T@d+qfH zY2V0A%w_L!6!>L#=(4~a>5{6i9&G;+Yc#!ay(W>1yt3~%f?G6;VQwofuwqBr$JQ|m zNbjQ16!P&LcHnj>FSY6m^R~3dUd?yWekeoWqkTjz1~nM*4zHff$8ihyGoLP;kzPc? z1x<&m-9>GI>F`iRqGx$AL2iPVPPc4yn2R{0i(>pdDX^-`3NGF*~dF^(v;awKNnlCOQPhsLB z54d)367JbX=YilUqH1z%9Avv2zjhtQ zcV8Kf4H_Iqq51G^7tD69Cr`37#0+}=MdPB+HDkAD#o&@I+vpvE;aIa}tI!?r`^znM z`R);*++f55wev&ca$0sDzkzf_F!-$sW^?wpM#3kD)@C6B$7zoIF+^t{kcLpG zw%O2sfjD~K0VMr~`&)T{N0Sv;zim&IG&uHOV8g6z*TJj6hFox^;}16=o&Xw`WOStu zJ7GHoJ8#|w-(DN29j@lEta&CNv{0w&Pwa=$RUkbmI0V}cUcpS~^1G0^E)AC-8gRxgQKrdmhhN1E3);I}oQR)4k~{FRXoz|RH&q)$7uht@qf z;UAJ`D#)4_4flFQGj=Tl7sQW)@Mj&U9!roskMwb|uM_DqoL+AP+jQX(6udB_ci3)A ziOwp|Zxs)H^fUR{DTm=@dPfX9jI%vspibv>^(aR;-3rt+gUPPpT;h1z}jCAfUID^$7vf??J5 zYdL!Zo%zyg#%V^FPhLdA%%p(=qwvbPLyW&1jLBcOa)(C472*RRxxsXpwe|6!VSe`{m-)pCK4^^*2ju5Do>#x8UiCF!Fg9nfs3jE;JDN zCq^~Qv)0;*Kf}e=0|*oBk-QeCyp?pO?ZpYbw5Se0V?xu-VC-iovumAeuhr&9m#hx(nzqn{$M%2Z#>VO6u`+7vYii)@;9@00iB!XxL{E{ zBQ6KRD5=czGYW4cd~Rx`!dUgmTCLlCCI`6d&c=^xh2!EL)asnlUhd>&58;RLw5Ie$ zEEm2v?5!zt_+W*eug9b5kyRk-Z&kO)_~QOe)^)NO8`8^O;IzCxV>=RO5azW5%?Hi| z&J%{toMxNWrNvk`OK0)EP1-6R5NUHuSCVCXEIj<=v_X71zq_ZPUR58!PKPCd{ zO!7Dt@X$IJ*FA8=c`J9+#zpYSjR0C_LSx#qI)HS~EQRI;DW||?T{t9kPbZC?0DX;5 zAB?&&Uht4Cl9z74TnfE_wN7A&UtV1 zUR?AB$d^L@5D!NE8u?4_Lh@71)UCtP(Y}2u#!WgQuvkrM(1`fW_r&F&H+kGVcm6NW z73OA~RHk^1h51trRQ=JtWE!`qEj9GP7JR!h6|%UrCvC@P=IE$}*B1%?l!yM)MazaMQ0%x9=jT0yfNk#NOBUmX zNFAZIk#s7{3s}o8satXU>};XUxWU>#qR*fz7|NTcq~TC@14-Wy{=b2M)hFmPe@PQ9 z5xN%_Y|LR)ON{10AqbxYJIzF;Xe^y5Lhj0cjo6}(PP6Z_qB|2Tl5&2$g$RD4Y2xWJ4Tv=)10fM zE5WE}Kbx~Vm^V$Ri&1Bu6E7YXnhg8s+bM)oK>5z+pI#;~NJ^allVy)+jpW_gJz57_ zQN53m{vggxV5CDGmRq!y*4&H%(&UWzl-2KE4CINpm<#I5;jQ$$7~j{NZHl)-p%;XX zTI_oq2?tR4jM+Db0gV+DY)JmcObr|mgw*Gdgmw(SwF_UJngscd1K>@@4gO)yDMmg~ z@Hbq|PKMF@+B3>gCb(3H0RR0sTQ?81nt$9u&hZKJh^8hdJ@2Y+++J2 zA`&)oxOjr}n~6%gR~p`UP;DQDa6)K)%`}S}(#?vMNPQm-aRj^PYKwD2qk#Gp3i%1O z#AiIku%1kK%c%d#sQ&`a5ww5j@h2d3Kj|8ov>hYAhhprcZ8`ZHp^sqUcw_mFR9{va zJ>ePADN_HDT0ni;+I}eM3i3>c(W zdwNKpO-PR{_C?BTp#C6vE81K1)<7hT$8CMu$<)&W%3TmWXzIt+_N6}B)42v2OS#Zv zZ3Yd(V($XNnbko0MD#3~&|!yCLd5-1Z+WNa8z_%HZbozGR48@zfv)R{K=e?^1FJft zw!q=diOT#uA6e*dp$EzHD#D{jCL{v&7%-*g2L7mX5+<>>NY|^qpLWd$V$01Ob~aqh zNOMTSZ_{_zdgymklO)0;_1HJ9+FlFwkny73ZBFqgy^#co&N34J1NmjR-?|C;i)~0= ziBZgX;s{R-^-7WO20JZludXk5l8Q$)R`Hp08{}+v|TI#Yc4|Q;Iu?cu3yyJeyC$Zc`JMq||2I!TrkR2{}#)H2D zFstt#u$cLYANHsN)pB3HX7Cbe*z`Hnfe$fb;c1bsO4p+Of1l#0H)XgchqJ4z zi}0xO8CLp?!r8}e;%Co#Ft|DrPTOx$Zby5-qVaj`q7yRn!S8YQ=8x!i{2q@UwF?Fx z=|-`80XmOk(DH>n*iGukvb@4DdQ?-itK10R+bXQi)UiNw4|5z$<#Eo=j$vyCVw0r_ zIGTDg>1Ivk)fdum$&USK9Eesh`p-XrN|oE zyIU(6+Px~o*u}r1RRVa^l$Cvt(`nYogO?m7z3(&-%<`uqIQ-Pr!hRaoZgf%`sxX4}FOK=W`bUbp?g zbq2k}W6L_I#;z4O@V7SH*?SjGK8}auw^kzMv)ruV13Z4~8ymA^FZ-tND(S~ufur?2 z!FszMK4Nx-r|tDruPdX#zhE}>X|;#Ve#uz!j`l#G2h-}^uy17_nAxY1l5mp_|CA0u z-`L6cvi~@=FgL?lp8D8EyB&r{o`gH*ZLsD+9d-JKiLh(PcRssyTX0U*k?)kd;19@? zC>{#U3tMMKYpSQu#Y+6$v{Yw^HUM zeqo>IZu(vhFAZuPLhxVMMxs1k!3%7xdRWVEMI3AXFdaTer;DD9( zu#kUeRR8Eo&#?M;yd|}mJP;mj52mw)dO*N6A5crIpd@i6r_U(`hR@;PfJxA|P8zd2 z+d%$f?SYOCF|a(-8e2zSlro;#K_kdg(C9Cx*z2UV zy}d%Q-UmKLzwu96Q@PhPIzPUZG3DwLT$*79Ezh^Yvi4`$zLm#u*N|0kGDX19MRR3qFi!VZS`-sj%}Hu28kt>B$$I9A+Vk4tDjh>be5 zw_0+Iw7R9fOylLRs+vMrRTJE$WkK(-=kvSy*O--M4l_)owSWujqHawS7O;IAVZZ}! zo8C<3onNs%u|A-kmBvl0n~7S-o4$_}wd5cUTAhEEsg=3(4CNJ-kSa0 zVGUp7-|*lS-HA`8AmJt)P4UA(`IvNN@=!5;bwmCY$;msFwb|&y-#ku$p-+;;e4yTj zN}w7+ijDlsNmUHT#A4m&U3uiD=lHPTCDVD_64#dXf|>{ZZ2#mTaOuHj_@P-u@$SX- zwajJPeixLsI$7*^cpGT6co&`=^j7IHm7e*Rv}Yyy{gCidqFRI-d(Oe1$->w@4C2bucbjk=$7*BZFP>fArmNGWfNaP`A>ExWqd~pJ2 zRh*&yPk*sTbqBF2YtAu0J&AkiIkMGz&R}lcVn%aF__Y$WjegQRXF~X&AevX1C(mHj_|-k9xjSN z_kSkndHgQbe>mW>1R(k#L3)zu?DB|1mMgYX*OG-0?UL z{ND@{IL;TeFH)9grqJF9fxK6#9SW|n-*AVwh_J4xT>S#FhWFP+?9EkI29SU&{ zP^}ft(nyxfE+Yf5pKAXQC88huPcvGpb!x@Ug&kp-XJW*@_xs@!mEt-(V>I zbG?T5yu#V&v2A6h?*xZE{MnmG7o;&`S`Gr$6jmkuA+GX5as9KgkGS9i2hS~}leS`) zRgUg1^RwM)0-KBe0oEf9~nnM(wSY zfKA>{0Lo)V_r+JNK7}ENlZmsQW7|vTS>&eK5Mz;rXFUzr7-b2bZQZ_rbQ5W#x{NI} zV5ENp{y8pOY5}BARN`E!zd#t_;YVjkJ5$`Xl?@)7u}$x~NY`Q0NGHCVHVazr^ zD#L6?OEsYGIV_ACiqFqBhNOm7ykKW1bP5TI z{9g;IfeLt6nuC;MaBJ{qY|`F^ugfdu?qxky(o?v>+#D(PK)M6m%kp?*Z)@IsBIE0x z9Tqsm^m3ix`Pm&{vichUR=pd~ zTb_?Ysy)J~se;P{_X=%?>Cu<)^`H8DXqO-GYRY9K9_Cwa%*ChSNl@9l0lt}f7wGd$ z@VTfT(ymI-r?;YhxKl_2UVrl<(j$Fw%Z*peV(%@@O51l39X}V2PtZss`|ie1buy(! zZ%6VU2IaVPplFB0oHV!C?(unj1f;e$m5DO z!#Am;9CFxFjE$4NMfTX1ynn4=Ynqw>0H1G$5~aVW3P@nz%Bw5Mqx?#qZ%PURLs%tAT~JgStD4pi>xEVbs^yP@1As7!_5-B%;A$cvK2?vAmWO+B&q!Op|p6CJJ#Y!zNkCEp})fyHXxqSll$@`Qo4{B(Hl z9V}bgmR05r=7jhB`r2|n)kF&h{@z^cEjPUA1B*Y>bHANw==tgttNFZwbXjl0^lT)Z z0~`A`7dVg8?E_Hon_H)9M&nmrmskT~n$xmIuX&HDx1hsVOWF1l?d3LOG3ZXKs`Y53 zc}e?aG6VO2Xg}mD%h*`W$^RkcibC34a5D}wYod}D5ZHiJ|FwDSF?%EDQ$`}`CLoEDpo7PwxpM4Z(KB5eSrNP21-s!W$vsAtMby{yPNUnCPhVvnpat z*PuNWGC_Ffrq=GH8H|Oe0sE&1kvN%~HQmH6uk4H3ZV!Mw5cvaZ@cC1h-F(uHt@;}# z6<@y0%To1~OFOLK#$P%c`BA-EFC#eewplY+-@Be#cg7oN=5mJoVT?v-lT7mjPB{wu z&k3(}9FmsXg2PKi@CT!O=gvzL`F5KJiqI-vqobI(|J!D}p}O8xz9YL2@3y7p)7SPbT4VE(ly}hOIdhcp>Zh&=A@lhvvv#W$P1k$5T2HD ziq5!v1EtrWk!P(CItHGt=qdC+r?El3*n7CgbDO9UN8wfC49YO`MPDQxt3IlG9tbZ{ z|Kf4B%RUfEFAMzw)JNciK~g7N2gCBt;rF%@@#hYSbmB?UQ6P=l2|`PseW@zMIfRLs zjJONP|I%j_m=QAywuCkn9EK6oW{94H&=Zc1m&^Hwn49d2ZeK<pj)fiY&U1l2uh`Oi0))r>fgX@Hd&e)ly+(RyHWD{dkE10gO~znMDs6nV{}&v~srSP# zJ8UH0M6}re8#Qc^&z*-7xiWES8VAr@A2@f8zyOlp_r7vKsbf zv;tgn9#Yp{lnUq_5HXLW9Z-0E(r%1=dTmd|ux)RZa1W`jfa*%*sw#A2Cub*7?`Y5` z6qI69Ab*XkTW;ki(xb3vc0T@fDZv4*BbBQICbOjFhZ*^3lnsW|dTYuXE_#L3hvIgX zHDEtv1>bx14i_Fy^c<)cAXBf8^ijQnX3K3D>2{P}pA#6#zb$NtRL7*5HT+brtI(r3 zHTxK9RT-*cT+{7!AT!^KSG}tQ;tPf91+5BZvaj*;QTYEI>#mTFHo{r4Q!vG6G#=dT zNP0Aiok(vXY6ALfnh6E{hN0orTgsl+`&Hj{w7(4LR6oZgp&O)tq+gso5GyRrrnu(g z@A19){ROnYvgSP_FUh6XZfuUjUb?Smoca)O%G8j?eStKUiA?+eY3sd3e}?pwdu{K5 zt|@%4LcI%c35((pxu=o57->gGdJfqYz4SD-{S(o{IWKkKeJhGU^zA-eWH`>bQ1mv` z>Uv&qV0Ay7Gs*}LX+7`%-&X@3goaTNc%BSpkRLz;pQ+T9naKPx|@_lgO_ z36E*d-_FnQ`6SwlBs`H*ED59RK=ifHtr~;-x#RUCJ(2j1uUcD%#D%rJ8l(Ex7-0)M zwkj2#w$@usTBX2{J+3HvHwLtR=S-g_0v~ueJtwV0ulkX%gpbdAVbRgyIPIx5#<%Y; zQJnGI=4C+K1*F5EX9o<;k!a228Ft9mNA&o}&+fdQQ zE(8z61Z;re<+5~Z{W#Ghf}K$pAYo}T2<#B~cIs(IjCp;YZ-1z#3ZGB;iWzx>fV3L4 z+(&tF=#fme*OlWAzOMK#7 zBy+kO8 zK$F1@*`dK2_Gso2&E;UwxQ#S}{8NlK7~e@QnC1tkf4$&SY(~I~oYiQ@*TeAJj;iG| z8)#auoWFixChLy+s=S~z1nr(Wp?SKj(zUr!cTe~*#|keQ$HKUCCDIt%P@I8EyjvmSDU)=>?|rK!5OK{0_HgEvEio+;3J;xUwc+p65R1zH$p@qSrj zFsPv)G$=2VuHRU!G`i@Ey(W3X)(Hl~P|50z58LofO1vvFX5o7OiNJjS5oi}+^!i`;n| zhZk!Pv)t3PZ>duT=*;WR@5j@-enSn>sQVT6;En=e7stwDr5iZv=2PfCxt|g?`!58! z4(EZFnycf^4QBhtkL8Y5$B|--f9oE`trLQ{bTbRy*g6tlorb=9i?A?jD1JYf0=oX2 z;p&=tbPv;EyyHAfiRuSScF>+KZc%u#MIh1~!S{pKa3aS5Li#;EVfic#Uc4)ZHz%U- z$H)Hgv)f+Bh-w*A>py{!CHjo=K%N6tY)$nR^jNx5lT^5u$Dh)H5yS4GQQ3D~elZc& z86?B0*GYJ+X6K1huPyNX7j5}c&M6kMsQ?Wc4~Wy8Q~Glmi~PuL$g=RefU7OcB~CEo0P=fcfQ2My;MLV?&2D{S1r7` zZ4Oi0dCT-4#V-qY|7;}t?drsagl>U0_C4?l%g1yFeR+Kq?K6F~2seyz0^d*-#5|h> zhOzu%dvSDg2J_C3hU6Gy>|PWL{twT?#=3pjq}hh@{JA=`MkkkFx7CJ=xt-zLouzC_ z*dhGa3wV3jrF7 zY%)0*s}2N!MgL#YROckZ2jDK}ny54XeU+vkXe6(`vjL50AFA_{-?3i@IF!w32y_iL zzxguC(WB^|XQ4JIcgHE8{6KAYi}rU5!(X(X;;c;ww_j$1F>RbNb&(1$?GEryot{c# zla6o^qxgvL(&3-Q&?Bye`dbO*=?h13`kh3-gZ*Frh#JI*LG+wyv=P@lod@^wlktIb zbNRou$I-IT3bvf6#GE$YS@BDEQL9psgOeJ$poiLNt0_eNu)^|FpA~3-ky8$HJN}1z zzoETzPrsnKOT)(X`{LlE!Mt$r5@gMF_^R&VN{4ox9p+4bO5gPwJMXDh4sWqy7v&(F zI%1C0_f|A4>$Dg{HaP&rjj!Ao1!j{hknV{MFgl0x?2aG~nTSmnrm``<_ZbKJ3SO&lEcpM@^Jq>&(J|&WY#Kcp zY#k!t>Gmn2uK6O@J$#$)YP=J!5AhMJU}CtDY*}~^D{h^I@>9$B^x-vZo?ZsO?mGhG z{JW}CK55Aiy^uGU^N9_}d@ZG@=lFpeexe@b)~CX0Px4ezPwdA>+V|XP0k&Hbk1Yl| z!0YC7fOr6Bzc0e`9rwXxQ#~+hYXJWl-v`%UpGBb6d(V4#jP7uG9T?yJ_mdumd>GZYGw-e!{Q;qu$^3#`3O?4w_qJq4>tML59a(P zlAa|tqz=tpo?WzqFQIkn9ixV^8qI!G+MkBicmAT&kY}}XHfx|ij8~^MM;*^I-*i5<70RHVtq&nV%c3ZM> z*Vsp}>Qe!(sn(NEJiEaymg>Wi$;Sb2IIs(qEiv+HeR=i4?)Xo?AJBO4!V6!RDW2Ju z2MNr%~2>^|y(RBXWDQUYFO% zhGuh>R+syMeB%r>Y|s|-t<}de!f{Ki+%wmiCHI#8uwAIK`QT&E7z<&P5(Q9Vo{Y z{j^rF$D$K6s5mAO?{I?&y9J(M^Pi@4-+cuB@D|D)r1_SudQJvWKi|6RFq%i+b9f`l z1v>wC!GF>g>fueB>By>0Qn6pw4Ut~^c?Z>{i zOw_0A_Q1oV$MM2&j@xv9ke7SL#N3U1Umt}YFl$pvxmK5XO*?~)qMFn5n1(>H<>wB6 z(^$IuQ!S0-ySv>37sp;w>hDS9F1hWsT7O<3d7Nm!@ zf$|N1kLd-Y-yTQ8L;UG9jaP21;a$$?LRoAjW*t7swdTiy#paO$O9_uVqxg<5DLaI& zQALc?_S}LME~g2%4#MVnDO}98#OmUJ%z1=0AxL9|;uYzd+3#INzNmyvC~_+&{h5|QI#=T*7mSgFClVVO7g4d-|{9@V@^Lm#+LjOg)D03>rUmAwQ)$G6@U2vxN ztzCVFi=0!JnH}Pzy>?>jiM{1Xv%_k2&9AB^s(xA=+`dQWdhSUQ^UhA5(^IaTkEori zI{MxyO=}?AEE>%E*uNAt$zJ6AkS4p-1L9!3=0$yq@BW;|NVzZv8=UkPc+2`&CoAoi zn5$Klm$|6((QBI1eO+W7+GR+|ON{7jn!h4`a{e$=Cb*CAlHPH$2gkyDNF0HOEz7`! z>$q_z$OCfJ0eL9qGGq{(}@C&BUAk+^Y=km`S>5Gwo--6$jcxA`w-=8>nA&HI+3wx)pl#4iScNn1{gCys8fdeJl0hx9y7@HufSMrW9-Ueo&XE9Z?s zZ59rM7a;Pz=L>thx+WMGA3wp94?W;Z$_;RS^Upl`N;2;mFj2&inRNXtxLa~NgIwsE zq_4AZ`D{0&JR~nLNoaj8H0EnBSt1Pwr?w8nv|qFb!yjD~I&gR7F^H&Eg?y8H5nYr zNr%+xuoH!z65%xr?E4UfUg|LJJN%s=2yb@oLcv$05rD>oAq}E{#-+}m8-VYQ+Y!z_ zr_bNw51b>3Uw0yX9e|!kZKS&2| zXel&S%AUkq_BQD* z7o0}^3GxCm#+sIf^!|-hS9h_6*#0(}hgSiDED7+qdN{RRmGilwh-!9tY zB+r69iu*0CG*#L9syHl6)F$qv{cu_gV%NO%RPWUplE60N1BmMSiIc}+qq3`jFoQpy zF@XGjOFnm0Po>GmN~Sw%1(N=ODPbMaX7B*%?9Uo-n=+j|MFLK$L;aFf3p4?(6YyC{ zFQ8g+n(%rW3XS7w^$vP<*p7t75@r`V7g>VUNZd&HDAOLi51W+-XSlPC6(K zt|S}6B3EPKg#=zP6AOF1>Dda2D;x#h3(Wn~HCrL?B9%0r#e%;K0FPTE$s3ImIVNzF zkDQ)`gYJY8cVFNY)7#Nn@({doa{>_7f$-e_w{|69QI=g>L=8~UKua=pa!GN4Oig*8 zGa(8tq+$rBwCDhXj0_CU3@FlqrQ|{>nz&(xmgdr;mgqcZTqwgz)NuVQ$|aK)%+w6O zFY&*hcQCd3{_p>;>$j`xWtR6@&biNh?sI15eP>P@(e+Ph-!T9zudoog7cRl*MF$=4Y#gbEYIb(=Hjb|IQ*wp?wOM%Z8>y-lqM7B zu8MAcKg-pfd|BcBRKXVRvi63mKlsX*Ur|8DgYwB&3%UD0g~EnV_58hyj=5I$T`QNi z-$k_rKhUJOV#=RUK==I?rS}=;rk-cyVLG)UmnLrAL(nAh>6l7t{=#71Hsf~!Z{s;5 z>cm=!IFSv1Yc9YWxE8ZfUb?)5J~+P%G0{cW4~i#t7F`o(MqVDE{5Tuej)Z357rz<0 z!~N47K2W!hwlzN~I_-3^s*_(0%91bSj-ze%tvi$kRO3Kjt30kLo?)Se}K);gT zw&{c#j#5ipt{WxirQ(IdopLyCc9qY$p*tn!iuH=t3PW%MO3bh)=?M<>-=zM$}Hcw||`0_eNvX z$esAe(Tns!m&LSY`2)r)ADmD%gIp-XbZvTJ&|FfOL5)tM=5FTat@H64hf(g#$DiTq z*0G8wjpAIk{C<0$T3l#qVEjeFE1+>pY3^? zd@NtN7I#=L{EJ?b&|Px&x(6Bdlh7(u)96D^!F^WVv%bJN1zCi?k+F8{${mA7&y@E^ zCQGG@!L!u1Ut11*&c+I3=wT2z*{HA(I&&{&e{fc}&FJF?l`azh_;?HTepnvZK-qta3g237q&@fEyg;9`^k){O;|jI6AEZA&-kCQ6Hg) z)rEKGe?r$j+r>H0^)#NF`?WwkyB#kya8DkyMeW51U8?F~2`uOwTGj0%dT&Kj0-r#C zTopsS7NX9@{bXMIQ23AA#i%n0xq}*C?Ig{gcB8O9H>B!&71h4U!$v&>4BW-jLp#IX zha~C(@{0RLuf@?9aVh;>mD0woG{eBKt+3m#VdzT{IGC!6&oMN+`?>g?&=|!yr@7MY zn&Mz+H#TZ3C31ko+Qgd7uKe^5(@3oceI{c`UIML3*v;sraeC}9J~^qOQPu5-~$djb<}q*EN5bm(DxBgHBMt7k`l|7pmT#@)0x`G{^fiv+)^K8xlATeX|~f z{+dLtb7l01R6RR!G;j!?TzL@vARkx%=I5Y0mdi`8KC1U5KK`gTqqhTW&38km(B_v$ z%Z=BDNLq41gD&K~Ee}Db|L(fK-9+^7j=7*m7%?xUa6|Nlmz4eqW^a!u28B z7E(#{D;jDpaEGP=8=~3Tq11iCVx2R=QNTzmYWHFoBd!#dN!1v@4Wl=ty=-}0JRLNP z8(&=`py4#|kSGeVQ|X*WtaRuXZ@eNG{=PDGex)$0RVK zdY2lsIJhL3f2=u6N2jgQY8v&E=q0$k+Ak#VkJ1q63sh5FY)b;?4tV~qZ7!wlk;in- zy*Rao&{N`hYgy?A)h87SQ%d)OW9WsS|0(8H>}KQ+>Nf0Sm47Arly0T}EZ?*s^r?+_ zKX;gMQ11nUE9iP|1??L43qx0E?w@=m^q9aLGIz}^EC zJYozw<)qh!^ir`#%hH}!+F6txPNr{HFH^eA{qx>mxzUSWgd8nqlw3lO=KOMip6PZ#)jmS$D)dP8KC|j4+;jSC z+2)HL^8R+G&@;Ls_ZH*(dmpbrj&Fp0E~nuu4iI|BN;AlhV&)6^EswXr4H{ z|AbKE_bKpaOXM#!D==A{3hsgNerE0LeWD|JrPubv8P`Xi;IA&7=J7M;(vpb*{7Bta zS4!v_*T+7`WK}|lJ0h=^=hQ~CoRx)I6ZZ`68%mbQDIB_P9lx2@(Ad7!+iJh^XnZ5% zf=wZ`c)>NAR5g%xmG?0|=e?K9!&l*2X7{;5`hG`GMlGcG*N*3}eMa!o30L`0LLX{a zT}3yt2GG%(QgNu%kNj}W9~u58H|~J%*x^fiL z%(9gtq|nV@2S)G<<@@P3bC7%Xx|v*9w$#;kiMMz+e7$(N?_i$mJ&?UBFLT|511zr1 zq`p;gGA=*N-J*INZQ66mwSLo^oO*eK_-*54Ev({wUOPEO-qXmJn)E9aafKoDb>>of z-OO_3bsHy!m-E)D)vgIXbvu5*@5yT0_cZQ{ZbjIO_%U;lR>yB?-Ei#_|Eja}g!d77 z_0kjEvwL$oea1***R^pkNxO@G;SKci{_L<#xepk*W)Fp(c#E(fzA<^Qu|*NSyI@`> zum^ssWF)mKNui1P9|+i%hE!~H<+R8B;V;a^n%dCnSvM&D%oXv_mivvT`o2LY=k=z| zn@3S$X(xUte(wNaM63$L_pKV?+Gm};jMfu{RF&{9&D&h1;e73%XST|c!j@E3+SnaE z@gW*mFo!Z%JV$L;zc@hoNL*_~Q#Mbccf*5ewC^fD>%B7U?kO{=Thv|T;=&)J@&FCZ^_8-Tq+Q;yT=DA#cyiy!2c|)$L-OathBk$w4 zdhmhf75bR$zUi2Tb?SKX3jG}R=;FT7=Co*Du#)Fx&!B(~9gUYeJt>xKJ|Uva-_Q&E z1TXN-r?K&m;Jzh43HX+Ne)I}IUP|2RY_RcM`I~ZL`)Yb)zZE#!uVIbA&%0u8?!BD2 zZV?Txdl!D&`8~Kay8L!ce%K3<&<(gyibPl=D$_Oq{_B0N!$q0MNx2ZdM;)7J^^Me3J#FenU zTF8ah2r&*@9K;%yu#8?NkH=Nh{E{8yzht2pR@jHtn)~~%r%&U3<)Yk;+V;$@uFA}n zw5q~Ko}NC%g;=Ao?mj#q;b-3HGm#gEZzaDLFR3-k4GDvc%d#d?=(Rc2(`=DfV?t?J z)+vD)FitOACHhr=%F*8A>Fpv7@qUD#jql1)WslIB72gl|9M_rH8rqmz4fJxauE9O2 zgYYJI0iB7S%YN}k#F^T4@ym;d$s>v&JU|0#3K*(eUl$cd#iN%S=w?X=%~ z2Du}uViCmhV$r9JHK=@}RY!*NyvG=4xb~9}|pDT7v{)$9#FCB;D(hP{TKqGL& zL-Tja(y}>xtacNppUszzTWyiR6g6C3K;TPud-pWPpK*$*t!D8LrFkR@w=0ec`}M0D z26j|_)Knhbo4HzUnP649S5D9GPDkT${UdNzY{i58LG==PHhPQJ`dT2pQ#g=*R_^-c@r17UHzuZH-+8Lv~nd6y{o$(AaI(yWSw0_*1|+zl08 z2!7`;%x}y5{I}?Qs+HmRG3XEKPDgDoJ;3J zjtcMqPmMWErV9<+z`bm%JtA6MuAsG{bLqZH3l*9ps4Q%}!aeoMJWytat_YsXs{rLmy_9C*M8(6?e!? z;$HZ@hM7o|NU(kjF)fqN_Z2;=RUBTOM$4t$at`y=kJfMfaDFJlWKUxRuVlWQIoM z_iBdFC+&C3OOyBUEb|a|b>uECH1DA!vwoyc_Egh=4vXmS(xbHDQWkyFew#!bNoW)K zOWZTib$yh^lenaygq~8llY)YtAV?)}bP9JZz&(>@{VI?1tP>VKG@s_TsJ;knrD{{RnP zx03o4yvjQ_4>v;h!d6QddCN5`Q}CP>4oWO;Ply@gjF9W#ORI#AbR#!Wlgt_dmk$6I z1o%VgC?oW^u62QDem>|uhW4U$^Y*%;-FNYokkJGkE?|4gtc|0xlDD*bqECi>>%Wi> z=i^$ZL3g>EW%uFt7T9!uw5=WkUbGSX7xp>tP`=k*C?BEnnTk;|)~0Gch3FA)T0oOG z8CA~5-z};2h1V&hZwiM-A5!&z95pYMCsaJJ1Db@}>}zTKAt9K?)~fSy?b;$-SD`A2 zZD%IaXa2?9vADmAb${!6;9hOY3?qVd{N-Bt5HfTK9%2) zH6RG6@zVGmWG5U?Ymd->^@AE|NaNl|nBqXEbp;@#pr#WnQeO(dipRPEP=i~D-XlMCAeuadNFs`bYO%1+o#HsUe{gTZGT;OK+#EO`fEu^%sYyTNBGV~qMt@?nxYhXShuQ12Iiq8POBx*Ubp17M6qlr&; zGE>vEom^4X#{JLmrdnt*?nPa&64*QRz|aBc2mGH-AcR#{JIMH@{DvYwbM!>ZuG=p4CZ;zGXLcYy2arY7L> z5?<8)h`x@dX^--!wY??kHJ%@qj#{pVP@IAqTuv)nt?EH;UwX&|P8ZO11T2LO?Cd72 zg&IwnqjIeP=45SPf1|4JRa}4h)l{m?Y)AJ*CouAmZg*&BH)36Wmo>cZ-a0w|a$9y*zt5=08M=p%8$`$OiS*mXA0+BM)rW9_gK6T4B0e{{ zg5u7$bR&1{$mlzgYXi~yj?5J=MV{Agv@vm2=`60OenqMtLhrQq? zJitNO?<#(U{_Dx;D+t7>!m3nSeq>f1EB$OZ@g5^@p$}n_C#z>m^f`>bMr!W2!_E$< zYd95iO_I>`5?n=RYP;^tu3IkJC*-I;ic8_$H+-@L-U*y5RO~>5P!8@>|83CAG8p$2 zfu?0qI6y9}lJH%Qup`Wk!X?^7B;K(9&VyG47RWu>2Y#$6KMpFc0+i#r+bS+`kUUn>|oh*0wo zbfjJz4eV^><}=>rk(Ec)^Rmm~JWX7fPlHAm;`an)0vsi5>-=eg&-0vh`7KuU>ioKv zZrG4orp$M#+K5H7?royMUgTC(460U{C;WoLY3)4V}%% zd7E~9CNAl z!3NNUPK9^Af8Ot5_j;!@_N(duXrOO7BIAz4lIxdIkDo0cCFSb{Ey|r3M8Z zDR}e>q4ET{KtNxL*=J7iPq{uu^lVV~oJOB)cSi9x)ihJEF=u8dn0RWxn7ayl|4K(HZ>Tht#hsb5a7<*t~#aIyf8okwdv2c_>EQo(6@4J>D-e1 zYMt{=w`$Osa!BS83G8V{qvw;-+Ri8+I=ePX&I{`9hDM=x&peJE>`VBluIV2KqmXx951QvFF&)$8((H z>p7nD^BkXP>N$R0e;m=w^LSPLv1N15@?fcEg9xy zgC!%`l5I)GeZ34*Q*G+yOq1Pdu%#HBsb<4yliieIv!~@=Iwdm1wB zHq33wm}HogWl1(=B$@Sb&FPt`CWmFZdO@wilAdX^JN1{bE=z_p%c7>y-|MtzIh-Me zh~#AbIg{0z)ANoEJIwZMGd8XEoepc*>;|XJFvgT_h_z&6!9B6p6ti8;m2I+SnG&sL zgCi?b&8SacHJg&nc1Nlu6SFuBwhZ%4lU#(T&xgpWyF!wa1!a#N# z#=|kmo|R;Q88Nqdni7#FXVs#ZsK`Lbmx&7XP=d>}g2LuuaV{q$taznk{xiB5XP( z%j1hATSkf{S)nM|oNiWN2r)$cul|8kowg*K)zR~hg{Ih&vK#;jeC9AGW$DJsv^jK- z!7o^Ox(RN@|7s^TI}C0}_Pnj$G7jDN%5urrm?;Tn^f>0G1r?xfbH(j$_>a=GM90KNMvO8Hix?j@MvH`9qOo#QhGCc~ z2Y`dmO$JAj1*Wq&JWx^qOi#q#{!?`Q)g=I#*^Ytq0Lo0waafW(hVys~3x_?iqgzgj zOGVI`^oY9^qEl`5G-cwc7H6u#WX0kPPIFRfhRtf5gm)_l;f%kvkSW7t&2d_ifMGC) zhXCy66l=YaGE7c{w+bdF1_f%Ih+->%h}o3etT2jQ$9uBLY0{@sPpgH4oqzJ?Z(GP6=Jaria)ieNrsQl}lF5mIm7h(?rc9?PQLz{pLXn&$Da&fI zTXPgA{gu07%}H>bViT-0$B=45L^)Dbpk$b*rr5HS2^=671(6ID%2QJ<2=#x@2FfOO zOJbI85{Cs4Oo27k6gNphZJ;X%B?aqsI_@NcF%csTvBSqk#YSkixT~H7a)2pMTsd>p z0q0f%|}iKRl0ESJ^02txUySRt7Ag zC>^e{+tP2Q576y@5i-gw9->h!tm zV*&MBS7DHBHfQSSxD`Ko5a@YHIS?aSGT>GRhBap()Is-VU|!kV_7_O~5ni_^*gw&h z3W;0P6{6A<0O3eA*)u(R(+9al2I;0Wv%+V(?juizQK)n(x8ZrjQi{cFO}-OLqa$J? zM#aRAj2K}UIef(MxQN*ChB1%FM?`9HyW!uys-rE#U`7O)4U+(XOyCQ#ne3qxg$HD5 zonLMSu*!2F8pmIZq09`1M4Ew?fDx@($*^91Mzvb7tJ_3NPs42#-t!Kc?Wr5&Rz%dh z4^B~0sjL9{01#AYCfY6L6oo^(4H$!m00-nH4_?jFkeIM9kI``l4)bC4d0HI2<-eF%_kH8ceb|(k)3!nCL6k zc>!>N;&Gcc@-r#JO9aPpVg?=XaUN|q&4v8pE< zCub{#i$`WtrY!?PTdic0*<`@D1VRDZcBdu$Jzg8bX}w0@%)I0L0SYV}KBeQpo*-6`qh1Z! z%??1;VezOd2zY}n(WUGQZ8~q5~LC! zimgBbAj@=o?tiU_{dRl#bq;7~NjBWL`Om9+69egm&)A089-j`yTW=@`f`qVtZip;O2SZyY!*1KPyM=+Dut(igs z{7g=ds}=fM0MxSHCWP9YT>`P(DLa*i>of2pMd%W~FCD)jtks=+_`1 z*3Y}aZm)nw3%q7GZWGXPa6p7#xL^CfoEc%an{xg*vE9RM{h9^%`T6)Y@oVHWFrYyI z{_^n&Xz1hBW=`Y(X8JLHjq>i=?W5-Zt?mEI{IzZWoB2ohHQe1fz&r0$6HFc+VDuCJ zaq~d|_xiQ=3%u`cpS)%Px2#|YXz<@m9Pig;_sqNU^6yexKilsAW$WLz+gs`BKfU1T z3N?s4?0KA5|M=tj$2s+njYmAMzgYjcLH+rA>mT17Z&&^MZqy&uS&j7fcsCdkF>3Jt E04lcswrOdmyUm~L4U5Z|6H^FTrd8)e))5)TcYTF?fzU1f3Astu3i3*|2aFl=-k|0 z9c}G(#z0%=Kv%7;&ROqn>mFcmc64xY&}$9O0eV9~phKYE*506ZuyuB|53~)?yE)i8 zy16^JIcoJ<*8qC6y`wSE(b?9;jc(@bsyEtdo#+oYgHh)isCRdD(Ym+?IJi0)9Nlb< z&Q3a8XPu+oR_Ev%XzT9k>gMKdaCdXGH@Y}G>U1sv2HOCgqrukM-d<g?#?5R4k2EESK%_+dqpw&7$IJmiK>Ev$401Azp z1FaRPb+Oe31n6y@^Z_mov?Vu#lhJ{qMo$}U4Q|e2Ev>z+&M7d^*3p#`=;)w#ba!&m z+1t~O0-bEN&h~m+XJ-s+nZh05a}c(Hf5s<5-QiF;Z`g)C5Oq zbQ*&(+87xc9A-3Vg2N2Kqk|1Gx)9Bnpm6bYgf22#6CS9E4l-(b=puDt;gO;Ataoro zaI`KmR?}-#jLx9Zh0%MX= z)3mSPu;`dzv5e`p(UCDx(RLaSgTeHeE+iz@=HCt+WsDqcq(h5yhf*}cBQ??CnqIn4 zjbHF++OQ3sHP9F-)*7t~iO~gw7&TEb5n@Ht0wG47!5A486dXaTL}|jqjDH13CxRQL zF^-K02{*l8?A3H~O@J=SXrl?D07Zt={phNXjL`>E7-?!bP%l`O@SY6{Es02 zkJ+=)j0_7O6Q&6i!3Z)2M`{8njH6_jUxYc8qfdFlu#a{!}Z}I zQ8xeDXkfTLCW`8U(iCOX$C%<15guhq5~YH69;%~E(vLVvcqGMGV<>vrpI}6p;w^$@ zpo8i36uF{Y{1r4&L;r~WKO_GiQHwO{!-t0jkE8wkedMSy!GY15KjAd($Vi2tH^uQE zN$=|G*U`gA)5T+eXD_KEg`z8MRu`t}qKl=nqRi?vQTkwtR&Z2N!H6;o4WQ%v|6%CA zW`Rn{7)duW!6YImHY!+O6sw{n(OxNpbcnz6(mRNtr8D8`Zy=5dj~pqYIwm+eNTUm( z&1s^I`k=7zknrL3YEd=xj{i0&x-eZxY;>@mDwX)52q(23DZRrhy`S#>84aD z(S+3ysy$jwWGaM$5^1VxgDzTUT1q@DHclKw$)}JNg@tPF-||dR9BGUwTG_P2e{AI6 z!db)|A`wLy&>2RD>vhp|W06{&K^GCN3lLmIJRqnnSRWIjiwubs%=2Fv%Fn2$)Cta@ zea32nbOfTPAc2iA|>2Ff{1NB%cqayS~$BH#+A4TcYMC(Fm-&6|! zN~|cq|3tNT(l$yrdUPyBH#j7OAZ02TQ6M57I-(_AXoP@iAZ=67Qe>n!G(8d!s|k$> zi4La3QGrJqjbTNlXyVgILb}1IkBp^^QR@GdY(lh=wG@( zJoehkS+-&o2WNKrI!QUYGlQGJJ zz@9ibkp$&l05Bjj*cd2EFEX6UijqPVK!Q_LqQwn^aeFY4oX}$59)!u>UcNqLXZm#S;3+lw&qo^lq5r>8{uifd{t6(m zBms#w@;_UtKj91i%RSLSO?7E9SH`I5;NeC5`ri_HFc}cCMW9D>(hO#P3#wV}NkOiTUY`+qpIqWJyc`Pje2 z?@#dUiXzy%i>Icyr-!$xHvig}?oa)htleK`loAtZBs`h66i%6=y#L!qjH62LfMny>S z-Ac>nmz-hEd)9}N&EDYIO_TYxp;e(+y?L11>Hu21=3t4boni3Pe6W2v8e(Uyl~x&U z;E0rDmQZd34tLnX7p9rP(ru$yg%d5*iGj7?zIQY(o1B0VmlQTs^PDAxm4lHx@^O>i z0~%((W@%{$;A3oG_K^m zRd9$m|I`V8=Ge-!i)>9=d9Zd6NbOSH(7uaZ*9i!MAcLSG-~6W9;dQOfbu- zg5xujq*ECyq5Q3DitUuhe-=Cc&Kei5oew=vZ(zB*?KqtmhYY*PZX7OPBZ5xByk2*(^R5}}sM%Y%JM@e= zD^6I{T8gzl#ViUYLH5!v@XdM;ZZ?0$Peu8oy-R%@^Z0B|uNqD9t9wO=3tx-Uq)YtT z#)nY0>ulvJ-;efN>~YUEtWPyP4nSb>vo9G&u9mCY>37VGtgMQ6IN(C zg)Ogq5!AVB*rEqh+3qc0`0}>ZSZK2uNI75|JDWlFhX#;8;sU?3vK=4&wG}%)VH;2^ zaHK`UyhRU6s2FfBx67G>JblnvzIE9>b}-=roABC`_XsR<=0aiJXj$26aHsk;6nha=va~%|2e-ikY?_89l~7JW51M4}?9N*RV^c-+(4< zH{04{J|9tGG@tyX5(eC9B0tWW!hck~&ay{3%JmFYaK~9YBwWFuj8lkeE?gh)3k~wS z!p|zD<)P!-LjF?z4DWlSKOSniUeqSooZ~F>eq;53)d4Q83!*{{O!fyP@xAXja`Z2b+?pL0C;1RUeJ2StG$}*i7I*lk#=Z!&K1%`wlBpizP z@k;Af;919-yvqJ~co=k@>U$bI=-vQsyt|uwvgJJ-S3i=yzI~ogFFz5tSIiLDf>wim z5pMt!xGQn1zFektCciqTrR>o7kTT|R5B%UCp=@0iAd9+B%kPJay(Ct$w*zXzqIgH& zbxQwT6OlLsmVFM*v3>c;z0Sf(D)Ahzd|&`y7cw8Hp7GP0C+ypl*-ER#w%`|aPAT;z zo;kJIh|U!kGCC{H^zg!7cnT>$a(m~taC=&5nYfO3vT}y#@-tBIV1$2jq&0AAQWCeG zKbJpl{uC1yrr@R*cHDUnQ;P>$sG+0!v$;kI2c1e5*p^SW43Nq$x`pQ5bW){t^)YI= z6OJyZrnWs(hL60R#Apo^dpx3kV6UX#_%vc3G&64m=iYy325vz z{$&LxPQw}7dk8K?fw5!0p^P`t0vmYl{djCw>lzQ(d7sVb{grBJ zB5c2Z8)siQAUF-A&5L>C-_>QpCyO0o$yc1e$EkLK_KoGsrLn40o*-crdM9V|&{0=& zcRSAqasMZy9`aT5>r$<86ufXb<2wE-zKO4yd;ok>Z^B%+CM;~lQlUTY#If)$-2zKw z-NLK^b%E*{6UsGbg&nHmQr9HYJ+x&GVV5)Q89w)grz@=C`pLZhV1>(oH#@6PyxbuvrBKB;M=O@1O zh9mPIS_V2N90iv(g;3A15Q&$eO~Ndk^2ilD=2n;1Y?%tB(zjxX@_S%n)-#y2y_#xS zbv)jDJ6p=AorF0RZ?NqZHQ4O>EX-bdoD;s`)xjmik&V^Rm9MyM%v`WszK}1j8w*!z zyi|@lISQ`AtHYkkF;i>FHUnGWY`dkb?azAB+h)Fy{Hhr?wzb9a-F5+K53V1$SFx&M z4S631;--D6tbWrmKy?Jyy|q|B?ld+&-v_nVwjkw#dCFbcwquPU!hZu~4Oq_CRZ{TT z<3<>*O=qOjczwgX+?v_WFgW=g?Xwg3J-g33emI45##G~%`p$%1^JIRfxgD(EQvvCR z%_`oXZ)>xc)9VO#)gb5IVbq`ULhqyRfbc65W<^Z_X#yTiF01PMy7A)L0+#lvCcHiQ z83=Fi;?gmUe|-Q%j$hXAh~KPT;K04fSZii|PMB2tTV7&|$Mj&QqHg1vVcSIfwR?@gp=D-2(euae^t2_G&R8Kq75d3p*_0GkV8z$_eRb zb3Cf+f}7_}rCNE5yw)S7Shq}=akCQ48IuBn&s*;8!#}^SLbYy$#HN-|EpDL_mExs_ zJ3Piqrz4c#7Z!rh$$0dIF?d;4rDS@HCK_coHqF`%<1I zaH8Rf05sw90MzUH-@FI<=Cr(HIV9( zw|jn&39mxBFJ0Scl%7?~MdC;}iYsA%>NX(lP-YjKhWE$q0e#Nv;)UQY;i2SxX0A%}o+}t}5C1iI3cS{~#LUF*K;8)q z-^#HH;eL$#n7|y`*i=zO-4d=8;v2FBkW_T zFQwGp!&WI&gPe3-ZQz#!i@g-2*J4aoYw%26g_=*Z(B+pK?0;Vx(;vvP&|!)ZtlrvB zuJ9#~UEfd<0+m|w#=Ms>?cxm}zXe@!0c@Jz55I>yz~#t}LWlU=a`(AM&3LrG-U&uX z*}UhEeGv9!1h&6697jlQeC68iczZ`07oL`Mk{6yVt`?5kgyf~c=SV$hlo&7kE+-$y zsD|hsZrHrZEzur7t5N&xs=lbIUNt%8XMi zkopZN`{+y@+4mhATXli*Ja;zrDeg!bhom)(xDy4(B)?kE2J>B5EM*MZmoZnXP6^^J zzp{zL@`379{HWiiSg6~U&e0NfiECY1)0Z4uyS|54DVK?JuM540&DSr8{sky@KzPp; z{-Wti1_3*gku*mZ`R`F!65E??1lkuYY}ZY)?p8mtcN~Q0Bi|%y9jmy%U?S${H7XES;o|e_;qxNk zv$7NDy)&8cRslQpg5x=Hhvc(lhD06&yFP0UEsom*@dM83dJzQ&h~DZ_d;|PeaEnzQ zlL#Txc7cxdZ1d`kEemSUlQ5<-;sfH9P-a)#9Ue)C;n>ydT=x{U5ep2mZ)_KXjilg`OsaN=t|?Sh%S zGkPjsYH=JNS=jN)b$5WMNum4SPne_kd-8rAekuYR7yJ2h+7n|RDyzb$h#&G_u%>4# zY}nQuMZZGl0T0zi9o%shuCSG`;mm75xPW$@mca^JMd&xb6@Q%zA4f65t8+HF5x*nV z1AKZD1T7jTLg3K$_^zN4#W)b2=UQm%-TcM~XS~tgWhnZ-UHdNJrM_j=x-W~#%O;yi zwa0XTgRLeo;rAOpum{2zo7FlDhFp22blz14&mabu)-`fla{P>E# zmbFEEAvd8WS|zy)KLh4t8_5l`!+ER3JU-**d?db;tL!fYHZ}|4xKAqHc&CF6=Z>>3 zEo+l!n{A3^-|=MxuGExbZIo);T2QZlEH|S|2KA+#fiw_T>#3(BteKBp4K}}fQV;N+ zla{%YpNE>2XX6x)WTowy8Emq3b0F`*Xbym5BHExP%~>v8bw8fQfw(s9M|Lf{V?chN ziQa?whSO|;TP5Z2`b|HBdAGZa@T)D`)q=RACs0kuQ-|c^%kBe_W)Ubn2-PbiP7}2U z2k&kYnvNF>3y}OCUl8UAlvm8UHxrbfn^qS0w-oXF=s@at?)#YVXEd9DkFBS}zN-zW zC#Wxfz2%M`0ezr%=@Za&fkD2w(?udpX1nwgBvCt*FHT+;J=85&y(x;iWuiBUuh*Xu z|1;tMn0}xYlFwn*^R4jnK|i1w2Y)ntI*@PB(hNk@1XTaLj*A>;+1%hmy|=)q^-WZv z6FyeqNd1<;Esvem1m0vJpVYez2rozY!cq|-IKA#PHgmZ~r9PTdk05pREQbBw)sn@G zW^LL8AYRO+UK}X?CZA39LcVGvOw07dxO53lELkM{i$Z-pw(C@zlXs-P@C~Q6SU0Dp zY;Pl1?e)u83d5lK$CNEy!F0WNLq=6AuMrg1!$e)q1pBFp#MIUIQTIu zo%;m8Zf^uby=@d<%VqMpjhlqO(FS*4fG2+x;5~<2Bn+rxE_PS3=F}U4i1q75#bvgX zE7V6xGS#;y*69PGH{dMMHsS;g^v5a(HC14Qak6xIiJV1yp0? zzq(5_7vnTHgX+sqi@s6xx3IDH5z!0Duik7m`S^wHwlmoCi4))PXNrzreNvqIXAU1r z9Oi^`jIgh)(u@MDyjsS^tb}Tqy>GuqcxyU;eWAN*Uc=?+_Tnb@-*}aJdmT``fp9CI z-SitLx|dXcmY58Wc3fsOQ^0i(#$w2~BcyqWINz_Fdfca`@G?MJtM=$W5~-(QGP4rPHd?d}0XwKw| zP0kf#VwNO&7@DK8$Tu1k^QiajT}<;Fnp@zhj0Q++h;tyF6U07*Hqa~vM6bQ}Q!i5v zdh~xz{rY@Ue>^DCjqzH6Jhf~-9y)V|_d;*s8RfUVE27u)iPV#xQ3yAJV|n15t1x@) zGi>wg9bS2Q8SZ>r!l}mw;vKf7=Oa8fzN$o+S7bt+RIL1#i^rG3%gOmKzN^#Dt%7t5sjVvT{1o>;*ILuTg%FMIa6# z&(Vt&za0f)UURNg3CvAMMKM<({K4|j&7690B=1Su>jZ=+)@9WeKK;OEUb=l>e)+ot zS`GQk1YeV%Fx5eSw%FvMM6Aqm7E(`IMNS!%0$PNrM_J6w8|0s$KJBo;0yEFd0rCgD zN6Sk{b8Al6W;H8YuwBoq0&xT$u<{_Cxh{HMUio#nn6D{S79L`?X0AXnhZ3_c(m*V* zTyOH1G*iJhQ!_#AtFI;t$rl05<2ZRrk#8Wb&81lq^@<;{>)dnjF(jM&^ee!XLsFQ& z$y_`?!wVv-tc8n7X3*hPJ1p(w1`RDLsuN@1=DL>L1$`eZ#mUV&#+t;`Z zC;e7p(*?_LbKP_NREs3Muq%z-E%4;A`7>DYRxR+&{c!xzeH^&9F0J;RyOVWkvHTQ#4}dD@oE)VpBY zpuOxxncYk_#zM*KU9ebOMO^ry99&y?8~V%UFs*eT?Cp9OyZ7pdP55@YUumpky972a zEy*wEgkbX*=h>EH!8mowWVBh)8m=x_1if~*1Joy>|JyIHeCitXPwUJM9X5ln>DQsJ zz7RIO-mSzO>>$@}c^%K+%o6WYzBTa2*KTv*bn!g)e8*HQ_i!P~N+Ca*e}(0#?Xj-i zT}gd7M_JO;PHn8U0e&|D>TO>JvSB-%E8R)%nWa_dw%^8j7cRi*j+N!oi7S|{K%-iQ z1cB4p5-sDE=GA)Ny2#0~T4OiP~p& z3`}X|gR^iAthiB06=xW~3bE^WE4ky5%}TqJ^X#6t7Y6<=#ty!$1MjQk!&$o<{7S|7 zARE8(f&2S_MVk`%y;~N$u&WM~*`wqf7@5kPHXX)3cW=V2*Jb(VBTaGXg=w&?SO$b= zkHx&on~?4$Ke0K;Zq<4U+dm&<-K?8aZoWe26F;ET;FA#hK9GGpP#=5VoCRx*Yxr_o zz>Y^+iS?Pw*5c}x^dzkQb+4iy*N%4`KNnMfq)PpVKL&?PmA{^#34XXY#i&*h61a36wRU(2K4txFj9YX>?P8_kX$p99&`Z*Z6Xwek0cb@1z) zgrjT5p!w{kaN=wo_}nps8=4NlGgmkAcWMoI@O=ePU306K4fBrH&qF@!l+-7uGo}@P zrcjQ+ZAT)!d;E#FdzOp)7um9NgT~;KDJ|qX_1+-u3D4M8!aI>yuw?ua%GG?9^e_j` z4f@O`Zz!fdPx!_{?;KL7eo;G9g{y%F`9$9Zu&0D2n3Y?t5Y{BE(`-Bx-az(gMg3Sc z88hYna(tF0U%9IjdK_2_nfoe1S$#!0Gk6mwI1Prw)UR~@7>`HZh2$DC7r@!=i!i%2 z`NO*jxNv1-D4Xj6@ma}uceFp|1>InaGG0o4iLa323;HwbDZlo(HKwgXkFoj=^}%uC z28>Yl@D^d0F*CTOoK}1U;in@Qe{?{$cL2_`^kGx`Wv~cCJeIyy8cR*T%bM3*2OppR zgmVM8V#tvFP`ILnxDRW8FpS=F4X=;z64-}=a}PP)i`x}+gX7%>L63onl*>>hQ@#om zJ6`N}UmU*qKA+*blnr>2!B?7Z!;3B}!RYr9N6pVrzIKUX=>xBVNA=n0QQbne2+~1Q z*-0Aps0?&DrIpV+-ou4aJ+VXWDwNwa95KB-yJV3B$s;@9lC>Y0h1vzE-q`%N-YV6e zbm!PUrDE-Ukdd@Q{pVvTGD`JU^G+ zd0&yeD$m*dFFK$)fuFu^s`HfAK>G#aH`-4zQP1qHa-D^{@8pvwesLRmT+dq7wb4?I z;=XyAu)$*}+I_BvFLs`UdZoL=yxMwLZLtTQZaYG2H-a+5dSRuA*Wh^Gig!ELj@?_G z#n&1e!@OFxINe_naUGafUjCMElS_QX125Rgf>&z#twYyRKdHtBNll*=h%?I#XInnLaL%Eoc17v8;MBVc4)dxfc!L#wxUOiDEM($V)Q#3+ z1IH)Q!}De3o1qD~I{OsX-dqLev>gRC&aT4N-e=gB^m6j&+H;`ZKquI~dJx8@@8LpM zzIJ)9tgbMbw?3T+UX7oF#)WvQg$pD-bcctT*${VWxzs##HYY4&{;AtYcm%2Z0si1j zcPwZ1o;RG;SJXb%Ej5+Z+g=+=l&C7te=`jPXV88i*mgLMGWx*TY3)J3rjOupR^{V% zT)d_wZt7SUZoKI3epzcRuX}7QZEcVYlY7-tf^5=R>(#E%D8K^;EYu3EWL{-+^OI|U29hOe44?#BdV0N2kNF2h02jq&svzs*=K$}N9Dd&gr zV~rl9(^hzUR0U|a$Xp@a$-d~)00pObjXlq-tJYU{o_EHHv7;ys>v);F77X>}FnLKe zJn-x`Cf?lvvxWo2MrZH^^)k@1{YMHRrTV3I|+{@pJ_Sy+s zyq*hjE#on@XE9s{$vh(YK0m#A4(W0wmG}(HKN!Hx8{xYfetX3fE!0mcE9w6`TH)Ab(HLMXA z{B#xHOY{R1#;#{64Vy92xWD+6G(QnC%6>t#Yz(7oeniqOM!H41UX{BKd5%=qGQ~=I z+~*2bsqe{ltgDIEd3%{vsw8+qXs1adTY4TKj-=0E&0@}%tE(T{8S!B1 zZfN&R%YUtVBKU?kUosNshQ;BRI#=M=_?b{{o(=w7y8;3yb;k7Vd61h}6Yjj9hcn6@ zL!T`>`6Y{T!aoU5rS92kO@)PFA$sC zR;{O!KVvsMobf~3I!Jy3M&3Z2`|>Ey8&2M$ZgFJyTB($C=#;-xnJPzYx zM&Q$uTQS={nu+)ePuD)xN_HLaKnb5y3ur%h>f&macBLE_F+6p#5f{1M-k3f&eeDcK zmUH;Dv=@{v^Nu*-C{((g+YjECIztWXUM4Pl zV$&Y=K4IK!XjvKOJVm_MgV8>q*>iK1_Q5vPh+~vXoU`aECtk&yhurx0PhI3l(8Be+ zEa}~RPyD{>E(|Z$4L^5$!K;m(D0B^8-&=>|pRlnsny_HS-#*&Hqn;%*!i3;a!FOQs zw6>@tNURVK%BjZYiy3(jY?$2~Tc$;_^Ns;1v_8YR zm~2;2z&)2&m)C)%e0ZcJ5})AlV!Sf%sE(kEW4#XPoFNfK*-GV>mH-Bv*U zc^*ER*a*ni(!N^AQ?|^YbN>X=D6n4mfRmqMz9kIkHhnLaynY<&Ufs?*H!#4XNg;~x zw65E_35_AoVF~BWOUmTWIC)}H7^Lfva$*_nQClmSnlA^B^nyZM~zhts-ve2gupI>kjF zdqc>sx1t~6q-{u^M4`Gt^0NG-UjshPuDm)XqL$ok!T_W?#gR8acsJsJR3Kl1?K^CM zhOXhT|7leguzD87tQZgnt5mC!eUI6kyfzBIF1#h}kyE`h&v%_6zEnU{IL*Xl_zOq615%R4VGP5!#?1AUIW0Gg*?fgz%Yb;S> z5l%Q|Nxo$kHV?H>-&nQBS;G;pJlMw!JvRgSZS`TM8*(>y>VqDk-;5@BWo|zVntB=p zhmP3(j2(^26y6+uel4xocy%E^GardJaqQ8q?3_a?QXeDFaIIz1J{_h{^=4(eG-z^OV({B0&#=fZ1E}xE}6(K=e&U0n-{{M7wdV&!?TsW{qv*&Pc--@ zcOLv&7sOsTC75(!`{(v}x8Mkb>5iFvdIR&BRAy~;KRfsy(NrFpjf2j%2XH>J|s=16@A5`W92|D4V$d~KVTcb-V3 zS@@voFOx@hvp>U>p(SB>pPf)_(`%*0AsI9Lhr;;om!M$188-Kj_>yte*n{u&)woM_ z)ltUNC~!Eb$6yrN-s9S7M*TDE6kUKPd;@5|mWuFar00~+*^Io#`KGrWVT@u{>JYgIhsP2Fd&YVQ@7r5Ge2F9E12gt3CU42y)YfMDy)4XPSZ?Lx3n8XPE8%z8p;r&F@q@#H-{HBvm*76R zME@hO+rN6Yon_f%J<{pG>tR_Gk5S6(e3{q;ars{u@bPSnzE_*ViCC zGW9^Bx8cMcoVX1)Ebb(HItcy>y5a&oZt@@(~qg| z8T6u=O8yjm`c5(Rrt2PO;>NJ?%Avyv+-2(&@+76?6$zUJc7Xab@|$tgGq=Z<%bKgg zXV*OUoKZhOJdV)Ie=ZlEH*Iqc6a887DFadH2k9S7iE|M%pWF{A-ND7?IQx`36E#V* zX>PKQ6?(PDD*3n2r(ZWDuLAp69{Ie*jQkiU&!~=zdB&=(nQqd5;sD~6>C*IDn}A}S zO|b)-m#_@~JNUVF1>(HQILO0FHvTxozSdvF$fv=BaSySH*Cn zK=jH2do)ks)MJxw-x0GpMm-#?x!*t){(<@{nh&K3?Gk6eg7pcUp2v-$J1{m{BYbVH zi2JI-dlF%bTUK{dsYg+VMmj>OUsqQ5S}gH$jPRL29#i}qqucE#zAh=|B~Yo;JPd3x z3|5-ki5Z5ne#8gDOlOSRhd_O*O4@;D0zoSi42^tTM%#Z#|L8#O#9R39xj-ccv;I9SZq@`^K(>bX1Nwf zBN+J%E_~{3PcCL;5O`r5iusrAhe9^C?hhnB0GBI;!Ur(wffSmt0iV56%rS9fLLYQ3 z>BO2YsLcqM+DqB1wOeEIC|~1naIKEGXmqkNH}wwmD!YNVOnXN?f({3?IgjzzLrwFD zjZ3F-(mbBsdJ_^BB;prnlw3tV(X=GZTc6uzHmRiJ z$1hu!&lBW74M-;2YU_r}YFXPN4X(`*pw z%v{u)n5WQO13V7UXJ++1bBnjy$b^m&wyCc%nrge)@5`J#iSXEB4vW-#s8k@nw+NMI^JX*SvB07#%(I!Rjo7pfpBSx1Kk%T!7uW&H?w4Ss2td9j4AX$HryStkC@&F6e0^?R#An9zALZ zTV}OXFV-24j*s_#KH#9@K`1e zS8v0ln*)*lEtyZF*HkrEt5kIYe^~?Gg~c)E`C+s!b5z*nGEKF?%C}?5i)-_MFFRo6*iLG7 z*WxfR;|_mPya~tKwn~0TJO(yN!+TlvaMia`a*W>;xRy7AHyxYKHa=g5;(WVb){s3D zx1-W#h4Oqe{l3P#2a4yUMPL=$5Bc36yccVnmy+}w{SVqg@aZG`+skKs;8aVQ&I7c* zGFqZN9!p2fR*--KdW$2rxa`u$lNJg;jF zRD)92el*i+iBQA;B{Z|F%&OG)LC*yz*r-+I@RQ>;7+iB2^E)&dw`Fyf+w4qZqRuys zI|RS1w3xG@h5Re26^b~OKl&YZj=aVKCg$O=02NY_CNrB0`y@*}V%~x%Mtf(wUoOG8 z&x7fnCAnkmmf-O`3>|B4f`@l5;fCu@*yzSh%5M$yHqM2Nsdw@D=F`g41|NBL-Lr81 zMSB!+qu21=pLYV)mC~-uJP_*I>)5+l6Y>7x z3s_>{dw%ugTX?plCS(xcVmUiuoWVo>;|qM>fURr{8&|KtqEdQQcwCr6n$ z$o)|x!KwW96*tK29|LBeck$Khf3e#iXPN5IXU_NBc85wZ!9zD6G{KQ!mlTQ()U!xI z$BJ`BY=G(+a#kcOo2OXG^V@j}+{1`V^D(XaEwC@!0bP3iWK{3mZ+kvJ`|uO%cBVEC zZd4zer%Q5)PBK`Hd55y}MdXq8T^u)+eSto|{G*iE zv7V4pIubtbUcyO(pm610wrb{9ESO;?-)mJdr}EsU5KZ49X?ye>ch^;ut$s`fkHJSp zZs6FUbV$zF!zN_Q65#>;ou)&FF~@P@@wIr@ZYaKevI5`UF3G3Jlpy?P^|f;-)CV?)tex2L$Q;V%*bM;&MyX+)8RPseSoyBZG<$i%yN7?rZbku zLQZ?;=1UHt`J4@~;eih%jd0M`v3ej4tduQnQ||H0HMelr1Jm(9eQ&V5xDb4;Bv#_m zL;h<~CxtKxllq&C~LwS>*E_;jv7axWPohrl2qdjog zg+(Z8CU@syIJvGLX-s7#3_(K6%6MyHka9bIH*Cw?0!h)`u}&OU$Wu@bN5Rr&`*C(T z4Td7mM|E^YaHr*W%IiZQv!l#f~x1rq1L;Z-XaLUc;BGUdmpl? z)Ar)(bUo#|6FP46Q(Sv&gSWS*vEl7sAS=Hg_^G4#FzlD~enCDYy>0`n+6_MDT}AoS zmNghYuQ7H#ABArXsM3qQA(m*U~`-M>|4++W_vver~cXi#G824$qofK=Y8Fd zXZ!k)KiY(Pizkp>w};8I3GH{zT7d_uIAGqFS`m37|Q9R}~{1W=A<#i$919m{j;Po`Rs8_S3bUZ3TwV2f+xM+ z2em%vSoY?zILxOEP+U||w^W0?Fr^MwSu+UGcRGES*T@%io-eQZ7LOi*I!xQO6sg{c zKU{>)F~KVzm!?4Yyfq@;+{G&Zt$zGw4feKG%FO%BNH;)unIpZ=LBOl(jC2B&+<9!} zdv~S_xym~HxP)Wg&BJwjsuRy0!Qzf(RH{#w=)0Ze*k(hmXPscALBVrZE#P{7BS!v` zf69IYhmU^-(h9b8i?_V;&Qus%dm`2CBRYRGAYTd(!zR&Zn~hD}Pkzxo7w>2n4m!p? z{5DI(vpAt33ig^W!@R_+T=)mU#e$33xxuEB_HAJ}xaACm9|3F}J1(!D`Io`~5+ zohGd_rehz*AKI@7qXW-m$BL94ltpqBj4ZSvUPj)6MR6@1uneOF=GxkDK-vX_W8=?&A#v> zwj-{xWX$>SMI=uJq`^t8nPk|2l1;let_?RD?$t!N9+|3r)XT`G@;jaxp zxX>iRt>moaBGr-XSka3AY8=kZA~T7{EkTyXLQbvXKs^>uaJJP=;kj9o(`wgEBaT7)e??!QcL0YG>Z~g~a zDP0~k*s>NW?rQm?VDo7?Dt>Q=q)r4v05>PvVd#S!0z+GrcFQ*id&ek|9xp3p1G%|VeLe%LjR z`n7sguRmE~?T!4o^#LG!0i6+jzn2sm4x}+Kr~YTQYI0>DY-95sZ&>0*K#C{T$ww@f zxm6)8!nv*ep>nxY;+k7PK3%)>roFmqVHYW8@N(((;3GV4!ZUa~<`@#!QB1#J;YwF@ zNF526W|kB@#(yPk){+;I`j2m~TzH=h{yqD)39shBM1Qu@Kz{bi4vBINf`2S;Z(|ep zmE|2mw<39I=B3Sqi$CdiD68FIq&=*|J4sC$osaZB^g8b2Ca@*yg}9B8-gENwoV3hT zGt|qmQJdFs;!J+sCrfB6Qje&ngxHxpjo|x>b-oLKB~j1H7IdxzuLFl6UR;2pF77Gr zjC7S<2%7>FS4bZ|l#$of4z|gagg42`uA$ABfrh+RZ|%r|D?#`I?$;ZgUAExOFV`jC zxJo$m@_oG8`2iGYx)MGbn|MlSpuA@UP+l>7?KRe7t(i(Xsvf&M7b=zPj!{RONn0xB zaN_dZdu==6*c!PC~*zYzQ6MXp1aBt`c4z&Um_2! z2+my@){0XPgw&Hrea_WTW3E`rFV8+_CR%w{pJjq+w>4Tx@pE1-6}1|MV`U( z9$~_#P|j=1d6Q(!kCPOSEAFOz5{`uT#CC_Kn)HVHdv^0x9$a33k@u`_1_A?9r@5lQ zf$*EvHmzr*m)z!YG*GW2iTOieMN66yU6Y6tz_rst6f+i|X~WcQtrVbH2LvD9#MU}p zjgUzjLjPi#&A9Z6*$JRrtO`542al=p#q~4YKM;D}gv7O%L*thRGMd)3cx?9X( zB=t!b;kBsFZ6GuMq~HkCT!i++NQXr~&In_i`Z^H(ov536t}TIjCE>AwdKEs;#!B85 z6AgHKE0SKT+a1k#wSBh)hG1RZ4kmb6^ws18P&w2}CX8WW#blY*7QGEt9AQr1lX%9q zn584>pGsa&Ep^kuv@d!e<*)CJ0_JfgM`@m}Fv7f4t8g=SY;r^qbCJA~1#rD%HTjZdCA8Fo z=uOBYyl0ee!Ew^S#T_B56Ef@B7jS94bx`Bl9X@JRlJM9-vl8;2WqC>OvW)76(~JfW zbr=EUMM)>-QV-TsB_F`@-&O)kUo&*qrBHwRQ4&6eG#KoneCYMh@Z-{IxcNtMc~8P1 zq<)xudr5q7ARZ@ldW3`A;$S!WXmt(}xIehGV8^RnZH&kFn}-(`^|v*bMUy^3k+pzfonkqedo3sih0LtzfD@_!@b4)5oljPyv+|a zt%Yl!{srWkB{n=4n(_l3S z4ZGUeAg|rlRT=Dhk==~)<_|h8pkDtq(o9fjHPx&+=6~P92F~8d9XFn5)poaMUb|Ce zp&w$d>D+2QHza4`{QpPNbq8YA{c%JnG_*8r?OnL%dyTe+_7u{1+lnaKNu?+$B%?IU zYz?0Cy``e0MYKy(k@nvGzUTS<@&56?@8h}We8*>epL@@pw1ykE$cK&3l7VJ3jOJi` z)ZG(&^5{ltueIs(P9|y6Ea|_;oX>m*Kkgm}F=OeuFdxbP!g+go#y&b02*ZW1!2jzQ z19`FcWQo>A82ea7b3_&xq64#Dj#LB>?H-t}A|0%nRCbvYZwp^4(ab|=deSovth~ZW zMcRgonUl#pdpKmo)m~WC=$5f7(X?ni&M*4S)@iul$>N82e3=_-U3&~`XkCqe*J4gt zUu8;iJ#?qp#N~fiaRSXDrkWpSAKR7lmW_hpe2%H|+RO?)o?S(g;~`jI{f5tNH%Ybm zO)$Q{a1{qx8DjpE>5$ns5I4mH@p6w4To^W;8EcHjX*oym=b}H@E8qb3I==u<_}S8Z z)(NW6zqfd+_G9_6qu*2)C%eF?KabdH$2iP--3a?en!(~}CwZCA71VLsk0FZ#AuGSJ zeB*DG{k`G`Sk~_YzBo3R&)l2ByY4>CmoXIvuk1=^*qlP6HcME=Yke-(`9#wZZnm8U zvj^#+*0Nb>;Ft)sR@ic(9C|lQgh<_JfHzxVkDndb>ZH*6fAE%*ukmSh=BWMW31$`j zlxAyZ!pea580#3170V|w{fu*LpZ6RH>bHVdLJmJ}*-Yv1bP8iW7e<<1N+xmfK$7h=tXm^jxYPd zu(APotb7|jyV_2ElmW0vuPN+)aT0gf-U1yh2i(I73)A&=acO1&xDDRKD2J?L+Eny= z6^j`j+o4ta>+pDmjFbboeAbs6UmT6=Rvp2ybnnItha^UMg4Ui}al1z&|NL77?~8r|CJ8s1N1* zb5PA}jj9^pGaG3sVXF@M8q&n*6}L2sNnc{G=jRzT`;ZT4`giobs5B1H^*$XA~K588$VunMc~ zXcTFFCZfK%BJzB7&=z#uSt-%qLq9ijXq0<^z3?5vI%_Ga#?lb{`jt4p< z<6)hn7?a_E`*YjErP^fpY!!l{C#a7gZO~R}p>q@VxA;D5S)mOkb~oUjRsmmCI!Ki^ zs39Bj_YUs={TvQyjDS6V9@=T9ddef~TcBN|2CSLQMo4-#3U^Mt3$yITfmwr-aQwvy z*!FN0nCp=jG_#S*7q1erQQgTrfuo&TLsN50ydU}y4?Hi%>Gm!lzT1DmJc`*1>eED= z_0td5EUlLgn43aS`WPsR?4azckx|jP8)9j>@zL(`-s~PDm zHRLl?wOor{Yqmk_CH_GD$F!M(tIf?A^-tl$sFt|)*AncJ;f#h?58=Czk942caYl7X zIj33si-B@{n_6z5S%MS;-Z-F>oUXqOqfDOg+=+L1!wJuMl4lU7{s1k@XmurG5ny-4hMilw5CX0qKPeYS&qFk~AEmAj!X(w0-LmXz@(c#9N+PTr!^_idVCf7iJlo;Cz)W`I?<6}9Pi_3K z?=OjZ8P;EPL6$z2eO$e(?Bn!f%y?}O7+y6) zS|6VjK7^;xbG9xo?AUX+1ioSLM!w{QtxWk7^@7MLEb)g;mQ#< z>&+Id8}}OjYSHhV8fAoo%PA+LDfg}9Ha_E}pYBF*AbBCDzm>y}{9^}wFWB9`WCw$P z{1#ZphLxS5UiggOe>`yO zX^aM@uGu2$O0{+8c=RyqLjS!PZfLX#Ojh>5?-6~VE!`8|Zs#Pl)v*zEFTH)E36`A- zG12}ahUOc{y~n=-iUHS%rhB*?6Yz`eM3u>LJ^tzGI2_tw035ku$*e7-R5Pz6L;Lbj z7JPh5;c}-|a^fm;{8lmv&boDkkf)V})FbSBS#O+2&-vNUNCWCKC~-K94eDD-C+eGl zB01v39SgwKWDZUUNWcXp)7buib|^T{e?<`*l$PMBP!FgZN4l(SwTiHbKbvxvcx^RS zr#zOoTQ!zVZSUfB(;l#4*GMjK<&$Z5#m8hehV0u;xNoJ%XTLJH!I}^-zLuZTvX|Da zvS9OG=71Cv%#TbSiNs@~)^WW~5_gZ;j3c7=U_|{M!Lu^qBd$4iLCv!>t3N=B-8C*S zw#R^%uthsVI##ZWBc43K#8rohqfSGWa~L+%jV-J__sV`>%4~3rG65IMNcinHfHc7& z;=O9Z;nOIvfw)d^H@dtifSj^CoUwMJnxmiYpy$o^WV3&|#j>jAiiA#3HCl0=`e8SB-WQ4{|0b{%H4b>nsfDs}Z?fu7-fq4> zAdcNS@`n{Yda0_@Im{mHwwLegM#5+zs{U9H?YvJNeyjYVCkhUD+! znaiu#)tzI3IF)*HJ+qiN6V~fkvFe$v*aT@1dgn!gU29)X{L3t(_X2Sd7CoAe^YeGY zNmhW)rhULBua#_->OuXlu=G6{(95xt(!|ZeUT8ys2gDmdeUI6z4V305G?f9r-qLv{ zvyixz=Y-wH5BfS(7a2@&AJqe zX+pc$oh){T4AU&k{yP~R^>+x~mhD=91lx^W;1Ko>ZfYn z%iidbeoc+d#3?Y%w-karH>2&~AbeAs1jVb&ASF9hXacEOjujKS^VP25KsCYBTYZ&w zw)`vkS+wPZ<@|w(r%XBL?lV$hZ(t;D)z_09#(w8PwVi?Z2;TmD4=Xj#@lgLh*eoXr z|FD6ihx6E7W($QTkL^i!u?wxe`ES1ycqaTT49PbV`Uvl`Q>@}g0On0Qj=u-aKp)-K z3h5tZt?zK5mr>-r{3YE-xiTF|i=gF`hmw7JSGFi(fJ{0SM%G6H=}eipU+{{QnUzh? z%lv`*>ZRyuy#@N2AAx}m*7&0TLg;YxSK-5{5zyq#!lq+l}*-z;(3<%@!=!|5@yS|HE->1v}O>igt ztrLAj`niCSKY(RS!hX+(!>wug_$%|cit1HpGG)<&e^Mu_U3lhdd&PTTHLb4+Uw`ou zFMRwMudLBlZbtMaT|v)ro__%@sSl~XlQ?}3@B3&mQ2h&^BGX=Y{M7{3ddU|o*}g>G z53IJULbwKm&G;kQP@x*Y;#G%`uts2u;^}jp2ZRrXN8V4Ehglls^c4T%pG91`5jrzO z;tFZo!*5)0*XO>gRQE3x*i(;k@=LIF(gZYv0b(5}uHiVTik|CBWfXUz6`1fsB0oER ztj5`cLioY{i&bIHM(od@dxSr|gg(a{XG1pMKaW$4@WZ6*BF4P!g-X1$>>g+b#z4ok z+XC0fkKM;3jWiVEeHG78C}-^;uJkN%l%v1_5FA6_1$PGCXLI-Mz)^W>EyWx!_r!z! z>w&x!6PP~ydIa=%)t>&QF>ahZiW85>`ra?q{BhsOSj{2CQGEXEFch9kti5)XDVDv_ zLaI%i)bJoqUv(6WrVIzt2!uP=VT#)!F8ZXWbRI-45H=L%M)ZSglgbHmHDuZ^G=HnX zezd)f=FSm9J3#honv>*i~S(^sromAwPL|rSr0y?Vw){nMRVS;py zeRB>)@?orVu@~O%^N&&eh}`qa2Dwn~p$GF!dt-)aPY6D)gF+(`9!P|@@Gb17RFnLY zz2E8TKv>0uu40spdG}sj^s?9I4w%aD!SG zk?sSkQ$}?nd<6OJOGvtghfMFu6Wk68O$yZ(t+C}~SEQJMZd5zMfWyos)m`u|49?1f z?kP1$bs*6?S+&JJ__=5uUTFQ65jLsw+>BHw?cZk(U$P#goiZ)HR(K z-2`%6*Qy9F`4`(t5Z?EL{uaoFKEls}@GQN@FM|9hcR6``PO%4pX_K#Z0@AB^tJ87f z>ZbAuzf&N*A#sv??pQJNA5a7H(r&8f2+yv@NxD;=_@*QuEVdt})?fk?saG(l-zQu8 z4o)~G3mz2pOWsL%N$5Va9TU7y{uupNI7yV}Lh@m9`O8cwnD9u<8(8_`Z?MTMm6314 z8~Hn=&30pPT!s^S^lBfA$h768+rTU2t28L>7Se14MPFIHuos?%e6E8`-UFC*LxsE@ zd6a!XTz2~KxVJF&@iU3EHgT91^m~30NTKBoG=%^ z76rhQfcMw6c@L>&pS--L+4SJ zDx}}gy&?#bYsn{&CMtUq1dF4aak`GcF@?BK7TT&$_)x40n*!uv;c;#od-9O%irfVT zzc$20*LSNTLm!bB{6boKnB?Am4AkkEb1{D+Z=fPhmqPt>*_YQLK-!Hjj*bAKlazqA z@`uY^@akAUAnyx;f62$A@D{p{=i#j5TftGk5&8eoTxiY)^s`5calVZBMAS79XLIS< zHB9oXQS&@>oiGQ5A17UhG>a2^Adh{S8ATpO_m~C> z)xY9!;Raooo}cZzM*UgRALQ%3kaRSsc@oVh6v7E#QA;@Rga(i&7jZ{1&m%p^<{k}% zqZJy&W%FUMe?QV-yD;$4LiHSGiF$zgEiE z{O!EZWL6<*ceb%YQ$Fn&$Ee3qJFtyRx)8nn3V~)$NScFD&+)f*qeY*vO-UapS2;L) z=M7F?Pd)GXH{qeG?&1ZW>@x<%?1Ac3I$i1{lgC%Gdws zt|6ReZNzOy_{?e_cwq8K%>LB8ZNIlO-g#Zabbi0#MxEw<9Zm7XF}>z zaIeq;!UEEMPO7heC&Jn1=Y=mu+ABJY4M3r_>HC57q|i$sG?nnzPaI>BxR6cw{em^= zP|B%qc#A8Y<(m_yLKj^VMm`%3Iat8k>|{oBUYap<;g4Rm#^{bRcJwe*+R9nPlmDcP zdyg`jJHgl0jpX2e*D2Sfd_<=L6?u6vGezQ%K$=ORnBmmt7lenG&;NRb z@3qqyX&FiIB+cQ73%eF>7_1?@in`Y5vw~~HERWC8-!9W^QWkT-7K0logk$R75MGo# zfuu_D;?w#s#o5|DVB_S=eEs&faIL%{(#%7tD$A8n2_6^QT_6l z_9Z}Ci!^f*5>N2?`G&$1@h@4K{E}HRC(Xu4gOiVYN&I$!Jn~E~v}UjKwW{;JB}f>o zo?XyfiqD;%4Wz-);`$yjQIL-w1YUX zO){8446E(aOolP0tBIh(nGVMCU%-3|AD?*<3=`(oGY-`Tu?HRx)8gWdd`Cmk5`ge}*O#?x-i zN!L$DuVdrUf7b-OoqogqZVN9Q)x3|rU1u4K=v+Cai6%ThwFOqpI*kW!zUF_+F0-0O zJD~P(25RYl06C=!X`7r{9Qn6LZgg0+`p|W6aQ`4rcD@k;xs!ucOYnP zs>fzS9N5?`&*0YD(~$4+6-Mqz0{1jiC3xpS2$te-)aQP(L*#Gfzx*a17~@q4BkEb_ zGhT|XY5)(5`78wl{wO@qYc9*aIt(n79C-QL0`k|cz@RuC{^ssn7`V8ra^Lbhi~V57 zOo`vTX!bPAVwkw68N2TN3uzm)S(nBur0>JEm`~qycv)@DgGOwEUuSKw|EmaiSGNY2 zIqim#CP#TjNGe?P{LG@_H}mloeh?CH0f*Z(l7F^4$X(mrWH+=-U|(${tlZ|wy>D&8 zP6fqr!3#;2P>(* zPiLg>pt=a)v`?fuV_8EPPiQj(f0*xqih3jV^7j!uEl1%W%ky-;`c*o!@;)4B_7bBj z8o~E2TkzKPbIg5dGS6#XgSk8I;?2#u(%j?zFeY~xx9!!N|9dhSVu#2`b;q+EM!@!o zQwpu>hoGp5;UBelPUyN|rcZxdWo6EzPd9ejcNV$V{Yv?SV zX))mIa$GX{cMuW=P6dzP9Ejh2&E7UKmwU(RN&_aDqVN1Z@{OwzSpT<5vb1rODGn-w z_+Z=?eICx2-e_}T~Pz)FwTg~lG zas2hjQrQvWjx9U;N`D((;Byu{$5}d;SY6>jIPZ7?&oy!cWr!Z5K42j*8ed$D=bmvY zta{iP?cIlPgIPPk=aH4NytEy2h+GTfqkcl7;~G4j)k+rFqF6UB44L7AuOCm9$CQ?< z@nhdAW7s;fuM}|Nle9f~22dT~nNBh6w*M%sOf}>5-O8577T|7o5L*V-fwD0Oe}cdj@ z%Ay3#E=R-c$J2mtPa3Xo2pS>P++h7ScG3A8*PQcK#STB^?iV{?qS;?gSO)RWCg3>3 zWnk}K%)BnS^6ka9LDc-5?ys27S-NJ^{?O!m28@VkgJ*;C;d?;?C^3G&RIs>Eg4e3nZF$(n^OV@3R#BaDV=>bywkcO|k zUK)$G&H6#YVh?ESq9O1Cw(@*Nc!K5{9U*wxVQAXpIP728L(2U%18+p^qu$Mhx;T3l z7URb*#Cc;{!Y25;YB=}q(h$ycY6IqU7SW$~3@FwZ72iPVGW-qoZ(}**=|S#M)RkqO zM7(bqfYy^Mag6pT*c{m$ww$wuyn?0tW|N6|yjDK+j!3e|$>Qw+Xj0s}PLW4!NpoHyeyb9o*Qp;g{s z`o5u3w+_*-;YA?MWuqHAKyL5ZXc`@kJ9_?ybB*4}!GBHV7KtzT^HVy4CvmxdYc)6i z>rgHU&dqFk9ADZUKm)_AuzkQ?rc^e>`wf3V%#%YP@=rNNQ#u!3;Pt+YSi8;6ySS*! zqA}fRpL^hjX)9$!L=5*Bo2GiDQ_74>Zm}(okD%Sn0(;^l)sMZ#VE_6Y^+P(RT+&%c z>sXCr1U+YLfi||c*s`^a;I{u|>3q#K%(6KxGz;}zBK{dvM4veVO`F(?eZa4A$((wN z)>F-`SCmWH4yDY-^|8Peh&I$w=4|z1#FIGtXfP%tbq>Mew5q}z4#t#cdj2J#86UVf9nS4n(6>b?)n zm4gfTO&Btdtk(BBaGK9 z=N3P@B4IGROzVVHJ1nzjE)X6fboIu}gMH}?wLMsJ*b81vX(v;E;WjUTgh^F}`&)HU zs2-T)ca5bF-hs!UwS4+jQ^jlARsLqf8*HvQo(0PPkopBK6q0{(yGVHdQ4-i#zDa`< z7fbdzBf!RFI%Xs%365l4x-7@$@@2SiyH@lA6S#O`oe$sAFO`#q!Z{;f;=c(~F{ZyY z?fn2O-x~?d_6@>-%J-bGAG+rL;uIgKv^B*}M!`rtkJLv%IglZE9@u^wzz1$m!QzYK z;a7|9vdxl*TsH7Q>Lc)_=j{LO8n5OjQLjcB?cm+zzeqYrsdDWqkD7M^NFx-M6jgK5 zTJXZG1&;h>4Gpq40M!JHF)u~0_LZDC8{hDks@eVAG2=&?h(AbE#sl#poOzZ&`S}LY z#R)*1h*@(AIQ2OG&~B-aZiJw9A-LSWgCgpf@E7eJhojqmeg68~JX})4T!=L`qn0dcD>C-v<-uh)g zoD6RJw?pRr45;mM3@e|<@!zWBlK+z_F!EQjxIPkJ^Uj;+Gm0_fq)rigBkdOo9$#`H z?Y$1n%rTZl&C<1SWbd9bt(TJr0K3i#l6GXoC)}rE(TfJT-v_Fb9 zSx1Z!8k*O=l`*95BJNMJ5jr2;8a2k}H?FW1O@WX4enq<5&Gb zi~E_3G#&iSxQ4UnIVH=Fw)o5Y2%387;XnGlAht(8unjtnP44xA+$9fK*2j~KY955% zt+3HosQ=+l#c5tKbSoQmYoJ=|<;N~(7cG8r>OYtjc~Sg>?rjex`tun-OO= zQ?@^?Qe()n#`=oDw61&CvptcR?sLW<*X@>zEwN6Qsj4qL|i9nb)SL54EvA{sH?LGl|&IuL^1 z>f?Y;CYY`74CF5q^NEMC>QGO#n`_I68(FP!78tzKlZjvO^c7>-tYbU;SsE*Nkk@|6 zk%l!T|J`&Ut2D77{dF12KWyM3dpx6rTCCz*ih`%tj>Me*I9C+XfGyV2UR4YOQ zGvYGxY7WGyiDeN$3Ta8=ye=Mc*0M}E=Mj|&bLxvtPRP^e}||IY)VtBTuBVZ?DPUM>^yV&s###r+

B_2s9b66y!5QaHGA%%6BSzO4nfU~;~D3gz0U@kk^44T#Yb#m z&tZjV(6f@1ewz!m$^K0bF*kES)I`ct`=oXmwOJ*s(6o0UG~Cx^oGN99Dv^IbSL8Sv z>6(w*p6E{ZrW7}?zf5Ho=vmwx?qA*5zi5fvyUO&?qM^4yN!OgzNq@& z+@jazo66oVayn}4sY>?-9OAT9^O?8~E_rdM8oX?g*=bEO5ml*-;>`BL(} zhP0&l3>9)RHI+VgGVzG}Prm3qQq9kOiSF-+|>#0jB5q9(8Z*3cFE)m zjI&oer(!oZr5Y7~Ib63)^Ov)CEI@5mZP3f=l;pw7@|$^wWL9yPr|Vs8^PBy#glo{t zHsmxv^q9j7dtRef4T|ekEeo5C=M=HeAD*v!UN6MH{adKjbE@&Eq)a5|ZWNxZ8pL?h z;U`J7B=jw3%<)8>%9EKlMU*nDUe9E|PFP1bCg)Tew*=b39@+HV@ul_BybpQw*YbMi zpbC1;;TSsH$&KnIUgU}2E1S=MEv8GYtI*ADR|wy2KYQe$D|g%&*GR_>fjhk_ZePq- z$ozL_5p_LX9C|ptJ-YQWtI{q%ZrbLPmGed@{pk~6mOpWWKF9RnOO@~PkHhQr^X}cO zbH&r~n_3}u)dN1dXo>YyB(Vx@JUUOc%;HKjg5hU$tz$J<=4ST)ID?*@Zp~AD=IXx1 z4EyhvR_23h3n=b#7G1?HQMDh_iBtNl;@swfF!Zok+pJ6@sQ`FZyj^jpLK|%9dDlLRt?s0zeDxy#~u5k=hB)L?rT*m zdOq)Hbd@5e|3`(e|M7EpK|8wbRxWnLVMjggN#`$qq(7{>MTu)^1uqactGB! zrvH^@6otR*+4n2Xn)!CDZoDa#S!MkRme))#T*h>-UYgR4VYPVUPx_FtgdG#~$hh17 zz60mN)N!-^Z|7d!_yA;Q*CHLx!r7}PoT0Xhpas3hO+yq z>#D|{gX(YmXWH7fGPk=AU4F4TW!^E9FPEIB4BzKGCd+Kf=6g-0YB1iaJbsdL8`vCu zJ(jz>)v+;i%%-jx?7%gp?1-_kydx@!UpOjrn^mP%$&3E>@nNA=|k0nCPU0t`U5ZeGg<9(>#l#kc%hrE$VcZkRkXX7okOTs z&QY|t@pNr&x>;(S{x)$U)m`3)>I^Gq;~M!_(te(pttfT^N|`t_@|(YnS1j8^bwbbZ zz{D_Pd;xbg`s+63Z@;%%7Q9cc@zeQH;fBWi+|BISyPE3<)$*E;78IiLZKqoGDy*Ve z(>xe8NNMkHB)O+_>3UMuu4#C8`}4`3E)7l84lOQrT8}-N)>*GfV}0zasq33VN+3%; zdzDdh>TIvsv~6-~GtYsAdTqTR9`Rx?-TV204-RR{jW>;FxyCQ$UCa+3tJw`VKd16l zeRN{i6BLm?N!6=Rl+Zt%9J~xQGMF6iYM5!ZNAZ!K&((;qNhJ3sGbHiB0`B3Ms-#w= zSBGU9Pnbz&__a@*zr`WyU9K3dz4(N>eTbx|y9U{q)#i+K?HJFBI&3S7XL3u8k85LY z%ND?bIU_E%pwV~FlJx(9rZctow*hvaC-XSx>G3Rc66b;4>!#c(Z7JIQ#i8oa*=b@$- z-Xx#J^}l@P2~`{Lr-OOzuPqO9>bSKb_`Qi)Ei+XuX`WRu#***8Q*pVR9i>?{N#A?z zVdpCcFD^K<-9B4(-s`hge>FRE$$F{nqf0h(PNRuN?Q;Bq21;fJ>P0Qs^N73ds%Dni z;%du0%h1S!I;CB2V5al@8LJ32LRp%ua^jER*nY1wdiQHrqrj&W?jL%G^q_;uK3_AF zb+x=bHZX-}?@Dpb=(o|gI7>(s6BuXizFe4+*S%7LCrJx3(e<`XWKNl58|qHgDG(8F$LV_7LnMOd_7ye*g1nxn-p>_jD#nwKlYm=*44Eu z-{{X3#+(&SpvR2rY{|Jw{mA?Y^_f6p3Vz_N{Z{hBu5FXAt-5V_#pLF|9ACLerS}%* zBz5M+ymZ(Ft8m_J`s&C6cG0bsSa?|b`a6VH1;6Eh(d-F`C^vvnkm=o^Kz8mG;o|McaOxk=_2&X(64 zPG`z9=s0i?bJ;z*bmc`VsM{|MOx2jD=7ub*xwdi_UPQN!Cu;OPt#$H8GJo`&{Tb+e^Bq*E?hU#*e*k~TxYkO5X8V0%C7oVI)b79E z(x;S?CD5=RmC_k^4(5udUTAZ1W5FJ33a{)|R9%@53S8N2zV&{vWfN8{#hsXCqIS zv%KWv3f;Dx>1`Gc8Pa5zk{$uy)uIJHR(Pt7 z!fs~PcLC;U^PH72M@9PNP>r`FCG(L)#^U;n@XtMQ0HEssC@2j z;^CWen7CK2+`R;)O7Y_>cP0ZzE1Rf8Jv{lNQS5dB;Gd7_+y63fZlaTqfWvWto@=DW z%|Bls8hQURcu#TF^ZHWsc`4rS*vfBv{vdFB=!ir)Z<$5w0jDyR3>N9-zi^Rw!^Nm0XyuZ@pI2u^!{47H#yX+VJ%Na4ePJ zqAI`ro6&y$0ctd&k^*J|=RWDwKR#NWrnV+v69+G>YzK|I!|6TGX`jej1Z*;)5$w$c z3KGuJ#5uCn*v0hjdqhJ!>7AqV3)fKXv&{;z8jmGBZvx*Eu0!RrM-gT;{kRp!|Bi+b z_#($neJ=gVldE^I=RBIP_WbOk8in8HRV|k*@C^IL_Xo~r56+;4d&pUiZtZCweD7tV z_BB37fz#U0e-+?KQQjxSmT|^bUpgJG@b=qy}9;-*~ zS6a9+^dB9}5N+NbU529jWm7xu#qz5eM+n-6^K>p_rt~R_zu}0-Og%vjN;n9!z!E** zASQt^zcps6hDLU3RA?^7xht>Uy9wMAy0b0yJ9JvTKQm69uUA_gEp}VC(*5{Hn5BT{ zm&qjZWAQ$9xYJ~#g#Suz_r076TvD^kt|4d;E5W-51J9H16tZdJ{HEe7XftOK z$yocap<*ub-tzJ<=pW;Sn~ zS?4bQ%z=IZo-t~z1wr#dgXD%T-bjMa9*<8kG^d6)VDxDbLFHC0pgPY-;M_K9)T;Oo z+}FJg-lEyXI zR~lSX8Q07waA`Aj|LW5J_`AIC>dw4rP7Lf2bcrGg=eIHYs7%503Ui#rR~qhrn18x9 z;PYXn2{jJBdqMhAEmpn+&q}xMAE_?5YMr*~LIuoF2ZvlFd^df;&UxUP^;Bx>f61bW ze)-LGYOaZ6`eD} zSH<>ARG%lgH89!0x#-LbxAKpA*X4e|VM+>?(3`W*Xi%%q_(M;V_jpvdfDh*E8Zk<^ z47@RoUdBwD!qqyn@xrU4{_}i-5=>YTb5e_jigzrfB{wT2-@2F2ez(NrdjqPeFXhJq zv!?U7SI6kVgAEL9cB87-4C~4s@RcaUf%neKG|g<9k{+z_h{r6%D+4N4^I zuqHK3@Nv#?<)G2=$|Fun-;R$&BMWW2RLeQ_U6PSS`@PFGo$!qHhWKU#?PWo?+TV-M zch(v_KP_G#&PKVtS*=6Iy){IafuB;N+hv_x0~$uvuG^j0*4xYAZ_p`+#7nYJzl?dQ z)tO=PyiDjEEuO&oKH2SRf6wyqj5#^W{&$r6)g1b@qNA3cfDUE&!wmkUam|+SrPsMX z(}x~8#M{xu!%y?T^EC)P%`X=Da(?Qfz@^pP@f-Ba$D_pOv$GBk*Wey@>sNbdd6!s? z_tCM?e{?FQoh5h|a&iJ;E~Zh^ z&$bhrJXLop7G}&Xewy>Kd>^52>|=-CaLl${g2RUE>RwWl3O=|cHJWYuQO0MpI`czA zGjT4rl4?kaQ^3wnQnP$@ZR=*^D`-peX`(H8>8TNBGR` zdxppFvIMPWDd}6~|r~ZdN&{b>S6i?1Lv7v-c@7V}7SWUbF`g;34c+9Mz(S61u3rUOm z-^}8z=IWjkc%PBCO`bsD5AegL>BcL^(2&hPwB!WHD~ztjM+Hyb>FY&3eof-*!%x#? z;tPxCql&b;q^C?7PvA-nPDe7IBqI^6BYYp&tKiWmgR`oZ@!Qp-!eCC%&_$r|y;eAa)kBAYVVgvzMh+< zOU#*Jp$?LdH7`P;3!A8tZ61m*tf5ts#0!Bg5*!duTh5&(y=f)SoX4d+cGTL~MrI#B zzIwpI_v%X*vJp7EqoCgq_y;BAY#HaFT8uiUx}IKRAYU*fUy)n`wMmUWPfv#5!=Jir z)FW5;I6V+}brw7Z1+DD-p2jQxA(*BOA9?)Vtcq0XD?XF4G~)yXzaO5|6eU~?o`f3wFN64Z3iV<|On;`~ zH7Mv+HR@Oo)#T#gWcVSJ|JH{@oU09Q0{81fxK33()g3x>`H3I{wAoOKrG*&rVkzfV7TTa>zW-%GB6MJQ!b8iGg3sC&UMcm<`wC!fH(TDQbpMTMYADpbMejF~P z;WG%gb^7fqGXD?{RN}UO#a|f9d zdXeA=&cXmb8hF;0%s}+5YMExV_$ZQxa=(o)IMYKzbc2TG0@oX@7d}Z)l3Cs!y@|ky z#KWQg_iOe6|MRFS>+3k{)H$n0nS_}}{p$V#U+g3qx~e;CCh2LbEze;~89t(Daz=iw zR>aih55xKsvJ2EmiduUylAxvF?d4_BAbC1(;wcM5b%cTYh_(3FRq*`P=C~J5 ztd?`aHBsj1+rVm7_9BnuTU{@dqE8aX<@8WKj5F?{zQ4BSn{j}|O7^3#1oycEoC@$c~+ zK5E~1gOGob%vXBcp2dHXbCp~GI!8;NojEef%Jt!JGIBx2EN1C%Xe}*R1piXO2SkpX zXq_F=&&gH5$DCefp+g(^TEGnB%Pvdhg5` z;X_%H<-zY&sB7BqC`YJ&4Q*i{gMzLeMYD2NgFjJU{B?yK0p3kk!ft{C9+G%}3g3(G z1OG@IK>3z7VtAnn{M~?mFB!Rd6kMK=UrYZJ^t&#zWt{l6dWwg?=v(+q_=A%{RT;Ui z1fM3{Gtve81AEm7tMy zo74-acHNf_>O>2OKY0l7pD;l)aJK4iAfnl@YJixqY8IYB@@c@@TGCvsJ50^}CqDRKo5q&QE6e{|DM~cC2mgH>6$R)S2CHq8fLc*hl zZ9jFR!JdV6)2*V#B?-z3|aAfi93E7?k#^{8~XZcx;^-8p}WS!vVjQm@z z&NN4bdaR^zDG>}EFFrL%)^z@G9?`k{pvgCjHJ?l*cx&*G@2ixrO(knEFwf}t zM?cE@v>keK4lT`?+71hO$b))cHKb3cc4b{xMF2{Q*^ww8+Qj-;C znCu*IwZ9GJJ-oipESCKW*}H*0CG>_)Y!XH1!!|fI;C-LH7Wf@uA3(v6FmMJG={t;m z<=d(&d@lse(HY*8pJbRS>D>@sP-`A=q%t^iF$MgP-ZGE{$bOPMUto3x1^jiCuAEF3-HnOtVL^Si}gf%mN>zefISA>R{BCdsriW%w<*ymL1|vg}e@pXsfaW`IZLX30w> zGnBb2{@d8oYS5-LD+2(?#1xB6mW+J$AmC2lw@}b`w7BxL?_}}Z4JNBy4${s zl6isbP#xOynb9}Mq$?`i8v}E>eyc|+;7uSrl37Y-9I_hKY{f!?_iLbDjHx@SW5(u@ zT-li`qK+9}H;EUrtNI%?z~vph?j;I)a>yXOcyY1%taCP(OcpyTt90X3Z!Oe~itaa) zdK^#=ze!cRBMM`TSb5zv?qBxAUuR6IA%SmIS=l(0xt~FS}LO?~kE7e9nSD zro~6Z9vD24h2XjK8MtJD^Ezu7T-iX@7K98(OZ`m^8K7lP3;TiOT5z8sJ1xjYWu9Zl zFRh7uTy_@3`_S;qwB)2R_ZnorrhpORZHwo`@Rqe?Ba$N~Bo(r;`=G>gky#=hD4sif z!?7&;V-rq{kliDANH?ANIreYFpRi=M$~=ZYp`pW-@F2`&ne|+4h^G=yTevXx=!8S^ z?X?2OPGLY83sBH+|B5N1_ zgW=Wa^>;gAzu-9j-t2;CS6oX&21nqxf6B1%S?o6H5-WQrLkDSiYRFnn5qwLoGBZlN z7=>BqR0dmZSjrZr>KQzkE%@#YFU!c3ZFuLudr9Zl|Nig20n1H z+l#rBcM{{dDrize^r(1Ws40dQLV`KSXYlv@3nZI#a%b!mA$Jn4*A02lHvO?e6kUjY zY4~lM<^F?=CH#-cI5pfO`7oL1(}Ec7hs$GKLv0-nfK6Sa8q z;^E3Yz&q1|r|<$;azW_}=vBx-1JN5i7&Eq_Q(bcv;>ClHYT=XcyxFJUF9Lti(}%5c zW!2zpj5CgP4AYpyWX!PnGhJ0;E9t>KZ_;zz@Slk-l`A3KFlzz>|nI3KR;75xG8nd@BV^j}bK zRtIuP2BRhWlS~(Quh0V+o`Qj#j4;os;U&q;hV%*+UWu7aWX>B6$tB>`SeTzAaAN&w z(>~1ImBnnxH%t5=nd`;8A7&CNuy7gif}wv1cm(|w&hRdr!q>!024@lPjo}M}yDT=4 zrNHyNtShsZ@JCr68=MLCm#8tP>+*nsn=bv19;qtVGGv}WG_!cX@>*(Gj!OzXSivje zy6H~H3@o4fl4N0qgqP3RMd*dl_``MRh?V^0z&#}zCMva4ZC%qy&pWeM)eIqyu$B>K zkMKGZ6EPQyIjLxc_faw{m@kFQ4_-Eq>Bual=G{GHU0gml{1YBr&~jxUN9u00FlS4c zg*4#dfe$U`?!7lSFej=fE=bbwY-Ls!x+0@+Gy`)z7G@ZY!+VD_c!V|U0K5D&;mb0& z1AV0=Q|IYw;1m@i7Oz)3`BU zp&IX1MeUsQoI|=^;}u`ZP%)p=_9xtDomp zotrbcT$>!!{beb8+>vh-mlGOw@&;A3>{j}_y*pq3w4dEircrLIM)O{}XT-c+L|0Z! zE#(z_e z9Hs15D`s#^OHaP?G|(P5>xOzcVKB!%uWT1BTbeG9PhtC2SfS>(=xN`IY{6s7-=SqE z-MMh;OS88)xvmE{t+?3PVaP##@yN&C5mcX6wJ4#=j1QzDF9ztSbANT4 zz4gsu+56f{-E(r+n4O&S#3qi*nTG$Z&u_l_=Ko#LlCYdGhfsRAO))H8#snN}V~YeVEo# zXSZZtp4rEozHYi+P=Aeq`=qI_9`c$#p)`G+m)X8Ugq?HJE4uf-E|+}0)@nXyp7qw~ zMV;bu%WLt}@Pg*?@!IN_t0NC?zJq=lrMOP@v$Xv05UxF^iN<{yYNtPSx?mCZ!|eA= z*$u;1vu+j61!m{uy@UVLSLc&ms^udxQmrTNkJa&vlQi~wv(f>98gnK57~Ef-rDCpt!H)ZoAn#_ zDsc=x$ai&r#ZhOY`}ZyEIcGk-l)A>0C!8hJ#uoOgkdLdwZ;btw3D;4Wn&uy6_Fv#+ z->f6~%!{(rDyF}UKRV5|6rAgKeR`2?7w??Zi!ugGvfp}~q}iFz(TfX1d1bLCuG-0F zl{0IcnNPVl*R`LfbrLVnXrF46Rlhv8ok#LI_V`j>-%Y=n@62gLi(ALB&tC^0Z5hJt ze2)@e+NM6-FQBpa8uvjSUv?7e$ox>xRf9Y-Dm8_~&*vLO+Oonk)_u2D)#GNhr6(N} z&sD|EWv4IWcV|<}I|Dhn*L$9h&#Z8pW_&s|o^@Bm&z!k4LS;yHm-9}C2OrkWvQ^g6 zM-;t#`Gh~`w{-EO6TIZ(DE+v|GCEhcq{`&^A7#DaYi3`5P7f;DN>~0jkm{|dXRIF? zqIcCyZTf|psz&)Kv|;lE*X-W&xGOkwcXVr`uUZmq*k;%r-8+9co;7e>OnM)X%&vGqNNm+8kbZ?oGC%RSOF8~NI0cHWh9Pjm5%-G`IA zGG0gD%rjr=)GR);7+24e-9~-uqthmE+^UiG_xQ|gJKj=bvm?h(_Ttd7Cv?A+u|#F*RGCxS zchsY>e74)}oaUy}*%@nWe$H>uj!Q4K&*&WXY|K|2*`E^Y+8A{|kFI6R&1FlG1_t9Z zh)LG4#|;A>l?$Q%r*1ly1_aQ-?xz^%i13?4~N*Zx?Q09Pp7I{+jdfy zOfAhXQKR_$*J66atu(Z59-gQ8XAC_xZ|cku9qFQ9YU^gRit0Y{!FpAq7516`m8i)$ zue|WcB=szE5v4ts&Ytt-rSt5WAS(X#8C|Po==R?paG~j+Xy{lxTe{O*ZtZb~@$cHB zNQCU-=Xu%B604ZlclCbpBelNfA^ADG%GZ*1_q=Bre{{xx6!ywu=Xr7K+`uU>`)JGi zI#2tf9NF#!Hw-IaylH!yfNd;med^Ott)A9k^f*GVbk)6M+HvD{@eB;C({t4(`@edH z3D}5dtUQs|w5k_hi9@~M7qJiAVR!AM@Ywv;OASIgWra-EK<-8IxZ*&+be2J?h%}_70RWNfGUQcrlH8gjB zOl4wU%^_2oa`3Z}#{3pf^^A*qwDh$>1Lv{N=*6mVP$pAw_RWg4_Qa*B$hX)+c8>q1 zg};1tyI~wz*A>0uBwd})dfU6RQj1!+6?hc~|IB9fi8`dlZn1Q);3wd7+vxwU>o#Sm zc|?7Q%fZxTmGl&PRr;O2veVB-KO}HEy(j6P%9MM#Zk(2Zw@R1)G=iEgi4tC;bB!!& zri`|wk1FYh=+k;Qp37Wlxesk$-q5bLI#FjiI*jr^j8lTkyFZ5Wx1aO4@sKf;s(%Ng zgSmF4ra+8dkt~7(Jy)IgIiqE?+ANUZpe)is_T6b%lYp& zfBVhlc%IR^4c%;pym&)il@RM@VlV8WV`q@`PQh~Y9L8B!p@%(GQqoZ+y%hX|aehe7 z_lrk!S!(^Tr@In98j!v>tr<5}dyR`Wh3~Yh*PZZBtl>oUZNgq^R^P+yf2tjY|2m_A zU$PEX(~3E4sq4veXL8PY(**}OsKWsUju85m)Uqz-(-8dUn0h)SOt=u^nick#lagvP zu2~PLU6m`HnoJu$+BBx;SdukHf3qJnu1WsGs-XYGE1o_`*{Pe*?QCyVjwdr1+}7+_ zFP@su@il?BsM($hHA>eLerUJdOQ>GoVrK7Ft5yFdV<@&uN;6Hd<{Z{0!P5hmD)baPCOOQ$+_wuC`JKUj6t+Tzc&BDuxBbi5!q4-6O^k2qFwQ4MTlhOe zzspSLe9}`EGg7(boDL3sQTeY=!)q$nBk*)B+)CC-a45sbN0#gp@JslyJ>hK&IVX1A zX)(OK&Q6?-+$K1o9vqRt2^ZT zunh?w7JN6KrC-+kw_AZTt3PM!s%s>y0VlQhpj~C3a!i5!Iw-a?)?_s;99ILqF~|nzSKuMK z;_6|-qeRmYevf6J(aRb8sq?)Kw$_ELb=J9wIbqxn?oDG&bi}3x(yNS^mQh+T&GW{2 zoTXwkB12L1o0`_qX@6x;IkwAWx~DfPhkmLaPJYN%wfS7Ncq8*w^;k9O;(HDK$P+91 z*bQr?GKJ58yVpA!4W;7IHgG>?Jm5Amo*(uO%k1iy|KPM z8>Z8A`aqw|ML$^GOs!A%~TVjHFDG?;^T-5{Jj@>|+TZ|sjR6uGpG%1^Iq14nq# zhUIiKJkoV78|-}8w*bydT?t&Cz%3MXj$QuKSHk{Dy{ZeHdr_U?ugMJS!~uSu+%o=x zKK>&oiU3AhTp@U>SINny4azJpJ-S-=Cgj3D$ht8~^$F0F{Zt{VAHq)KNl zkkskwb5U&8vW2^Ayaq$lS}_Hx+V!7$s2_KBfPbe#&&uHhcj3za-r@T4@b1F?T=PLH z-J<#&4!X8Xqn2q<$Im=CZ)R2K(oXubxF|#aDfAOy#2jvaI7t^>)X#N|>oCU}`}_lR z;xqUV4GDbF!h7j2DWl1=#a83|nA4Q}ZwL5Q97m5E2VBZ!H~$_%IPVO8F82ydnabA_ zM)9NuDG2+-S62M99w(UKKRNJveR#x(r)u=R|FrClaJ^IkO0bL3b13?I2OfU>xh|cm zi>$W-{{(K%GqG26u_c}rXq7gEGorunrSqwD-S?;H_|u3?&p5B1>_~!N*jpEug)hME?yr+IpcO?XIpcO`qh7&1G;o(L zoewvL&#e!R|DGN+K1?G&)M9WA0{2l7n@*|l5hcjXxI#x|38Zn?7c%;q^{07naLWWf zdLGXx?uk4LSkc;er6(?H2G63q0)DA^YkN`g_GwA9kDR|QcDRP_C;5ADV0v)*vD&ct zFJW&Lya^>e==jbK1Z_hf$Np1Te`9L+S~@+Txtu@BTCD}vVhzjM6d3>YxUsr2{~CCPu|BF!^&ka(EE)uft6uTsD@z82PAd@bmlJ!Ce1(pfdkG}f11C5@3Msc^oWAaI-;}Qn8)B71kR&zol^h0 z?swmN`Ig@$Xa9c%xcJn&#vbMo<0Jau19p8BdQg^$?G zWxL$gz$7!J-N^|)%(J>RMXkPtmfL~r9#01sy>Pv*=xO0$r>0jTI(biYv4(fU;sqV? zJEUJ#_m z>|OBEqb&E-V#8$7H{gXc$-QY9uRGCII38i&TpkvS_En$6IR3f?B6=Yo^_nBu>PUTgl{&0bWpnhh>sr;d*Dgd)rde|AwSAyVU+fAHQ|xIqhc9zxAtJ zo-Z^r=WRL}dUy=0r%4RVw?|~ysQvsV0K@;2_q60*;XA=QjIhG``7>&u^0*@-q2GM% zw~eQ9K+BE#@7SZ#!|f8ZL1k)6T6#4+9B!6vFX8Mn{5})@xx#)kuvX!^$n!=M4gZki zJ%5S+#WUTn>XPf8aQOq*xzMHZ4E(i6H96?q>sgJl7u31o68_V})9zgLCqeHqvy&Qb2&vXf{dXeA4EPvFW9tTDZ4*xZHP^7B>KZ6f&mj+XDep?TBW z-8}G2?wY@O>VGMruWJ%CsRhqbSNWRYfTyfxr1H>vJr6nsbH&FN4nE|pw~?^5lK2Bs z$A)Ng@u9&%6!eoZslg;IUdzj4Wfe4|3GYp#wiLWWBkk0)6jlGOg*|iW;|Wu;i0(B| zON4XkY#HCw<;8+KQLiD9sujMUMR)@|b=vkW$kjXHFL2KkFWG#aHM~#C@g%*1 z{&%4NIi5vkr?T_MDBrF7)r~72E`G7A<`iC>O!l&cyRGKODk$h7YMU?xec`GlJqCV- zct;G+kR%5Hr*=NbSi;+q1e)ZOY06y95}$`@myc8uHGwy6$ge(|Y=@91WavJyD1 z1usYmf2n@$h5^4?I3{Pxo!7wmb@5f~1CP4W#hMX4LZSX?&Ww_(S;JPOa&}d+H}F9@ ztg4&rg$^lQ1^!AG1Lu(r>}kZ}&%jsGFXsRk*F99wTI`m)9Rrgs_#uRJ+NJgH4)3jZ z{jQ^+qlCLEWKjlwR++U-j$ApFvZmW@1%5J=k4mJ!Dr>O&G5Zo z>+_4&Q1B4+o~tYQL*DQJX`*>cE8G zYTxUQ;P_1i{}uE!A!m|$(LdW}R7qdE0f9+278z0kB7vdA&Us0Q@j5%lA zO8iLRz+?@pNZ^5L#i3b-_(-@04Ic-->QFv0Ka2`HKFH6>J_{eWIlAze zLJp$fy>b1rbDceS5EeLuYUf)!QG8I;h!OmAq3#s*n=Y)w+(LQa z>e}tjgspoFaCqU11bo)uc?y`y&|2zH-DgtI3VyzR`f3{dm5K~snxH)?<;UL|85F$t zH%7l*%XsX}Xq@8&1D=!u#)+p3zPw%53}-N2$$dg^3#K~2d5l*-n;=7(VxafvQs=94 zi|UzeWC04EunqpHAN&3x^k~QRPgNOOMy?Gy;*b+sR)fpvcYEt-$NALe-*0O)vJ9PX ze>J+2GngB{@^a}`?6(HzwS;Sf8@Rk8_%CMB%`woUWyBlQ&zGd88L6hyjMmrn_XR_& zv)y9}8825I?8U{C>LEY-sB;9J5%0t)TvK#{oQG;fI?&T0-(8wsyvq&t3h<4cgg)cM z^&o>QCuc;%^W|kHBMEsS<4jntX6lP{;O=`f027uQ39%6bKBQ1%3jUD=ze|B% z^NB9)bo8ucqVrXiZT>3g;2>gsi%de??!T@I@ z*9Gb*I#E^9jTB@0Xk4VI~V65wwItUPbT_ z#cNd1v;WnpE9{R(E&a zoo*p|h|VtBO30Aa&9q;X{&a~8;XvBky zdNX_|Rl31S4NVS@tcTt+^MOXz%c5zKQ$UxT1s^U?V~gfQ-VP29{UyE$JbQhtK_1DV zu;%U6h!H)t_>a)&I4cJOnjhQc()H+T8hh^IhUjI|lccW2v(wNl)+PO@(*JwsO4i}Y zwIvE!8qRSW(N}s;`y`hxLVs4pzlIu;frx%RJ>ZhUeu1}a)8Mum7>nNZLyKNRPRr7> z(9fOljHQQJ$OLH9=|zN^5|2dkE`Gnbnr7_RpoGj+?n8km5O{#A?&bc`|JA5m ztKjW_b9Av&DbY8D+FVi91}tG@9O~S^ek_`_z&Csj3;wBiT;Lm+1&D|4*au(bpCkRe zW8lQ6jjwKP34S#^^!f^O2+|9&7R|_Z4A7??75LD-q6ANXg*OiN8bU)WHHIhIN!CWC z{5Tdl%uxF79WG~|(Vy6-!Y%dlAfCzF-J7#lo&|jr2j4G@MKb}XDC@9~8s}UCFP-oO zxzeH?(D7?6;1IBIkzA`f(dDMb?;5CEy*%?=nzbpG;FSp1)}=yI+3+hx*Sd0BeM4Y98uts8r+BacU`I^|AwDJm`x$^f5mrM_+dbSDu@AL6&%;@Wu4&_vvi(T}tjX$U+XUt6hoK@L3dm z3j#-CoHvc$o+!SX^k&h{k}JR;cWF>Lk63f@uq6-RCx=Iq=sV$y$fwsQ^mSFW4@ z9F@k5ic>8%q_mKiqmLd%4v^4as*mDNY@wjb>X2$FW_2>~p z*G8cKjZKgB>qPLcv}8EozzTdC`yAtXE&?(*C-|U&IT;fkh3E-N9X5r(w7Nyz*Syu= zcC~_MpvmalU5U>I9SmQgq0TmSj!T2e`K(oZw#*N}lbLRy_DJSN1{J-^m^+e;MFDS+ zr8m&!IEsLY1Y9x-zRRLF-=Cs^2m1WBK3weHW{v#DkQo~E0`WpIk5G(|>66qj=BU79 zD{A;yMz(hsl=vI)L^Zr5CBCEhn9IXb*_bJj436O$QpY#T3EYjK^IbJBb0y;KLq8*r zo=K8{z;_jYMWLoN{1Ji=j^2J!32#EysFBl{&_mol)?YA)kk!iBpn@A)gC7J-hQeL@ zPqMyT*pIwyuXgXYNb1Fg-j}l~=fb7sJk!0?@Cu;YcEI0=CG-=9ri0%WO_Bj1|Fk9J zLnZ?6y^1BX5N{i&!8*1QPY${<6NAf2PJuIYMTrhV-bp^8qhu~cd@7kKL*8G3;VX-t z6#g!?k6D;ml>1&!WV8nqFx)^dHqhUoo7b{%C+INvp(=QC~`WGH^~KThq|E&NF*viymb7NLq4<9%oO9$1Uf%3T8wU`aE=J4MILh@bxq> zjsg?Lq9$4P-R1cW%l^tjj%bPJS8?@cmoK{Azdy|?Q;u=IHFOBPvc-}YiwC6&-u}X` z!1w5W|fuEkSACMBFv=RZGI zyk~`3K9#-CHjUox1ZQ;VXUTUmHD#P(Bv;p)|5lMX3Ym$ah(g5}ITnSK-iLb| zOg}%rF_6os;0cKa&ZUvD{Xd1d2CG%u#?td-?nrzK^zHV9OodBO5hdOlFji(Pq(<4R zPalE@1CMn)`sqInEO2QO(M`}fEP5F_n_D;bvY(pm2z(cLs8d198sM0cpJL7?6uP&7 z#(bN`tenENphuDPJze0(4MQ}>>w*b{ISVD39kh>@`2xX1@hx$Wl5-NW91Gqx!CQh~ zo=QVITjFQ8ZakfZFN5<6wb8gqj*e&}%FzsO{M7|0$B@jlJ4I|?|6 ze|A#fM3(e4%#Oi(SVcp7_s0xd39k9CqQ+d3Xig*dy{ATBH$TyfgxM0^@l9UQ<-q!> z#@1o)tZ6+Dv1m5zh0G2L$C7y}D_=x@^{Vth$pkd!HAphyHh-oud>Qn~o8mdZKd_~L zLch$!T-RRdc?y24a$i_Q!%rhzpBAi#?GAa+qo9rjakmdlEDgCs%AHydD~>q`~YTjB-g?`z%SvnGP|ftSNX@tIF!uoK*#QH z)%Ki{c|Bw*E}uR6L zrB&cs3S3sarbNsz68JNGhHTtMxASjLI@Q1#-%C*ADASB)H1<~pReK%1t;96@j4 z@i>E_*0EHb)zp25HT+t&vHvp046=fLv*3d$nOlW7V@cMVwc2ILmlzqQ%=u`URcVsw zkUUy)QsGqrI9CMBbgoZMi5ZL?u300QTSu0yq~^pITh(H-+AbpNEr~~fj0XMqn`jfvW5kQENm64yeWMBb6P}a} z4Y-*mW#6tO*Du&=if|PAo%fXVbQOZ6!LzBnn%7_n1wrupAX)n7k>9+@kuaStt$Iu zr0snY6gaX%e$1G;ml=6iehc1fVSdTVU1<{KnYBSr@*mCisv&A_hZ{7cOdM7FaFp6r z92NieBq=)@lDesm=X!z&UT=Gm2yQl}#ly523VUPKIXMYZS#`}`IH~Xg_ zWKU}UMmgKX*zH$0piDKx^pIBf)x?U$?6pN6=mXm`QlEO>wwr2iR;=AvcZq6ahegEF z_8vp*h#x+7`@U^#W62?Wx5f{;KOu`TsrPhzSITnQly8|yZmFq(*IM0p@lsBaeFLsz z17BWl@Vwu#s*&eh3Ot>H+hk7Sp?UjLs;mn*=Dwdg-LRc%U)zV<)?G_E=bfa!16rst zzS+%@R!Ztt+}rehnAcAEU>Eu4p2@xLo}yX7@QjnYQ2h#{bh(L`KOEfEK0Ub+U0QjD zE9}~>JgQbTcXsQdOML!KAM2+l@8`{|1EZGFl!LLn;q_^nktLNm;buyEY-SI0a8Gah z(6S4be|lu!<035Ck0E7po8M-C;*pQ88@I!&*u5|ZyKO{%?vp8w^BiBIBcDH}wR0<* zpQ?7InQkrBl$H*v(IJ}L9rfvZ>_gonau1)+c!cL-rZwA!C@NQfkezUSH03+$X?9v( z)GjkSv)R4rWoorAm-)T-a_aVY9Bo}bf}bAkgM0hwz#pA<_F4Y2x&WWeeATsg=WjN( zN8j5+OPi(A2{rNkPMuTRr8-w<*^ddUW7VH8Zbqwyb!cRhEfkybuu*4R0#6I;Z@$~~ zl<{6F_4>TjXWcPff5kat-^p<56EN5q>^DB3b^S^ze1=VxYZ8x3o=cI_OPS?jQ<&z0 z75ugDHg5iLJ3m`CU!9p~n3D&W~M;`}HJw z&n;J9D7p7DcRuRAw>I+kW39-((L-lxDVpS@x7K`(J>vqBS&TbE+PUzKveU#^TPQ4}F9V$Qmk}k6J89k|R zk>z!8j_CF0#p?RE3o0pQ_Tu$P~Gs^c`;7Fe1EQ*wUzr|PAzWSgI^(Zt#JxnjO(N0W~hwj)hZT;n8O*>wc( zxOkjD_dm!UDe$?R=G|%8@V#6(VF9Io+12bETFD-8Z3@Rdic@bsrm@q{*vyMs6|zGc zmE!`n9%YKwGAAN=-Yh45KJ|@nEShGo7+T1D&4tZjU$b$^`MU}CrS=sz zRQtZyRo*vuxtM!`RoL?!_CA(cZTthA$ZAih?6lPRHGBf|(>`fG%UQ$cc!%-BEeQI zpI&^YQ7!%#_?uFn>B?(P6|>SG$xGE6^)qA-I;;#ZQ4<<9W-iLRlP_0ylltS>fV~R% zEZ0OM6S|v%g+)Ec1Sab*t5>UBCreP(<&X5qh)$~K{bcG~wg$%~6my;3$!$CG?0L6& z#$9g)4$$W3@qD~k6>8q(InG}lx;Fh6^}msgQY17}8KXRbhxMfnUAXcmYMW)GUZ~zT z%uD^&?2*?|W9}5RlX`a2i^jZAje0iVJ*Ry&uF1Z0e}Flw$~vxr&uP!;=V9WSxWvNR zW{Zdh)aBqQ>g`jC@ZWfyN;Ytb2Q8bdq`q!vd+55Rhu(S3b{Ti@+P~Ay%U4UQj^!`w z_xI}YtSW_Utdm)3hrhWcY^R#O*|gt2XlK@#bdFz5J3?~4ac;ExU}ev1S662aYp-uL z?a6m1t>>4~SB;AK(%LccrL^%aOcmYaZUe9Q&7(g2HhYl$vusXI7=2jL**Uy4=Pbh6 zqSg~Ps=l|160lt1j49xh-Qs;deP&;2KIpa2YFoFUDR`(~_%iySxpJ_t^h!dnVc;N# zAK4+l$LLQyr|<~A)cYpay>W?l88K>HvX6Oq=>fu-C!a0K7M$u(@v-_jqglYYwF8_L zUT$Fj7AfpPUcow3&F?(?NiQB6UBf;evWZ?dYi2hqR?xgrau?QQ9rekS+io@`nd*;9 zYr1VLgY#0}@wC@2Iv!G-&-nJVYra{-xK6dpZLwZ5>ISgz2^V-)f@YmQuW#k}WDPCl zrJ9B;)K|*3!rAFY`qo#fF{!a!4|%uTppJfh!mF#!B3uLbz;~)PF9QwD`$i4l`h_dh z4K^#(y~l+{?xu{R`^q`f11i`oco;)BDC8S!)Q$dpY9!sX&!}Q*1x?v8ST!nh-8lKa zJT3F=!g7{T0~-HMSCa*7M zzpaMLm_63cV5iR*#`|)`vDJBG!ef=D{}RtnTc?p_9`pv;fA(W0IBTy)b&z4BZ` zo*EU$MTYz1HP_INB`u}q80XyvCThVH{44=0xZbLJs%Q9G?lu*Eev9+2GgeIH!?QGg zYpI1cqk9lj_Gb9+Zx@tx`l^Do-J8i}Fr=gq03z&r_=I{8nvoW@7C{wtNG&f1N1Jd=9euV@{KPCILKo%$$evQDXHfjN4v49)u5S= zRh6(6RCi|vvvkMpvc@LxoVWM*$VTdH1a61A_(~Hxj^`eme*hzn68biSi!%C!;3fHu zd&Z-J;uvcy>qRMpqS*NMoeMt6XTRn-5fqPZ2}L=-BFKEf$x_+)m;hK zyVScKXC1Nu&mR1(gX0#WrY6ye`RTw<-cVARm)xOdO5@JE7)mj`Gw)td-pu#vEMcSQ z#K)Sp*Re7h?@#|C)0+?1oKSNr&Eu~XwF)enXx!2kxYc`&-=j2@H|Pz=rs@r`^EkS( zhaFHBoT_@DTA`4wj>ur5mjJ&bf4LYL6;}{i3sbmdRQ(-bXhq_nf58rSJJ}E@5InDEFNGyed^`dQob* z>t4|}2%OEl*(D2VAqVtIf8hkeear{r+z2{=p@Rr~PaUe316&|Uqs}zAJbV7##r3Zp zGJ0k^&n<$kTj(EVa8j~SvGzG#*t0PK8(sBK%)O+E_1Di^ed0~|^1!cQNB{MqLR#K|MaC)kQ9~7mP-)O=+f`9mJ>b+18s~<}2_bHFHog6Z=nh z@802l{gQwmrFD}Md+1h7YaJRm;hVu0GMO@)ySX8sO;) zSf~Bk_|wqnB-wigPq3<7ZLL#eFQTE5rQbns#OjB2;Kx?-H7i|zW)*(qY0sH+nxG#w zbff4+j(%8e_bM>Q^S;Myucj@9MfZb7t#Eg@t6au z!bLYlq6Zw-rBbA2!S||Z12{{zNoq=-y82YdGzwao<(kjF&S<_Um6!MLze0n`ZDINO zsHWNJ#+N|wuSs0zRyPjaKSkwjS5a4f8VS7{PSEcRJS5n8I&=>2JinJWj_+ZkM=JDGwx5N&wATmU&HCHQOd7nE3tj1} zqepb)?VH0DG%|EYQQ-}w{nAKH>$#Ziz2|d~kACfedrDz~ud?(Ua2;M(s44Q;x61w8 zP<)>BBta8soMD32P`-h!!CmlqsesCqzg1@T8yCvpUktBu#-A?{f^FRDZ3b|MIjZk~%hdS7OoHy< zz~BVTX?EpX!EUCkBYXx0{%2sl2^vd}@4tm|o!qQ$7GDkg_b1?i+>@G~Z5~16Bvya7 zo1km?>W?mrUZrs64QuyKg*7F?EAV7$IXS?nUt=M6zMK|bNkM*kB@KSo*9MoQZd2>< zfId6W!=`e|AW!M9baC`FPIa$weCQAq$j6$=RqT6WZhB$)er*wP% zDLEVaoIRu`68NNoe&^pUgTTGq?eMZw1!Gj!_$BZkma=Gi^gQr^Axdx&-j8|fQ)vV1 zD1H%HnO>?NZ3mKEFKU2h<1-=6EmC-04eqI->-j|I#cILsH|*K5FJ&`!yL8v*j8RI~ zTYQ@0=k_b{fpG4v<(n3%t$6-1xRVLL2pF?W_!EJnsoI&Y^UlFfzM$CScohtRJZ%(}_{tS=4SINZLFh_4pQm;zPz`8~0)TvsdW~TA8 zo&^ZHNPS9P&)RRA&bzm-f!`CpLoFcPFOD@UNZ`yW=ZA?#7CI_imKGfLBJ>;;lez~xdf@vt za9+j^wB=f$=?hw@CGj5=bQkz>PWp0lK0Wka&fs;>Dm6t@$lo!z4f}51Os9hSsJ~4& zTQ0t2H8qxA`A;usQ<;ozjY+(S5mQzI16nHaU|hW-*v*jI6`cVe0DYteC4b06Zocj& z&NRW-q5O3|W9lCO(hpop2YScZ6?-cTl z4D27}**{i%LwHp$#aD9fSaL;GtzHs7&k*s))aZuz97Xb6HLpUrIzKjt+7RpOlpZNP z>SV+n4P9vq2LeXOeo*A|?sQ;O9{XD9TA~kB*zmy&zXM)FW!gS$mh1s-%J`Rnbqr0Z z>v|u<&wLOKE?S7eb$Lju5JvsF>iJhv1$+3D=jff4MEA(GXq;!ABfy`|?AyveepNA7 zx(8C`Tx)c-PD|MyQ<|19{YlV78of_dn>Uk=^8-G(;(-=@=D4_J>RP!KDxLx!D~u{Zr1(0 zrwcZ~2OB2WLUJwej~MGi-~#s7zGdk1+6n|uLqA%zk8#djy%W5Sqz^R>$!4yee_WR; z(wNXA3GboAyOjOBl6E%qObHDf(K!~}qK$iQaND)X1g&9ztUp76SCeqg#oHS)JQ|++ z-%4J3WjuMczon~gNx>W2u0qeM#KpUI;~#C`DdF@hF5IRX1+!5qk1(#idxe7T=22OT z0p}j*biZZ`W@-4;THd?=e;pXw-ywP(oLY2~iGHu4?fI~oh7T_d)S`!^_kq7!16Rz2 zc6SQi5&9kU*B}F&QoIl?S_NJkN$>9G?Zw|#&gQD2gY4tQ_VJNY?Oa?IwXMN5v9{y* zXW1nLjibeb8{9M20#;Gwbf;YW)FZ`FD=fQHAD=Qn6*0G4^;a}zXa;bpTdukTUvufY zJhO_}(GOi*TuBe>@$j{75phZhhgsSzT>Mb+JvnprXLNT`VFovJVQxU&B|ZG}6fJzc zK;9KBT;|y4D^BPE`trA(c*dNNC!MYEoGjoR`e-U(%^(A~Wy$)Z-VJ!6I7|68ygxOx z)N~c7A6fZh+zCCxnD=HdIP?#N^XtMn=pI$OUIV&vIgbqvp`Zs8ya)q6qJ=)}@;%{m zYOCHIF8%(N60L?>gg3fR-zZsuhkacr8c>x=5iOXj!4EjO=xoAkIK`_OfZ5*Ow-Zh9 zB8}c5o~iT`jk?$6$2ZriWU|X!6dxd@^bP_?SHL;c*glmmR=M;MG;E^xj=LJ`Wo%8` zNIXP^e!&w@v`|GaoK*0N6@3X++tU~f-$#5e7w?v92ET^x&Tgar#IMlLm%0&rGxWKV z3R**a-wm}eW)XGG^}&+Y2FKAe&xSxJ&1UgpM8iURD7lxT?h#zK z-#7z4lY%d-=ND+nrwYwi8~hItFw26MXJCyqc(X!ZP*R)lIKbnhEqE=4WG=swcJa8X zryUKerFLP4qen1&fJWkNP+jjjvbP#*p$8sqYVZ|3ZtY6m7Pu80 zX&Pl8lvT7M!Fv{dfouE2A2wcfo##4r5*2b4bIjl-1Z}|&20V2N-h+E6^jSK;D;;#v zJ<6D8H(iY@uJ+E$FIdPk2gR$EgXgIXn00{$77fNtKOa((iTI=)CfpF3ah>j8={#i) zyG7g6SmGf-cZNdSFVT`op;v%sys*&IpdS+8Gf!0DEHu7)W4t;J4Y~3uRa6rwX3F^jTGA@-X3=Dt^~-)m?97WDbO$VnOq3tP@S_ z8)u*wX?Sl6`4Yhs*XU;o_2EQ4DA5p}eWQR?lbp~=1g@z1RtX{5pKX_KXwj?U_khDw ziy}To8$6dB-Ur3Eo@K<(2-n~rTKp~44R;RRL()GaBltFZsD`$5ac;nir^J8dYevj>Y|l$(?LoYT~ot*6%QBd0$+PhM&ULD zEn~yuL#EV*fg!55&lYIvXzJLz4$i_C5-y5s)Q|rg0KaxByPx}{fp2qgMIf!&(fEt1EBIY-6v0S$L-5z;G5X57#E%m-KH-Jc-N8 zEzYp(okpKVAOGM;*Y>2|eRdtgr!?SWo5(5nOXVQZUGQC#6nrjqZu};_CPg0fCVWT4 zY<%wG<6*wuZ9Q_tl_Xw1@=g75{Sj((DW7Bo2D~Use8umvT{$2y7j(=M3ptD)!E@>D zgPVqUk>HG~%-i}Jd648Ke5}L?CBCHinJc?~m3)XK+j-t`jacE>ZSLP?4eMLO`Zd$IrJZ-8M!%I{ri>&9G4U&;jq*dUe^51HI zqrY0X%(_As^sX)!xRmvsFJ#!I;m29eB0laj;v(p(`@2A?k^NEjaLC?rJ zck!>a@B52Sz~GlQ_5{yXSZ-LE`dFeX1f%hD!u!;_#0bu@pgrR})9z2b2_Br4ZP69ZnE@m3p&OU&InIb&$t^4kGl?e{;dH0A5C)a@RT)l1!e|*>NTh034I?vx0fqZ zm|O6P65qt2v`)!XO3z(G;O7dMCi4JByZ+Aup8aejxNE^zF@}6EO2A4rYABuw`l^sZ zR-=*o>bqH*aqUcPTo`ea_;fEMw>m+$SiX(`m%;*Q`MZ8 z2wsYYXTjp1;5zx`*Wy~RutZ36>ERmJX2ZKz!ZUA&@6(cFpr1-Mq2Mt`|!;(2lFGwu7$tjqP>`^7; ziIKVh-)gT8q^}3>*3j!Z9%lFy3LIS4-VzNdI1QX*T(_1?8#rUs+`Apm^KPq)Exv}n zn!=Tth%XM_Bl(p9&F)O)@m=ODgsVY|{nlAiHy12YGJ^rX4ZczkxMx1bJOFBO8pkf^ z4?L?!f|+;TrDJ4gj^E$ri=Gj`h3dRWLHMU|AY;QZ4_7~gCqS=q4`k%1*4g?e#D6gU zZt2SKvvkOkDGsSu)R`e(z?q4bl8hho33|>+TNS$UO3Qj83&9#sG7fB?#o~jC=Yt$b z0YfdxL&X~aC$tY-YYE<$S-eJDaxckQfIkfE(C}EWUyBKx#Coy<-)(Sgo9KSyZNzGY z+)Df}MuvkdB20D95rVb+s&P&GQlEJ!IOOu);LoXs)uyQE5w{hv3bPfXHT1n?nOgj$ z7u_?VXB`pW*Fg3H4LC-_10s9ORz@Gx!oej6M^9DtM@7R&?JfSO!pwn2c1Or_m8^sK z3D8`|a`P}|Etb>AJ5?mVRLH`NFE_J@CgFlLE{VScA8U?U*RdwUhq3mZ6b^Bb;eSj1 zs)c_^UV5o=N!1!ITkQdw4_~hXlDEK+Fh=!5&5EIGWKZohQz1AT!zfp zP?_0t2zX@l2h2)YD(XuigEF?>#`dCU-$L?3PHfbXcppM^${Sqi#Pd%cS% zBSY25K?oVIhQ`%hn?DvWgprvLW_0+=-FZ8zFyci+O~uglx#X zf4h+bJxog;CjF*br(EbK|5-tY2B8lA60#$Wb4~-UrDkNu4)9&^Wu3wo#ghe|(SNy4 zO8&x&cHXumE7-WFE#q1UwXfl|sK|V66X6FbcrCQ{{Toi4)J1Yz3%x~p9i?kqU$~Tb zxjN}mc{y*$b!HHFzd{DV$VFwY%Y_e(dY+P5B4ix#3iBN#voPSjTzAY;3p|-SmT#fa z-wm0$!aNUpbPt^(;iB+<@!TaZf^J@~|FdUf=4A}D%1oVM*Ff;(&cNQ&+pxgC8w^X38vqB{MBpXEkoEA3l#8L+5W^ z&}aN3RIb9^0(wMNBJtGG?-Y8RXaevvH!G$2O8w4rOJkk@neqVwch#?^)pFH& z*n>Lon;i@tB)K15SltOej-UBD=Us*QCMsUyy#b$*fqjh3M0Ic4f_P_sepqL=oDjOAqhO#@?<%y@`z`m1yli)Su<8$Am?njg(D>WXfl(sTVCZ<ql|s}ZGMJtplMio*uit zoX!y(DqI3Sy{(XSV{R#j;JQLat-6%-vvK{2!XcqQWPVCxPDf#`!4U5gXC3<9lZD$( zjmoW|VF>-!#Y@7El+#y}-fGm6ak5BZ$tSTs?-jJB@J$`4yOHQF!71UB!XJgVOWq3K z3;x70t8~Y*;IoY|r?$i)nE`mQhM%XdcPk9PX&N0`)>I=`(8CU_wcw93<|V-)VmP8T zW|JGdwU9NE%w?k1kX^Z(_!$?khL3`?Jx+_h#(b)R7T55aT$~>BBj_uUf_?DjSl60B zg!#1pv2@jORcu`w6%!2~4sWA7(jY`+i;t$K& z$-JxZdDIQ?xAgG+=2}u$UN-OQDEWCjVb+I|-o|V3KoAd>a0jV1s2vP#+f|Q6%f&kR zXTE;)r>d9=(rd5RJo6W2l+zxXC>CtbWC1TcAFqmiz zt{FD?x`HjALR;8LOnhGO!6+Ck2 zubFTjgB9k9&5P+)YVb&>e2(-o_+I*P-&%a_z#Y8zAW3FybnF8!?lUO`L1!hwwW8O6 zUt!MShL&Ei$}N_==eq9%rUPFer=gE()Br6UJ-GKR#OO8!9~4-y0EreX{*Y+>;*|j} z2p6!xT^TdJ;I{v1V0eZ2a$+`AFW#1<2(!0;!y)W=uGw5OK@Cs`|0d1%DlsH>f5!P{ZrZS}0@ zN{zWnr(hA;XK2yfBC(YCl?vR`6$2$4-U`060te-T)fVeIFG3Y^PoaNHoz>!jVs2PN z?-E?0#i#q|cxP4gZihPQF1%glTNGww!Oc@JFau+T?SGgFuj@iD&=Ne>2$}c`F0ZWKBE7-xpTq0pUf)PWy^{un`9D~jT)q|FEhTt{m zRO+VaWGomJImeap++XRDgMOWYKeU_$zhY*b^0wJUHTL11#NM}nEB^x`U$>xp zinpxbHEGOpGqih#pJIr9Ej|R+V++?nPe;yw(|?*NhAv4G-{`f@Cjm{xpTjI(B%`Jq z(2fkUhfDmUk1O8jJ&-V4CjJR6>Y7`nsfs%67Rr0?F!#?oNBM>2HmA2KY#$n5h#k=n z6@JF-cE1;OxRJ-)WQK5|H@B$VhdF%Z4W7N# zucEVTdqn-l&eGL;j^bvHN_;l&F|OGIJ*;1Tb0KCh`fjc698fQ#`f~oH)$w)+;b-gy z{o3o)L)`65_g2x*xK{SK2*boRuy4-UykOyZYI3m*2ma`6KI^!Y`{3EWmlBt8?(9>D z$2B(Eq^oZa+Syd69a+zO{_`5op8ra(>3@hOG@WW@x>wMCeIkMT1|25P+W&Y8`|yyQ zvGV_DX1mRF@5opEvvRE3JoF~bF1~}lE&WgX?ntk$&nRx+gO@fc-*b9Ce>rbVy_gE` zTSH&n=9@{m!nyL?d^GXxK_1#5PNiHOz@gJJnzEJx`9kcL%C!6EIH6KiAIyGXOVonj zjZCbE3O30{>m0|eA}t?MnYk0x!^lWAuH`T_H6&KQ{87kWcex(5SgF|~;S0Yz^ICb*MMb%rH{15Hlb0RiMSri-h(_yq@9t{rfal6Fop zz68vnjf0!fN#74-oakXKD__*a-t(h*LG&_uE&u3$Nx%EE%l^19oRg-0<-T>Mv#-x_ zzW%YR84=me?sjJr)jpNM9+juGn(!)uCQh$O2kXTXV#{dMH-QmLW{BZsOFUi5=cCT< zo~^Lgd?NQA$~tZ{wOlibCpb~VCeNpV*|Smh1_NlV#}S2iG;5xn;2e_E*G_fo16^pk zfG32Eqe3t9n`^H8B=gh&wRcl8-cPiPpL}m@wi@8U9u#Jl#{C*`7y9wun_=1!-Ie5@ z=$Lv`@gUyWTP%vk?+vGXxwD$%_olS#F3QT-e?2_>F8^Lp&^Asy;s3tPQtK|CKPt8e+Lqm}^%wYV#znb9Ps3nt9Nph!z;-+x`ESFO-rGE^HC4d zo1VkcV^2z`zCkt3#M(z_*0(+?&6+f3)tJiGgjXJP!Fi7JJUgtAe^jR6495TGIi26r z;sw4oVoe`(M6j8o%zkQU7$bHeV+_=D^OKa6Q>f8^?xy4u_L7rR992^a<~FO938Y!c{`Pp^6b53OCD+I9t3)4vyV;U6 zwHDW9)DL>QxDTUV*{{lVQyw+H(SZ6%>;=pdl=3Q7Ib6VSyShao|8T#}NG@ME6So== zp=D18)QhrLoZUuiQhJhq>#8*K$WuyQ>_sJ}@6gpcyD|RFb^c^#Tnl;JG^yeFbu6_2 z`EI2c*3URPv6S6!te3el9`mb4AG%xO3pZSGPaX4lVHJOi_W-wvrq#=tXA~`A_t?_k z{N5)gWw?Kp4m~VjA}9FpwxX^&c(PHT`S?q;RqFjdi6=U_t1^E|@-Rm?DQkaq%WQtW zFrMd@bm(~Zce-TZL6m#jR6>4HQob=->hr`8<6ZeH@rhVff3H5Eh*@|pc>VS?YwkAf zJ7qHEo1B@7yk5_X%i@02rjHnTLb;xQG3K9|s8RQ5O2H-c{oDfbc|4u$Y!^77ePhI0 zD!ci$k5;|YIjHI)cvc5m*+YC$So(|M+2! zue4WH{}D#@FSNDq&yJvTFXmFsv%giz{qMQG*CHC$xE&>|n9sM{>>r)5TQ6 z%7$G3Y(A3s9r3)liS^qpR)liFJ+Xv1Rex4?v{Apz+xsh+s2$|IotEad594e(`|5h9 z7xJpqqa-%Wv?EVYtzR>#X#P@MSr`R!Es?A3Q9Hmfmwd{AF$D``6to#?4$PLcX=E6*#D znl9^WQs)F$(y9T;YT=2TCVDx$ueESiot4{-7rM;H11i<^J@jhf180wV19{-2Mugrj zxo+K=lgJh3EYwerw{X?7(|h*oka$nKWnef*eMw1ss=3*I&lf4gHaALD($4SO*cF>c zpFPny3r5bfM>S%>i4q5%HIR>ack2veuVdXFx?h7o(&rg{pITkrPm6lA)JwV-&{7vJ z>kuX1e{lOvesn040=DC*@3!$U(pyEH7|ADnhw#Ozz=3}E2)&8gd*!61e+qI+v!Xtb zb-5n!a31{{cuNg?ahvdY{3I$nAI`p3U!0mt@GNRdG>w@OV1>_Eq)N?nBELvUE+np> zrcS*|rfG#&5-=7uTQ!J_zU#&bfzgJ4%PF)cLm<{3uJ>d}Gz0d}C*-!P=A|Arj!!rA zFwt)uI47DB)s5?P&!oRsIZqOotCy2`xz!D4vioG3)v>p^;Zing;Wd(x2fQ(Gx^3dW^L&C{E5 zZf(*f8Be~SQ@<|Xum%O^WYkCk&f~RlN7a}&{SExv@_U}s#2HY_K3ThL=}Jdh^2k@+)sNVv z(rbVP7joXG8F_29djwpefElH>fh&0dUl%d!RlGomXO()$RL&l>Lu1bfbwdNkYv3e~ zm=#C!kEAh6+f2j5JMzSQY0ZD}CC#KfCZBnEh|tG5%s#6}?0ukcF7o@luBV1V4^_a?N^sk= zZ+TRWf1@?H09BZi1F@aeL>y|=O&j0ET@wpt_Cnw|kENppXmf-)^knbm@5-^_Q!aA8uJ2GPrOm@UtDTKeLUx%gdJD z=XDp-lY2Uc@HU>Lk6Gs$M{4YcZav5w{k4Z+Rsx5&U;e%)7)nJ(4jd*m(^xJtlg1U@P}*g!u+ojIgpP9{;G%u^+Y z?7nsI%%;bSNoqYfrnUdk6<*rw4)w~iPxrXDi@|Zt#>-3DRZ86^W zk$M)MW6|0?hC2K~__v*D%o>F{tWP#dL|=0P-?d`k1}**O(-Kpo4{^4M&$ZqhtbwUr zJZr5-ExW+fE0lgybKt9->{)xV=o1vz?~R6jAy|j^*3>-t{YmiPA*SHIof%(C-%!UJ zY}djYzEnCv;2x^#pTX*L<#DJJGkJBD{S016h;c%VQAa z=Oq{D@6|3EG3AQ8NwfZ_mQ}}yRzbcyP>&i+q%IkX*<}w;rtf_gDXI6n*5SRHc{a1u zJIUumPdccayFO{ooZZE*Pz$vOrC@LX9e3fCg|pKuDr{xpNBQ?Qv3PV=wRrJ$La!s} z2^xE^-*w-~xMtn^fge8hwtBhW1jZVYGD78q|d;3V-JI z!<$M?AkhsDPrAqQ8Nd!C{S5tyn^f6Cg2};C^_eNP6waHa_Cf2?SN&Eg$pM@tr_X%R z5WEgfXvzLp_>|2C7NEp7f}W?L`w_62o;WoP4{q2Tc-e4C2H^dE0c};@ z26IVz4S1f02I=A(sJ}KaHKDcuUyrtc9hLvV(N>Rp6$DQ^%NK@s+x|b)>S$^;?3c>b zXoQA70{z3&eD)2`1o+#_brw@*H+M>$K0UISp{MbjV*_;3N7kRVzjNwG^G<5iDhA$W z!6eupUejk9p=TSn+dvaZIhsG8JqT`;NTO|&w!)}HfeK1$Q<-G=pS9)*#{?cJ&+p4u zA=Ej2&Az99uUMu3sLtT8l@SZ*+f9CxXo0`ebf6h?))UT!7yVkw!0Tp)`>hl-VaYQ? zv`S!WPCfj9=y4W$IE~obg~7G)`TMkRxQCx-8`Af&H~hon3QsH6fe+@m0ZfvK_hqUs zm=8Z!89L@=-E>fY=#wXn9Fqqds8i4;@$9c++oVC;oN6N z|K~Rgw&*n}XE1nx4X$W(zE#M@-FH>5Abp;p9l%tar;k4^4_zU<@HuF}b?L>ic+8E4 zTCz4^8|&d`Jc}A!TFzGV1mT^ihep2%$CPN=Q768rQG2!!a+na$F0Kxo3cPrZ@3l^; zL{B^toIqVhKhX8gHPh&!j^ZC)X)61=O4{@pxIms|8d^PNs@H*^$FyO7aE4M{ucQRy zAodx&+X5dj1aGeO{Hwqvly@E6Uxoe;9!#Pkf+w+K-Z}-%L~k;dIXYKg1)c7?5^RS3 zu%J(o->c>%+6i#K&i-hpz7^Tul74|+guNZFH(YI^JEqUiqDetRwq_SE4_up{x@X$P znZ^{x9t1(BpG?qWoaosWv}G~D^Ys9?^V}qL+g{O5O;dO!w(AODw#)T8W zgDvPAB)GD!+gZIcV}H6b^ETb!Qgow8Pg)-PoZc+(r^<6zh+jb-*HYSDH+AP%3%ej* zL#fG?z6!s?Yh%-z&Bxcd(DwVgG$!OcYG*;04lP{3eZ(-ezs_PpEhS(H z3o%a60W=*iFEOBQMZVUnjUNOIWqpeMt|V8CPMehM8}eIu-tgivZ(i%WMJ;`OMgs4< zKbp{6)ut=4T4DrTRDna|>>FC!Zr&IC%;-y^TXLC?)!28+KP}h>Ixvm(8%%$d3$QRKDfQDwJMe3pOt+HS_S&iA}zY~@+GBRy?@D>c1m=A^x4FLJHrjn z7j@vQ$ZJD=jlCu4I)t;gM1MjJQPABj^dtfoQn!i?1ony}@nuxkUJSj5+Iu(Wy_-hh z{ax!5q5U)VhoH^5dTX`Q$rk((Y8JPPs+4L^&U;5W=k_WD?b86x)uMCD8H=MU2(?)@lXqSzXBANHlEa-+Dh4jVR&L`pYE$1g~(jQP=q8?@rP?h2si# z)Z!IApPyI!8W$&8KQI`+Ms{0xR9(Ew9ojPL`f!SzSA~Y>E-c!ln*M1m@XZE|bwDqP z1&;P)Xf#H(@}EU-hewr5Elj$^2gc^1{yFN2??G!YW0hmVZbnUI;4v$>LSBW>=PDgm z^SocsfgAjR$8=T$Q&f4;xgbfcC^KW4ct8qq4c(+QL0e($rG^in1S8A2-u(Phi|>Fl zqx-WxwD>flK>?S!G%Um_E&AmnI+gy|=Zgk+RX2E(U`Gw?;DBD~yxH~zqn7Hy4KJyU zXq-AXRq&lOa=ca+7dshz|@xPcB2m;+_HkBk3})` zd&~N&Ee&wt;3AN*s6(`w&w1$L4@1AZ_U1DFS@vh<0oPoVX1BEu*oW|#8I_A^Ig_YsQsdKM`3Hxe~&rcdU zlIoSE3h@0=)%$@~R>nwv)}@setr}W9_9TUkSXR(dT>eOdWrZ~Qif&u&EV$EdC3*qk zSEI)AbIkF>&*dCX-zxa2(D!Q!#so)kkoY3^zy07Z=Y!~3M;{8V+=k#;Q{Dy{OlWm< z<^4@vzE}eWUM3zLjkPU-Mmt4`j=8<+CW4m0=)(#gyl8HWcrt{mNgZ1fa1*>Vk0rbZ z`Q`E&faAa~iz|sQoFj?P5|^R^!5ibxe?7&wvEZ?}>VjxZ@Ow!-7q_ea+<5sW@To7* z`!X4OYbxNTl60;01FL$^uUb4Ui5cN4(8bjK;x#Gb#<)QAH3GjR#FRSkn}x9kr)bUa z7BtS+3A`Zq9PgsdO*alab9NlI9KE@b!r9{48KJ7wr(qQH<3A;Ov{&`{bjHVvp#5v$ zbkS&$1E=-UKdW@(_-8IG0?uIU9{rJ_yHYXk4WG6iNq>V51`h%66U!1L`=wDIEx{Bc zr#?00JWoA$Qu{TFv44d*ZTh(kjZi_0lDrF)_>=FrHEX*|AIP?Kn=YvAG{8}H_6BdPj>Gc8*YY9MRI5?n;+Dh)zQ8$LE{DE4 z(h}{gd}Od{Gc<^Q#QIQDm?F$47{D$PHx{%ay~WedDZI^RXEnb0xo=?nvfT{6$iBNz zz=sHC!ek@}$oPjp)6$HKD)KWjnI99g`3 z^k*d+fqRA#Bw8c1E^eH@WGYDcL%(;rqzuf zd!g0pCRP05o#cXsc+4T%7kV-L^25-e7RhXh2EW&r3bYb`1N!N7mk$QMgV=tKzVbr( z`qbqvBi0K4ci~ULK;mJ(`BjQU$3UDY(K?Y^Jf}lNwYY3P_?6yD@GRC(;@fT>+E$6K zBAj^*^1TIvAr)|s;u z1*QyVXvti8{!Ip#SHIKTA}Ss3w)(VOpT#GLL?JAl(>3?}H6(9P4s`+v*?Jd#VX7s$s5R3*~uMQ~Ex`!{chFM=-I1kKn{8H!}(yI(vyLj{PbV+zVunA!{E(?zelxX9!5M#4bPTiI%n4KR$2U6czjp*atp++l1G(wyQ=84`oQ7bXOvKRhIX&z9&zJ_P2@!f(4Xkk)w$IKE> zbW$E$asnLxo^S%`W4PuKjJjwG@9#Z29P>!$2>PJvIcASwKm*<_Uu(Hm=8)9efLGGr zN$P~mryR(NC+h>Jdt3__k59o1lD&7~3ejXxdlTW^8^C)czN^f?AXhD{QB{b#=+bao zczt2$%LUJ%Av|NKlyFATyy1;N*Ep^)lc1W#RS@r1o!wVg z34fe5w=DW}UddsjW`$qsdCUz9T9aN_?xJYIF242o?+kdN4)CVGj)CL~J-H)1l-jO6t>t>)kGS-8@yVd; zS`z!3Uiop5lTdIcKF?}2#-`&^c+rfWw&HBKT)u{D! zWm>#y9N&v&|Dl~5;NS%8K=3d%{3!H=g#^7y!-vt}8?HW`v33Cl#{>5|3vKg{h5ez7 zTiP+O4fUw^R)hB`)D{KbL1BgtennO#nsC9y)-HVpdZ2QSOefp~y#snGe0I^k;mKI2 zHPY*${himyEf)S6_1$FDH1v!jI$O4_7Upma!R6xj=E$*^kmE|`x}eKBQ6ofeWO(fi zZ(rtEEZ`+A`m@wd=%`NhUm3L}U3yj0M|3E09_6W}?BjwtaD{pOzm ztx>c|Jd1xkpKErKLsr*v>7URZalgrE1^+`~PKPe#TS}twJTH|Wvx9S4<_rX@JLVM? zZCIoCIWSu&9FH&qqcOWk;&owO5Ow#C7ENAeSHXz|cSb&bn1_fZ=zQF4)jNg04DBb}3GR=%#tNvX7gfmWBj6Fuxj?>a7W$UdIc0CkVUKJ1 zNx`ep(xbjtX`(W2%+KH(3VIYg#Ck4Y1GPhow)S_xdbOhROXt($mz~g6sPo->f{{eK z6bNQ^7!4jOr^du9Km z#M=}<4qRDub(s^>;EQ~u;bY*Uc+q9;2~FKyb6zrc2QShP?-aT#fsX;dd-I)7dl|DW z8u$s^Vun?`MH%SI-xRJF{y{Cwq(wkyoguNQF-M@q)4;r(iP(VNmCFW(WYHl+8$FS` z5;XWtf|vQmfnE#^hQ*_R<|TO8l9^8`+n-aUEst5KRxEQTh)v)Je-m7a>-Y9!%&Vx? z6;siVluH!mid6KmjF?IBw#}avF>iAjd~YA4ztQPERl(YV>?| ztrPed7*cYbN59;z;T>CfLTgi>akdL@3YL@H!yK2w{#!CbDl@Ty@oRRSA@xzq3@iLC zg?_H#X**@M40?z7tAzbk?T23wf1O5#Z6xWLI5$~`6MT*i)xRyZPK(EcxdlBaR}+>z zPoKG&7XM^lri1Va7VDFHKSCe+u0@O7Tj#3Gy!|s@i#(S)gf6!4}GbS&}v~$hf2o953Q+Pcx)1)LHWzGsU#sTdUm^+mG z4}O!G6)nCJYPf<%OqkJt78AsnjRr<0?p&)QL0_WMg_IJ%7xSoQOt*&WVTWUwov#fI z{)WuJ5Uy7V#uTmx-2VS_3)4lHwczcu%z}!}B3d9c7z?_KPB$VOf!kZ)$qvkl5N7VXL+;u#s%CzSFrqlI#Y6`VfruD_%rRonRdkei>-rJ)90r7O>aDdZx*fYL5w=szy~Ep6)zPPxws_z7(+E1V!_h;twgT%_luubx~sq zG4<IjW zzLkzGHCgX$olX7Beu)wWhf&6;Stfp7ZU6euSz%Elu26rY8r|PA7R|k=+xwsAY~|st zubZxNX6`|qwYQ1yA@{#M%#O>Ov*(opB-d7M#6V6{v>#t>7hvx1y?NjC6+79l#z^}@ zwof{u!WHYL;ZXkdYMJc=k~P*ylOLbru9a@9+3JCsHOZ-Bb`5sj^IkIle*X5hp^1I5 zKNMfegTFV?kGi;V==?Ai zyb?KYhhVd7DcqMdCy8qt!Q^@Kxcc^KsI@DbQu8jqurj+>F#YQt;jfh%==-K0ey+ax zbcToCv7rMy*8JtLHp6sDpWNo>R!51et*1QC{RrQ|8CU$U@|`GVmgtt#o;tp{#=i4s z&jO5V)_-dLR^8X$H}>X(q1k1HB*D%^rSk4yO%HQrTm*ibuVDo@NZ< zt}D%Ge^b{sPN_2g@O&DqWo@(LJRwyr>%h>jG^qMH?Uj0{IV0_S3RzH>9C0_P>3^N+ z@9KHf;7fV?RoOqhW<_5$eD*G@bC&UhHJCMW_O%NnU$mmvxY-4Fd{@zHLb>>-X!CH* z4ED<+6*z2QI2SXrm{(gxl3c@v%AdGvxxGBancA%O{xJ>N-pszTd^Qh^{AgfrXvDlW zEWew5(LyeD$w!a9mP>b!ck-pFBN3Z#`3+{oN6fpSGXL{7b5E#A7apcEZ&tgfiiXdl zcKuV?3j(L`nwU63tg=^%hJ3vAeQs8VdGftAv}VOio?PxNl^cAL0`EpDdt(IEuC#_8 z=UvZ}iWZ_9;Z;=Vo=~$=`L9Urc@ ziw9Mns{X5bf|IPgs1v_c{O(+4lC@mnbB+2nTbcPMm#|wFIbtMs_A`U>f8m`S9QK2s z$2n&jA9^{kynWVjk_QzK}ZNHERHQ?%CbN!)U+bvrR z9j-Z-9`&m)=fcfXKITjzzj#CWvwXFcx4jFmLp_kcjGgR#T)kdU8MQ8xdGLB!ZTjb; z4KL4ez||CTt;T|E?slKo`MBWb%T%Roh>d*YXZ4#=P^M`H;(_yJT*nCwQu6YfmCfX1 zCsgrofwVEUl)WL9yO}f1Qp$Jc4Ee?t)KiCgl8@shhc!+xj`fQs^09hGk)#YXtjJH^w>}@G?vYP@ZW@RA zqTa}pMU3@WgQ_>C)pzo8zb&uysI6J;6~UI#;O8|RaBCes+)~JFRy`-bb<1wg%utyf z3o_csZ#B2=GUa(?B`wG{)tTbV0vgy3&mU@*(N5nxf-0tI#`d$d@{8J>++ zub%&<_WvR%*MU6LsZ~qLJvy&)PhLvlsW<8aK55M*Kep-U4Qp9t>}Vpl)$fQ__VzcG zOk5{j^7q7kr?&r8@V19`N~`wN=xN0kZAUm~Ld>WsC%@2LpX&D1p)&}*k2h)$yV4#{ zn$cwvr`v{kIlmQ*dPIqRU+ETB4^`44 z!*P#zewd%R{K|aRox+f}mGNDtbk<^7jjdtV_2hB`?P<^OjFQnuwR^IU+S&CU>*+-} zrvFg-P~69UKV-2!l`>YPT{w{Ew#{Q>-zfh$ce7?v9UHl7di`F<5oNZi5w-Sks=AM9 zL#nB&lI3s9-s7C@|7s1;g>&wt?H_N^-vnT=Nkh!*NtKXW6HJN2%EPuWl#NUDCO&v+78fq?n`&e^N&%6n%=CCJg#9U%iCD9@ocl?GR0-NWwW_ktuSWl< zPos7vs=djF^f14x+%w%`YH~GE|L8W7dbH8{#FH+J+@RQ^w+zma%0w*6o)Y>Wr<}=J zYGoyB3-?VphG$h~<5eYUSnZ3Kss>k!3cZ}Lsp&St=TP#&RfL+uy~pRVkM7J&zyUnFd=7r~=qBx{l7~^lbYhQV zTm?#$1>C+Ql zQW^Jt>gB*46uPVdEeK3Sl7F&JZ#)w)^S?-)sa|^Oxau1NuNdgx`b|()F7PT1@9f%% zuVtx7ceCfQ@16Bk(>{#TK|W2nU(W$_ZfK~Z-H-%MD3;2M2>ii$y~3yubd;z(&vhE# zc&l!FxGtQ<+s;}nn!d-EuwVLR;27Mi-E>BFo;v=Ll71st4EPn#9PB!TRB>qG<`{=tJXZCF!g=oX9XhCiFEzzjlrua$mO`*30&*QVQ5NPW3ujl{U3) zP8Ux!rjF4wH1H((1xzzgr_4Oh;}z;Ly)4;AN#BVmQ&#oQJBT(^9_FfXrK4(?z)NP# zuJ>wlnpr&fb4h!AgBlufNnydMOpndJDso*_ot))0WgSsjz1Tj>>{_Y4Mt+#UR@6GE zkY4hmETfik?}(>+CHGL<%~}%+3dS_HKcD9WhIQ_29Ye@Ng}$qX`L*Kgi*nc}V;^z# zR(Tb$uDY9jSt4T8n0Y9RoqVt$1B(h?VChf5jGVP}q6PddbzEh*<4?zn8QjKgExp+8 z#d`jGLr-7JQrEh@*vIHWddQxyRbsZ*=YCyIaLCfv&`ASWV!6$AHxv7ZUYtb0MwIVx zxcLt{zcXh+b>!b}4r|d!Wp>|1x4zxilLi&A)8bh=xL(S2w7OogupHwmJIeS6&#SIV(H~dS|C8Yb}_pz^m!N zo)frdCX>EQ4CY9=vOBTKB94k^t8`L_~kqw(%=7ur2Jx7l##4bF0?tqzXZO8cG33@o9*nRKCc z>2TJ|6l#-=7+}O3-aWj;wP(ZfY-j0f=x5yb%L~Exj&%D!F=EJW8fobD(VMu-2i4VdS>rN zg5hf9d`akY+&I^NRNvfA>70#BJnPFu&DMx@1q@5e=VT>Wx8MZyVmT9zDB)#RDY=95 z&m7L+C5-qr7oPF3(NC-?M=mfhhtzpP`rY8q8Ct{Q0Qg>Blxj&D|x5&7?Hm8j}p>HpWahLE(>|LT63AZ|4 zy0Z(X^a-q~P^&oigu}XF!dyCdrzInHP{;nzz*S+a!`;lPPnU3);ZbtksQdZNb4%Cg zw!6aUN1IaodgTbd8_(oElj`& zT&V9jHK|mP)qPnEt!-F9{rz%7A#PdnH2>7b+$Zp`Mi152&9@pnL!BO$pKnaRqpFlF z&!?JHqxk*ZG~$9P51d6OZY`8vujxc5jowa0&hMglr-}9cCF~^+IPPXo8eW&c<;)Sa zD)F8gPYHRd^LBlwcIEDZ+&{}tBTMq|bLn069(~%_)ajdnd}Exm=o^F_vxNT%_bKqc zGz(q>Mq>08>(a>7JTt>y;H+hQWz}}Ny7?zdZawN*M1J1>`vEiCE0>rff^KOJ9_s3y zbl9Pg=QO(40;+VNIrNdC$}9Cp@~@eX-Eun>&Ps3+rJS0Rp4BPM1>SE~?drK}?^-T= zK{qC5F=9f)NOELVVP88(+ivu=iJOvMk>O!;1)Rinw+&U$DqPrWSdQ8HaI=X7{)w|H zqVcIXeHm*snr#Uc^jCPE@W)PO>W&)=odQaKux=G z-hIF?Pr1p3XwG&&MliNcMN3dm>+_PoS5)Bw6KKSOKPvj`Nfq~dq5jXY%79M65fxhM z#(Ap{IGqNzaV*_?&00`sIPZNQOKrRc3l342#%M}edPx!lBt`!_Qr40_RZ*L@E7H^Y-KkDhLTWe?# z6qPwI0eg|utVV+;6S#+PXaXNM>vb$aZ4--{a=y?Q7}v{RjUm)<%Pw7aV?%~k!^MAh zq|Qmdwe*nwxlS>7tGfJjCQIEa?AzM9p0q~;!GbH@ zT%k?`CzMXmx3@jSzGpE1n5_-TwQWUaVJ7?tjvmnuS1v*r%YmaQyy9;Ez$nMz|6@IXG#W6POJ%PfQa$U+~P+ z9r$m;9>!TYZ++`b7Y}a;%=at>dHpWRv!>i5)N(C)D6q8+TqL+eLGvKgHv5Iul7Xod zeur+o%}(gWgjhs9{0SV@Q!odETj5HKUW2D`>b|uI zx(AC+lyWAy@))|MA-VwK(f}V)>yHoOg6p>uv<98w&K5#WiWXv*%wJXCdb_|WoNP(* zEWRADMO}G+*(!&33=1BK-cZB@u2Q%rN3K&(HR>X`R-i73XSE%!S3z(Wze~(PQok~1 zn5dssPs6M4EC;`yMC;N9F|dM*%f_W3My(LtlflhVLznW?|ITxr!`~7`cufR0A#~xoV?eqMGMlx#9z{hFEb>zb*YV zbSK{MWP@I_vnb>nqA$2GwL_-fTp`D4&hCb}i z+Z;C;ID}dbtikywZ=i}POEc;z%i5ti*uamfcBR4!SWtC7xD(HW##%k5@ITxakf~vL zD*waHMjZ#InojRW+Af_D{Y2qRpw(2wJ4`k@#@;r`S>TP8xAhuAj|5Iwrqk^ortd}M zgQhtNT9_xEF`0#XW`AUWi<_cd4V-aCgA<7M!#mdObMar%f+GUQ^3~1b7}}6IBc!5e z@wCpp5JO9+d$W$PP9d=qT_LNoLB`)gwQGKALwV<&Nx|z`L@pHS#tMOoZjd$0cN`w2?p=W$c6E64x z_252r8MB+duWiiZ=K2VxH6^Y^R};OQb4*FB_P#szY&C&T5b}=$?w@Ap`QXo;NVKPY zn~yMftcg8V4HGiZgP(PI<s`o2v7W4>9i%}(3S##&1NZR`+VY74h@{oUB*;YMd#d7W3Me%wX3~@E)%1G!3_5w2h@|R3F>Q; zQ0jFgH!Zx@L;(*0b5-W;AKQ`O2%NG0^E!h{7_pAv%P_PG(G3~AjRc$h%(R8=-;K1a zdF0pmf=M;jfLgg6{t>GpSK2^B%4J?Z-;SXn38&Y)r|#E%%-&SJ^K-TOS#K@89{Iq~ z%`Nm)LS4~PqrpWi@eiQy8^CW0n89pvAuFXG)JO2JiG8)8gR6a;Ymw**=+}DVx{weS=YIP${ZGW>zeJ!^R-`xi1#|#ZyGy@He!)G6@BJf|T zP`{+)gE3@NY4{HJEyvQ`D)`bxU@Bh*K0%H6iFs8I(cpM=e?!AxBX~#r{Et6F!(i}n z=_wlhifdOJ#FI*$bc!xxG@4J)x5VGl_-;ZRIZ-#o7eG(+Cg_vMnTr})jt+P-1V5Km zJSYW?opJ3_2ce0sSKt$bIAziJQ`NwG+B&zUYdPC0^bCdCtMGS>zvJ`G*8xwNl;`6s zEuPi4PapT8b~Dyx2%e5>+*zd`dR~bJCwO$ynEnL4n-|_5ftknRRQy{aOU}x^gXd{z z@Y-nIUi8T-!hyf9J*Q9~ZSWD5G0IDHM+R3wFDb+A3q`nkQrVp=Eno~5O<#wH(vz#j zq0e|~XaUCe_zmjpn*juzOW-9s|I~8~A3?1R>94Uy3qFDB@Cwfeyjq+uHA^FUj|N8+ zyr85H%C&=&vFHe*ug3vrLky8}#f?y3L9szVk(Q2V* zR1%LDHOHUf5%7}>Q)uYGF_!4m34>G6gMa-EKe|BB)0vHwf+g(vv|g7_EN660R})k-)Hy?>gkLKl0GaLPdsgKBn9u+5YHSK zn+N|HAsAW@T$O^dmJSp=sg4(1!18;EopJwQi9^=jA9&}FPjxDCb0R5^tPD;n-UxM> z*p|g}#rl=R;`t6kw12}F8oE4-UUlNWR`AJ{#Q(Q6De0|OXTs-c^aqAcU^snG!1o$Y z4|fLf*HS4MdawqLgdXa{(3pV+`pJ);cx_zF6K z=$?Y@9pZC|FFB~rXN_8+-;Xr)ieN*H9@3e(_8G*Y2ifPQssn{DQ_W-XBwF{X!m)<* z4q#8~S@r2g#wAxsFvalM6-0Xjr%%T@nkbnU-le5Y*CI=fj3ZV)c?>quHYmFAEoy%HX#%tZ(`b^w#9=#Pb@2BS{C z)4&rt-Q{o^e)pHLzgrr|zn&dfyt==uGZFR=-p*1DUaOmbUu=l~101i#<3>M&cJToF z)sum3_4I@ZO7g$j@;vZ_YID+o!z5lC;!)##MZ-|S+n{yH&sxxi2tCaLj0C-f5OhkATnUtr<4TIMapLk1Us2XY;A04Z!}?;3fk;Rjkz7mWbdCqqxh zR=`@WzKk5Eihrij+7P@Wba0|*z&!KNeyf_N_V5Sm-q~2HJYlSbITH&$6|DZJ8hfBiT|eM}HmU{tLifcS;2dZ$D?}@DVIP@K z06*fYud4Eo7Smif6g^F4Trrm5H!yTMC0Guz22aLAV#9*A2VN5?*o5H^vG`WN#wv2t zV*)M~?acu9a`~C?Q)GSchZgF5C)VS4Zt;a|!*sz_X@O^t>UwS5o!A=#@urU#%)Sq~ z!Q&S9puVf)Sv*Ia4<#M#4R2x^+usrxaclv@Y1DA_>+EIi8@EcGZ(h{G+SNpTRD!l@s_6+7TuaKczCDb*S^L8!+mMjSGJ_!aN)aCY&UEIIq2lWD;HeWZ`-@}&oh&S?DT*p#402u5Jcjfk!S5AwI}GV!Lw z2EhkV!ugK4-x7W)TB+Wg`HIF&l*~A}JQir0;vaFNe(j`QneY~{zfIuWb>N)bw0}S| zcyoT{!!4^7bU(f~tCj&hOhFeX(b?c3Yw@{6QJ;!30UQh0WXIZH~6mMmkDkl!O`%@p(V#zf^!F) zUaQ4d!fcrEABF}+A@f$^cg7In6#Q(l)MXv`W&%9Qsw}($8j^-zY6-58{trz~bRcN$ zISJg7MH2@%)bI&3yfFoC8VKyJkvohWve4T(3-8wO?zGfq{Ja8pcFmE*7T9Bev$?#b z3tkBpG(_Q5$dT;|x)$Dtd`&(7K7&QOgFed8>J_w2sU3uC5HA)US7(`lgJ0NPLob(_ zrm(jzECwxJ^*Y;KL08aEHoJ?)=ZO2A!^G^Bf;LLfN2Eq5@maua14S439a>JwoB`(0 z6nePCQX;sALO+oU?svVkU}3) zSx4;U@Dvfq^Wmt4-xX&4NdEiN;=FXY;SJ!xc{JzcB9a*gU{!YiQB7tx*qL(`=0Z|| zOKAMs7;pU9EV&HKl-Ys-(mo6{3A316YXAylI7{kIm5sAkjK9}eh@Gul`0i*XS z@I=x2oR|sI<~XgSFGQ})P4E+F(wNu!z|c_&JwdM=)x$Vn0=;?~UUC5)A3Cyu*x_8K zdeWq#s|nf*Um8~mT77B4oE)^1Vc;M$7@n`prD&N|i0O4kxQd1k#=;-br)1uOrM61$ z2&Vr%YaG=NOvjTSW5$2u8HG7N+CMEd!;?{c6Y6N`iQvKTY-%cSOz7i5(5$22Uqul# zA*0Co3RHLPddzgiTfqHVw0-a_Ei+H$^SX)O1rA<;!Nd9KqGSVH51x;^EuM|^?D}Ro z`hFml(Ynz|nOOiYeB|oA@Opq(!(DTDSi5uO&}!o4xMnHgFPTFJe%JUm%=0C%%uIlH zYs5O^%nf)!qW2-c3ebl8|5w>tMn|~dvFaJ zf)ga6*Q|xRySuw>VB?&p`t0wVJI4KS$K7MR@7{s5tT|^@J=UvZL{o77?QzGI#Sok( zeCX`+jgS&kv&m4@WwXKSF=5Zsh%rd*L5=snNrQD?5ebqLvkSpzb#Xd9^C8yn%vt zuLHt2iKn2!4MYnt#M`7mGv zsF%Y>Yj7D24Vd9mXy`R~Pq+tR=CTTXm5)Z;rJj)?!fV8%l6)&Z53$ZQ^Uk+At>9lE z>*#61UooeqZ-;AcsUsK0LlYUSkPTGGe(F;JVFc_a^{3!>qBhrR@L79Yc{@^_y zkgP=|$#Dq=NAJ?$CD3hpiq9{e9)o}BqTyW(>@l(=7hIky*21M{f?oiG^<~Mc!2i~t zQ`Iy()SKpjw*@cGK^d1T4W6ekH&Gvc@I245tQ&BjM!!r8#evBH+xda{LhSF#7luyx>?W1>lT<)(N4 zxOlwGbLb}y#@P&RZD8&yAx)xk zPrSqvvs$#xxJW1KDVqGd109R`;#}EcAYb!O=J(CpsrrK-a+9!V?y?{ke+s`u!~Ig( zOE#vU&#TtcluPMUZ{NoJXK_0_65pNCen~X%nv~u4%kRM>-6&ra-$F;l{-y~zC#(45aYmam9q>80Ejm|=?R0i`H^y`G^%@h*Jt{T%aBr?Zseda{zo zB-CHW1+Sgsj!-V?n{zR!;qbh4w?tfe2bno^728O;()wzIs((*WF0->V4q=n!Uq z^J{2Nxipu4?M|kkJ=0~a)t;1jc<<%sbU6GEnFI6D$Kb!@`E)(Ku6xOt?$c9e2!CnC z_lo2K6Ialz-1m6xYJ>jX%3)`#SBOLH{$~2@d#xS&uc|}Y8_1g24R){LTrEm*z5DMd zv|}SWf9nK4tX@*r#XUKzH-5+^Up+7itQpPIGPY2%<_D+T;(Z5V`St6v=BLwx%u|yl z@~^>P>34h`J7Gl&``^9GfjcsB>jy!Ub<ku;)jb@)k z-lkq!f=~MWP;UD}a852*Z6*ZJw|Z%KQp)-?y4kVB zH+6c}A4;<`jU8OJCV#Fv3D@3~T4oKihdb|5j=XoY;X8&r{z-3cx|qPXy)S8;M~&yU z1EImb`ksdl7FFichLu!_C8fywcMi33eQqAx5}yM&lhtm1Z4E6SRG*@ner7zz92-9+ z*e{|SjjG&L$DHuB8;^N~`(NkQqth=`%f}n`*%ayR7X|v+s2kJsX+g8`m_FLhy;FyF zJWmI{JhyNzrN(TWXG%=$sn2~~r?=qVqYtZZ<57`oDe&f3+En_4ZvAeF)iIZ^J-to> zr~T5@oYY{Z$}woV{*z1)lOY`sF#!51KCLTwiDNaAya7v7e@8 zCH=VEv!AN!l&rEgg!g5Ig-kKf3vlM#N%k4%%3fb+KQAiaMg``jq>nf6Q~7L-Ow=F` zo%c;0`TK$V!;b0~M;lP*wE=dM{=azN&UNI>SX5=%Th30I{FSAyv)@}RuS=s!e^$Md zSMtl`PG-Q;#q9IGq?!3j8cJFjYt0;%f{Slh5!~zO3~J;kY|H!on0>V>u;wRCJ(8a@ z{=Kc!q}$GW^Dn~ZLa!_IG5*=j+g^1mf)3QkOm6!R=p&8tnAkt5Yt`q+Lq?sdkS~R7 z)QkP2R5_A9l_9*he&-1TYQ}!UXHFXX!}GJ0VOueK!M4|oYf(j3WZPs>UckBG+%<%U9>nQyE0#10F!jeCa`+9-9PA+ZY`Ss_j-Wq$a zf9!_cQwFs*60LZDspci^UxM^qC&`^%tXts7QmS-056vj-FqEws`+>^`q}^ zKk|aPGbuhx6NPor^U}MS#U=z(((f{K;S9bP2=~pv`=;F|J93SW2ld~GN!s#JbnMDH z3%!y2B6jg9^DG^W?WXQ`_O~%Nqz~IY{v4ycK~K3a0>|o*3{eH`P49{CGAl+ zCp2K$6P$B9bHS=q4BriLyX6Ev@*z_C69-?8r_&d(w$Fo&#z7928I^1IIn}SLFXh_Z zkbk9bW!GujhfrIp-@(EvqS|qzv&R;S_?S_lf6$6uGkNmL%67fT^Yr@lPJQ%IpiSfE z(Aaoi9$LPQou0GsoMvUX&&JX`FMTAHY3gIgjA(;>b;|2os8=I75T;Zds*2@!NEZb<*!dE;xKUr|J5D z6INVBJw}>6{?s(nRl~IN0cy=8a}4=g{qi08jMnlk3Hh&mlZGgP@D>7NsGRV z&&TDDqOH>+Rf`klxzV)NM08$P{4cQfSroUZj4pN7!(2AAh~00{2%2?n3!Q&a(cW3Tt=b!vgzK5X zm{VNj-BD+;OT9Jb2xjjo21YPSd~4{Kb*?zoY5PiT*>i?4$Ml?LiRx*?WG;2*llAw^ zHhxqwgqFTJj{CzLpu}a7GXD&m9Xj{5fKhaIA@f5133h0>Df_BN58lJat`wjVn+Ndv zi5<~vvamca-nW6Z;YZh3vAes6!nsSrEK>^_)weTWnXT3~_EWKyT4-D+U+kysrcG9I zp%V|N=?+uleaLI6@j)}`&bP-j`eJkX8TmwJJmoyZ=*1<`Gd5AC+upQk@Kjn?z69-W z=4F2Sd0(gXtZL4k97E3^7DZj{!K{d*^HVe1b)bo(Kl8J=Ue=mcZUkIorhEQG>uMAA zibG>9oLhVDv$d|@$9t!qWwUXsUq0GtyBX+hO8RfX3jG!8pQh$N%vTDfNBsoZUx(eM zMzP!psf#%jYtfnPZpf8VKSSxF~nYadd9{YXs z+mzI>8-J+zR^i<8*%b5mP3}q3TPSnEgAVjaeez9qyW`jmgx*V8+swD5*3&ls#D62a zd1Z?Ibj`mKVTLQLyS=O88(y$#EMe}@;2d2s6C-dh-qsYEGmdZf7=->GVb^@zOg-+C z-p|3w?vJN^fsIqBZF zxvto74dW~r0d-%}jdyLSMzw!9e0&&Hd>^G|cZpLzbMSqL=(RhaT7(*M0zWeFgvR+Y zfX(PIZ&l&rpXsAj%ks~>HS85u4C9=u2Jz*wCOOPp@tsxwT@GH;ucwh*W}@=SHd@uK zKZfg?Gq8q(rS56K^8gz&%aJqvJM^R}jL+q&)1^9@(wB?Qj#o49WV6c^F=@fvROZdn zIWSvN+D&)ZI%Vrt)aDXmkIREh)Eonck!Qv0gx<@#?l{iZX)it#+`#IyaRB;?@FD2k?b^KTo$BtY`(_7&l2=}Ye@;u8JXId>YM{=5jfAysV zFZ1ErvsUv-LwIxdWt1{u5&_TX_~9SaYvj3s^|4=R74V${b!xml-%^h&8$(*nG6zi^ zpfB!wL+Hb5#`h7-ukUf^oxf*COf6_TSdX{!oMN zL-_FscLQ^aWM;|ve;HPiR|IZVnEf1E=_UgInTVZW^ZW&Lls(OS2AkQ}_4AzH~?UeouE3ct}f)VlMMw z`;hbVs)9T#cSjdiYt_J^gCi!h%<>~kYHI#aEoWN#|K-p@g8jL;w@H~FkJne8G~qex z9vLIr?z4dNP3#{RS%L3W#QM&ioPtMRyrKh(;`%eZ!L?j*;95y~8u)^`Q+pl(x0$FN zz4c`rrRmyP<~eYOmsz=MdCd898o#TT4?4r(f4~~SHf9b#KDpBY>`C3StyM!~d~M)$ zzL~G2?(?GySBz`MsB06Pf$E){Ob^#Kpo~>>nrjIPZcTc*fE;l(t3`@5uE<2W1FyVcp@qwm5LkdHs{$EPXE)!5hKwOMX9JK-Z_6Nx7yNL?_4`l z`z)FSUcHib7x}}-hI+|0>QZAb<9)ACYgb$J&F`F&{=V*0U)B0uRz8urm-H|iY*(WJ z>+#)=Pc77EN8yA!9-V)A+*H_P@{OxNehO*4tDxMh);A_e8zzRyP{7@YK0qKV%7F3s*@UHpPWp6^w6Z+r2_;PHIdD5w|r4CR+TY0QH~5#8~LSAt~@ zr|M*4mTB}N1DM`bzbQs6rfcwUD{eigF9eMua1WYy3ZLKowM$+8R7K4i_nYpWT?D>b zLpAWaf*!q;&^H;n2v2H|3jAlI;2nytun@g&4Cm~&g3%+*rEh9+WdFu;Rw%1q55X_& zHg-IER)BIQP1RG%B!Zh4q$7U^Qn5=fg>&$cZTnT#o2TeYxy78~dL?xe-~C0)-hp@g zq^QssMsKHj_xm$?gKC-e8TZ(l5r5yGazy?#_UM5!>*&&sKl zi=wS^fp?u+gKOz#RPj-UJq|4{T51ZM_@)uagnA9xSF~LR1oZqnUJW4bj)u9M`KP^w1ns1eKiy~?hFey z1#Z&dMf7Uvgo;uZk18I}g5`&#j^LQW2@IS^Ut%i}@U+fxVUz5$oI^7##1}It8ruO%6aJ5D+hYQEyZ$CQ`xGcT%EM~OxPG=Y1?4h8kSif3iu}f6-F}rI|hK6IEy0=wy zGrMbz0bHo}L4B^)H4E5*@_#Bu3l_&PO`NQNrwQ{#qko$(B64u}%q!^IRk%huPc7>v zy#;+i14p7)NAuV{BZR}5*dwFlxn)|5GoN$LQckB)4sV#@3S zuT_}2Jm~ZedeVNqHcLK~o=CMfEum6(fb;v~esWtEs4P7_IPPm>tW6O+ykrG(8~fL# zLG>Ei!F8stOx%exS4D}wvAKJ86aC52Y|VKJSek_|b!q@E*@Q$31Qt^A{-B?TroyNL z4K79KsRVsPrykglppBp(=O)idlfWm^+5Ph1yZ`Wo`-D}_CK=LO8{{C1{trR4h1Q-?A%4UJyR58rq>Y7IL^uc^D# zJ)@Uf$I4ZA0zatv9W3b`3j4>i(|w?u`L;1;o^W(dyDl$q!4O0GB`~aQ`2Ny^iZv$T zJ|&Df&_D9g-pf5{{Fr^5P`?1xsU8jNIYqQFUUa1~%j}l=lHVWWmB9B0{4k(t5Z<4X z^|_E^8lS;^K!G{1hYs5E?@YQddZPtwp@IK}Q>x8}Eoe8F^rVz$Xi%{W`tA8Cr_zf3&-BW?46C*Qy#<8@1UX-0<(TetcqYZSH&5Q~I-Z9Nnvczu3-Q zmLGl|r-dg1$1?N-;G(4(9G89`D#*XzPoTLAKhx2wJ7tZjcXBTC^1M}et`kn^3l`3~ zEf@(nRPA4v#L(l+?g4wC8I2(HgkZr!_0u0>;T6E33Rr^@v-x1ID;Ao7c@d1MYm(HJ`wTT^et;<<~iPt*XFB7Ugj?v!Gp}F3vhD z=lO@my*w>ipek&AGQ3WnG{DoWnlZaorgGb9#?qT=L)$=m-+@5JdRW*uDiC^y&_}U% zlbo1IGCQ0P61A#3%M=`~(bH(y@p=qAWBvAesc~%v){~)AlaYLiffF=lI^UddR)?U))D)h2RDqp8y&bW%mEmvpgT+<0yOL`;qU3LhVH9K&_M4r|og$pZy^Ehzc ztTp|f>xGXh8*L`cfPUSO!IOaJ3$buqng24&z7A_A*P(?YL6@SbQC&&2V9a{q7799) zh5F&4F;g_W1>GraHoB0*-}VjZOzEC?motL?l|p(gOV5IqrzTg4Gtw>GCB4?Afn!}2 z_^yGOLEuWXarSc~$DouNXBBl_U4viICAX3qn1*K!NTti4%qjkd^gxAKrJ;d2pqaa{ zQ1kf@k>8Hx8?zNbpHu&An@8YG1bob*`D{NMO7X{YOK&9cL7=}H42taLJwwW$i@c$$D+$IxGZ7jXz*-4|00P7O?|IdSSghB zH}G`F!5e;z`ole4o?6f?G;}uV`s}>Ay=Rq+hd^hfce_RrG#3SJo3^wpfjVfT&edwE ztL*Bbtgu_o7ZJtSHU-!C3#{d5XUW`*z@ap-75el}g6<04eF~RdP?sGAZm0~6 zrjuXUPtupU=Htr-YQ_mag6}S=u4}}up{2_*>4?=~T(tCL!nso5Nqgn}4-QYq@CXEZ zSlezVy8M~nUcDLTNXbk@pRpU(%1Girt=XQytx|r|@R>B`7Nb`xaBtw;mZC!dTddXK zSQ@&#G6$|9Xi37Ifur0RI77HNiv|d7RUXIib<~sg1sQm{BKV!g^|N?SmFD)4S)$Ly ze*sTT6m1LsMH|kN`7+Jxo1h1*Kdm-w4noNpn}>yfEgEhE^t?4@1i_;ZqX43TT6soWNlWjw~}* ziw}dI#fDon{LJ2ZUiRBZ1> zjEkvr04LrDADX6Gr5xc}2h0;S=5QDZe^baTof))Bp^qV-xKCG|vV`#-^!g`bE!2lY z^iDjlb-L7j1${{QWt^|ZO)E~HQti^2V$W&m`_O9OjV%Mk~6b) z$p^uy#>skGbXUQZj$B{U5cCRYP`eG8qib44x^TVV3+d7DgsIoj0C`RDzC+MPqj;jV zRNdddQP-ViyJigZB?d2cem7Su;jkV}cWKnB0k6uy^OEej_$F3Db`9J|qPGutK7)mi zz&E0?|2jm&^>8S*ld7-OxlUpdNxrv=3;Yf(@MD z7%Dg#_s@=hplZgH7e9i1;>J_hhZ}pPU++lcr9M1wAY2Z7+Fj*uQkUQ{2%a{8W!2-! zAGP@A(x*go6h9x2BlM8}I6(rTuRDMVfr*n9I5vaRkm$UkMZqsKp+#6d;tDhNhVwT$ zrA6-*4k*19+5j}TdeBBH37%losQSJS_ZGN?66}HcR`5>h@5!UEKkVK)uYyJj9d9~soZVA-{4-DEj4SjPC7292gPUK=$KYql@CFrn zq2OeOw+$a9oJHp-c&(wrp2IgQfL{2Nfzvg#>STERmb?beJK1*!^4F`Q`0KH0B=hLo zrfvG&!Cn^roWPsGBd5a8JFeixD$EB0uhG)u#B)G@GrWH<*IWYMUme%Xbtc8nM$Q2m zt!)e~e^Y~ZTa_MW5D$pp!H7q#FuS3*Rilb=mo@wy4Lz5D+iBpUyB4sOg6~PVCTQm$ zE$G%N*KcoV+06(#hG^(YFed*3J!tmM#!9QyqJue~g`9+bS)V8Nd98uf7;{!MWJir^LkuIiE;Nt)(5CjoBgY*^ zmK`GaAPPR5N`4;-eo)bcwStD!W#kcf>xPcB!+jBBHW2g?3qA~V%lF`hhpdl9(`evK zhR!Sb8hvNOPL_3$YzwqG5+56$kO|$I(c?s0HISQ7qA>u2=*YA0xli46bmW5@x3AM2 zJmY~X+^!kt=b)6inIcwz7iG_nJ7PPEK(=+k=g@4G7QMOT)y z+U&Ito_C!Ej_CxC)9`tfV7k(Yg&1>Rv=N2OljJLu%qjRRz!p`7w@RHE@Ea}onaCN{ zX7Og=7b|G58r}h4z1B@*uY!Ymv={%3fN>ORNbtH&?evx`2zb1EAGb6#8PSCGhPJT;-HLqPZ?k}}T(t;a9o|_Q zds>ee1%B+(RKyDe&X(+sB{~2yVvG!s_zDD$NWhiWnL`&v=Th)l_)@||E2QQP{?>F7 z%WI&2neavkevn{w@pUD0!t3rpXS-X9p*f6_;ImrTF(`Q>$*YFpDOH`dq!wU6<9#qJY zp|OZpO6YqG&x`RG%=sAc^Az}vWV4iD8)!-jyvl&KPlDHFmcsiI-0sSZ^bfqr@YgNT zYT&Q&$xXKuJa&!u%;Mt%uki7nizxa1VM8VP;0Jh zMz2?EQlF4)7r{Sf=y5#mWj*8W?TPS->oBsA1P@UKW!S8@{E0!WX=sdow&)|0tCIe9 zeMM1dn9B_K%388@yZcmu$9+RVYr$-p27RfH1-(YW$5!H7uAg{MZ}A={v(NfC>VSS; zwjIIKk$$Go_bh0m!b_BJPxrK+G-eDzo6wjy7BpCy)1oyJxRz+J$Oq2UzzBlN4ER6b zk$3sRnOiJp1vt@=*#K;fI+U#c4QtpYiN_k zsLGEtdbFJ>wjnPn_dz%Ow})f`HMA&}S^n_z9|f(1kzG>K-=JxVKjpp^y(=LtK~ zxpbfA6{_jBLsk+zV9~f}Lg%h7Jr~*u0n=)5Vg+2q*W2}yyn^sHf@W_N2yIW20|ke7 z$hzkLw8^;ht((4;A%x-W=pc?V#N)+WRLB{sxZpsB?`!!+<>ke`>lAzdLtYD-g@$g2 zIzG56p>yB zPdPt>8|%z5orTM3$=Zrv4m||8HVzutRMA*n`v%=eV(ofNmrlEGHDgA*xLLOwU7($0P#$ZaDD1xuYczr%PaeeJ zkcMzFXsa$g8akjY9;x_$J9pLkO7U~3BA@79xC1ga1`zD`o#h-XW>GQu&i2q259(J*Jq93Atp<$+QO%0 zEumX0WPK&asYLgIj}k1|U--6KG60x2(9TnG*BbA|7gv%G2hJj76-1{-M!5h(^O6jY zD_ei({3VOdGIs^1M7LEizP%tiV`vr~jMaaSemjwgcb#mo4pm{2+Jq<|lT0>XTQWwCT z3cg9OD#6Lwzgc+O>a}e}O=c-re*3{hxo_i+K-;7~H#m&(iL}9<P_Xz7UG(5t; za-jFH9^E1a49?>I|NPx-VZBH6=-z2a?@>KEh4&s3VT6Sb=n`R+D_yB99`F8t9-r37 zzi41#|APLxONDpo->pZ<9{sxw=#EzzQZjTv_|Sg+Yy9_fpohO(U}Jv|w~#>3;9u@p zeDZ|`R`svqpX>kixT=E(cNzJA9+tCgcK?7te}7+pZ~qj&A%Sjz_%C1IKo4K{EWh3V z|Gap8e~$wmfu518yzt^x0!@GQ|M}us12g+)^iQ8Hoo{58!2kO$@&vkVYU1uD|BQA0 uznfd(rvLlrk^lW1^55V0`S0id`TbS@{oaB9{wDo11Z{5~^b$jpNF*kZq*C>g7xe{v z2hm`+Rq!D8dg zw8qkRO7FuETZJTz{qVLT_T}}I<9c>4NU6?+2e+F>u_3;Whh4YqhTX`?rzGW86!h-HQH)YrgH2!MnL58y`LO;))xD`zx}<>-SNM#m;d+m+yA~6P5b{pSMz^gBO<+h9sXef9-d)gfgZl${vjSAe*U2zUZH^@ z;Q^sx5rJX8UcO$D-eKV(9uW}{0Uo|S0X`m~5#GKYzF{Gu-riw;K0e{TkzPKLAt8aD z9=={aKKPUHNRJR-&v1{>P~Y&#fB-KqUthnlNbiV%h=5R!fG|J2PKZ~aN2tTg+ati& zFVZ)}FVx>F+%w$Y5$fX^7V3c?iokpMd3!h_J-s}_d;&cEJn^uBp5c-HJ|Uq2e*PZb z{tkb548!LN@bU=v4-XBD zjEM9K3k~=4@ec|24RL-h`RsxIIG<4bNLZjxpnrh3x34F@#V0brH!>Xm(HD1tPwV0E z3J=3wg!zT|hkJzw21G_U{5^erB5@$$k$7hOphuvWJbh@Omrtl8!Z!k^72Z004-fP95A_T4o_MTiQsuEd`P1~d ze0ZU2O+wRtz&e0(IQJ+XE^^K!%@;&*fTm+y40wst?o z7*lOuy_fFXcHxovE7)tE`gomV^sTX7xNb?iNfsBYQPnM~hq^(f z?EGiKB#wL7md0*zx2?{VX-K~d>fFL<+9QHGu0qcjEY?amu=P0^uib{glJ73P;6^3$B}m+8ot8hkXRT(7`RqG>sr3Q)WGca&^PUA!QMD-)wzOM_*fxsxn?R~*gAm+cYM!D zfj{`)T%BpMUnuw6mWEo~$Ys}j-Q0ZY)xdt?7eRmW4%I7b_rraz=1{-PT>AZd+I=*? z`Nt(zeQq(0`bEsQvh{0bW(b?i5&6E->qf0@BXTLl-akooyJoSboU~})-beKM_7*i` z=ytB^o5svqe+oTsH=QrldP=WuE~BXdgE+cLcjHoOPWBi-LWlar@|Fb~>1EJyI#I&i zUfY}X{L()5sy0n2vA|R^B8%7!3fWS}G-}#iIyj^vZ_c-xYDWdI`^^I8{fcosxV|gh z=s47@`gc6%_gKRRADq`Eo7~~2CB9hat9;|Hah|G4@fQ?uel34^ctejVT%X!nlNtSB z#RdPN;P#nm*LHtZVdN<;;rOi|Y|2f4_7^i7*UCz{hKwW0zRn-0)dF?&kP1VEbfoj4IGLL1cX4kwuo^R*QW)JDtf);ORZ(d3MZT&N$ zvYohPIH8Zsrge&#fsdxx?m>stumShE@U9^0=sJt5cX-CLBKpzuJ$F=zlq-}o-Eqd< z^Y$etsjK@8a;=t8hX)j*Wz9?I7W?1Q_2ZK?>Qv{A?#;fZr%~D}ANbItZrtzaOVpET zziT#_-@RYT^Tz*Rul)tg9vknfQ~Tyord~TZN5ZV6+Ii-1i;jzJyr)_f>29Xv`=NrC zBLD1nX`{(#kiYq`ez`o`Jd&? z>EB$p*|qf%J$%w(!r5y)11*~WO^3|6z^d+dooCuD-m&!`Zn$+VcZ|+wUg_}<<@-FH z&?oFy`4#os7G=+zKAV?rdP?X?zCGX(Q_oF2wX`e8-fuvyI&YvxRjcSKD;Lwf{F^O& zkJd#JV)-k2VZuYyZ zZ^cigKkJ*2>ytvd%JZq*?))zX{+sO{oS{?u@={E*x6~@>kCCUKuL^G9;G6wgn|1RQ zw}DOQosG0q2lA%0wRP=*k(BFhCMy5+C~f}umpjLnF*^*~t5>x-W856Sj*Mf2fZqdn zSQ>}Dtx!#!GVg=)Jnsw|Owa26LwQ^u@r4@KY23E0j^Ar-{xSYHy||v;4sv_N@_O|* zPBXtPpF?p|UD)cpnXCWGWv=g=LZd3W;T#jK%TJ2i7cY2Hky3xvyZ1#X*#DV!)b7pI zO7BSelDVRJ{l+Ww*)T4+!(rx3SC6}mdryzHl(ZM*4h5EP=7&S4>Gy+6Q~zq2sLJoR zdU4~l<^~rZ8~C7e4tm9{PBpi2PP$O-+&s5-Ke_0hYs&RX zkb2X9Di6z@*#?$y?hLJEmL%;dIhN#AU-hHpKlI-kUwg!dFV3F_rm&Ywdi!pdXcKeJ zELz{wJTjtz>Y7b4dQ?X`HdsS$ed95U50bjtLT|{GUX7`|kb4)5)BUeB<~Cge=-vHO z*1VEs>_eY+Bmt9Xp?@B;V&>8s^AgYZpJQ0=Sk`yEIi*}<9ewuzNgW90zG?D^)11j_ z6?A{VZSEaZCws+mV&%7ThWzFGHI?N?BsKBW_+0a?$JGK=wti<7<`Dxk)Y7K$oJQ>- zd>>VaSxOlr=33)xPNR3tK5$^oPK5V2k34>(M!QB*v)vaA@B#k(^qzTIA8lDhL;r46m<8zTJ674DTR7pln+>kQHUF&Se@l6oWy5Y! zz@b($)3wYr;awfSupU?R3aK`Ys8gn5oIJyy(*>`gX^mPi>ekrhd60TGE5K84E+Ncm zb@A{$j=meHvc5XO9ftYYyLZ-;8H-sQMv)cT(dwsVNpKzbOe-$>t37p=6R?A7boxrk zKko31jBaLwLMCsRn}v^lJ8QXETdeSPhcRas^Rd|SHhR+P9J`h<_i5hv(Oh9qE|8x=&@E`ztI=3^AE4MxKI5~=*tHh zrszq>H*1%Toj6v#ri`H-@UetVxX$Tj9TD;XyZg(Sw4P zlY3!~>dM9E>ig3ks6&tL89#GgwX%*cZZ=*XN|#dS5V(Vq*J~fzhWyUvGi%RvqyPM} z=@IiwaM`d?UZpD-P3Ud9GwB$o1SFEL_T%*@+-OtUqul928Z)YH z8ESGgfxDL|V&C{(jBfm1rpryA!R|pdbk^}Js6>}-8qY`}r7GFDBS+uVZ1iF3WO{q% z1y}E#WXV~h2GAodOw50I25_qMCODTdY@!#B^H{I^%Fvm0-zzsA1 z)F+-zBJ?lsspHODrnaYl`rqWY-HuVY=~?MWbV216SlpcPc^|kznDizM96d#Km^O|3 zKS|`c;PKqy(QTfvg9+S`Ctr`VrXCmx?2o1cYoaamsFwN(yyzn}WL*21oy+J<=H~Pl zGRXsQmZc4 zW8kCU9`)pd;F8PbJd(!6{vw>CiZL=c_FbDw4>OIF-d4hErM9FGH_cnZ;6Vh=A$4tm z7t-Tp-Q>^wafW0y?x?a4=mM^{MME#CyHi@?yaKd$R2Cb!O`&@x(aho14e%K5lxZ32 z{S`GF7K6_eqZ~&bg5zdp<8p1_svl2`i{gu6nd}-TG6XhW{*dr_>F)eByrx}es(WX$ z^I5+Zi;=lu1B>~%dk#h~9;o{Fj{+aJj*V(79E!p1Df@ssw7zd+4Q-_JEp4RGGxqAM zt*K1#PyIXL6+`3E){NctJHt)e-Tx!ZPzFzSYO3&wQ^~JDT87Tzir+6VIFiPh;+#j? z{UY*7zf#s)!vs5Y?BJDbRGp}H7Q3tEb5$;$o4m_6v%&K<^cCYAP>&7N?&7Z%uuPv? zcMSbG*?8dkTtiPXbOs5>6ArX_@JN2<)0U)WS6{tsojy?7Mn9?p{~iZMcNXhPmoC+yDJKmB z+Kwk2$wrTs20Q0X>NZb4R@B9`n~&5*uSe_GDYuMiw=3Ek2R>Keu6ot6p$hlIQ~&#q zhrIev#Z8^4N*if;cINe5IO{Zxxhm&uo|sjS(_g4WI}cB{hQ7JZ1D;j3g=hC`ovhIh zoNLNy%6RmdlP8+bcQSYzoyyaPg_q$T2s2e)lYo;1KBpGu9i-*Y!I2rCRsERVOauE2 z=tsW$;kz*_W;vH?_R5JLg;$MG$FgiE=pwUz#x6WAcC26qkIK-_j{8`iPp(?04n7EW z_G3ywQDbbT&y;v}5xH!Zk13i7ct+80W0Ii9gv%+v%6%E1je(I2{bB*zjn7|$%z>lR>#D0Oh^#?lPd`xk~mUdi=86R>5k!9Qlj3q`sG!;(vzWoEwtVuy4~@*4=a|8uiV!`nOZy z;k2}AF6vn+QfKPrDV%}9V^Qmi>5R2YI5k19a;2Z$*?N=C@bsSpym~9xq%k**()W`& z(y9jiAF6^rMUh9zlAO14Ud;Lfs^zVfCVU0(lmn{z%fqDa?9#wmB^(xYqojXkeXR$N zVTo>iry5}{Y2ds=G=gAQyCLhjOO`6+mi$$NdlLHEsL*2+K{pwqXMT(yr!$RCBd?)W z)V#}jKo)!ZrztA>%u~Sz^yC=P1~kj9fGu1b&%(tztl}PCb!vI=OY5{_v�j9Kk=}pw07X%+PccvEUCa^B7O>Lt3JymutbB zb-(gz+%I(ULXKE49@?re0~d9xH!heZS?$EL1y!4S)fpO73;$SR>{NJ9=>?}ZBE9uv zQwLJFB*||vE#<8CX61Twu2TbV5Z9aVn2U=GJ?SMP0zA5Xv5q%^4ZXa zd!Ct1@x`X$IfF&7D7lA}iEd`z#oD@2KbCL)-C~XX982X=A6lq66<#h#w3?l0pJdE7 zqvx3%j6Wmc%%Tra$BdrkPZ0yf15jako~cFiM?$05Q~TRz<3@>>RJGEcP8^roozfw} zfH$PT88v#4dT$-eCErd{gKj*xA}d@o9>xAu!F%sRcU)xidUyKpag&qxeOsQ>sqxTH z)cfEW3-_Vn1JQwwMXB(ruOz+PKlz6h+#tykF8i{>0;*qN8_E5_tK%gVyOZ<`_>tQ5 z{vFqxP(kiccv_O&gQNBf0)J(ANitXE83;Pn05@jv4h4^jQ6mi8C-e*Fm}IkfO*@L5 z<1an_YWqV;1}8JpHp}buh{OlLtW{eoOk(wPHTeB4f)AjcAFnE(nI_lYE#8G5Ipv(f zJrFpN-7@eiKdu=AU#2&_2v6Z%;!#@QrpB6fw;9~msg(y_>nQic(1-AwE`whbg>H*U zsyq1v=Fr?E=w$}xh!10dLr}e`SLkGprhzgGa!fKAd;z>MxA}5)S`s}Ej%>|eU72Lw zdMB+{(4=a7&5Yong>B)t;$5_B{uz8GJ)^$hO;zMVUPr(yuPXGS4Zg(PSFP4~f7SWv zXz~0g$GdQ+$Mt*fETi2AcY^n wV#rI-zmRQ-zYqT!Vp&?p2CMs&P_URG{xg9$jH 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�C2XCj^K4#s&lg_{Jr~CdS752PP!= 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%0DW3cy)1!jwRe1Ekdm1mmSu6PKP<#)* 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͊HZwPG8=2WQP}u|Fa3Fw{TR^Vaty$fp<{0%~uOsZ=Mk z`l+ll1hdT1+#bH0!Fyum{>XBiYNHks`V)RdAll|DBc16PSW?Ux;QND>vYoQSipF9|C>) z82Qa+

7a!@%z%>;e$>8btB4;kRT|=hzpMe^@s&@Mu+OSn;^y`=hJD`&R7YPI01; zQ*2ZWpmI?G-oAua2XEOD{C@Q~k1VG(?o-SB~L81Op*Cl7`P zBdBF-VL(BG9yQQ&|8q&Z#moo?#sn~`Pjn!2r5T9}K$ zxPGh|HvDGB=O)!+I4?8y+G*DJuCok0gH-u@2{nvvK%R zzBA7}G3=sd3p;&0=e9nayc0w4K$?#7Vc8~CP-0ZfaA3NZw>!X=ADCAHiz9%#k2kra@eDcI@ z+M9suejXY;I}sU`LT0QNmk-q783r_>1E1Nzj+DY|b$SQD6phT7u(#vvb!Z2TJq&05 z3teeTJ&0a98|l#Q*^2=~>Jt1PC~a5C~_gh$}yd1-!cBAlHPe1?ah!E1P<&uGpNhi6NYYHk=N8ycunYr?9}agNAZFMtEu*-(u|qPvUdV6$3RXkdla&J1CKR`A3yjdTpZq2 z7DA4tkmEqVA2OP6Z?E0E-$NeWQv6laX+w1azr%F9Z@8+qVX%0h&U^sZO|VACKP@ct zR8P3O340VF^4ePTE%dC>^8P0kKC}ZouLVl7yaki1%Y4?zIb|nEe0}GRpUeq(XUNkg z5cZ#xLft&boH(IcY1!;);WBl==F&04tP!2BPoKtClB%G z6zYJG0rJ35FM8RroEFbR<|nQPqyL3tvFK6RVUqnd?2I7O!86rfKF}vW24bhw4uB6W z`pbYUg`;A>(ZF5{ zjgK25^Fnwm!53EPk7i-~9FNQNNC7V`-$AobTwv* z{#u|5?^*E*+(mQb<@fNXm+Mor+KV4%Krb2kQGG&QM}d3xStC#O4FC?(j>Kacv)UBT z8Xlzu?@PQZn$!Wm--Z2F**yf$(&C}+pR!9lIRhAEN$;SifHz}Ec1X7qt0Y3n7)1|*lTmu3CHp9Wuc`diosFp$6MJAXe3hqYvv4tq$V18^qumH3+Q z@inqusT<=@Dp#4cEItKhy+6DFV1I&Oon$3iW)FBAW8WCNMyrt*m4Yw+PeU&wXPKjG zU)lzL(7>v1MVUn!9Q_idky{F2}57gozVwS@vb2v4EoVV=i z!SgkQ$BK4|56X^f9m~+{0hmeRff>La7H=QfDt2URYR?Bj$T6>2(7%>=JUR7v4UgZc zyOFbL(TkG1O})_=*`Tj8FT}2nIdFB|bki8M5@6^l|18mV80{in80D zfy;T@t>@)q!SRPXx*O1nEcu!EzQ{5Z=72)(iOhGO13JgK4-H-E+&6u3c#ZG??7NQF z;(@@kLf`TpZ-!cPf4J3Q)QjQJ3d zZ$Ljz+x4Jir`T!E>-@V*Ue@a%2-QR;s{2}zXWX)2S{*^`z2j^)fyHn!B zCPM4rI+j2NSYO^xLDx9^wh(exD_~#j;yuVYiU5cTCtT z6u%h0N^@wlSe+r$87&^X>|$Z3N@E|>Nc-)q)vTNw0Vjno$+Zz*3%Pd))j5z+V;5GT zKXvJc2W6MWnUlfW6CENwsxUJ(_8n~O?&;jh6Z&j0!ME4>2BtyX=Oy@B2KGiscrg4e zk~|hUw~{@@33FN~a0Ssh8hxt^H!Ur@6waS@37l-eZv!8%$~PBXF)kOZV$zKP98t%M z%dB39=TjCoOFnVqh7?jUomRbbP;$^zb&nVF`1Kj>b#bR?`+$%1uIDj| zZC`}D@9?sN=g;GX2fGBs7tgMSk6uDGf6b$X&DJ|2>W3Iva<{h|jtpd@Ml4;L^H$Yq zxRU!dSi^WdeRk_&T`mjmtyZB2b;>!%9((E*t;-%`n*A!!==9mRj!#kZ()Bv#;Yx1y z%Wl8e?Z|mY-q}St&&{VAuV-Z5G*xdOFv6^#=COMG>@Wp}^ilIm%%iM5Pw}Q1%XB>p z`)FN~_11pvxMbPYDtA<*saNc!PuCild4G4M*p2@v73bn#MOU(Yv>s*HbdBt!FgjAT zk^RtXwLNiDDLSzfHN`E}dU|kA+E{fw5rqbeN3)P}0Z4|x_AM4VYv(2n&2ig|7uX#`5 z+cVg0-kzh6UyD+W8@ajX?hW+X*u%K)WVaj3)$)!}uin?R>m;=0ISY5uuYW#fK;DfS z*F=YVpQ2kqe>jbokKMBBD5A*OX4vI+d^e~xHBCybtL93k(-*s0XRnMmuH3@2F~3~p zxX5_>`uqf3mz#7h-z$}8mkXX%g=ZEwddjV)r0B=3GTAS}ZqZ<_PV-!IlW)4(^k!ON zJGy8Co#9O?Q~v+%hDWJv`|}hRS%unnscOp^>>GB2I` zq%{W)O-p~9l;^lFF8W>1x||AGAU+4B9@~XHClsgK_n|S7ft2tpL4RCpP=O(jEw^X& zD1BIGI^n;7T^?m}969}qR(GZY_oS}a zue!Lqv5gwx18J(6S$j5Acs;^v+gtKKqi0!%@u{h<_LMEhh;~jV9(SGomPk;j7oPeR z&zTm>m6N322iHugGH1jxP=d9+LJeN47?N)9+ZaQb2HijyNPhflwnimsj78uf# z^6Uzul_!(=ukNo)jsHz|AKl|&?lU;=@B7>+O=de4vMBVCeQC}R>tO3y>cyLl`rq)) zlsIxVtvWM?X5SmmXYw@XV;lCM|JPHkhHv$r+Y#obyys|Vy*Nr-nv0sRD$d^r)-jVy zU*Pzr9s0#8LYX{Rlmvw%5);M>-xR-~pe% z5=Xgae>J}B9YA@4x2u#1>(q(Usq9v-_E7ccI91_wS$l3`33Gex+1zW+N$b&()ATsK zVdvb{%AOuof!m!MN}v18=H>0-!4&YfGjDRWuhcDLC%tOV;WHP@HMfg2sZ56_t|IBX z@R>Q3o#bL(-q%+*Enl7QFF(L7p2u+Vk`;VAHAYT9H`-hLDO({1qkoi~rF`DDoALWp zUH9Pq-f^Za?*s>Qr>#l4dOr^u+49+k^wf34$T9-R_E18`5c$LTHZ3J>t$bK76H?!xFHLhtg(^#4)6KQm~-s5jQ~ zHXino6La*C(f!SB`E#&;?|#(hRst8*-uhGUPks9HOYhr(-9$Z?yRwmzWJtq(8< zEvau-`dmGu(W)=*Z`|irx<H1~07%Kbv9}D(n3X7s{-_EKmMl=sCy_teS7Ba4Z zZk>6nyth7FX}a`1*DT~^PsxEgogT|)rswDX+J-UkipIR$PxqJmnJ3f~veSAK@R!gd z){gj|obA(WWv>b{aLp*qAuknCCsJSAm)*onQb8fv%yg&rkjKl1xOd$I^XRJ?GOP3y z^Belm#g@7iyv6k*^axe$8o{U?MjzUfr#0a=9rN0!w)W$Y<9H6t!-c@WZPu;8%yz(+ z?ezQJ325ex^eK2e`-O)R>WFb|mEfP?SJUzbRbY$3z?!V+rx$eL+Zsksana$fCNP&@ zyeVc6!0*~V@7&$K?=_roj$Adau$KO*mMez9Uy*jiimBa7(hE(~k zXE!=TV99~@L4 zqi*t!Lc5*Ux28{s-Z0}86vTY@ly1)DG{mJ#a4 zj0|=$ePVoox4sN~aL!58qrw@{)j9bH^HPnB^_BWC!2u}WyhAGg{%ZEvD#cAZ?FvKY z9e9^1m~ye!eEnj5v_s~6=g$?m(C|M>=E$@@&=57BscZWd5$cTv8~O(--Vy(pZw|e~ zucm!ceQs4F{49-rwp@>D+s1yDDID0BfiLfSs-p^Trzu6+YC4f^Ipb&5=O2eua_Oej@mzks zeZO|VU_PktEDEJL3(G6ut-7#dCg%P@2EID{&gaonF0hK)-_;6Eb(R;pMWMHBDwueM zeBeJZ$b6kg~_2~9VHU;Zbx>-?_SYYt?Y>6j(FZ1ribHlr@>aT&r?+h6DO zE^PMd-;7UAA8JqPc8w#0!_-IbSbkD*FDH7m1V2hr3!C}qw381r_y~Xf-BIJ(Q=PxA zg!YtmY*haZ?Kqw(pIuuI{CLH&CA>IFG*3!u3Xu z-Aj4uRB>{ta}kNWi9)$l%Uqmg8txD4TbhJR=Pp1bwHmbQyDl{*6XEaJbq6ovTS1dl zy~fortIrd9o6yq~W)`!KzH--N*FU7?F9LMhH@|d;&BYi!#>L8h&<#p;B&pqdkJ8B* z)9IYiv_qSHVrY+4}KaT2VzUR<`m@K@z`ei?0~QYLzez$pc*IO=y=)1RhNF}L*kT7w1wNhiA7@_mM- zT-K;_8+C6r9C=3lN^EME8SkqEA0K)ZR8xEAH!s$mOs?hLDEy4fJSy_AkIZoH*>{#| zuy`|pOUrlAs7tfnf@sD}6in9vd5iJR+a1|+!X^Sv@RvHcFIm=A8ncq46UV7Gr>{|9 z(@=9G?xQxQZ8&fyn8v-iq`(FBrT$-ecfusyz*#>0V5nF*9N>-W+)2>-+B9vj;g=G zkncITWO_4I>6UgbRh1uxjtM5NW8uK4o>if-k z-0zRO4erg`qMI3?3nWsve8-ed@>Ti%jYHpf(6Q57$j7&>S~SX=+h(h0OKk|o0FP|p zAXomh<+EFJXz#uGs9AwRU3~`^Bb98vKh^R`xZ)2L)qw#NMOasrpFTyls8}_<%k0M{XPc)P6nAIki~9 zJ2M!cmj~QUWlLW@s}?L;PA#iEkv%H<@r2F+G&%Pag3jQOHOJ{dsa+a#fx~x=ck)HN zzLEJtKfadgqw(#|A0;?+Xk56$`wyMg{(run$fgCb+MLHD4{-%J}@F2Hk63 zpYdJj;n>@htIvEVSBa{ zl1D6ZeVi+J3{~_iz~xWwXK+uhHTWrbAD%OtGo!tAXKJ0MoHqpz!v6552YSN$SCqZx zD+SCFOtwqENZ}?)ZR}UmMv`#O3GWB$8Uq^Bp25mS-CKBHeZSlbf~wFw+^e6Iz`sSPT3iM|-XAO7tAk zwV%2}{c$~H37$16<3l%76#_nA(a>V5rq5R{<~fd2r)*V)hGYgN)uC6N=P)?8G5p9V z1%0I_oSLB*`MT2iT2FNT!qch7-#^@{;~?Yf?>k&}yo+5S^dWh5XoQ)+gUV#QC!dGQ zRBmHgAr{N`z?raI&$#bH^zQh~bpA?74bH@(L4Fi{i^e?3zznHlD!0z&mKidcqFI)u zTf(ce2QxUL2_590&HEE2wcA9)V}Ijb-T5@;H-T%D@TVuoQykEQ&VB}$WSNKHo4WG( zfm|o~0s)H&pTqv$D7%KvP_$C-AE+ucXfT^X!i_)O{C=zDQGUg~lv}275{F>8o>zCp*PUAb1Q)v=y)Lvfpoy z*V%KsGqBuQ>-hUNco@lfO5ex6zUG`q?=H;e6X)vcL5o~vrr4OL8XQ}lQE3R=QbDgW zFi3+FS>PV(#O5Y)U1WAzn74HH+X%gme(6D}v*UTH$0Myn4*?f$izSI zlonr#t5R#xS;8YV&Y3ReTgK>L27j=MB!<%Wo0;up>2lds!?!SIhV|AwM^d+s*9_9o z_Rztc(w_b zZ6Bmtv}>U@^;k>5CFp{}6r1Hdukt$%Tx_G)p4q6+Mflr;mYhKEm!htpJ*a%A zU{0I$v+mKi3e|OKAifFsYI^9{!Ql0imDJ_huI-8Td{o`94`Iwd1&&l}y80L5u_?LMYJxS0y+_UaYEpt}FOOeoR74UZtV8)NIbou`-}{;BH7gu{c9YSg zJa?hH-am3UzcD<`(-$A;quB;wPVLi}i40#0zw3*=A81(2DLR#Nzmi@8r?cg~+H_oQ z-MG6MxOLE9xX{RoT^QFu=C5EViO#@mv<1uJdJ}NOixWo{xv(vIlShlEu7z*(`LjzrK}Y3)0ANH(qeW&s+ap(J zzLzqV#p@IgQLbm$r&%mMole?nL6h>Rw%4H>6GT&Tr>!*^?@Qt_Em-!S+In>Z!~ami zwZ;2`H(?aIcSiM?RfZ~L*~G%zq^{uuG3EjT*D0bv78b4zKE?2l7{07^Xk2QI*-xlv z=z8qld2Y6#YZdUF%S}42S7!9m;1UY;ub^jm{rQ@rfi>P=@qb0c^Lxe3~Vgd@t#2mf%uCsNR&mgEcK&4Aa7UqN^cwe)EL`HX6n zUp;7W(jyLen9+$pxWVEQ1U}4CZ&&N4wlkcHP=Z|pN_KT>yDdA*KqDIrouRUCck*rc z)dLB>jux+1bR7H)b!2c@bO;Jte68!3H(@P%3+HJQHAaW zvh=_4CAE>OW*+g8dCbeI@Q8alu@63)*~G)uj?EH;*IZ9;%_f-l?!3OoNIK@9qQIRE z@tuJ=3@?^PjrB5Dty@4cBY-n{&)-lwRB0zIJa~`bokCAW!Y90bbip%S=m`3BT*vCxhL4UkxjK*H2^ioixitys z4DhRd>3P0?^xS)^_37@#WG>5}bHfKq8k5Xd+Tyq89X!{6>qlIzF67T(|k!=`D> zUaDTGla8L3U9uzUQLvlZ@hd^NAH$oX6&d#;7kT2yae23MPGW8lbc71VefOcCg~M3z zIW@kM^fSSy!z^k>@*Yo*XLaJ2%olKB4L$oqZdAf`~qNYdT9w*RO&;m;I zBs^3l91}hbBM(4-=Y+?WSG*6WZ)jX?#^4$XT0nK!ywU%^HF?3`wKex%LGgFhM7t2dmIneqD#KbUIVYMum!Fmn$Eh^ z*NcZQpKEmJ63uvR;I=os?-234cyo=qD%`uFU^zoSP`YY^DA+Mtz4_EhLnmpOtD+s> ze7ei;XR>b6!W%tUADljlo}bzQ?4K__8Fjz@)`F(zrbpj%mpr8y9z5@HdF%8DgcDr4 ze$@XF?gx2ygpY<_phPQRo&yiIarw%rN%{+1pW0MiCwfWaa~t4x?3?ZgoxM1l#ovHu zDLBC&`aBTMA>J0U!T@ELUnu@YK%2~A8uOl^&x9kgoc)0`30i8|tHWu6#!i%35Hse0 zff`WY>hORXIko(y{vqPWIWchQ(^VF5N&Hi(B^#a~_+w}4@$;#H^A&GaNd|`cR#VI| z?0akwa?q0+Sq?IhZ%!{2n!paYG)wrQG2!e;4ZR{crvbhW9leCW2Xy{M1Ehyd=xKtV zq{4ES#r-??@ui=Nfu~yP6P}hv7G}bG!`u&1nY-;^WE>2BU`gLVLkka9?`!tMd%bpm zyEuFHv?{Bw&#$JX22fL?FVvKt@3e3j$-gk)rCw-D{(kU}A8N^6zRfPAp;t6=pG0tf z;g@{NaR%C8KfM2H6!^Fjxjj2BeiVNz+)8vE`f8t=n4>oV6ZF~Y4JDH!c#Te7n9X}6 z-yVSn#I^1sJ?7-)E?%P@h4mYTH%=Meg!06&ihSa9D5bpYOz?)CpGj(<;+ad}jGqg_vYE7~%cxyi5 z^I9?!q)*_{;Bje3nKQalr<^3-dDXbJ7BWr?oIoYDE6##J4-V~w?w!hg2E7!Wtz{lw z|C5H{ohsx8PA}p>sq!qnfc#wes3kfH*%kghvs@=9zMkw7#m^?2$Y%RG#7o9GS)#k- z{NY0w@Vwx$%wc#XEIhhS!VP3v4GrWuoGW-Tg?5`tyBpRK?BE^+AE;Z7K!)B0=5J(p zIvQL~;rbyr+rY@^2;T{OXo>FiGdsMd=AsP@d}id*OO0EfbzQcsh1bfd}B%wD|CMQqeyZFid_%Lnjf=i{KY2oJ=I>JXVk8_OD*Kb=&iZ@@Q|C09LvC7fgyegJRgPn zQ^F~p9Pe!`KXzCngH_^nMDLGQzxJnf&Q<6>7M!WO_=nVl@KW&>7~Y`){icskZB4?1 z!1W1rPiD&1x;{N0V}ZSHFpd~mvBpXR9NmE8Xla2hd`KJx=&p<{u47?5BCbhoULtxr;DG= z14`bvUWB!Whcij?W)>d;=Rlc_{i65uu;vBfRn%0_zbbFxb_^aZe4DbG%{4rD0~wM+ zZ5i-X81D(sWQxXohMqm|?58ZbZ;20T%^J8;>R5@Vk8EG19(&IKM^uGlzBmNSLR+)=0l1?<-|3r_|I{ttY;q*I4WMu2RXACB!HdjMMICbXG`rZV88 zaOCfOR>$cLRn0Q7ag{Pv*Fio`vTRKeIJYyFA^Q?ToKhi}2mWb2cP*k_;GrJ0rWL7pKy|zbU7s zKHx7HL22s~c5ftOHNB3y?D=%nwe#6m>fTI|VMt zIQ~ffWEIwf;V<-tmYqZBK?RN{oRX{8yXue`ytK`2g}hm1y|7qIEmVAs9zGHzd|9$Y z3)h2k?z+nMs`J9H2pOioe8*OmW>Ut^3oLMcMo!2ZwmqS~MdA$c5v6v|Uiqo@ib@8s z6MGePC1Vt9u$Q+VCH^|N$yW`&t)+$~AF|thw>sweh3nZza#`s0F5K}$4hFYSs`p}e z7Y9|o-_gQ3EXfeyQDScAbn0mEIwd|>#7(7vW#Dd^#3v)nQbr~Kz1$hUdvlouSJB@} z<`!y&4`uKJSI$MiY3v$=k@!^bX$YRU@Ekqj*=q&gN`ZeXXgL+{vJ$n@h1Z5giw`T_ zEV7VP8d^``S`)N0!!qy-+VPhXPJik3QftXa9z<0 zKH$w;v9nNFLu1p4&F9poYbUAFyHofMyYV|7CcLZ*qW3M#2AN5cfg!sIl$^#yPRP@) zjgWKY!X-4pw?bdm(SlL==3I2qlZ@LTv!QDmn=1AQi3M)~zvkw`87i^zwgLUl+ww0qgzHG%0TaZ3m0Uu&jD`-<*!57zk`;86zMWb-z_;|- zUP;*DyRLwV&Rl9EZK02s!wu2;@Kp`hLzTd>_atI>MkANe;_0ne*W2j@VP8^avufz^ zM`IU|u#Y9ahgy1g6ZVq4^`^W{RIfP=;4yvCGWXz@7&U)omi)}F-ft%T8;<){dwtO! zZOiGHmIq1p9pE7ma7OS7&kFPxU0_rGBn^L3315e1)5zsDvIZ6(AG-(e2+E1y7l2Gs zcAp5DuZC77uQjV=w&;j~Lo{+Z1GA9e!2?HTTB}3%^N>dekU724!cRp{3THi1^)%k| zkW(W-%PYJV@{3Z`ZbOuKSGw-t>~?(dMeu;?i#BxfziSOn681#2a5nHUXI47fbpQvY zJt3c4w>Y{=%ib2eTI6>D;twWN&VJa!9-W1AaLycfHL`<%S?xt0ZFfo*DgL`9J0aL3 zlld-l7&Wz2b~-h3z(nBz(3j$AGk!+SP)Uu|$K`-qmq z9>jg|G!%3cy!@_O_7mrq$gJR7YwYkU@MuE4hzBFNqe8AOJ67PcWesq0WTQhFvr@gv z;gDTa^!IB^cJ6>P1ieh(>Yo*?)7Y<~o^{(X{BFuyXO`@^D4e;5u2Yy5$U;o)6=!B( zD2pc|X9;btWSwE@yDEdZ@^t-1cw8_Da4!8P7mV$neTAi!v$JX%lC#Z0JnFM z{Y2b%(T#WEnZNLr;9(yn@O$Xay4btMvp>ILcd}+46SeQ$VU#Qvd6s143c7-^x2xb4 z+W05af8~GMJJ-&djLyBG6WQ848mK{3iS|$5=;5j6DI`+9N$ykur zY3xPNwY%e-dqC^Ex`U&}YV^7#b4v6Lbb#QHfqYl?Mc8}qO4%D{%vSiHdui>NV%SGs zZ-AR=@rAJKr)3{N^3n0@=V;7NIU{nLFjiyF+&~r~yEqDbOJP44+G`yli;~?B=PsGl z1hPXd{UN=9_o4N8CWz<QH_t_2F`>uZaW(; zLpZk*t}!sEttEV4ynXE1VHb0+TqEqgRYpcs8s|D+d;x;DD)nN(r&8z(o&v7{mF=uU|Z;{B|MTq`1@9Te7DeUIOv z_GWsa-8QG?r7hNK%`5msrrbK$m(|=qX*!2J7-a8$)P%qN@-_PeuT!OGjbvTrGy6mnK*l80zI32}3d>_&3x8-Pf{(p3_ zPaG$A9b!kds1?=n&|=2-r>KU0?3=TrxpHDDYkT!2 zH2Pc`)82G}i&X7pNUgXo%xqsf{E*&xOrY?kLn;2$E8I&p&^(eOi8|yq_(+bL=3H=> zlo;GcXK`8@=y^`3ecVVF?zN!;`4<^C#`i+aETIBT>*`ZK0_`~|u10*pIXw5* zJcXaLTNVDwNu_67h5WzKX)|6=zkQ5{j6Y2e&v)bIM@pHGYmcLplhw=z*}G71%j+um zP6=Mq>lD{t(}nHPt0=aohy5o1DSnc%s#zY-iAFupklC*Gj2^j6TnD3>(N1kSmnHGe z?+kS2>jCP!J)K?g#2Pv>`wgwBw3J45#XY;GFXCQLp3r~I((=f>uk`k3pJ`pbvpnmP zr~Po{F2cD{<=w4##Hhk{;-`_+DaR&bUHLRLF}#Z1+&vpr9yGvQKR+eWXX`}1bmy@8 zbRg7h|IAA@Nw4j^tp`y`_yx}FGR*wj`l5>Hn%Z`A%W1Yel*6vJoOs}eK-G=LYM&8d%6|;e^crT%l==VIf{dVL1-1GYU?NCO2vD9H=V2qM} z3XVC*r^8~YYJoI*O{LtFEukx&c{0hG7PrV~Q_^UTm9-ldj>*i-(omW9UUbaGwpK(f~ zo_NsV6Xbh#rs~_KzplFDkWt%FT@MNv#h#Tb@sQb5De2k(3-x8=zv;vyb#!?=^LWS5 zlbmhjXtR0TOdgj7_h~}SH7vGLZ*f3Z^eIU#s?{+z<@B-pwgG+|-mc1AOs0V5Uo_59 zp+|u!Q8wzDP}k-UWa(utcGjs{Dl>FaG;f|oT=Z=psxh{|y4*9nJte@$uKlNkdC%9E zLkC>daxLFCPN5xZ#?a~GGw4W4Cc9GFv{K_Vcf(tq?nNPU?|pxB`?FEpFXJFWzvzgr z;Rf);{vKb}#P=Y)mWdj*yebsn<*GH;+ZUr3Wy3SK#x>D@d{*OoyYdU4_r~Un#q0{z zFVOd4$AEcm=C3bP%^?RXnPu9Q=d3e!>eR=QSgs*Hhk?&)AFV%(P*-Z|Hatr%^#DC~ zWeytGCN~$e3fsR2tOOPfHSryI&+=wmxlb4`=-7p`{=G}tYgDxN-7QK>PB*2iO->rG z-fg1~xeD>&&Nk0-2~bVFN=Ogrsr_o$om>Z-z-S{Xx*!9Cc+U<`dr$v@X3xFYp;%Mg z25wN&`7kmA&&!Na`22eRqRkXF?kP`-@2!3h$Y<8;Jc>K4iKe0NdUEwEt5tNR{$^6? z3}zMo;#|7pQOekrpsZgQ%HowwgccKevD3;yZ@UWb+R@r)iz2zABvI)COoA7|k{ z>w)@qg_hi}PeyK(wHFUqxRr7b2#`Kgb4DIy-z)D`mMn{b$K?rU$2VLLs0-US8b9~s zA)JwQb>42moHct5JfP-2ZwEXkd;BsNF15C%8PWKR;eYooH*S^4YC~#!<>wn*A|V56 zXovcmP>Wl?*(2x7=qcqI+Ri#z^OSZ;SKZFoaIh&e{EBxj^9Sx%A^j-*jQ*u&LGxtB z;yRTTtfZ%*hTXgUA9lQsqC1I2sW$e|Q8&Qb?6hU{I~AAe2JOF<*`EL3QDgPidenY> zA$#`U4Ltdn7rsB9H;+Kbvmmc^Od?-_z>?@skuv?Bc$2e z+*$Gr13yj7L0XipJFhsp3HMs76VP+-KC6GT!_;&2Pi}wh5@j#*-TB%w+k9LKYT%f8 zwMhfMxFric@0CU!tud1;DMJVOxtjQFc+L5ax<9kob)Vg#qLnW4tuYrlU!gcXV`C_P z9-7+T*QzCr%Tk`E->z#``OKW@QVkpUue;UU$-p3EZ2K~}4{9wuhr*Y!O|Q7Kd?3hI&RwsVV&d80FOBu{d((z4Yk10@OA5Hd*?u)(Tqh;h5%^2EE+*!T zg+2z)I0IZMSy7S(b4Q=30ZHQ@b=N>HczH~3ZZ2<6!u z-h6ID3-=l9_t4n+Esy=P;}}(;g$FH}-iPOP`CxgDS-}Cl%Go&w2kB0(Z|GpTwFLZT z)UCaKLw?R)V~<+>cBj;y+SB$a*H5WWtEz72suMHW-^z5d4!%rK_*nvW>mT1^^pJyl z`DH(Nvt}w&^UhrMse+0SxoRWd&Ta-T*!Zn66`AZ+*bJf zeC^sYnSFZn(@kpBI-3TBevrAq6B545_p#BZ+Iw3@GfhB8>-{=+&adl3dPV<6NW%bew{u+H_pg#3U-1}--+M=BJ>63;2rtIN)r4}^$g|n9#OV#=w z0ncfpYBUJ2=O&b3V3F!lr#9xPi~Xc!0aNOv>cqK(>(1++yPJ6)wA9(oEa9fdZ6p5F zKmu2G;$w67g*>$WbVg0+B55j<^y2M0v$V{0a8Q}Ms>ZB!3N;3d`6qovd(TcGa>wVM z2<+ebTQ&dGf!BnDfrIR4%rg~TuZRQJ1GUjM05xlb7Ie`yF3w`XoT2X?)AFVn=>1hc zJ0|lv>)5}K1Wv%7W4z5f8(*pVDJQIbcQ;o4Q97}zU z+^7p*ol4VMj1Ua7rtE2M|8Dn0SNTj-$fJRVW?=Af%#FS#ID~K|?b@sao%^(o?hV1c zY4N`=wM&|%XMMsv-Ab7*9a1y%E(foTqZ5f==#$;wDwnwu6}%Cn_bk7tz#FK3n^`)`vvg|peY_8d@iYG<^8 z;p9Kh%S?K@BrN;M{im^=r81@Km2sY}AE#J}e!+s$y_^TIrvpb{F%rHm;52206YN;Kjze ze2objhk#ppTJO?YFtiSKITI##6pSz~71+jad+cHFpwuetR%#RV%)Q%BqP<1d(aw^A zn9pBD_v!mjwyW+xaGyYTcN>^s4+tGjq5)R=*QD)JQ)$$y@M$X4c()d=b0TpxgL~+Q z50@IygM=EPdZp{yxmNu#5{wTV+kco5c{Ly5jID&qo+kdBCZ5c%paC_$tGfL<*e<(b zDKMrJk1ShMcj)ZHuj6)dWKu6^yw`$rJmJh9_UzqL-5CFbrZ2v$z$GZT-E;ycw*M8H zMPF*isXq^@^3;BZ@aJxNa_Ab$=RU(9*TIz6Di)H+&}hO*MK|#NTe#oNjSAE-_B40O zQJj+Z&(i~LE`*kDqh99oFu@i1a=MRBP6Qla%p1<@!vyRVzDL4w9-K~VLWA1Ccq`YJ zf>fmH6GQOl)czhM^9-L$`&G@VhPtk#F8|uAYm>g|=t?gFpcnb=i*Sv)XVEm^6CCg= z6!>x7nt61L%yMef-_3-!r@ejCIj;*a+J8ik=fY$8+`|_-@O}XK& zVe`11_XQ^xDw$^pMdq5JOLTvwz%}d|7t?_!)Rvx5uPQIL#+|Q66&XvSmbc4B zJYdWX(afA7!o|!P>Mrww-rT;=Hx8cD;!g-Rx!lP>GZr*3pzZbcpF32@>QXqHir{6w z{ITJsfM{gb$Lk~;(1rY{=v2H{4u1VQmkHjkFbAo`hHD82%M~`$=S9Xb{5zfzpNH_e z8XkiN{u1;6^xIXOOC#<+yesu8aX#Q`w^Tg2)MRLbRTS_%OZd&jRgcFkE&@O-Bc6iuMg3P+nSKm;@snzfu*6D7)>jvbAKcjJDa3$P~ zD^{iSd0Uv!0wkIUuPJuEsb^Dqda_w3!l4`Ezgue2;;Y<9lU>1|?`-V0#{GS=tTa zr%~Ugso;6cBk`Q_^`1`?e)V9f74hX-jm^yy!{fDRbN7Qw74(j3HFhbqa(x?|m5z4U zqSKC=seJ7H1noeJ229n{0=*cuAzE0WCOB~BZ*a$D2KX^oKh#%dvI#v!j%xSN|G5~t znwP&1LyZ2Xn4W(p?Jjn}5Wa?a z#+VV5W>Ou3|D`sie#w`6E>gnN!5azl0h}-o{Db@Y@x5vA_yT0s!*}b!(5V)%RVVMy z3@teaT(d84E%#BEU6GqBWLU-GwSe5{`T+xdEDk@qs;Spmm#GWv%%bJKi>j1Pfdd>JL?A?5w+aj znL5sH#rId&k=Nr<*``vzK69YoYrz+eqqj}R3J;~c{fZI#frM{}7b>0{Fu)L9DLucb zK`UKzc&PGmS#4n^7_mKPQo{Uf zHSer)1qP0#=R4a{bVy4E{?N7&oxl}CNVG_=5<%b~$5_65XFb&EVV3%@lyEFtcn;o& z9o4#M)G?QSyqMuRnxZ-WO`pQhFQ$)Ol?6NHyB->mR*5eU55mstL;7;FyH2cm>X|_; z|MpTeC2cDa$xDC!6`WG=qz%`F^VF4_Wwp$Qqp=GNU>rQsEhL^Ee0HN-*)Iw|r(=^A zXmD?=hvOOEA4*c%9!`#L?)){e_I{gagOxaNvbbRJ<5+8P-XDa@X^heA2 zi+3R&I=n=}*)aS@sV4;Z*9@)={|>*8f}OpVJ)#KnUjc8V zSEWu2@HwaU>Q;8Nh8Mu-D~6^bc;O76RSO^TdR>JN9B;=9SDjERcE1Uz^zD*`8Uz=eWgY7ruOu;!2f84$2?>7xoLE9%Y0|Q2#@;qC_??$EDEz5JD}jZ!+K9- z_%MXpB=H!!p3RQ>m@T@)h{pXOUVN;fF5Rg`Z5K{pmxcDvY8dXX)Gn9MGjjdGGy1 z6_+g&x88D!cXjxwSNH8q`A-ZN-oY`g_v;saTh#3eS5*Bq_cZi}g)GVm9gZyS4T>n3wQ5uTYw{W)?{ zEM`g%%R9L`?Lv-+jKRYBa=_+X3Rw~_n|fJ6r>dl9KIjc^{*(EsLSKNZ3{lO#4%Vng zs{5>?n(A`{`lX`OxPrz-uGAlVy1)3>2J!+`v{Ewyhcc$M_^4xQ{np}>;!K^|K>W5V z3y-m6TjDLFk8$tW8w}2lL8!*-f z{UXdElHL|x6_;(UlOMs;va+4YrQ!=_bnvS6vG%(cw=MpYwAX||>u~2gs=CMQkmz(b< zl4NL@m4^7`eeY?f|Jd-tI4-?vJN(e*xaM66IzkuBn~J{tJ!oO>Dd;Db`bUm|?5Y64 zUp7Rify*i?K1I-57VwebwazUFxso z{LT(+4j<{OXh~$#1vN09kZ0%_X}@T>b{nq*;NIRpH873$?1*sA^HecK`HxRQ8eSpM zsXI6Q4n6e+zX@;-}dT502f@L2@9L?*N^PtaJg}1%6xjo`n1W$l^lcfg;<& zJg6_d3657owG93wxg7YnAN}n3O}*}YoPgzIHE^|MmI*(xQZEx8rNCj7WY_TYkk@{o ztKD$_loVGbJ_za?9>jZH`_E=@vKR+^Xv#6H2Vq_)$p<)YjrXrtfMn`~XLbYDb;9 z@Pv#jsMOjd1wZsWYaiFKAC73u1t+gtx;Vcg40zi3 z`(rgYsy^}izLH!t%rBFctowM|#Y((G(TJi|Z@+#nx=xL2gWn67R7b-fQr>L>>fE+GH!;e(Ru#j~&X1}Tn)S`Bc2>G%G zXH>vMp6SuU^393giClM6pD)^q>J2T6U4XyPn1A)5_1N)jsU)}8MWUx`znkt(?helh z+z~h1(Blk#r{F1Q*&C4T3wfp?UXJ7qF-r@;PsvHZ8UubgS?{}P_=CK5b43yziP{&w zro=nk;<$zD@<@+Jj6&}6TL&$gtz^yt&j?(Az*R~5)UQYfHP~&pmb@N(Tlp2a4Zrj% zVSj<)O{qt1Dlsw=8=fS$DbSN=9{r}kd&I9*@T=u~l<@r3eUoLjA*Y!|l9wWHrX52Y z0I#cQ?6yc92_6zMLj`X{Vdp|4KU0P0E(;jynvdVy?n>QHrDB|+0xoLs3st}5Zg?rt z$c&Ij1cNbf%6h(HX$p6r?W{T`&J!myKv{MS&@NzFlLzG zkOTW0;;)Kd>(u(_G4c8J&~4+yLqQL84FI24@Hsh6lWgKsIJGDA9CB<;IDZXXvY=yx zBWh??h1rBUEL!c(#(@Ogp~2!geROJQxt8$T2{r5Vif~qBZ4VJIf`jjDwyNihRIxj5TktZ}vjCfgtHJ-E zUypGgkm^ktIjIE=WXKFSw<`cS1)|=tYbyRQ@&))J$h5?-W$;S^-m_@fl<=me@K5YJ z2nHaFnyTQJE8*EVy8ziUY5D%Rf{&$vb%g90T7H2F@|z0pak_=f2%qDiIzF==?bug= zko64&u5($MOEa)|5} z5VQ_>NKTTBrBQ$Ue(MW^WJd_Q8w?*7p8FjO9zF~HNu7%x0spap(FS%X4CEmU@4LId26FJIU`tN%`jU5!yRT^nzY{G*WKD!fVkw?+B z+~Hb!>2JRX@z5FEhVUNH0?Gg5=qdxE*rG5PAP5$AViz_lJNJx=iQV1Z-AyQh2?}-x zDt4gk+%tA}cXxN|)AybI<$DUdGxwhRoiEPLDrBLmXP*M_&@z(DqX3(=a4u+5nVAyp zuL7n_*KM9hYsoX9?=0{R%n6)D&Qn687lUs$c5xPUU%387m(=%%X?PM8{wz6TKwC1nxE`8kGG*Kq4Smsykl!-a9< z6lQS@@MOUj@fwx*ij%)O8MVmpysYdFFP6Lrxw=kjQbqE1=%R%h`2&frhA(6dOZHY+ zbMX)`3%6CD9P~u=l3cq9&P-vS3M|>!EOF)d=qn2RiiW;9 zC%oMd4F+!(+$#uLq_}Wo^y3y9oC}`gD+Rwv{8m16@tRBPr~cGINtWzBAqA(PcgV+< zLes{nq5r0VUoMotvw%}davEqZ$~Sk5`gbQkdf-c4);BMS_LDP#tQg1>aCd1voM7iSetndQeW z4Ih@u9rNdUr=KcldzDbDKvx5^mn(#qfv$@cL z;{6cT9URh^ux|#|obNpjFrmk3)1I0Ja#i|S{5Z+n4YVZ7JQU8K_)`XQEG@HMn7?s( zEd@ey%Pfzvt?f9OtB{#eg&rm|5(M6-(64lhTVn{^RdQpgQOy2s*YJ&~*IlJWcgyUZ zc*Qc$2<|HWAA67R#Mv8x*_K5leL~J>>(ZVUdX|NpNIWEbhv8)m@KP1H3)X3~maP2e(~g)0&WG8qnS?oPjh>>x*Uf*vmn@m_n0Nl0f}gB`>lVB| zmoJXo(11^BNMdxwCF?dAHuA-a3;o_ zjO3accqi8g{~O;!-0rT%+z(;qSLca8C>&CFGqt$&Lp*rGe4@+=GIB5m_8T%Ufq88w zaut~oaP>X#MiP!InV0BL=lI$x+wzHo`9a}Uw5H*BnO#!wj9r=$T+hHdiFdEi4~zmI ze=6a=GV3DqS(pP;a<(ut!5>pS*YJh8&h~Hx9VniJ_*(=XZJ{4&w$^46)Wu0efnEs%S@!k_lG1G(R_})#$ z|32-cNpJdc$ouy+@6<|NCo-FPa@#pywZ`0}=@&lsqAN{m z8HDcv3bx%!7c+y)mCNu0A}hyqRu77^Nw? zNIlARjI68wam3&cJhXaxJ6j!mJ6u9Xy4SClE)nL#6{p?PqdxEAM0|(Ma>qecENub1 zSlZS6`0W7o;6W2EbQqs+TiJyEOo-rLH>%p@$5pr2r@Be~c8+5AzIiC-^=hinppaR- zb~gL^q-ostT`}|7nSQ)4vZGr3ahtx~aVn2lKxX$D&-vrpw)(wWQ^tGaIk-zGaxW{L zp)~s@;&~Yz>ry&D%y9M1!*4sBpo<5Zm}3?&mmhbCzP9{pR3A`?;s*`lH~E{JDb*2G zqe`UxwnK!y|KKcDYW7=-xKYJCZq+ce)mfzcpUfqXh!{48@8akqZH(WE&y2eB#&Ed} zOXy#85B{&wU}|^ZJoj8!h1*We!u60-g|w+++Vx*hpL82lneyehOO_xD*Uc|8@1^YF z&3VZ3`l|HFM|fsRSF);1qv6l8@wDi?`h4yP-Dh1E+pkY9^LW8byzb;ifi!R-5BI*;x9SRc)**|TM3e6}(I_r6u-nv=*iu1?^z9t-%?qF^1_sJNYd z`$vs6u_JEmqmlW2?XYE2sBzYRj2balZTrA(N81{>R*o&Qkd97{)_Z0ZH7oy@(sV1m zK{qLw(U$-Bh-hg`4NQ9Tk~*F(LQ4*}Qq$*8rdJbF)46*2?L(DK^*aA-y(#ZBI@xI& zH5gWo@Vn;Hzvz|ehj3BH0nSvai1M5Nm%c>I)!wJ`_%?rCN_Uo~(0-;p>TRx;F#u~XS;Vm4EatAAA2=bcFQ<;J8llx0l}pP1Q?|N8qF zCAPg+3o?yX;U3xfxo0jD^=9k>*Xr>52-nQ8MLpi{Wv31NMJ=yXR4=Pv)kQ9BChQ-V zSyGdO{yRYj&lRWZHLj~aPv_%YP35&+W}r{tGb-J#Q0E#Mt%f!IxLs@3--<5b4cGpu zmH5ughBa@{f+v1z=9-MWu;BnZFsZWsu`IP|HY-P!O0MR(3S;?0-zS6`qRB-Uqh4~U ziwDv=aerp>vY+^jIaQVVu5rI{`u@7x*7;q#8Fi;?R5{HR9>>u1KKRVs@-tlT&oPoc z7^_0*bI39Z;4u5(pE@*j$S_KLoRL@Kdk%50_JwyF9r1%U(zagN`A}t>9^*NT74X?r z?6Iqc@o$`vDvqTl(=JPCX7Ha*%{qD5Qj@c{Z&APwdj0G!P1+Z!abGm5Lmm64$35P@ zs+l>XPgj}%o%HWWW!XK4wDsos9Et2AwZq?)hfX&%g-= zKWag#?t9v)MoqGTfp&7rOggMv3l3jamok1Ti{~u`0@E-by8oQI-7&TOb)RQY2LHzD z9;LML9t3PNH)h<<4TkL?oL>{aYb=dV<}q$FRD89xY1o!zNGf;juNvpO zUe<}W2UWG51J+T`h5NW#=Z1I>f39|7NiyzV3C;jpNcQ4g>G!Hivv1teoI>?iPN%6) z<5{kI);$mNd(3BGQDYMrjoO^YDc4?CU20sT2X$BIpB|lP!j5fx=E`pZ_Npm~D{16^g8ix2VEk}v4Uu-83gWy^S+VZE~lu7q_dyYWNRIyDY*8 z;M%Ivq1gnyQ%nEWr#kNwRm|%GdfA0i@>+6jvQOwU2VLjs$nB%ld{H$UJ%|?N^O9Oq zz$prxwut0@q~^124{$cD*~Y|Klxwng+zIF6wHG)K{yDC5v`C`(>%^!pv)G7=_VTm^ zIU?BC9(}YO=de?nKTf~khq>JC243A6^=e2R_U_kHb?D*8SR@ivqlEV`l4o>jI|5Od~qv28@N<3*`7Y%;@0(6(!wVXFm^ zb)myCw0__l&e>ud0V}OR-DCAM|Fm}2k(DXMrLXisxoeyyLQmu!!vodp#zWD2m%94k zsj{Vc=#Wp+KkVtH2I$9c-!O1cKkeRH>fekXR2=uyhqL$;qJur#^T|%093D7c?m^#p zp3?;8nAHcYCEys&Bc4}3_q&nP4$%ca4kxLLi4pJ`K76DcuUFAjzn>aCUCTMIv3?PU zElXviuiCFNPoTJ^#|e9=Qtv2Ds88xY#n1l!^PqC9^0AW3edR`5kR=wprrQ_K%jp{x z6U@>d*JegvD{gO^mXr6FKyFumjb2&%E*_2cv!vUgXaBE55%xw_6Y@}!Q(f8XP-Stjz7;AZ%_4kWMj;nHaG3HC7u?2iH` z*+Gl;OeUS-Gfmtvg3hKNY5>0!@R)xM-pq4;#n@B$z1v0b zo7B8JvgU46~;jW&Rrm9uenOzHxb;RfhKx=GV*4BVjwnefb^r|k*7h#RbIObJVB*{C6f_vWDUiK^!MPBeL6eS3DD z&cYpNSoJGfaLC^MTW`$xm5)t6r}2AyVBT)d+~)xejNQg((+3!-?l<7Em&!3Pk8{l_ zVOP;dcriZv^W3vb5IBwcbiWa!ujofp+N%D!juLvD)Uqv{LU3l9{{?kq*k~*9aVsvm z`ZD@bac+}4oaOcZ`2EtxoiLWQ%Hp$@R)<~U6JL{6^pP8?|JwvU-Mx z`A64Z>1_|L7-auW>_r9k{B_kqTt7JX=p4BlG|QZ!~re|4Ccg1~Y!1-}hZ1 zuR-Xc`qTYr;k2~>U^9H?zAL#eP&WS5h2!@s;a{8bdU9-w@#H1(uA=?N*W?a!k%#*IP|wb+ zb40a2%5pA&6RsYI^)jFSI;`>ggvTcG_)(KdY6Bcz{|>%vfQy*GL)x|Vol0I@gSmb| z`&mUNb#orjqf2j;9>%$T*p_gN;Bq7E1M|kRSGROjEbVh(`5f@a%KT_bW}0an=HH2{ z*dym5x^wKV22XNK-gjF03{I5&*T5M1@9AyoR$vZcZ}skGJJsAdAE<%Xa`52{eCaoy zHM<4hncMU$57?i^L><`plPfe>OIr@jQ3pyO-})~Vc!-yYx>Y#48r*~yjITv$J+cY6 zr*}thYw26yM;d#pr~2)t%5fD<)Gj!EE*g=%k9-qXNPp+*1N!1T8cbUUa;775=|y#X z?-%||SQ4s&7gx8Wmoevd32(u`W!&#c^)&XY(aYV}E|Gno!ZqpqPg+wi_gVC>eQm0p zCzZWDXg`6UYV18Q_AYwsfn@3Rn?Gz(#YX(%Ar&X;b_b@@!=0lEI#J{O7Ji zxFg&^cdYbJOW((93QnU({nnp+2Ws$r)NE6}RwI+n*uExT?h!}Lj^|)-KX$BY3Z6Wb z8xH#hjdBq8I)!Jhxu!N$ZN!Dz9Wv0z)v(N!OuWA-x>fqy%gmKE?#t@&WgOwP)wW(8 z9l(FJD*Jw&X5T4#+aW?hi?}#a6YCI-achG08ws6S5@$6|ANUh4x`U-=r1ygRF*KnS zoH8T&h=a;iJxgl%7#h)d6N4|92Yb$Ug5z6eXk%9&y6Zk$6?Igz&!+!KZKt;5+Iddu zTQk;xyX3&W&IShlRwoL!#@|n|if>C)IOnz_XrHV%qdtJ0KRE{9qcp}Xty!<Su*2WN83d-Sq3Qn`GJ2ru(J__z(<6tuuFC~ZY_JYE!1~XG5F5HnKg<n|e>Ry?eaz*Z(3_o%I@Lt_9VJyrbWh9;~w6JEcp$%4bM_sGjl~<=eQ-l3IX% zVCYLVyG~B~$LWI56i4~+Z8zZ9K)D_bjRIUuMz7n;4Iob8VcH>mc2& zKzd5jp;F(nzNo!(3R*#x&p1NgY_gTWM<_7qkMK71toeFQ_!Z!c8)_(%y{EGm-zM@}Mx5Za26piB3!kXbmIONX;vor-P3N}@>)ejJHQ7Qt?;K~*+rS`rIb}_(F=dEe z#)ac2kZ|1Z-D2qLn||;-#xUxM;B~0bZs{pcg&(~1?`fQ`jHdV(&>{>Rr`L@?DsW(y z{sE4oaIH!_jl;usQf~?u-S5KqYc=Ll{c~^W+R(46SHG3o|4Akm{WWw*DZ<*D6+Z;% z`{@R2)C9FJ{@6gxG5VrtX{%G3rTinXvgjj{*SGVWa_$P90j_ZxwX%Y9pUNk73mxIE z;fL_R{SDy*>;_kyBO09!og2j2wr|$K<+dqYlk3calPGXU0v8~E%&AFl35^-%ynMDO zbxQNlht<8cSi%3ZBbmHn*OH2+D}I!9^YZqS_K2RKD@ z?Jtp^Uv7G#!Dq~u)ms8TLk#c0B!%}?=^G8?toNo;;eft!HVoiAqYi-QbsfukFDAM7 z2M=c8ep8^wT*BIxAaF?Gtz0(M4SJNTHd|HB(B-r1Yz~r{Vk!i_ol*$r?Qm=P%xZ2Zep2!AN{22J^q2k?QySbqHDgb)=I03fQM@GvS0s2M7CZ?BOdxP#BTY;IbVd%$X#5gA zrCZnYr&b9a)YJ(n;Qd`t?cTiwZvjtS-arf2f={5nyje%k;C9oQFB#gBd-d~Izy!v( zyQ%m=@6g8+oSyrpswDyIES+Jv_zniRw0ZLDf7Y|*p3sB`!6#?HC(Lf1>~w~_e(q;= zr?x5_Us?DZMYXSGiccDS#82VpHFUk;lbce|`mds_NW<+xw^u-6KB0#m^m!*I^~ zFmO+$R5h{gp5}m77I^bCInP{nV1k8Obb<%Fe36=C50K#5<`17J^ydM=P&M~Q6{}|% zd~UQ*8#Otm6!f46-MhS7g$Iu3Vs}&8d6v4HX^P&{>jw^?L9rwF;=6a;ylg2p?zro& zlj?&9j{`@0M&O_v+HDSd#SGPlZ{xFEE&sZB@r;XK3_H(MocWa+8r2D3R!e(OOZB5bDq*WTTn zU#$rP`zS@g9<&?BE0)$cj|q)g5baFUPRl7rg)DG=Wf6J;`LCzYSXD--R@kjY8o47!cJ^Z*aF9Q z`JCc0VNFEyTEG{DGcL7&GcrrT_tv-v;VTU7Pvh^Oh5ww%`^}$Zh-ZNM1>WAG zTQgo@pU>&%75^H)27lz&`P13p5~_EH>@vTKk=K%PUEAsrU*SIlZTN$NVIAy9U<)XFnx8 zmxfQAVu^1h{0iL6ReRtKvevZvRZj)}&d_Emd-!bZ|Gi|<*DcLdsHLrr3sY|sd=wK} zR9`%BLBqcijcdTmHPFK-c1}s*hMd&wyCpny=9*R{X9aqeeSgtL{;vJwTy|bW$pwVt>Xgufm`%yf-&r;FFxE4IeFz*?h_nxA^)Qchb9{A81 zF5M*kWyOd+s^i%re6z`Cg?)vtPABVzHDb$iUuqKF7k0XU?$G0gj;rt!dUdd@uXwT0 z6~{Dcg%(9E)wOry8Q0S~kt3)Ii7x;?g0uY(x+uU9EClxm68~#i@B2nT^B<0T{hsN2 zbOJcDNQ1k>9~mn6Nw`M(8=X%>Lx69&DfpRmtZ7*t^ZGg6$bx6dyUzyqnQkp#eTCqU zpbt)g?=h86rHDa2wr5}%qleS0%zvO?W+N|Iif3Y`=js2VjMO0y^yH$QsngJHl=U8- z=~e!_cn{)-($1|LMGtYokEJy{Dm`%jS(=jQufRJ9-hslsOYgG87sH=HvR{&2L06f( zUoI#7J-FX)&QoCw*6X>p>-Q0lUxA}3=YW3b^=-IC{{mDns*7tM51o6bDz!a;oTD1N zzmbwvk>p^)Q=WS+(cocvS?`=C_76DcjcZxyXgaeHZQRh6eS&8ayiNFei^W&gJ>GO;{fQ5I#PodSE0=daBWUtrY zKN#?vNAbI(?e*7|PGDIVXs5I+*Djh0yhOj5zDj(fy=`{=;J~~d6x6GOLN3UnQQ=3y zyK95J&jsxiFMN@4ugDoZ>}s9UaDk{Le7#0%g#tSS5wL%1*2AJZkXWO*OYg+=6Z3|L*zq;kqfOOc<}h0sn92@D0N6KLf*#l z)zT{TR|3~Jo)0N)?LF~OL3guwE9I_DLU#B>4ZV4Qp&=D~Y}DCV@w^P^D#;=Aiy@yC zJZx&wf3+6hR{Xq-(T`O10WWo6-bk)gvVimyhW^&j2F8eI9pIIRNZ!IylTp##!A0B% z`d6c#p#OGR)BmLro@qU-+e3|LToOIwkjnV!tAZcp5MNsINAyA5a~7*+hEEoJRF%JB zf`<2@ku$n{6!BW6hYJ4&K8kk2{rm-XA7yAhEm=a>EdOcfXK>;eiuzPeJZ07N>t3BP zx*JI^>G37W)rXF5DT?pn$)d!Qf+n+`cF&~2Z8)HCJmGqjWEC|tlp>sehL1qV{j7+= zLk!`S;xU>^{eIL194*TDy(F`nQcqGZfVSud;)FEFTith`llY^>$ zb6UAiJqZda;SWDCQRmy3hmLL;ppd@--^(lUFwjfUH%klFTBr}*Dt$>pkCd!T@&nXj z8<*#XUdT_oU$+`hKC6*uz{?$_u)bE$V|OTfjstY+cxN8B){oFHbpx-wgq%@4JiNyg z_?~+h-YWECRukT;g|p+*qR1wVNi8Sh^(#nzVZyf{oHz8hOUO186z&)OGJ`(9Yb-(Y zC~zAEJ!b$1fPF`ihuzfZtCr;5nJ<feM zd$$Z4KDH|#LMAL6*@1ox{y3Sz4bjhL=wHF<7#bPYtj`sidYTY5b(3m(NPYs9lVg!vDb&jHN@-!Mr_Ryr}~VU{!5(yU8^ejSpW zL&N{qoziq=^mtw|qLLC`4NqUeKhvHq_lj@i!g%ox+vcw0{4`3VUhu5<@9f%pc+r;h zH}npp_vKxTYiIB^C7#prv;{RXJ?RfDJ~lEBWWr6A_vvQ}9t!n5)`6jO;iFC>^dkZe zTkylg8&UA~MXy-1@11s_&Z$Y$GSI0HH9RfJV5#1p+G_sB?&9$w3&={RQe;4{ksR&< z!xx0!+QNGZwUyZrscnKjW#oc;@iV+>+G6@OI6(9b{NR)_zoCbCE*1?2U!}faoG$fU z5w1&(>JYB{{+)5<%K>=fD-y63)4nd<-){4F81S2b#bqBa3lJ>P*2GS9pC3 zn23Img#2(UyqXmnev86f3TIh!mBd>DZztg#$dsMPJ1yX_aeebEnRkFMY$5;k*1#Z* z8q&Zq7he#60doR2d^HU(gK*x_i=DxeSd7FYYr{DKt;=RyjM2 z45M2kc83_63!cF=@l+-IQ`a{aru2>8V%{f$1P}VveQbbVGx~=O9fO>@nB;cg z%9x|euoXCXRf+%6{CFn@)m(oMKJft!ZKy*I&Xi2Rl`EcmI7^F%iN20A;154GkA_ER z=9)7Y`P)7C`o1P=&c#77H>Ghs-1*ia4IGhPr$om=J4wC_-zGsJbGPPieC!yuskihJ z1%EdPo-v^gRJ#M-lGQVO56P88uhWJNxm`0#n4e+HoG9=z-DQ#oUwBs>_q1N!nAAW^ zhCX#dxCPHe`vx~9yF@}TGK7Ja9#4lT>T zbpt+{f+y`qWta>21umbPPRuN<#K#lgc45P!&>D+nKj8(Q z75_jZXJN^NQu-E=GeqJ+q0YsF5}(GE388*EOHlLU_Y^PyJs=(# zuDgYKHeKmZb7=6X$Pf=&MOV)@Fb~9%UssMBC%y}CDFSnDEg2aZbYl)So0XIK1Iarj z-=_3?6=B9l;dd?Ih)%h-HA@DB`q#lH9*EAsnG3X_yTCIG@T+GF)xOAu@a=Euop3+|10!U0{2&2dMx?_^w(;Qc@5Ex;9TDnxPn4HDBh1~NO0K9m@)Zmp?@i8Ok@2uOW|zM z;4?2pmpYnts_)7%D#s;(*FHtowiUVgG}UENq>?QEVrx@0F=I{n_7{Ag3NR8pnBilY zl6$V5U0k*S5|n*c@h4=wd+4e zU3qBCrm42Mk3)wg!H>FS`IUMtGpLfeg6H9TqDTBT#B(~oD-c<|rN&{lMEWhfH;vb@ zpyibKx4T-^W)fX+{Pj^8^Y$f?ARG1+t+80!}b;1IaBFvLA5w3Gjj@z!T_z*{1;Ae@Yt- zUjZ3H9M)+rY9I+ZuBY%14gID2iSO`;PeqsQ!05kmH& zs(y2TXSxw^!I0Ty|4gHRGnE*cn1lmit_VKCc5snrm^tuAtydJjVOv!ixaM4dsRs5& zq3$FLK(^RlJ*()z`M!&+Y^jSUW7b3Z3G~T*1#Sqh;E{&crt)6Lr^61nf`*<8Z=;a- zuU6}aJ{IPJ;X}W`oXi|0v#`iIte{>Cgo`n>o(*k{KIF&X&Kf*PV;)H39AZZ5pv;Zy z4I7rSc=f`=3k4KnJvJEg7bQeX7>y=JSu4`^!8KRJJ*@)IzOQqi>LD{KhMZ6MCJNYP zV>Zjce6h^4o0$D@&7*XfI|>@DlZNM{#`_LXnBii~nPHY?Fudv&g4txgTqYT}xv=4z zWSQYWmf{r57Jdg@N1x3u8qT;hw>-}HD_up`M7_soWHLt2G9`^OSM~r8wn=76;U0Gl z%yEKa`68dYOg@84Bx4P+H|xRGqqS&J=YYbPBj2Z?p}~23xjf-2h33IyYpI*gTuaCg z4a}}9WRa53!-K*1Jgo52*l*DqHoOs4>~4fY#zg^Q5k| z?Q#_!Dvv9t6o(X2(TlvyOr95YzI0hkKmR!#e4_}x)QS$LD`xWFXFMZsL*CIYuRXK! z4609?sqL4qY~6G>!)l)3Pw@x1@SN=CqA#(e_Z6gbdrQ&UM++#|(yM&Lt3SR|=7zf8 zdJjL^G>*;<9OBHKgzx4$oJn<<`<=3u!R%J(MC*9B0d(!q4j${MX`igOi5+{xsBW>6 z_M5gQpBsiby%(qX{mv>naAr5Y9RG<8-)9_t?gY=qtMICt^XX=nUFy)3qUP)K#F5|X@zHs&IY+ikHtv`Eq*rE|HK!@t zi01a6zu|V}5&0?W*bL^j+RG@qaRZfNa|l(+5o$C~{=}!JztcyLdz#Hk4>SB4TqL}v zT6U?GI(`0~qh>&VyTY}6cDL-w{Pc#y>V3*E3vAA6mfiS()Bo@>W$ot;y2!KZ&*X$1 z3%O(NF@)dc6q`@b{tKzh9T^^y+rr~q%WWgQSp6SA%s)b!zEj6FX{GNVb#svFH z&FgIEvyTUx^IOH(F>8Iz{Jpd4^E*En`)W^dG#frl#rybpSookF10u}2b|7juJOxeHk>e+r8aB5^0bHlcYrT78Kw^Y zDq?3&Om9|twUYI|HTp!kx2pTw=svfNzRX||0kxzdUsXX zpuFbw26#5g+*;IP+GlDTv5Q~TBAS!a*RIy62pg>n(wVmJ4Zqv7DY$N5o#NvO!amyZ z$D7&yceC)eKljy>Mh-LQs=3@g&1lBD*w_cv{J&3n>QGM#2)m~pd)-;~xxm%VQ>Y`jA9cU_sN&|D5(r z?5>W_Ph%#9`>S;W7ShB`DH(sV%@K5P`%6{x`75R(Yt?+8%j`@npmyGWsHZHeYfk!* z(mZ}U4PV*1op(OTYhoR=vrA9i^2}$)p|5ye`@=r8;#q6PwbI`c$5fMzrP*y^9n(?e zDYyMHQu(w?%VGbHYpgd_JyO^Vk3M0f-!+r3jrqcXUHt8U3`^<6ffBa4y^v8PM-E-p ztB9O2YMHehl^EEOckRk&%QYp|>qr~Mci=L&I+J~=kkk#&ad;~C23Cg!!5G@Qpx zUk){6+g;!%UQT{|B$jeADzWw7Hj#!&IccNqI)7B7{P{cfkTPrP}fwqICg zz6|)wtIy4+?tbG*YOM3PN)%LMwUIh?JzJ+NWX~FXj)M=S=3~8!^ZcgGHE@c9em()t z1gH!_O?cM9v=(aC`FiSPd++@GcDh21Y2x)-W=v;aJI~i^1l%!IWVn&`f;X8hBe?3; zDK>r{zg>hg=5qov?e9m6u3idjJH&p6i z0XG@@VeWrc*eu^*g&x!Iu#Wt8ig4~oFri}m?l#VZd1Y%^7W`YDklCzrzBnJ6vR=*D z;%zSP&{{{|i>4j{4n3##dHN7ml~$C^qMF%dz-1%fV7az8m2Gy^^ zM~=KAUFI1BZ`Iaeow>*JWd2hlLi&mRF|!8sU8K3=riy0k5<87$v##;U)FpXRLT$Bq z%{|JNGM4wRDr~+er?fM1H34Uh`~|Y|;z@I90Gq^^!PNpk;ezMDhc03^Yt1p*>{zS zT*+>qnp4saX)(~oeHn%8Ews@4^yJsI>2E}BYO}k%Jt2PtRb1z9e#BXX{j%t;_7HUI}y|aw|FCujbR|2k|2#$iC9!Gp{SqUIos4M8lI0uyLZN zzO(x~4e4Cf#%t00@B0*bs_d0LC+94^(u$|`Y7r-W?xsE8Mgf1STmFr1aDk8Wd8_*} z*Vzy(+XTj*dIK%b)|!rOE>5qf{$p$G8mj-jq|O$Sk-t?qMCiTrrAIKQjXbMT$4!&I zOn+*mq)pwI82_3b*F7GM$MfA12so}C!`$gvH-l073g^Z?RCPTM8(xi$nA6DTbVH4O zRa;)%<83qYaN{0Z$@|Y4{_p2ehn(k)aXHx;=Wfq-Kd;aORfRf_bk=<_B>e;RLVG=* zs8&yRkbk2#_K}6f6wVWHFuOgyptt=!Hk9UE^-ny$RY z%?bWOsAsAIkFfgsqV#3sLC$}p4WVb-Qd1N1r=%tOT5{d9(d@e-t-Z*RiH9dwBXBa~ zzVBEPE(u=3xt?X>nGVYYH~0gZ*Es4*4tc(^L}}@2Su;Ow_Tt z{qzG`dfkss^z_o1d(L6usNhA~j(V(V?xB}npQohQcb5d(?jm@fOZ)hopb& z=+i=T-N%W-71f;DjWznK^jy1kwE_IFe`W5qV*;Lowngt~*;PlS_cA{zvS_MLrB*=NNP6)A*s6{V#o?dto8eA><6qm5o`U@n8JP~E6# zPWCTg<{si_Z+X#)w(wGt^>4dvB;o(n=m&?eb`BHgnSN%)GgC8WU}yjh9%CN-mB2@S zL{gi=BWa=k73Z?tnYorO=F%Xo2bbr(C*ufwLtm@#Mdw_V$vjZxrAj*P&#Qjj&>XT> z<$8G4S~9jJRSQZj_hG)O#eCR!C4Jehx3eSxccr&#@NyCiN4=}wr!11b4i2w|uB}R2 z_ui+-YEhzL$a{u2-OT!p7WKRW?wygqqYdG~zzX}y=d$!<|8KfoW;aLQ^HShBs$;K; zf)h5h0D)WTRsXWE$DDf9;8*~o@7ihB)aSFMwos;~=}g>@Zn}1;>wW!VFOqTMsR7=_ zZ!+8Z?Bn;0wHIDzbc-IRw`a*qj;I1Qw2^Qk8j`arcYZxaiB152SEUQ(u`d@YOI1Gf z7H!6FPW^+9n8J%3_>ScJWz3G(M|0+$>ABv$fh2ey`*N0=Tl^xQ|FeaYd#=U@p(9k0 z>FsUwc(pIni@o?amFyj+Ef}W!rg4}KEhrb&`0L?2BB0fRbQS} z{+uc|aXEOfQ{!9`&b|FN;uwKjlkj7~GJYE_e2mZS-J)bIIy4+ja%T24UFCS#f3K^r z$bQM*rmj~{*DP1et~sih#&wxLW*(-``GR?Tnxk~7$tT^fAalj6-OV$d0=W9+mnw3{ zDF=F!I=lS65#BM9(hZua9vR70d{|CB`ayN*u9?t(S=HjemQLBv-9Pe)-XzqEs*s`^ zI~%);UZBvrQ>nw9-Gp9Z4647+0ZgMT>zZ+$%q7%;c2k8HQH|BF9Kb-9UN0Q;M9=7; z=5@*v_>!6ZZ*#)BL#IsP5_=c(DYtj3)shixUs~(Z>*s^FDquZ&e^xtXrMl1?!@2IF zfz&N~5RaR5MEHSmqO1{qu+(NBgc#Bu8YON}l=pj0XawpB>7jGm2%fHl>03BHtA=paW8xg>^ex^)H^%6`zUko$uvZb8vhGj$=S$ne%ovH9myxr&I?{ zYTZ2rqgJ8E>zmjQ9x%Z~-$^Grm41&1ho-xzdJULhY>ZpX>9?Mz!-FDKr;3$mN6Uwl zGSmZltr}i`kLWCw7xQG$mkiB8zyJ-7q0uKvu2J~d=X?k8U2+F`U$(-uJ@SD84r>?4 z)0Piz?@Qn9Ln`~FSPh*+(r50St;lnSr_+MN;M$_u2(D zn~zsYG@upq(E`OC#oFHC8+Gu^sB4h~o@)YUlv~lM1Wab&JqyN3FBX3TecM9KD7g>m z;SIt9_~_kYym?J0XzuCkULZsZ4y&bWpo6|D@OP_o*`GKkeW+;W4#ur@yPQ&+@JBSf z2?Lx>I31O@yOQ86`l+iHFCP2IRXPz$~I zc9}q9Y($s=-;98z)agS-wf%G#8a+6acW-^9(O0O|({g;_G@iS$A}#vSa|O=_{cE|# z&nPeUa@7s?o@Tyns3(^_uF%hon6B;l^2yO(v%EE-A8^6)XC z{RlY6AvNGr-;HN@Y6kkaMs1qaJtHYRy9c9h^0Ui-Sa@xxu45QH!2%z#f!EZ|@r{R- zJ^(ECqj8gJvS>MYe3apHV+-#CpD7EpD!x;q|23}lYMRTpGJJb!_-HCL)l@AUu+CqX z7h?dUd7N*GAaG)p6!chC`#goD_GWyVu7htRaE9<%+HrQZ0@iSjs4EQa2j4Td=t1F` z{J7$84SZHL%WY7?0l+6Ud={w_2Wm{CAFCR%k;c`D zI|09;dsCZdG7o0dE`BGCUA5v1KIRi;9SxtRp=G&S^e-(QrEpjHOuE6RK@45YLA#%D zzk;MiPeaq%8xP!3xCiCC_#D=GyxtocDtg-G7ecez1vby;v0rM?s8;yAUXB2Y!|WOS zJ2n^Nxe+biYVoY(oZ~fg#)(a!JDXCip|3UW7vHh9i_sHkpvOKs&@QzNPnFPLHT+QU zkw-W;Ik{-392``m0Ey3xGh^MYGKPIJG}7W1!)xPP?MDG0CNsD;;|wr(o`zm!>@`F4 z(N_073=av|?@oAs?B7lo){3S*{;{~OnDw#nW;wU&ZjB`E-aCZh+kiI(;rl;R0DDQW z8vG)H;5mw3>bkWxXMV__1c`Ld&@CJ?+XC>TekYUiFc&#|nK1q`B=?aMLt2p$Oh&+D}acqzTmfXB)07wk4xl#Qp5^aHhc1K29{L(w-?!?Q_5LI zFAf0@cPMxs@D{czJE}J&d%K&W_vAY9+UiuTccLw|TrYffg2qzdu1d5Uw1|qVmWI|g zzonrajizJDNbX@xs+fvOwOp!k?Z_L>NMB(1F>-Ipe_LH#cLw}K>eE7rZ=!`G!iQ7v)K&UjKEhY&dy2!Z^DG&U zB}9*1%Ww zvx~a|hoA+wo9p%q0+Db0VBiz{sa?AA;2wH&`K8bicT~T)N%ZsLVXMKXcZTSZQY~|f z-c<17U0QQN;fw_S#kGI;r^g?DX=Ex49S*PYurUSCTJgA2k7siu=go^F4b%c#>z+D* zQ6#)gyc^t~5U?xO_bH7KZ1Fn#S;;&Yd=i@dzCv!JL?a-R z(YRhleQV)tRgA(U-pItT`4=;arM7;&g@Ztg4|72LHASm1`$wOSq)eqkcR&nbO_IcU`ZTp?B?C!SGiYdXMi# z{4k!*a|#YJYS9MvYiK6d?;)d5@ZPBE)>O&RwOqwmhyR}`ejgpb9VOZm9JsUs)}r2u z^PRtel1Yfh7Vm_hm%;mIYk21x`);vTSoUZMjpE)H=?GC%@w6$-@X|)#b5Wx4)<+IfuGl3m8cyzu(p9-87dqH9+_+!I#pd zo7{JbX9RBuy`&5OYgPyU{zm*EMn+2FJ2&zeg1qIo3#Wx|FDM*K(y!t1Yv2iLs1a)U zh4@RtwJdN;;cZ$t1bh&+;Pz#8!atf(BmAz|KAm@RYrzEtyw+LA#=uwdfk(cA624_u zZ6hiWFoocsLSN@3XbM?R{M~N6<^%OTMGclL4;ap<3r5egzQ?-R@Y{?`^Ji=LmEePm zwdgnKS3~>|WDfj#I%#-q@MD@v<}BBqjI&9|tz7je=NSGa_94nCo*S|Sf=;)9(KM;+ zF>)V}+JuKMIlR=1^kC7Z#*J&`HM~^=>!t7h9L>lkac?!W@Gf{P7S4b|UsUMjT09}} zTcg6Y73gb6ks$95J-RXtvjf4*PXpJrrN?E!zlZ@7Nt*fivL}r_cgYy){ zJitP$QGBUnuVD?q?Oz+s3zzKd>a@&WrCl2{^q(ym5l&gU+c2k9QeK4k$j6WShWs_)9**VGQX7 zlEucZXd-^N?%VjU_|jVPB?H+QW$P9y6j@HH;+XEDuhirjI| zU4_gb2z*ulSEaUrdNMq7oOVEqi!QJ-g!|eb(;i^-B@N#YImiO^qov%}dlE&ph_=M% zkvtBs%a;~!Bk3!?PiAPBkA-<=!IA5+<-vb1I*|`E{3Yd8>Wu7{6Pd3TKSF#woC^}4 zbx~pqZ+B#*X$ ztKi}*!I$?Ls6QpzRkXz5n0*ZI6h8SBy?9b48=03vrm6Qf=wZN<&>xTOr@$^N74)Ej z##GSM!g++huw;RlHBj(Rq5I0gYsK>qvVPMcZA)ly(`3nv#s3kGA-y5hfx6Ir-GCz< z6|j>rTR}B*d5XWH(UWyyxAq)YeGZ|fEzyNbL#}bE#?#c6Qk}IuYpqcybE5nlRlnR< z%d7}Ei>u#X4ccKK$5oPx-hMht@&P$Fm|Iw&Mav5}mK+e*L-;p>PpHs?1>*!iMY}7v zyLGtRxnCL>Wq8avrLgBL*?{z7@n>G``K$J~?js%<9b7S$r{6py{*25!IC_8k6C@l3 zx}9mkGll-P2VS3RR;Bjz;smdp;2}69H<6sQOuh%=Cpe*bk#!6f9ZLoB+*G2OI?Nrd zuD%K&B##0Ym)uU_%=6R%^%xm4xXWJQJAAvuXxelI z&(_RT2^sYaJ~?Wjg}hj=Ie8QKIFs-iI-}2Q@e>JNnE34)7y-VQk!wEhr=QMqz+V`n zg;z{2TSwiP`IXx@3)I6(dkMLpw}J5 zY(xd*v(q?}XH(ZKj%0Fj2E_XVzf!f`?nu4Wf8vSr zqz@4q97bVoCkQ-DBhR3L2TgKzd8(i-;MoSQzqT?_dz<*EF#yU9RHGRPBNG$fC z9t&qjHmtLjX)gH$p>9aDH~2B~sVu;l!J?Jaq=aKUV8diip&|(y5qWWWnQd?a--R=4 zc)%K-lm;iW(3dUv2@2;;!E5EFW42kT#-Eh+(D1Is-{vRdekn1;!UZrRV~PIp8g@p{oPf_QrYOte|4W~ShoRx`!sD8y!4Je6p$A3w z61al~*P&KRzF6=;3_t($1V2^5cOq~^$>((HID8K|`Y$p|hAvdlRgBC`IK5jKJv~N`9H^N>I*+x=8`pn&a>TFU-O{76X14Wnb1kzNwR@bQF2NP#CHiyUIn~tt zk@B3)kVWN2o+5srk=HY3!FG7L*pLZ0_Fb$!_FBOXn1Sx@vgM~NzKcA8SUes5!gD_o zE(tCurWfFqi1GW<;)mMD@RZ?yIx8n_Rc&QnBTGJl_Te)c;nApD=G37^ z-_raBv(U5A{`K3HojKJ{WeM~)&klLiMjDIz08@2>e5)uzTSR2MnpI*v8nIOB@2~)T*2}7X z2KLF%x@nL4oh@!zZ}D$zuV^y!@3~}t1N^&%CE_Z{Ew)Ko98SfZnGs6a*T`C?_=TfFXy^81$a851SD~>g5Io1vs zy#d`)Yd2igO}ffy-WL->&Kd9jK1&{!o6CFgE9+q$w&A&{X2OnacJfg0IXthiylnjb z*A2bLz`R(zxQLqQcAJ!^?>fA1YTp{q`gUS^@S|esAMsOlVH*|i9@nucin8cZ%NIjCX`C!u9~yTGGoMKo$~4B72*N5 z*kO;JaC4e|F~bIJ_GAHKV`60vnxo{M(sRA$F6M8CXJF+Y9eaMEU%xZg!!xwPAx7-& zHvf4#jP526qbT14J%5ktuiY{21Ngp)mfjzeP1=RUFOltj9;xSb^egdzr$uDju)fT@qE7Z%u$vC)S z$Lwx4G`#KZJhs%oUq2L%bc5In?PtxAuysWi55{vXVgpt85+6xghkNK7_uef|rVY)K zWE%J|u4MHiFkMrf@(cD2YjvZc-;ux0hE?wBnPcS7wQ5d9tFcB`wl8g{y0w{{}B=ddybe8OcOjp-ly z;(BJ1A%4r0?#fr4^5JVsc9LI~C-a+LOSF%XPjv60Y~@ACF|ehui;o-evuC_>#AzOe z=@3hi=w9Zj7;j6Sw(5yFxcDj091>}E#b-8nZTya>!^PeLPqs%j+bdtkTSRMg^e|b} z@R=rWXpVoeUzYT>5w`-1>ClUIM&@u6H}t_nTp>+@zL^-kwT91PUb$8oh{x}T13J%( z#f5c&-I-di`%%P%Th-#pf0v}ygSeRgX1g4vv@_mUrc^#`N^uMas4qhQJiQbZXPb%9Y59}ZEWF^@$z!5>YTW>p0_?g)_IeB zA?{0#!LKk}SFH6V&vMEA%cZ3ZIe|NPss@e-?X-W7z3r2|;<4bamifFdx+eRG+M95C z=-v3|+5?6e(V>Uo2}icEZpn6^b|V|NM&h{WZ7!$^`iAM%6}^A^^DC`?R$cx4>UpyV zr(KkOV~2{$s`A@w>VuJC)`H4e^|kZ!)BbsEkE-fLl@-(Ls_&?rUQ=CHA63=Vme)rm zgNF~{`DuSWKPM;X7oHmw2WJhcDW5m1a$x1WS+y0MrEXwZZO!es%p2SOI7|;x;dMbq zswpkZY)adgnV(Zs7LE=^1-<_D%+d4bmpAh{uvo5eKjV3 srczI~KW=D$yf6KapU-W7{O9pSnScEMCGCHw@$>ZLn2gl;(G$vk2c0B`2LJ#7 literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_indices/f5099c4f-df9a-476d-a736-1eac0a498173/auxiliary.idx b/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_indices/f5099c4f-df9a-476d-a736-1eac0a498173/auxiliary.idx new file mode 100644 index 0000000000000000000000000000000000000000..57eee5fba5a54a17161bb005a3f859127b08a500 GIT binary patch literal 12931 zcmeIw-AV#M6bJB~EzAxTbtE!_l7+s!Ftw<#B13|p=mGj*8{AzPSa(Cm(jxF(dWLR# zxw2gQpo_?>F8&9GnKR5e2Yw6-BPGPqz+pr&XoG$|b_hTK0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##{;vQ%30mQp zT@P=SlYZ%k$i$i|(3=}Mu`SL<9M_XgU(+rRd%o03@%3fOQ!UrA8|u!rebvxK&kv<8 zuIIK2->NecH0sNs;uh77$0DCe(74lm|8`~T_O;8VU&t)cWJ8B_S#|B2tED5gWIng< zFDysZF0A*q57yUG)vs2O9TIK^lN7ZIO&U(q2$(1dw&;5MPZ8Pqv$v=wm&AMvNi~28<%UWJw|1M&>Em`fxW%CD` Cwop+3 literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_transactions/0-9abee4db-9914-4c35-b600-d995235f8e27.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_transactions/0-9abee4db-9914-4c35-b600-d995235f8e27.txn new file mode 100644 index 0000000000000000000000000000000000000000..d6a0e07b3ac04919c4382a98b100787472fc3510 GIT binary patch literal 283 zcmZvV!Ait16h%!J6}rqyMua*H2m>i;o21Qveu$g$lDudjw9=-7`dNY><`?K7C@#Ek zcIR;EPJ=-d&M>WO!GvukGm3NOw3baPeUDA|mVc1qmg-_JYA$)FkaZv>6H;hqdIe0@ zRv8bfN03#7(IU;x$mT?u@po4ex}#Ze<>$}HK3~!t#s^ON?Ec)Lhcza8NAn}vG|d;} zuehcWHB7WLG*8wwO-!=XH8D#x*R?dTFx5>gyXBAFmDo%7G5u literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_transactions/3-b0b6e7bb-a152-4148-be3b-d1ab50215bda.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_transactions/3-b0b6e7bb-a152-4148-be3b-d1ab50215bda.txn new file mode 100644 index 0000000000000000000000000000000000000000..869892f078fb7d0267cce92ff3a8f40c6780c492 GIT binary patch literal 107 zcmWN_F%E)25Cu?yNDSqcRuonwV|JEV7%YrenZL80@lc-5BUnQ5ns@2K4G~LS0W!{s zghdH;200sYOq}8N?O($)Jch}Vx-4lU6$MFUC(Yti%#U3y7PkA_KBb2C)Lai^8~?v< FJnw{l8U_FW literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/1.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/1.manifest new file mode 100644 index 0000000000000000000000000000000000000000..23b69adf1a71e3a52d9331cbcc616f495871d2dc GIT binary patch literal 357 zcmZvU!AiqG7=*JCV~K*Yr&19r2tr|(O|qM03ku>@L~r6H{K;-KvLuphOYPBz@G(3H zo_qxFo_!N7N{a^v<}&lmTq4Ku53pOQ;nz}VKleq_j*I=5+=s_$Jm?d!ZvLm z{bdJbHPb5Vs=3Zg)!A`r8nEMtCE;R^R(pJer9a{U6D)}}Nk9m~1(zgGV;~|Z;=F`7 z)gY*Wy3p8l&|u-A%U;zG_0f2<_x$qo?(KZOeY6+7D<>Z@A|cnBtDHy~aKej7kUVCL zC@Do4i89q;LhY=++xFLgZ#_n%fClreWv~`f_K5cV-JhPq#5P%BG}M!OTGdv!Q!v;K f7tEo*_Ycz;rQ6KjLXEwED|qOfm5_6Ga(?;^8@+9@ literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/2.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/2.manifest new file mode 100644 index 0000000000000000000000000000000000000000..bfdf35139457c58a2ca8fe0babcf7d323100dbcb GIT binary patch literal 466 zcmZvZ&q^af5XQSl9Amp+=u?QO5d#KmdZSU->&ap zt{&{20!7PMOL^_}Jz!nWRX5Gr6b9Pf6c-8WNrl$1KAv2GpS{&29S9!g>8S{1nyY3a zJ4`ig>RSa5KY08VH&ER%sY`uN5TCg&aa^ZCqQGOsHDfPIm=_4<8l&B@24JST`NcPV&RiBZdOO=J&1jH=%Zm8~^|S literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/3.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/3.manifest new file mode 100644 index 0000000000000000000000000000000000000000..d1ad0b0a8e9aa82ba79e2c3f83e570010abe1850 GIT binary patch literal 294 zcmWe)WMJS@5n{?rQTPu7j9P5PB}JKe=?07zOi}D9scDI&IVD_nLTqKJ$tC$k5{$@d zrP4AhQd8oKGpkbLb25udtkQDw6HBa&4a|*z`WfN+C77+aIo55OcA8D#!itO40UQww zNm@p_rly98mWJlZx~7RqmbxZpiRQYN1{S8eX(<*)iHR2Gmga`$dLHHH literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/4.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/text_unit_text.lance/_versions/4.manifest new file mode 100644 index 0000000000000000000000000000000000000000..1b1609101e85f1ceff65c87afa3208b7ad2bbdce GIT binary patch literal 360 zcmZvUK}y3w7=<&bjU@`otV%_wAP9vSW+q7+vk=9thzl3uCj66`YGgvg5aFfrCY!roM8 zwye77FWVdEGp*7(pX=1*wN1vR1e*kGB$_>1?eTF3;lv++h*dZgha?VTNkYvPiK9@F z3{;bjfMp!0fg;n`bx^Ny-({bRR=?d{OEx;MZ_n@E_Q&Go@uG8uDo11Z{5~^b$jpNF*kZq*C>g7xe{v z2hm`+Rq!D8dg zw8qkRO7FuETZJTz{qVLT_T}}I<9c>4NU6?+2e+F>u_3;Whh4YqhTX`?rzGW86!h-HQH)YrgH2!MnL58y`LO;))xD`zy{Xi4(B@9R3}d%ok;_#*%NU(x^j>-hiuTBO+j{{4Ty z2K;~imzL(`nd+YE?(OA~;_l^=6z%`o|u^E?wRD`>h6=6=I-X{>6+q_l0yi*)5?ny3=q*R|2k2E*ev_yxehi8(Pw|ioems_%Hig%iqkE^GL zPg;tr!`h4H(Px47}PjcYfT$5bAlDu48-5d^= zw4~&;#1s#Qr>kp9a;hT{N0E}8?Bg1=eUjZg5*_#ymqdq4YN~g#58lkf+b7Z6(=#Q} z3xAHIb@g;{csU$tNolEGDR`7bcaNlGH=K%FDjvkm#nr>z%Plo6%_YS(4L``!C(V(X z=IV|U#4EcddZea0++5^w(mWjwN20fncWQESYEp`akB^U+XG*H4d!h^O%*(~c$Km7Q zo#x@@;)#<_Oi4;~q$J^Ll08!Jb!o0C4ma@vUh4)N=g#WFC`_>%_}htH=3M;66^VOb4vO$$j&dA!l#}tice`*sH<(>We6J=V;L|C0N* z39zGL_fd||2hQ2{CAS}6)Ev|PBZc*AMWgfIQJC*`%G{Vi$+gZ=PPH#NqWd>G^}h?0 z^ZQs1Ew`Eb6-L?V`+Kv0P<4(sJ5cv~pE-^;8gFGskFgVqb=5Hoj&RbmAkJQ!!=vtw z;xWnNxc##t)FFK;_pa2Q@x69okNKRIc}b_WzDyZ!9&^u^&CRs?;r0l}pE~hLAf^7- zgA?X==I+6t;p@Ux!StD&diX~QTvLnuuP@{geTG@_ll{17pXMCt_ANzKcC!oimNP@< zucM5lG(LKGf;q6oT^hLHC+b&tRdxHJuGuAiE_ZFXkbNf=Q{A@LHRDFJj{McdPRu!N z<5v}syV#10vX7kTJevl#NU$QaUF^Q419WK4W*!yrhDKB$#wR|nXoh@TXU9FYb$(U} zbHJ1vd~94P4qE@IJ=o)c&d$!EKL2(yvpSA&bg4Pd#OE1!KJFKNm6Nu7&%NGzaZsfd z+~w?CpXk>IxZCzsR`*sLIq6go2aK#q?N1dk2aUYPQ2>CL42Kz1wNCD^n@_lpUq{tp zUP&|fa(#PH$-ZXVs>>W#-lUG*rc=nkh8+B^K6Oo=PvM7marD{!6w$q{Jvcm(`i?lo zX)VLekfx0|^h8s$`_aZ$_S*N!T3tF`?5@oLjmUtO4+oYLKl z`P^|N?QWPI|E2?{r`@8M>)s|lpKwmxMOEUHB`ceK_H{CGk2>SiG|oKnJC8UwOzOmp zPddh_3xA}Jb{Q))Y!m9MDGd)B%p8#}sjx;s1R>gMLo1hWwF& z_Z>p1O@72PchCtRPgsM>B&t|8%#kUtbi|U~a$a`m>P;$ebS*Qsg~0{8XL7I3hdH=^ z1H1F-IgDPS)S(x3LHn}iVAmwObG3?Q;_3ifdN@5Tj0_p(U*MR= zKGbz@6+W?lwmvz$l0C9cCIwYpNqt+L;!(G=>;W}zD4c_t?fI`xJ>1idXuU^z#R{I& z0DV;29-WnKMBHy{cFZipJx+aYgtlp-Vv6J%AxGBp=+@cP&8Ta~l_5$x^L_4s*D;i{ zd90N;bRu=_u)rMJsXs+e@!-g;cIfSj6k4t+$Ay!P=hEme>N%-7x9>Hc3XfOeVNIVB z{?8FZ+W!i(3E(peoT{d;U3SnP{?Nu?Oye~ zRA}iYI2vX0q=O)Mesa0{*kif&BZEv|z%B zDnt3$ZzWCO1Rsl?rbd^|v4K52sN_9PzjDh+pL?4E7FV|iX7u6o4!3wr-~Skxr^Bwc zVqi>euUTGZWZAu_iv`qU{8pCpM?dP5cjgjmRso}E%#^RFpmtdfZ?cQ~PrOdy2X?As zo2O~Nzb0|F$*TlgZPdRG_@X8c>77EpJBv&IvfowUU%M-M*iTRONuFm9ymQAnt7QIl zOQ>shTt0&XM=#?Jx2JLMKk_(vYKYyd!y)SXz~4+Cni{)PDQ~ z5?ldh=-!)-QrPTP=x64vt0M@{$48qKwfoFG&Z)P5)PtWUsX;yNVfIE)!jY4}s`)B5 zPt&MwZz+D-G44L1F);pX%!2VM$LC9pvsQw)5hdE1QhOl>8`@!)wo|~!rD}NT!BXc| zgteRUniXTIf$-a{?IFD%lK-GZ;2j|h{vrLt!TTE6-5)eILQ8L=Lf5L?v(9!7Xi`r%u71CtdiL^xiX^DM-zKRkH!&w6C7;ne+;#wO~NMm2e(@-in`{)4JvF8{0s zHvUP=Y{5Lt9lm0a#{Dv|lZJSw=!jB#RCc@fbaY`+vulScf<g~pwO55BiD z-CyXSnA$4ro9!w#!~jlwZjUbe-uch?eH|I$VxRI@q)rx}X9WJTOt+7lKtpH#qDGf` zXQf|>Q+@o7YdoJGwsatMtFa2WxR$|@xL?E-=`~7p4>FIrl@z{d3T}s8YRTYh6!!}| ze7~N^;q!JH9S%=()?J=8kvbMFt$|lG#7I>cW*T?gI9mh{{D-o&%2Hae9Z>t zk?@6_&Hs|{i_kWkR8MMQ4|)E8btZn3qSAu{3u06f2(_M&11|uPQQLz2j(rMqfI98 zv9Tq&*Of!uZC5?BNA>1*m)e!pz|ZecR5f=FtG|PL#BH_Oe_6!Dxhwx7i#aORjY4iV zq~jB(1Apq8`D;HR@Gnm59?qECpIeY#rkmouLX zA=IfYHPZRF^5)1|FD-Cn!rk+zg>OjoOJ>CvgxPUK-XlBWy)`oNrS9_QT=48}X0OiP zHaNU!7aHAiG^ZZ8V4YkH%n!@TlT%X-YkaXhebJdLdL ziu&{~Fu-vr{s%wKsQZf%^j&T4@#W_hbed=$%Bufb0aF-#CH*ANDRYmyrY&ITF&z`+ z(7t^pa`(`UDz(`~E^J%H=vbnRop$#kqxTqCrXqUoQH8%OpvdgK1pOuT4(#5gI%R=F z_^nYnr^kvuB4|niZzaqjKH8{=omp;3F3#2HHTN)gO{>Duf4bZKW3RDjEpTie*8De) z?(4w`15Z$1W^pt4O+Df4T6p1@x8tbm?)lO;;HoDH_i7|`J;70@_fel~1vGs1U^8^o zCW`qyS9qxw9@06sf@AP6iDuMquHY2wEbw~N&^*qrFh)5w*zTJOSZ#za+(jAF9xKsR zSsh>Nkux%N-(g*Kul?RU=KOzFeyI|+=ojJ6e&3WZJ6fd)^O3Xqy=Kfx;aHqkVv^K~ z@L-OveNcf9^1$3X4(Lq|o4rHJJtRg3f;YN@gYD!*_cMC%nEN~+IhG5fszQSV@o}H& zW_$PXeEj?jr-tb^Z8i5>8)<{nOaEzblH8n{|0#SH$)914(eP2v4LmEOAGH66g=W}{ zmI~+KoYBxEGD8XT*y!|VCJlIf!-^fLbwj7^mJcmNMHpF`@=A1vjWaw)Z*Omx#kh@;2Ov!(p)8LpST+lah5`m*~ z!K_*2zki{|Ow&gfPEe6!zZJ|9{{x(VkA-{GqnH0}M2>YOXjMM7shTNVapcaID(I`) zf}Iv-sO6V3nFjj*#3}VdweQqP)IE5E?!IE9>c9D#ipj|35sqOB+(iS27ufVo7Sf3Ltt2TxGlcCF?f zXSOotfpA#V`9cC;QS$z=%Paz4V)UUM-mHy=HWvSbg1lF1;bjAF{Un}&0#8xkJ_de< zE#6YdqDB<f*8)26Gacz1#aK;W7>y+a)1`JFz(@Y2sIsmk|C=Kj!u11LxRC;U}BElY4L>z@(Q z>vq3_E2@2!2|9S+S}mRl`kNykwPQKU_!@qKHA-eeZ*N}(4#WLVM^n(&l}5(oRLi$| zF%$pHfn{n@pVZ?T98P>K0=6sgd+O4@GJ~tD&?lSaJUGASWGXCQ)s$I$;=^p}y{WzP z{rhz4#HmZdRPv;=T6kjWjSD)_C6Hx~qwj#-VFc`!S?KHo_ym-4HB_UPbi%;S9JSfa z*|&X1_!H(aiJphnQ2i@kQ$6dn)KS0hkMWJu^6<_M80) z=h>4O9MOXIC*U`Fd52H0S%)0p0DPizd3acxHMn5z@%ZVS@UgQApNQdA$oHDZe*J`E z4jmD{QKRR$TT(sMW6M?suU84p3l(&Lom?x#S#t?PPHOOeopPx=_YE%8U8aC9PyO1_ zZ|qeanZL)0jnJpy|5v!%tGeQGs8e4pVql924W)XX+vfD#@NVE&MLDX_m7ymzut|4n zSI)qBD{x>d!+cEbw@eVPgnC!ag9l>e!i#X~Ow4uB4koaO1BNeA{@1J0i6ZcDZgyth zbH!}YVa`!dX>whLKT91;%{1g^ zf(Pr&b-!!8ukKgjs&En&8rf9C^UVc*@qmjrb&^*%1)hi*St$5K&`2tDbrUCEL{@O6 zfDrU=kvrU{QvuHU1bX-)wD~0!>eAHi``{G!bBoe}E0+@VA9u=vPctTo@T@wvq>?(u zTphu^_Ii=;h2ofTok{92tYa$abXCH%y1#$=Tp{f_~^Lg8-Z&P5Xo zPH;fUnojTbWKcyC4-(qdJ{41q;p1^+feS-R8^cFD)0mA$Ud!UB{YNZZPITspxwDo3 z=haPko18uNA0>SW4^ey*4LxXpS2=N^!@_AYccCRFv*_0WJ7Rdy%6l9TQbT3^ovHnA zEz;nW3ceq-Rt&PsR zI}x7jLh%XosAi++6(209v18@?3{uE06bd$076?;fZDQ(|)A!@$oy4xDU2sY@>E z^jUGx+%;_Ra^u#Ja5bGc>N^emRl^PrutsAt$FhEAclwyfb@L(|M9;Q)iz z{H$|g$Eq~@l7^n)>!lVB*Rk1j0;i#fAe$WvuzY%_qp03HrE`-~wl-Z#KADo8n=_h`c zhHs}kJt|8hswN4)&`rS%wAAhtOy6-dbAmbvvrmg*^$g0UlE&2DUKHf%}b(QlqRjNa2K_beo=~F{JaY{fhF9U9=bDR-(Oqg*;(`A0&?Q?ilb2DS zIR%(uad@_?8r(qRZg_O&XeAtB@X7lMejq~wD$FQ_JG11O!I5>q&r8(tnlmW)&1%UX zL|-asM{xVex^Q$AhA!nOA9sp;w8!c1g16DAg;~a_F$-Dx=xF+Q%;-FactqK5W2k?% zUUKH(V2gzBD0pFZ)WrQ7IHo)NR}$Xw2+Hd|$><+{UBL&{;@Lu%8qn@4Byc^$|K^PC zsT7=ApTMCQ-k?=bubk>wbh_2$^*p18*H#^U-UHn612UPZlvd)B27YL8V;o!V${6}ERwr7e0NS#krlpG z!oPcecN9LfLj!a5kO?U?y5~E6VnGF`w~P8#!i9#-9{``EAB{Nkhj?GemFnVLis-1q zZ-rM=hkriNf#sKL@MH~d0~j*NN*(+oAN_AUe7u^XDM&a_c0`WqI%@$Bj!M$m@X3YO zpa#Vs;*-PY>Eqj`%M4M_gc@0d@M9xBsl$G`+njtzLt|qb*@}N zd>!r^dJ5T24Nl97(BMbhdF*ULCL{Vo#eaIt2v6S$4{sy<^aY|%)sU?Z`NW_KJj!~j zhaG(4oWJn=82PG(X97;~wZeO{;LZrIKXkWG>p8QG_Hjj>8ZJkD1s|!tn`Ddy!}m`@H5r(udfwm zvxe`Y;1N;OM0f7h!3*AeMGY?zSw|JSN3Si&U;orYs;1~pzm|g!(m|)$;gY3jaAffh zG@eI63sZLC7@fa%ijsFmb|y7;WaP_XjGR{LM6`}dn14dUk5~schY@DW2YB8;O$MFXBA`7eK-qCG)%yq z>c}A*>H#%lRMZAn8tMB=W&iqKq4rpK2J#sNj;JuB8NP?;8#SnHA|d}^c!I+H6*3Kt zoJ8f-`p$hknV7xBt_h9L%uI2D0oFA zzP-#1=t}WiSiI!u*B+A7tM;eHtI^&6w!m$4aD%lJ^mMs!NaPtVk~=augeBf)=sIxw z?xQ)eVvrJFUHm50y9NHi$leU}ssRs#24>vR!cX&-OjIE^*KvBo+oDGe@H;*FQMS_q zg-33Smzck5G9UAtCc0g8s{y|OXSJ6*t(~QznGErlM2Cvc2>d=G8KLYRV1}ri-~ZLP zKk*8{FFoL)Ef6mSK65Q(9?+f7lNmX>__s>D^)VMeD(pW<=1jl<3%)N6|Kyn?y9o=jaER(1Aj*6i0B*^h!hNi)c?k1Urf`_X7KUCF{$riMqDSjlu z?>7ej^79eQUU<*80&ipNLg)^Ir?GH4$%=t@lHJj<3RAIfQIe3;sQh+QIHF}+g6}7u zq+p(8DaNpmPb^@s=tPSBLSbJ7{J76H@Yxw8IRSJiL7#EX>3@}IMC8j9TT&DDES!D| z^4DDC02cgbjd_Zll!FFxT?Jji{We6Y`0ajL>Qel1)VY1~=Sslxg&IDFPO8$)>A8Ya z5x$OOM*=$)QlmEXuyglA^tR*%$ZM$U^!Ylrhk}Pw$3z}vOV9P`-${Yzi=QhVkkqh& z{1Tp8J=vE){%Oe0iGeyX;Jt}1ck(NokMip`g~Y1~`Kb{;qX}WpLBqSWvMc|45WQnb zcHH5{R3260Z{bC1#EU-^=AeZ+%u$v1A>)2%jM?!Oi}ws4fG|gOO26~y+c!G%@n9`G z5B=P(D)gkh7kd2$!QUl(4>Vd?{P{x8Ecbh^@H=?92C^Poc%^vZS+hqdXl~W(ttSD) zHGC-1+bn)2at!f#75Fu@)DH2=1)mt2PzAbvD!HHNdILTx+FK}3R#r! zDh*D>@KgzWO7y!%o(WC&>8R~0=9V=*}hE1XQ>m{%bSwh_1|_~^}6B(Jg}7i+^P!sEyEkr$R#Ll zj43`E$K3MKzGo(o=s5B1z(o{%250?ZUX$cr(8J&@O`!Fo6mkOH!~Juo9_Z4yk{N#E z3qF}!k+JVUnO|lwa&{%!4s+ZYNJ&I5VibnwPCN_G{nbHm`bgbZ1Dk3#K8RtBz6Lu1ECFj&J+w}ZY~ zL0Jbz%8cgWq0iKyhkfy0)fv62kVB}{Zeh5qZw)yc_#XsrVWH*(SG3d_eqX~6<{mGa z8Q>`j80!#Sj9oIhdlr2Q-r&r6;S)PLTGPP~i?HOC*xQiY#X7E_k7L@)E`v(%+*|J2 zf@di2g8jc%@^u7UBH$Z#Uw)+Ud0!~#P^-g@k_uc>+*#y z{0jb=0sl;P5E%O|1e|byztOSZr{%))F}nE7l^qimxoQuIHwTWusZDx1ccI`RD(vov zKV?M>-L3n~=_ET12L4=2_Jtir3tZBGzv1*21BTbYuHzYndxEa6t$~9)`00J|jTAT+ zJO@^t3d(`UMqB7LJ{dF@x#(QySwIV8@1PoCj-nQ7iZ4yzKa%r`KWSy9|D{Jf%b;Pw z11Y>oYl>DL;DFVg^BDEdBVYch2E2_GZDQd6qU(ekO9tmiitC2#0J`hWTs3fUAB7o* zjQwjRI`8O#@m%n>EW=~ru2-ta&WG%468t`fj?v&^f(3Tci|>Jd4gyD3QuolE8hB3w z2mQoDzE9DStJ)F#I3?Ot_7}xpl-v|GZXm;PdaxtT3`KrggxhaKo*z4hMr;|%qC23= z4&t8ZXh2a5&!xL1t#)RL&_xQq8T)-Z#mTpT6FeerC`0F{FyEF&;qe7VkLueP8T4V% zYLerL7LxCQ2SMN<&@Qdi=vCR=V@or0SYWz>KMyX8e5%xC0vBW7KE)WBqj+|bQ(+%- zpCMi!cm%jvcP;uGwI{rj)A!!8LKdx8xHB4D=>ha?HiO5jkbfHx@^=ONQJJSQ^s(Qj z!joQ3;ptyM@6G|=D`rHNb&>s314SYjWPhab8G`w;*GKv7J~74506)@$IKh@Y75Rzy zn#hUR!0aYu#zx$F6PPteauySwpF?(;;CEZND-CZ>b{+&DG`vxTx^fH}*%$s}a}rJo z-KB`ZVM&%<1k|XN z*S)wBzAig1z&X|a*?5wDH*n!x*#+%fSYFAUWVg#LtI_1e$31Pk96eGK1S>RV>M+3!(=?7fH%=E!y~PF*W{0{#)S-zDts z)H0E6GW-q&UxgBi6(TqN%88lKY8H0Woc;(hWbx(1d&x!KhF#q(20kco9+JI{~t%kmSwbfBZ4K^ z1(ulzoQBWw>Jfannc~+g$vuVRNN>S2l|3{$H|JR(2QD!4GOvjdpq|CoQ9DHz+*Y1dhJCfR;8%= zUk2#Z?a1$hUtr$0)54QvUv1=t;R@Q?xyK?Nj_g7wjtaotMTvK7^gnxD%dQLF16YOq z!cJ?gEHKA#qT*UIctP=z+uZfUli@`-sOVi+x4@(+_ejiR5tWv}XO%x&{7 zbHf8swqy6-RIXM<`>an@yYKi~rsHTlot`>CZ>+tY=C}Kga-uW%YP~Re;^@ZfzDU78 zU!=(qsjOJ_Q}=?U&}4O>TFlOX{qdL%uAoxe0O|DE*^Q9 zvwAh-^&1P-i7d@IGaJ~+s*Sy}Y)>v(`5bL*HJ2(rC~aTZx|PzGO|{EBZ%rd!wjkfp z_33Tbn)INcA#MHirQV;Hrw;$=twvnvqq4kuQ}MLb)~QC%__hBaem&q2^&7l}XH3OT zN0le^Mea=Y9KOhmsQ)GHbXiV0zfRU)HhD^6Nx$f0waeS>ny<6w-Apy{voOC}*oTX) zv0voh($P6{)Q3CeIH8QEIrfJiH9p@yy{tQzb?wV$)%7&<%wgSf@LhVaA=1WusJwIc zPdN5AjQ zUd01)e^@(@&fWZilO9*6i#JB_mmcTot*5Jb=S2nke1imPwjsqds=ZOG7k+BH`mLg@ z&)-tJ--_9{5BQtCyEn9p6=_H*^H0*g^yVBhEKd!7(1U`ew&$tK^QfS5d;8kNQ02Gt zH;$Ru)TE&$?LMQ6nA^U3q2Dg5Wv*Y4Xm@WuQBRJTt%{6}HtQUm!#x^!@RJsg>6eZx z_+O9rM*M{5bf%)KjWaRpz021ZGDq=%OO5TNr(RLj21CqyZ<|uTugaR&hNbKCe%twQ zvHGSR^&eeWa!mj3SDx`b>>g9geiF1-|JA0B+31U0=X)-^QOR`Mx}48f$l-Z6AE}9v z_j%-@@in?{wd|e4xNC|?tYV((c!+N`S;T>^&CDJZ z&hzi{#&5E{l~E5-ZonLzA**;HG>Lo`|!-%F!R;VLnvp}B-Lgw znbHe~RY#2?Ik+e5UlI4heIpmh-l=oB^#e%^UAr+5h$&6LnxW+whRh zyF=;a@Dk3N+T5uu_xrva7kt*lKEA_`o;?_2pq^;&{kv4)Hl2%%zJ^-fDZkHqYgDpl zj9f?fJ>BYI2fp`qvtF59k7B!)Hk$?qbFn)SwEvr%e1AwOz8YH8Jm281K3uJszIWv& z&ssO$#yN6Ysjq=gb5Sp^(f`A3V4SJSmO<|})IZTY;PFzTnZ4NhVHtOPThqKWd;{uW zht)J5I&=O>YxAQfcGzTBsTpb=l*gq~Q|$>?7V`cze^I-d7PTHU!)_Yy%2P_s(lgI^ zYpL_alk(N!^MlRdHBRdXmnW0iZ3Kt*q-s{@=Ht zL$fSe)@GRb%cXO=LdAUEGw@5R@d7XE*X@?tm%feDKAmIXoVC=6NBN~xz5ISX;YwBW z!Q~S6vzlM<)pF0}YwSM)Hpw|!z)`!?3Kw(Q^JxB9 z&33OdIOyx?IzO#~o$z<4d1Cn|=7=7Z2(_i__AgH-vJ?SJ9FKedMvgzr+YjFirjKt+ z@rdGc>1=W!C#|Ta1{^o-Gtbf}?M+8=Sv$d5dyl_5s2-NOL^DPG4 z%sjAoIyb6wnWkDZ_=IRmP37we0m9yE^Oc<(NNtW$U`e z?W85~}8K7jx9C5!~EZz?J`pW~YJ66CdfW6YZ7ki{Y;t7)4}N`6&FDB(@I-K%@4T3!J6B#r z#oY&Uk$x`~YJ`E!@++16_zO+$)SL%})#JVQ6Lj_T+6psEk32M+CV%!5t>6EJnXGmb z&W>*{{6JBQ?<({JKf5{C*{{GSE^)TD3V-?y*B`ox-kf(gcP*{q2+KUnwabk~4OFyC z=mQ-1Ulw7$fsgFw{LTgJJ9-T*s$alc4d&zHW~h{L_jJTJ3#o4Z+3cOOgJk{)*TIbA zOFg1#@2e9mpMiA`HvhOn)&Du?BcD<4+8dsqS=EjS{mTLl(wn0{=&lik{CMyMnb}lj z&m4fJOiH$zjK~Aue(&WMp1hFl_xj6x}J0TM=-b=HI7_KA<1iLO!tWt zol^llaGI+fu0!ZW{=mmnx?{byXW$2&GQW#mWaS1zebe2@S&o%v5p!|k8v^fA+vY{k zvc8QB%zU#_;8g9ASKT~vaFx6prF^WcP#?_5~jPOWCAK-pNsM?YXdc&xB{BBiSUBRWS-jg(+FsHz8$KZQH6!_7RGXGUE$L(}A z8(wY1XFhySd*=A_>V?bM?fwBm-6?Pz&b!lvp9Hxu_z!<<>`hx6rhI%}5%@OHsQ- z!%I8_mz}QvjXEJ`Z54ZwOCI0svCz{t?#IA>cc!bmPYRi|7w4-%@t5Xqpjzh1dMD z*I3YO0pA?DnD&glPniAeGVr37`RDE(0<12rfIIrxCtVqL%`!(Dg%r1ooqM6BFTgt( zXUAv5QY_)KGjG)+ug|M8YROu>_;Ze^|G_HW`66M?8kj-6<4hgl1!~mMCVX6fZp)cq zj@jw8u3Eym`iA_fz{#mmod^y7VzzEr+Im$ymw<(i`F;=7;^DWXMyzv3el`Zp^&xOE z^7{D$Us+v@+^Zr@!~e_%>)mSbJRQH&QsS;KQsEqm|bxo&HL>PUG|z{#Z25Rv(pm% zOIopr`wfQv{Bsx`pPr>Zx;ItldsbxNCKZ{%!c91#&Pu|&a^{$>obG5O{ckQR--o?t z%~SYi8)qvVf?v*#;!Q)2X=n(No;s9sMfj`q8bAE>h_gl-N7hkB(_38c*ITGf58!xj z#=Oy+-;~xzL#hyX1eN`^vR&cBO$xtpnxTsf)Rcu;LW1EPJ1=+YzE;QI@;I(Z&<|W` zgsnota@C{fMQl7j8(p_hPPT(b{MpO+nqEb^Ua<#1ojk6s-veep(AN|Pd<$W^$h}1K4F9Lf{ z^6Z8efZYdqeBLzo(lgiMSWIeA|3GB$PGNE zsogansan_D@ULIjRPmd<&AdA&b7wk=gC9>2{>y?jVM+b;>8VeQsy)|Ggs(rl%&F(} z00g^|_NU_h=IWrSM>XD6dk(J#-N3ZypV5@|=qJJ~QugTY$R+l13ST!%gC(844$Q-ley>pWuosCxPpcj;7ZB8 z)U`z(z??8D9_ek!j0HwGX9MP>zF2;pOjwmPxZ0LNVP8@UidY&cHHD5 zJ4^DY^V6x`uW<~mubLHn1KqdVIY-Of_SewZO6J|<4RchhznY;}w`lMbEglCjjD_2x z9%$6+8-kxyyZuhW9JlLi{+d_TJw!{(O()pcx_`+s|<#Yla3V|jDHaodV5yk>;BWYGO!lfwU5q=G-JC;54zok!K139dPf8?G!t zh2LLte01N;%}d=^&@-YVI5+yBs&;rKe2vM5^ft5tbw2x_0(UeIL8A0=lUm?8F z4*#bbx4(-2)(V_&N~v-jlH9-srkFR)M=B^~1TVr!`8n8c)kY6>Z)(LQ^(o-^cmFC3XFT_Q3BZWL9mYhkGxQv!{-Yf3QAwE`wRH z1Dr5Hy<7E-0uIugZOa&54mbM3L4tP=rxhn?7Tyv!e0xWgKLhV;RBHm4q6!VSsG)nl7j0}q=i%RZ6@*sYh@wb8_X;8uJIby(P~`F;u-DX3(m; zwe5g;KkXEq(7wxya#k~e34t${Hn~SqL(S{@@OS~S^TEM8nZ$FRHiS( zAJp>s$5+JBwM7RQe2YTIt^^(|rm5STsv$>egRj-si?@`u#Z!dNQqV5&BpULvzUwvo zK;csg`Url~HHw;)Ll5Tvq0fBi#;7NC;B#9~(h0iF#i?p&z6%3u>8HPQ6z){xSN1!1 zkZ~{0+1liBcLmRmb__Z|m>~|#0?L`WmXlk3XRWIIryIN<1)d6wI-m!q3(6rX?(y*)fY|=*Ag? z2>e_8FFxSanAeXV%S}~3_3syR`119&;OlHmdwxy4P;=XQ2VIX|uD7?Cpw0}cC45_O zR1aFW#)%!cYs`nQojokI=D)oU9SvEa>ra@j{O+vOkDiamvrILfuKP|rUGsd2IsB@) zgTxn+*(EiIc?La*{}%GQhww#9YG@35(4Zljo9uOZj*GXlz$DVJ5(jH8K0XRNzRK_^>Zt&D7vtj=O#SwpzCsNx(A7Tr*#9 zFL_veM=kzqme*}y!msQ&e_ZZ`L_cG`s^%?s30~MTJB6Epdq4wLH1S@9TB1+JEho{y zomTAS8W(Dsf?@Oi-9zH{`ES4Ds5yMEZdB$4_cjfJ)~BYyXBlUq#LJW!i8-oIx&Ek8 zZzO&Nd>NU$8eB@RICw=ngr$$XG;32ne@t1t937*U6wvDCcpPr(qL)#hJOo`SJ z-xBYmflc~kx5*4|iw3OEB*C!~+C#i;OFXm>=e9zp&exggi99Z&1~+fn+Uad#u3M-p zcw4~tWlbz_b)#675?Z{1l`|)RZ~E|VpLXQ-Y6YP-9Rt?C%JulBoo;ry8gHvKh2Xat z-~i;E)5<=+;ubh*oah!cH@2qqJP%q|pLRW{X-&WM35{>OSmWLd@OA}XlP({+3{T;r zZXM+7)C`voMesNOF4WM>`uN$IPEC8Q*m#)*T=}<#mhfl6YiLEnd#an=g9!XbbOv<9 z7X771sCbkXyia;OxCcv*AS)pFI1GLPto#N(>>|kuNc3FG-tQIWkp+(g-dHP!2gawD z{h-kIw6023nj5>+xK^wPxi|Zjn_PLK&^PLSt4ui;cynb>*h+HDH?#I!~n(jkIdl`Id9wqB#B zY1_9Alz2temh@2e%7x-d@oys*2(M@HOEEieZ#&rE>ZIYBz#D5U{)bxRJ4f|4EqKy% z)y!L~NqE_|Z`WE&S4f+hfsfJ#=zxr4u5_EyJw?r#BXI-^jIDazk zQ)f;geAemL|GS5qU0$R`Lj&j3_LAO=nLx-isLi@)(JGGbO0LxK48ThciubETW573+ zo^i<8Afw_vYg;qCBn^J5!BX@Sg9$fOXeR3CcdCLp<*hQ#!_jLrHf~Q(#pf#>2_)NU6%0gsn z-@}vk)#x{cImze!S^}$k2}hQDcj`89efSrrz_B;M2aW}H_!DL`i|1bJP%ZtX9CYsl1V&kK3_ebQ-SZR>q;;yxME2{ z4dele+M<4P+L7=_YUYYvfHVSq}VghA$@PtAYbeq|{ z?JN9ug0-TwN7Yra>OkOLag4tCHRb zJ~mki_QCr%_QiD6@K*WopNAFRUq5VF->8~YjG&{0|69<4qWv{+kB^@%i&~v!%=@<; zAuCkklP$b4k4NOalNn1gx8RBER^f9b*VE#y1EXbr<1D8#{36|F^mr}xDgFzx0|u9b z?^s@HmHc)NWMlIz$?<66?271_YpQRbbBsA4y|2UvM!x0L-HkJzQLQci<>p6zZ4Gbs z4a*!a{BNR$7P0G0ykjAcRNzAzo*li}{RCcfAm1pv%(^+Wy66D?JTRMsmTfYAqDq39 zy7Ipzobx4R$QaSl8vZCUqBqD`H-CXhjYy|yc5YaY1Hnc*3h+&p^Il|e6NNNEIPrET7w73 z9jgrByBR;}(_in;MUE(*v$Ov&zYSva8dS1Gc&JX#9=)f# zW>waxMfCJ}=(JGAjQW3m4naS|e<-8inONeBL+_~c7D{{z4L@Fq@A&5Ye$g@bd&MS7 z?#Imv+T!dcDWCQg!TD#4&qap@{Gkq4!+v$+?nj`D6g(x3+(Ch3=l=3=pT_%;p0HE_ zHw5D>WK9my1E_KM$8Fd*DxAebfwt0dyQZjyzf8f5DUW&8o#7!7FxlESX0`+G#;7lS zcfq#YQ?5NV@<6s%Rwa1q;9jqxx%+W+x#QNZV`tUg5<9G$3GF!F9a-tATm$FroHNkQ zIz7m#tCe^v$Wd8zuHX~x+NdPcdfRm=qYosz((rDScnQ$a;OgINc=Upo@N`b-w99{6 zH+~J4&vbIWrg|9xH$#niRr@bA!4O`% zbFsqND)?t~D!eWsKUd&24E;tY9+hNZ1dA6wQB@}Kx`bmOhtgRC%JJk*+gQAa*sjx^ z{CDbdU&&)p)2o$mGVnt2ffTrq{=@sI7Q8&Qel_FI3EmLH!%*UNLYHgclon2((V!MP zj>dES?l%sL&Ozpe{P4NuG5Zm;eOYJj23=y!*;WhwS(sXXqOy_Sxf3-nl_Yute%KTZ zuT5_X9;L)fgy&>IKl4{*mRm2jmeGS>dy-_0c`tS_axjH6mARS=-s;47!fw1qOz`Y2XMx%eBv)7Z{f!*%`LF0<9fTo&q z6FhTTJ;5FGESH^GV9PZM-><~KliWXLUnSAsH2C5`n(vn^_)p*h{6~$~8o3*vowA6M zuIzF4K)1MQTC_ay#hm#y{w}iHM`-lKX$JNcqtgU`k)XZQv)6q^N9YebdpkWL%rS>#0pN-<*Tg?k z;1lAniLb}-T9FG5)Q@hj0@u3a^q=wE&J0g@Fz(Vot)tfNaKhi`HT-krTH5KkRjBAE zbJMwhARt zSGAFiIiN8!7}79MLTIa%bo5nRmepBcGSAnL*&S8a6l6{e{M^0pG z)vq+|Kc>wEF&g_c`ff%%vX!L_&jq^;1B4@sKf=|^y8}CSD)DcT=PKZXUA_Kt0+&(m z|0vWkeQ#=btQybC@GvD)2j{FT=Ve{nT$_>IDeQa^GD^|b3R$s*Jss$h9N}EbE&r*4 zFO2+Yu6~!DqJ&>S|7g^j?Aj^#5W=-&H%i0vb!tcCK~|ML#ZB-{+4oX1OHmhxxoS5H zy{7Su=p%OrIH1B_j}?3?iiW@XN?m?ZoZ!tU?0FdQ$yu_=#^ZYu_8AoR7|19kZ;@RL-sk)KdYm{_Qzs3T+WS~%)GdmY8X!o(Qt7_l&MREz-&3lj?y z3kws2d-giEs3Rs8c4DE9qK=F@e$Tq!AMfv-aqx1^-g~X5);%Yy7>kw`&3v!=4&kK0 z_xny{L$-Loz%9Z#)a@si*4MU-G;nRmqxxf}Wj2eh!8sxLAC}D9z%M0mQeYQ+S1@LsZQS-M-vOt-e0v15;tkLjREzBOk2dgPwvVHmRJPsJQ2=fg4 zHS!CWzcajq8)g7Ks8d*=?41)eE181iZyLFYQ+W5s->zunrW$>U&tENOPHBEX#eDtZ z@}(cZk z5zeM?YmL9B;7dtTgX#&Sp$P{(2sl)Z6{=2}_c8HH_32*;4p`Z=V z9r>q&yOrH)!M~K*5S4pnF_O6`)H!^iI~wO+a$6f&n})ttv71vx`vZT==yT4MmdA>F zf`=Bo2$`j!H{E*!zpC4kJJ#;#M#x*$!q=^l3GOFgF1=}$C3_@%1v6LE8C;E*ewatX zRl$WU@e;*Dlk1m!4mGBm{IeXGnbSmmN-;II3BQ&3ONN)uk_BOgfYV;2sA8{P2)Bj5 za@ds%ui zU?#YeXk`k2|6b!-EX)S&K;T}&&3IC~>}Ein$*#U9vu^N;565l}a`mFvgAF7z)R-Ay$;QE} zWX8cEb9V3;bi|xNsKI@NK4idybL9g4PqijwIRsv*!Lyvp&x9#{9)le85=nj>wSBX~ z91qr`FY=Ai(1N>_)TwyN$b2>YA4cAzkx>)8K$$^y&3-_GslyMiDrhX7{9kr>1>xv< zb4l`*Z-c5z25G=!Zh$q`sDF*jSmsgW%s7AngjsA|qF)>F-Zi)>{G<+24_ssBOcmeL zoo5vOg6Dc2W1LG3Khl*!!dI}sD-JKe^&5xooyL;o%6x9b$YriMByev7c+87^ieNr? zt3&d?LIZ9Iry%6beD$X}4wqjMUC@;I*y;L#%#vCGb-uCS9r(ZSNJHibC5LdELy|RV zctbKX0BzesW`l)K(&o>zfw_qaGiWj=$ugIM9s!@zkXbE4j;w%HqT?03WLM@RGf?mb z;p^-+;4>-F9;gumn%f~-7dpx{yEUcKP(yT!RiVecSaxxzBc4VA&1`U(10ccLNv zQnU#;g@RWr-i+v31D|PNmQef`c(Oym-S%qCj+^kdoj3;?GhQ;2#n5AzoeBj9D#kKr zmaj>3?%Z!NGWahRdJ#vu{iUIw4e_4AOJu%PiQWeXRmghjHEXidF^h*B%xjNonU_L)uGL;`JCNVA z`c!uObYsoG^K7pMYjtSh0~~wq499lQOU@SC*=OQI4hZf|+r8)MptKi^&#`^iRj|XK zBw3*YYLK&VCT9*SWQW<~Fp@6>c)cQl6lviA9ihi_^@!u$6?9Z0B zuY)~`meaoLHgN0#`T4 z&}eN1ysyP!@756R-_AQMA9+We;(&zT%nl`r*bcjp89JdK$9>&F!ATwMht7CDmRgcL zgX@|hmv?jG$SVj23YjVWni=7p{;^VHej&N$W060ZzFX>0V5OxTbFs8t{_T4@_PvB_&RxyE@I1B_H9;z!s{iH!}y!Sn_Z{W2ZhaJ>a@llvaCb8eoEof%Gw^k zW^!QWTZ%gMK%d0yO>FUfoW4Ge(~JMDJ&W}u&%{PXLcM#I_o@6iS4%l|@J`F^SphSo z!Ch+f%U4IhqNO~2cL9p-&`!lxO6ABC6*x1z9>qLqOSooolq_R6i;U><5jy>1Hj%o9iy>3R5@A1!++$W0sZWiYud1i2MD^D}J ziLWXDjGyJeO2uryjFy(e?*WC}@4x}pznCQ$!m%d~Y4=aVIk>}SBXC~h`tjdiDCgHk z>^(Hn#F?iOi}RWthU7QnyNxB!W>XoT!SSEFxz1SMR|hzJ(GkOcM`_gJPo{s)cpbK* zndx8jEO{NALdjJwvqy4W?9mFw`Qnsa|6|XJf0~ISI~vKut7x1r>a*ppep!2}Q_gH? z$=;}>p@}$-j_Ia0nc&xs?{?Jt`FklE_k2UrN^;v=0H>c^< zXt&O|GTn~3UY&bB&dI^wt5QY`*^%QKP|RI2(f@R67d*YpEUg{o5{#I!cs8(EQ~l_E zkG&^UG#wEwo#=0dTZ2605n7d!k8Ly)Lb6jr$TW6qt96Nn3w2`mat{A})$QhZzh9#zwhZ_?Pjyd)1{ zZ*^SH7N-Bv3)H96V+u{1qWZ2ogM^7@kR$meJh^<7le#<@rBEZ3Q*%ad24P2hk+k28b(K016tkErNbGx*pe2e}1Q zqlkIK$m7Ck4!rDT9>XjMYL~0N*_G*kYnj2zTBvw znOVNN*=lkmyKY(kp=D-)M!bQR! z*|p}*x7{bqr?5?l9gz2ytzVXj5C=lduCXQ}plh^K0MlX>w%~?BR*nVf+t;(9AwL$7(GP-jw$ z?9BVvN-TSm1KfY7z-NJk`T;In(ZEsmdbUvoBo5JW8`i5vUTNg~dXzlBlr%&0R-%CS zdtG%DtG5_&AHDckhu6EiJ2y1SmrYWpRNz<)!ijKYiFXPPd(RX(kc+c2p zBWvsv!9Y&^c#@N!jF;Zek>ipW*G!o{#6cx%Q5v3>89ph$U?|RlA36O?*-e+b>xXB~ z;yb20IJ7dJ%j;Fh6pTsDp3XiOZga$vZ;U>ny(?Ft{k&0BgF;Tlb>4F}nqaWkrS|6Yube*bQSp1;FB-q&?h;d2Vy3H|m81t(`J zoDo8AmNg*sS^ePdSCt;OkOFYeC2fQjzSQnMCp*IOm1h$|CukCXNHViqJ2kvBb+lllXauQzEXhuQx~45`TRoBstlzBRW#j}coMEjKkQS6 zH$BW{r!{%4q7IoFynxVGfIsz=a6-pu9}XZ=>*>ieV;$KQ^T9_G4M$AB5^wHwde*i(|@*Q5}z)C3pfX$c;`a8J8-_7HFnH@h4nnd56`sJj)%XSsAKjDI7%raLn!Oa zJ>?zM47FI%_Lz8{g7!?)VWHnu_?Op&KBi))+-K*Wt`t2hr;W9vz$I5HzQYskmbr(a z0qmfMSvuJ3ts`t%5gqofEC)s0V@GA1{2J7;o!d?uYvSC@M!!tbK_&Mx>X^{eDQa68 z4bGbsIi;2I#&hMs?>Xb^OUhVvL3`cD^LX%?=?!ygugqq^vugH}FCLUq={r|lo1M`A zG_F~n^jb*%9SWf@g_tS1ohqo@aXHsI?0ZA%fLsE9kI)Ahdj?MTJNadtWpH{5thPn? zlNr%qG$${bLSemo*wTYTMiw<=i`S;iBMT^G$^rJeUj)yzc|p(sCiI0~Kl)$l^W}z> zP_GyFeScaws_9%+$rc>;&wm(ua*%`9%vZ9ms3R927;+HLo4l`}jeMb{W^l;4wcuMTL(&6<%b^dM5%XTFfOYlk^q~57@W5_b>IE7{r$z1;tz<2l zn2o?4IWzS*d3M?)_b=C|bd*q+* z1n$UMQ*_Q}Dyrvx4xCb6CtTd)>bW@6?3L$>@-DYR$+eYloI%mO|2DEp-%@egYALS_ zKazd{Y~zrd&{n7V=;(K~DH`vZ!*z4iAzOJop1>h9PK$Qbf_w1_XUIQ?nbGBwAspQ& zxs^_wlBqJo4@sR$pVtA2FQH@ZQ$n){N;^H5kFI&7JO-9hvIo)w(&P8xdIy^LGt(pa zfZ!{qte?l3V=A+6rv_$Ua}NRcb;^fac+SLNroGXGH6~~}?J=>9_6ciGpf$2 zcN))edm5{#q1O~NiH5EMkH0I|Ys=4}jwmZvWzNVxiGzC1=CGn4$m7m)?R|BZ0-uGR zOj3T0P8val*K=0LahCO8KlG);8MB13PR`UrlPT4)hEcPYaN>;U>g*U=oS>h0`Jiai zSvbtV86>~VU_uYj$=9!gfA0e3cVqwWOEo@+HW`aaYEn4cq1YJ;YsTP(6m@=-=^nKQ z>lengYGpT5(>L&PD~i@5_edG{kMjIug6J-GTM|R)iv;|mP~R`g~x0iH#_i5XG;7U(WsVZ-{v~}$7JdgoXHstOsW$=UX+w#e0^z>Q6K3WWNnTD7KOKbEodUFk>Q@D!%p z4fGD|;}D8pu!C?t9GiO~dk(q*pW&(ne}bd-_@Y-0kaZ;Z7_>cXCdHU(oUkICl07`& zt;BF@yGsgvmg9P!VfT%hI%QCG`U50lqTH#)YUkw)L)ERT8||1LoInNIcJ z<+@*ZC>&F-C1t!hqxvq|4y;|R(2EGYL5s%{*>9%wSMAyNw8EL@kZ1i|94>j%UwEcZ zH9D3O#o&q@U$;Cs(Qd|lQAnk#CeDiiPNBs!N_f(rp(&k>lJBd&Z8}nbxr*QkVJ@tf zN_|rY+5;X)laek>51g`IgKLxcH=;$QpTDe~P5BpXsbpWl;{>O{V^@%4LVfWyXk3jP z;zJk-rSZKyoGrJEa_pOUjj;#RcU>Fd`sgnX0#9e$5Abod@*e6&p;t3ppXV|A4aKbc zWM#e>tD$cw{#~+_bv=SSruGCD_7ZMIa~jVVzNE5tdYO@zPin!rl;|93@wahSZUG7E+%tU9l&}T|5QnQTrsHvy!LX(HR@=>y)hJjGbD#D29anDXbi2ac{gSGzr%ui)Xq zPg^9os@= zZp>2&<_H#DC0Z5xsT0rjRN%Bu@pI6pIqkN2IC)NnGoyMT4G&ER^d0GhMj@=10@pUu z-AoN^(&){i3DH|O;S3ZqJ=b|?aC7lv6z*5fo}5z~T$Lh=uc7E}4-`Be(M{G~_gw1o zvuSeA8XQjh>|0Kb^ZVe1{KWpfYm2VYfer9(Kg{vKyU+pFM22SO^uTxneqRIhTSYl$ zaZH8c?EAxZLg#7h5vA`sp*B67sng?Yo1SOKXx}aSm0#Qg;j-MJkeglN>2%6y_Y_<^ zR5_!w+3u~Ld=V|&4SLQN+%4QOrzw6=$h;c_98&RX0(GmZ zQJkLpB0E3UaB(uZ=fJqJx^J5+1V4e{e<*mn8vY2*^BxKecq#qD5bpzLU4g&TlXX)` zya@Ov3LdwGz6XCehYf$nhVJ0-6__VaJr0Z*rqM(74;{{amvh?i_q1p!_-w*eg%{%8 zpPN|vZ(_lN@Xt=EdZTg+7g5Q>x8eJjFR1CuNM6%6N{8jVto>%J=8WnKNjNHeP-wDm za-9s`g1V@u#7~1}v)~(YMvEW@2QY<~9$nLq*8H2_Jod=R=xqkBl|^smxRp=(jRpO~ z&tvP%C(=%ECCC_b$gFA|;ygCE$LrBJhvS z1z!&DxqS%VzdhqD>Wo{(#9zbwRSyN6HN5`qV#PeUATf`vi=o@Mc{Y zTtW^$4v6pSVx9OqAKOf!LbFs;hA^AxqNROTX2-UW<)7qB>7Aotukj}%_<#H zZk+>lxY>*oCLL6$Ny53&;dB0{Q%)eCfgkN#;GwE_GMj?WrsRC0m%v|H$f4zKknpNd z-w7O-_ku?DBzX@*BarBM_!x$7fxdLK$qgO9Of*%34n4FD|9v$$Becx2c=DSvSH-OO zU8C*{^d}v@)V*qW36a(O@Ue4V8a8n(pS$4jkCT@S-gAd`gR~W2fhCCm9S& zo&f)mN;E8_;5~qYp3$H8&C}Qe=(s@&_{zaW@A1Rm;ML%{Ch#dVygDnY9rXSSZ^?e- zcPn3Wrh>kN=DbJ12m}5IM~xoHp2z#q(GFkGe=aG}Xp&n+>cS+NDRor??h_nFs4KH4 zEn@H#1#iQE=PLOIxWGDsA1i*X_VD(HU*U(EAo$bU34N1LYobL|*2TA4v@pC*@+~&n z0KOAERA`?_f>zMdZ6{d7+T)Q9J57g41Dqs*6W$@R`B7;mSBSLOW#-d zY{^(M|93&^f|Bcvp}yC%8PY4D*YtyFqZE3LhHi2Q5AWk1F5Cc~U`q;#onRsB(!gVa zAE*MyEf7Cd3Fi$y+8-D{Pzy(fW>%qBLkXTYBWu(ikG}}cY4|Z3c`Etj-$?O~Hmh&% z7pc&~bqTo6G1K5L#SJ7Ax3*H(_UM2Y)_@3~1M*SPu7-}`fC8U% zblrS-s@zjc^tt#G*n7h#2_9YDx$vFJF))XNy?2O zg>|rG-H~w|cK7`m`M_}t-iU!(RMLlq_lq}%Y}e%v;#?8*lM>B^vjjh2h(-@Zf4iul zJrz85;aFPoE73-2??x&3l{zDOr_&>8i9&{>0`F@hYQi}9Sf(+(^E4wgdr{QDdo6s( zAM>p^kG%Z?YU@~i0zZ>1+eq#5P{BJ;@Hp_@^G<|JjK!;xJP%o*&b-};aNp1oD_HPb zvJaoB?=^5ttv~gV%Fn;9k%bu2+eI^Z{_#b@pS8pj6JG`1J^|+xdW$3C{xjf~ZNPWX z@MZDmt#w=r@avitr6(B~?S5y;9FV0k@=cB0olyH)Y6*Rrk9L^A@Jm!$%4)UV9w51a zWKo2EBbtSM_Lb1V-Vq9(wH0bR7+$f3wSYIe9vZh0yvw|dtPQ!xa`B}UdJ1C>fFquL zMm7p=((b9`4+`E6vh>ZWY13!}ebs_aw!#*;F?1uj&BL=?lf!iIrgb{L!vIF#BF_Tw z>SMMF4%@(F1NYd#89mhkH<8{*;92BdGD8Plzc&a1o16^y@G|3?A$a+i*J)MK! z<)(zY9mRtscpJilRMzlLT5?SIe1aD)jxJ|ayfCbZ#y)BMZsddi=<-Gn%d^cA@yLX? zDA6C@X~1pd6!Pzw=}^LtaIZR18;*?hdK^08ktLpn_?O~EBFA@Sqm}Yamo=e!Kh0M` z6H=VuLn@>=awhz&XTok0oWdN5a0MrLnUcAY$z>M63+c+j8=#XIeglOx=xO+ln5@Bj zkbgmEWCNFsd!TWaNw6D#&j1&KkGE3(u14)?@lis~{p8|k@u}He>j*5hlh61OG@<3( z)||2TTIxr*B|JCL^c=EekV1Viu#AC4`pLR%gno|?MzD zU3GN+am2nez~fBhOcPb);1b9$770J1@VmcAwxYmWmE;$ag@dPP=m&+YiX__yKaz}5 zA$QQ=QV!(F2T^09MU|`z=3@wTW=TB?2ZY|!k{KhnRmfsEtlM8C-psj9(;e`~ah9>Z z&8Aw|D^C5|S^0FE$8(m>;*{=*;%O0d6*%lI3mEG1w~&ok$lo-$t1Ht*pJwnyN`IY~ z(EnBZ=bIX{E5Pf%yu3g*4L!)vvZ#@w;$w?1W@3LBvjfO$o0H(W_;P*Rv$S|_o{8|h zx56uc7J&z;A6yL9z-~VGBahU#3m>yK=drhk078;w`u#|C#hr~}*n>*9dOhK1)Cm|fBE95r-< zLgofvEtkeQ)Qv(@4bed25lgL4-#wq;t0~D}vOHUG!rdzz{UVN|)oMyxfaeC5y{X|b z6TB4RswC$N|4kzwlvx(cTqNj5c(#!vDveVP9ARX?_`d2e6Z@h2?)_056sJ%rR{yNgtrhlv))2 z`G~ zL@wsyx8Mrmb#q9@2erx1%|@SaWoOBE(+$b?8%_Mf2>5YT$M#!={k``8{%VUOjBL{q zocvL6tmqVEaZ8}zXDHc!co5Pz49@~>I7jtd?6-B4%seS@I3qQC2n**HZwekS!;^M8 zKkin7C4N)#fp2WEkPl*(;ydHq%Z!ymk8{mTVJ3#Ms{E_K|KX)qa$yqYnBen$qvVUt zNU{&n0KjMk&s|~Oz{OVu7m-ubqKQ-aP;5?$n9&`6(=^#{1M?6B-2)H&hYtACSovj} zEId+I{Ri{&?S5DB-v^5?Ye{`OBF-w>~cBYvIkpXI|cq($ID)vEZ+qxN9Y_?@`cMhSfqyO9M8{044X%2Z(VO|fq&}G4`=o@|W7dGgn-gC-q|$a3y{5jI z)u)z%?w5QXoU}QEtBF6%zSc9tl?}f-C$mf%d6EI2Q(?9!3Hrsr438^+0*8fOUZsF9 z+$ij+USD#g!u+KH{FIDIi;k4c51Nz9URfYLfkv&K&cas(50HPF$m){dDyC z+-iEZ*^;Nr|10E4N@j0F<06}IdA{OZ_`aIUZm~ZTc#jT>dTXVe8%=$u<+gDywak`a zmQs8I=CnDID~s>Xf#+r;Gau&CWIh9T3BNQROnRX59?8jJNg)RM7^h^F;Pexp2wGo3 z*SNB1uRIeNo|cWg&T-6Vi32%{l6sbzSDE92m#DBG8hNVB?6`6)nY$2g8n~vBFKO=x zKO@;AS|R7rQWrR9Dt^;F;7(6N`g+Enc@@r}>wL?sVA#Gc-0DVt;T@tq73PviW@*s> zox-1xn+oT_yvTG;?|xS1L_}Xv)P}jp2XATcAIziryXFGmBRJrZD&I~?PGs6x?>sj8 zj}m_t+Sx)rX8>RIu@rX#PuG8!i-w-BOkTA;T%LvGSD3LvrWdReD(rynnczU)2#N_KlD_t!LT8z&;H=?Sojy4iGv>NXU_Xi1gPAjp**H9h?2%4*73RVmMz=Efp%b%G1g*)?8U{E%_?e&h6Bckn|2XhM z!6V@K)M==Z!!i@BF(=Fkp0f$O+ko$*Fi+?5oG|N4@T-sy6j1O7EtwxnDSn5rMhdx& z)ILN1fdk)T%oHn}caj`2J?OA&KcNFPYLSGW$h=^X?*PW{bbz~Syb8kE!TGL9?yDbb=Y|7L%+dhA(n;ntagH=RVAot< zcs)NOpbazdU-Du0?R#71MP)WX1!j(LW!SQ3(A$!?kjx7tSLr~QL(;fD12tvI-~IcP zn+ZKHyn`JBa+1t52%mR6e5wV@WIiKd&Q1QIvmCfziW=J4LWV#x>*Q`ED`-bUJZ{WB zGq{HECnY{SvJ?fLfnHW$@>-T$S!Td7_pC;JDrh1bS%KwR@D2HhA=$Ca`-L=mBYA^(G4LYx1Eb4Q^7Sri&hx3lKP_Z;PVisk(GHx& zh2%&J0)}Fa=4ulIo`;2eOoevw(BKuyf8Yti477Ss<(Yy0rICRu%q%Eig;VC=M5_V6 zUH)HK2d9$XD`yjam4-%kz<04^76e(H0>`(6Z^N@un1x}<{Be$0JORvBk(@uwv5kaJMsjx)fq{c%6ulv407l~OhXGl##*dDMPwpE3Ts zmf3?+!>*`j|B@Y3{sJHWFCWq23)Yv*f79Fk$8_NTN|@U#R;GJ;v3YTAJWX!oZF<>L zsqJ20eG%C~=g{L+@VmFYI;UZNZ0u%l%`9*KGp-J)1)q58#2;*ZsBZ2%_=rYasKm9C z-A%8O{&cTMUhNKDJ*sjxJ+^ial{2K2`P+st9`oM+3yOEP?+iGgyxu-%>s+cfW}kIj`sXQ6irL3EYfRJha0?Ip=_Q}+UekV+^ALYr zeZ+aO%{cNOl*g9ezc?e(-q~@7{#IiWot+;^1%CDcIXD_o{qlBRTJe@m#5MKJ&&jPrJn90w(U4s)sDs|8|Tw|F(WIcUHMdaf3&z-!dzi zM^giJV)O!j**TKpPn9-%NBZ&c>ecM?vA6B4$q&?=*{67s{}LFLKpcG%1e<86O`bNi=U)Vtdqwp-)76er{9%%dXq(4U5wp7)RQ!GUF|YpGgP z!uczQ4D=>^4$1k*@Y7`U8D+QXw2=ln_woIPRm?$yqWHvaf3wT$!rIv9ZT?=MsXeRK zbKUxSlJU!ve<|j4L7ttf2LCViF=5}02Gh!@oGlzq?b z^UO87uPj&QDwCwtthNx%H<4BeW2j8Fb=5!EWalJ@MWYvwEKX7`Rvq|2?A$#v1EPm}eH zS_A0UKQB?!H5M1VoXyUgxs|$=Ue5STo>;gHZ^nCV!+%fEUL}vIm%p{3JS`j?{dgAl z%R8R??n%CWq5@%KO^U(E6w;NkG zj8vEY`Q17D?sYo6v;t?JpU>>p;#cZqZJ|;{JniCnBOO(G=fHg7Yc3Rdm>X#?v-N+4 zdEA^Nnl){O<9O%ncBv-eyr%aTx>y=>pULCRIekLyy?Haa=8CB*pz?qEX09FjT;nO~ z=B>GEWz}T<@N%Pd#b+p;NpkR}rUU8co8GSaUE&odpUKi!(!)K>jmIwP3YBN_Pl01p zkjYBw!moX6KJa*^D!rKOg0+;!@*%u8=6z%K_8kvQVWkaF;NfP@=|`fStC35?$*Q3 z$%V{~E5<4JWk1;;$Ap-h@!s4Pm44z~ku}X@+hQ<#1TBzjzfyG%^Pgu2@Y?xPF!!~G zek$W(P$m8cvlai0+fN}!@009xM!qLJGpMK;(7F)aKYoO+ zUMymESr*H<7a9?l6a6Djr{yk8B`HO@zw1FSYmTJ3`R{P-e;#JNYDZM;f6?6H-)5M# z-os@_uH}sRS-kF07ZaFaMy#zy2M4a<(@#FoxW0Xfantm#f3~;Fp1VWm3a?P3zHL)jfBRnX%l!CsKA!Yu zB)_;`%Um;k4rfj7!`bF-=E~gb05P6|8B_*t&@u`!CnCbL}SJfx0*pR1Nr|2(6o;QK+PhIORg+vm~NYu>_s9&A-jNVK>2R?Dnj=ME5 zo!+nbK=p61q?aZCTFDeV2BvYbr*8=uqS4Rw#OF;| z{%-U0jrc{vE%1R-cFQSu2)&U`_wA{#1r@X#re9?_gEh*AvlTaq-kS&bzdd_7_v*j6 zR-6CG?NBd#Z@wk)w#mnai$Kf3pV;H|z)>Q@O#Jdn<@C=#8+4+ETmumAH-cyFNQ2xT!27iv&LS+I@ zQ-JM@nL?&G@={?~hoX<6BPIQ)Nh`jk{EUf_&{-cG<=SH0y7S;-Il z3)}oyQcOwfOHd1pITL?q%Q1_ngBl zSHYom;81?!c)_E$m9+kPGt2@0M(LNPv-78Cx^{AuoJ|6!AaF0WV2N#Xuecq(Y^Cfm zb?Dy`JZXo*IZL#xsf+H5Adt12EVjxj@T|3#`xVFwLP!>>drldd*+tm#dJo# z0TjBfoC3D!c}8Dw-Q^k_Ovjf?qlOJ~xG?B==V=<8j`uZ~;KG9CF!;-4xSIp|UE?AC zOBp5rg%eFF`v<4T?^IPhQmw0BYthh?)kx|TYa=|x&OSJczV3Xg zfWZd#fIM@r;)%~s=$4n}(Teazz>6IQ&LyS1o+~|ERoL-OH~aj>bvA#V`L}*OE0Cq1 z#-Cbc_}ptN=U)MzZS+){l{kg!r1+T=ALDHU6#!y*Py4vPbx}KILA{riYao zJXQ7U@e5Cm?XAIM7<_DO1&^l)D;OI z0cL5O0a`Pw1Fze^06eJ`o6&go>ZFlWf7dn6zrF-jf1V8f^MxiAoys?JRij?ln%TG} z*O@MOttBwHCpCUmj!{Qcv`#9uj8CNLS9=P+kblEkMxB&I>qn3E+{vnJZhnW^!y0qd z8^>S*SLEy4X9@=D=T%P-_&YCL`HE1xJb%bD&R$Tntb2~d9Z9eZXO6G$3S{|woPU*A zpb>+A(Lp+8wT$=US+($NfwembSk2%Dgc<@SKe66D>uO2QtX#Vfx2UvM2^Q2UUCP8c zqe|85fdB7BeOEVgn*JL4jlrR9$K7DOuilGSbdKPm0mu3GdSwVYiz=jc<`q+JD*Vsb zvibypD>ClMsPN6#hE5`Id({l@C_HuVwDIOaRYu+Mr&A?>Ms?8;Lm^@KjhHAhsn<)0fjy9b=gul_1=it}e((}G#T zE3@^^WuL6wji0-{;@Im4==<%LWW{~ez;PP?>o2rnaVr*WGk)PS5^nTp&3=NG;9Il( zd4sh<-(ML5ozeiBDveIhsmohdH{o~nbKBdqQWUO*^0f^S{lV_b))KDIXjrJa)GC8- zDg1o}uFk$O2i37{o;GU7h8`eeMmF%|gS@@s7LA@Ox`rApInL-WJoMxax^T7+cPv<+ zo{o>_XnP!A3&JxJE-uqgE00sXc4jE7m5MK2)CT|MFBLbitnvIpTU~rPbz-EsE>D#7 z07q(K4hDB4IRhJdGtE*pu8?$gdoB_Ql)TFs}6RB9g-*{B&Wex79bG_V6 zd!l+;EvNJV_xH3fmR_WjJ=$>XR%=PlBy>KD_Fq*q(-a(T{&9tVv28Io%81bW`&}kE z+u-MN-Oi7ts_>v93)NpSyQuu;_VP2F|MFyL$r1|vUihhzbH#spQi+zLr3qR=9nXH1 z(Mu_*WCJQXV>*MYkT1^{z0Tm}dTy_I3O&&XIojKS`k@~++!&sQ+5f&t{N*>=ci%zq zHPo#>gSDJ<=xH8a;h;K`asKJ-@7wgAsJl9A%VByHc3a2Q&(GkJ zgngl^^%tu?x8Kt*crVF^P^XK#|NHYSYwD(MHjsg<9T`EDI%9V2cmNN4oY#i#gP!lf z^V2U1$H#wvtKe;L(29vxhiCV}xr1FA`Z2zb)AQ#-!n0MA<@2o$^Wubm8Jj|F3p^u9 zehxM5JU6rpM~uo(f466{}usMK8vQ{JB#$>87Cy&`i6HBURXV9eR7Y5_~AmD>l^BqJwv ze!0UKRHP8q{wITcV}7;AVg|o$+6)8#t_ohBN~jTDP^18l`c}n$@!xDp9Q0iko4c3# z)yO0F1`bXZ8{IPMQ?pfsq*WX^iY~?nFbC;^ilQ^#lUPr>wYOctJn*L_3nVy$U2El_;;Fv7+1dqbCX3!s;r-hS+TZ!i;Yf?DJMFs!YiWoJIA9jAQ)Af%mTc{iW|y_3-bLMvf=h6nqSV79wyi8uX%`7EXq~*uZEuh)p7PoR(g@AVEZp#@t}e@ZY1 zc%|0*9o6v2oX}MaJYwiP)Z_(1FVWEawC`X){d>LD;sI!L09&&D;)g=#Q^K`l;Fv)) zy6bbbWz0|pUr?Qk=3r<`JfC$5x9U_;|NG;UMok&uc{XYj8fFYUvib^KO?P>BQ;yL`P!zd-~KuezPXT~duj9QXiNO7jb@THq5gc0Ye~Y{6fcoScO69N zce=e}ltPblhzBBGzxZtMJyg*;K?HpT533=C%?!2HKkKgGXE8i%7VN}Y$XS7xF-Fb! z^Sr|UbH%Q&o$m$@7hS60iyCt767lTqF`eD*pJ$H3b2am7T#Lf>l6Yw&!;2c=-4?t* zee}{yEqjOh(2iS0)tXtC)l58l#JfYoBz&gMHt%QgEl6;|=<~PLtjt{5OD8-879RT3 zx{CDk?v|=(jcC2-RcZdE@9zx%i17K8>tzj295jU&pBbrgH;(2j?N2y>1%}|@j*Fhs z$5hIRI^w6%tv)Ywj>T7W>Cu1kpkZyf+o^K05BhF;Yu#|j5UFK8z28IpYShIu{$>AC z1>c-b_be{!Y@og@XaarWW+_#9dLaVuCFm6rPYd_Pl<00ojJ*mEys~~={+wF6aR7XO z%My-^%n12`I~^LuB`06%1~maUG1`Z*2cG6W^bJO%mZ-DkzS zP{@TSY56R?SMN{pI*fBeudDxV&9;ygXsnHvek+*^JX-p)KA!X!+l6`ILUxLxUHFTYU^G%`^#Ir`GKx3-!R@2%CSnz0Q`IQ%n5~Ex= zf*z$a{1kY}dEq_c9RuspPvMimyAn?h?@C%`^tiZ!q>jT?XYu0|ybpM!W8fbYHgT_v zvt^L+yCFYwbjMg0t_t6f4tQp$MoStKycP?7fku`=vYznvfU)iA=(nHQ%`ukxMm;3x zP54qZC1-#yJ%EtuDDWIcRw22MsRs9wgozd>thm9oNGH7X|A@&4T3|5Ok{SxdxuZ?(e`eFOj1g*%;_zSOV&x4?pz#DW$0oqAYYgj)P}3to^hiPr5e zNOH|>XI*oMjw|dNFTB(czKDJ(8d)+(Eja=9NA2&|f%BB>XUN$@&(zR|3_UIx1orS( z2A5aDlOC<9gSAXGrvF@k)<3&#Rml_W;uEEc;9UkjAB^XnN-N2VlJm@P<}P&r*>6MP zFs^z6ZW!>Uw0)txn$pp;F(O7cE}Zqm~0ve%E%zzA*3nCjAH;JSP> zFL)Y+LybiI`B9b!!OqG-w0lmM*T>>#eJjt z^4-VN4eYlow}Pft(m$&FTAiS^E%?F)vSfl!fV^U(Xgu|)bU|L(sT_&tDm4VWSI@5e z4j(NWEm>2K#j`~QjhbDlyI=l7q6@&MX{}!)0-tfrO8jmB*R9m8<#n5>zo;H~KWw9n zA8O~sX`KJleALQqm!^le2p{zl`q?!j^W7y?>Axik8J~enkEF*7Ujv`k;IZhlW9g5y z?C>-{t4QzT3Vcs{OdiI6xL1TGzGeK=Dn=daIzW6gaD-V_-oGyCQJ3<%JcY{B7dlXD zwEE5?4X<8F9RXuSqv-!`<$*u>Rj@-aLzNu3nG53ikidTpUT5KVy81ElQ1sM~!1|`p z8gUjfHHK$pVZAjpmGn_PWcfS`Ij5GK7`Vd7_Y81WqjK#B8oE)-wV|GnX}9A(w?~UU zp-<(yX!x6q&qM9_FlH`rZD-Zz4a2y1&{Bn5L_tfKvui{t^jtzNp(T$Kp9UGU-ZrkD z@BtoiVG}TXorU~SV+~bo!d;D8v4jT-mO<~*UvFNkZ;{nSw{qL*1?bhCUeHhN)z(pS z6#OI1XY}Atr59*$QSHBS1Y=zl@>9ZG0f|rbzeadt19XRQWcaQM9t6P;VwoF}90ggO z6?J2qvuDQ|!lCr{94B1d;*T`E>jrgzHMG9_u7ZEORXtojllS+ULvD_bl<>Wj%XeN@ zd7_SKxkcCgxd?&h^MOTOz^iW?;)VZ~xe1={69ugSZBkuwUK@Fz^Oq+R)r6woG`xNA z-AXJyELYRv;-?E1P|At@tnxq5?yrkUrlbT{3q{t4Py9~Jt?Q>QysvMH{t;nzzIFKRgCxwa=>2o65WFGD2X*1wpQNXvrgmcHcsN1l z8b9isaeVodP4doz(#Nqcs>8G1dUV85SH_2|UmY5ho#*z-Fa5=OTKTg&RAe3(xmC=S zw}&*y#+STpHFeWXW58Tr_?lZaG7(o^3ogrTe!E06cLEFpSIpGFMwcg+a_*fKIFcBWsCHiz~IrP~lRb}B2 zIje^7O6k$}GR9l+rI*ms^9q{&wac4_9>E$I=xz5kd@ba9Q)q!MZo~6nnQwt70ew_O zd_POp5qi-%qe~c}X0+fg@;pLTse$K&j7|OY$6v_Wj==k`E!xE)nLRKipD8@oaU0JYh8JQz8W|%Qv)~8(obrtM6wxwDW?h6E zU{=GW>EW%C%sWV?0KZ>@H*xM2IW)31Xe&!4t!hW&8KO>ke4adNS-VcES@|nY$s~k# z&e&SXl#E$8I`$r(Ne%LPJBV7uMTve@$j;%_7L-{UMo(t(fhA)#ALpmkE+ZBE7Q%gs z&NeZdLCB7gG3-~}Kjl@TNiyHHXZXoV^dvZk0S;#%6C!wJ4R+P|p>h;^p^#G=yMiza z@?;#1n3U{OBqK}%zn#wmV<0SsjE_u+9F z$X<~xUs9OoQt&y|(16AaKa5cybYk~0)IodrUUN0_Q-#b1TC@y2iqR~7JZ4vr@5YD* zg|;vy^HRuK2zfqi!@%hSy>S zjIY6%qjK!35kaV5jf`ABXx2qzw!{*R{ZHHOmgq&n`T@P>%iIlNh5@rRjTCY|C)UWN z$-$|q@DFzq?;5>R`~(BKlaMd!wfUYi{AQQ$EjdQnkv|dijfJ(649NmV0-vrcb66S} z1FoA$z)q`5@9FR}Z)$i&`tzt<8oiZ~l`8pJcz6ogrj0$eFcYE0*OZwcoGm5&4!s)p z7->W%Pvg-MjTjz)zHQt^&892iv3vF$(BKw~dQtGj`1SN$;EOpOG8=%|0`V{;lQvew z*Tl@}<7b)G(4u<>B+g*)2$K7PZ$W2| zgh&=*6q{R%ke$Gr9!=9e&0?9QLyp6;2hhM;bT7EGj=f%2A-8Ab7<%5r4I25Wg)Gk! zO@&;P(c>Av@Bb?M?x-rVZ%sf@L{!9tAm)Ua6HsTDIp>_(tYFRw6>UIJFel8IbIx+> z>@s1_Ip>@eZQHg@^X>b7@6D_=f6SU*tCvm7y|?PrK6`)ZR%vJ^2KEAU_RJdnpO3`9 zl)RXN{s;{%%D{f2#qG~1te-POCE5@8I76qF+zB-ZI&BqpyRFOAX+hAwN!A&A2R>h6 z$qpLG94O&Ck^zB^0ABvo=^4Pc5s%w}^{{}?9pa53qbGRN68;8!M#vaA(7zNkXHuQB ziszM*?A4nw4`t6mBfF@fU5GYK;zxq(i&u)z3$jHw-xSr8z`>juIbd$ezrvGRgv{i! zX$QsEA^2OWc7T_{`H8+t@L$!YwOX*U`EQA)1itLd1)$f7_Ctv~mvUghG=&_bAs(Y- zVbF&)jt%*wT0Cupqq@FZg)8XU4Dx?J)$IuVlS>|KKKcRhVh;JMJd z&nn?B$n`k;IcmXzzla{Qli&$za3}-UMzShOunX#nfMHoY?PrB^vgrAe6T{qwc9@@# zg$skerjgkZoNr@x7?L4qS~1lS9UuH(K|dkUY$RXMp-B&o*D&-O>7~L`74i_4WEv)S zIH-Ylp%Yvt@v-0SyF^=C%@SQ-vOzX*HnI}w7~U<#wfU?tvkACBdH7DY9Cb~ZHD=BE znRTb%lL;-v>D9tJR`5fSp*h0hP33Qx z&8g#nkBeSF$cWI8E6oXdp|zK46XuxmdudtXQKJWAtusn)O|m~SAJ89gZaBx59AyXfiOjXX@Oq3ZlIuO<5N zo5^Q2>P0vo%Ph;D!Jj2>2)v4H+8B*%sKBS4Gag)8fq#mQsfELc_6m&|=U+zsik(f@ zW9N!DYDs=X@}iOj5)A}AL&0x!W(sSb7>=x5Ph?3$B}YQiBSkxjja-I)Qck@p`#~e8 zVc~UpZonkT8B^u;>(!d1B>25&t@(u)>A_>>h(>HdV^ZMz;xAf_S|^ZrkfJ3a^DMp} zuH{!JFGa5v+#q`n`tMFIxCwg{S`#wO92}9$0bNj`KDg!VbI!~o>KyC15xiubLLM7@ z;a-^N)5vycndO3c#J|`uY9ID?JreyN*9H3h8}Vise1?2(j|AU;FN+zNg{&tTv)4hVcFIM0-021Ww+c1R{n0dMNf zzsHCcg_<3v@V+{>*n5R}sWJO4U{8X#pe3XHA!IU1&h9|-eekpkvFJb0O3?%JYv3IN z`Ba7cBrKe)5quDR+|!+;FN%f-Ut4g5;BSr3P`75hGh)tecWQ3% zTbx=xv|5FH3UvQ1PL1}pdlli$gXAyK3 ztc8O{;MrA@b&+)y{)+w!FXpVq@gZxy4bN{nq>w3q|Ct`RvWLtpjXDrsgiOP8(Y$Q* zF)jK)u}Kps=-^ClSg;(|iw`8*^@vhcH&SZ0d778srk>aP@Eh-{=8S<^tm6&ITz0E5 zovT}pYcFxNL;XI}^i0L=hdW-Md8og+ef=jYy3N3| zevoL1^rGa^?wv9zOogf5W$OfT@rX)Y=GfD6BVV>nhmxF7&&D7Rv;KuaUd#@DpdBZR2uy1a2#qU^s zk9^I=dt!OWfLGja;zbqGIUX)5 zz4=llKAXgx?$<2(JI`c}&VG>mKaRIkf9}OSIRa?)k!PGK^H=M0&3ky?=IY7M_f%xb z1B!d~gDd3y)0{B66c-(iY_ev?TJiSiRr;?sDO~PxE1EVa8-1+(1lMLgU#z`JrBwTd z@0x$7qFu|_6SFz=i!FC4u~Qh0ts2Lk-!qVL_b_E^|5abCUDEt>=M4^-sVUNZ2(|RA z#b!`_o$JhQ>#sGn?ZC(Y)910j-5^UFRe4Qbd-S+a^Xli^szm1v6tNY2FvAl1a{mKQ zSQf>VGGtI~_m?wgKYFS&KP{kfZWPfay?Ia#62rvmAT?p?soG%?JPG}FEuSTZ);u1cZ2r$IbCJRl%{gupFz*B`f<>~ zth{maFFyYAD%-m%n}uKZSE0TCq^h)U+?3ba%!o1Ib^fiQZX;Z6!SNO z;{G8WzFi&ezS_z&b|uv+%8uAyo%Q(RDY|3sIn@140~70KZ934wF1uj^Ppj9SDDo)}?Eo z=5gY`m-u%0OR~mHS4Do-W&f7pgxXQ)N#=LA71VbB4t78CH<$JDF-M#|t(Ln?;(Fh| z>9JMaP1KipVoPEBQ$Kj^wcTtw@ldxroyj~I*ITtuyQ3Q%JgL!NxNpI}j6P;I8B~R; zM0HdBE7i6iymd2U6I|`M;RUdFuE;f~$0I`cQEDwipU7omugG<_su!;*`;h0aMt=9I z9~EzSP903Xs*SrfZ0r}Tvx}MV;%}prcP_iVUlR7f5B32kOI^~`9x?s^;hfC4S5dre zo(tVt8B1#??J@G6SRZ<-Qw|fo#O~Z{A&owLR7LH+NB`_yL{kUPqlV98%=xWXs!f?A zsKu8TVd0H7TkpPh(&gvYv#}p^GfkX!E}hOgFPn+K*Z2;o*9)tRUgp!T*VV?#h3qcxn$hE;o0Zq|bu>M{ zhn>gI!u=sLt6Z}@%(T3-=u+PI`fSBEc-D@q`K0l8O7ROa&v%&06T8(hm%m-Ff9~=z z+plV7?kYQrf8XqEPTbytVwR4g!TO6KJ?+=1QMA5LJsQ>L9=qMRK|g!CD~}>w_)DMc zcztnuRGt=$nZvCD@|g!mxtm9?jlu7BHi|U9f;s789%_10)qfF3qpN$_=nYnh&Lxal z8CTMVh2CV3p3EIjde{Yyt(5)Yc(0JTFLIz!shiuuW0lfm970~ zx)#;UNXzSEqCR-fgJ{|tHQ)M{JBHEkbbOI{6ux-BW6{d>eDK&Tg}uxR@7?6ulM7QP zxAJP`jk+}cc&Lr_;&~YYu!sBckE!hlpQnyZ8px;z`;QOT)W`GbmG`AOvLEgF`=_c_ zj(rsIV;S%7UD=Gik(ryu%+__fzTlqMUrLYTOoQ($S%1{Gy>8J=^<=WInfrbgRrOsi zd&+?VX3KN)Ow=r4Ci92K-*w>ouWEaAA?mw%nwnD!&)6H1jy;Dyr8Z}>Xt};29 zRkp)YGM7*1+j~Y(r(9Y2WtOAr;+JIf2j=q^UNCwC-MYJja?OgTGMwJ@{5~1Iyp!M_ zvqHQ1?6T9##EhgB$pMtVgtxjp0ng4kR**ZKN&rrKPOF+s6t1xL?6EKC!wF|*5f_wu_q4*=HcCKyYZ`n`R!eQ zMG`OX$lkGGx<`|pYSjL|JpYqJPre$*d-^KAIko}+q(-z3`r!IQ5BPnD+6sM{`(3`P zq{m_AJAf}ue*c^&A6mz+CQef5#Vm6c=g7c7eE--f#vD+XbLwkaL*=~wemyv8)@7RA zKLN92Azh!jNf+u~iGDR(r|wN%#yEElu3wL8ji`^_kfKmu^yBsuD*t6$SWf>#JUxFr z32q9!9UB&Q>bd&eBZj&s_Mjg@L+r!83y9xG*n!LY)A@XV(cSl+T%~kt;P7bf+hDDM z`73?Nd=@fMYS!!+u}tN;mxySw zi-AcrK9h!=$Ft*7uR5QPA${eE)R-JEy1hhZh3ch%UBYUHduwtsL= zbJ53&_VI>nU0pL3xF;KTd3Ql=={UeScjh?2ukY`pSs4qet}R=V1YPmU&Bcj#ni z&}(;60X2c|-Y!YGSAQj37tGvB=#@{LzYDBpNnh%-a3>GU|3tn1qamXwQ-S1gY8;!x zoV7lT?*@gKhj(n(HJ7?`58rgQ@0?7)ukX0}&Am=M_{mX}hXmeJ;3SkZt0krX;YFx< zYHZi!ZrRh@o1e|mz|{;4rbnD@NQ3L-;X>W_sAq?5lJ{7VyhNqj9!J2js&;5@73uzw zf%VL{gNic#4!j_PUB~AS{dUk=4ZO~&jgd8&c3e4Hw&pUK=2Fbabp)Jcqfdn$341|D zyC#D(jMkC&^4s`3-eH|nGG}h|9>kapRHgJ)6@9dVsOfz$ z|5$N~CUrTO(tN-U4rx7IVQ%a57kcX{mBvGtI;yLrk4q7}2rfoT-*4541*c*j?RAt~ zaD}H1&S7K5s;LDMNPWnwF^fq!ORveDROXI9mDj)S{Hp$701=xzQy z42~vPTEES|h`^C}>GFaM{9uFAaqiLqCa#yB4&J+T`AQC5HQ(90^SNH(h{A(;ZAc0G z*`%z59&ci{>tVwj+xWh(<2IhklCuiEA+tpc;?x) zOO!FL8qaE98oj{XM$e^ylD=w2J~so+} zY@z1$xE7;0@11yha($TsHspYkb2RFQySi*<;8bqY<`lagjWVyDx#Qdig2M*ijmO5{)O46$|Y99Tg0)g+FE!N$U z&TGqH~t^9LO3ojUVJHbeG(_cwTEOL7JVUIrH(M_vp3u`bp0>LoeZ ztMYC>wcrSW-_wV{xoXy*KlOxLbE%w8rv}d}s$6zXp`a{zDQC(}eo%a;{vP>5H?EjK z(b=nUw%W0LweJYZl4&U8cM1FybzOtNA6e#w@a}B`PiSN1Tm?=?J-7P_reo|uscqVH z;FbaWhnr}4*{2Kqt9~^r#!c$}i{4y}fhDoevYX(mrqm_s8=CQ2?lt+Ymg9XktURIj zSisfB<%h(fe#23_s|lE$qkA;sjg?n{OJ>)DHcVv99*zBP^p3x-+V&|z=*@)L#=tpB zW~dx5&P`$d=`zT5j~!D%H4iMJc9r!p@O~uRCjLh|!N*kWa86k}s^1yUsC?d40jB}C zT&K=c`#?|dkv$BIdO?H3EAUD6@?Z%2JYF0MtU$p3?0xAN-Fp|WJDrHNw&l|)(z~$^ zdi&!wR2MiiaKIMy}HvM_^k|ajIU>9|az>|bWD8YN-T{D`%0!|GBn1X@rwdf1b zh;(GDA7t%OEHeZ6m~kvBHX%lx{uV^hM|TOf)7=vvLvKp9us5o-jf&N7J0|ny*bTccS@R8TIv453kA<74|Cqa>Q`Ev<|hCt{!yvKh#B{aBiKvyAfE~7z~Yn&@;Jv5=G zv?rw=aOxxmmzG{2m_a`)T$E)Wq`%gJus?L3Q>A&(lbxuS8GP$*IcitEj}uE}pRiSQ z!!T;$&W*ke*T7mlyT2zL92LjF?*{s>y7$fl{bcF>5oIb6dNI!Bm@b^UM5p*|q?ZTx zv*7bA+zYzr0TvxWxV<(%OC9Rmt4CAW3y})=Nf!(Gq(_w5rG)c?hgjfJ4(JoYlR0=( z869%}1RwgX)!o~hpchSGU=n?JM_J(pboAOcIXbTvg(N zO>Ze+a!1Q^IT(179l>!7Y)!zO1nr474Q`^LLjlJJ$?W01HGb=#xL4qN9ZcX66lJ>F zz~ktP>#SzcSr9KqxdG;7{E1$Cc)>J+)@6U~?W56uNHjlSSAssIFShqo(vO4>w>Y0$G-r~!!MTEec$(;~{KnqN z`}ZAILmve*G-47?jyb5%OBsFC>N{kl^gXq%OCOut(MUp{;=HdBLp%unbV8ofxNpK55~8nsSWKQB&AP8^ z7=ieHj)}cA4)e`Z7aNwSPH)0@8?$7x%6}-cvCvbCN+49plkbHG%t`DPX+ z6q-T%N>4$b?WCc>)A~bQxzVN02NY&JwgZ)N}BBnBpNa=LQm zA6n=+1l>%X=)8b;Kb$CBSnWMiNW3o#^N!zN$jFhcqI6);OpTd}d!>HY@XDZpXQ9M@ zTYwYCvgmjJ?9D@Tq8nqMYaF+Q`cS}R`gy!Jbc%;s{HQ0B=U9RdalQG$D3hz@=xv~P z(N{lrXiPhlXbI4NgbNAIGtf8mx9OdsE4!JZV?#SugX=5`6HP8{-D&t<`Anl_1`@v6 ze$@q)+v9;2d(GPetrZ_p7i`)A{bGyEL>A5`we;5-+(SOt-3;yhTXopG$%z+lq-7&; zD#pLM!4L*6UZh@s>*2)Z;x9gLIFbZ!r3XJ8lMd`_(udx~dU^XSmg=~`+V`$T);+_(afuX%D(oeIv;(<5S;)# z-Pry(qZSPUx~@X+U|>PyhJF%ofUdA^74Vb+{+OMh-4U=PcZ|r#_j>jauSrkL7Dj_A z9B^RY(c6pDob^*IWEimY2kH6Ht(v0mAp6nZQv?6#G1W5A!Wn0^_>nSi#P36|WUO}z z=8KiKt|2&8F`FV=haJB0TW8I8RzU|~_(%Fcj${M+0{EhbS$9}Xr;aUn2wo)3c+$@S z??MTN3J5=hnO}zCktyiD_P*A))sks-6}T%w?{a!D;J7Rr7c?311!XU*7GHW3c)cb5 z3f6-~9|P7C%~(G>Y%)AC`AiL;Q8Z`K25DYjH+ZFK1ieQ~uM@2eI=X`YpoAw4+&IZV zZ`Ze`uTk*&WPfXTV8)qC@AR~P8d0xpNen$gqYrCfY7I=LglB`>LRW04g_8o8LsR~x zR*rn2F^3uNtFGU#!i&eeQLDR6(8B+xA(brW{ydfQvW|Cbwqs*f0|{H106F`FVZ+SOaLJ@xW(>cuU~M27L4? zO7uVYfbbK#Xn5c{XG(hlHo;7d6)vD&E%>gw^h^@`ni5idyZE%a&6ydh_T<%4Q-Whi zbUJuC1RYDoH|ixkKs070xC47l!SiG2gnGH!6AF!+g|9+e0Zva)p8_(At_Qy8YCQ`{ zM^Xn^b8Bwf^-B2QDtg20_mUNQRsy&8Ms~chU5wi><83tWzoE?Lrv@JCKm%) z)*0TNmOZ#PDi?TU415TGExjDxG4xdr?pU=4>Z+@?>)Zy>epvKY(Z}G6DI6dAGw!we zW0}5`7vC{OMne2uWE~9g@xeWHIXzKhFWH!#8o2|7HPQQ8cVx^Lr^W)G&cfR185O>2 zmnoNcfkzU(xRT_&CaurTR=_*5|22GE(U5d-{S%@AIQ?eeFaMO!&hT?#SUNw^prX1`9BoAN4gW4O3=Fr9|N#mAm!u6|IhLp1Q`Ud0n?~6@quIQIjlws%W<0z*_vEvq^;B zx=af;05{O!mO5mnN`aP(J-?HN1a?-aHPKyI_;xm{i+;6WoU;d1Ub9pIn`6!{vVaW* z&x%*Ak>lW|8@kJE*3cyM=1Y4RxeJ+Lq8F$aS8|%*#-g_o<|RQJ$M-~93chrRCf_W2 z2K88KJD`(UGY4eSZ<9tU_)zSJX9gn2;y{K$d!RkqQ*S8ovyd?$@Ea$8FEnxvIH$4}oF1c?g7GduTR@FvuQ-$jx zoK3g|JV|e^+H*Jw&IDG&?|6aR6(*@$Tyw$fqGvlb4ygxV8_`;w$1S?~?eIQ^?ClXX zec;nKVZjJK<<|=ip=lcrh5?5P7UXSDritbt-lKuFW@y@yUs2FG^^?#^szzdvWM33` zK5_|}sl@j~)+yZYLU=i5U6>hkQj0bQ%JXKw}jSqBAH|O~P zqm%HgVRM!PtKC%aQZ+O}g7#~@{`T0ZOXB(|%nbC+OFDRPw8orM*jvt?nYg)*N@&nU z!M|bgRkp7mM!-)d@+M!Z^Rt~Lu_`KwK@J#iq7Ia(%KB#Y`%@)r_i(Ub)Yk^M-&riWQGUlM1gKm8` zn+?oI(7aW{iMd4&P`FMC+MxzkHE|po901;}2l!V4ygseEP$!Lyg78N0tz`6~vKo4T za9QU}296OOLVOv_;e{G~#UXrKa!JryIcDkKG9M*7!%|z&nJn?2L`#YIkx$8t5I#Hj z?`ia^{s$^wTZw*c1Rt2Dq$Wh82kw&$lK4D~%n|Zdsm7mECKL2o1Nkm{Z0sLUb?xy9pZJA2J-lM#%-OH2hOTa20ADwIAo? zS`e4R}q%JCRkHA6MDM||C*2+Q_!Nc>+iX` z?%}4QLCbtIprtX+O`~t>38S}=U@gfTNuRyy-$%o%=9z!jp>NagDfhl3vPepdr^tM^z&U+$#N0$N=`o-9<9!h^(TYZ0Ppuu z;A$E;kKm;#c*Z(+>;76eJG^d3(QTH2IVO9=QDRFaPAHTG*{s&0J%qu#0WQ2G9050%M;82PjVuz~+x1?r8GcKPR}G8|&ftJ9@6X61XlQ!mx9_sHM`uv7 zx8&N&{=w%lFd$+Omyt_B z@13PYtA(cT5InTGz+v%wG_*;Fc)lM3v%}wOY)#yLNqly}dX{LK;&CIhpg*6DW^h$P z-b5pRpfD>LGu1?H4VqvGd@WxB=T)NHbXk_lqBTNSBGEk2mqkZGzVbNq?F{AewH zj9@L`KrQ_|c+)ocSMR8mqY8RYAT-?&je1wWU8?qy7zNE-L$f4sFg}&pQ+ToX*BTlw z9SeD6$eem|Js&OlxLfoN4NV0e|3}^8xSEtxg=jWPqY_@T&OaKx~2{3szwOa0+m z@KU#Fn6oj)-cQ4XTgkCFB%23KME0tq_3VGa^=iU*>EOgw1x6*2F}GIhxW{na5pne=SoqF662^Gj+L`jBvbXi`Jf$t%MZ^hJ`aBYF-?jR@|8 zr-8mZ8yU|XsJDBJy3tuL90XoorQnsR=iguI7VG{H??WR4A(+d8PpqL~5N4{ze$=8x zz~2XFeXRz4oypLkB~!uh5f$`Q%8?;lzvz5Xm)%f;p=ByufAFfu!nKrW5uXC4OMb(t z{U1B*uAogz=E_8tL1SK7@Pb)zII_EfZ4BfY2{;iNd4LHIQ^WsM@FC4&KC2Ww5!Jg& zLl*4-`DNLExNnpzf!kZ2g>Gti0OFw;vTxl+eiU!hf^G^Q`Is(oXbwyMQ|du7kI?nB z{ES&o*cS$Ju5w*DUD!cRs!!YPF!V4k>R%7Uu2Dk~bL$wLIDgg(gUmoBy-X7q~yPS9rvtEHW5^$Bi zQnQF9>mXSL(e;pLKrVa-&l~?$B{xs9poJiJF`Cs1A6xu)U;>#_2J}kmv#>mH?mW>y zEZIxIrF!his*-gRja%|B&J3cpN9&s(@#XnQFJPrXqVZ^WD7<-odIMe{vK!@{c?jex zp|M>8Ppc*wNaTSh61*@aS&;iV+Dgyk?nYbD!nNp&=wZ&hO#U3(NHBue^J4mRfw2m; zN1{VXeZjXD%qaX&d}u?sSa_pg;g4GK$b#9BLnh1^C$7aBY02LT=Z%^+Jq3J<;H8lq zztjnOKKE!+UV&Rn=0X7*Ynip8^CO!;f}=Y3^0UBGLZK(CA3+}_{~-OIQUA`*$bK#i z_;j#vFfRSH13}kyz_WF7%w`>~Daqo9HkH%Ax{}_7JhkK;3HrYS`;wn->!H9O!+4%RP)^||va;~9n9W(R_kLW&fzzDCZzUfDW_Z%^J zn4jza`MdrReIvtrbsgS!Y|#gY7HJRa^Rpk|M}V1&CA8NxtE(ub>DO)qCNaP3f1zh;Z@Bm z-~aWx8pDQlAM-yi3#<^}{5)%iXiOuZu7K%hS`>&C}H{=Kt%%8+*AO^6*U; z{V*Lqyqd4+rT(8Ep2s)0S5B|&{@FaE{e1uTQ55iXDf!vO`Oo_3Y5Kt7bp}$Nr6&mpcLA-rTu;*2MPrGz5V~+ z=X;;$dps3h9cVDS^^>wSX@3fl$cD2aSL)D1nJmP&Is- z$v>V8hh?RNSCayfh^mBrAkT?G?^qUMVz z9DZ@447{2w8KntU1r5DRqE8R;A@ErU`!LgjFCan$0*VAqmBtYY$ePN9be|C9O+HJi zFCqs-AH+xr$_B6LQjF_~1Qbk?z(GC)v@$esg?^w$S4B<{yjF|MN4Z0nDWVjSL`;Li zOBjP-NZ^hR5&{MCxt{zO&~0Bq8d`fP>D89Y*b#=nNFgI=NStPbN-_|Xcq76`WFKV1ls$7UASFIQiUcJYd=*vO-WFNn zI7JQl3{jPvy1--^o%=8VEhIpIgrK!$7nmC`6pT((6pS;BiC4r(7~~mRC?xB=Dp?=c z6NCgRMuhVT3jP3};FG}MZpLkRJr$_r+@P$;N{cq7}K{XQbff1aK6LmSr$sr>ka9&qWC?EwS zO;LTkqQb=JV2a}XLrVzO5Ms|ov{2LHT|z*J@Vo$-(L#_$DFVwCkTAI%#7YVqn3|?N zdqNy12u3LA3vfIpprpr~5P`ae!w?@m3>|Nr+`20uNI^LaBczz>6bKnUi4TW-0W};6 z>0u6R3R(B=QVpHcAU3=T%M}a@0UwlK_rZednyiVsz$tXgELO8~80UsCE^l&(!@~UnfSg3>*J%UT0 zD!_sU1?xJ~jLW*tMTC$n$(&9P?25=im|si><`lLzz{93QpvEd6HViHT9`M$IT|qvi ziV;JGNtaBE46TLjg2^y+O$%@`xY~4kTM+Z7hcq}GO_+#uDX_4HsQbc#5{Lv;T?cjd zI3l57gp2-}GA058@K+I^EJ3d2kSOY!6w$(>b#IFyYKEZ0K4|iUgMpyQT`riC05621 zMT?+WTktC0gC+2Bd=M0cMNFeG@p5Az#A&J$kyZU5w=1N;1DGC0GhkxiiWHx0Krys1 zr-wt54lY<*MtLb1f+bgAx?q=r3g%ByBRmvS7A5+8Mh}F&i}!>K1x`wZcTq(cOgIXz$qX{k45OBqaz9Wgunnw%0cJDAx(qNd~FwGn2*3q`2wcv4F&^1 z7lGc0Tm*g;{*Tj|Tx}6(i3DeF#spI@bs-dkq=aC`B6uMvaS{GL*RDWV^;BnzK&>9wdEB!MFCMxScdx!1`YUteTQJJ`_~Bro{_`k|DzAMSPlsh$U!110eCxE(yIwG!e6E+iDjDS(v;WZdk(@ z!y(u$8HU2pG3!#mfCR^`mgfecUKkF<6!NXellM}(yrxcty#@z$y=xcL7WN%}LI}cS z2Von0QUFT{B?8|k2I0!Zri2U8f~E%)vaH;L_&yj0SyFUoizX;?ND~9R2zxqpjZ2qc zL&Xre(bk3Tpx{_s@CqWQAberiwzWlp#gz~dVlKQ-*YF}@AAX{?5fKS^q;N2ym$+nA z0AqFHw?Rr&m`B-w`ht)EmPed?{R0D$2rnS=mtoH_SHWNiT;!uq)kGo+^#4GyY0u)I zqKg3|2wg@51FJ1gJ{bhFalva~bHq@a7Iz_l4+ny<_-Yt&U(mqpv$t1R0(#W%K;$kd z_az#+prp%?2_GLlmVrdbmvFEsP<_}8NTt5OH4xAOSl>WsF$zebfIwXqy!~~sI#|K+ z+U84KA>If>At&DUzT`q|2yY&yw|k&(S|kXUH+je*BQ_GFQ+7y$LGEFe8juNuUI7Rd zALc`W2#iCEIfX_LlCKHmHHH$VZim@5d?5)oT~HBZ3JY#;gNF|(h*m;MK$%$Nz#2*l zAK*NS8F(vj8rDN~@SrLrlAq$K;N$~!FnceMEeBdn@|?tQ|JiI<7Xu^65@1U1!p31Y-)yyQ$& zG-B0kVHFcGD+7E*O{88&U@&3NITX5Of-Mxedv(8d|~dYYzZ&E2u%l*KJBvg=FA zR3cKpXP4Hwf35$LbBudm-`cTvPhx57rF~alxbeP?cdWnhlGL(mpUvEUMdoL3{N;=H z>>cfDbAR=L@8lj#wSV*Rs|(%NulwFJ*Ny%B&24wTbmP_@|K*Rpc8eQWDC|buSXukd z%#U^>o|#Eel{7_HGE^C02EYQa0%ihc0T_S{P!6a7*a4LQ0;mEw0M!5%FdI+)Iparl1&x9Ce7)?XXEr2^%>IXVm^H6Vh*>WoK(wa-2I=CyyuzP_h$9fc9yomZm>iu zKxDKhw${@d8(b0_q^k~HGZY=}=^ykg8C84yeB>s9US(oT(K&;)PaZn186lA@9%5(EM3*JBvy%gu@$T0 z1HG}nAx~#?*u2p>7>_NB_bvAf_V@Q5ZMNuJGB`Xi6kF;Uj4qA$dxn5vWp8|FC^lG& z$G!2DE77HAsNb`cUe$(fR>n+LFN-dr&!C3sebiFHO}Sz{vDML`e(SGytc(qU+EVu} zv|H7;G&Z<=upi$TbZjWzXWPA(;K5J~BkN!0i7p3qE9c_Q(!u_|m>X%XITVZac$W6}53Z!|sT+v);i@I>{{m%MV4)Yfz)h$* zwcuoW!qXd#_bnTY_QtH=qfc2J?TN=QoY<1CzW$#6<-=C*-42t4a%;3My0Xi&GCmZe zN#np^e|K!j5W4r?-?pT`w|Avyw(Qi#_(GQECTg zpWrO_Pk3m~68~D`?r*jA{3deVw_DC|EPQMpHN`DHKWMw>kma$!!lBsO*k)VJ0DYn3 zl;u~YPkL2$eOaF2IBkZb?j_3dv&|sTw2znBYA<7YYTHXv`iSLF$GA!grD~g2I7-qexFC#mw)Lkh8G>ZT zmw2GM(A;5k2Jtf$)$2PfT1&cOOHNoxZ{()6VLr5AXmGgWY>Jxg?W^?eT@vku=0lU> zF_R^@7>YwpJp(<_VN;n0`cHtuboZao^n-y<3%IEVgH5aK7JPeu=)K%gG6D1=hiL(b zb+zk5?O^F+KSOS>q-($PUzXe1AJYFZf=g1|f2i-U6kEYK$4@;wFA?sKs5{R58uw7m z*S=QWdTFO~Q*+b7D+jw5?Yr;{u3Ji8PqkPty!qg|P5zk=8GCLO53+Tg%&C8v8+r9X zQ_3K>@9rwAy=D7Hj{S#UqIbMh1_PVYw|aW@oT}$M$-GDQjOMcGWJb>vJo1Qj=Aq3Q z&66F~b8;a$rhB#|3yEaLQ%LBZ0XZjUvbnUJ^7JNC$%334_pIDpl(jaGobhCHBXTCW z4R2*L9!=Mhs$9@DPa*5UPJT|$=aZQcPritbGjgGrLnnnqPL~ULzb8t6h1;Z$d(wJZ z0a01QI!fhjC;4xpxV)Yl)AJrBTS$0hT6CpBW;W-cZyAz3`Q%6@X#fu>SF@QyE~ymh zdP^Z|9oSRQ<@Ef#Cp(65q*9)A68N(jzo!c$*0+L)LNc#gPZ&t)h$(aVL~_(4=X6gp zlP~0o^rkM5hf$9dlbT63urHfh9BO zX~FeeF$1y+@+LjwQO2!1m0ReO{GOpiE?XQ)coG@{*=vA1!>`KOE~^h_2LA^X1qK^v0CQy_dvuDC7! ziuVb6S^VWMKVDXc86O2NlJrfD=)|LE@K>cf>mY1}teQ<(C!;4Yd0nSny?r$hL48z~ z7Y^W!Md^GDq#FH>C8J62)PM_Wwn(qEqoJ1E(fb2E zQ5Vmc`jIS5TryGawdm(I)!XyQd|T!B?6NkNow$|CH~q0q*5px0l&N&%{+U+q=~SDo zK;;%3Z#SUKu~v^f3cku}LXUm71-~$2Fl}+)rsv*t=9RQvvpueGLy-US%VA4g-vC5IV`DhIlP~>eRJa5(R(HFBzEVzm29wc6$&;iN`(w7N?>phjMKf1i<-qte`E>XGK|72^I(nxiKOp}{ zX6H=$T>38W-U*$7);@T;N0oChAK7A|bE(xnjQ%>-TIuDK9J<xgw=#Be!**!P}jW>Ez@Nscd2ZDKEF&*zJ2 zIlFK1o7GdzRNJ3sc$uAZt!FKpZ*{eKwj`1%U3g`teM>gCX)0_xWJ!)q{b6U>zMJY^ z-f<~ZGMSq=<-nEpp@g2CI>l2p*)3jYtvJ;nuQ-UU8QU{|nW75To&NVM_Mz;Ee&8Qe z8(mj3?lFoPb*Dnf2X3e-=p!(7?#CFmjPbVEO#@iDi{3KfrN-QG#sxzNdznZsbbrIv z@DqlC=N;si%3B`evf z8!Tfwy?$q$ywB9Md9++|tYJA*lgxSY33>9A>tCC=*sd0HN$)0V+&WHa&Ub9r>rIc{ z@kIOfnc#CLnX=U+Gg@*iNls;Iz%f0YC5DZG#>l5ziUsz31~Wbitoy!d*CEf&%{FTO zgqwk4I|ps#%5ruiL;u}>ixuPlV+|Cgpl2rj{>Y==9wwX7C)Rp@OnH2j6ZH#TNtaJv zO21FOVxuy>|5*crX%utTum@VHXGUPoCp70Ko75ORp%MpPR9?5(Rd|?akshJa(IknL z#}bxgF6OpQ*%kCDL*ee~cj zs1#k}y}dUTwbQw1(tpcL2mDnk+c3X^QF2+5uCRELWJNip#?O#{WP5I+4UFxd%8=FN zwpvS0AHK$Wai`r~IEv@4s-L+-QIKUh2k-<$HEqC2daSmU~j%Q`9S zF?+P}jGRuYO_xwPY(~F!@;%-H&aYud^B1GOLAbv`ihy3tbr+` zy(C&0Wp66fpKD96^mvq9Qa9je<$D@b0+soG9qeu6W2L68MZWqFt z{L4Eo+;7p&(8^vqN_z&2Q3V+2cdpesh(5JcYuX4|*xN3~Hc=Ed!?%dCy z*9WhR`VQ>=h7I<(@(C*IbyN9E_cxtq$tRl}RFWK9Nu|A;V&8`wlFxHM9Y&JGXKz~y zWk?ouPZoP!6Th;^DPO{(XUMY^UaLD+ac~$CN{*^vVC2XKLT1_6^&}ou>SwOvSs#Oz z2LqNuV*i$j6{MF;+|6!dil*Q9j23hGVp8Ay$e|DZXnDU(_*=P`2$wq!c*#yj_h}YE zFYCNvhWILN9cB;>k!LIYr%-U6BXUm5dsY#nIB+X*S5I9?ziEe27^Nk0In(Q-=6m0EZ?joG$Z6`?N~-w{|yA4&3f^*sb4W zGV&NXzkCsW$JA$hkJhNLEhepO|X>N;N6WcBqM@K1P4V_p63iD&6lel@D0d?7H};DIqQovPcV1HMt#;^}i^s*I6C>vit;r) zRAV1ONHu6sP2aa9^!8O0`yN~W2;*(8Ny)hpJ=eJcda&ibGw258%MQBN`#Vaj-c&!# zI1s&N({w!}ds5_~YBEvY`abEni;nii=knjL-^DcDNxoOfU{Szc1scb_3v;JC$Tup< zomI}ZqiPUJ<;F+JV7VhFYsoBsBU32o3q(5tgCe;fMr8Xl7v0iv2aRpD?U_{+l{}E3 zvJ=keR^Jq*$!B|e#FuGK(GivEFuX9Z<8nEr)AIHa%>BXj{<7NGtmx0?Y@mttGq{W8Gkt+A*jEz%DK#0e`Yl`=3I|GOZLVJ=VZ0G#_s$^b#(ru-2SH3 z`B=3hn}XHZc_;l4>1V8OlU%j;q3aiPeqd)C9JF9BB;`&e7uDt*x6!8^cyC|a`_(tcs5V`$OR7b1IyLV7 zDz-T5 z9#c+@)6G=6^$&JND`v@`t4O@o+icxUCE2wM{RfAENI2ntZYI6=PY1|v?G{ZV7ckbX zbqI)3Dbq>*(z(YyypkTKQf#E!jx}0d{F!y%AML6>S|Gn+gP>1uZ!G|q!{ zNZPiVYGb1e`8$ChX{dO{Vs(+Tmr=s62pCcfsP*ZcR-Z?{5vxMKn3fI% zEn`W27yWFjqsIRV)%=Eo>~gz*$4@gKqry~v5QQX%^<=GnuWa4QX zt)!R2x+famaKNrRbsPPAnVR}Z>s2=TM_3lN?yOnWYkgpQD;p$aWhE`sqwa&Vo8=1U zw+T})ibSm=PZGM>JB!>`{fz=7lPR}~@x|lXkk(G}j6D~x< z`D`&q`m2b|PWM^1>AT0hE$*Y4$#!d}Z$FvA_)nbC_xJKS>756?HTBPw%Rl(j4Rc0l z4>`L$s=x&9qA6;BcXWNcta{jePbJv_^OwO!0(+I+CSoEA7~6$Pt;vt^?u{e?j(;>niLieM}~QJSP4QrPt4LSUmFXjg?dPc_6P# zZ09tE*H6|rVp)vE)o3=EasK2e`ix!+b;`yk%h)m-m1BQi;eV>E`6uOlPnE^?94K0J zZ3RtkA^s=I*z;W853IZWKd0QUR8;1Z9`C&NJIb1tTa*63l(8>YHT`kLKgjAj;h@F7 z5nT&x_4&VDzmu|VvtvE%^Bvdv)uX62-kZPil`?)LeD6_2Kv_O;z&U zSeBiLu^C+yd1?04=}@%y>!Y34Yv@`!TEEuLK2^gg`pEu=8LTIS@)@!FViJ`*YcsX~ zd$LR$?hv`?xMm-*?zrfd=-Ue(a6fVky~x*FA0j6w=;tVzTu{jh#Qm17R(C(=ChbR4 z*_)QbVzGayp%d-*R>r*1v+URdx~yZRgXV+_%h+H|H&rwF%0*im_S)Rf)zXiA<2mGC z?EI>AUF!o(d?#Bo_r960&#j-BZSn8zyOL7Qtz^GEyZ)>S;&#;Un%&@ICSG*A?6z%` zhx}r;y^u7<me^zvUF8vlTDZ`k1_1~jo!7dzqId9_AItS$R4jHn z1AVG>o%01(!@^2RZFt{B<>~J+YO2_@()puiO0^!pNFp!Jt1HOk9yz7w_Frik&5{Lk z$#^B=NcY$0&*7lQ+5O?&Z#fcjMr*TO>r6V`%d4G7*Gl)Zr&p5I?q!#e*8R262=BFs znY0|ad~O4_-SfVh=5^Hz-j6-$JlaM-*l=rQ!!ldzk1D-iVlj9>ES=qlUG z2Of1^H_v-ib4}Hp-=w|tRMgpet*7&?GHT29Be8aJM;%$@q4M5Yb}VeQ-a2u8HI;2= z?8#p>%hkjvcfZ z1?SUF>;2vvu?qgV`|K81MlWJpC*{1!o&KWrX-3lv-k+12>L*4!HLCu)axCtAziz&5 zLHkYIe zV%%SEq_RyEqsu981L>TPsd;z4sLh}>QxL}5=(C!wHn-E=p)<>Jl*J!uf6TF25)%}a z*}hEPZpDoBdzUuuOtFa_icBm$P`^3wXN=QAqcfpE#M9yaMpU}He z|DprSS0hVm2!k~kxv!Qzshr9?Pd#eq_ZwP0$NO>%CTG zfj;>s@g$1a+X(N6S1OEqPp^UK=l$JuFO_gUPV`#_zi5rkx2f%STcvN(mrvBueepeB zA3MwGP-U#43EfB~cR%Q^tYGP5$jeo1uiawE-nH`i4-Si#84ccweM=TilD;PL^=kNp zO}hJMjZ`mLa~y*`K=MZ?dr7%t6t{EaCNKF`6S>Yw{_0||0%Bzsm6?2l@yKb?+en}8 zT^jm61X>yQ+Zj8SNUHpSBPC<6o4he6dKKn?+-kbgtx27<&9CiUU~~9)V9$`9$4o`{ z?IA-PVc3SQd5n=9A(t@cZlQN8bw^We^(z?hn)0d32$_5CTOEx!YZsp_v!3M~s_<^y zwwWSsk9^Sd^JI~0-?MBR7G3p2Jhh=WuG~h^Ip=w9=Y_W6_FjYs8S>p`dN-3E&y&$w z=fy`|dc#dO%MBJIM_y`ew%1LZGugo;ipoWQ^!3b%I!~^lRZzd2Z|Y zDQ$ffI%TcwyROZDgKh3pLeEU%si>Pd9rnvm~;t#TUKMl`j;vq^|WHPfz?XI!5j) zhYUY;E&ZR;V+>p#u{g;*PTXw$;C`%|ojU0+u8dF`}g{e)8=C-rbEAP!G_(? z92WwToSaV(!*0>f+k6VWL?}{B0xRvC=GDLNB}Z2j^Ry39T&k!R$cs)AE@!Y|=YOJt z%DMk)r~hbuMR?w0OOU@cI4N^WtG`;(sX$5SbCQSHvFyk~Xn zD%-iij{V(C{hf7WUNx0(XsnhW_l?!>sh~2>T{ic1)#Rw)z7g+p{&T6`nMQ33_EgB% zoYZ*p^;Onb>%GlX;lWnKZ%Wb4){_l3;%3P^$FL_6`rx^4(&LGHE3c(5kltp0Vt0Ps zN9pX=s)lDs^}|@UJ$rP+SiQI4+taz5?ugUm2QGgD<9=#(jZwt;RAw^byNghb*g+(} zJC^JSSnq{(XCEe&Uo@@J-A!bV?U79ltGP$+lV7Kz&J^*ICYpUIeDH3%Y9ni9S2f|R ziJY+jE(ww8PzBLMmbKB#eQWBUo!w0uNF&R>Sw8q2X~im_#gXwlx1a zSOb$TCsXWiYCBu4mMt>*0we6Q&{tl1R?};g!UpEDcT_#QJ@#w<*AvGu1K5U?L-qSB z_U&-?*S5b%kqc_D!)hLt@UzG}m1Lh}{e7=fNz(O`RncpiyeEI)B$m`#H#?v4`)cGJ z{;!ueoY!o9+P|~BUT5eJe3z4p>+HSROw#(q-~*J?gNWWUmduk*KRf>z`KbEW9F_5= z%gOVEL@FF+RzZpsDzU_cmno*n^|Q%SbI1kd?EA!m-GZ46am;4lnG?N+eADKCkYFnm z2ab92Eu`qY{X+G(+IyJFvz>30>lcwZ%)U(Rin#c8T39~|I`y6v{2TE%ykGCEEU(_C z+(=WM9kaxa={CYJdBRC(oqF_v`Kov$vHu>}@8y zX4hX?kLaiKopN%={Q6(DHa*<*0L;qG<+0N?pAUcGp5qV9v~KjvRP-A22!L#JP~&8K zGkg5P)mtcX$Gqq+xt{df>$g|gu}!OzJHG&*4&O}9X=y*1#uEQ)0lJ->)n2E26dgyi zTK6+lebqt|s&+o%qOWw|3^l8<-8OnW-RHp(Xc3z*8P)m2YI0>I*;`G&L^rQ`8m{w> zjtQpY)N)~`gKnpvB_A+YBh6sQZk|}{D1ZBwGTR2kWe4v(zZS9e8H>m~R|8X1eZ6%R z<&SRhpH06Uqx>7_Cu3B!wn=b5&F$Re{Q~)N^_(BmPj-6fr_S->_`d#2b>}X2*0-Df zZDh84S0G+H@q+slJGrgH`!v~80fXOt5lwAje@V!R6?Irm;S5*T4%|ylVVKOA-t_1A zYfMJpN-mz`{f_N?_q$b;f9fnzoeXUhnfJ}gA3gOz=M!ZZqh&oM&Of@y-pvb|Ieh0y+qf3neM5rD<$HLQk0dp@QbZT z-!l^h%_KoHanMW#G?V?z#6L4Z&`dT&f}!Qm@wNeE209vB79(=Nr)Dwc?F_nh*T>U0 zKFpH~E&lM=q2tYrx#?Fvez(Me=%K|pFfnsAEpr`?h9&w}E^V(4{O~~`aKQrpQfdDM zHK*sEz--&l>0B7 z_3Z`wnCPxOXEa*8-T5-_8S{P`dv({miKfdoE=pWc-MRNsY2%5Tye2}Vtz2DRdvkeD zZFz|q7h2!Fplk;o7={?q11P;gvVH)Ce*x5!g=7?S$Z{ZrBFaESM&VcpB`7EqfZ{j>8T=|I zp&S&s+bHEwOd60!jk2t;5ym4l)=?jb%7=i;q4JJHIg@IZiJ|O5Mk=xxeXFR%;KkBhND_)tQNM;1 z97Qv0QpJ#_qaYS()&}ZyBB;0sqimQ90lSRiCzPUrJQW%LC`jWqv%muh|2n!>1=PQQ z#i(dR-hG%e*&-l2T~h-=QAKGM3X#D_O+&W7Y?w7)3PcXdqtzzbYTx=;Cio8ee_Bdi zJLvyuAuSmO;ioWcR26%Rb#a+x@fRu6NWMkSm{G+zs2w++Qid(u9m(I^mcIP9^sgFM zw3J1Vw^eJIb7zQh&CKI)DJ|DJs9JkdnX4?RHBmivc)!+y%j$#~zi)uILoBqk=fmaAHw-mj z(qr=CzmWEO1QzF?Yd$%^j}T1@!8D@ZRX7ioH($A-`IXiG8qw$EX&#C8_M<)%(~)?vQKiW{IC=rR=;URec9r?c}DXUzonbs zdxeJZL1OXwc;xlD@z@b4KPh}43jL=Qd>Ze~R_A4w=F5IZH(&jliTB8m=W_$0{|(;5 zvKaZK5h)pt4-E!Lc#C$vR^@!Js`E@sOo;F3~|2Y&yJ#Z*TFxa`{EqYG#)3j^O zG6=_8rde~obI}YK)@H_eVA7Vx_6*LzWi&sv!OSAn zuxK>jT{X1K7irl3F=9SRMMF|E-~R*^hwuIWqQd0T_BIf6cw`Mn_~j$ferA(TQGr#h z7%a`kCphuZ?T<0y2ok14fFtq#^Zuuh{d`2U?(cn`gd?YfNe_xV55$zp`{D{Y<!eG zCmt5Alg-yZNy2BUbxFERlOh*Ng$$??FqIuT)__cB8AT5z-A^Tz9O^Di)gK*43Uzji z*?%dyH=8l<3WA^Wa}DNuhpGDbLw~>@XxL7p|m$x^ya~EFUzK^s>Ubm1ws-#4F3UnEh-S z#{0u-`wXoswWaiINjI;gQ|N#2Lwb2-ZD(k0U@)XEH|dTh6`_0cx;1^=^mzD`wtN}- z7)+RB#kf;Sx^HaVa`45ZX-W6$)v@71|B`O$Q?ze0+ph`alONHwqAfui^rzL+Ro``nbk#kjfrzr(&V3#SzS=OQXe1F*f5gm zhXX67pRZZX4X+tYXv`3}P@%;Z34>Oo2$i4P?bNb2W|Lw8} zImjzr(3h@H$QbmcZ=;${ZPAve#+2me$=hH`75c{IwVj;2Mk@XvmA#CXlGkY2&*$4G zo_`kK(#movp)DOgtfSEPPwDWw^wzQAwf~-s4GU6X*tBe{dd9!B(ZVpf2@A^t^(Y#(dY(C1Gf0mb=WXWIZ1L5P2 zGu`EiEvw8&-R7TZCt7lqrelsqO~Y6Ma1~ot>a;}EVSj8kD)rYn z3SJdTmnSSm`{Py}H+I}{xbBQ5N_R_6x`ecJ867acK1&v(okMut#1}PPIzHPDU&oe~ z@RykIas1}cI|J+1q%v~X^cx@%al!C3|I9AHB6L!sr*qJ}5mn7UAET$oyoT;<8xC}j zs$GMliV%$U58x%?BmAE;{t|u;bDvqa7WkJh#Y@Mo`V_v>{Co`GaueT&wjVPaH`|Yy z_)7B?FAbzb)bxCr&7(2%?()y}f97+rrq_&zI=7hPKl~}pJURh4@f>*7=u-0$h?x$m z@O#Co621~qAH!D)t(K=Yp#_?v3-i6`qD7R;gSykrMZMrtM@N07fDzeQCwYbX-Of2qL#FITJysQ>@~ literal 13354 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 bD6JKKQlli?^(dN%oBk6{V|R@Il&Jn+>c=P* diff --git a/docs/examples_notebooks/inputs/operation dulce/text_units.parquet b/docs/examples_notebooks/inputs/operation dulce/text_units.parquet index 09349e3f65c434d6c632b7253a29769c78b5f84c..c4df9cc5ee9da414ddbd72d190c643ce6a5cc9ef 100644 GIT binary patch literal 30769 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%0Dr`%s0wb<~ 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 W$l7`vlKQ|ub$=VItDE4)uU^9dvfOBeSsZbAc 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 diff --git a/docs/examples_notebooks/local_search.ipynb b/docs/examples_notebooks/local_search.ipynb index 77a74c544b..f7f0c5a54b 100644 --- a/docs/examples_notebooks/local_search.ipynb +++ b/docs/examples_notebooks/local_search.ipynb @@ -19,8 +19,6 @@ "import os\n", "\n", "import pandas as pd\n", - "\n", - "from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig\n", "from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey\n", "from graphrag.query.indexer_adapters import (\n", " read_indexer_covariates,\n", @@ -34,7 +32,7 @@ " LocalSearchMixedContext,\n", ")\n", "from graphrag.query.structured_search.local_search.search import LocalSearch\n", - "from graphrag.vector_stores.lancedb import LanceDBVectorStore" + "from graphrag_vectors import IndexSchema, LanceDBVectorStore" ] }, { @@ -102,9 +100,7 @@ "# load description embeddings to an in-memory lancedb vectorstore\n", "# to connect to a remote db, specify url and port values.\n", "description_embedding_store = LanceDBVectorStore(\n", - " vector_store_schema_config=VectorStoreSchemaConfig(\n", - " index_name=\"default-entity-description\"\n", - " )\n", + " index_schema=IndexSchema(index_name=\"default-entity-description\")\n", ")\n", "description_embedding_store.connect(db_uri=LANCEDB_URI)\n", "\n", diff --git a/docs/examples_notebooks/multi_index_search.ipynb b/docs/examples_notebooks/multi_index_search.ipynb deleted file mode 100644 index 2e70ed5086..0000000000 --- a/docs/examples_notebooks/multi_index_search.ipynb +++ /dev/null @@ -1,558 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Copyright (c) 2024 Microsoft Corporation.\n", - "# Licensed under the MIT License." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Multi Index Search\n", - "This notebook demonstrates multi-index search using the GraphRAG API.\n", - "\n", - "Indexes created from Wikipedia state articles for Alaska, California, DC, Maryland, NY and Washington are used." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import asyncio\n", - "\n", - "import pandas as pd\n", - "\n", - "from graphrag.api.query import (\n", - " multi_index_basic_search,\n", - " multi_index_drift_search,\n", - " multi_index_global_search,\n", - " multi_index_local_search,\n", - ")\n", - "from graphrag.config.create_graphrag_config import create_graphrag_config\n", - "\n", - "indexes = [\"alaska\", \"california\", \"dc\", \"maryland\", \"ny\", \"washington\"]\n", - "indexes = sorted(indexes)\n", - "\n", - "print(indexes)\n", - "\n", - "vector_store_configs = {\n", - " index: {\n", - " \"type\": \"lancedb\",\n", - " \"db_uri\": f\"inputs/{index}/lancedb\",\n", - " \"container_name\": \"default\",\n", - " \"overwrite\": True,\n", - " \"index_name\": f\"{index}\",\n", - " }\n", - " for index in indexes\n", - "}" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "config_data = {\n", - " \"models\": {\n", - " \"default_chat_model\": {\n", - " \"model_supports_json\": True,\n", - " \"parallelization_num_threads\": 50,\n", - " \"parallelization_stagger\": 0.3,\n", - " \"async_mode\": \"threaded\",\n", - " \"type\": \"azure_openai_chat\",\n", - " \"model\": \"gpt-4o\",\n", - " \"auth_type\": \"azure_managed_identity\",\n", - " \"api_base\": \"\",\n", - " \"api_version\": \"2024-02-15-preview\",\n", - " \"deployment_name\": \"gpt-4o\",\n", - " },\n", - " \"default_embedding_model\": {\n", - " \"parallelization_num_threads\": 50,\n", - " \"parallelization_stagger\": 0.3,\n", - " \"async_mode\": \"threaded\",\n", - " \"type\": \"azure_openai_embedding\",\n", - " \"model\": \"text-embedding-3-large\",\n", - " \"auth_type\": \"azure_managed_identity\",\n", - " \"api_base\": \"\",\n", - " \"api_version\": \"2024-02-15-preview\",\n", - " \"deployment_name\": \"text-embedding-3-large\",\n", - " },\n", - " },\n", - " \"vector_store\": vector_store_configs,\n", - " \"local_search\": {\n", - " \"prompt\": \"prompts/local_search_system_prompt.txt\",\n", - " \"llm_max_tokens\": 12000,\n", - " },\n", - " \"global_search\": {\n", - " \"map_prompt\": \"prompts/global_search_map_system_prompt.txt\",\n", - " \"reduce_prompt\": \"prompts/global_search_reduce_system_prompt.txt\",\n", - " \"knowledge_prompt\": \"prompts/global_search_knowledge_system_prompt.txt\",\n", - " },\n", - " \"drift_search\": {\n", - " \"prompt\": \"prompts/drift_search_system_prompt.txt\",\n", - " \"reduce_prompt\": \"prompts/drift_search_reduce_prompt.txt\",\n", - " },\n", - " \"basic_search\": {\"prompt\": \"prompts/basic_search_system_prompt.txt\"},\n", - "}\n", - "parameters = create_graphrag_config(config_data, \".\")\n", - "loop = asyncio.get_event_loop()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multi-index Global Search" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "entities = [pd.read_parquet(f\"inputs/{index}/entities.parquet\") for index in indexes]\n", - "communities = [\n", - " pd.read_parquet(f\"inputs/{index}/communities.parquet\") for index in indexes\n", - "]\n", - "community_reports = [\n", - " pd.read_parquet(f\"inputs/{index}/community_reports.parquet\") for index in indexes\n", - "]\n", - "\n", - "task = loop.create_task(\n", - " multi_index_global_search(\n", - " parameters,\n", - " entities,\n", - " communities,\n", - " community_reports,\n", - " indexes,\n", - " 1,\n", - " False,\n", - " \"Multiple Paragraphs\",\n", - " False,\n", - " \"Describe this dataset.\",\n", - " )\n", - ")\n", - "results = await task" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Print report" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(results[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Show context links back to original index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for report_id in [120, 129, 40, 16, 204, 143, 85, 122, 83]:\n", - " index_name = [i for i in results[1][\"reports\"] if i[\"id\"] == str(report_id)][0][ # noqa: RUF015\n", - " \"index_name\"\n", - " ]\n", - " index_id = [i for i in results[1][\"reports\"] if i[\"id\"] == str(report_id)][0][ # noqa: RUF015\n", - " \"index_id\"\n", - " ]\n", - " print(report_id, index_name, index_id)\n", - " index_reports = pd.read_parquet(\n", - " f\"inputs/{index_name}/create_final_community_reports.parquet\"\n", - " )\n", - " print([i for i in results[1][\"reports\"] if i[\"id\"] == str(report_id)][0][\"title\"]) # noqa: RUF015\n", - " print(\n", - " index_reports[index_reports[\"community\"] == int(index_id)][\"title\"].to_numpy()[\n", - " 0\n", - " ]\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Multi-index Local Search" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "entities = [pd.read_parquet(f\"inputs/{index}/entities.parquet\") for index in indexes]\n", - "communities = [\n", - " pd.read_parquet(f\"inputs/{index}/communities.parquet\") for index in indexes\n", - "]\n", - "community_reports = [\n", - " pd.read_parquet(f\"inputs/{index}/community_reports.parquet\") for index in indexes\n", - "]\n", - "covariates = [\n", - " pd.read_parquet(f\"inputs/{index}/covariates.parquet\") for index in indexes\n", - "]\n", - "text_units = [\n", - " pd.read_parquet(f\"inputs/{index}/text_units.parquet\") for index in indexes\n", - "]\n", - "relationships = [\n", - " pd.read_parquet(f\"inputs/{index}/relationships.parquet\") for index in indexes\n", - "]\n", - "\n", - "task = loop.create_task(\n", - " multi_index_local_search(\n", - " parameters,\n", - " entities,\n", - " communities,\n", - " community_reports,\n", - " text_units,\n", - " relationships,\n", - " covariates,\n", - " indexes,\n", - " 1,\n", - " \"Multiple Paragraphs\",\n", - " False,\n", - " \"weather\",\n", - " )\n", - ")\n", - "results = await task" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Print report" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(results[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Show context links back to original index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for report_id in [47, 213]:\n", - " index_name = [i for i in results[1][\"reports\"] if i[\"id\"] == str(report_id)][0][ # noqa: RUF015\n", - " \"index_name\"\n", - " ]\n", - " index_id = [i for i in results[1][\"reports\"] if i[\"id\"] == str(report_id)][0][ # noqa: RUF015\n", - " \"index_id\"\n", - " ]\n", - " print(report_id, index_name, index_id)\n", - " index_reports = pd.read_parquet(\n", - " f\"inputs/{index_name}/create_final_community_reports.parquet\"\n", - " )\n", - " print([i for i in results[1][\"reports\"] if i[\"id\"] == str(report_id)][0][\"title\"]) # noqa: RUF015\n", - " print(\n", - " index_reports[index_reports[\"community\"] == int(index_id)][\"title\"].to_numpy()[\n", - " 0\n", - " ]\n", - " )\n", - "for entity_id in [500, 502, 506, 1960, 1961, 1962]:\n", - " index_name = [i for i in results[1][\"entities\"] if i[\"id\"] == str(entity_id)][0][ # noqa: RUF015\n", - " \"index_name\"\n", - " ]\n", - " index_id = [i for i in results[1][\"entities\"] if i[\"id\"] == str(entity_id)][0][ # noqa: RUF015\n", - " \"index_id\"\n", - " ]\n", - " print(entity_id, index_name, index_id)\n", - " index_entities = pd.read_parquet(\n", - " f\"inputs/{index_name}/create_final_entities.parquet\"\n", - " )\n", - " print(\n", - " [i for i in results[1][\"entities\"] if i[\"id\"] == str(entity_id)][0][ # noqa: RUF015\n", - " \"description\"\n", - " ][:100]\n", - " )\n", - " print(\n", - " index_entities[index_entities[\"human_readable_id\"] == int(index_id)][\n", - " \"description\"\n", - " ].to_numpy()[0][:100]\n", - " )\n", - "for relationship_id in [1805, 1806]:\n", - " index_name = [ # noqa: RUF015\n", - " i for i in results[1][\"relationships\"] if i[\"id\"] == str(relationship_id)\n", - " ][0][\"index_name\"]\n", - " index_id = [ # noqa: RUF015\n", - " i for i in results[1][\"relationships\"] if i[\"id\"] == str(relationship_id)\n", - " ][0][\"index_id\"]\n", - " print(relationship_id, index_name, index_id)\n", - " index_relationships = pd.read_parquet(\n", - " f\"inputs/{index_name}/create_final_relationships.parquet\"\n", - " )\n", - " print(\n", - " [i for i in results[1][\"relationships\"] if i[\"id\"] == str(relationship_id)][0][ # noqa: RUF015\n", - " \"description\"\n", - " ]\n", - " )\n", - " print(\n", - " index_relationships[index_relationships[\"human_readable_id\"] == int(index_id)][\n", - " \"description\"\n", - " ].to_numpy()[0]\n", - " )\n", - "for claim_id in [100]:\n", - " index_name = [i for i in results[1][\"claims\"] if i[\"id\"] == str(claim_id)][0][ # noqa: RUF015\n", - " \"index_name\"\n", - " ]\n", - " index_id = [i for i in results[1][\"claims\"] if i[\"id\"] == str(claim_id)][0][ # noqa: RUF015\n", - " \"index_id\"\n", - " ]\n", - " print(relationship_id, index_name, index_id)\n", - " index_claims = pd.read_parquet(\n", - " f\"inputs/{index_name}/create_final_covariates.parquet\"\n", - " )\n", - " print(\n", - " [i for i in results[1][\"claims\"] if i[\"id\"] == str(claim_id)][0][\"description\"] # noqa: RUF015\n", - " )\n", - " print(\n", - " index_claims[index_claims[\"human_readable_id\"] == int(index_id)][\n", - " \"description\"\n", - " ].to_numpy()[0]\n", - " )" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multi-index Drift Search" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "entities = [pd.read_parquet(f\"inputs/{index}/entities.parquet\") for index in indexes]\n", - "communities = [\n", - " pd.read_parquet(f\"inputs/{index}/communities.parquet\") for index in indexes\n", - "]\n", - "community_reports = [\n", - " pd.read_parquet(f\"inputs/{index}/community_reports.parquet\") for index in indexes\n", - "]\n", - "text_units = [\n", - " pd.read_parquet(f\"inputs/{index}/text_units.parquet\") for index in indexes\n", - "]\n", - "relationships = [\n", - " pd.read_parquet(f\"inputs/{index}/relationships.parquet\") for index in indexes\n", - "]\n", - "\n", - "task = loop.create_task(\n", - " multi_index_drift_search(\n", - " parameters,\n", - " entities,\n", - " communities,\n", - " community_reports,\n", - " text_units,\n", - " relationships,\n", - " indexes,\n", - " 1,\n", - " \"Multiple Paragraphs\",\n", - " False,\n", - " \"agriculture\",\n", - " )\n", - ")\n", - "results = await task" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Print report" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(results[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Show context links back to original index" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for report_id in [47, 236]:\n", - " for question in results[1]:\n", - " resq = results[1][question]\n", - " if len(resq[\"reports\"]) == 0:\n", - " continue\n", - " if len([i for i in resq[\"reports\"] if i[\"id\"] == str(report_id)]) == 0:\n", - " continue\n", - " index_name = [i for i in resq[\"reports\"] if i[\"id\"] == str(report_id)][0][ # noqa: RUF015\n", - " \"index_name\"\n", - " ]\n", - " index_id = [i for i in resq[\"reports\"] if i[\"id\"] == str(report_id)][0][ # noqa: RUF015\n", - " \"index_id\"\n", - " ]\n", - " print(question, report_id, index_name, index_id)\n", - " index_reports = pd.read_parquet(\n", - " f\"inputs/{index_name}/create_final_community_reports.parquet\"\n", - " )\n", - " print([i for i in resq[\"reports\"] if i[\"id\"] == str(report_id)][0][\"title\"]) # noqa: RUF015\n", - " print(\n", - " index_reports[index_reports[\"community\"] == int(index_id)][\n", - " \"title\"\n", - " ].to_numpy()[0]\n", - " )\n", - " break\n", - "for source_id in [10, 16, 19, 20, 21, 22, 24, 29, 93, 95]:\n", - " for question in results[1]:\n", - " resq = results[1][question]\n", - " if len(resq[\"sources\"]) == 0:\n", - " continue\n", - " if len([i for i in resq[\"sources\"] if i[\"id\"] == str(source_id)]) == 0:\n", - " continue\n", - " index_name = [i for i in resq[\"sources\"] if i[\"id\"] == str(source_id)][0][ # noqa: RUF015\n", - " \"index_name\"\n", - " ]\n", - " index_id = [i for i in resq[\"sources\"] if i[\"id\"] == str(source_id)][0][ # noqa: RUF015\n", - " \"index_id\"\n", - " ]\n", - " print(question, source_id, index_name, index_id)\n", - " index_sources = pd.read_parquet(\n", - " f\"inputs/{index_name}/create_final_text_units.parquet\"\n", - " )\n", - " print(\n", - " [i for i in resq[\"sources\"] if i[\"id\"] == str(source_id)][0][\"text\"][:250] # noqa: RUF015\n", - " )\n", - " print(index_sources.loc[int(index_id)][\"text\"][:250])\n", - " break" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Multi-index Basic Search" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "text_units = [\n", - " pd.read_parquet(f\"inputs/{index}/text_units.parquet\") for index in indexes\n", - "]\n", - "\n", - "task = loop.create_task(\n", - " multi_index_basic_search(\n", - " parameters, text_units, indexes, False, \"industry in maryland\"\n", - " )\n", - ")\n", - "results = await task" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Print report" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(results[0])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Show context links back to original text\n", - "\n", - "Note that original index name is not saved in context data for basic search" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "for source_id in [0, 1]:\n", - " print(results[1][\"sources\"][source_id][\"text\"][:250])" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": ".venv", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/docs/get_started.md b/docs/get_started.md index a9d5ff5436..a173611744 100644 --- a/docs/get_started.md +++ b/docs/get_started.md @@ -6,50 +6,65 @@ [Python 3.10-3.12](https://www.python.org/downloads/) -To get started with the GraphRAG system, you have a few options: +The following is a simple end-to-end example for using GraphRAG on the command line after installing from [pypi](https://pypi.org/project/graphrag/). -👉 [Install from pypi](https://pypi.org/project/graphrag/).
-👉 [Use it from source](developing.md)
+It shows how to use the system to index some text, and then use the indexed data to answer questions about the documents. -The following is a simple end-to-end example for using the GraphRAG system, using the install from pypi option. +## Install GraphRAG -It shows how to use the system to index some text, and then use the indexed data to answer questions about the documents. +To get started, create a project space and python virtual environment to install `graphrag`. -# Install GraphRAG +### Create Project Space ```bash -pip install graphrag +mkdir graphrag_quickstart +cd graphrag_quickstart +python -m venv .venv ``` +### Activate Python Virtual Environment - Unix/MacOS -# Running the Indexer +```bash +source .venv/bin/activate +``` -We need to set up a data project and some initial configuration. First let's get a sample dataset ready: +### Activate Python Virtual Environment - Windows -```sh -mkdir -p ./christmas/input +```bash +.venv\Scripts\activate ``` -Get a copy of A Christmas Carol by Charles Dickens from a trusted source: +### Install GraphRAG -```sh -curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt -o ./christmas/input/book.txt +```bash +python -m pip install graphrag ``` -## Set Up Your Workspace Variables +### Initialize GraphRAG To initialize your workspace, first run the `graphrag init` command. -Since we have already configured a directory named `./christmas` in the previous step, run the following command: ```sh -graphrag init --root ./christmas +graphrag init ``` -This will create two files: `.env` and `settings.yaml` in the `./christmas` directory. +When prompted, specify the default chat and embedding models you would like to use in your config. + +This will create two files, `.env` and `settings.yaml`, and a directory `input`, in the current directory. +- `input` Location of text files to process with `graphrag`. - `.env` contains the environment variables required to run the GraphRAG pipeline. If you inspect the file, you'll see a single environment variable defined, `GRAPHRAG_API_KEY=`. Replace `` with your own OpenAI or Azure API key. - `settings.yaml` contains the settings for the pipeline. You can modify this file to change the settings for the pipeline. -
+ +### Download Sample Text + +Get a copy of A Christmas Carol by Charles Dickens from a trusted source: + +```sh +curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt -o ./input/book.txt +``` + +## Set Up Workspace Variables ### Using OpenAI @@ -60,13 +75,16 @@ If running in OpenAI mode, you only need to update the value of `GRAPHRAG_API_KE In addition to setting your API key, Azure OpenAI users should set the variables below in the settings.yaml file. To find the appropriate sections, just search for the `models:` root configuration; you should see two sections, one for the default chat endpoint and one for the default embeddings endpoint. Here is an example of what to add to the chat model config: ```yaml -type: azure_openai_chat # Or azure_openai_embedding for embeddings +type: chat +model_provider: azure +model: gpt-4.1 +deployment_name: api_base: https://.openai.azure.com api_version: 2024-02-15-preview # You can customize this for other versions -deployment_name: ``` #### Using Managed Auth on Azure + To use managed auth, edit the auth_type in your model config and *remove* the api_key line: ```yaml @@ -75,39 +93,34 @@ auth_type: azure_managed_identity # Default auth_type is is api_key You will also need to login with [az login](https://learn.microsoft.com/en-us/cli/azure/authenticate-azure-cli) and select the subscription with your endpoint. -## Running the Indexing pipeline +## Index -Finally we'll run the pipeline! +Now we're ready to index! ```sh -graphrag index --root ./christmas +graphrag index ``` ![pipeline executing from the CLI](img/pipeline-running.png) -This process will take some time to run. This depends on the size of your input data, what model you're using, and the text chunk size being used (these can be configured in your `settings.yaml` file). -Once the pipeline is complete, you should see a new folder called `./christmas/output` with a series of parquet files. +This process will usually take a few minutes to run. Once the pipeline is complete, you should see a new folder called `./output` with a series of parquet files. -# Using the Query Engine +# Query Now let's ask some questions using this dataset. Here is an example using Global search to ask a high-level question: ```sh -graphrag query \ ---root ./christmas \ ---method global \ ---query "What are the top themes in this story?" +graphrag query "What are the top themes in this story?" ``` Here is an example using Local search to ask a more specific question about a particular character: ```sh graphrag query \ ---root ./christmas \ ---method local \ ---query "Who is Scrooge and what are his main relationships?" +"Who is Scrooge and what are his main relationships?" \ +--method local ``` Please refer to [Query Engine](query/overview.md) docs for detailed information about how to leverage our Local and Global search mechanisms for extracting meaningful insights from data after the Indexer has wrapped up execution. diff --git a/docs/index/architecture.md b/docs/index/architecture.md index 31ec5090f6..7c3e1ed2bc 100644 --- a/docs/index/architecture.md +++ b/docs/index/architecture.md @@ -6,24 +6,25 @@ In order to support the GraphRAG system, the outputs of the indexing engine (in the Default Configuration Mode) are aligned to a knowledge model we call the _GraphRAG Knowledge Model_. This model is designed to be an abstraction over the underlying data storage technology, and to provide a common interface for the GraphRAG system to interact with. -In normal use-cases the outputs of the GraphRAG Indexer would be loaded into a database system, and the GraphRAG's Query Engine would interact with the database using the knowledge model data-store types. ### Workflows -Because of the complexity of our data indexing tasks, we needed to be able to express our data pipeline as series of multiple, interdependent workflows. +Below is the core GraphRAG indexing pipeline. Individual workflows are described in detail in the [dataflow](./default_dataflow.md) page. ```mermaid --- -title: Sample Workflow DAG +title: Basic GraphRAG --- stateDiagram-v2 - [*] --> Prepare - Prepare --> Chunk - Chunk --> ExtractGraph - Chunk --> EmbedDocuments - ExtractGraph --> GenerateReports + [*] --> LoadDocuments + LoadDocuments --> ChunkDocuments + ChunkDocuments --> ExtractGraph + ChunkDocuments --> ExtractClaims + ChunkDocuments --> EmbedChunks + ExtractGraph --> DetectCommunities ExtractGraph --> EmbedEntities - ExtractGraph --> EmbedGraph + DetectCommunities --> GenerateReports + GenerateReports --> EmbedReports ``` ### LLM Caching @@ -35,11 +36,12 @@ This allows our indexer to be more resilient to network issues, to act idempoten ### Providers & Factories -Several subsystems within GraphRAG use a factory pattern to register and retrieve provider implementations. This allows deep customization to support models, storage, and so on that you may use but isn't built directly into GraphRAG. +Several subsystems within GraphRAG use a factory pattern to register and retrieve provider implementations. This allows deep customization to support your own implementations of models, storage, and so on that we haven't built into the core library. The following subsystems use a factory pattern that allows you to register your own implementations: -- [language model](https://github.com/microsoft/graphrag/blob/main/graphrag/language_model/factory.py) - implement your own `chat` and `embed` methods to use a model provider of choice beyond the built-in OpenAI/Azure support +- [language model](https://github.com/microsoft/graphrag/blob/main/graphrag/language_model/factory.py) - implement your own `chat` and `embed` methods to use a model provider of choice beyond the built-in LiteLLM wrapper +- [input reader](https://github.com/microsoft/graphrag/blob/main/graphrag/index/input/factory.py) - implement your own input document reader to support file types other than text, CSV, and JSON - [cache](https://github.com/microsoft/graphrag/blob/main/graphrag/cache/factory.py) - create your own cache storage location in addition to the file, blob, and CosmosDB ones we provide - [logger](https://github.com/microsoft/graphrag/blob/main/graphrag/logger/factory.py) - create your own log writing location in addition to the built-in file and blob storage - [storage](https://github.com/microsoft/graphrag/blob/main/graphrag/storage/factory.py) - create your own storage provider (database, etc.) beyond the file, blob, and CosmosDB ones built in diff --git a/docs/index/byog.md b/docs/index/byog.md index 781b922466..acd7679348 100644 --- a/docs/index/byog.md +++ b/docs/index/byog.md @@ -16,8 +16,6 @@ The approach described here will be to run a custom GraphRAG workflow pipeline t See the full entities [table schema](./outputs.md#entities). For graph summarization purposes, you only need id, title, description, and the list of text_unit_ids. -The additional properties are used for optional graph visualization purposes. - ### Relationships See the full relationships [table schema](./outputs.md#relationships). For graph summarization purposes, you only need id, source, target, description, weight, and the list of text_unit_ids. @@ -67,4 +65,4 @@ Putting it all together: - `output`: Create an output folder and put your entities and relationships (and optionally text_units) parquet files in it. - Update your config as noted above to only run the workflows subset you need. -- Run `graphrag index --root ` \ No newline at end of file +- Run `graphrag index --root ` \ No newline at end of file diff --git a/docs/index/default_dataflow.md b/docs/index/default_dataflow.md index be290ed7a6..9a810accb0 100644 --- a/docs/index/default_dataflow.md +++ b/docs/index/default_dataflow.md @@ -4,8 +4,8 @@ The knowledge model is a specification for data outputs that conform to our data-model definition. You can find these definitions in the python/graphrag/graphrag/model folder within the GraphRAG repository. The following entity types are provided. The fields here represent the fields that are text-embedded by default. -- `Document` - An input document into the system. These either represent individual rows in a CSV or individual .txt file. -- `TextUnit` - A chunk of text to analyze. The size of these chunks, their overlap, and whether they adhere to any data boundaries may be configured below. A common use case is to set `CHUNK_BY_COLUMNS` to `id` so that there is a 1-to-many relationship between documents and TextUnits instead of a many-to-many. +- `Document` - An input document into the system. These either represent individual rows in a CSV or individual .txt files. +- `TextUnit` - A chunk of text to analyze. The size of these chunks, their overlap, and whether they adhere to any data boundaries may be configured below. - `Entity` - An entity extracted from a TextUnit. These represent people, places, events, or some other entity-model that you provide. - `Relationship` - A relationship between two entities. - `Covariate` - Extracted claim information, which contains statements about entities which may be time-bound. @@ -25,31 +25,26 @@ flowchart TB documents[Documents] --> chunk[Chunk] chunk --> textUnits[Text Units] end - subgraph phase2[Phase 2: Graph Extraction] + subgraph phase2[Phase 2: Document Processing] + documents --> link_to_text_units[Link to TextUnits] + textUnits --> link_to_text_units + link_to_text_units --> document_outputs[Documents Table] + end + subgraph phase3[Phase 3 Graph Extraction] textUnits --> graph_extract[Entity & Relationship Extraction] graph_extract --> graph_summarize[Entity & Relationship Summarization] graph_summarize --> claim_extraction[Claim Extraction] claim_extraction --> graph_outputs[Graph Tables] end - subgraph phase3[Phase 3: Graph Augmentation] + subgraph phase4[Phase 4: Graph Augmentation] graph_outputs --> community_detect[Community Detection] community_detect --> community_outputs[Communities Table] end - subgraph phase4[Phase 4: Community Summarization] + subgraph phase5[Phase 5: Community Summarization] community_outputs --> summarized_communities[Community Summarization] summarized_communities --> community_report_outputs[Community Reports Table] end - subgraph phase5[Phase 5: Document Processing] - documents --> link_to_text_units[Link to TextUnits] - textUnits --> link_to_text_units - link_to_text_units --> document_outputs[Documents Table] - end - subgraph phase6[Phase 6: Network Visualization] - graph_outputs --> graph_embed[Graph Embedding] - graph_embed --> umap_entities[Umap Entities] - umap_entities --> combine_nodes[Final Entities] - end - subgraph phase7[Phase 7: Text Embeddings] + subgraph phase6[Phase 6: Text Embeddings] textUnits --> text_embed[Text Embedding] graph_outputs --> description_embed[Description Embedding] community_report_outputs --> content_embed[Content Embedding] @@ -60,9 +55,7 @@ flowchart TB The first phase of the default-configuration workflow is to transform input documents into _TextUnits_. A _TextUnit_ is a chunk of text that is used for our graph extraction techniques. They are also used as source-references by extracted knowledge items in order to empower breadcrumbs and provenance by concepts back to their original source text. -The chunk size (counted in tokens), is user-configurable. By default this is set to 300 tokens, although we've had positive experience with 1200-token chunks using a single "glean" step. (A "glean" step is a follow-on extraction). Larger chunks result in lower-fidelity output and less meaningful reference texts; however, using larger chunks can result in much faster processing time. - -The group-by configuration is also user-configurable. By default, we align our chunks to document boundaries, meaning that there is a strict 1-to-many relationship between Documents and TextUnits. In rare cases, this can be turned into a many-to-many relationship. This is useful when the documents are very short and we need several of them to compose a meaningful analysis unit (e.g. Tweets or a chat log) +The chunk size (counted in tokens), is user-configurable. By default this is set to 1200 tokens. Larger chunks result in lower-fidelity output and less meaningful reference texts; however, using larger chunks can result in much faster processing time. ```mermaid --- @@ -76,10 +69,30 @@ flowchart LR ``` -## Phase 2: Graph Extraction +## Phase 2: Document Processing + +In this phase of the workflow, we create the _Documents_ table for the knowledge model. Final documents are not used directly in GraphRAG, but this step links them to their constituent text units for provenance in your own applications. + +```mermaid +--- +title: Document Processing +--- +flowchart LR + aug[Augment] --> dp[Link to TextUnits] --> dg[Documents Table] +``` + +### Link to TextUnits + +In this step, we link each document to the text-units that were created in the first phase. This allows us to understand which documents are related to which text-units and vice-versa. + +### Documents Table + +At this point, we can export the **Documents** table into the knowledge Model. + +## Phase 3: Graph Extraction In this phase, we analyze each text unit and extract our graph primitives: _Entities_, _Relationships_, and _Claims_. -Entities and Relationships are extracted at once in our _entity_extract_ verb, and claims are extracted in our _claim_extract_ verb. Results are then combined and passed into following phases of the pipeline. +Entities and Relationships are extracted at once in our _extract_graph_ workflow, and claims are extracted in our _extract_claims_ workflow. Results are then combined and passed into following phases of the pipeline. ```mermaid --- @@ -90,9 +103,11 @@ flowchart LR tu --> ce[Claim Extraction] ``` +> Note: if you are using the [FastGraphRAG](https://microsoft.github.io/graphrag/index/methods/#fastgraphrag) option, entity and relationship extraction will be performed using NLP to conserve LLM resources, and claim extraction will always be skipped. + ### Entity & Relationship Extraction -In this first step of graph extraction, we process each text-unit in order to extract entities and relationships out of the raw text using the LLM. The output of this step is a subgraph-per-TextUnit containing a list of **entities** with a _title_, _type_, and _description_, and a list of **relationships** with a _source_, _target_, and _description_. +In this first step of graph extraction, we process each text-unit to extract entities and relationships out of the raw text using the LLM. The output of this step is a subgraph-per-TextUnit containing a list of **entities** with a _title_, _type_, and _description_, and a list of **relationships** with a _source_, _target_, and _description_. These subgraphs are merged together - any entities with the same _title_ and _type_ are merged by creating an array of their descriptions. Similarly, any relationships with the same _source_ and _target_ are merged by creating an array of their descriptions. @@ -106,9 +121,9 @@ Finally, as an independent workflow, we extract claims from the source TextUnits Note: claim extraction is _optional_ and turned off by default. This is because claim extraction generally requires prompt tuning to be useful. -## Phase 3: Graph Augmentation +## Phase 4: Graph Augmentation -Now that we have a usable graph of entities and relationships, we want to understand their community structure. These give us explicit ways of understanding the topological structure of our graph. +Now that we have a usable graph of entities and relationships, we want to understand their community structure. These give us explicit ways of understanding the organization of our graph. ```mermaid --- @@ -126,7 +141,7 @@ In this step, we generate a hierarchy of entity communities using the Hierarchic Once our graph augmentation steps are complete, the final **Entities**, **Relationships**, and **Communities** tables are exported. -## Phase 4: Community Summarization +## Phase 5: Community Summarization ```mermaid --- @@ -152,51 +167,7 @@ In this step, each _community report_ is then summarized via the LLM for shortha At this point, some bookkeeping work is performed and we export the **Community Reports** tables. -## Phase 5: Document Processing - -In this phase of the workflow, we create the _Documents_ table for the knowledge model. - -```mermaid ---- -title: Document Processing ---- -flowchart LR - aug[Augment] --> dp[Link to TextUnits] --> dg[Documents Table] -``` - -### Augment with Columns (CSV Only) - -If the workflow is operating on CSV data, you may configure your workflow to add additional fields to Documents output. These fields should exist on the incoming CSV tables. Details about configuring this can be found in the [configuration documentation](../config/overview.md). - -### Link to TextUnits - -In this step, we link each document to the text-units that were created in the first phase. This allows us to understand which documents are related to which text-units and vice-versa. - -### Documents Table - -At this point, we can export the **Documents** table into the knowledge Model. - -## Phase 6: Network Visualization (optional) - -In this phase of the workflow, we perform some steps to support network visualization of our high-dimensional vector spaces within our existing graphs. At this point there are two logical graphs at play: the _Entity-Relationship_ graph and the _Document_ graph. - -```mermaid ---- -title: Network Visualization Workflows ---- -flowchart LR - ag[Graph Table] --> ge[Node2Vec Graph Embedding] --> ne[Umap Entities] --> ng[Entities Table] -``` - -### Graph Embedding - -In this step, we generate a vector representation of our graph using the Node2Vec algorithm. This will allow us to understand the implicit structure of our graph and provide an additional vector-space in which to search for related concepts during our query phase. - -### Dimensionality Reduction - -For each of the logical graphs, we perform a UMAP dimensionality reduction to generate a 2D representation of the graph. This will allow us to visualize the graph in a 2D space and understand the relationships between the nodes in the graph. The UMAP embeddings are reduced to two dimensions as x/y coordinates. - -## Phase 7: Text Embedding +## Phase 6: Text Embedding For all artifacts that require downstream vector search, we generate text embeddings as a final step. These embeddings are written directly to a configured vector store. By default we embed entity descriptions, text unit text, and community report text. diff --git a/docs/index/inputs.md b/docs/index/inputs.md index af8a310825..458306bf49 100644 --- a/docs/index/inputs.md +++ b/docs/index/inputs.md @@ -18,11 +18,15 @@ Also see the [outputs](outputs.md) documentation for the final documents table s ## Bring-your-own DataFrame -As of version 2.6.0, GraphRAG's [indexing API method](https://github.com/microsoft/graphrag/blob/main/graphrag/api/index.py) allows you to pass in your own pandas DataFrame and bypass all of the input loading/parsing described in the next section. This is convenient if you have content in a format or storage location we don't support out-of-the-box. __You must ensure that your input DataFrame conforms to the schema described above.__ All of the chunking behavior described later will proceed exactly the same. +GraphRAG's [indexing API method](https://github.com/microsoft/graphrag/blob/main/graphrag/api/index.py) allows you to pass in your own pandas DataFrame and bypass all of the input loading/parsing described in the next section. This is convenient if you have content in a format or storage location we don't support out-of-the-box. _You must ensure that your input DataFrame conforms to the schema described above._ All of the chunking behavior described later will proceed exactly the same. + +## Custom File Handling + +We use an injectable InputReader provider class. This means you can implement any input file handling you want in a class that extends InputReader and register it with the InputReaderFactory. See the [architecture page](https://microsoft.github.io/graphrag/index/architecture/) for more info on our standard provider pattern. ## Formats -We support three file formats out-of-the-box. This covers the overwhelming majority of use cases we have encountered. If you have a different format, we recommend writing a script to convert to one of these, which are widely used and supported by many tools and libraries. +We support three file formats out-of-the-box. This covers the overwhelming majority of use cases we have encountered. If you have a different format, we recommend either implementing your own InputReader or writing a script to convert to one of these, which are widely used and supported by many tools and libraries. ### Plain Text @@ -40,7 +44,7 @@ JSON files (typically ending in a .json extension) contain [structured objects]( ## Metadata -With the structured file formats (CSV and JSON) you can configure any number of columns to be added to a persisted `metadata` field in the DataFrame. This is configured by supplying a list of columns name to collect. If this is configured, the output `metadata` column will have a dict containing a key for each column, and the value of the column for that document. This metadata can optionally be used later in the GraphRAG pipeline. +With the structured file formats (CSV and JSON) you can configure any number of columns to be added to a persisted `metadata` field in the DataFrame. This is configured by supplying a list of column names to collect. If this is configured, the output `metadata` column will have a dict containing a key for each column, and the value of the column for that document. This metadata can optionally be used later in the GraphRAG pipeline. ### Example @@ -68,7 +72,7 @@ Documents DataFrame ## Chunking and Metadata -As described on the [default dataflow](default_dataflow.md#phase-1-compose-textunits) page, documents are *chunked* into smaller "text units" for processing. This is done because document content size often exceeds the available context window for a given language model. There are a handful of settings you can adjust for this chunking, the most relevant being the `chunk_size` and `overlap`. We now also support a metadata processing scheme that can improve indexing results for some use cases. We will describe this feature in detail here. +As described on the [default dataflow](default_dataflow.md#phase-1-compose-textunits) page, documents are *chunked* into smaller "text units" for processing. This is done because document content size often exceeds the available context window for a given language model. There are a handful of settings you can adjust for this chunking, the most relevant being the `chunk_size` and `overlap`. We also support a metadata processing scheme that can improve indexing results for some use cases. We will describe this feature in detail here. Imagine the following scenario: you are indexing a collection of news articles. Each article text starts with a headline and author, and then proceeds with the content. When documents are chunked, they are split evenly according to your configured chunk size. In other words, the first *n* tokens are read into a text unit, and then the next *n*, until the end of the content. This means that front matter at the beginning of the document (such as the headline and author in this example) *is not copied to each chunk*. It only exists in the first chunk. When we later retrieve those chunks for summarization, they may therefore be missing shared information about the source document that should always be provided to the model. We have configuration options to copy repeated content into each text unit to address this issue. @@ -78,14 +82,13 @@ As described above, when documents are imported you can specify a list of `metad ### Chunking Config -Next, the `chunks` block needs to instruct the chunker how to handle this metadata when creating text units. By default, it is ignored. We have two settings to include it: +Next, the `chunks` block needs to instruct the chunker how to handle this metadata when creating text units. By default, it is ignored. We have the following setting to include it: - `prepend_metadata`. This instructs the importer to copy the contents of the `metadata` column for each row into the start of every single text chunk. This metadata is copied as key: value pairs on new lines. -- `chunk_size_includes_metadata`: This tells the chunker how to compute the chunk size when metadata is included. By default, we create the text units using your specified `chunk_size` *and then* prepend the metadata. This means that the final text unit lengths may be longer than your configured `chunk_size`, and it will vary based on the length of the metadata for each document. When this setting is `True`, we will compute the raw text using the remainder after measuring the metadata length so that the resulting text units always comply with your configured `chunk_size`. ### Examples -The following are several examples to help illustrate how chunking config and metadate prepending works for each file format. Note that we are using word count here as "tokens" for the illustration, but language model tokens are [not equivalent to words](https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them). +The following are several examples to help illustrate how chunking config and metadata prepending works for each file format. Note that we are using word count here as "tokens" for the illustration, but language model tokens are [not equivalent to words](https://help.openai.com/en/articles/4936856-what-are-tokens-and-how-to-count-them). #### Text files @@ -113,14 +116,13 @@ settings.yaml ```yaml input: - file_type: text + type: text metadata: [title] chunks: size: 100 overlap: 0 prepend_metadata: true - chunk_size_includes_metadata: false ``` Documents DataFrame @@ -158,54 +160,6 @@ US to lift most federal COVID-19 vaccine mandates,WASHINGTON (AP) The Biden admi NY lawmakers begin debating budget 1 month after due date,ALBANY, N.Y. (AP) New York lawmakers began voting Monday on a $229 billion state budget due a month ago that would raise the minimum wage, crack down on illicit pot shops and ban gas stoves and furnaces in new buildings. Negotiations among Gov. Kathy Hochul and her fellow Democrats in control of the Legislature dragged on past the April 1 budget deadline, largely because of disagreements over changes to the bail law and other policy proposals included in the spending plan. Floor debates on some budget bills began Monday. State Senate Majority Leader Andrea Stewart-Cousins said she expected voting to be wrapped up Tuesday for a budget she said contains "significant wins" for New Yorkers. "I would have liked to have done this sooner. I think we would all agree to that," Cousins told reporters before voting began. "This has been a very policy-laden budget and a lot of the policies had to parsed through." Hochul was able to push through a change to the bail law that will eliminate the standard that requires judges to prescribe the "least restrictive" means to ensure defendants return to court. Hochul said judges needed the extra discretion. Some liberal lawmakers argued that it would undercut the sweeping bail reforms approved in 2019 and result in more people with low incomes and people of color in pretrial detention. Here are some other policy provisions that will be included in the budget, according to state officials. The minimum wage would be raised to $17 in New York City and some of its suburbs and $16 in the rest of the state by 2026. That's up from $15 in the city and $14.20 upstate. --- - -settings.yaml - -```yaml -input: - file_type: csv - title_column: headline - text_column: article - metadata: [headline] - -chunks: - size: 50 - overlap: 5 - prepend_metadata: true - chunk_size_includes_metadata: true -``` - -Documents DataFrame - -| id | title | text | creation_date | metadata | -| --------------------- | --------------------------------------------------------- | ------------------------ | ----------------------------- | --------------------------------------------------------------------------- | -| (generated from text) | US to lift most federal COVID-19 vaccine mandates | (article column content) | (create date of articles.csv) | { "headline": "US to lift most federal COVID-19 vaccine mandates" } | -| (generated from text) | NY lawmakers begin debating budget 1 month after due date | (article column content) | (create date of articles.csv) | { "headline": "NY lawmakers begin debating budget 1 month after due date" } | - -Raw Text Chunks - -| content | length | -| ------- | ------: | -| title: US to lift most federal COVID-19 vaccine mandates
WASHINGTON (AP) The Biden administration will end most of the last remaining federal COVID-19 vaccine requirements next week when the national public health emergency for the coronavirus ends, the White House said Monday. Vaccine requirements for federal workers and federal contractors, | 50 | -| title: US to lift most federal COVID-19 vaccine mandates
federal workers and federal contractors as well as foreign air travelers to the U.S., will end May 11. The government is also beginning the process of lifting shot requirements for Head Start educators, healthcare workers, and noncitizens at U.S. land borders. | 50 | -| title: US to lift most federal COVID-19 vaccine mandates
noncitizens at U.S. land borders. The requirements are among the last vestiges of some of the more coercive measures taken by the federal government to promote vaccination as the deadly virus raged, and their end marks the latest display of how | 50 | -| title: US to lift most federal COVID-19 vaccine mandates
the latest display of how President Joe Biden's administration is moving to treat COVID-19 as a routine, endemic illness. "While I believe that these vaccine mandates had a tremendous beneficial impact, we are now at a point where we think that | 50 | -| title: US to lift most federal COVID-19 vaccine mandates
point where we think that it makes a lot of sense to pull these requirements down," White House COVID-19 coordinator Dr. Ashish Jha told The Associated Press on Monday. | 38 | -| title: NY lawmakers begin debating budget 1 month after due date
ALBANY, N.Y. (AP) New York lawmakers began voting Monday on a $229 billion state budget due a month ago that would raise the minimum wage, crack down on illicit pot shops and ban gas stoves and furnaces in new | 50 | -| title: NY lawmakers begin debating budget 1 month after due date
stoves and furnaces in new buildings. Negotiations among Gov. Kathy Hochul and her fellow Democrats in control of the Legislature dragged on past the April 1 budget deadline, largely because of disagreements over changes to the bail law and | 50 | -| title: NY lawmakers begin debating budget 1 month after due date
to the bail law and other policy proposals included in the spending plan. Floor debates on some budget bills began Monday. State Senate Majority Leader Andrea Stewart-Cousins said she expected voting to be wrapped up Tuesday for a budget | 50 | -|title: NY lawmakers begin debating budget 1 month after due date
up Tuesday for a budget she said contains "significant wins" for New Yorkers. "I would have liked to have done this sooner. I think we would all agree to that," Cousins told reporters before voting began. "This has been | 50 | -| title: NY lawmakers begin debating budget 1 month after due date
voting began. "This has been a very policy-laden budget and a lot of the policies had to parsed through." Hochul was able to push through a change to the bail law that will eliminate the standard that requires judges | 50 | -| title: NY lawmakers begin debating budget 1 month after due date
the standard that requires judges to prescribe the "least restrictive" means to ensure defendants return to court. Hochul said judges needed the extra discretion. Some liberal lawmakers argued that it would undercut the sweeping bail reforms approved in 2019 | 50 | -| title: NY lawmakers begin debating budget 1 month after due date
bail reforms approved in 2019 and result in more people with low incomes and people of color in pretrial detention. Here are some other policy provisions that will be included in the budget, according to state officials. The minimum | 50 | -| title: NY lawmakers begin debating budget 1 month after due date
to state officials. The minimum wage would be raised to $17 in be raised to $17 in New York City and some of its suburbs and $16 in the rest of the state by 2026. That's up from $15 | 50 | -| title: NY lawmakers begin debating budget 1 month after due date
2026. That's up from $15 in the city and $14.20 upstate. | 22 | - - -In this example we can see that the two input documents were parsed into fourteen output text chunks. The title (headline) of each document is prepended and included in the computed chunk size, so each chunk matches the configured chunk size (except the last one for each document). We've also configured some overlap in these text chunks, so the last five tokens are shared. Why would you use overlap in your text chunks? Consider that when you are splitting documents based on tokens, it is highly likely that sentences or even related concepts will be split into separate chunks. Each text chunk is processed separately by the language model, so this may result in incomplete "ideas" at the boundaries of the chunk. Overlap ensures that these split concepts are fully contained in at least one of the chunks. - - #### JSON files This final example uses a JSON file for each of the same two articles. In this example we'll set the object fields to read, but we will not add metadata to the text chunks. @@ -240,7 +194,7 @@ settings.yaml ```yaml input: - file_type: json + type: json title_column: headline text_column: content diff --git a/docs/index/methods.md b/docs/index/methods.md index 9da2c83d73..3c10cfb21d 100644 --- a/docs/index/methods.md +++ b/docs/index/methods.md @@ -13,7 +13,7 @@ This is the method described in the original [blog post](https://www.microsoft.c - claim extraction (optional): LLM is prompted to extract and describe claims from each text unit. - community report generation: entity and relationship descriptions (and optionally claims) for each community are collected and used to prompt the LLM to generate a summary report. -`graphrag index --method standard`. This is the default method, so the method param can actual be omitted. +`graphrag index --method standard`. This is the default method, so the method param can be omitted on the command line. ## FastGraphRAG @@ -23,7 +23,7 @@ FastGraphRAG is a method that substitutes some of the language model reasoning f - relationship extraction: relationships are defined as text unit co-occurrence between entity pairs. There is no description. - entity summarization: not necessary. - relationship summarization: not necessary. -- claim extraction (optional): unused. +- claim extraction: unused. - community report generation: The direct text unit content containing each entity noun phrase is collected and used to prompt the LLM to generate a summary report. `graphrag index --method fast` @@ -41,4 +41,4 @@ You can install it manually by running `python -m spacy download `, ## Choosing a Method -Standard GraphRAG provides a rich description of real-world entities and relationships, but is more expensive that FastGraphRAG. We estimate graph extraction to constitute roughly 75% of indexing cost. FastGraphRAG is therefore much cheaper, but the tradeoff is that the extracted graph is less directly relevant for use outside of GraphRAG, and the graph tends to be quite a bit noisier. If high fidelity entities and graph exploration are important to your use case, we recommend staying with traditional GraphRAG. If your use case is primarily aimed at summary questions using global search, FastGraphRAG provides high quality summarization at much less LLM cost. +Standard GraphRAG provides a rich description of real-world entities and relationships, but is more expensive than FastGraphRAG. We estimate graph extraction to constitute roughly 75% of indexing cost. FastGraphRAG is therefore much cheaper, but the tradeoff is that the extracted graph is less directly relevant for use outside of GraphRAG, and the graph tends to be quite a bit noisier. If high fidelity entities and graph exploration are important to your use case, we recommend staying with traditional GraphRAG. If your use case is primarily aimed at summary questions using global search, FastGraphRAG provides high quality summarization with much lower language model cost. diff --git a/docs/index/outputs.md b/docs/index/outputs.md index add60182b1..89a48e8526 100644 --- a/docs/index/outputs.md +++ b/docs/index/outputs.md @@ -82,8 +82,6 @@ List of all entities found in the data by the LM. | text_unit_ids | str[] | List of the text units containing the entity. | | frequency | int | Count of text units the entity was found within. | | degree | int | Node degree (connectedness) in the graph. | -| x | float | X position of the node for visual layouts. If graph embeddings and UMAP are not turned on, this will be 0. | -| y | float | Y position of the node for visual layouts. If graph embeddings and UMAP are not turned on, this will be 0. | ## relationships List of all entity-to-entity relationships found in the data by the LM. This is also the _edge list_ for the graph. @@ -104,7 +102,7 @@ List of all text chunks parsed from the input documents. | ----------------- | ----- | ----------- | | text | str | Raw full text of the chunk. | | n_tokens | int | Number of tokens in the chunk. This should normally match the `chunk_size` config parameter, except for the last chunk which is often shorter. | -| document_ids | str[] | List of document IDs the chunk came from. This is normally only 1 due to our default groupby, but for very short text documents (e.g., microblogs) it can be configured so text units span multiple documents. | +| document_id | str | ID of the document the chunk came from. | | entity_ids | str[] | List of entities found in the text unit. | | relationships_ids | str[] | List of relationships found in the text unit. | | covariate_ids | str[] | Optional list of covariates found in the text unit. | \ No newline at end of file diff --git a/docs/index/overview.md b/docs/index/overview.md index 550909f6a2..d3974cc645 100644 --- a/docs/index/overview.md +++ b/docs/index/overview.md @@ -7,8 +7,7 @@ Indexing Pipelines are configurable. They are composed of workflows, standard an - extract entities, relationships and claims from raw text - perform community detection in entities - generate community summaries and reports at multiple levels of granularity -- embed entities into a graph vector space -- embed text chunks into a textual vector space +- embed text into a vector space The outputs of the pipeline are stored as Parquet tables by default, and embeddings are written to your configured vector store. diff --git a/docs/prompt_tuning/auto_prompt_tuning.md b/docs/prompt_tuning/auto_prompt_tuning.md index 31375db3da..eb77044cd5 100644 --- a/docs/prompt_tuning/auto_prompt_tuning.md +++ b/docs/prompt_tuning/auto_prompt_tuning.md @@ -1,8 +1,8 @@ # Auto Prompt Tuning ⚙️ -GraphRAG provides the ability to create domain adapted prompts for the generation of the knowledge graph. This step is optional, though it is highly encouraged to run it as it will yield better results when executing an Index Run. +GraphRAG provides the ability to create domain-adapted prompts for the generation of the knowledge graph. This step is optional, though it is highly encouraged to run it as it will yield better results when executing an Index Run. -These are generated by loading the inputs, splitting them into chunks (text units) and then running a series of LLM invocations and template substitutions to generate the final prompts. We suggest using the default values provided by the script, but in this page you'll find the detail of each in case you want to further explore and tweak the prompt tuning algorithm. +These are generated by loading the inputs, splitting them into chunks (text units) and then running a series of LLM invocations and template substitutions to generate the final prompts. We suggest using the default values provided by the script, but in this page you'll find the details of each in case you want to further explore and tweak the prompt tuning algorithm.

Figure 1: Auto Tuning Conceptual Diagram. @@ -20,16 +20,14 @@ Before running auto tuning, ensure you have already initialized your workspace w You can run the main script from the command line with various options: ```bash -graphrag prompt-tune [--root ROOT] [--config CONFIG] [--domain DOMAIN] [--selection-method METHOD] [--limit LIMIT] [--language LANGUAGE] \ +graphrag prompt-tune [--root ROOT] [--domain DOMAIN] [--selection-method METHOD] [--limit LIMIT] [--language LANGUAGE] \ [--max-tokens MAX_TOKENS] [--chunk-size CHUNK_SIZE] [--n-subset-max N_SUBSET_MAX] [--k K] \ [--min-examples-required MIN_EXAMPLES_REQUIRED] [--discover-entity-types] [--output OUTPUT] ``` ## Command-Line Options -- `--config` (required): The path to the configuration file. This is required to load the data and model settings. - -- `--root` (optional): The data project root directory, including the config files (YML, JSON, or .env). Defaults to the current directory. +- `--root` (optional): Path to the project directory that contains the config file (settings.yaml). Defaults to the current directory. - `--domain` (optional): The domain related to your input data, such as 'space science', 'microbiology', or 'environmental news'. If left empty, the domain will be inferred from the input data. @@ -56,7 +54,7 @@ graphrag prompt-tune [--root ROOT] [--config CONFIG] [--domain DOMAIN] [--selec ## Example Usage ```bash -python -m graphrag prompt-tune --root /path/to/project --config /path/to/settings.yaml --domain "environmental news" \ +python -m graphrag prompt-tune --root /path/to/project --domain "environmental news" \ --selection-method random --limit 10 --language English --max-tokens 2048 --chunk-size 256 --min-examples-required 3 \ --no-discover-entity-types --output /path/to/output ``` @@ -64,7 +62,7 @@ python -m graphrag prompt-tune --root /path/to/project --config /path/to/setting or, with minimal configuration (suggested): ```bash -python -m graphrag prompt-tune --root /path/to/project --config /path/to/settings.yaml --no-discover-entity-types +python -m graphrag prompt-tune --root /path/to/project --no-discover-entity-types ``` ## Document Selection Methods @@ -73,17 +71,17 @@ The auto tuning feature ingests the input data and then divides it into text uni After that, it uses one of the following selection methods to pick a sample to work with for prompt generation: - `random`: Select text units randomly. This is the default and recommended option. -- `top`: Select the head n text units. +- `top`: Select the head _n_ text units. - `all`: Use all text units for the generation. Use only with small datasets; this option is not usually recommended. -- `auto`: Embed text units in a lower-dimensional space and select the k nearest neighbors to the centroid. This is useful when you have a large dataset and want to select a representative sample. +- `auto`: Embed text units in a lower-dimensional space and select the _k_ nearest neighbors to the centroid. This is useful when you have a large dataset and want to select a representative sample. -## Modify Env Vars +## Modify Config After running auto tuning, you should modify the following config variables to pick up the new prompts on your index run. Note: Please make sure to update the correct path to the generated prompts, in this example we are using the default "prompts" path. ```yaml -entity_extraction: - prompt: "prompts/entity_extraction.txt" +extract_graph: + prompt: "prompts/extract_graph.txt" summarize_descriptions: prompt: "prompts/summarize_descriptions.txt" diff --git a/docs/prompt_tuning/overview.md b/docs/prompt_tuning/overview.md index a12cebb257..e8518f6b21 100644 --- a/docs/prompt_tuning/overview.md +++ b/docs/prompt_tuning/overview.md @@ -8,8 +8,8 @@ The default prompts are the simplest way to get started with the GraphRAG system ## Auto Tuning -Auto Tuning leverages your input data and LLM interactions to create domain adapted prompts for the generation of the knowledge graph. It is highly encouraged to run it as it will yield better results when executing an Index Run. For more details about how to use it, please refer to the [Auto Tuning](auto_prompt_tuning.md) documentation. +Auto Tuning leverages your input data and LLM interactions to create domain-adapted prompts for the generation of the knowledge graph. It is highly encouraged to run it as it will yield better results when executing an Index Run. For more details about how to use it, please refer to the [Auto Tuning](auto_prompt_tuning.md) page. ## Manual Tuning -Manual tuning is an advanced use-case. Most users will want to use the Auto Tuning feature instead. Details about how to use manual configuration are available in the [manual tuning](manual_prompt_tuning.md) documentation. +Manual tuning is an advanced use-case. Most users will want to use the Auto Tuning feature instead. Details about how to use manual configuration are available in the [manual tuning](manual_prompt_tuning.md) page. diff --git a/docs/query/drift_search.md b/docs/query/drift_search.md index e3d9ddc021..80c0607330 100644 --- a/docs/query/drift_search.md +++ b/docs/query/drift_search.md @@ -21,7 +21,7 @@ DRIFT Search introduces a new approach to local search queries by including comm Below are the key parameters of the [DRIFTSearch class](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/drift_search/search.py): -- `llm`: OpenAI model object to be used for response generation +* `model`: Language model chat completion object to be used for response generation - `context_builder`: [context builder](https://github.com/microsoft/graphrag/blob/main/graphrag/query/structured_search/drift_search/drift_context.py) object to be used for preparing context data from community reports and query information - `config`: model to define the DRIFT Search hyperparameters. [DRIFT Config model](https://github.com/microsoft/graphrag/blob/main/graphrag/config/models/drift_search_config.py) - `tokenizer`: token encoder for tracking the budget for the algorithm. diff --git a/docs/query/global_search.md b/docs/query/global_search.md index a9685d70be..da453dbe66 100644 --- a/docs/query/global_search.md +++ b/docs/query/global_search.md @@ -54,7 +54,7 @@ The quality of the global search’s response can be heavily influenced by the l Below are the key parameters of the [GlobalSearch class](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/search.py): -* `llm`: OpenAI model object to be used for response generation +* `model`: Language model chat completion object to be used for response generation * `context_builder`: [context builder](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/global_search/community_context.py) object to be used for preparing context data from community reports * `map_system_prompt`: prompt template used in the `map` stage. Default template can be found at [map_system_prompt](https://github.com/microsoft/graphrag/blob/main//graphrag/prompts/query/global_search_map_system_prompt.py) * `reduce_system_prompt`: prompt template used in the `reduce` stage, default template can be found at [reduce_system_prompt](https://github.com/microsoft/graphrag/blob/main//graphrag/prompts/query/global_search_reduce_system_prompt.py) diff --git a/docs/query/local_search.md b/docs/query/local_search.md index bf0f43e3ce..2cd77e640e 100644 --- a/docs/query/local_search.md +++ b/docs/query/local_search.md @@ -48,7 +48,7 @@ Given a user query and, optionally, the conversation history, the local search m Below are the key parameters of the [LocalSearch class](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/search.py): -* `llm`: OpenAI model object to be used for response generation +* `model`: Language model chat completion object to be used for response generation * `context_builder`: [context builder](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/mixed_context.py) object to be used for preparing context data from collections of knowledge model objects * `system_prompt`: prompt template used to generate the search response. Default template can be found at [system_prompt](https://github.com/microsoft/graphrag/blob/main//graphrag/prompts/query/local_search_system_prompt.py) * `response_type`: free-form text describing the desired response type and format (e.g., `Multiple Paragraphs`, `Multi-Page Report`) diff --git a/docs/query/multi_index_search.md b/docs/query/multi_index_search.md deleted file mode 100644 index 6b6ff2b41a..0000000000 --- a/docs/query/multi_index_search.md +++ /dev/null @@ -1,20 +0,0 @@ -# Multi Index Search 🔎 - -## Multi Dataset Reasoning - -GraphRAG takes in unstructured data contained in text documents and uses large languages models to “read” the documents in a targeted fashion and create a knowledge graph. This knowledge graph, or index, contains information about specific entities in the data, how the entities relate to one another, and high-level reports about communities and topics found in the data. Indexes can be searched by users to get meaningful information about the underlying data, including reports with citations that point back to the original unstructured text. - -Multi-index search is a new capability that has been added to the GraphRAG python library to query multiple knowledge stores at once. Multi-index search allows for many new search scenarios, including: - -- Combining knowledge from different domains – Many documents contain similar types of entities: person, place, thing. But GraphRAG can be tuned for highly specialized domains, such as science and engineering. With the recent updates to search, GraphRAG can now simultaneously query multiple datasets with completely different schemas and entity definitions. - -- Combining knowledge with different access levels – Not all datasets are accessible to all people, even within an organization. Some datasets are publicly available. Some datasets, such as internal financial information or intellectual property, may only be accessible by a small number of employees at a company. Multi-index search allows multiple sources with different access controls to be queried at the same time, creating more nuanced and informative reports. Internal R&D findings can be seamlessly combined with open-source scientific publications. - -- Combining knowledge in different locations – With multi-index search, indexes do not need to be in the same location or type of storage to be queried. Indexes in the cloud in Azure Storage can be queried at the same time as indexes stored on a personal computer. Multi-index search makes these types of data joins easy and accessible. - -To search across multiple datasets, the underlying contexts from each index, based on the user query, are combined in-memory at query time, saving on computation and allowing the joint querying of indexes that can’t be joined inherently, either do access controls or differing schemas. Multi-index search automatically keeps track of provenance information, so that any references can be traced back to the correct indexes and correct original documents. - - -## How to Use - -An example of a global search scenario can be found in the following [notebook](../examples_notebooks/multi_index_search.ipynb). \ No newline at end of file diff --git a/docs/query/overview.md b/docs/query/overview.md index dd375b8b41..bf2b612642 100644 --- a/docs/query/overview.md +++ b/docs/query/overview.md @@ -1,34 +1,35 @@ # Query Engine 🔎 -The Query Engine is the retrieval module of the Graph RAG Library. It is one of the two main components of the Graph RAG library, the other being the Indexing Pipeline (see [Indexing Pipeline](../index/overview.md)). +The Query Engine is the retrieval module of the GraphRAG library, and operates over completed [indexes](../index/overview.md). It is responsible for the following tasks: - [Local Search](#local-search) - [Global Search](#global-search) - [DRIFT Search](#drift-search) +- Basic Search - [Question Generation](#question-generation) ## Local Search -Local search method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?). +Local search generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?). -For more details about how Local Search works please refer to the [Local Search](local_search.md) documentation. +For more details about how Local Search works please refer to the [Local Search](local_search.md) page. ## Global Search -Global search method generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole (e.g. What are the most significant values of the herbs mentioned in this notebook?). +Global search generates answers by searching over all AI-generated community reports in a map-reduce fashion. This is a resource-intensive method, but often gives good responses for questions that require an understanding of the dataset as a whole (e.g. What are the most significant values of the herbs mentioned in this notebook?). -More about this can be checked at the [Global Search](global_search.md) documentation. +More about this is provided on the [Global Search](global_search.md) page. ## DRIFT Search -DRIFT Search introduces a new approach to local search queries by including community information in the search process. This greatly expands the breadth of the query’s starting point and leads to retrieval and usage of a far higher variety of facts in the final answer. This addition expands the GraphRAG query engine by providing a more comprehensive option for local search, which uses community insights to refine a query into detailed follow-up questions. +DRIFT Search introduces a new approach to local search queries by including community information in the search process. This greatly expands the breadth of the query’s starting point and leads to retrieval and usage of a far higher variety of facts in the final answer. This expands the GraphRAG query engine by providing a more comprehensive option for local search, which uses community insights to refine a query into detailed follow-up questions. -To learn more about DRIFT Search, please refer to the [DRIFT Search](drift_search.md) documentation. +To learn more about DRIFT Search, please refer to the [DRIFT Search](drift_search.md) page. ## Basic Search -GraphRAG includes a rudimentary implementation of basic vector RAG to make it easy to compare different search results based on the type of question you are asking. You can specify the top `k` txt unit chunks to include in the summarization context. +GraphRAG includes a rudimentary implementation of basic vector RAG to make it easy to compare different search results based on the type of question you are asking. You can specify the top `k` text unit chunks to include in the summarization context. ## Question Generation diff --git a/docs/query/question_generation.md b/docs/query/question_generation.md index 525a465499..6f5da81e5d 100644 --- a/docs/query/question_generation.md +++ b/docs/query/question_generation.md @@ -11,7 +11,7 @@ Given a list of prior user questions, the question generation method uses the sa Below are the key parameters of the [Question Generation class](https://github.com/microsoft/graphrag/blob/main//graphrag/query/question_gen/local_gen.py): -* `llm`: OpenAI model object to be used for response generation +* `model`: Language model chat completion object to be used for response generation * `context_builder`: [context builder](https://github.com/microsoft/graphrag/blob/main//graphrag/query/structured_search/local_search/mixed_context.py) object to be used for preparing context data from collections of knowledge model objects, using the same context builder class as in local search * `system_prompt`: prompt template used to generate candidate questions. Default template can be found at [system_prompt](https://github.com/microsoft/graphrag/blob/main//graphrag/prompts/query/question_gen_system_prompt.py) * `llm_params`: a dictionary of additional parameters (e.g., temperature, max_tokens) to be passed to the LLM call diff --git a/docs/visualization_guide.md b/docs/visualization_guide.md index d09319e74d..14b4dbe55f 100644 --- a/docs/visualization_guide.md +++ b/docs/visualization_guide.md @@ -8,13 +8,6 @@ Before building an index, please review your `settings.yaml` configuration file snapshots: graphml: true ``` -(Optional) To support other visualization tools and exploration, additional parameters can be enabled that provide access to vector embeddings. -```yaml -embed_graph: - enabled: true # will generate node2vec embeddings for nodes -umap: - enabled: true # will generate UMAP embeddings for nodes, giving the entities table an x/y position to plot -``` After running the indexing pipeline over your data, there will be an output folder (defined by the `storage.base_dir` setting). - **Output Folder**: Contains artifacts from the LLM’s indexing pass. diff --git a/examples_notebooks/community_contrib/README.md b/examples_notebooks/community_contrib/README.md deleted file mode 100644 index 0915dc1a60..0000000000 --- a/examples_notebooks/community_contrib/README.md +++ /dev/null @@ -1,5 +0,0 @@ -## Disclaimer - -This folder contains community contributed notebooks that are not officially supported by the GraphRAG team. The notebooks are provided as-is and are not guaranteed to work with the latest version of GraphRAG. If you have any questions or issues, please reach out to the author of the notebook directly. - -For more information on how to contribute to the GraphRAG project, please refer to the [contribution guidelines](https://github.com/microsoft/graphrag/blob/main/CONTRIBUTING.md) diff --git a/examples_notebooks/community_contrib/neo4j/graphrag_import_neo4j_cypher.ipynb b/examples_notebooks/community_contrib/neo4j/graphrag_import_neo4j_cypher.ipynb deleted file mode 100644 index a8b30a819b..0000000000 --- a/examples_notebooks/community_contrib/neo4j/graphrag_import_neo4j_cypher.ipynb +++ /dev/null @@ -1,1215 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "b4fea928", - "metadata": {}, - "outputs": [], - "source": [ - "# Copyright (c) 2024 Microsoft Corporation.\n", - "# Licensed under the MIT License." - ] - }, - { - "cell_type": "markdown", - "id": "0c4bc9ba", - "metadata": {}, - "source": [ - "# Neo4j Import of GraphRAG Result Parquet files\n", - "\n", - "This notebook imports the results of the GraphRAG indexing process into the Neo4j Graph database for further processing, analysis or visualization. \n", - "\n", - "You can also build your own GenAI applications using Neo4j and a number of RAG strategies with LangChain, LlamaIndex, Haystack, and many other frameworks.\n", - "See: https://neo4j.com/labs/genai-ecosystem\n", - "\n", - "Here is what the end result looks like:\n", - "\n", - "![](https://dev.assets.neo4j.com/wp-content/uploads/graphrag-neo4j-visualization.png)" - ] - }, - { - "cell_type": "markdown", - "id": "3924e246", - "metadata": {}, - "source": [ - "## How does it work?\n", - "\n", - "The notebook loads the parquet files from the `output` folder of your indexing process and loads them into Pandas dataframes.\n", - "It then uses a batching approach to send a slice of the data into Neo4j to create nodes and relationships and add relevant properties. The id-arrays on most entities are turned into relationships. \n", - "\n", - "All operations use MERGE, so they are idempotent, and you can run the script multiple times.\n", - "\n", - "If you need to clean out the database, you can run the following statement\n", - "\n", - "```cypher\n", - "MATCH (n)\n", - "CALL { WITH n DETACH DELETE n } IN TRANSACTIONS OF 25000 ROWS;\n", - "```" - ] - }, - { - "cell_type": "code", - "execution_count": 59, - "id": "adca1803", - "metadata": {}, - "outputs": [], - "source": [ - "GRAPHRAG_FOLDER = \"PATH_TO_OUTPUT/artifacts\"" - ] - }, - { - "cell_type": "markdown", - "id": "7fb27b941602401d91542211134fc71a", - "metadata": {}, - "source": [ - "### Depedendencies\n", - "\n", - "We only need Pandas and the neo4j Python driver with the rust extension for faster network transport." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b57beec0", - "metadata": {}, - "outputs": [], - "source": [ - "%pip install --quiet pandas neo4j-rust-ext" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "id": "3eeee95f-e4f2-4052-94fb-a5dc8ab542ae", - "metadata": {}, - "outputs": [], - "source": [ - "import time\n", - "\n", - "import pandas as pd\n", - "from neo4j import GraphDatabase" - ] - }, - { - "cell_type": "markdown", - "id": "307dd2f4", - "metadata": {}, - "source": [ - "## Neo4j Installation\n", - "\n", - "You can create a free instance of Neo4j [online](https://console.neo4j.io). You get a credentials file that you can use for the connection credentials. You can also get an instance in any of the cloud marketplaces.\n", - "\n", - "If you want to install Neo4j locally either use [Neo4j Desktop](https://neo4j.com/download) or \n", - "the official Docker image: `docker run -e NEO4J_AUTH=neo4j/password -p 7687:7687 -p 7474:7474 neo4j` " - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "id": "b6c15443-4acb-4f91-88ea-4e08abaa4c29", - "metadata": {}, - "outputs": [], - "source": [ - "NEO4J_URI = \"neo4j://localhost\" # or neo4j+s://xxxx.databases.neo4j.io\n", - "NEO4J_USERNAME = \"neo4j\"\n", - "NEO4J_PASSWORD = \"\" # your password\n", - "NEO4J_DATABASE = \"neo4j\"\n", - "\n", - "# Create a Neo4j driver\n", - "driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USERNAME, NEO4J_PASSWORD))" - ] - }, - { - "cell_type": "markdown", - "id": "70f37ab6", - "metadata": {}, - "source": [ - "## Batched Import\n", - "\n", - "The batched import function takes a Cypher insert statement (needs to use the variable `value` for the row) and a dataframe to import.\n", - "It will send by default 1k rows at a time as query parameter to the database to be inserted." - ] - }, - { - "cell_type": "code", - "execution_count": 63, - "id": "d787bf7b-ac9b-4bfb-b140-a50a3fd205c5", - "metadata": {}, - "outputs": [], - "source": [ - "def batched_import(statement, df, batch_size=1000):\n", - " \"\"\"\n", - " Import a dataframe into Neo4j using a batched approach.\n", - "\n", - " Parameters: statement is the Cypher query to execute, df is the dataframe to import, and batch_size is the number of rows to import in each batch.\n", - " \"\"\"\n", - " total = len(df)\n", - " start_s = time.time()\n", - " for start in range(0, total, batch_size):\n", - " batch = df.iloc[start : min(start + batch_size, total)]\n", - " result = driver.execute_query(\n", - " \"UNWIND $rows AS value \" + statement,\n", - " rows=batch.to_dict(\"records\"),\n", - " database_=NEO4J_DATABASE,\n", - " )\n", - " print(result.summary.counters)\n", - " print(f\"{total} rows in {time.time() - start_s} s.\")\n", - " return total" - ] - }, - { - "cell_type": "markdown", - "id": "0fb45f42", - "metadata": {}, - "source": [ - "## Indexes and Constraints\n", - "\n", - "Indexes in Neo4j are only used to find the starting points for graph queries, e.g. quickly finding two nodes to connect.\n", - "Constraints exist to avoid duplicates, we create them mostly on id's of Entity types.\n", - "\n", - "We use some Types as markers with two underscores before and after to distinguish them from the actual entity types.\n", - "\n", - "The default relationship type here is `RELATED` but we could also infer a real relationship-type from the description or the types of the start and end-nodes.\n", - "\n", - "* `__Entity__`\n", - "* `__Document__`\n", - "* `__Chunk__`\n", - "* `__Community__`\n", - "* `__Covariate__`" - ] - }, - { - "cell_type": "code", - "execution_count": 64, - "id": "ed7f212e-9148-424c-adc6-d81db9f8e5a5", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "create constraint chunk_id if not exists for (c:__Chunk__) require c.id is unique\n", - "\n", - "create constraint document_id if not exists for (d:__Document__) require d.id is unique\n", - "\n", - "create constraint entity_id if not exists for (c:__Community__) require c.community is unique\n", - "\n", - "create constraint entity_id if not exists for (e:__Entity__) require e.id is unique\n", - "\n", - "create constraint entity_title if not exists for (e:__Entity__) require e.name is unique\n", - "\n", - "create constraint entity_title if not exists for (e:__Covariate__) require e.title is unique\n", - "\n", - "create constraint related_id if not exists for ()-[rel:RELATED]->() require rel.id is unique\n" - ] - } - ], - "source": [ - "# create constraints, idempotent operation\n", - "\n", - "statements = [\n", - " \"\\ncreate constraint chunk_id if not exists for (c:__Chunk__) require c.id is unique\",\n", - " \"\\ncreate constraint document_id if not exists for (d:__Document__) require d.id is unique\",\n", - " \"\\ncreate constraint entity_id if not exists for (c:__Community__) require c.community is unique\",\n", - " \"\\ncreate constraint entity_id if not exists for (e:__Entity__) require e.id is unique\",\n", - " \"\\ncreate constraint entity_title if not exists for (e:__Entity__) require e.name is unique\",\n", - " \"\\ncreate constraint entity_title if not exists for (e:__Covariate__) require e.title is unique\",\n", - " \"\\ncreate constraint related_id if not exists for ()-[rel:RELATED]->() require rel.id is unique\",\n", - " \"\\n\",\n", - "]\n", - "\n", - "for statement in statements:\n", - " if len((statement or \"\").strip()) > 0:\n", - " print(statement)\n", - " driver.execute_query(statement)" - ] - }, - { - "cell_type": "markdown", - "id": "beea073b", - "metadata": {}, - "source": [ - "## Import Process\n", - "\n", - "### Importing the Documents\n", - "\n", - "We're loading the parquet file for the documents and create nodes with their ids and add the title property.\n", - "We don't need to store text_unit_ids as we can create the relationships and the text content is also contained in the chunks." - ] - }, - { - "cell_type": "code", - "execution_count": 65, - "id": "1ba023e7", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "

" - ], - "text/plain": [ - " id title\n", - "0 c305886e4aa2f6efcf64b57762777055 book.txt" - ] - }, - "execution_count": 65, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "doc_df = pd.read_parquet(\n", - " f\"{GRAPHRAG_FOLDER}/documents.parquet\", columns=[\"id\", \"title\"]\n", - ")\n", - "doc_df.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 66, - "id": "96391c15", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'_contains_updates': True, 'labels_added': 1, 'nodes_created': 1, 'properties_set': 2}\n", - "1 rows in 0.05211496353149414 s.\n" - ] - }, - { - "data": { - "text/plain": [ - "1" - ] - }, - "execution_count": 66, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Import documents\n", - "statement = \"\"\"\n", - "MERGE (d:__Document__ {id:value.id})\n", - "SET d += value {.title}\n", - "\"\"\"\n", - "\n", - "batched_import(statement, doc_df)" - ] - }, - { - "cell_type": "markdown", - "id": "f97bbadb", - "metadata": {}, - "source": [ - "### Loading Text Units\n", - "\n", - "We load the text units, create a node per id and set the text and number of tokens.\n", - "Then we connect them to the documents that we created before." - ] - }, - { - "cell_type": "code", - "execution_count": 67, - "id": "0d825626", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idtextn_tokensdocument_ids
0680dd6d2a970a49082fa4f34bf63a34eThe Project Gutenberg eBook of A Christmas Ca...300[c305886e4aa2f6efcf64b57762777055]
195f1f8f5bdbf0bee3a2c6f2f4a4907f6THE PROJECT GUTENBERG EBOOK A CHRISTMAS CAROL...300[c305886e4aa2f6efcf64b57762777055]
\n", - "
" - ], - "text/plain": [ - " id \\\n", - "0 680dd6d2a970a49082fa4f34bf63a34e \n", - "1 95f1f8f5bdbf0bee3a2c6f2f4a4907f6 \n", - "\n", - " text n_tokens \\\n", - "0 The Project Gutenberg eBook of A Christmas Ca... 300 \n", - "1 THE PROJECT GUTENBERG EBOOK A CHRISTMAS CAROL... 300 \n", - "\n", - " document_ids \n", - "0 [c305886e4aa2f6efcf64b57762777055] \n", - "1 [c305886e4aa2f6efcf64b57762777055] " - ] - }, - "execution_count": 67, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text_df = pd.read_parquet(\n", - " f\"{GRAPHRAG_FOLDER}/text_units.parquet\",\n", - " columns=[\"id\", \"text\", \"n_tokens\", \"document_ids\"],\n", - ")\n", - "text_df.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 68, - "id": "ffd3d380-8710-46f5-b90a-04ed8482192c", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'_contains_updates': True, 'relationships_created': 231, 'properties_set': 462}\n", - "231 rows in 0.05993008613586426 s.\n" - ] - }, - { - "data": { - "text/plain": [ - "231" - ] - }, - "execution_count": 68, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "statement = \"\"\"\n", - "MERGE (c:__Chunk__ {id:value.id})\n", - "SET c += value {.text, .n_tokens}\n", - "WITH c, value\n", - "UNWIND value.document_ids AS document\n", - "MATCH (d:__Document__ {id:document})\n", - "MERGE (c)-[:PART_OF]->(d)\n", - "\"\"\"\n", - "\n", - "batched_import(statement, text_df)" - ] - }, - { - "cell_type": "markdown", - "id": "f01b2094", - "metadata": {}, - "source": [ - "### Loading Nodes\n", - "\n", - "For the nodes we store id, name, description, embedding (if available), human readable id." - ] - }, - { - "cell_type": "code", - "execution_count": 78, - "id": "2392f9e9", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nametypedescriptionhuman_readable_ididdescription_embeddingtext_unit_ids
0\"PROJECT GUTENBERG\"\"ORGANIZATION\"Project Gutenberg is a pioneering organization...0b45241d70f0e43fca764df95b2b81f77[-0.020793898031115532, 0.02951139025390148, 0...[01e84646075b255eab0a34d872336a89, 10bab8e9773...
1\"UNITED STATES\"\"GEO\"The United States is prominently recognized fo...14119fd06010c494caa07f439b333f4c5[-0.009704762138426304, 0.013335365802049637, ...[01e84646075b255eab0a34d872336a89, 28f242c4515...
\n", - "
" - ], - "text/plain": [ - " name type \\\n", - "0 \"PROJECT GUTENBERG\" \"ORGANIZATION\" \n", - "1 \"UNITED STATES\" \"GEO\" \n", - "\n", - " description human_readable_id \\\n", - "0 Project Gutenberg is a pioneering organization... 0 \n", - "1 The United States is prominently recognized fo... 1 \n", - "\n", - " id \\\n", - "0 b45241d70f0e43fca764df95b2b81f77 \n", - "1 4119fd06010c494caa07f439b333f4c5 \n", - "\n", - " description_embedding \\\n", - "0 [-0.020793898031115532, 0.02951139025390148, 0... \n", - "1 [-0.009704762138426304, 0.013335365802049637, ... \n", - "\n", - " text_unit_ids \n", - "0 [01e84646075b255eab0a34d872336a89, 10bab8e9773... \n", - "1 [01e84646075b255eab0a34d872336a89, 28f242c4515... " - ] - }, - "execution_count": 78, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "entity_df = pd.read_parquet(\n", - " f\"{GRAPHRAG_FOLDER}/entities.parquet\",\n", - " columns=[\n", - " \"name\",\n", - " \"type\",\n", - " \"description\",\n", - " \"human_readable_id\",\n", - " \"id\",\n", - " \"description_embedding\",\n", - " \"text_unit_ids\",\n", - " ],\n", - ")\n", - "entity_df.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 81, - "id": "1d038114-0714-48ee-a48a-c421cd539661", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'_contains_updates': True, 'properties_set': 831}\n", - "277 rows in 0.6978070735931396 s.\n" - ] - }, - { - "data": { - "text/plain": [ - "277" - ] - }, - "execution_count": 81, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "entity_statement = \"\"\"\n", - "MERGE (e:__Entity__ {id:value.id})\n", - "SET e += value {.human_readable_id, .description, name:replace(value.name,'\"','')}\n", - "WITH e, value\n", - "CALL db.create.setNodeVectorProperty(e, \"description_embedding\", value.description_embedding)\n", - "CALL apoc.create.addLabels(e, case when coalesce(value.type,\"\") = \"\" then [] else [apoc.text.upperCamelCase(replace(value.type,'\"',''))] end) yield node\n", - "UNWIND value.text_unit_ids AS text_unit\n", - "MATCH (c:__Chunk__ {id:text_unit})\n", - "MERGE (c)-[:HAS_ENTITY]->(e)\n", - "\"\"\"\n", - "\n", - "batched_import(entity_statement, entity_df)" - ] - }, - { - "cell_type": "markdown", - "id": "018d4f87", - "metadata": {}, - "source": [ - "### Import Relationships\n", - "\n", - "For the relationships we find the source and target node by name, using the base `__Entity__` type.\n", - "After creating the `RELATED` relationships, we set the description as attribute." - ] - }, - { - "cell_type": "code", - "execution_count": 71, - "id": "b347a047", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
sourcetargetidrankweighthuman_readable_iddescriptiontext_unit_ids
0\"PROJECT GUTENBERG\"\"A CHRISTMAS CAROL\"b84d71ed9c3b45819eb3205fd28e13a0201.00\"Project Gutenberg is responsible for releasin...[680dd6d2a970a49082fa4f34bf63a34e]
1\"PROJECT GUTENBERG\"\"SUZANNE SHELL\"b0b464bc92a541e48547fe9738378dab151.01\"Suzanne Shell produced the eBook version of '...[680dd6d2a970a49082fa4f34bf63a34e]
\n", - "
" - ], - "text/plain": [ - " source target id \\\n", - "0 \"PROJECT GUTENBERG\" \"A CHRISTMAS CAROL\" b84d71ed9c3b45819eb3205fd28e13a0 \n", - "1 \"PROJECT GUTENBERG\" \"SUZANNE SHELL\" b0b464bc92a541e48547fe9738378dab \n", - "\n", - " rank weight human_readable_id \\\n", - "0 20 1.0 0 \n", - "1 15 1.0 1 \n", - "\n", - " description \\\n", - "0 \"Project Gutenberg is responsible for releasin... \n", - "1 \"Suzanne Shell produced the eBook version of '... \n", - "\n", - " text_unit_ids \n", - "0 [680dd6d2a970a49082fa4f34bf63a34e] \n", - "1 [680dd6d2a970a49082fa4f34bf63a34e] " - ] - }, - "execution_count": 71, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rel_df = pd.read_parquet(\n", - " f\"{GRAPHRAG_FOLDER}/relationships.parquet\",\n", - " columns=[\n", - " \"source\",\n", - " \"target\",\n", - " \"id\",\n", - " \"rank\",\n", - " \"weight\",\n", - " \"human_readable_id\",\n", - " \"description\",\n", - " \"text_unit_ids\",\n", - " ],\n", - ")\n", - "rel_df.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 72, - "id": "27900c01-89e1-4dec-9d5c-c07317c68baf", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'_contains_updates': True, 'properties_set': 1710}\n", - "342 rows in 0.14740705490112305 s.\n" - ] - }, - { - "data": { - "text/plain": [ - "342" - ] - }, - "execution_count": 72, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rel_statement = \"\"\"\n", - " MATCH (source:__Entity__ {name:replace(value.source,'\"','')})\n", - " MATCH (target:__Entity__ {name:replace(value.target,'\"','')})\n", - " // not necessary to merge on id as there is only one relationship per pair\n", - " MERGE (source)-[rel:RELATED {id: value.id}]->(target)\n", - " SET rel += value {.rank, .weight, .human_readable_id, .description, .text_unit_ids}\n", - " RETURN count(*) as createdRels\n", - "\"\"\"\n", - "\n", - "batched_import(rel_statement, rel_df)" - ] - }, - { - "cell_type": "markdown", - "id": "e6365dd7", - "metadata": {}, - "source": [ - "### Importing Communities\n", - "\n", - "For communities we import their id, title, level.\n", - "We connect the `__Community__` nodes to the start and end nodes of the relationships they refer to.\n", - "\n", - "Connecting them to the chunks they orignate from is optional, as the entites are already connected to the chunks." - ] - }, - { - "cell_type": "code", - "execution_count": 73, - "id": "c2fab66c", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idleveltitletext_unit_idsrelationship_ids
020Community 2[0546d296a4d3bb0486bd0c94c01dc9be,0d6bc6e701a0...[ba481175ee1d4329bf07757a30abd3a1, 8d8da35190b...
140Community 4[054bdcba0a3690b43609d9226a47f84d,3a450ed2b7fb...[929f30875e1744b49e7b416eaf5a790c, 4920fda0318...
\n", - "
" - ], - "text/plain": [ - " id level title text_unit_ids \\\n", - "0 2 0 Community 2 [0546d296a4d3bb0486bd0c94c01dc9be,0d6bc6e701a0... \n", - "1 4 0 Community 4 [054bdcba0a3690b43609d9226a47f84d,3a450ed2b7fb... \n", - "\n", - " relationship_ids \n", - "0 [ba481175ee1d4329bf07757a30abd3a1, 8d8da35190b... \n", - "1 [929f30875e1744b49e7b416eaf5a790c, 4920fda0318... " - ] - }, - "execution_count": 73, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "community_df = pd.read_parquet(\n", - " f\"{GRAPHRAG_FOLDER}/communities.parquet\",\n", - " columns=[\"id\", \"level\", \"title\", \"text_unit_ids\", \"relationship_ids\"],\n", - ")\n", - "\n", - "community_df.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 74, - "id": "1351f7e3", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'_contains_updates': True, 'properties_set': 94}\n", - "47 rows in 0.07877922058105469 s.\n" - ] - }, - { - "data": { - "text/plain": [ - "47" - ] - }, - "execution_count": 74, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "statement = \"\"\"\n", - "MERGE (c:__Community__ {community:value.id})\n", - "SET c += value {.level, .title}\n", - "/*\n", - "UNWIND value.text_unit_ids as text_unit_id\n", - "MATCH (t:__Chunk__ {id:text_unit_id})\n", - "MERGE (c)-[:HAS_CHUNK]->(t)\n", - "WITH distinct c, value\n", - "*/\n", - "WITH *\n", - "UNWIND value.relationship_ids as rel_id\n", - "MATCH (start:__Entity__)-[:RELATED {id:rel_id}]->(end:__Entity__)\n", - "MERGE (start)-[:IN_COMMUNITY]->(c)\n", - "MERGE (end)-[:IN_COMMUNITY]->(c)\n", - "RETURn count(distinct c) as createdCommunities\n", - "\"\"\"\n", - "\n", - "batched_import(statement, community_df)" - ] - }, - { - "cell_type": "markdown", - "id": "dd9adf50", - "metadata": {}, - "source": [ - "### Importing Community Reports\n", - "\n", - "Fo the community reports we create nodes for each communitiy set the id, community, level, title, summary, rank, and rank_explanation and connect them to the entities they are about.\n", - "For the findings we create the findings in context of the communities." - ] - }, - { - "cell_type": "code", - "execution_count": 75, - "id": "1be9e7a9-69ee-406b-bce5-95a9c41ecffe", - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idcommunityleveltitlesummaryfindingsrankrank_explanationfull_content
0e7822326-4da8-4954-afa9-be7f4f5791a5422Scrooge's Supernatural Encounters: Marley's Gh...This report delves into the pivotal supernatur...[{'explanation': 'Marley's Ghost plays a cruci...8.0The impact severity rating is high due to the ...# Scrooge's Supernatural Encounters: Marley's ...
18a5afac1-99ef-4f01-a1b1-f044ce392ff9432The Ghost's Influence on Scrooge's TransformationThis report delves into the pivotal role of 'T...[{'explanation': 'The Ghost, identified at tim...8.5The impact severity rating is high due to the ...# The Ghost's Influence on Scrooge's Transform...
\n", - "
" - ], - "text/plain": [ - " id community level \\\n", - "0 e7822326-4da8-4954-afa9-be7f4f5791a5 42 2 \n", - "1 8a5afac1-99ef-4f01-a1b1-f044ce392ff9 43 2 \n", - "\n", - " title \\\n", - "0 Scrooge's Supernatural Encounters: Marley's Gh... \n", - "1 The Ghost's Influence on Scrooge's Transformation \n", - "\n", - " summary \\\n", - "0 This report delves into the pivotal supernatur... \n", - "1 This report delves into the pivotal role of 'T... \n", - "\n", - " findings rank \\\n", - "0 [{'explanation': 'Marley's Ghost plays a cruci... 8.0 \n", - "1 [{'explanation': 'The Ghost, identified at tim... 8.5 \n", - "\n", - " rank_explanation \\\n", - "0 The impact severity rating is high due to the ... \n", - "1 The impact severity rating is high due to the ... \n", - "\n", - " full_content \n", - "0 # Scrooge's Supernatural Encounters: Marley's ... \n", - "1 # The Ghost's Influence on Scrooge's Transform... " - ] - }, - "execution_count": 75, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "community_report_df = pd.read_parquet(\n", - " f\"{GRAPHRAG_FOLDER}/community_reports.parquet\",\n", - " columns=[\n", - " \"id\",\n", - " \"community\",\n", - " \"level\",\n", - " \"title\",\n", - " \"summary\",\n", - " \"findings\",\n", - " \"rank\",\n", - " \"rank_explanation\",\n", - " \"full_content\",\n", - " ],\n", - ")\n", - "community_report_df.head(2)" - ] - }, - { - "cell_type": "code", - "execution_count": 76, - "id": "5c6ed591-f98c-4403-9fde-8d4cb4c01cca", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'_contains_updates': True, 'properties_set': 729}\n", - "47 rows in 0.02472519874572754 s.\n" - ] - }, - { - "data": { - "text/plain": [ - "47" - ] - }, - "execution_count": 76, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Import communities\n", - "community_statement = \"\"\"\n", - "MERGE (c:__Community__ {community:value.community})\n", - "SET c += value {.level, .title, .rank, .rank_explanation, .full_content, .summary}\n", - "WITH c, value\n", - "UNWIND range(0, size(value.findings)-1) AS finding_idx\n", - "WITH c, value, finding_idx, value.findings[finding_idx] as finding\n", - "MERGE (c)-[:HAS_FINDING]->(f:Finding {id:finding_idx})\n", - "SET f += finding\n", - "\"\"\"\n", - "batched_import(community_statement, community_report_df)" - ] - }, - { - "cell_type": "markdown", - "id": "50a1a24a", - "metadata": {}, - "source": [ - "### Importing Covariates\n", - "\n", - "Covariates are for instance claims on entities, we connect them to the chunks where they originate from." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "523bed92-d12c-4fc4-aa44-6c62321b36bc", - "metadata": {}, - "outputs": [], - "source": [ - "cov_df = (pd.read_parquet(f\"{GRAPHRAG_FOLDER}/covariates.parquet\"),)\n", - "# columns=[\"id\",\"text_unit_id\"])\n", - "cov_df.head(2)\n", - "# Subject id do not match entity ids" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3e064234-5fce-448e-8bb4-ab2f35699049", - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'_contains_updates': True, 'labels_added': 89, 'relationships_created': 89, 'nodes_created': 89, 'properties_set': 1061}\n", - "89 rows in 0.13370895385742188 s.\n" - ] - }, - { - "data": { - "text/plain": [ - "89" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Import covariates\n", - "cov_statement = \"\"\"\n", - "MERGE (c:__Covariate__ {id:value.id})\n", - "SET c += apoc.map.clean(value, [\"text_unit_id\", \"document_ids\", \"n_tokens\"], [NULL, \"\"])\n", - "WITH c, value\n", - "MATCH (ch:__Chunk__ {id: value.text_unit_id})\n", - "MERGE (ch)-[:HAS_COVARIATE]->(c)\n", - "\"\"\"\n", - "batched_import(cov_statement, cov_df)" - ] - }, - { - "cell_type": "markdown", - "id": "00340bae", - "metadata": {}, - "source": [ - "### Visualize your data\n", - "\n", - "You can now [Open] Neo4j on Aura, you need to log in with either SSO or your credentials.\n", - "\n", - "Or open https://workspace-preview.neo4j.io and connect to your local instance, remember the URI is `neo4j://localhost` and `neo4j` as username and `password` as password.\n", - "\n", - "In \"Explore\" you can explore by using visual graph patterns and then explore and expand further.\n", - "\n", - "In \"Query\", you can open the left sidebar and explore by clicking on the nodes and relationships.\n", - "You can also use the co-pilot to generate Cypher queries for your, here are some examples.\n", - "\n", - "#### Show a few `__Entity__` nodes and their relationships (Entity Graph)\n", - "\n", - "```cypher\n", - "MATCH path = (:__Entity__)-[:RELATED]->(:__Entity__)\n", - "RETURN path LIMIT 200\n", - "```\n", - "\n", - "#### Show the Chunks and the Document (Lexical Graph)\n", - "\n", - "```cypher\n", - "MATCH (d:__Document__) WITH d LIMIT 1\n", - "MATCH path = (d)<-[:PART_OF]-(c:__Chunk__)\n", - "RETURN path LIMIT 100\n", - "```\n", - "\n", - "#### Show a Community and it's Entities\n", - "\n", - "```cypher\n", - "MATCH (c:__Community__) WITH c LIMIT 1\n", - "MATCH path = (c)<-[:IN_COMMUNITY]-()-[:RELATED]-(:__Entity__)\n", - "RETURN path LIMIT 100\n", - "```\n", - "\n", - "#### Show everything\n", - "\n", - "```cypher\n", - "MATCH (d:__Document__) WITH d LIMIT 1\n", - "MATCH path = (d)<-[:PART_OF]-(:__Chunk__)-[:HAS_ENTIY]->()-[:RELATED]-()-[:IN_COMMUNITY]->()\n", - "RETURN path LIMIT 250\n", - "```\n", - "\n", - "We showed the visualization of this last query at the beginning." - ] - }, - { - "cell_type": "markdown", - "id": "a0aa8529", - "metadata": {}, - "source": [ - "If you have questions, feel free to reach out in the GraphRAG discord server: \n", - "https://discord.gg/graphrag" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/examples_notebooks/community_contrib/yfiles-jupyter-graphs/graph-visualization.ipynb b/examples_notebooks/community_contrib/yfiles-jupyter-graphs/graph-visualization.ipynb deleted file mode 100644 index fb53287b55..0000000000 --- a/examples_notebooks/community_contrib/yfiles-jupyter-graphs/graph-visualization.ipynb +++ /dev/null @@ -1,523 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Visualizing the knowledge graph with `yfiles-jupyter-graphs`\n", - "\n", - "This notebook is a partial copy of [local_search.ipynb](../../local_search.ipynb) that shows how to use `yfiles-jupyter-graphs` to add interactive graph visualizations of the parquet files and how to visualize the result context of `graphrag` queries (see at the end of this notebook)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Copyright (c) 2024 Microsoft Corporation.\n", - "# Licensed under the MIT License." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "\n", - "import pandas as pd\n", - "import tiktoken\n", - "from graphrag.query.llm.oai.chat_openai import ChatOpenAI\n", - "from graphrag.query.llm.oai.embedding import OpenAIEmbedding\n", - "from graphrag.query.llm.oai.typing import OpenaiApiType\n", - "\n", - "from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey\n", - "from graphrag.query.indexer_adapters import (\n", - " read_indexer_covariates,\n", - " read_indexer_entities,\n", - " read_indexer_relationships,\n", - " read_indexer_reports,\n", - " read_indexer_text_units,\n", - ")\n", - "from graphrag.query.structured_search.local_search.mixed_context import (\n", - " LocalSearchMixedContext,\n", - ")\n", - "from graphrag.query.structured_search.local_search.search import LocalSearch\n", - "from graphrag.vector_stores.lancedb import LanceDBVectorStore" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Local Search Example\n", - "\n", - "Local search method generates answers by combining relevant data from the AI-extracted knowledge-graph with text chunks of the raw documents. This method is suitable for questions that require an understanding of specific entities mentioned in the documents (e.g. What are the healing properties of chamomile?)." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load text units and graph data tables as context for local search\n", - "\n", - "- In this test we first load indexing outputs from parquet files to dataframes, then convert these dataframes into collections of data objects aligning with the knowledge model." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load tables to dataframes" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "INPUT_DIR = \"../../inputs/operation dulce\"\n", - "LANCEDB_URI = f\"{INPUT_DIR}/lancedb\"\n", - "\n", - "COMMUNITY_REPORT_TABLE = \"community_reports\"\n", - "COMMUNITY_TABLE = \"communities\"\n", - "ENTITY_TABLE = \"entities\"\n", - "RELATIONSHIP_TABLE = \"relationships\"\n", - "COVARIATE_TABLE = \"covariates\"\n", - "TEXT_UNIT_TABLE = \"text_units\"\n", - "COMMUNITY_LEVEL = 2" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Read entities" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# read nodes table to get community and degree data\n", - "entity_df = pd.read_parquet(f\"{INPUT_DIR}/{ENTITY_TABLE}.parquet\")\n", - "community_df = pd.read_parquet(f\"{INPUT_DIR}/{COMMUNITY_TABLE}.parquet\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Read relationships" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "relationship_df = pd.read_parquet(f\"{INPUT_DIR}/{RELATIONSHIP_TABLE}.parquet\")\n", - "relationships = read_indexer_relationships(relationship_df)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Visualizing nodes and relationships with `yfiles-jupyter-graphs`\n", - "\n", - "`yfiles-jupyter-graphs` is a graph visualization extension that provides interactive and customizable visualizations for structured node and relationship data.\n", - "\n", - "In this case, we use it to provide an interactive visualization for the knowledge graph of the [local_search.ipynb](../../local_search.ipynb) sample by passing node and relationship lists converted from the given parquet files. The requirements for the input data is an `id` attribute for the nodes and `start`/`end` properties for the relationships that correspond to the node ids. Additional attributes can be added in the `properties` of each node/relationship dict:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%pip install yfiles_jupyter_graphs --quiet\n", - "from yfiles_jupyter_graphs import GraphWidget\n", - "\n", - "\n", - "# converts the entities dataframe to a list of dicts for yfiles-jupyter-graphs\n", - "def convert_entities_to_dicts(df):\n", - " \"\"\"Convert the entities dataframe to a list of dicts for yfiles-jupyter-graphs.\"\"\"\n", - " nodes_dict = {}\n", - " for _, row in df.iterrows():\n", - " # Create a dictionary for each row and collect unique nodes\n", - " node_id = row[\"title\"]\n", - " if node_id not in nodes_dict:\n", - " nodes_dict[node_id] = {\n", - " \"id\": node_id,\n", - " \"properties\": row.to_dict(),\n", - " }\n", - " return list(nodes_dict.values())\n", - "\n", - "\n", - "# converts the relationships dataframe to a list of dicts for yfiles-jupyter-graphs\n", - "def convert_relationships_to_dicts(df):\n", - " \"\"\"Convert the relationships dataframe to a list of dicts for yfiles-jupyter-graphs.\"\"\"\n", - " relationships = []\n", - " for _, row in df.iterrows():\n", - " # Create a dictionary for each row\n", - " relationships.append({\n", - " \"start\": row[\"source\"],\n", - " \"end\": row[\"target\"],\n", - " \"properties\": row.to_dict(),\n", - " })\n", - " return relationships\n", - "\n", - "\n", - "w = GraphWidget()\n", - "w.directed = True\n", - "w.nodes = convert_entities_to_dicts(entity_df)\n", - "w.edges = convert_relationships_to_dicts(relationship_df)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Configure data-driven visualization\n", - "\n", - "The additional properties can be used to configure the visualization for different use cases." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# show title on the node\n", - "w.node_label_mapping = \"title\"\n", - "\n", - "\n", - "# map community to a color\n", - "def community_to_color(community):\n", - " \"\"\"Map a community to a color.\"\"\"\n", - " colors = [\n", - " \"crimson\",\n", - " \"darkorange\",\n", - " \"indigo\",\n", - " \"cornflowerblue\",\n", - " \"cyan\",\n", - " \"teal\",\n", - " \"green\",\n", - " ]\n", - " return (\n", - " colors[int(community) % len(colors)] if community is not None else \"lightgray\"\n", - " )\n", - "\n", - "\n", - "def edge_to_source_community(edge):\n", - " \"\"\"Get the community of the source node of an edge.\"\"\"\n", - " source_node = next(\n", - " (entry for entry in w.nodes if entry[\"properties\"][\"title\"] == edge[\"start\"]),\n", - " None,\n", - " )\n", - " source_node_community = source_node[\"properties\"][\"community\"]\n", - " return source_node_community if source_node_community is not None else None\n", - "\n", - "\n", - "w.node_color_mapping = lambda node: community_to_color(node[\"properties\"][\"community\"])\n", - "w.edge_color_mapping = lambda edge: community_to_color(edge_to_source_community(edge))\n", - "# map size data to a reasonable factor\n", - "w.node_scale_factor_mapping = lambda node: 0.5 + node[\"properties\"][\"size\"] * 1.5 / 20\n", - "# use weight for edge thickness\n", - "w.edge_thickness_factor_mapping = \"weight\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Automatic layouts\n", - "\n", - "The widget provides different automatic layouts that serve different purposes: `Circular`, `Hierarchic`, `Organic (interactiv or static)`, `Orthogonal`, `Radial`, `Tree`, `Geo-spatial`.\n", - "\n", - "For the knowledge graph, this sample uses the `Circular` layout, though `Hierarchic` or `Organic` are also suitable choices." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Use the circular layout for this visualization. For larger graphs, the default organic layout is often preferrable.\n", - "w.circular_layout()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Display the graph" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "display(w)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Visualizing the result context of `graphrag` queries\n", - "\n", - "The result context of `graphrag` queries allow to inspect the context graph of the request. This data can similarly be visualized as graph with `yfiles-jupyter-graphs`.\n", - "\n", - "## Making the request\n", - "\n", - "The following cell recreates the sample queries from [local_search.ipynb](../../local_search.ipynb)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# setup (see also ../../local_search.ipynb)\n", - "entities = read_indexer_entities(entity_df, community_df, COMMUNITY_LEVEL)\n", - "\n", - "description_embedding_store = LanceDBVectorStore(\n", - " collection_name=\"default-entity-description\",\n", - ")\n", - "description_embedding_store.connect(db_uri=LANCEDB_URI)\n", - "covariate_df = pd.read_parquet(f\"{INPUT_DIR}/{COVARIATE_TABLE}.parquet\")\n", - "claims = read_indexer_covariates(covariate_df)\n", - "covariates = {\"claims\": claims}\n", - "report_df = pd.read_parquet(f\"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet\")\n", - "reports = read_indexer_reports(report_df, community_df, COMMUNITY_LEVEL)\n", - "text_unit_df = pd.read_parquet(f\"{INPUT_DIR}/{TEXT_UNIT_TABLE}.parquet\")\n", - "text_units = read_indexer_text_units(text_unit_df)\n", - "\n", - "api_key = os.environ[\"GRAPHRAG_API_KEY\"]\n", - "llm_model = os.environ[\"GRAPHRAG_LLM_MODEL\"]\n", - "embedding_model = os.environ[\"GRAPHRAG_EMBEDDING_MODEL\"]\n", - "\n", - "llm = ChatOpenAI(\n", - " api_key=api_key,\n", - " model=llm_model,\n", - " api_type=OpenaiApiType.OpenAI, # OpenaiApiType.OpenAI or OpenaiApiType.AzureOpenAI\n", - " max_retries=20,\n", - ")\n", - "\n", - "token_encoder = tiktoken.get_encoding(\"cl100k_base\")\n", - "\n", - "text_embedder = OpenAIEmbedding(\n", - " api_key=api_key,\n", - " api_base=None,\n", - " api_type=OpenaiApiType.OpenAI,\n", - " model=embedding_model,\n", - " deployment_name=embedding_model,\n", - " max_retries=20,\n", - ")\n", - "\n", - "context_builder = LocalSearchMixedContext(\n", - " community_reports=reports,\n", - " text_units=text_units,\n", - " entities=entities,\n", - " relationships=relationships,\n", - " covariates=covariates,\n", - " entity_text_embeddings=description_embedding_store,\n", - " embedding_vectorstore_key=EntityVectorStoreKey.ID, # if the vectorstore uses entity title as ids, set this to EntityVectorStoreKey.TITLE\n", - " text_embedder=text_embedder,\n", - " token_encoder=token_encoder,\n", - ")\n", - "\n", - "local_context_params = {\n", - " \"text_unit_prop\": 0.5,\n", - " \"community_prop\": 0.1,\n", - " \"conversation_history_max_turns\": 5,\n", - " \"conversation_history_user_turns_only\": True,\n", - " \"top_k_mapped_entities\": 10,\n", - " \"top_k_relationships\": 10,\n", - " \"include_entity_rank\": True,\n", - " \"include_relationship_weight\": True,\n", - " \"include_community_rank\": False,\n", - " \"return_candidate_context\": False,\n", - " \"embedding_vectorstore_key\": EntityVectorStoreKey.ID, # set this to EntityVectorStoreKey.TITLE if the vectorstore uses entity title as ids\n", - " \"max_tokens\": 12_000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 5000)\n", - "}\n", - "\n", - "llm_params = {\n", - " \"max_tokens\": 2_000, # change this based on the token limit you have on your model (if you are using a model with 8k limit, a good setting could be 1000=1500)\n", - " \"temperature\": 0.0,\n", - "}\n", - "\n", - "search_engine = LocalSearch(\n", - " llm=llm,\n", - " context_builder=context_builder,\n", - " token_encoder=token_encoder,\n", - " llm_params=llm_params,\n", - " context_builder_params=local_context_params,\n", - " response_type=\"multiple paragraphs\", # free form text describing the response type and format, can be anything, e.g. prioritized list, single paragraph, multiple paragraphs, multiple-page report\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Run local search on sample queries" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result = await search_engine.search(\"Tell me about Agent Mercer\")\n", - "print(result.response)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "question = \"Tell me about Dr. Jordan Hayes\"\n", - "result = await search_engine.search(question)\n", - "print(result.response)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Inspecting the context data used to generate the response" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.context_data[\"entities\"].head()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "result.context_data[\"relationships\"].head()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Visualizing the result context as graph" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\"\"\"\n", - "Helper function to visualize the result context with `yfiles-jupyter-graphs`.\n", - "\n", - "The dataframes are converted into supported nodes and relationships lists and then passed to yfiles-jupyter-graphs.\n", - "Additionally, some values are mapped to visualization properties.\n", - "\"\"\"\n", - "\n", - "\n", - "def show_graph(result):\n", - " \"\"\"Visualize the result context with yfiles-jupyter-graphs.\"\"\"\n", - " from yfiles_jupyter_graphs import GraphWidget\n", - "\n", - " if (\n", - " \"entities\" not in result.context_data\n", - " or \"relationships\" not in result.context_data\n", - " ):\n", - " msg = \"The passed results do not contain 'entities' or 'relationships'\"\n", - " raise ValueError(msg)\n", - "\n", - " # converts the entities dataframe to a list of dicts for yfiles-jupyter-graphs\n", - " def convert_entities_to_dicts(df):\n", - " \"\"\"Convert the entities dataframe to a list of dicts for yfiles-jupyter-graphs.\"\"\"\n", - " nodes_dict = {}\n", - " for _, row in df.iterrows():\n", - " # Create a dictionary for each row and collect unique nodes\n", - " node_id = row[\"entity\"]\n", - " if node_id not in nodes_dict:\n", - " nodes_dict[node_id] = {\n", - " \"id\": node_id,\n", - " \"properties\": row.to_dict(),\n", - " }\n", - " return list(nodes_dict.values())\n", - "\n", - " # converts the relationships dataframe to a list of dicts for yfiles-jupyter-graphs\n", - " def convert_relationships_to_dicts(df):\n", - " \"\"\"Convert the relationships dataframe to a list of dicts for yfiles-jupyter-graphs.\"\"\"\n", - " relationships = []\n", - " for _, row in df.iterrows():\n", - " # Create a dictionary for each row\n", - " relationships.append({\n", - " \"start\": row[\"source\"],\n", - " \"end\": row[\"target\"],\n", - " \"properties\": row.to_dict(),\n", - " })\n", - " return relationships\n", - "\n", - " w = GraphWidget()\n", - " # use the converted data to visualize the graph\n", - " w.nodes = convert_entities_to_dicts(result.context_data[\"entities\"])\n", - " w.edges = convert_relationships_to_dicts(result.context_data[\"relationships\"])\n", - " w.directed = True\n", - " # show title on the node\n", - " w.node_label_mapping = \"entity\"\n", - " # use weight for edge thickness\n", - " w.edge_thickness_factor_mapping = \"weight\"\n", - " display(w)\n", - "\n", - "\n", - "show_graph(result)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.0" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} diff --git a/examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_latest.manifest b/examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_latest.manifest deleted file mode 100644 index b41640ffb9e5e767b4eab65caf96c724e3c9cc1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmZ{dK}y6h07a9`OdaB8$f_t}*M*cOlcY^|;#R!EkVzAXlnzXT6tChP1lOL#jT@I9 zLJOjFwV7X-b-UjE~w#LQ=yojELBaF*0o?} cTXOG;IQI7&y!w%ylm(m0!CxS_xw^gn22a^#8vpDkH;~=K2;3GR%`?B{N5pbSI?>oF({D$7j$S_ xZBRrSqy83hJ4T5$QJmZg*UAo=k$}7OJDY+R+j8y=5oP}C-YpG}@O*vFZ~>mx7s3Dl diff --git a/examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_versions/1.manifest b/examples_notebooks/inputs/operation dulce/lancedb/entity_description_embeddings.lance/_versions/1.manifest deleted file mode 100644 index 6566b33fd1b530edb0ad5b31a52f6780ba075cc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 249 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�$Z)3p#D^o9qB&8-?;u?18kGN4|i7elfr+w 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

<`jAj>?sW@^;6?g;~sZJ5LQkR8C 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

JW63LDw@dU0Gob5S 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�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

!dZfX-Oa#7#8h03Hnxj<)opQ-nwyo&AZ7!c*z0- z0_2My9xBsLewLO$sROH>;sn>yo-7O1i@I}hdg3NG;&;*`Rw#Jq2 zQhs~~$`ejJj;8ZB;!ei|i7*V?d^`j#)87i-RjKB1^g_ng+$|%Vd&Ewxj$=l5sBdA~ zi1iHf0veAyVW9FOe>1o>E~1?8tY%O41#pGb`O1C8V(sTEd{Ph*4wfvzBACJqmfK; z!I1eIG;wOVZz2qgtRoxjb|LJml1QI0p@)u*$j2k!%)n<)qB7y3J`k^}-)0%%N8U)T zoNdUnLk)1+tM;h1@;MMk5Kq<-e8tMo|AX&!&+z$8bZM`ir?~vdI!-mfDGormE3_Bn zw@w7&1?V_vJEU7gfXDqPuzk@5y~`d5y@emz_@d*6UAQ91QBCYd`%v6E#Hjwjcw7cV zZ2u2w4VW~q5TLw-&ueEcUkLW$gQ8AB`JQKR^1@0kIJHf=iQH(SqoOlv1#43n3^92P zn7B6SRv^74t0raCFJFZL({CYZL?CU>TaE1k6B~}fx<+vicpsId`K`_PWoipE6jx_5jV#P)(HQ zBjpHB&D|>ULb2&yhfn%fD_M{H1=5&qNcEvKpJ}SZU(SH;!*%5~cSo|ly<6j<@`kv< zvn2?vO!^55a<4Mt6AT!30ZIFE;+ULcGl$SPLvV6ZftWk#oj>Rwzg-ge<8gT*$X?@s zbR@5_`wyp~xg4r@9H~|qtv{b(z8&sOi^i7~;X((qi@I-7V5PYJp9c+8@+T;?jfmBW zv7Z#7xsQ}S<0S{Ig?8q*hxMWP*H=j=OT@Rhbf_21ZhxK8dQuJ8LH1VKBOoOQPnBOI zAK)kMPkGf7_chjs)jd-2PW5bVesvzFx|F`PE9JCqaBf(L5;9+#Ee+S8r0XO38ijC{|DAZ0S$#KU!q@!rp9EC<{7HeHs9_ZM z7(9KqyTCivD;ev$D~#reHv{4s`8dAX$zB~DI)Dr9OZr9BkxDrwcdF_J8^)dD8|%Li zS_KzX81m+>BO!7s?X!`4O{3E<-5-iWQ$NDDCg*@Som*}W#U)PxvJ4+7f9UgA?>aS% z?k{`{d6Cul?2;R--F+N$1`URc|GskJG01~*F=pa7upDw3DVOk8mrYFgMp4UMP4@74 z*mSYWKQC*2JGgQ>#S7rv|y0p-eYmiKpc=@EbqEA8cZ$% zd9CiGjr%bgD~S1qWlcoV$eO>UTvZp^WwFWXbr89>G|o)JmsBfw)&2ty?;ism=QpBv z>m>HssTp4TdJ{-jBViY7-PnL?@i#mBsJA5eocLFb-P}j$5on?1Ch(Yf({n$L^XkFI z`qROSo{L{&W`?AJ_;H6;;1`gf!L z?i=|BEfjc=|N0dOzNNY)Tv#Y{I({C>plHr!%v_WWRPR8!23>ED6Mh1Pzam`-pGR_b z=Daqedr{8Vvz~|OtPuBX5i6Pc0U&fn)7{nV{?ITC`s1O9oFqTYCe{{_fAp0q%(ua) z_bqVNiEi9{_%dE_j#({eeQFv>$`sUeGc~Gy1Mf&fg>dP%si@3XGX89&ylHH z_lnioNmMy1jJJ3fMIB_CC!W7x-lQKDA!UXpHg2&N`aFz&);Pmz4I0gEOQ?7H=COwk zZgK%euHow|N*nfNvIKY>n$BIKhs<9(VK3xs&GbbMe^dCwtMX*ZGVWn9pIsBfHP06b zN<%A6K|MFNFvGjhGLL8qtm2_~Kq$>W_P0Uv>NYl%=fqeFb#gVYbqdGP!-)d;uehCE z+9t^xJ$kD-mUqTy@ExrUylgN{aIPs{rA<;A51PDX(!GEfg3hBkuE7l7L$Qm8QRl}i zRX!prU2UPX9sFq=a_(vZp3}H~JeF~7^O+~-B{)Suchls~kA%`ERoA=GnyAf;8ltcR zW-9el`OQySk$|z%WBz2Z$lV1#c&U8!3x0fV3$w~)HWviRllM1Biwsl)hIOtGC(IjBb|N%cvvqmva_8Q#F6TEP zyZY`D>lZld%PW^)_-|5L+x)n=el9kNZaq&_xe@)iXiik#51L;nZI4{X{Cke8$|fXu zknCHoHg&vwiWJXU^;#pVd6hL@yRKvhd7Ge>2s%gt$CXAG*J{n+djU>_yoNCz-D&!H zkv!ohr_S;(APrFdRzGzRp*Z7?4dt0xqJ;1-#)Wb zX)Q`mz&XaT$%Ofk@aSqB25<~NuR-zKpQwN5+%nbmDXDXnmL>2rtE>chA@3}Hh*XW_ zoEgdwGH?baG!68$(l5xl4pZ~_he-Vs8jjERDXuFHQr=mu3u*{ieTanqL5{YIRR)Bd zi0c$d;If0Uhved#QsFo5!`SfZgz81%iud@lEZcxiF*1Avw@JP#k6mcTZJP`}vO2E47~U8)ZG-QK9-U7iaEw%Afu~e`tDkuKTRUA9 z?=O#ZD*P1VVj%qfO{2r^{G14@kxqio7J7t*XT6#MLzPt6QWA#T8w;)woJtLRp7Qj~N*g7>T8Z}GkYvT5Wy)g(Ayv=|+kxcKKX0bi&quTi?_X?gO4qu93m2E&Je z-`i2}!!k7P@GJ?fjcjcbl^Z#RcX-~VkLi0**FVrV&Z0^k7XrQmm!OSK*Mj#k6Y^K| z$Y8qG%nob)nlt>5z@JSm#NR((dvL!c+Zg->%v!<7Wek;RL3@h7hrE;EYi<75vWCiw zD_na=4Yt?8H3z~AOyEoRZ^(n2;(1s8b>SfUbLOoqiFudXa=ckzme;muHM1Dw`H+`3 z?qWp7Ceq5g)kXj5X}osTH90qU6yJN%N7y}SOG%p+ahU~Y1&_4kmB$D0#`?L`hY zy~3@G-Cz8;LZ7yB*OP2*wReo^@*jV+@2!u zTTK%0LeltjWDPZ5Vcn#p-Y_GV&i#z$*k|*3u+22;W_L-pyIVqRUQm=CA8kjg%KXFs zzH7>L8vSEd<5;}q4;_wJLGJq#cv0X7HWs}T%STU_f8Vm=l~*f@7A2Mv`ScZ0*8;hH zZe{(JccMsJ(OnEYafmyOo2gw&-AMa!#_zT_OJrRSOJnisc~tqd3w>ES%$MMc!fkz6J%-Y2?da$|lfbU{L;t+8?Y89`h&EjHA z4-T)O_Qs2nzZQk_9*0EUUUG_8Ez-fv8nGgq`M4V7_BxRIbv!J;y~T3}({0%zdo*7% zKcu?t2WW@qwPUycN{W~{4Yh@%SJ0}jCpm3%5iVlYD0%+{TVus3OU9UaT4-N7`_M+W z9R7xW&3JA;k`XTtG#EtBDz%lE1O3~h9{jm|6V9mnMyj=`rYFhYkvQj}?TOvU;)8>X-xFJq>AwbBT)o<|{7N`d7S%qbBT0ydFDu?cLo zq=oP;_LIN;drR(m^O}pxV8-w9s-gy8Z8L^jl((j?DeGvcM)F8}4lpX3lW#5~^hIH9 zqc+5oi@iDUbr@f^PEqy4jhe5PMeL4i>fZH$Ds<-9Z+SX$rPH97T4>#mBvzdakoy5$y?YZferKlq> zdLp~>Y|&8IboZ0Z-*?onc9=ph{PwYRZ43R^rURm!#Z6OnUn|3FNf(J4=G_)QsHgWl z?q=0aU`>o3?JDu|Az|$MZVCf;>H4Yd+#uOTkKb3;2wHJUV2x>M%~CW=o=wR&i%HbDzAdY}hQE^!?DDwzbF=n%Z(A8O%^&yB zhig}C&8dt6}9Njl9Iw{Mhty?$pZa^M>pzHg|_o);)74%xc!>K zxz(Mf@um~NQ zjCE3D5Ix#$p@sc>%L|kLli&_5DBv*p$9+q@yJr`d`h~N@C*qv$Vb_rmIUjO7W+81_KOpgqfQ)ieM{Yu9xKG9KgRH4a7Zrmk; z{PI)9f$DwKyfN^H1G-&OIE!9Cgl7O=6pmTd`p1tKXyN=VG{nJ)%dGE14emrRxVww-?|xI^Xa@qPgl`+HSFtz1CbOwdT>D zC5`U&GpXjb!}92()8bNUd0eX!4XOQ$&(~n;y!Z$Y8$V1atO4h8-NBpj`OdnUlaRW1 z*k!jhKkS|=TCdxnuB~bt>m1A_F51zf1(gldFr%L7k`cn-e$M_i56>w~;*Ktf!vT(bWY5yJV-~Td8XG`oKpY+T&mn&_fda zCV`Je*OaoX{ubIy_+nrATK{h5)W>^h^QaWle^aj|KJVy5=uzWX=@r7yGLYWtVYF_K zjZpXbqp7PN;xat(-QS&MKd)0%w^wN+F@LziSRHzcx7$?JKQ-DR-p5xoRK12Rw`S-D zuJzy%+1@_F(Yl3k|HmlqK{;IOQE8*gW}L@-B|t*caIx;C3N_l?z?JgC$XxCIkEay0 z!C=%eA8fys)R<=^?-B`5z1ZQ~hy?H&^veP{XF{q#9Wr=IoVlVatfsYFi&4XjsWipI zfrr#yMA7|1Y1o_!Vp)f~BD(W^Rm;$ZZ`9ZnC+O9umf`YFTa^X_XIz%|UfiU)vu?_3 zJwJ1kVU6XL#zXnzwO{gF`BrrOKsnKQ=6o@@SViM>Ts`jR)mrDtrHy{=ehY9J&pY3i zT1~#fCDOM^XkEp16!_Yne^jn3BD}hDrCl}6s@9-GC_f^CCf=AVA2>Is{OCE3#jZD#2=zhRKRwVC-`uZI3%bFRoQsfl+1dkIVi1qKQB*?5(3QGHB{+c4UjlQ* zU-<;ZAKN0p=_1{36$8Vx{WrF#w(>;nQdd zjX)DWx8PZov&GJZ4g{{!23x$O)1j}V+pBZ|tm9qJ>?oxJ-rH)rN<4kCPW1yv#+rD* z$~8g^31k{q5}IxbD;^&h8zZ2P4etsgR4*Cpuj8B;YX>@#ID=39HIQ*H`t*}kcxf$n zLT&T6j1*JWsC&?I2cR{A`Pk=+T;Ul3cJ#+iV!plqxR(c=rv?H@sl`u zqV^vlAJ5o-f_1N|*q;f>-bmrb`AT0_iTG>AJCjipn;YiZ)Y&PGPv$r2bXa9<{HFwQDD#(qW8 z#T$p~O8erumL77^+#C^gxi6s>_~)>tLg^UvjBJI2tAr9f#=56-g|h1)oq^m@-L3ud5poSgdU>Uk4I#~ zr**~m($#eIsYL(D%?p-_UR&=%KR6LSgHO2a<12NSQoGcfrcdP_nUu!c{UuLa`e%%Q zM(s(VX+=fb)k_3Sykd9=BkRkDPK5G4}s zGkgOV>pFxk#$09SQQr2Yl#cbGBbW9ObdXr?^Gd=8lXcC$N*6M)f{WO-G|;!e>FpYH zTcU5l9=X~yPQZt2z!>X35F~OJVsvrKOVb8UDUBP?pL`qK^z1VaS*y{SP8DkVy01r0P9;XfxnTh#qUW9~B zOY*Y~CU^^i_m*3Z9w6vSQhCG3YyFguP;;O`Z-^B4+u}jZSpKU<1InmY4qo7cz4*6chiAQ+P^SFPbU9 zy&X937yn5sQt0m^h8CeAmFB{0XOdTV5LtSUCTKV0FCHqx5a?TIomlcMsAJq&Og;h`CtnpEddJ^~y3C@!z$6jQWX_Sp!FV|l` z$jY}4JkbRCM{x-qSja7lkGK=EAo0d&pg^ySrdx{goMG+x^ge&C^?3&`99`UiC*rgB zhDp?>_+Dg_8@!|zt@TAsJNpH+QAA48+I!TA+eRK1!1{->7#94MT-MoqIsU61APe-i}Ht;qg|_A_)j z-Mrg^&puqOC!guWSz}f*dP&1NnBjeRT~wB#eh>bQCS+`9cucut{3<$|R}ETakwgzM z_(*U59Ph|?`A5PVQeMT<@GGYXTqU-ISEbm@nT&pygWlYx^fE(e!1Cc5@;8BTiauGV zG;>w#pFXsb0j~tj(VnWj8z@dkOfST~bqB^4@_U0Tn+UmIVP4gv#S?R}c14t4mgahg zW$VBP0=baLsPc^akNF3AT30S#8|Mq1ET%LaBSS!5^PDrPj3)Gi2F)Rd<9RD&TLjGv z-4teS|M)2nal%@LtYhd<9iJ(cw?lRUpT1aWA_MsctNu_K9QsiL(~&LYnZ5jzl&?0F zhEe_*IAvZw`n`ZIQftHOHuvY2Ri9Ie>orctb6ZN&BIhxIBUDzVdXmxGLghFK-`9v= z!F4p12h6w<%eVb4pphyuvMjm(^dN%Hk-%vQ{xN*Zogl>{8*5ge-g2kPS@?QXDINI` zqYuRPU(X1-oiT@0zi^yba{(V!2815Gjtzvo-)++RA!>ecz~Va4bhJDx; z=;=2aG@j&<%enaBbg48}X2MYoxtH<^BE_{Q^yfC3cm9loUR1iIu&$Kfelb3hx?}#OqXdzejvx6n?v(W*gRwN7I~-iAHGu> zXLNMvMxTEL(}(N%yjxo@o4>7Mgg+ccjsI91mA7GE#Ja~Gz`DBJpM zGkYEPZZ-t(coo$X(`)GW-q)m$V`A7Y_NC^u>mK_bEW;H-tSERIlofo?^pg4;)JBqHPZCcoM`@4kydJkg>Gav%cQ7!Xa_?--?EZRTvMoiK3G)ZH*?6 z;GIox`D8#3ep@nv20E4_-%e2!u@QTXIq%`?dWsCW(w@}1WjIykBj1Y{Rr*`Y#cj?| zpI4!>^SPqzVP!8O8s4Bwe{AS-_;1`tw7OT(a({6e@cpq|@%**)zU;1j>f%kUzBePM z#W#fW?b`g`rVFyW$2BtFz0E%=2GWw?r{ezS0a}yU2E965PQTpu6o1{}B!1SMu6;h` zMY#jk((p@b#9os5DNRyi{Hptx^ng? zci1?SF04FC^uC4+JTQs7S1-*q(s%IPlv5h&nmRU!6!uvzJRl>I=LE*km4UhD$k(4w zFL>Bgl@`ecIRJraQ5>WH~C}la_o(`g~mQECiaI_ z;RaP&(O*D_MA=LeLAH8C|Z}Jwt zbMA5c68YY#OAV@=q)O(!Vra@3@$t|!qQC3Ntr-i|+7WsIpX)DtoILsBaRx>%fQ^wH zQAdCJytI+ER>SkId&RFQqqzOgR^-y`pcvRCo$K^_B@V9`PWRqN((pFHG&21!G287m z{jpf5a6zkPe?(#ohJV#kviCfDooAZ(MP4*V?K&X7wtVV_n&K}{+b|Auq(|Li&Ea*o zG3tl@J@dEOA;pTvH*cz;_H^_r&tE5K#;mon^S|ds-yt5_)rB?n1)FAZrROVz=H!Mg5p1qT+hyybNT;`X=e$;j+a1sa_E|$35w+PpHIy zFT{nn^D4;_D=l>UVjs9qXQ}b zN#LutKWrO?jQVNrejC{smDl%FDUP}ANEUO?%2u^L%CV1^X`iR!?8;BKBx*>mMb3A- zL@Hg#Kgj#e)Ygy9dP`Gle-fxSQKLP+AM8?>Y_Ck`u2(;5jz6soj7N`NxrC2|te{P$ zYa1252l9+!8xzA%R@V|&J)`p>&4CQ%|)>`(673QI~fMsOpGs8tPVfG#NnlJq}P<;4KkkHJjT7FID}_U1OSapE7-E*r0OK z+s!PnBO(KbXwC;mxncW48hHTkP}ZAI5i>*B>Qjbvtb38g?t^MQ>3SvXzqt3Qz`aY< zFrhC<^|n5`k96}tFG`;HY98dL@%fmga{j3TIed7k!t2C&tCkClPjRiNd8C3!eN>c| z;M|juc-E`WfHkQ33VgTaF>Y0Bro_E)?YT2>_Q2jkK2o?pY3V?L`lBL$edVZ2lX>R6 z3*_Wui@NMbA1WP}p_@B%R$YJgtnyrsm}#wp?+6$y-^hjpyb&wsZ&h`{e#zni$k%0RJbPqO zeL7l+?({bc)QfTZ=}O@0K^ahdD?1GCKuJv+P-f~>4lUL}k34@u?iyBwx1{|eeSWPZ zg<;?#^32;K=LQYsn<1xAH!Hb#6)R(H$Lf4^+DT3gyTln;kHOnRXluq#llRCUT&KxC zZa8iqpGD@b{`au+-;`>ZLJi^)#J^|$n0?l*;g4f5FV>Ob{MC*;Ze3qlJf=SluB-c{V?7RHjF0&3_9(LU$}(>~ zNTzl*-O2G}ccb3BD}1Zy2ALaqmv$7tC|^{0!4qSiXl+jI6zAUc;P_iNgq81gZd){z zqipwy*uKRJG3%_49b0MZXxq`xyr@MW1Ahz00gXg&`o18=0ZNN3=pH8(-#YCY#Hxpr zjDzfZCtB5rfqUSb+MW3O@NWD%ET0z*IxB%=3|+w|N^BQr(&mV!&)m4ignPVw-5Z5B ztT=v8T!@KhCi3qG55=B#7bWJ_{QbQb7wOlQ`jknR;CTZzZuV$$M?!DV+p|wd@k+hc z#S=qJL^hTcD9Gw_;)_v^)Yo;H#JXsvfbR^c4j9JZBvHL9y;`?ND-PF4RfbO|kQ@KeUr z`HxPg>NvZ!n}9avI>rIkKli7Uc3eJ>% zwKsF4oX7aD`U8f2J00HUuptn@2wq;0%GkrGKZl z;kcZ0+-=+dnm81DTkbnaUy-#8L3kaIG?aA_DjL_nD(h=HFPm&(g0AEDm)ikjSBtDE z$9TWxW`S!6=tmQ3nb0ci)SAyQ!F>FSoJ{XYyqC z3(y{A2;8Omf%3jT!Dsaq@HtfS#5{8Ay_A*}SQ@prev`OIn&)_y9H%VdsKvV(KZoA$ zuXG11{p?{32L4+c_#G28o9ZQrnq+IQVFd4_u*JOK;bBI7g2TSZW(#+6jc-}x>`_BB z3A@Ps|7&1i+(Py9q81iZbkKD0=X!elWQ<-S{;U~VRpGc=8|{@xniy2H9jmb@?C3L~ zw1Ix1Z4(YiXh}ZZ)+D~aPjj0)##cy8mgT?4-g=mGJc zpO7_HWh3{g%gZfTymUvVlTZg5_@n^l(vDt5c+Q9jF}zJl27ZXT);l%p`aAfH{ZZ8B zY7KbJs0Z1**#j~KEKs~JU79tfr8STP)vCZATO8n97BlpiX#RE^pV+n&`;8`Z%_EzD zQM37zV|jD$vm?0Zp!b*u?D=y40DRC@{C!#OWPPnr7otA-X++;b@3!{VE?jShM31=z zNBJo2%SvxR7l{YyJ*B>UusgJn1`Q{nJF$Mt`3AnTx$W5mP z37${_Tg**ME#Qa2#RNW!V+u|v>_lyTR(cXxFjx6gapO=DG(`?wEB}De-wdo2@R;K1 z^EHK-0-a&3j%_Pe<#rRFoi1}^iz8;>gwh(UI6&zD=m&y_CdEOv(RggX2IZ#+{>p&&77BylZ}jWeyYjJFQ|R#6{tWGCK>y)8 zsTLeOuq?cRlo+!_J@cPHD~wsc#kJG zm`3a^rh1lCEVz%}kWB*m@U4F^-X>y_!2b6>OSldm?lRGsNji)-_~`ZaWLq1(H+ zsRG<2`YgOgs<+@_4d`VC_OsF*YOUbmnf8sQ6aEzq=ts`9i{;A6S#rkaO8Svn9noJ7 zl>c&?;w(I8KY-ny7T1qXYn7z>37SXg)I`NQF_VvoQNhQk-o+5{u=5{yMQ6&(a3o-m z7I(G?&;NB=2Kv?#vxdx~UGJ(J)9%Gm&p(L--zb!}bWgv^#oPTu?}l6u$R1Ej@l>Vs z4S1%vct@um!}r1W1oGRnBU$A)>0P4f`u>&h5=BLRQ)kXkYKl1wX62XOxmu$Bm(l&v zeW}!j=?W7y<+)21v=s1$O2><`xnEU1()Zz)3-58zrW6hQPXGSV%;-5njlk#BCx!3J zXSC&VWBV0imYN4>aoO?7XlYyifGjv53U%Nn*KDD5Ii72rGVxU^5j)j>-t}K-h5rxew;S4Cn>H+7DZdD zx`{3JOGMm2LsogYj_Yd%<(A1P)bh~tnsb4#Ol-fMQfDU>W)n&$y*dni1HaR+(lJu_ z2u>yV7zr&b>$P4Xp);WA{8i5=jm&MGZ-NuYD-6Wvc2d~_vXV0VTzkh@Q{{=o+j(2K z-bHJZ^7!BX&S2y};-ASQ2pORAfclnwRysVe@y*UhC|^2h>0JQ~XZSXWd{Bbtgz{4T zt4%aRBPox_O2YwzpnXa~j|WNUFJs3OE94qBX7~p#f2$X?-UEp~cko@XS!v90;lqhqAPFjF2>Bj^Z46(GHRTC zPF+)dt)XAQ)msEKr06#84zho`c(@r3JIV}br4O5zso>w?5Ufu4i_*;J(k*>LR zT!5UZ6+N|1E6ki$mfFE1L^~>*JCBsFQJkzWWBB`Pz*}pTT_D?Vfxj6;&n{|a=i9p( zwMg)0`mVjce7koshMp42&m-fdo&6Hb$<{S#>ZGP}@%w_ran=PwRhHbJm%PG<^3v`sKU?yQsqqGR$lm5H!gn&S^e9toW6dlT#WB} zzz?MK#g4h>*dZl|vVD>zY7f5MlN5i)<#d3ym{zE>6Wc7LsGr9xd)f2q8FP|Xb0gtm9ZG55pK@IX@`Mv+nO#px>$B%&=IqlHa0BnJt{W^( z-7`eN&viV^eu0d-zMn&|uWR0#LF`ht33<;PB$B3Qa=}Sq_BmDAcs6Gm#V`LV!?B0V zGn>zx-@%VfwqrQ_%xsPcb)uxqzHA-T56_9Wq`1IC(!2E}nRRdj2e?hqQgGf=YU%Ab z@8e&N3v9w++eeXaSOYzwNO`g-o5W#wE+BVEQJLwqoKr5{Hw~Ltkz%TLq0Gv)IAcIG zh5zXyoNLBtp2t22&nJITTvkW&eDXtjhwP#g_0l-|F7`tB@tr(J8+BXpxoyYnCC4^3pJgZC5TUhfkjx2o`jqSL6r9naRi zt7LdNX%y5B&tq$;oKdf zvcYyL(j8|IH6Y>iPi^5k9MOlXAXW(&mQHNCd|LeSsS{U zP45MTPJhkTV-ImsTo-b+sX|#LVr5L#i<B`60q?X)<}mKP0C~HWU@g+)tW{XGHz}En?Wu>dKfm_BEk4v-%6?QJ=^s)|H$>j;lE# z4|6cqc`>8jD0|ca;a<8os$w)nG5 zEa^vCk%y&qo7%e1v`*}s(vrd*)>HlkSI%v(QL5%dxp^zu`fNv@un*_fb)GGfUbHrc zzPQ9bcinMKrv(41_Y$qDlr_S9p!qxBV2g`yr0Fc4cd6V`ICaE+VUKbc^(#}OBW0-T z5AxVFOs3UHB`cc)9MtcP%(kp3Qbs&c>uOB6oy{lS443{p!^wNYAFBFt1NJH`s`^k& zEp3<_*LLAB{R-or%|VwvDdo!xIrZp1jv9BETm$^bvq3KzbSg+-9_Yl~a2f7k%K;;| zaz>e(!uxYL58Ea=Z#$8yXUEjm?6vl!=CUmf|GtJZWhp&Ac|4`q9+v1Cvbw41xJSdU z$5-JRmPkQg`>{tQN6MeEko> z$@w6iXlF0|J)cXPeSZnH-nr$Qkx$Q^oLXy`8P{V~@76x4iRdRXo#@H#e{x6sdvExgV|E6UyY_$sD>mntGS4W}?GgumE-CVgo{{#OrnB=(ytgoTI$6ze zB8%nK4fHno54c3Co^Y)Mm*e)Thsb`@dx@Hs0c-b&?0Q0Go}b7TW!)(zG=?)glV#P> zy$N+f;n7E_;Ld2uNj${f!@?*uWfyyO&Q`c2!?Il|?PQwSqG550iODg$EDxcW0mx*& zm)89%m0|R&Ol#CccU-WH{RR!?loQw^?9LpiYRGCrd-P^CwVvd7$AM#7t>b4)(m8C( z9RW5|s z<@u7w-wx)qQdYWk!7&+iIFMA20?Qe5Ls2Vk%c+{DQME!1O4)uL`yOnQRTpj*o*gPt z)U0wk_=A&9H=?X-Zd92;@sk+v&DI)D8t+#OB`>-S!| zsw3AIQxtc|7>nN;uuG(E+9zEftr3~l?3S{|dBgTPlB%zyJO|21s)2ecP(8)2 zFWyqxpflvMw}laS@Dy8At0O!*HIkV%|Cn>jAK`#vMGU8{TNGbVs8>hM{5V_2jeo(Z zpKg-k8Lt*KIq|_bVL$5w)zXzJ0T^G~3AqHBO80x5Wr^B{PzCvci7n!4>pS*S|!H?q+ts z5-8&l;%D|WPd%vnT^M=RTl@{?;&t!Y!fqhlyYA{vt01us1^N<2~#F; z)Q4W=(=JhDdfO_T5<$;H>BO5y9CLLOTMXPFGFN_=n0FCBrVpJM#WW$iGx=a2k<9qL zggO)c_ev?ukkDdm--*emW_jIt-6Dq8lA%NDb5KnSBQM)lS^-^o16yWNf{s3uP|N!@40H|1Cg}j8Cm;?tpS|^ygjPwT?Td(x^uf8iX#NpR6-k3;IL)vDANVzmVjYoGaq$-bqNnU zzKp%c{0E-cD+=5nC7_ncRQ-|`8hlJBjB@D~A%g0Sq^J+q%?Y=PQ~oD+cAB)BGcr&g z6-yiFNdx*or2X8*c_Y%K(mc8Ab6IJMq|9`s5gB--C${;iI8gdut*2*IT%)-~ts?NC z0Hz3!Qd0O=9Yncak>o;cMFQSGL466A;g99ir4cyebt$_?-=-MPzMOgEntb-=DktIm zJk%NojQ7{Fex%5$TSgGD6wea{viHGDjB#R5itQ9o`2zOCx@bl%BKzA)7TvJ_Vf)9@ ze}*ml9~;hbvs1ypO@&|ER^&6d2SOfMdwuu#2`Zc;K()PcWSwB43JMuZ^ zWT$ZNUx(suJQg0~`f^Nz1M);UYs$5{N~v9gS>cCO6YS;MfQ47(yBvDuZwhdGE1;p+ z_jhgG%ljWz*MuIIX}hf1`Ba?pI!ZH-O?%=N-u;?2$9daJfob8ct8BV_y6AIRH+VwCk@P2za zZ1HT()ANhcCK~#K<0F%$|A4O2rJ5Zp%@*I#7y1Wh?X0oos978S?>*MnCI42ngmcRY z6nf#!-N5 zN>--Uy2Z993KJ-4x(_&D6)7)eI(wAz4@?ocajk$EepKighxa7EPTM#ydp)_Y-=Nlk za!*%D%sw*?W<}V-iiRdk$JFzcs4+7Rn)sN627IBJs{0XrDAB0|H$ z$Pv%3dR}eI8OIVSCgW3~hD;rLRn2K)O5XzM^Rc*03XWngnJnS+%!(7iQ%d`i@1E6U zV>?&IS6d`qZV_kJ#QC0{U)XcmSbRiyP2sqUug}3Yh(XJW2^* zs~yg;s3{5-TuTg1sm0(lg_rDkubS??)l&McfX4SJFHtAJ`45F&AkP*!{yfy|ym_gN zDzz25y&hQ%|0tYe|6$iA?WFJT-EJ0>Z!`E*ah@5vgzb)Ak>2;cxoU@4g16#UA{1vL?;z{$FUYa;XP)Y?8~KG!xNib3 zN?@|gzi@)mdfZ|)Ki2QlIG}PTP709tIdM>gPTB32QGTyG92l~WrbeGfFWTzRzXIzg ztRFz@0yn{zLz`<=?={7~#c{%=h$ll6vFedwIqyW~>&?2-1qIK#0H-P`-LCvF zLmL^$wAiQR9SJ=kp=H_c@0Da76~Wd~)uhSxIr1JWJ+V%rfafjL=i#-cb7G>q%xJJJ zG5*>WaBd0Ub~&=Rb)DctWJYd7^NDgHocp4#^6YJ)VI^u^Do?Fy511yg4gwn3&HnGk zy32oKIDX7c4gQ*d8Jr;=s`UVd*Wz4ciHe_~x6HsPw%B07sAZva5NaR+HD^lsGM2OM zS2uj;SQrZDpo`>$?(NC7{8!-}Qj6S5S`v7aLlSQ?dQf>pJm=_wUYd!lYMn&iOZ!28 z;Di6L^~N*GHyX&K@UBD>JX2{Sr8@G3`pyP)Gxp`ZCA}9h=P!H;-tS@fJ;Qrdmrt|e z$(Tv=S$Rue$IBw><9-= z{d1DT=9^TXm^0-n#@LJ$^B1yP9}N$+N9BtD&m?orO6RDaV82aQ%qeweN`=vWA4Z87 zF%5H@&Cr}0G9;z>&=Hc#aglK!a--o6HSf3$4`&c~lSOf0Pb2BWu-= zk0>5xyT^AFmx7}w%CxCJH28W-*>@Zn#SiG3DKe+earPNCio6eY#k@uq=9j=HR=Q1P zGa*Hsbj4}IR{M}gqi33`E%&DW3fqm00d;l!t~q3zv(oHzVjZ%Ca_vcR74%%8#-3oC zuEmUY;II?1D%XKG`M@rFkD)FjG>dMB2|dDb*4Ks7SxQHMd&xSjz6`HsO7o(lexZ0P~|k7m+FGoKW5i{8FeHp*2)ZF)|>s z!t({5o^wq(IcKD*1^k@|2uy||xE=~t1TP5&cLuWH20EY6y|N8x+FyrXj9w-MYjWe4qb zwi0`bFOYZlrE-f}57iiHYs;e?KiG>)uJvPUhwEa@^V)jGu?X#G$=%#$=xW{-`%2`! ztVtcC*O=Dt{hLDHPNSg%^Dqt@+{Z~7SMxX@Jg`74HTTsHHtNLNeG~cBiUjgIGntQF z??eaFtZ4W9{?v6zf7;N$AN4N#k>(A3tL=V&o9(LZk@z|Gt_z|4<#+L!-q&Sh@>TY9 z+9E3NH^hZUI`7`Fg-h=}Ahr(JFK!!$%|CNm=$3QSs9LfwU3pv%V_6|a?>r&v6n8Q^ z*hSNk^T+Ad?TtL<`EJb@$8xk-6wi+b4&`r6u5r_GA?$H+8JBp|2|BWx9yF<*@o;%P z+RdL3hNy>bV>rx-c?nKE%hn(o`>$y#iZs~?u|2xc?s?`F>)3iZZnXVq@Si8 zClckes~K9t}-)YAtO7hJeWe_1EXvMoxON1r`FX-B(~yGRbHIt2x{0+Zl69m$%h5u3l;)W7^*_x37GZD_i~)drq#E2VUIawcCrzLB5@+a)V$h z^R|k(xpbq+YiUE#>+M?p*(rz~Bo*O}Un^2%bw@qtT75Dd&gbgS2BB7d%26k)=mY0F z7q0(|lK3ZG?epKftOK4#XfmiiFd)QE% zoVF6?&V9g^Z7HC2DeJ07Exp+}-Pusr=7~geC3k(UrH+~y!wXyval=DaOn>%oShBA# zI(u)zcLsM+U2~BCIAO$|{EWuK*q4s)mW-Pn;$ zsr3Kl*!KPviRMA>zpakyH@uo%SrowtConS%+1sSLd}g0!s_Bj4wR5*>0PPQUK%=I8 zWGuRU44X*z*7}zY1j0Lh@Vq}LvE!I|bPM%MOA8>JViV+zFy`O}cypl$jzlH$&$qH* z)|>-uyF&?$_YLlKF_*V_dy~G+9-weXG}lEXLwPjnv>?PP|j!VmNwSQVp6FU_!re zX0s|1J-%4eb*uy1%cXp<)^$v4*#|cHxdY{fw8iK)jL5r)&WXDq-8dId&vTK649jB4 zH@)$^Q(qQVx7Hq>U4G+^j4_&UP~8V2Zq{_M@nb*ckOYf^Zo?Q2H7 zq0;wsKhp_`yP#$7VFFj+*o|J8Y1lyiY50myd-@Xw?+9brah<8=Ke5;S{BeJ?EHS@S zgIn>X&Q3*K&r@$Vwy*7as=0^o)cZNxIcp#M%UU36pK5U(crQ8%8J_|f%?BQ~NJTo2 z`s#QJy8c=PU$+K;ZjlR=CPcF4Z98lJ3|*;dU7gH{4`8a@O-0XzUgN*z$V(2b#jiCN zS&!rjSUz|+7x+T+g$p(ZvCpes;`-8lA~z_8OvH*)F7i9QZW9JXl^_v_{i0 zTeB`n!Sp;>k#ar$tl%-6_r4G0uNNXY+Zsl&rbK&unQqBIro&2)21*0P;DRezq@pH#0$qjDe z)~v1g&xrFAA6_worJa%H3U>3O#QQ6;5e8yKx+hGKf5N?;T+RxC=V*_mvB$($T8enmK&^&WT&t zsG>>Gra8TTdo>pSTvlLh!4cg5_5w~&hv3iE3Y#4q3yW|5=H|Z(8DH>8n)LPto;+u) z(lOMkjtMaK$xAeHbySFpiQ|@QewD_MCi;YQ9zN;XJx=+7#8IMl`J?JaviNZ)#ZA82=7BQ(uAdQVhc(?*@%wUSY75~o)KVKAfd zu^*0?SaG`?ern55;_Cj8QyGL0mU<|0eMyH+x{A9}_DM-Tt=RXMWk5M5^)jA`gSAG( zC#!(k_}h{7tlLK58fkT5N=<18+JdA#A#2P%0e3meQ6f5 z1VhcE0Z*1|Qeqeey{Ur+OXHBZ36^|lAeAl4QHZx$>-@gpuDb(??*yJB;V9|NEw%Vb z`i0&Rux8ymMS@9AKTw7Si80`^EsmspK4uYbV2hE-7}D0CcS<**-u zQCB72q`J|P{U?SB9jT1LdbX6u5Pr`|9AAm-W@qFBnXymqHqoi#(k7{)`lMtOyA+kZN4BbB7-a>=}Kq2{-BBj>SJlpw*TVXh#}< z`9-z%+@@nf7(DuiDV;t7;XBm(+DeYvSO%1nur2N+q}SXOypy#o<_bi3^#mi=0w%`X z*|Hr>nVbgQV{Y@U|8~H}S9xr~?_4D9MlpX5>i*5pGOao837CnOl`E{%g9!X~cm-Xj z4oe8R$IkgCVc&vNC~CgTw0JmoA{K?#$;my)za4(hOTCWbvQELol{rY*!0O&HRzyyh z1!eHA7kq*AHrw#`1hgJiW!t7tTY4|yh(s|5%6%lA#|aboTE}7>*s3Sc=W6v&{M;Kn z)6fTrPo#46S=TT4LICksrq3rdHB9B4Wey;(m2;Rde|3TpX>3L5$ zVG$?IKso_{bPLVpcjc*tIatqY1cCz}9bDrH}#-q^A!?io9wy*9; z2cOoJDW8aQ2P^p==W&Ta6(_C0J6zulHZ4aY@e@AZbPWERuRf7UlE*YP9DHSCf>^wc}_lwwA@bNqmZth zjyX@%J;f-59Uo*#+9LzPCwGO$o@aRV%C5}TFO<(~VTJu|w*$-Spc3~(RmZNdYQR~1 z^L!K&y7pZ62aGUU+Oq!;i~)s_HxP9WfBy>ym(hJ7>4Gyf`gR|3cU0lM*(DnD-~X|S zzL}i74kNEYe&j2AT0aGZt{)^N5N}w>go6-K?3AcPU`vL*Y{xv0t^Vy zymH$EobB7afXhHx6xAtB-cw5&ZRrwB=^ZaVP-#J^xYAgo|r!FuXN*hL?~| z&%=<2LEQM4zWOWE0?aob!U8Z8v16Opn8C%{R;u=qaGY4Tw@R7^2wPC-^l!$B;CZ&X zW}4mOGpBI2{sY`(eGbM)+`ujS+u?S-ebC-J0!WXG9L2tl&l%+rT-c*x;D|v=;%0B& zGA*dKcJlm#alyk|Xg~ftd5}Hq>tQci&_)l8&d1>flX&P`&;v-D3XKaQ?|zkbk_mf- z4r1hG`K;_I)DQVZ^S(xEacmKu`m>j6PEW+0xmo^(f$lqDonZ~ec-Ld=KDCACo6KeD zvl|Kz;qz5nqWX}>9Q=X8Ls}%obMngIHl_jGs4@leLh#L4g4A1=S%bW>^gg-{KC1S^ zv-A6Kf&1Ogox}IVjb*BB+#g82vZ=Xz{mdO~bel^Gc?7J_b}`{$o=;8Tc9qBQ6RmsW z?t4}$`tD1Z?gFIgp?YNk{p+gIJm8JR#l-(D)a5VIMLubShk8GKu<#5(9!1P0yKnxN zla^&|H#THxt8_@GJpvJrD~sB~oPp&?I!zY5A$&3A9d>-T7(ZO>O4_KQOx~X5d)SFS zf_kfswJJQ`@{2OXeI1ZiVpqRDC4M$x6c0%I$dUXxY5$$)=4%QNV3$55TLG#n@wko-APo#M{2tN0?P zr5w_>vD)^h%IY&6;==Z-&>qAwjC|esuQT>*NY@BoiYr(B0n!?Zs7;&DeUKJfN%P-? zk!BG3UCgygo-nH-y}I^Tq@VE3ppKcso9mdFu)A$NVBU(?=wCEa5j~6t&3f>?btb|R z+K0k_-M6faPn)pwu3~}pwxkpJr{s%39IlXuf&!e*Hu?D?(-bNDn`w|V4XbHnY5Qz> zOX8bD__9I|EPSk`?w#7pX7A6#RwsL)_%XstwE7dz^HO$W(RW>F9x=7HA9J}(#SWv- zi`>t0SbGtxq90Mc8IZ1iC3&{$q8#b)7=0JENI4=~wP-xG{KJ~~qe_%U$tYy^eq3^vF)8qe9Z^0YM*AXtXU|lbK5t@T~ zAR1BMKs_&oFaT+OG(%}0Ir5fN15;}~64f#Hp?5OL4+7N#61K=*!+N0G7$5Xmo1q+9 zc3qO=GDW{h-Co&FrMbne|FmTC6!0@FwH7OF7eq1YThQ~R4l>0A^q%Yz{W+n1(JW*K z<-txL%_iZ;kosGS;7;@C5W={|plLJ;XW5&mgs&>aNfO7lyh-aG9FCx#mNoM- z&ETX<`PY)sq)!WR7@IGAvA`xN;GidIEO+uoP1I{Vq88H{AMI9qeX7wg5Z{xRBz~=? zUfp~&-jv5)M0KFGtoi`e45R)8W@erN%59Z2Fkj>ohv|o#sl}e2<}ZyQ(`*+0%NOFKY3bJgU^WqC4UF2++|^53&+_Gl8v4)VvaVi;<3mJ|{AG&kX7lhTIc4%7ovi{v0I!R*<}`oNCpYuzFW* z?3%nez@PsrmAaklFVBhU!|e7<#3_?|1NBR&_w@lxSLg!eGbdg^(p@}p+FtZJ@|L?S z@5YxFcUI{i93E|fgy}$705h5&fU9e}BXKmg?0to_V5!g;QikI=@`DEmE3|8K@63R1 zgykVr$3HpcCgplC5C`!m?OV#!pOvY{hxf|k@xSk#_=k%L(0l$!>SH7beU5~o3SpvT z(QO9LqGv6L2RP{sHFkN7h%;P|@5eH27ZHE>Vh^iRoHQ0#{V@}|2eL|&fG~hl--L^t z5w%UaNU7*+OPY5FP*0eVk3`Y}q}iK`UMEiTVt8ekX|2Z|kX z@cu?qiE^>!@vqGQ3rB)Hd2_um7FO)4CSlbWoXV`)IE`Ed$1B5oGYuA#g zAF5Elt~MuioEM_Hzd2IA^84odh>LUuPS^TD>d$e@o9*D;xiB095)*kyeIUZ+jqvRH z1SHO6)Vn~^ufm4|`9i4rokB7D$qD!P_uMyp73~>tz+e@o4=uns%VuEo)r)Mx>LKi1 zqxDj=E;}XbjT%F3*`m#59$sYlb;4}fx zUtfURqHSU3q$vI&BnM(|y}-|(&ESz&Gi-gu7aUTPdE=mqjK1RGSvw`0cByQ&=M(z- zCRj7^A@5^y7aL!WmYVN>!4no;gYyp`^UGsq(OxaPF=N{}%*Zwo0Ernw=&5&u@T3y#C_7 zJkjD?)?H~UZ?b3>lstQYITL%SMrIShKtB_f(7MJ(jh=J5UU=EXNNuwro6SooX3ASj zh^;diIz1T%C#_njKWV+PMGCF$YHB5S8}pGp?feUm>uKW_qZQoI>LzwSIT`O+A73V`IG_LD-;$Sy1ZZ5`Q^JO$NYwZt7 z>N&8etgm(++gYahRD5=X@FDHrz^Zz?G?2IyH|>eWRb|G!cvKK*E%*c;pSnPl?tWI> zGY<0dQlLgtg$ouU<+IgWFx_^1a8daF0(%d5vZ< zPCjuFM^C5y?flZ%(pQ_=wqzUrYX1gy=0pSHhIs5h?h*K`ImGIPZem?x1M!=&HL$up zVCHf?F;>>a$0VC#f@#;b0FQnmiFu{@WUTHf*!pCT0^j;`KP8xlE^G$&y0>Bd1}{{e zq@j&PBKDqq8Y>>ha1pb~MF|k?vjPHFFIERHK3f}ir=K%e)MITt* zXP2>k@sZjZqWP3_HtlD6^vr9)IW75FeQ%uXU51ZojnEx!_GrGnEd=xK<;*zv52N~n zmdCeqIzDIg9+p<315PgQsEE3WEqw&ZzBBmucI~U+$ed*&xFFY*6OSLNodoq7vAn#0ZAW2aAL2O5IW8TI!e2-v%3$_dGPbm z8SGTqaJW^zl+!V!_AlGYx^R!T?XZp3=u2T#UmR!DS9Pac!u(e`eA9t2=3dha!(P(! zOotSvGvqj&p4Jv`UD?Lk4tT4W*Z4JMx$3>~&TV-*<+i!y2=Q*2mp%Q*h7(Ra3IS3e#e*R*y%srGTX z?-@usa#i!o{6BW?rH*>+wgEe%^j8PU)jmB!J5;kn{K)=V!9D34^rd0nth&p>#kmhs8u(KvccV3t*9Z+896b5421 z7aI1X_dz0&uAS9BXSs4S9J%f{e+rdU z(>?I3tCqk-W_VDWHB7CCV;;D$oY{#G-?>OCTze9F`8I}dSIz>bZDDWyJII|3OrhVo zP-fJMG(r9#Q482OsV9WQd}66J4`KeAt=!q;C~&V;NaujymYwnX!Ebz1T3vaL&sFTQ z?2N!39Jeu?r#332c=wS#Q}1A}{X2nj1|O|IfJglF6z?A+VEyY-f0I=qWc2-U9buCudb84M9!V1o^d#pe zJD=57eIm5Dom&fav>vd{+Y(UJ$)~O!c_U8 zC_+>IKI&y%9g0z1wR4|zPP_#MRTH4gDcVQP zybx||(I!4j#fZdIEZ@qch3^XJ8B;%gDIr?v7ikWZ-}0*Od!-AV?qTNzL44TAHK0kM zeRiYDsSl!sF8}_r^-BVn^}bi^fyZYQ=OeCW#D#Qio!IHormT1>J@@}37Thd%Fd8Ge zo;nF%4pa!fsg3cFIyJCByIAO;B-EtjaJX247wA6xl73gvbLBr2yi^z&f@hnrp?#=0vs@i|T4{gp_`K;IU&zOBQFk3}BxJq~l&XD!-~JA6ME z`k{r@F>x+T$S^>{a^iQu#u;5&x!+4y4d$#D&V~O>a9qzr z=mmi#sN`P8@$`HgahWVIsH4U!}!C4OG*A54h{S5GJsD_unPF)6aC&+B=m^ zdpSs^T4rG{EBW4>bndAC1U4NoWM0Ge!KDlS8oO;;@?QUGc(cJBHaX@x6JtAB&zi58 za|>Lb>B8vVv7~_x3%tP9f%jqDgx*r~BTnS64S+BQg~lNqVKo0L;hdV6XG3+n7%eKj z(PhR!AWc=9Tjw7-!=|JDgqyA9rA=LdJ}=k((_6MTy2`#knU1=CG0=NU7!byRZAByq z-X*@)gr|4|<)YGI+Z<{9&3b5i?G*M4Oo8PqaraqNq>jp{JtZRgCnbN?cf5v-z(E0^y0M10cO>J7K#*_^vIF%(x|`cXP!u%W)7< zupjSk{tpB{%?YLV&CC7Z%F`&}8x(up@fh`obW^KRft~#4jPAbdZ^dWxWTy_2cSe(Mv5~geQW{rcR2J# z1K}amN5MKW)ua4#fhpIb=VxB!--WXO`oOr2tz^F9+s=&{zK| z55V#xv5fGHuisFQIA8}TxpdF)VFq6A@&l(h{{Wq@&IA>TKt84xf5;2f>hRQF{TOi?v$3!cJ_3V! zG*=13c*d%!(4h1~tLS;o<-Mv3OK-nY1L5Ru@`9CjZUO-Dr)Zu|+;GP25QG z{n0pXS5xRh>u!a8c0r#VEg0!go;mfkm`CO4?`qO%aqxEgF-Wvn2UN?XK^am!fqXc& zKG9C5d;sMR1M^O=QD|f0MGbKzy!?BbMd=zL`7lh%KZ#;4#^3Z}7c`eBcfG)KCG8&{ z-vr5zkneB7$lKR?YT^J`8~1?;J|^$ODfhAYmi0it7xRgvd3fI8d?_SmHIT+Z@;^M; zw*)rr=?Ig4HAc!)v|MvviZ^tEaW0lp{+A4(ae?rf?~4pn!hfhE?_%T=1?Q7jf6vMP zvjf&Hpfkjh{Isl4onhnKhU$7}BP5;2Gxj)eiZ|)(3sCi)_HCF$_mFy?qqQN;c!S?ZClr7}D`%;f*P;SafU|yVkCQOqxo4y>TZ$fBh8*PmwcBs>K`9wkW*4 zWx!Ar-c_96UOvg^Y`V?fo~eTyx=F;hx$MdLrYt{arqJ~;GGiQ24#-sh)L)s;g?}ec zlqK)o2Ged#RBb;P2wh0AI}Vf|jPwgE{C$NJJ^+n}bX6)Ru0hi5oVWqKCi>C3n8i;<4?e=#eiBr=jpdh=vzjbSEjrK(g)P{ zyvRD6tCW*(@lv`Wd>p?F$S2B#vl`(WH*`}leM2$|E*hYN_A64-bY{LG72q4`~sQsW<~US1P7N{-hvUAbMe|>PbA&UB3{?yUnlvp znFgcSAKqM@9C8;v4)`Z>j7_QzqneMyZR;m8;vg=xCt;e>CAJw-?UE1OOxGJGaD(M7 zeaB9(-YxXAtRznX!U{Dh-&&=4f^WlHkoUQWq>tIj@BPsAnJ?Yj`i{GMk3hmbXujn; zX+s^AdJvT7r$ueD=&OU(9p;`=M1c|5e7UX=@7HP@(y;t|>QCOuIvC2@PsP*^Pf2eM z1C^fdqdtQeGkA6HLf1b9qD;MryS)_ZyRmtd-I4l&@F&!Yi+LkH=Z9z2l}ST!!bs-! z^@v*2=?|Rojzj7}aKc_r$3*h^uwq0xqdcM*<+G?~r;#{RZhhhqknWHOYihl}=ojg| z*~!WG%b$z;!^@9Z*z9kVz-@6R!N6ZzhN)V*)$%D;`-qNh@gH+r9v7R z2m=+7(|L+5C!T}1XFOr`+J!=gE93={YKX?(hxl=qq&ruFc3QeB@iV8~t;Np983`~s zOG8+t!!xpDMgNC&daGhl*m>{?&}HNq*oFbUFmKl*pdKloFz*I@zLCuZ-&4;|Ccm!H zX@6O0OExH(_EMty6u)ymv=7$azrjo&t`>btRy}P{Ee4bB$2qerxac!1eEN_Prl|8u z&%&z05jsqlb?ep=l3G@7`W4&b+Gp!tx@)S84JELRcIxd zdcd%-Gwq9YBb$-F1;PsI0hp zX&5}~Jbtr|7oHX=pP}97V98uFRrG6sygBLgeLy;ox0s+OAG_R$>GV&de!&bWwwVS* zUxWA`U)pQBQO+3N1@m!$sXv-$17S^HWvl3C9;m?soO5uR9(@-!?p@zA7-f(~~R0 z&oD)&HSy|2G#Z`3_HK7Y^5tkykJj=r=nq2M?Y7TmHz!9@PrWXP>sWroq_(a||6tAR z0<>wWP%qD~wjWAft(F&mT$-G9-bKPv?O?dkHx>7;?*b29R>H3GUReDz3Xea0mX-T= zC>|Rc&g&K&9yS;N5={z7BW*GjD2R-^g3+>EU*u>l=-e7Tp2Ii#@?1 zay2fRK7za2jl^jeFT&1(HZEr^-O0Rb%jz?ql|^ zacjn-tYCR=Q=D&b3T`Df#n)yUDXXYHqpxgDr5XG>Jf4a11y72_8A>u+pVUXTvr1<5 zI!wcV!#`ushIM)GMSfYOndSW5+7O6)V-A@iZ@ImlHjdHijQJ*|d{~*Dyx;99o7+E) z`I_I*L>XO#+yxcN;3?B2GY^%wi);-m;~L2x?n}^M;(c&k+8F&SOR#3^SPV*9q;x4* z4n3?Iz)$;8Xn&EsTi?krrOyvo)`QmGQW~iB>%3vUdLIWxW3sriQgtOWsL@xgHohXa!E`vjOOL z@MZA}*1c*O&QWBPrd$C(pNahK0VCCEksJG)90YyqSJO4j#V!T!kmd_Rdv%b^@O=0SUu@C>_r%vXfgKIb}8`+kpgv`L9Tk1ijy*W1SP{k~(ck-f_ z`tUcoxm^9T1E=^Zx!rf;;m<117|PK(u(>>XQ4SZ!ZtA=f!;DTdan3ID3;BW1R+I}S z*l^tl{?k5RS*RBdlpnA)?GewhoGsBqu6)_E5AswbhX??pznhrW}V$rDyB zLWe$g`GZZf;KW&H?A|&Ru#GW|b3QB?pNiA0p2A=++LLNKz#DJc4>Wf#J~Ru1bj=o+ z{h^gQNvkiM9Wy~mUtll0r2K_{kMH6lyO|KI(sQ5f`T*4sKl3IZujn7*oxbjd4|g*FTW>nL2Wf8QL^m8XBsTUt9s7&kdl!xx;RI`{D4KpL}@DMkKs}z})*(vedD zE6ZNs;<`H+VT0zO%Lj}e>dg0pF2*H-a5|5zdtXq{Ka}Wx?P}jq3LHFK3z+`H@uC!cxg1+ zezlW_Td8>5uNRlRe7U&Bsbw}Q;U&0~U6A_M+=C{0gvq9(@cVFAoauEN1h!G`gH?tl zoOe;sBDjW6^vdQZI@WNiXBalD8+|@sij24kJMXO~92$-BXUA}=3p5{H!ES9D&Ch-F zh1X_T@adK(+-P$d1|&4W9?$OMf!u|no>=D8U|iDwGJ9g*5_&e=nML&p-fk)o&cl^W z8hD_ejha*z%so1e!|UQK5--?+kjzvPq_%DgH^5T575*76uQudfR` zmrjD!cFTZr0jP#K{!P<-K4Xa2-Wj1zq8P2L3RL8=ZFq_{9xWLziv<_x|@m@ZGP&w`=3{=z4z$Y}$aYwyS2TCPx`@8h>D4 z2P?FXKF?Q@H>0H1!PBw7 z)j_PFJ&+GOJ>pR(O+nXK3tH9$;D`GM1#j?2FHNy(Y7G)s(9hb?dXGswFCY;1oZXMb zx`}8tZVzfoZp&21nnb7Ne9$Tf=s*7p%N}}@6Q&`3k3u65{v+iRn@0Opx_Qx>K_%^2 zWUmzH>YN2S+n(^AC$^yW@=jRO(njT;cC0e-vhs1lUf3O21wYMZDSh+x)x##*vIVV^ zeWWmp&rb@Z=Wk}~~daX(JjL1s$8zSlyNgv=E{1EjIk5^ z%VpX}m1>GnZL$kZ*RY@Wlc}B#l72eMesp(-^uNYbm)&aPOS!6MeO?1}Ucu$O;9EBT zHfJ2rIlxa7C(bDa7)7&@{zH`~iD{r?cmaAmn*xM`biErv;PY`41C@@aUZv-;sqUzT z$3nZRYfQvU)b!$eK=ogr*4PbTfljvkKyIbv)-IPX2#f>gz#t%wVlH~#c+6;$&~j*& zqJ{TPXCUbm5ZdYA@HPC?>Md~ap&inEs&|SQCay1)h*P9XeLI2I_HIagt&onv@bwuA zVFY@f^@3M33@}zF6iwI>f&J{1ixG|YCFasT*bU?LRH{EzHzlw`9jBwO-V;R{H zmeQgQqG|n+gsZoCd4K~_{4n3|r)06JncUg9Kl2XJf}|)P!jPxzh~^<%;Oav7z790m zZczTMg6%t-h~rxSWZRrt3S8i)*H<%|LsmAYHO#(v7am`V!C$XE;8ypxEOJaFCRir% z73M~4Pu&ruRjgsTK@QTj!uPdivUN%b9PKp-4AW;}zhOG^yWx(teEIXf6%71ZNWZ(l z;?LgT%adX`;WQ`iBrWIvZCwz$M)Nuptm<@`}Y5n9!N7_qwTZlN^W_xU$G+4`elcih?%; zjted_VWzNUdu#YHBZF_tO%wGl?GK5EcJ&7!<)1_t!@sYMhnf8k^Ihu=V9oYjKwO8P z2E=mGva&kHjdk4E5(v*3)s2`#_#1SD4fIcAJMVph4XQ8FSJDnmVa1OLlozIuxPB(- zdS}5~XkBxumM43&;js00W0`axH@V}5t$ux%?uU({np(>T#q5?e+0UgZKO*`55HsS# zc2cGOTs)}b2_EimBo9px9=#f;G#z3jTLf=atRj&qev^Uf3X*ip)lynN8~^r(zI}SC z>j#CwI;}sLUN{SPKa9Yar)TmfGd!T9a{{OQz*~uXm3M1f5H{=*xr7mu&fxvO3qj~4 z@%yo^$6-dpGMvzVugHU1?PuU|kexDmiFX!9G0G!}I2leE%_k3~uL{im7Njq2oc>l^ z6C=N)kPpzTO&i6lrfvoQ@jq={?XE%d_zui;`2vN;%~MJnNdk{45BOvQzpT8gRV<@4 z68wAVsjKhZLgyc+c(f(0(XP;a_3P(IcgBF@^cM1~?uC47yUid~CxGF`Iw-K7^a9nA z6^{Gi2iF}tB4Ij2ojd{`&8}npo;^rE&>pZyqm@!PiqI| zH6xA>kO&Kz@NVS!)Z0^sE6HzcHA16~zT<35=j8+ad*l2qH;}YDhvEhN zE^WG3E_{GQehW{z>{mq0xaWDKxWKrwC{DEsbZt1Xoe9{QdV-gcKQw=`0d-EqF}hxE zzwr@!6}G%K4{3bZCO!qGhHi%wV{%wZ4y~=WJXPwws1badbBo_8;sR@7K;CbxGcgS# z-n7(^kL043LiAQKofDl=_y^(-wk~`YzaB;R^hak44F;6|XtM4v7x+%R#q_F<3S7^s zdHIGDCoE_qn%tfI_uIMqEE(jI=%+<_8Ko}0T2E0-4PwbBr$(BB0Bd3xwIC7o0M z0tpAy=UZE;ZH?nuX2?=Cv{w{)_)O}d#^F<43CYVVdphi=NN13ykjq_;Izp)e-eIyfP#cx-Rt`Zd1?M0)$^KJAI9%X6i6;KJ9^zxX`Fni$FamzAn6s-Ktnb z`QAhg(ewp5{|F~M$G6)3fN+wNU&X@G3Di4SOjz6j1DpDA;f2T#E97gHtCp)##Ka@6 z2ikl+0hSg|IB_%zOmNYwFXj&r=Nu(rl#D&?F^K2CTTe0O>o zt+DZk6UH!6ccj}%vq~WPPNEiQ{P6a`en$9)F78JlX~j?^ZLFkNBGu>=u>E=-E@mdN zBFED>wJb#u8g@eerr6BlIQ7D20$mUPxAq*8rzbq}7MzRZK|uCcBfLCPoEYH?>FWU~ zJhRYH+j`taflUJ6cGf*7ys*Fzh^nM#0?Dt^n1xr78d$Vqgin%tjJvYPu9S3S35@nS z$$D7%5bq$;=aE)NBfqX7w3o8j*Dcx>^&l~uRgBR-$izh*Mng|7(c|iP5 zdiE>3IlKY+(6yZUfl_hlbF?V2hV~xG8ZF<(xb-*TaucNeq=wac@&2J1u*t`UQ+)V% zf7*X>#br)<0U89K6}5$=d!ZXUi{yROICU=29KsiyMzo%gsVsU|`k!tg_2OXZ&7*Xl zllZtht>2hmgOpD|y$HfFeVK3!);ZOI!qw@xIl@~*xWonSP=A1WJ-vjdr~chfO`Dnj zAkZn3_M2TyJ-s!xoO#G+eQp2hY{eP6f0_v6hM|~q<#+ol-0#CGk!LthYZ|t;U^wZ{ z2Zj14vd{yh-ATh}$%hIPB)<p^^`bg>N(cSzK)L$AuK`0e^qSW?+S6&lP*>xzc- zvP68wi6h|fXPKTw8z7}?{z$|NFm}s+AWRTmoG`Jg9NzRGXwAGP`n;U_Mxs9{Q{Rde z>srVXE5=dP*G114T4zTBVTSPFD75a*h;Y&Kg<0VVqF*Zdr0SBGIWp-4tvA}KKY=}tK zRhw*dVoyyE@+#ZWeC9QO7Bc1>cB(XMW~!~GA#dS&1pnsNlf72fV?*8@CS3o( zI-EbtudZr9V|~QKLXB`i{b_hHXS?Qb;Zye4Y9(aOoWax7z7*e?Fy`(t_Fv~>Y(I80 zwBGfbCrk^3nzi~+=Y=139n%koMJ|P%8^XD9z*Q!_n#f`|%mn8TU2u4l1SRiU03G`w zTlPXv?Y4x2eL-8iJbOMIvoB?LwjEOzn0J!B&F5l!`~A=&r~ofCip2o@$|meHfZGW> zc+~XCe5Y9&m%zle{(BN4Bs> z><+pNYy%yP5bbnIa9!~_INIEXj_=6)UpS&m-gWl(%V{WlY!9OzWhwSk#zNMOme?tb z)^Drs0Qm#ks?pkxP++(n@7_8H5p{#O7}p9+MMrvvbjghe@Me05m}AgcyoIHHA>BBA zGB_WIq33q`LuFPn-?#Z0|2n`Mz8IZ{|_({<-6AJT$Q`bK83z*IQP>rCt)` znS|o!u{GeDoymggO+llS$$VM+>(F3QJ^9mnGt}v$@~BOblrQT=9zzMHNr&6+1R8_9 zsv;i)ogU#--)tE8cNh=q(m@^;`Bqu>Vh`#Md<6LijQNq)7jgL8CyKiICM-X+80Wfl zQk#VY@v7_^IR4-i&Ere9?z%oy>ZgHM!VsJ?!$1zF`~IzWZN{)Qj+nZ)A%0pn6&@?A zu)y#iz8dinH{6~JXZv2@&m)eqo}N9BVuw#RcLK^gSh%i*+U2Gp-&7S2RGV}kF%NcM z8Oi;cCc*a?|7AVh9K&v99OHk#^i;2}7$#lW*p^@N&0#mocOYmrgjb7fA@*Y;-iZE` zbs@M24W>7TMI9Tf7d2yH_p2bhRHvz?$eh-{gdj+Kaslc3c(p|rxcyH@4k=oQ(=y*c zI!qGS!AwpCa))ID<)(w9u+CB$>AHAnV{=$n{Edq|oLHfw4x~LlOs#Fe)4~h~djG`8 zZpY#JxPROyJPIf`km{5NO!4DA>IOpRzjd&t^be<;h2LA_`JXP)Sp34D!IK<}8Gli^ zVe7;C%-Q5}o z-CK%7))ujzx=(poy?xxh$c)i7VZv!c=;3!kI`g)i56bg_*(-8kyY?O)ef%nj{3~-h z2rae!7#`{hCM|!n9|8HW(d27f6xR!nm^~g?!+?687O_@EK!~*_l{a(v4BH9OA*@WdQ8;?hpTc z?hXYFA~0Y|Bfvum3gH%8;g$^T-gjpEzSvORTmgZR_FYZnhwc-2<58z^%Ocv(dAXKK z$CU{GG6@gGweV_}=Un-n!)%{wLtVP7)~=%?%x%yH4$j;U6Jmcb?aP;H@nm*TV`-PKlc)e#1E+KV~LNg(W?Jcv*TUx8v%%da$ksLI|7fm==0+q<$bJYpd}X*7>N?vu@k z6ZoYhA3V8&_6mO36H47q5byO@HO)`q^~!xf91MgVK>47#+QtJXR_qd=wM$deLCe7m z>$xQ<6&@colt0q0TaPrCCupk`^qy#wh$DRAf zFWO_l-Z2<@eKHDu**;w#rWL2b&<8^sCFr=t5tG-h!m97Kn zXV7)CD-L+wlCR!#8GX<9uf=|Zsyk*aG`13FMf_H}@Qg;r-YkXOU zsCRg_?;zq8J2>}9Lc$AH?~RkveXfN%W8*=#f7Dv|5~zngJx}47yXLid?N>bqNpC=| zWdhY;Blf}ZJhNPLi)#Km26c&InOkCkVnOqIMA|jHn|jti4?SGwLX%I&1^%Mos~08@ z+1TVUK-|jn2SzBJ-Ifde!6@hO&!kbz@SzRiYIE7#>K)MMn8O%)&o@z8b7~Af16Oph(hG~0Qsv#FSN%if=8&bcA@Jet82Q7LhifVXj9eQ`XdJZ(| zwFPwR{D+jE(l*^_jL@gu%`5N0fYujieQ~-+?;6iMTq=QSu3C1#InbxM;6 zQ_YGuv*0}2%RLLD;KTO;FldDb<{W$}nQiTiy{6yAej|I}r}y!kk4{JLZHsC(a^JR| zSppY>J2X1)CUg7@Yt)nLTj@#Z)XE(9TYsfa9s%Y`ya*c^G zIv&wLnNu51a{#k#cR_ttDD)XLP~Ky`#%9p!-v}NvelQpOUvJ+OZu#~Q7j;5dB~yN* z-Woq9`zX?lpa8d4-lEVH2HC$+ z)K;IKzu2hB4fvh=Cu;NXT#Yu?bl4*_mhca_VN@^n@<$EMI-G`WV{AZZq1c0QkVyA6 zd!^1G%^VDkt~ZDCBi9H$0p)3rSqZI`l(P0NEF1kDg$}eZorw#!9i_i<7csI*ngPRrSuo;5U7hAJ|&S}E@hOL_%7vv&@^}^v;_a>=(^)_>f(45$_SYm zNn~e>?)hEHRyHA7AzpiBuZ++jS&@|@QFc=I{H~0wl%2h^_s;fyPk+20-aI|ez32RX z-}Rh(PT%~?>DbVkl$KM7%G}&1!Mi&23-pjZpPm_|#+jh;C~R*Dg07TJCR>{Vd(p47 zx~@&@*;Z*WIih}JeMyJi^yPU;b9X^sy1qG4%+FVZHmvf-ca~=abiUG?1idQW78*pg zHpPnuSU(7V#z9;6=k?N0mjl>K)Q<2c&ho?COMKqpOk#yT}sTD5x zQlI{-*~fY?pQ&2fL@#os(`U8ZL0c%e-6&obUYIhsOh(W37VmeqMZVHsPE6WDJ5u8D zoUWxl>Q6eZ_bQjIRSk8wPxu#m&G0XVdz?G4>Z=6bbDx9us?ubsMX3ABkENO$* zjkCMB<@r_U9fCF&&>#As={Mzyzm}@^G{-@kl;%MnIAOfUaOqu(sGHXzHD)Gsoen*j zr+ZVXSENVzd&=lq|7p$3dq5}dbORowK>IMfI6eM(6x@816^B7@7`ErS@s3D8cK+=F zOtYg!eJ=^{GL`7~p6*$d;sfJ6c-rm^j(^}m=IS*9JxiY*da(TLg6|K`$mGRMb=0|R zkYLS)7Byt>HOIUxBksJuFB{c~SNe)3Cl(P=kI!oGX_Twq;JNNt@6_(4>?w*-9V$-n z7rOGz@YATfhVX@bfyXi2_4aoI`Z5oP$CpllpPed|KU?9_kkH3`?N2*~KM?%9UxoIGxLzr2ae;;IBjt4u+{e@I{jV{YW1 z?Iy5rg6c6+Sw&~xTku@-`PAiT<2E-w3Vc+WUZ1rp0=~Sa4sF111MBM3W16=BXPLN8 ziE&X{OuQ*R30zVg*}*cI?7hr@*GCP8Q2B0@`t9v7diJWk-uF>EPMBUsKs)L!I=m%# z1_8~_OIwx0Icct{?%?+(vC1=4?SRAR#@i}dmE;&>M~QuMaW|bJDu-~@(z9i8d*q1c zBLuWGtva=c_DonP8s1K#m+ph;#Ib*3_aHyI8E}Q61yR=*dC1Bzo)`Pt}%N@D;hCy5csVodb%~K-Ua4Cr@hl!e`}J0 z`O*{*%zxMhnw>BQ8QeVg2Ss<z|0R0hdMd z+?l%4!SJilErF`Gq|$tNFB7=Q+K{STs>L~hxx*Qr8z{2%V>k4m^h;}Df;Z?;v3PMZ z{|dz=2Kd21PJwx_B-AIZC_0J{?^%)B{N);Y+Ink?tcMmt}kF4oE1W#x;&d3vd|*`iq0J{Y_CW_CS1cBAc5DS z(Uq!{nU*U3Mm9#aSI|^-f%iuC_Dd+g54{c@_Du@wjSPP(p&bp!g6lXfG#|}+RZh=b zS&T2&Ka>jXN60yNIG%%3bLcT4AHx?R|8vaC*nlI{abT2D;_)I@^Q?O6M&?ZcKcaLk zUufyW9$hu^Z0fFZB7qD~s_WU`a;^MyVW85F5?Yxs#`N&&4%Sj?n#iY2Xe>q^r}UVn zY7BnXoRs6K+sv-apIeou|Gd5Ocz1(uS?X`mS$wR4^Df^#6>l1*Am3V~=0+lWq2gL$ zdbImIPh8zs6sc%MbJpij*+O^G56@_K%@}fg+SRDq?1aiV2-$`ncw`jL)C-o#aOraW zCcNVBA_CtSqyDs2nv_rX>y?*L#5iV4pV~F#@t3zmnZb{t9cmFc54@T#E)0$)<>9jH zO;%Y0>$Y#9zwYyZ`D2iEl%iW>(`al!4??y=p599ZJgYqB@sOJS&$CqRAC^-DK2P?)yp@#aF7@yP)qYcv-UcS%tnb2nVX&htkaLc~ajdoK z&(OxwMeB;3!X3J(kFNSkGO*#1JbY_!HX-P&)bv|T z^v|b}?aj^80>J9^Dla9aUsaX`%pr#n`v{+>d_Bo4Bfz7NSZQM57y(la)Pi&zREeMg zxOs%Fi5x?5BY78&me4C46>@@s1=RP^DQJQSU}-2JgOZ+i-OS_GYw8kmSl*r&JgMWVp@a;a-8PUFyT?r!)!8GPXy zy-fMd7cclxT5@Ug>YhmYdotMASGJ4t;+Lj|1z{>Q*-`RwgCNUnkf7K z=Rk43ZRopqVZQ(DguFPg6=l|q(Xx-vB)1Za*`d;Qj?Tpzs4I>2HU*m(gZLf#&RgWr|ixHybod)W9sg}nr z&Npe6Oh_w9&sJ79@Hu>I;TNIzDM$D2mehw_uS~xA_DK14gZgYLbxP;MOQQtlk}JJh zLKCKxLoZqKf#$7^?_Q_m?FPm8#r7!aY@d(r`R%5oHIIl=7xVLp7YFFX^x|fZE>YCa zbsRq#RLHa)lSH{5Yp7V?qnv&G2lVMy@g!%fOy0PXD)tyo>7gHGkEH2z@N^Y@@3b?i zla|h;*83gh&neiGd*2dq@9tbK*nK~FWoL_r<%e))T_^S^_m@+eZpH6nKj8xFsb}Bw z)W<1Qlq<824tb9f79-CY6R|hs$E$1T*1`bpdF3Fz*z3jlE&5S#tLZ$v(g9hzcSZB= z*^OLoM+XklUftfLLMeC|3#ad@cj}9y(n}u0Mhr)FjwM3|6E<2}?-p~CY*K;gx zq6g&8zh(JKX&ZU==?X5B^MrzL+N*Kk5p6fqxzRh>{l|6QwS0((^Is<8?TYCqfA7S5 zEX8$P5C>fT$Q?cAQB|xdsJqmH(T{rY%?-SLNcDBO2rvDx(} zHU76>o(wHuCZt7>s+EylFK~E!d-G@h;{0Qjg^oI+1|3IY9KGm4@H)bM@eG^y)OhhZ zu2REWe*R^_Bea|B5E)8-54+~o2zrH46PU9OyminsQT#)u(RhWexmm{1(7(a-YiUi> zrD+fY3n*&pKZ;+}fX+U(H6H|*rBI6{G|bLIA5*OrFFbRa-^?sR{olIkzvm^<{S-gVx7B1smG zwwC{mwb9$&3}e&=&Ha=uo5U=pbMITx$9{WgWp__=nQ>nhUU!nr%1ij|@&z>a#di9- z<`;MF|4umDFAy1)u6!ZAp&2?dhr%pAi5^M0T9F1SO>?zmwo=MO)u<@;8{#P7*T5l2%n zhO);|R`-+W-Eq*VTFRHwgk7X0_@`MMqu4`>>bSlqdw!|4< zi{}V+uk$Ok7EMa+q|}z(xuS1vZaI26FaT@U!nVrFi`H_`vf~^-^OZIwwGIOx4Ah-) zpErS8jN9*))B6PVl^a?B$HdCxW5tC|ooH4gUtaa{rWkJbMjl>TK`f2K8S8dGsFE>?S(UZ`CArWnsk^OJ_@GC z@{kedZ%wEJ19Qyp8y@GTm2c`1ap`K1>tt~<5$ zImNw-maXe96XxO^Lf?YB>#=LMU3b)@sgpTKs2CNJbHibs8(g*X` z?qdJL_+EJ4d$*)1+cm4k!Cdgca&o%rLrObgF2%6O_3WF^MUAOkdHw)lK1J1j1r_F! z+wYk&WME_HfKQ?>p4t8MJVYowZx4Mr=h|Lqyb(NSSW%NqYw&eJuG;o@izuss1dQPX z&EI(JTG5>PsH`mXvL*i;P+sg?lb?R$SwWYLLpi;m52<-RQuc|!XW;MOIJgt@rh4Zn zua`%j6RiS{vU_-uh%FsIvC>Zf+qBc(S{>+E0SF&*@30Zg9_ zO&BEF4Rj`R@i0-_`=YdrO`x>IZd9zx5A<`E0N#jK*N=z~+9wgvaT%}J6GCNkZ);xt z^P5UHsJgn4zTW_*OYkNG-zl-5qrQI&_M9CZC6rdl&PHa3IRg&~;E|dG>}}X7ucxez z;Cb44m9anE2~p7(Ylc(a)9?ga?M~7Tk-4d@;s?4`YfS3T@8`t1_h~}uwAzE$sL$nR zIEVew<{8K^BQPHxjG7|9SF4p?GogQt8^gQM{V~4m*tUeOIJcJ97U~wgma2VR159ng z9m7vx&L_~HeWhqXnOMR-X+@Jpv%2rV>V>%Y&j^7&Wat@l&b9i~!Q!ddU#&B(ZD3)# z?5L@@o`It@_(V-Q-J-CnT}^4$@q??<44Vn`Xs0f7PuElWRpNRz;J3&(J5Acjq6GZV zpvN`fxIWpjk|=%a5G^pvFm#MWjS#q9{4V=Zs(J>O$(w(C3D>4D-cX;nf6aJ-G3Lcj z-{Nzpv(g0V1#e-F7f`V)JGk2OZro&jE86fgL39~ET&zu6F9!E0z>l1Eh;GjHfzuTf zcBU#Vc4AzH25oL+pFhe=iuI?kpe=kkC_#+B)J8biJrGYPzvS%mEvey+bYr~tT}Iu| zzn)il=$E!i^O;UVj|iXM@rL5q^W_r7xgU!q##2L`38j|LIb<=u29G##7xwM-CJ46B>9(aWXjkggkTRs`59f=r2BgAA3N$XA=I+e6;zy z(jZdRPs#Fb&=iIE(BQokc_odyd@do~ru&ha1N>cSD=~28H#s|Fl)|z+J?7Qjq^&u2 z;{~e`;R{K)xH)fUA(4ZVRL@y6H$OP z^6?xdiuo<#n$2;(X$dRM`ty5!pAfG&T|&FNVXR2`h&yga1>WDt@hq9A@yFj@Mt9px zP&~uNfFgPPesY1k@*e_xXZ+naAJ@_;wQRm<@KrLOdpe6Q-i#B6ZkOTLzL&(g(KW^D zh0iH{t*fb<0qog6Ob$+Y3|*hD0RtuGmD+Y{!2M2n8WxjQ7#JVzzmHYni?$m|Gs3^g zmrb51Tx+>!>^gYASb=*c%$a~^f;I^ub&cRg;dF0{uq=H+?ipLwn7pGY6>*D{QNh7{ zp_eTK=NLYKm4_gdQ@1lT5-BWs7ui@qkMitpWsOxY`w64xX#wtI<)xr$+-}Y|DVqCe zrd6$U5x;03sh-^%SX8g}v9wg&35=EhvNX~{Z;<`o>d;;lz>O8zUeB*Qfq?EXJ?V@X zW-X}WhR;-YX&|ntCCy4+N?mZK7*8C><2**dLoef2^A?fErrnC;l%J=TLpmA{tX_%w zEtBB^Y{ZTZS;nbdiH6ck-FLU=OK&Qfzn1Q#4{2Kz)Elkj90-Vm%|Cw@x*3ZCo z=3xPJyf*ifx55-^TC*}AJiV1F&%DISbD|e{?7>PDWgC;{MgMz#7yWyHgMQ>lr9ta_ zcVhS`g6_lXb7{hpR1V0BrmR-$Ro|1E&moyu*IGM_Ui)?@l^wu;kopfkPfYFUmZ#(U zY`!lpUU&p)DHzhhG#oUOqLxxolCGt8xHR*ypI7C)5%h zzaPl&@r*~u()f<f=WpP<{8QEHY8!TUqIjg`=0I=nbRFRY9vl`i_WYZAeWQ;>F!Oy_Y_EEZ8 zKD6DZI8dN}IAq{K;9-Jsw(}e5pYYRww!nC$3gtU5Ta?P{L*TB`ZN|AFLmAnCxaU{L zgm>rnT0sMPHV?;N_1MbLRs;_w>WpfKJfaS7KJW;*Q%lCyu0a+z$K>fzcoOBud7M{W z_Q@&0ql(Almej*M%ti0hwAW`;?aDDOi^amu z4+y+RyDGI*zD6|Y_?)3hln*k1>juV8M;2g=^Ge|MlQ#0h&0$oy;$7J^@vxcL^$z&E z3xS8&(xDV*#eL12rvv;!k5{<)@_hviFBu1T7(UCv4Or z`u`H>H(C+fj;nU{U}P%<4Z)}bfqvyddN{$mlk#fY@)__zPT*E&Qv7x_W{c7$Qfc4O zc;@x>!x!NEFiz|j4eZ?sUx@Qq=gm?0%HVSLSoKu-T*d98Y0O04zvi9NnkF=z;Yl5o z7N8PVZIE@XN`*I|H(v(HoZhW@+K2|+`9W0P{V9I?v!g4tZBJwmpSZ8<0;Ll*YH>FY zdsLQmrnTf>McwgCPeBu&Tj>W)&0oH6aRfbMDoq70V84eKlom$r^AdjDSx26fHx9Ei zUJ`0k{=*tMr(%#5g%psXK$>`Z$ zgT_nUUoBHAtuxFnkdQTsQPT|0CO=^NHHHr&)TFHZ_doS|RvBWxH-3yfOyQ%_`$FY- z(1b#9CG<{S#<{%of8@R_$qjl|Q{MSy%1TBisb3tqSQHu_Cr0)wr6-LV%+N#Jy}<(- ze|nzcBE<`&G~T=ghj@0o%fP?Qj7(E5Fa5%pRJ4YPTvFkjjvQ6Tbt~T|mNjcHf-m%L zVc*2m6mQ+cz86;=48uOfTWMLQLv3{ALBMbaacSfSVLPTNZJ1h0^)Pa|RnW;rlx|Vp zM=q_}9cSdMp|9};q#D!zhNd%m$M|&b6pg%>z!sBm)-U|l;FO_S_;CvppOyM)Y^>@R zA+XMQaD|z_bOMUhr$~T z8HvJfrBQg%5N{pVo5!QnVgR^jlhS|sz}g$cnKQkhd){k%hF<0mZI4ie%=5-3S6jVm z+A!7U3~#NnWKwy6s{5%odN7&G2xBRx;X452S+u0sZC3eDHa!v;1Fh64Q%=h7$2_Ys zzicvGKnwG=BWD?NsiCg5n5eUP*#x+P=J<3_SefVlN?4ub@>M!;x9BniF9B^jBn3Pv z!`p9QSJRXKRxZGo6Yhw~%NK9~cQ-tXfi*n%^LNW((&3#QAGnjnDLrv+aQl&ExuM+#z}9U%c3<$^ND3W#3T!R|GsoP&t3SL17EM8{at5s?5yY1 z_pya|z6fVk4;`;%Ww+%42mQJ7hF7Aiy*KqM*HdJ7!uRJpuTkx3Hu}GAbJ?zQE^swc zTHOAod0kq`U-}oJleZnIY3SCD z;&Os7*T_Ce#c{4zz%2(FU;UXlzoaXD$#@{^B-|$4hw%Mefrk5yC5#*094L8PN*n(0 z@jcB6>P)sC#ijr3lKiPnnsNMOZz_fLV!zs!A&d`A-BMA%e!YTz=EWm+oO(#KIvPzs z=a<);dv2x+QOCLV-a{NZC5VB z_Dl71+!q%LyDmpB`5`jGEa>R;BUE-)xY*Uek^g!(;7WEGT3hU$Uh4V>k|Qb$oXRY$ z?ROD=PPY>qnSNbnGB((xk=g+2ytWt*K6gMSB)c0CSIcm>T^73Ag(vKr5}6WGHCb4- zS(Uo3Nu0p-NvGz0$^O?L%`&yT(YHbZ#$+S6kKau>PY;ON(~w71TS3kx&KQ|q=Vf5E zREb*RX2)W+b~$_K^IBUzvT_McoHBs%8j83?!nf8~@mzM~e~ zmqqlRM?Co0xh1m4*Uh5Z(do4LX#r6h4DDt752C!e??-PRd0YjYH5m)wG$N#&UVjd|fz zYccC|J~h@fv1KSvANUM4WK9p|PcSa;O`;$HM1zusxF^WiQY)jJ=(t{N&a4o0hQ8DhdrTk4qWNRJ&4%V8rO;9d5U zf%T5)C-c&QVtnqO3r!nVUSBt+JHJg>%+;4hdL#{mIbpy8MP*gTQ;GZHCG#1H#c){51~J88n5Y1YZ6{dTN_ma zHe8lDdzMm)_abr)isn7KpW&2VTfZ{#rf}S!ELBgS=D9`NF;r{7Z~`{)S-r3xJt9Ds zuDgM{H{8a{EIe!?ncY~6SU{8yC-Nk?5R_1q?PGJ78d}c;56SdC+r$2TpvAiDbzaJ+L#Kv-N zTrF-_{-3-#q_kOj#3m!P8}_3^-_3YFnC~6iPOmbD3f!ZxKiP}E+4qrA1)s<_&kFJI zkLBdyX?}!$R<$Y>F3!qVfDa9QCo|IPsG1iwYnC#%TltB}X+K16>_xoqPV#^KR65i! zMH`-IYS<1Ke*vFcmYvz(bYfEH>6bf@MwwCmTSkkxh) zz&WFce|ve2r;2$+$H{uR(^>V+iZmy2@B0PDT<8j8ft_MxMj?H!=Q-nkP*ri{?0%kT zX-!@2vw6~4E8V74u2|W=4e8A-O!SE20i(pJJ}fuBqmm)L7_~;{mt5davtPyh zZZ$Bb`mN_lsTe1t*nwfZt6m4-(g@1`Wh0%&xi=Zddr;jLd$=QS=52D5y!$t>1#n%a zmfI<|eHh0tTaP01@M`T;?Z~{jtoO6Kj@mVwy6zUoPP@n|uTu#<$G{)9xswTue8kOu z#c9AId3Mizv9o+{URtaT|957uC{In$2OH>@&8ocmFX6pVx^#}FZ6Dqm<>?UNT15Q? zlX$FuMR3#1$vKfTzWyh+LjhRqqcF!dXvSc*`s*K$$y&S zs+Ntq(x)P88TFpmZ@2mn650VWP}e7m*eKmqTNgVE*gAk4R~baTTMh;9r=i~GQ^EZA;ON^0kf`=ZuM zSBWvu7C1hXt5!Ya`Rhis*cNE7CCypQ@jGhBNS6TlD)TY*yL%zEQ)*kmbt{-B%WS8E z{%3gH`!(Dy!BWRH$*}l73~tcdWImFyg$%K4YXAdJHO1|ZUxZNj;;m}V3B4||J6APV zKesmfc<&X3H%|nItmYxzuW-!VWAgpTZ?b>gcC2s&*lKi(+sR|@R5e3$ZspZn(tCG> z2cpiz8=Uj_rchi^z&e~4I1ZtQ*UHh=pFQ|PYCGI>k_hp6NGCm~YQz2BXzdaf@zC2| z^4u9qa#nkjLg+4S+OYKsr+9DQf^_i>_B*hvVmNo4M765=ne{uJK~1~K@CEJB z&y_G9aa{H-)2b}&TUf|n)W~i_>l$|93f<$_>0doL*KR9g?(rPbOTIhiH#NZX^&3~a ziV1rM(^&tF+-AUX(tMliE4WiC`j)!g!9IijpZL4WIac@lJ^C9v&M2ybhZ#7_6U9M! zAUcE9Sikl;EPBm+sx%s}Nesfd(BX7@UkG>U-H&mdz?O47tyUSfxOdU`_aI(&+Z9NY z&MxK-jjQKrJ7@*+D<98M9?yB(=hHkUdJBg*+(WHd>Sw1WQE@Sl$CUUifQz!qp>SDx z*h%5GVKp!5*q#T>Ep4`+7)YYueX=cBR9nBWQmRX5M-!Tg(C1Y4pc^Z`y*w>M%yMhM zU-~u{=zWQrVvMQSvU?#nayr73EE?#oBUkc>87&C&%$-*yk*XVoD|lal-!srN64+}1 zr%+#5Uvg-q@N6GR=mTxUj1=&~Vn*%c)iJn_+U2+?4F~P@m#?0vX$r@t>U|}&B4?!U zrmM}ox$5NG26Pdr>xnJAn$@^t{^;t7oz#EJCrxqm<9>sw^6(9^SQ2q>o07U0GCb&K z1J|IpxVDaGOfMp4>}y8QdE#w?mA=C#Skz1FA}eodgXh5uN$4Qz{@;1N+W5C@;`-v7bf88@~TQx*Ldkdw*+%D@h>u+5?<>!I(Wd`tt z$QR=7Uke>`!yiDoZ>Qh^ZUQ_f0)2Db4%JDgMHBkSe50LY%BdR~YERaPIz|b} z$Bei4=E&^DUYg>219=8|L2Gr?krp3!Hs^GSk*aN2j@aMzmuSB5jIdvkUxG)V-`>MtRMBe=T_=pYu_BGI7dzHObk1td!E1)0 z=I79gv>2{mva+f4f9oryH1s1)S$a|Zolgyqq6PayHH;VIy=9b*$$dlq(UaYKMdK&^ zsUy|`-hSfCf6flz^T9i5Uszv?veCuz#@%sVsU7XNuOp*8Mry!H4Oq+L-v|lqCL0Yj zRPB<&W&9~8LtUb0wW6QO^Sj2*3MV8uTw>gSlP$PLl)I@oW&1^(k#??tKH%U}u=GP& z32QiQrwyUf3}LiZYCiB}a;_=s^5$>)PvalWK#Ufk#>=C}ZP7AbAsZPHVYt5cqG9`}=*EAL02ewM%|!fW~6jw_<_hSBV^?Yw}t zH7-v%AfTnG^+f~s_Dxbl;|x!J?Mp|xC&e&F{g@?*wvUs@LIfm zO;PZRPs@2l-@2W=9j&P``FZ37&!lAvkCZ-zJ{+O66S=L^2>nQ?4LaT{P^@d1CH-If z^Msiz7&xHrLsZpm%rD^sNX=#AeZhkE6lAC0SHWlbDeGos`RwR6S!`x1&Gqa=>UZKQ zy6_c?#p-@oU8Af#(>w0l!p-cGWvWkJd?XEMFsXS)4)8Yy_VvW`CcV=aUjFQ#d-egKvA<$SRekgx`IF*2cjV^b zQnYaDG6VN4p_l0BtP8`n#5zqk_}_zCggQw5xL~84Iq4RS ziFRP`3(KK#?M(2QcokVv@A_yr1rN5$Grk1D^gWg|CRELgh#JJ%!m4 zy)M$Pjps;wrv;y;Jb@f@vm*e%;BjA;45PF?$r#*yDJR*@f@t5$sqThp> zjJ!-jr?K0hmE5(*e1*+)($0%|+e8rlUGEU{U7()0=cl%645f9CtF)o5yVfKCXMz8y zCPqvh%>GyljJ|ejSMjDmok9aTn9#2R*v;p(12VHzRTG>+G40kde6~1uW)Z2H0VXNm z#P>b7P~dA@2@k5W0qE^WiF%gcCO2eIJnL_QKz^WVkvH`_qdh2h5Pr^aISWOi^-2L9K^xbFE3YB`F26-(U*!ZrPlgcSx5?kBpf5fJ*k< zg{<=kBgYep2a!>TAD`Og)qm&yA#(S}lWyi)lgkC%liwaC$n261$Q+{;?}~pF>M6f1 zye|~fZDM06t3*dxRSzbGS+6b%ZY9rf0QUFCoS90)sd3r;u?@YccuOLS63{IYV@gWf zg5$~lFV0<3y1?>~k*~qlyezlR%0`5Y2mY@Le5tNHyfJKeJNfxi1gosK<)|6>ykdIN zn~{X;0nRStsLOV&^185ziSkFC5AsC!of>?Eu0G$^Bb+;D3{rZ8RZgJpt69VE;u)UF zo$zv~x-N=ySR%Xj_(wKnFXj2D(jzJ}5&I3_MnD@^d;gv^d{ zt=z+Zvda1-_?s&%yOaX#B)nd0GRei9Imw4nuWU7&Wk6{sRqx81Yw*Q%JhTqqdbONB zSrhNc3WHw=73e$V%Z%qK6OcOw@bi3Y<@o7u`H63;w2W)X&(kc-f|pLvib1{Ue&R3= z8^4;fJ`Lgym;ABr#h@K8TA1~g+Hk>rEqMB*9)gChr(0NKR2l0B7MF|=n@1;dRP1Tt znUXDRZm~297QotyIDS*{wix9|`@R7PRXtUadI78}9`R%Qn%eEvF1)kIm27 zx?&HJ6@H9At{ls~x^0yBIlUU^k{W|^cc;uK%bwGYi+%|KRHU6Zg>|tpmgKu4O7`tU zb>mml;tvJ&lw;`AmuK&eq_(NVREEh1)}Zsj57mHaC^I1+TW~V z^s6I_LFJRF-IfyivpN&a`=Ph!YT$19^=fUs-CTU%v*i#kcwUsx-n7?0y-sDX{fqf$ z!fiQpb0Kyu>qoP{ISK!`e7e`C@^aLpOWM$*5wxh6b82eB5&qh@C!Mg?ct*k+sTfBYJouh5rEgKaOLRNlx$db*E^t?h(9hH_;S0wFMNz9gan!U!9Xe4v zozpgLOU>HvNz+%|(au(=FZx9766Mni>ptl&+~xR1?fj$FT)I^%#xsgghcvZ-o7r(m zAZb2ZxL?5&ZrA^dGE|)eFR5nwzB|B;j6!0_>BpF_6_{5`Duc6Zp7^@SatS@;;txw` z?d~ERSmHl1c#0(lzP~44y<99V4$2iLPCKW4obZ?z1vH?G`Z)7Y%WtxK`>N``X<}D9 ze!0(s-+FI00x$HE>B-N?_DZhY+fHJxHn8Wd2mCM>XSuwpN!b%$=e_>yk>Y0VlK^pO zh8yXQiz&&~S*SYv(<7ON+c@$%hpAkB%Lj2_LMx6~c9RmPEoMgxOG16=gmuHQzGZnP z*7BDNIU}1s38lGO|d#u zRA0;~lfKC2Z-XR0Pc%7yg`-PY>tC@?=icg#IO$6Xez1KNS+;T1hhtBI`8|L0F0xNj?=>bKX#9pt#O!YDbytRC>I~OjJiahl1J_aYALJ! z3gDDpVe%0^bmxYw(Ig)w+;XC@@XBf)WZJ(p9{BIKK+UsLug99|+wK|X#7nz}996}E zY`oX-JdXpkHTQy6_tj3qm~yRZCursCZ&JOd-PLFjSmK35PjDs2;poviqFkmg-St__ z*$4ljZ#?Ai>w}tGkIuhj%Qwq*pb4MT-O|6$BGkGJ ze(8bvE3I8^S=Inf(fMP+RG^6;Jy^61bv#`RygwP(xJRDPzeT3aj-;J8e^ApJj%;6U zG}+uDY3tHXPmHvs-!1-d70(wm$nBUMKK7{QTJ{n5y4r^JMq8V{ll$uxvlavU+tbM2 z_4&wM3s&`J6IqML7Re^BQn6xf@B&&|p$G%FS>gAg%47M|*nIk>^%}1_v5~<$oH)%& ze=~5rnBVA=X7z9ZV_fOf*ah0?d5y)AG?QvH!G5BFZTY!V6(b_!jg0!cnu=N;=K~Yc zcvX(Gem=hg`X@#JZzQl;I1ji>J`3%+>B)R%>wu!{p>;ANo7bmdA4aIYQ}d5|I4Ljn zsUiA>ypq>DtfZU$d4bwNmoM~B|0tnta>ef4Vsye{50U7a^Btr}g_YY!}-x9+u&UBC8`xCh=FjkDw6OHyt7 zuvNY=`W0(q_N&>MebV=++7&&^^piP9Zzyb}O_S#`aGcO@Jb20?ZOMSGhQc9LQ#E>r zQo=lM&1L;Hg|`YTQY$p9#$O|lU1XOxf!(59!etHGgZ`BJ%s#Qzc(_+nVdb=rZKgSJ zto=f^`FWa}?C!`GN4ut0&b2l%zlsaZ@IH&EyK^~xMo5SN56OyIR(c0~Ck)*n{Vd|7 z+s4M?)2(wv*f6OA?qZvMygE*XFOGIeto~4{d-^x3sSZ zw-R&!gMU@s8uyWj6wjzZsCj-v!wHy$F?!FJKNrHh{YmXyeY^?0&%56bl`PGi2agEX zW{$iRBtuKJXS`Or-8(IN&iH27`^@8U?bh?9^@iYVL9K7p;UK5G8Z-ozcG$-@DF?ah zuT?_b>z-F{smYrGN(-i9{$$_GzZ`x$L9RVthR+|fF@w(@;qJ>06FqZRxa9^O0zQVj z;s3QRgBtPoyRpWh4Q;?-2YAGhOs?O@UDjGM1YFciv-?tq%EtzBk?QBcSJm}#?aG7m zmT}$j-6?*bgIVdH55}oFI2@k7UJQMhzl|+z1}YrUQJ)mOrXj2P#C0lOF^+EklzJ7< z94n2d>J<1T4^@7{@1qkG2JwVGIb!6c0^;ntAh~C0H@;%ki!FTj<2h4TS`*Pz9QW)h z0{5JQ2K&W>X7?uWl;U@@=<#~=yiIL!{d^1N$(5;e%nfenJYAM6SVga%_7l3ZjP5#V zucow$Bfi5^d;v_xTvX88;u(RUpjqTR_Zjv4(nSt5U-0$+DhL~I?8l#83UxJyUya+t zZtngRGi;=6xUDNGE*@5Lk{oAgCCrAwMiuL8TIrL1RKIkh9JQ5LY5zNaUB%8L6Xg5j z&1k@A8&Y`x{9y=fde@szEH25B&G#C>ht%gmCbeF>j-Pq`q>JyygpL# zJ%8HeY__`4kSAO*_~GGuBH;W~hHhZgy4+O!0XQ^T0=uQ_*Xv^M<4v-mb1nh@8N5dK zYstKM$nW)$*S^_GZdH5*`i(=qZ=-jjuT=XfsKxR)IBS-ugqA*%QFH7hJ(edmW?y%yr+k@?P z+;U0|J66RW@ino&H|#h1sXX@L4k7d*Lu+yO_S+;hGB@itm0n)*%Hx{ZEt>0?2dZ4Y z6hlX=-_uZ6bSL(uEWXT6`4Mf=jV^ov{tv!Lq7S%fhuu`>ZUyz(+Lsx3#rkW-q0vt< zdX=Fu!7-f`c52`r?M@XBdGS|26TU=YFGH6SFxHrU=&91o)Tdt=v-_?zg0^C4P)6U& zD%QP4`B)3uc+W-;zg?GAJ)wW04e{K5{Tmz@)`}Ge^5o6XGnM3%?@??QQItGWyk&O8 zRA{JToEqXH`-P0=x20_Kc223XR@=^M+{K6=54rfRN~C&L@i@4e;5lULfG`PNXB^m- zU(K_C1~QZmyVbq0jO^EfUtwKKL#wwmqk-NsqguS^({HU%H3_|FYAs6B=4Xqt}c;<>aLXVtiayW+ScoBO@%|?DFNR{cl@#?xJ20d{8gBy zaGD17&mc}}#Oqr96BAvQaTvBuyX#{`Y8?8^+zRdYNG|_H@z^l^iQOW?e z8{?|4;6`^!vh~&6XHE zQhim+qGeAXxhVOhTco^B&%9>Q_nASW`?6;6ZC?fI8`q_?;%#Oyb%&4K^sP;!9*giJ%i3kl`zEQ6XJz2knK@VNx7?=una>9=3m{^!l_u74sy4b$MQQ*xoB9xKCDCeO!4CG5PmVc*)k9%52oVjl;9Ts6S}F z?&8ecOuln3QPhnu1#AgNKR(c0QU{4zZ8KGdAoJIGPInd#79GZ&(Ug9#KRpBc;{Fnt zcj>yS1$4W${&Uo6S`}D`fRBW1O4>}@BI50I9^~e(@*z?+to+~P4cKSpULwY)t(@^T zUK~C3+rZqaoJJ-_q95@bUtHXFm2JuI4lPXRO@=Np8{LUuXaJ-5>xL42rnrlgzWFZg zu}6Z*&xapk&!&464lq0`crhRHvrDo_buTlz(JIF02$ctU?YH8KzivWTJX1Kss+Zsq z$-}o7*&cW+%8fG7iv<{UY&g#y!N_U|T*0NDyrz(91q|q3D*N`S98Fs&AlQ$=QDVoL z`h>dX?@`#xA}7DX7pZb3a1Mv2e3!^~^c`dU6yCC9>qs-;{8uVE$d=(b=|Dyp__Zyg zmc@fb)&kyu?iV^h;2Sfk%tiwCN_e5X>r|RE?D7GjJW`Y0XQ^p{bq4e^BmWSmN}^_C zZlD)?NTsdd&y7CKix6@_?cw$35?&8J{*>wi^iElU+|A6c-sypyRi#PIdlchKKn zcmAQ%pxguvy(Jab04tQog{E1Uk{$6?dvc?M-tJ*_{xkU)bm4n(Vn;>uYEDP_cG^za zeOD`rXrC^-kF2XQ3Gz7lQH*N)UZ|`|Wr;_I>=M#vxcD|Pl&@9}gFXnSxZx{lvQbBz zSR6riUv@KmEWx81T<(%Kal$5ES|L=9E#l2Z=a*;2sj6?szRIA^mQN^ZA?4kd;w|Vt z-c#f|?xUR8zp|5gX3KT9o0wne3(6hR8Q=BUlgdX&PEAocDJkCqttA)Ku4;N+w$00G zVmH^J;3csH&qDUu*&JDRJEb{hXz;dlW^QNXLtB&v)FU#+idd~E^iM$su5yLqID>of z1p!SibPrpGR~La}n(6&UJ%pBsVQ`7c!WrW&kO$CFkKVLr=|!V&<~&){(u2H*JdFg{N+leh)Un8+j?t zV^wR=y$n4sr=*0);qK-5QdU(S*608q>~@jQpHHNuIA@wT=Mzu9+L0P)#d*x{l_G4} zewyl5z^t%tA@3dF&J*n0$|e837ux<}=JmCoIr49PBfNDpPHsKOnDHc5X4bzW>+P;D zPc7)c7xsBmgOu4kr~y&Y1-h0qw4>~~@gp}l^T=&_!Uo>3tBc$>rUu^+$<>+|ACO^< zcUxhDH7nO0XkNcPa^`0ns&=>z@A(lSJ;oNIdFa#UbI!T0>piZ|xzDNC%8i%*dr{U-o24ZUsi#jFdR*Y& zaL%y3UdlMnsl6MJ`=_enVVzF=>_Sm`{Uw^l{kG+h#qGI|Z6sMX?M}FEQ@z0i%0moM^Q4 z9qs9NQ(Kt3FzLNnf`8==r|Q4*LMC7 ze@5`r(m01VzANRFT28ya?xmv@&cUZy$*xZXPVXUkK8WY;Nz#C%82_v z#Nku#Xj@QKvrqIh(PFfdx&3ovy1l6|uf4XOm(IGu#U>BKodTD%1M7NA#K`Df{~ATy zpUrLZ?r^F9y%w(NOXSQCbG_zw>cChdYI>Wv`&KJzTOw6Hy8{_AvzUFx*r3Mq|D*Tn7IOpN0iZ7Wa< z&ZVOdG`7ibH}kr+qx&W2le=S@_Plpra`{u4J|A(=kIac6=jEaNPx=1TeZ_9Ey5|lif}1a zn6{j+q>u8f%^95&5chWEmVJ%yO*qS0t(uvL0k0c8TI@?HON(NnwO$u?iIN`&QuzTP zylQ*^4SkskU-wD$$ZuhUz6zF&(HA=x_uA`C??TFA_N=uS7b~{Atjcb2o6e z1ub>ts0g^Y$w<#=POq!B(K}Y!BCjuvWy`0lG~_!!$*&~x-+U4uI^&KZ?_k25W$n%W zsFyg2wJ`h+++s_cCUmXaR=%Hen?lyPas0h=)cu1WSIzt^de`@3)UH?mvL)%q>k72q z-t9U&w4;%^uIX8EC(D|Djkhy{$~NY)$E%adTi}tf$}MV6dSA`#SD{7*4#f`@2kdHrbFX}E%_!TOuX9dY7Ggi`v%st*LRngyA5ZmY_^uS-(=AKF1d6%X`pO=aG^krCWn^WOVJ%8 zd9q(O`rnj8lvd^#sWH}S^GCDEILK$KR?=5hT$7}|+=#fopfiPh#rK3#{QG!eGob2F zZQ7FtrpNiA`l|7FP>bc|m@5x?=X7`ZEAMGC#wBW4mC`@o6+FnSL#j?Eo?I`dG+#|S zJD21NIIDYir^)h1s~qD-i5>iB+-!1tnncTrpA8dWlwbJ~?>@Phv7(hX`={wR85b;LYdQ^Pvydm1#>z8AZ}*;h93 zs)}}I%Z8KqV7aU8+wQnXT9%3Nlqbi=Quwc`#6#}(C-0*#sf^t=QhfMI+S9B!?AvJ+ zM%GhriDu%p_}8r*TTGn5T}vI{`sdzIgWkT>x|^W+)pp7AZqG#5CrbqIQr2!~4P2}v zY^VPxD!k~ea1*$*gwit-X^`CqaU}(N-9}iMx5KxP>xcd9yLlen+c=sZ|o%`kXAvym6=VssMhu0UW zxrwI{Z)8MZ1gVP6u7uJ^jI_zg~6#uWoG6u&pxQ&m#iIF>S&+VC; z`&eOWxvoz1zb)6OncaE*IjBB$Pj7&6loKD^1#xjVwMC;`yDes*=Ah@7sF5tGD{bLgIa8$W|0a=RoKbxxj~aAQ zPVfoh`W*`C0}pwdGpCj@vDR|g*#ALa6$jsKpg_w_&{#8h#)47YDfVpvUwMyT$_)zR z+_W)+@>YpY!;pTi9a$bw=(=KPO8)A|ad7 zSG!Z^<%gwqWQD3h_SrpKp1>VeA^mGI)=w-tjPIfLMTw^^c5Bd;R6VOOd#85ikmu70 z_@E#5w&36{%wJyCfPP)Yp8vSYa$Td<`xNA>(ySxK3a&b*zJ6_XssL|Eg)Nx_a7KFl zW$fv`O{g4$Cep9gcqR47W}B z_K?Hnjr7MmTUS#iY=(4?&-n!OC30+*kUthZRP`R%abBv;8 zV@I&U`0Y-&B=nQG+r*IIDhceCQAwTx>!3YfI9JXt-O+GOx5T};8LaQxDz0i7}jUaEQ_7N>c-QFZ{MlVa=Z8`Pa3863jna^#$K$(~ z)m?eRx!nbNedK*?^g208HV?UHjBXQApgRJ-Fds|!BRc%*M$j+9HlVatIkh&ay2g5l zst@kS+ZEo4DtQgfFI}$+@Gh@EnZo#e^6OKE_t8R*`!7f3s4-#U9QXEVzt~><$ zPP%R2J&hPQll9A~3|+|Z2`1`-Dj#hP&77^YG9$N*PV+i3G(QzNIY{w2VU9{ef}1w8 zE%ujWZ2KvG?b$;2PaNl>=hCFAv7i?#IJD)Z0{;emA(mKr6Lhn-tWkdn{_?62X`@3& zF+2!xyA+Ro=tCvXC*cm-4w~{aiu?DK9U!5T#r37NdGWXY1iytdFypAp^=i;J@90g? zWL9-yI~`|DMO4;uhFlj)FT&GkFK_nL6t?(QvBj93O|Mx+7(R% z=ixth&`-~$e0gRUam8vMFM$F4R4<3`crl*+~V%T3z44EpHb7;SDA^}Kb4(agM{Kk z#UE-M@G{c6Y8f5gLRb0}^~{K|*dd&yZAgOH+}o0d;JMXs}~czBbQ&YmmA4& z_{CkE*z+tfvXK60K{Y~6=*n|KeiA?vP( zzgs2Y6IuDjBbmLFUK2OHW@5OqP z>Jva)Gvdw7zJ(dFGqI0VKh6DQV@>(k(%4hj#`&+j@ErFoq&G-`?$krf9t6)KPdVlH4DM3k-Y)!?5Y4MA_!2Me2D+_bY+v~Efe?Pi6?|@J}k-=+U5pW9UR}NA* zMxtwbM(xR$@dvd-15;_!&#s20^ZpG2f*KyGj`n?fU~K~2xv-u^oDG)P~OwNCq&S=+9z1?=7(=( z&BxZC1iUQg)v7_QTHO$ei$+8a<`PNQM8`+A*suCcDzA99qsj2Fe5}bDg74+V9q&uq z&aOK8KCCo5gza(Q{?CFP;Sne%5P#;$y&0X$HCUK{kEjc&KLA}QXuRPC!cSo;}!jX7gP2Y*_V*MushABXJR5d6C0ILf4XZ_b5RtlkzRq-n0^< z+mxd9CtEVSt)}`1E$_$bD_#eJGnt!Y^dZ$dyR@SOFDmk%Y2R-KM^4N{z4;Kd1}mQL za(z34|43mfG?wnQW3LyqD#K4uzcnifSf~0k@`FdTsuLcUhP#t9a3`2!lvaOAEs6de z{Ba_~*J%oy(mxL=rfsUBM(@Oa({U%WF1sVl7ARYRT&O-q6P2lc*HQip~R zb@R)Z@PXi#v+~!TDmpw4SBP9eh#_w`T$MgFFUL$Oz!CIv%-|Xox&D@pv}5FXUbvv)dmxEhto4@A=mNM!$XQ;QQ;Zh>*G%=D2%pKo zZW>ZFA3o_bi>~S1{>)j{8q6u^^A)dOi2ajIrNx!*VdSssJ3z0^B;>uAvb>*|x^NK> z*>RQ8ucYPOYYX5t0aFBegq*s6CSm+i`KVeI15DKuim}+N)?A*&Hcr*2MBjjs_v*7% zPfu4o2EACY#^|{){JDTnMBlYLtK0&fsa_SKb{V+A_Pi8=B{*XshkGEy3} z#>PNWesl7?snEku<=WrLqUihQ+GYD_4fv#Tl}?;k4r~}tugcsPO>Z+pzYzKtguW7a z530d$uuo<{7kgd#$WOCY@by8#@Zs^S;(?wPLGP>hNc4FGG=e?{=W^n+8Td$w`&BOi z8iY1YZcA>9tOR(bpofH?LqFZ6xt~5r<(uK5RZm;2dH9xYuAjz;F~`l`NdKI+Lyr0s z^u5rRi=Bxo{=LGc@}@%xR*2c?UL^*l%YzC zaTY+Lwb}ABX))=~rJ2x>VoV##J~WR5$IRx?-gCwNwlg^VYG1l=xU2b}YkB$3@sjBA z!i773d?I5`?U3PFL$#nDZq)gm4+nK!OrGBlu*JsdBH{QlvR~GTBD&va|4|3TfTst! zTIc}o@$NBSI68znzX)Tac`x49I+`a19H#wR6|OgTF9nWB=S%gE@wctt#N7iQ4f|EU zc+Aiz$zC6DmQ(F*6e}x`n01pkwcW-;?-%8#PE|yk@s_-c%F_D(#>n;OoK2TGh4e{* zkGbWSbk1@vq^CFRNbY$%?Ry#O!>^kKkItJ=n6szf^0< zI~nR5NA4E$NX-2!I*eH?C-<$QzpM6=6O+2j3YM`{0(+qs^_@!L*T!*n+(Wu>Gy`dLLThiRvWx+mr=TM11 zuD2)Tvf=e}Bu%(gO3j67vMuu7`PAHim$+}b4lT}%<-7`=$j%b`JbdG{@eev0`K5yS zxIT@BJ{v7v<}Ne({iEYG8SFb|2iO019gi3yWklDOvd>dneOH@q1-YJYQ;OXG`qSjz z#o5w+0OjtUL?ea==p#l>5ZU`L3dj6nVpaNTUex;`S(YjkJyYzbFGU_mr#z*>fQ6w@F;3j3o$kPo2hEsHLob;RT?D@Yf0>a=hx#|msn@r=Up9h#-J~R zx)hEjhSGytXE`JOkhpMsf&AidQadcph{G**Q>EYve5=km@u1pTc-}Nxi=H6zp2qff z+#|QR{J3obeO$keKSrI?cD23D{-c|ibN!t85Y7kop5B{NJ$BHxR`$H9O*!f} z?!8Dm>>)=z%HWvOC&c>m&5a=ci^>1FuIB;IdsFAvwJEiUKLh{7jJ`>-{_K*Ry=!Gb zj(Sh^Chu9(B*sb+-TY|82=H5n{c6nIVM4qHjAQS~2RU$9V_tv3TcRG4%_CdM+HQoj zEj^qng%9M9Tki<0rCu(ih;D5|RBd5-F=@~(j_6QIuQ$huI$$3->XVQ^w5daT`NHv# zc;b9Z0<(1F42`Fx(O{$!B!dEdxv_0CFvP&G_Wy&gm}dR1oB z348tMsfAqc#~VBUkARQt^=Um-3cJRcai=A4MvQtgNTMFd{l`WT{@-D#@FFtv4~=^A zpa4t0uPMQ4hxW+4@~sG%ECtR`w_mbRqE1DA`TK@>C``tl8K_qa&l9m{CulC@sby0VLGIv+5h&}CR2b>swA&)YbeH zpMGBx#?`|A<*9c}9r&z+R~0uJ6|8Qvwe>#Ejo#1uz1Hx9I>Tso_C8ftLgi-oB^R31 zZx6rT%9My>Mw-pJmHgAzhU3rV375H6jMqx=G%M^veWA8CP<$#d`0fE7F({g1IfjiU zCmB4=Ex(V@z#-ywbbIo7>%4}Fr#$WJ+=-x*dsA20;>Pk!9TeV!fSz(6YkZ<505-)r_z zbep66u4;~|V|mmZ!IK8G#lO3d@02Ora5kPV8NQvqN7g3bpY}U4O>F9TRkr+kl>

  • $MSm$}IkjV(Fxq+sBm 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諥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

    t%~K3jN(&! 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

    c2d5_86f4RNGi|0;j`TGU+41 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 z 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 F{|C0KMS}nU diff --git a/graphrag/api/query.py b/graphrag/api/query.py deleted file mode 100644 index b92cd8145b..0000000000 --- a/graphrag/api/query.py +++ /dev/null @@ -1,1226 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -""" -Query Engine API. - -This API provides access to the query engine of graphrag, allowing external applications -to hook into graphrag and run queries over a knowledge graph generated by graphrag. - -Contains the following functions: - - global_search: Perform a global search. - - global_search_streaming: Perform a global search and stream results back. - - local_search: Perform a local search. - - local_search_streaming: Perform a local search and stream results back. - -WARNING: This API is under development and may undergo changes in future releases. -Backwards compatibility is not guaranteed at this time. -""" - -import logging -from collections.abc import AsyncGenerator -from typing import Any - -import pandas as pd -from pydantic import validate_call - -from graphrag.callbacks.noop_query_callbacks import NoopQueryCallbacks -from graphrag.callbacks.query_callbacks import QueryCallbacks -from graphrag.config.embeddings import ( - community_full_content_embedding, - entity_description_embedding, - text_unit_text_embedding, -) -from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.logger.standard_logging import init_loggers -from graphrag.query.factory import ( - get_basic_search_engine, - get_drift_search_engine, - get_global_search_engine, - get_local_search_engine, -) -from graphrag.query.indexer_adapters import ( - read_indexer_communities, - read_indexer_covariates, - read_indexer_entities, - read_indexer_relationships, - read_indexer_report_embeddings, - read_indexer_reports, - read_indexer_text_units, -) -from graphrag.utils.api import ( - get_embedding_store, - load_search_prompt, - truncate, - update_context_data, -) -from graphrag.utils.cli import redact - -# Initialize standard logger -logger = logging.getLogger(__name__) - - -@validate_call(config={"arbitrary_types_allowed": True}) -async def global_search( - config: GraphRagConfig, - entities: pd.DataFrame, - communities: pd.DataFrame, - community_reports: pd.DataFrame, - community_level: int | None, - dynamic_community_selection: bool, - response_type: str, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> tuple[ - str | dict[str, Any] | list[dict[str, Any]], - str | list[pd.DataFrame] | dict[str, pd.DataFrame], -]: - """Perform a global search and return the context data and response. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) - - communities (pd.DataFrame): A DataFrame containing the final communities (from communities.parquet) - - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) - - community_level (int): The community level to search at. - - dynamic_community_selection (bool): Enable dynamic community selection instead of using all community reports at a fixed level. Note that you can still provide community_level cap the maximum level to search. - - response_type (str): The type of response to return. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - callbacks = callbacks or [] - full_response = "" - context_data = {} - - def on_context(context: Any) -> None: - nonlocal context_data - context_data = context - - local_callbacks = NoopQueryCallbacks() - local_callbacks.on_context = on_context - callbacks.append(local_callbacks) - - logger.debug("Executing global search query: %s", query) - async for chunk in global_search_streaming( - config=config, - entities=entities, - communities=communities, - community_reports=community_reports, - community_level=community_level, - dynamic_community_selection=dynamic_community_selection, - response_type=response_type, - query=query, - callbacks=callbacks, - ): - full_response += chunk - logger.debug("Query response: %s", truncate(full_response, 400)) - return full_response, context_data - - -@validate_call(config={"arbitrary_types_allowed": True}) -def global_search_streaming( - config: GraphRagConfig, - entities: pd.DataFrame, - communities: pd.DataFrame, - community_reports: pd.DataFrame, - community_level: int | None, - dynamic_community_selection: bool, - response_type: str, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> AsyncGenerator: - """Perform a global search and return the context data and response via a generator. - - Context data is returned as a dictionary of lists, with one list entry for each record. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) - - communities (pd.DataFrame): A DataFrame containing the final communities (from communities.parquet) - - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) - - community_level (int): The community level to search at. - - dynamic_community_selection (bool): Enable dynamic community selection instead of using all community reports at a fixed level. Note that you can still provide community_level cap the maximum level to search. - - response_type (str): The type of response to return. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - communities_ = read_indexer_communities(communities, community_reports) - reports = read_indexer_reports( - community_reports, - communities, - community_level=community_level, - dynamic_community_selection=dynamic_community_selection, - ) - entities_ = read_indexer_entities( - entities, communities, community_level=community_level - ) - map_prompt = load_search_prompt(config.root_dir, config.global_search.map_prompt) - reduce_prompt = load_search_prompt( - config.root_dir, config.global_search.reduce_prompt - ) - knowledge_prompt = load_search_prompt( - config.root_dir, config.global_search.knowledge_prompt - ) - - logger.debug("Executing streaming global search query: %s", query) - search_engine = get_global_search_engine( - config, - reports=reports, - entities=entities_, - communities=communities_, - response_type=response_type, - dynamic_community_selection=dynamic_community_selection, - map_system_prompt=map_prompt, - reduce_system_prompt=reduce_prompt, - general_knowledge_inclusion_prompt=knowledge_prompt, - callbacks=callbacks, - ) - return search_engine.stream_search(query=query) - - -@validate_call(config={"arbitrary_types_allowed": True}) -async def multi_index_global_search( - config: GraphRagConfig, - entities_list: list[pd.DataFrame], - communities_list: list[pd.DataFrame], - community_reports_list: list[pd.DataFrame], - index_names: list[str], - community_level: int | None, - dynamic_community_selection: bool, - response_type: str, - streaming: bool, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> tuple[ - str | dict[str, Any] | list[dict[str, Any]], - str | list[pd.DataFrame] | dict[str, pd.DataFrame], -]: - """Perform a global search across multiple indexes and return the context data and response. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities_list (list[pd.DataFrame]): A list of DataFrames containing the final entities (from entities.parquet) - - communities_list (list[pd.DataFrame]): A list of DataFrames containing the final communities (from communities.parquet) - - community_reports_list (list[pd.DataFrame]): A list of DataFrames containing the final community reports (from community_reports.parquet) - - index_names (list[str]): A list of index names. - - community_level (int): The community level to search at. - - dynamic_community_selection (bool): Enable dynamic community selection instead of using all community reports at a fixed level. Note that you can still provide community_level cap the maximum level to search. - - response_type (str): The type of response to return. - - streaming (bool): Whether to stream the results or not. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - logger.warning( - "Multi-index search is deprecated and will be removed in GraphRAG v3." - ) - - # Streaming not supported yet - if streaming: - message = "Streaming not yet implemented for multi_global_search" - raise NotImplementedError(message) - - links = { - "communities": {}, - "community_reports": {}, - "entities": {}, - } - max_vals = { - "communities": -1, - "community_reports": -1, - "entities": -1, - } - - communities_dfs = [] - community_reports_dfs = [] - entities_dfs = [] - - for idx, index_name in enumerate(index_names): - # Prepare each index's community reports dataframe for merging - community_reports_df = community_reports_list[idx] - community_reports_df["community"] = community_reports_df["community"].astype( - int - ) - for i in community_reports_df["community"]: - links["community_reports"][i + max_vals["community_reports"] + 1] = { - "index_name": index_name, - "id": str(i), - } - community_reports_df["community"] += max_vals["community_reports"] + 1 - community_reports_df["human_readable_id"] += max_vals["community_reports"] + 1 - max_vals["community_reports"] = int(community_reports_df["community"].max()) - community_reports_dfs.append(community_reports_df) - - # Prepare each index's communities dataframe for merging - communities_df = communities_list[idx] - communities_df["community"] = communities_df["community"].astype(int) - communities_df["parent"] = communities_df["parent"].astype(int) - for i in communities_df["community"]: - links["communities"][i + max_vals["communities"] + 1] = { - "index_name": index_name, - "id": str(i), - } - communities_df["community"] += max_vals["communities"] + 1 - communities_df["parent"] = communities_df["parent"].apply( - lambda x: x if x == -1 else x + max_vals["communities"] + 1 - ) - communities_df["human_readable_id"] += max_vals["communities"] + 1 - # concat the index name to the entity_ids, since this is used for joining later - communities_df["entity_ids"] = communities_df["entity_ids"].apply( - lambda x, index_name=index_name: [i + f"-{index_name}" for i in x] - ) - max_vals["communities"] = int(communities_df["community"].max()) - communities_dfs.append(communities_df) - - # Prepare each index's entities dataframe for merging - entities_df = entities_list[idx] - for i in entities_df["human_readable_id"]: - links["entities"][i + max_vals["entities"] + 1] = { - "index_name": index_name, - "id": i, - } - entities_df["human_readable_id"] += max_vals["entities"] + 1 - entities_df["title"] = entities_df["title"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - entities_df["text_unit_ids"] = entities_df["text_unit_ids"].apply( - lambda x, index_name=index_name: [i + f"-{index_name}" for i in x] - ) - max_vals["entities"] = int(entities_df["human_readable_id"].max()) - entities_dfs.append(entities_df) - - # Merge the dataframes - community_reports_combined = pd.concat( - community_reports_dfs, axis=0, ignore_index=True, sort=False - ) - entities_combined = pd.concat(entities_dfs, axis=0, ignore_index=True, sort=False) - communities_combined = pd.concat( - communities_dfs, axis=0, ignore_index=True, sort=False - ) - - logger.debug("Executing multi-index global search query: %s", query) - result = await global_search( - config, - entities=entities_combined, - communities=communities_combined, - community_reports=community_reports_combined, - community_level=community_level, - dynamic_community_selection=dynamic_community_selection, - response_type=response_type, - query=query, - callbacks=callbacks, - ) - - # Update the context data by linking index names and community ids - context = update_context_data(result[1], links) - - logger.debug("Query response: %s", truncate(result[0], 400)) # type: ignore - return (result[0], context) - - -@validate_call(config={"arbitrary_types_allowed": True}) -async def local_search( - config: GraphRagConfig, - entities: pd.DataFrame, - communities: pd.DataFrame, - community_reports: pd.DataFrame, - text_units: pd.DataFrame, - relationships: pd.DataFrame, - covariates: pd.DataFrame | None, - community_level: int, - response_type: str, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> tuple[ - str | dict[str, Any] | list[dict[str, Any]], - str | list[pd.DataFrame] | dict[str, pd.DataFrame], -]: - """Perform a local search and return the context data and response. - - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) - - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) - - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) - - relationships (pd.DataFrame): A DataFrame containing the final relationships (from relationships.parquet) - - covariates (pd.DataFrame): A DataFrame containing the final covariates (from covariates.parquet) - - community_level (int): The community level to search at. - - response_type (str): The response type to return. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - callbacks = callbacks or [] - full_response = "" - context_data = {} - - def on_context(context: Any) -> None: - nonlocal context_data - context_data = context - - local_callbacks = NoopQueryCallbacks() - local_callbacks.on_context = on_context - callbacks.append(local_callbacks) - - logger.debug("Executing local search query: %s", query) - async for chunk in local_search_streaming( - config=config, - entities=entities, - communities=communities, - community_reports=community_reports, - text_units=text_units, - relationships=relationships, - covariates=covariates, - community_level=community_level, - response_type=response_type, - query=query, - callbacks=callbacks, - ): - full_response += chunk - logger.debug("Query response: %s", truncate(full_response, 400)) - return full_response, context_data - - -@validate_call(config={"arbitrary_types_allowed": True}) -def local_search_streaming( - config: GraphRagConfig, - entities: pd.DataFrame, - communities: pd.DataFrame, - community_reports: pd.DataFrame, - text_units: pd.DataFrame, - relationships: pd.DataFrame, - covariates: pd.DataFrame | None, - community_level: int, - response_type: str, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> AsyncGenerator: - """Perform a local search and return the context data and response via a generator. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) - - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) - - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) - - relationships (pd.DataFrame): A DataFrame containing the final relationships (from relationships.parquet) - - covariates (pd.DataFrame): A DataFrame containing the final covariates (from covariates.parquet) - - community_level (int): The community level to search at. - - response_type (str): The response type to return. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - vector_store_args = {} - for index, store in config.vector_store.items(): - vector_store_args[index] = store.model_dump() - msg = f"Vector Store Args: {redact(vector_store_args)}" - logger.debug(msg) - - description_embedding_store = get_embedding_store( - config_args=vector_store_args, - embedding_name=entity_description_embedding, - ) - - entities_ = read_indexer_entities(entities, communities, community_level) - covariates_ = read_indexer_covariates(covariates) if covariates is not None else [] - prompt = load_search_prompt(config.root_dir, config.local_search.prompt) - - logger.debug("Executing streaming local search query: %s", query) - search_engine = get_local_search_engine( - config=config, - reports=read_indexer_reports(community_reports, communities, community_level), - text_units=read_indexer_text_units(text_units), - entities=entities_, - relationships=read_indexer_relationships(relationships), - covariates={"claims": covariates_}, - description_embedding_store=description_embedding_store, - response_type=response_type, - system_prompt=prompt, - callbacks=callbacks, - ) - return search_engine.stream_search(query=query) - - -@validate_call(config={"arbitrary_types_allowed": True}) -async def multi_index_local_search( - config: GraphRagConfig, - entities_list: list[pd.DataFrame], - communities_list: list[pd.DataFrame], - community_reports_list: list[pd.DataFrame], - text_units_list: list[pd.DataFrame], - relationships_list: list[pd.DataFrame], - covariates_list: list[pd.DataFrame] | None, - index_names: list[str], - community_level: int, - response_type: str, - streaming: bool, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> tuple[ - str | dict[str, Any] | list[dict[str, Any]], - str | list[pd.DataFrame] | dict[str, pd.DataFrame], -]: - """Perform a local search across multiple indexes and return the context data and response. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities_list (list[pd.DataFrame]): A list of DataFrames containing the final entities (from entities.parquet) - - community_reports_list (list[pd.DataFrame]): A list of DataFrames containing the final community reports (from community_reports.parquet) - - text_units_list (list[pd.DataFrame]): A list of DataFrames containing the final text units (from text_units.parquet) - - relationships_list (list[pd.DataFrame]): A list of DataFrames containing the final relationships (from relationships.parquet) - - covariates_list (list[pd.DataFrame]): [Optional] A list of DataFrames containing the final covariates (from covariates.parquet) - - index_names (list[str]): A list of index names. - - community_level (int): The community level to search at. - - response_type (str): The response type to return. - - streaming (bool): Whether to stream the results or not. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - logger.warning( - "Multi-index search is deprecated and will be removed in GraphRAG v3." - ) - # Streaming not supported yet - if streaming: - message = "Streaming not yet implemented for multi_index_local_search" - raise NotImplementedError(message) - - links = { - "community_reports": {}, - "communities": {}, - "entities": {}, - "text_units": {}, - "relationships": {}, - "covariates": {}, - } - max_vals = { - "community_reports": -1, - "communities": -1, - "entities": -1, - "text_units": 0, - "relationships": -1, - "covariates": 0, - } - community_reports_dfs = [] - communities_dfs = [] - entities_dfs = [] - relationships_dfs = [] - text_units_dfs = [] - covariates_dfs = [] - - for idx, index_name in enumerate(index_names): - # Prepare each index's communities dataframe for merging - communities_df = communities_list[idx] - communities_df["community"] = communities_df["community"].astype(int) - for i in communities_df["community"]: - links["communities"][i + max_vals["communities"] + 1] = { - "index_name": index_name, - "id": str(i), - } - communities_df["community"] += max_vals["communities"] + 1 - communities_df["human_readable_id"] += max_vals["communities"] + 1 - # concat the index name to the entity_ids, since this is used for joining later - communities_df["entity_ids"] = communities_df["entity_ids"].apply( - lambda x, index_name=index_name: [i + f"-{index_name}" for i in x] - ) - max_vals["communities"] = int(communities_df["community"].max()) - communities_dfs.append(communities_df) - - # Prepare each index's community reports dataframe for merging - community_reports_df = community_reports_list[idx] - community_reports_df["community"] = community_reports_df["community"].astype( - int - ) - for i in community_reports_df["community"]: - links["community_reports"][i + max_vals["community_reports"] + 1] = { - "index_name": index_name, - "id": str(i), - } - community_reports_df["community"] += max_vals["community_reports"] + 1 - community_reports_df["human_readable_id"] += max_vals["community_reports"] + 1 - max_vals["community_reports"] = int(community_reports_df["community"].max()) - community_reports_dfs.append(community_reports_df) - - # Prepare each index's entities dataframe for merging - entities_df = entities_list[idx] - for i in entities_df["human_readable_id"]: - links["entities"][i + max_vals["entities"] + 1] = { - "index_name": index_name, - "id": i, - } - entities_df["human_readable_id"] += max_vals["entities"] + 1 - entities_df["title"] = entities_df["title"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - entities_df["id"] = entities_df["id"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - entities_df["text_unit_ids"] = entities_df["text_unit_ids"].apply( - lambda x, index_name=index_name: [i + f"-{index_name}" for i in x] - ) - max_vals["entities"] = int(entities_df["human_readable_id"].max()) - entities_dfs.append(entities_df) - - # Prepare each index's relationships dataframe for merging - relationships_df = relationships_list[idx] - for i in relationships_df["human_readable_id"].astype(int): - links["relationships"][i + max_vals["relationships"] + 1] = { - "index_name": index_name, - "id": i, - } - if max_vals["relationships"] != -1: - col = ( - relationships_df["human_readable_id"].astype(int) - + max_vals["relationships"] - + 1 - ) - relationships_df["human_readable_id"] = col.astype(str) - relationships_df["source"] = relationships_df["source"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - relationships_df["target"] = relationships_df["target"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - relationships_df["text_unit_ids"] = relationships_df["text_unit_ids"].apply( - lambda x, index_name=index_name: [i + f"-{index_name}" for i in x] - ) - max_vals["relationships"] = int(relationships_df["human_readable_id"].max()) - relationships_dfs.append(relationships_df) - - # Prepare each index's text units dataframe for merging - text_units_df = text_units_list[idx] - for i in range(text_units_df.shape[0]): - links["text_units"][i + max_vals["text_units"]] = { - "index_name": index_name, - "id": i, - } - text_units_df["id"] = text_units_df["id"].apply( - lambda x, index_name=index_name: f"{x}-{index_name}" - ) - text_units_df["human_readable_id"] = ( - text_units_df["human_readable_id"] + max_vals["text_units"] - ) - max_vals["text_units"] += text_units_df.shape[0] - text_units_dfs.append(text_units_df) - - # If presents, prepare each index's covariates dataframe for merging - if covariates_list is not None: - covariates_df = covariates_list[idx] - for i in covariates_df["human_readable_id"].astype(int): - links["covariates"][i + max_vals["covariates"]] = { - "index_name": index_name, - "id": i, - } - covariates_df["id"] = covariates_df["id"].apply( - lambda x, index_name=index_name: f"{x}-{index_name}" - ) - covariates_df["human_readable_id"] = ( - covariates_df["human_readable_id"] + max_vals["covariates"] - ) - covariates_df["text_unit_id"] = covariates_df["text_unit_id"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - covariates_df["subject_id"] = covariates_df["subject_id"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - max_vals["covariates"] += covariates_df.shape[0] - covariates_dfs.append(covariates_df) - - # Merge the dataframes - communities_combined = pd.concat( - communities_dfs, axis=0, ignore_index=True, sort=False - ) - community_reports_combined = pd.concat( - community_reports_dfs, axis=0, ignore_index=True, sort=False - ) - entities_combined = pd.concat(entities_dfs, axis=0, ignore_index=True, sort=False) - relationships_combined = pd.concat( - relationships_dfs, axis=0, ignore_index=True, sort=False - ) - text_units_combined = pd.concat( - text_units_dfs, axis=0, ignore_index=True, sort=False - ) - covariates_combined = None - if len(covariates_dfs) > 0: - covariates_combined = pd.concat( - covariates_dfs, axis=0, ignore_index=True, sort=False - ) - logger.debug("Executing multi-index local search query: %s", query) - result = await local_search( - config, - entities=entities_combined, - communities=communities_combined, - community_reports=community_reports_combined, - text_units=text_units_combined, - relationships=relationships_combined, - covariates=covariates_combined, - community_level=community_level, - response_type=response_type, - query=query, - callbacks=callbacks, - ) - - # Update the context data by linking index names and community ids - context = update_context_data(result[1], links) - - logger.debug("Query response: %s", truncate(result[0], 400)) # type: ignore - return (result[0], context) - - -@validate_call(config={"arbitrary_types_allowed": True}) -async def drift_search( - config: GraphRagConfig, - entities: pd.DataFrame, - communities: pd.DataFrame, - community_reports: pd.DataFrame, - text_units: pd.DataFrame, - relationships: pd.DataFrame, - community_level: int, - response_type: str, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> tuple[ - str | dict[str, Any] | list[dict[str, Any]], - str | list[pd.DataFrame] | dict[str, pd.DataFrame], -]: - """Perform a DRIFT search and return the context data and response. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) - - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) - - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) - - relationships (pd.DataFrame): A DataFrame containing the final relationships (from relationships.parquet) - - community_level (int): The community level to search at. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - callbacks = callbacks or [] - full_response = "" - context_data = {} - - def on_context(context: Any) -> None: - nonlocal context_data - context_data = context - - local_callbacks = NoopQueryCallbacks() - local_callbacks.on_context = on_context - callbacks.append(local_callbacks) - - logger.debug("Executing drift search query: %s", query) - async for chunk in drift_search_streaming( - config=config, - entities=entities, - communities=communities, - community_reports=community_reports, - text_units=text_units, - relationships=relationships, - community_level=community_level, - response_type=response_type, - query=query, - callbacks=callbacks, - ): - full_response += chunk - logger.debug("Query response: %s", truncate(full_response, 400)) - return full_response, context_data - - -@validate_call(config={"arbitrary_types_allowed": True}) -def drift_search_streaming( - config: GraphRagConfig, - entities: pd.DataFrame, - communities: pd.DataFrame, - community_reports: pd.DataFrame, - text_units: pd.DataFrame, - relationships: pd.DataFrame, - community_level: int, - response_type: str, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> AsyncGenerator: - """Perform a DRIFT search and return the context data and response. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) - - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) - - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) - - relationships (pd.DataFrame): A DataFrame containing the final relationships (from relationships.parquet) - - community_level (int): The community level to search at. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - vector_store_args = {} - for index, store in config.vector_store.items(): - vector_store_args[index] = store.model_dump() - msg = f"Vector Store Args: {redact(vector_store_args)}" - logger.debug(msg) - - description_embedding_store = get_embedding_store( - config_args=vector_store_args, - embedding_name=entity_description_embedding, - ) - - full_content_embedding_store = get_embedding_store( - config_args=vector_store_args, - embedding_name=community_full_content_embedding, - ) - - entities_ = read_indexer_entities(entities, communities, community_level) - reports = read_indexer_reports(community_reports, communities, community_level) - read_indexer_report_embeddings(reports, full_content_embedding_store) - prompt = load_search_prompt(config.root_dir, config.drift_search.prompt) - reduce_prompt = load_search_prompt( - config.root_dir, config.drift_search.reduce_prompt - ) - - logger.debug("Executing streaming drift search query: %s", query) - search_engine = get_drift_search_engine( - config=config, - reports=reports, - text_units=read_indexer_text_units(text_units), - entities=entities_, - relationships=read_indexer_relationships(relationships), - description_embedding_store=description_embedding_store, - local_system_prompt=prompt, - reduce_system_prompt=reduce_prompt, - response_type=response_type, - callbacks=callbacks, - ) - return search_engine.stream_search(query=query) - - -@validate_call(config={"arbitrary_types_allowed": True}) -async def multi_index_drift_search( - config: GraphRagConfig, - entities_list: list[pd.DataFrame], - communities_list: list[pd.DataFrame], - community_reports_list: list[pd.DataFrame], - text_units_list: list[pd.DataFrame], - relationships_list: list[pd.DataFrame], - index_names: list[str], - community_level: int, - response_type: str, - streaming: bool, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> tuple[ - str | dict[str, Any] | list[dict[str, Any]], - str | list[pd.DataFrame] | dict[str, pd.DataFrame], -]: - """Perform a DRIFT search across multiple indexes and return the context data and response. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - entities_list (list[pd.DataFrame]): A list of DataFrames containing the final entities (from entities.parquet) - - community_reports_list (list[pd.DataFrame]): A list of DataFrames containing the final community reports (from community_reports.parquet) - - text_units_list (list[pd.DataFrame]): A list of DataFrames containing the final text units (from text_units.parquet) - - relationships_list (list[pd.DataFrame]): A list of DataFrames containing the final relationships (from relationships.parquet) - - index_names (list[str]): A list of index names. - - community_level (int): The community level to search at. - - response_type (str): The response type to return. - - streaming (bool): Whether to stream the results or not. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - logger.warning( - "Multi-index search is deprecated and will be removed in GraphRAG v3." - ) - - # Streaming not supported yet - if streaming: - message = "Streaming not yet implemented for multi_drift_search" - raise NotImplementedError(message) - - links = { - "community_reports": {}, - "communities": {}, - "entities": {}, - "text_units": {}, - "relationships": {}, - } - max_vals = { - "community_reports": -1, - "communities": -1, - "entities": -1, - "text_units": 0, - "relationships": -1, - } - - communities_dfs = [] - community_reports_dfs = [] - entities_dfs = [] - relationships_dfs = [] - text_units_dfs = [] - - for idx, index_name in enumerate(index_names): - # Prepare each index's communities dataframe for merging - communities_df = communities_list[idx] - communities_df["community"] = communities_df["community"].astype(int) - for i in communities_df["community"]: - links["communities"][i + max_vals["communities"] + 1] = { - "index_name": index_name, - "id": str(i), - } - communities_df["community"] += max_vals["communities"] + 1 - communities_df["human_readable_id"] += max_vals["communities"] + 1 - # concat the index name to the entity_ids, since this is used for joining later - communities_df["entity_ids"] = communities_df["entity_ids"].apply( - lambda x, index_name=index_name: [i + f"-{index_name}" for i in x] - ) - max_vals["communities"] = int(communities_df["community"].max()) - communities_dfs.append(communities_df) - - # Prepare each index's community reports dataframe for merging - community_reports_df = community_reports_list[idx] - community_reports_df["community"] = community_reports_df["community"].astype( - int - ) - for i in community_reports_df["community"]: - links["community_reports"][i + max_vals["community_reports"] + 1] = { - "index_name": index_name, - "id": str(i), - } - community_reports_df["community"] += max_vals["community_reports"] + 1 - community_reports_df["human_readable_id"] += max_vals["community_reports"] + 1 - community_reports_df["id"] = community_reports_df["id"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - max_vals["community_reports"] = int(community_reports_df["community"].max()) - community_reports_dfs.append(community_reports_df) - - # Prepare each index's entities dataframe for merging - entities_df = entities_list[idx] - for i in entities_df["human_readable_id"]: - links["entities"][i + max_vals["entities"] + 1] = { - "index_name": index_name, - "id": i, - } - entities_df["human_readable_id"] += max_vals["entities"] + 1 - entities_df["title"] = entities_df["title"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - entities_df["id"] = entities_df["id"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - entities_df["text_unit_ids"] = entities_df["text_unit_ids"].apply( - lambda x, index_name=index_name: [i + f"-{index_name}" for i in x] - ) - max_vals["entities"] = int(entities_df["human_readable_id"].max()) - entities_dfs.append(entities_df) - - # Prepare each index's relationships dataframe for merging - relationships_df = relationships_list[idx] - for i in relationships_df["human_readable_id"].astype(int): - links["relationships"][i + max_vals["relationships"] + 1] = { - "index_name": index_name, - "id": i, - } - if max_vals["relationships"] != -1: - col = ( - relationships_df["human_readable_id"].astype(int) - + max_vals["relationships"] - + 1 - ) - relationships_df["human_readable_id"] = col.astype(str) - relationships_df["source"] = relationships_df["source"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - relationships_df["target"] = relationships_df["target"].apply( - lambda x, index_name=index_name: x + f"-{index_name}" - ) - relationships_df["text_unit_ids"] = relationships_df["text_unit_ids"].apply( - lambda x, index_name=index_name: [i + f"-{index_name}" for i in x] - ) - max_vals["relationships"] = int( - relationships_df["human_readable_id"].astype(int).max() - ) - - relationships_dfs.append(relationships_df) - - # Prepare each index's text units dataframe for merging - text_units_df = text_units_list[idx] - for i in range(text_units_df.shape[0]): - links["text_units"][i + max_vals["text_units"]] = { - "index_name": index_name, - "id": i, - } - text_units_df["id"] = text_units_df["id"].apply( - lambda x, index_name=index_name: f"{x}-{index_name}" - ) - text_units_df["human_readable_id"] = ( - text_units_df["human_readable_id"] + max_vals["text_units"] - ) - max_vals["text_units"] += text_units_df.shape[0] - text_units_dfs.append(text_units_df) - - # Merge the dataframes - communities_combined = pd.concat( - communities_dfs, axis=0, ignore_index=True, sort=False - ) - community_reports_combined = pd.concat( - community_reports_dfs, axis=0, ignore_index=True, sort=False - ) - entities_combined = pd.concat(entities_dfs, axis=0, ignore_index=True, sort=False) - relationships_combined = pd.concat( - relationships_dfs, axis=0, ignore_index=True, sort=False - ) - text_units_combined = pd.concat( - text_units_dfs, axis=0, ignore_index=True, sort=False - ) - - logger.debug("Executing multi-index drift search query: %s", query) - result = await drift_search( - config, - entities=entities_combined, - communities=communities_combined, - community_reports=community_reports_combined, - text_units=text_units_combined, - relationships=relationships_combined, - community_level=community_level, - response_type=response_type, - query=query, - callbacks=callbacks, - ) - - # Update the context data by linking index names and community ids - context = {} - if type(result[1]) is dict: - for key in result[1]: - context[key] = update_context_data(result[1][key], links) - else: - context = result[1] - - logger.debug("Query response: %s", truncate(result[0], 400)) # type: ignore - return (result[0], context) - - -@validate_call(config={"arbitrary_types_allowed": True}) -async def basic_search( - config: GraphRagConfig, - text_units: pd.DataFrame, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> tuple[ - str | dict[str, Any] | list[dict[str, Any]], - str | list[pd.DataFrame] | dict[str, pd.DataFrame], -]: - """Perform a basic search and return the context data and response. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - callbacks = callbacks or [] - full_response = "" - context_data = {} - - def on_context(context: Any) -> None: - nonlocal context_data - context_data = context - - local_callbacks = NoopQueryCallbacks() - local_callbacks.on_context = on_context - callbacks.append(local_callbacks) - - logger.debug("Executing basic search query: %s", query) - async for chunk in basic_search_streaming( - config=config, - text_units=text_units, - query=query, - callbacks=callbacks, - ): - full_response += chunk - logger.debug("Query response: %s", truncate(full_response, 400)) - return full_response, context_data - - -@validate_call(config={"arbitrary_types_allowed": True}) -def basic_search_streaming( - config: GraphRagConfig, - text_units: pd.DataFrame, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> AsyncGenerator: - """Perform a local search and return the context data and response via a generator. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - vector_store_args = {} - for index, store in config.vector_store.items(): - vector_store_args[index] = store.model_dump() - msg = f"Vector Store Args: {redact(vector_store_args)}" - logger.debug(msg) - - embedding_store = get_embedding_store( - config_args=vector_store_args, - embedding_name=text_unit_text_embedding, - ) - - prompt = load_search_prompt(config.root_dir, config.basic_search.prompt) - - logger.debug("Executing streaming basic search query: %s", query) - search_engine = get_basic_search_engine( - config=config, - text_units=read_indexer_text_units(text_units), - text_unit_embeddings=embedding_store, - system_prompt=prompt, - callbacks=callbacks, - ) - return search_engine.stream_search(query=query) - - -@validate_call(config={"arbitrary_types_allowed": True}) -async def multi_index_basic_search( - config: GraphRagConfig, - text_units_list: list[pd.DataFrame], - index_names: list[str], - streaming: bool, - query: str, - callbacks: list[QueryCallbacks] | None = None, - verbose: bool = False, -) -> tuple[ - str | dict[str, Any] | list[dict[str, Any]], - str | list[pd.DataFrame] | dict[str, pd.DataFrame], -]: - """Perform a basic search across multiple indexes and return the context data and response. - - Parameters - ---------- - - config (GraphRagConfig): A graphrag configuration (from settings.yaml) - - text_units_list (list[pd.DataFrame]): A list of DataFrames containing the final text units (from text_units.parquet) - - index_names (list[str]): A list of index names. - - streaming (bool): Whether to stream the results or not. - - query (str): The user query to search for. - - Returns - ------- - TODO: Document the search response type and format. - """ - init_loggers(config=config, verbose=verbose, filename="query.log") - - logger.warning( - "Multi-index search is deprecated and will be removed in GraphRAG v3." - ) - - # Streaming not supported yet - if streaming: - message = "Streaming not yet implemented for multi_basic_search" - raise NotImplementedError(message) - - links = { - "text_units": {}, - } - max_vals = { - "text_units": 0, - } - - text_units_dfs = [] - - for idx, index_name in enumerate(index_names): - # Prepare each index's text units dataframe for merging - text_units_df = text_units_list[idx] - for i in range(text_units_df.shape[0]): - links["text_units"][i + max_vals["text_units"]] = { - "index_name": index_name, - "id": i, - } - text_units_df["id"] = text_units_df["id"].apply( - lambda x, index_name=index_name: f"{x}-{index_name}" - ) - text_units_df["human_readable_id"] = ( - text_units_df["human_readable_id"] + max_vals["text_units"] - ) - max_vals["text_units"] += text_units_df.shape[0] - text_units_dfs.append(text_units_df) - - # Merge the dataframes - text_units_combined = pd.concat( - text_units_dfs, axis=0, ignore_index=True, sort=False - ) - - logger.debug("Executing multi-index basic search query: %s", query) - return await basic_search( - config, - text_units=text_units_combined, - query=query, - callbacks=callbacks, - ) diff --git a/graphrag/cache/__init__.py b/graphrag/cache/__init__.py deleted file mode 100644 index 9c4e8be3fe..0000000000 --- a/graphrag/cache/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A package containing cache implementations.""" diff --git a/graphrag/cache/factory.py b/graphrag/cache/factory.py deleted file mode 100644 index 331540260d..0000000000 --- a/graphrag/cache/factory.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Factory functions for creating a cache.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, ClassVar - -from graphrag.cache.json_pipeline_cache import JsonPipelineCache -from graphrag.cache.memory_pipeline_cache import InMemoryCache -from graphrag.cache.noop_pipeline_cache import NoopPipelineCache -from graphrag.config.enums import CacheType -from graphrag.storage.blob_pipeline_storage import BlobPipelineStorage -from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage -from graphrag.storage.file_pipeline_storage import FilePipelineStorage - -if TYPE_CHECKING: - from collections.abc import Callable - - from graphrag.cache.pipeline_cache import PipelineCache - - -class CacheFactory: - """A factory class for cache implementations. - - Includes a method for users to register a custom cache implementation. - - Configuration arguments are passed to each cache implementation as kwargs - for individual enforcement of required/optional arguments. - """ - - _registry: ClassVar[dict[str, Callable[..., PipelineCache]]] = {} - - @classmethod - def register(cls, cache_type: str, creator: Callable[..., PipelineCache]) -> None: - """Register a custom cache implementation. - - Args: - cache_type: The type identifier for the cache. - creator: A class or callable that creates an instance of PipelineCache. - """ - cls._registry[cache_type] = creator - - @classmethod - def create_cache(cls, cache_type: str, kwargs: dict) -> PipelineCache: - """Create a cache object from the provided type. - - Args: - cache_type: The type of cache to create. - root_dir: The root directory for file-based caches. - kwargs: Additional keyword arguments for the cache constructor. - - Returns - ------- - A PipelineCache instance. - - Raises - ------ - ValueError: If the cache type is not registered. - """ - if cache_type not in cls._registry: - msg = f"Unknown cache type: {cache_type}" - raise ValueError(msg) - - return cls._registry[cache_type](**kwargs) - - @classmethod - def get_cache_types(cls) -> list[str]: - """Get the registered cache implementations.""" - return list(cls._registry.keys()) - - @classmethod - def is_supported_type(cls, cache_type: str) -> bool: - """Check if the given cache type is supported.""" - return cache_type in cls._registry - - -# --- register built-in cache implementations --- -def create_file_cache(root_dir: str, base_dir: str, **kwargs) -> PipelineCache: - """Create a file-based cache implementation.""" - # Create storage with base_dir in kwargs since FilePipelineStorage expects it there - storage_kwargs = {"base_dir": root_dir, **kwargs} - storage = FilePipelineStorage(**storage_kwargs).child(base_dir) - return JsonPipelineCache(storage) - - -def create_blob_cache(**kwargs) -> PipelineCache: - """Create a blob storage-based cache implementation.""" - storage = BlobPipelineStorage(**kwargs) - return JsonPipelineCache(storage) - - -def create_cosmosdb_cache(**kwargs) -> PipelineCache: - """Create a CosmosDB-based cache implementation.""" - storage = CosmosDBPipelineStorage(**kwargs) - return JsonPipelineCache(storage) - - -def create_noop_cache(**_kwargs) -> PipelineCache: - """Create a no-op cache implementation.""" - return NoopPipelineCache() - - -def create_memory_cache(**kwargs) -> PipelineCache: - """Create a memory cache implementation.""" - return InMemoryCache(**kwargs) - - -# --- register built-in cache implementations --- -CacheFactory.register(CacheType.none.value, create_noop_cache) -CacheFactory.register(CacheType.memory.value, create_memory_cache) -CacheFactory.register(CacheType.file.value, create_file_cache) -CacheFactory.register(CacheType.blob.value, create_blob_cache) -CacheFactory.register(CacheType.cosmosdb.value, create_cosmosdb_cache) diff --git a/graphrag/cli/query.py b/graphrag/cli/query.py deleted file mode 100644 index 0075734859..0000000000 --- a/graphrag/cli/query.py +++ /dev/null @@ -1,534 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""CLI implementation of the query subcommand.""" - -import asyncio -import sys -from pathlib import Path -from typing import TYPE_CHECKING, Any - -import graphrag.api as api -from graphrag.callbacks.noop_query_callbacks import NoopQueryCallbacks -from graphrag.config.load_config import load_config -from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.utils.api import create_storage_from_config -from graphrag.utils.storage import load_table_from_storage, storage_has_table - -if TYPE_CHECKING: - import pandas as pd - -# ruff: noqa: T201 - - -def run_global_search( - config_filepath: Path | None, - data_dir: Path | None, - root_dir: Path, - community_level: int | None, - dynamic_community_selection: bool, - response_type: str, - streaming: bool, - query: str, - verbose: bool, -): - """Perform a global search with a given query. - - Loads index files required for global search and calls the Query API. - """ - root = root_dir.resolve() - cli_overrides = {} - if data_dir: - cli_overrides["output.base_dir"] = str(data_dir) - config = load_config(root, config_filepath, cli_overrides) - - dataframe_dict = _resolve_output_files( - config=config, - output_list=[ - "entities", - "communities", - "community_reports", - ], - optional_list=[], - ) - - # Call the Multi-Index Global Search API - if dataframe_dict["multi-index"]: - final_entities_list = dataframe_dict["entities"] - final_communities_list = dataframe_dict["communities"] - final_community_reports_list = dataframe_dict["community_reports"] - index_names = dataframe_dict["index_names"] - - response, context_data = asyncio.run( - api.multi_index_global_search( - config=config, - entities_list=final_entities_list, - communities_list=final_communities_list, - community_reports_list=final_community_reports_list, - index_names=index_names, - community_level=community_level, - dynamic_community_selection=dynamic_community_selection, - response_type=response_type, - streaming=streaming, - query=query, - verbose=verbose, - ) - ) - print(response) - return response, context_data - - # Otherwise, call the Single-Index Global Search API - final_entities: pd.DataFrame = dataframe_dict["entities"] - final_communities: pd.DataFrame = dataframe_dict["communities"] - final_community_reports: pd.DataFrame = dataframe_dict["community_reports"] - - if streaming: - - async def run_streaming_search(): - full_response = "" - context_data = {} - - def on_context(context: Any) -> None: - nonlocal context_data - context_data = context - - callbacks = NoopQueryCallbacks() - callbacks.on_context = on_context - - async for stream_chunk in api.global_search_streaming( - config=config, - entities=final_entities, - communities=final_communities, - community_reports=final_community_reports, - community_level=community_level, - dynamic_community_selection=dynamic_community_selection, - response_type=response_type, - query=query, - callbacks=[callbacks], - verbose=verbose, - ): - full_response += stream_chunk - print(stream_chunk, end="") - sys.stdout.flush() - print() - return full_response, context_data - - return asyncio.run(run_streaming_search()) - # not streaming - response, context_data = asyncio.run( - api.global_search( - config=config, - entities=final_entities, - communities=final_communities, - community_reports=final_community_reports, - community_level=community_level, - dynamic_community_selection=dynamic_community_selection, - response_type=response_type, - query=query, - verbose=verbose, - ) - ) - print(response) - - return response, context_data - - -def run_local_search( - config_filepath: Path | None, - data_dir: Path | None, - root_dir: Path, - community_level: int, - response_type: str, - streaming: bool, - query: str, - verbose: bool, -): - """Perform a local search with a given query. - - Loads index files required for local search and calls the Query API. - """ - root = root_dir.resolve() - cli_overrides = {} - if data_dir: - cli_overrides["output.base_dir"] = str(data_dir) - config = load_config(root, config_filepath, cli_overrides) - - dataframe_dict = _resolve_output_files( - config=config, - output_list=[ - "communities", - "community_reports", - "text_units", - "relationships", - "entities", - ], - optional_list=[ - "covariates", - ], - ) - # Call the Multi-Index Local Search API - if dataframe_dict["multi-index"]: - final_entities_list = dataframe_dict["entities"] - final_communities_list = dataframe_dict["communities"] - final_community_reports_list = dataframe_dict["community_reports"] - final_text_units_list = dataframe_dict["text_units"] - final_relationships_list = dataframe_dict["relationships"] - index_names = dataframe_dict["index_names"] - - # If any covariates tables are missing from any index, set the covariates list to None - if len(dataframe_dict["covariates"]) != dataframe_dict["num_indexes"]: - final_covariates_list = None - else: - final_covariates_list = dataframe_dict["covariates"] - - response, context_data = asyncio.run( - api.multi_index_local_search( - config=config, - entities_list=final_entities_list, - communities_list=final_communities_list, - community_reports_list=final_community_reports_list, - text_units_list=final_text_units_list, - relationships_list=final_relationships_list, - covariates_list=final_covariates_list, - index_names=index_names, - community_level=community_level, - response_type=response_type, - streaming=streaming, - query=query, - verbose=verbose, - ) - ) - print(response) - - return response, context_data - - # Otherwise, call the Single-Index Local Search API - final_communities: pd.DataFrame = dataframe_dict["communities"] - final_community_reports: pd.DataFrame = dataframe_dict["community_reports"] - final_text_units: pd.DataFrame = dataframe_dict["text_units"] - final_relationships: pd.DataFrame = dataframe_dict["relationships"] - final_entities: pd.DataFrame = dataframe_dict["entities"] - final_covariates: pd.DataFrame | None = dataframe_dict["covariates"] - - if streaming: - - async def run_streaming_search(): - full_response = "" - context_data = {} - - def on_context(context: Any) -> None: - nonlocal context_data - context_data = context - - callbacks = NoopQueryCallbacks() - callbacks.on_context = on_context - - async for stream_chunk in api.local_search_streaming( - config=config, - entities=final_entities, - communities=final_communities, - community_reports=final_community_reports, - text_units=final_text_units, - relationships=final_relationships, - covariates=final_covariates, - community_level=community_level, - response_type=response_type, - query=query, - callbacks=[callbacks], - verbose=verbose, - ): - full_response += stream_chunk - print(stream_chunk, end="") - sys.stdout.flush() - print() - return full_response, context_data - - return asyncio.run(run_streaming_search()) - # not streaming - response, context_data = asyncio.run( - api.local_search( - config=config, - entities=final_entities, - communities=final_communities, - community_reports=final_community_reports, - text_units=final_text_units, - relationships=final_relationships, - covariates=final_covariates, - community_level=community_level, - response_type=response_type, - query=query, - verbose=verbose, - ) - ) - print(response) - - return response, context_data - - -def run_drift_search( - config_filepath: Path | None, - data_dir: Path | None, - root_dir: Path, - community_level: int, - response_type: str, - streaming: bool, - query: str, - verbose: bool, -): - """Perform a local search with a given query. - - Loads index files required for local search and calls the Query API. - """ - root = root_dir.resolve() - cli_overrides = {} - if data_dir: - cli_overrides["output.base_dir"] = str(data_dir) - config = load_config(root, config_filepath, cli_overrides) - - dataframe_dict = _resolve_output_files( - config=config, - output_list=[ - "communities", - "community_reports", - "text_units", - "relationships", - "entities", - ], - ) - - # Call the Multi-Index Drift Search API - if dataframe_dict["multi-index"]: - final_entities_list = dataframe_dict["entities"] - final_communities_list = dataframe_dict["communities"] - final_community_reports_list = dataframe_dict["community_reports"] - final_text_units_list = dataframe_dict["text_units"] - final_relationships_list = dataframe_dict["relationships"] - index_names = dataframe_dict["index_names"] - - response, context_data = asyncio.run( - api.multi_index_drift_search( - config=config, - entities_list=final_entities_list, - communities_list=final_communities_list, - community_reports_list=final_community_reports_list, - text_units_list=final_text_units_list, - relationships_list=final_relationships_list, - index_names=index_names, - community_level=community_level, - response_type=response_type, - streaming=streaming, - query=query, - verbose=verbose, - ) - ) - print(response) - - return response, context_data - - # Otherwise, call the Single-Index Drift Search API - final_communities: pd.DataFrame = dataframe_dict["communities"] - final_community_reports: pd.DataFrame = dataframe_dict["community_reports"] - final_text_units: pd.DataFrame = dataframe_dict["text_units"] - final_relationships: pd.DataFrame = dataframe_dict["relationships"] - final_entities: pd.DataFrame = dataframe_dict["entities"] - - if streaming: - - async def run_streaming_search(): - full_response = "" - context_data = {} - - def on_context(context: Any) -> None: - nonlocal context_data - context_data = context - - callbacks = NoopQueryCallbacks() - callbacks.on_context = on_context - - async for stream_chunk in api.drift_search_streaming( - config=config, - entities=final_entities, - communities=final_communities, - community_reports=final_community_reports, - text_units=final_text_units, - relationships=final_relationships, - community_level=community_level, - response_type=response_type, - query=query, - callbacks=[callbacks], - verbose=verbose, - ): - full_response += stream_chunk - print(stream_chunk, end="") - sys.stdout.flush() - print() - return full_response, context_data - - return asyncio.run(run_streaming_search()) - - # not streaming - response, context_data = asyncio.run( - api.drift_search( - config=config, - entities=final_entities, - communities=final_communities, - community_reports=final_community_reports, - text_units=final_text_units, - relationships=final_relationships, - community_level=community_level, - response_type=response_type, - query=query, - verbose=verbose, - ) - ) - print(response) - - return response, context_data - - -def run_basic_search( - config_filepath: Path | None, - data_dir: Path | None, - root_dir: Path, - streaming: bool, - query: str, - verbose: bool, -): - """Perform a basics search with a given query. - - Loads index files required for basic search and calls the Query API. - """ - root = root_dir.resolve() - cli_overrides = {} - if data_dir: - cli_overrides["output.base_dir"] = str(data_dir) - config = load_config(root, config_filepath, cli_overrides) - - dataframe_dict = _resolve_output_files( - config=config, - output_list=[ - "text_units", - ], - ) - - # Call the Multi-Index Basic Search API - if dataframe_dict["multi-index"]: - final_text_units_list = dataframe_dict["text_units"] - index_names = dataframe_dict["index_names"] - - response, context_data = asyncio.run( - api.multi_index_basic_search( - config=config, - text_units_list=final_text_units_list, - index_names=index_names, - streaming=streaming, - query=query, - verbose=verbose, - ) - ) - print(response) - - return response, context_data - - # Otherwise, call the Single-Index Basic Search API - final_text_units: pd.DataFrame = dataframe_dict["text_units"] - - if streaming: - - async def run_streaming_search(): - full_response = "" - context_data = {} - - def on_context(context: Any) -> None: - nonlocal context_data - context_data = context - - callbacks = NoopQueryCallbacks() - callbacks.on_context = on_context - - async for stream_chunk in api.basic_search_streaming( - config=config, - text_units=final_text_units, - query=query, - callbacks=[callbacks], - verbose=verbose, - ): - full_response += stream_chunk - print(stream_chunk, end="") - sys.stdout.flush() - print() - return full_response, context_data - - return asyncio.run(run_streaming_search()) - # not streaming - response, context_data = asyncio.run( - api.basic_search( - config=config, - text_units=final_text_units, - query=query, - verbose=verbose, - ) - ) - print(response) - - return response, context_data - - -def _resolve_output_files( - config: GraphRagConfig, - output_list: list[str], - optional_list: list[str] | None = None, -) -> dict[str, Any]: - """Read indexing output files to a dataframe dict.""" - dataframe_dict = {} - - # Loading output files for multi-index search - if config.outputs: - dataframe_dict["multi-index"] = True - dataframe_dict["num_indexes"] = len(config.outputs) - dataframe_dict["index_names"] = config.outputs.keys() - for output in config.outputs.values(): - storage_obj = create_storage_from_config(output) - for name in output_list: - if name not in dataframe_dict: - dataframe_dict[name] = [] - df_value = asyncio.run( - load_table_from_storage(name=name, storage=storage_obj) - ) - dataframe_dict[name].append(df_value) - - # for optional output files, do not append if the dataframe does not exist - if optional_list: - for optional_file in optional_list: - if optional_file not in dataframe_dict: - dataframe_dict[optional_file] = [] - file_exists = asyncio.run( - storage_has_table(optional_file, storage_obj) - ) - if file_exists: - df_value = asyncio.run( - load_table_from_storage( - name=optional_file, storage=storage_obj - ) - ) - dataframe_dict[optional_file].append(df_value) - return dataframe_dict - # Loading output files for single-index search - dataframe_dict["multi-index"] = False - storage_obj = create_storage_from_config(config.output) - for name in output_list: - df_value = asyncio.run(load_table_from_storage(name=name, storage=storage_obj)) - dataframe_dict[name] = df_value - - # for optional output files, set the dict entry to None instead of erroring out if it does not exist - if optional_list: - for optional_file in optional_list: - file_exists = asyncio.run(storage_has_table(optional_file, storage_obj)) - if file_exists: - df_value = asyncio.run( - load_table_from_storage(name=optional_file, storage=storage_obj) - ) - dataframe_dict[optional_file] = df_value - else: - dataframe_dict[optional_file] = None - return dataframe_dict diff --git a/graphrag/config/create_graphrag_config.py b/graphrag/config/create_graphrag_config.py deleted file mode 100644 index 59d7699e71..0000000000 --- a/graphrag/config/create_graphrag_config.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration, loaded from environment variables.""" - -from pathlib import Path -from typing import Any - -from graphrag.config.models.graph_rag_config import GraphRagConfig - - -def create_graphrag_config( - values: dict[str, Any] | None = None, - root_dir: str | None = None, -) -> GraphRagConfig: - """Load Configuration Parameters from a dictionary. - - Parameters - ---------- - values : dict[str, Any] | None - Dictionary of configuration values to pass into pydantic model. - root_dir : str | None - Root directory for the project. - skip_validation : bool - Skip pydantic model validation of the configuration. - This is useful for testing and mocking purposes but - should not be used in the core code or API. - - Returns - ------- - GraphRagConfig - The configuration object. - - Raises - ------ - ValidationError - If the configuration values do not satisfy pydantic validation. - """ - values = values or {} - if root_dir: - root_path = Path(root_dir).resolve() - values["root_dir"] = str(root_path) - return GraphRagConfig(**values) diff --git a/graphrag/config/embeddings.py b/graphrag/config/embeddings.py deleted file mode 100644 index f150238576..0000000000 --- a/graphrag/config/embeddings.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing embeddings values.""" - -entity_title_embedding = "entity.title" -entity_description_embedding = "entity.description" -relationship_description_embedding = "relationship.description" -document_text_embedding = "document.text" -community_title_embedding = "community.title" -community_summary_embedding = "community.summary" -community_full_content_embedding = "community.full_content" -text_unit_text_embedding = "text_unit.text" - -all_embeddings: set[str] = { - entity_title_embedding, - entity_description_embedding, - relationship_description_embedding, - document_text_embedding, - community_title_embedding, - community_summary_embedding, - community_full_content_embedding, - text_unit_text_embedding, -} -default_embeddings: list[str] = [ - entity_description_embedding, - community_full_content_embedding, - text_unit_text_embedding, -] - - -def create_index_name( - container_name: str, embedding_name: str, validate: bool = True -) -> str: - """ - Create a index name for the embedding store. - - Within any given vector store, we can have multiple sets of embeddings organized into projects. - The `container` param is used for this partitioning, and is added as a prefix to the index name for differentiation. - - The embedding name is fixed, with the available list defined in graphrag.index.config.embeddings - - Note that we use dot notation in our names, but many vector stores do not support this - so we convert to dashes. - """ - if validate and embedding_name not in all_embeddings: - msg = f"Invalid embedding name: {embedding_name}" - raise KeyError(msg) - return f"{container_name}-{embedding_name}".replace(".", "-") diff --git a/graphrag/config/enums.py b/graphrag/config/enums.py deleted file mode 100644 index ef99ee6a1a..0000000000 --- a/graphrag/config/enums.py +++ /dev/null @@ -1,176 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing config enums.""" - -from __future__ import annotations - -from enum import Enum - - -class CacheType(str, Enum): - """The cache configuration type for the pipeline.""" - - file = "file" - """The file cache configuration type.""" - memory = "memory" - """The memory cache configuration type.""" - none = "none" - """The none cache configuration type.""" - blob = "blob" - """The blob cache configuration type.""" - cosmosdb = "cosmosdb" - """The cosmosdb cache configuration type""" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' - - -class InputFileType(str, Enum): - """The input file type for the pipeline.""" - - csv = "csv" - """The CSV input type.""" - text = "text" - """The text input type.""" - json = "json" - """The JSON input type.""" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' - - -class StorageType(str, Enum): - """The output type for the pipeline.""" - - file = "file" - """The file output type.""" - memory = "memory" - """The memory output type.""" - blob = "blob" - """The blob output type.""" - cosmosdb = "cosmosdb" - """The cosmosdb output type""" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' - - -class VectorStoreType(str, Enum): - """The supported vector store types.""" - - LanceDB = "lancedb" - AzureAISearch = "azure_ai_search" - CosmosDB = "cosmosdb" - - -class ReportingType(str, Enum): - """The reporting configuration type for the pipeline.""" - - file = "file" - """The file reporting configuration type.""" - blob = "blob" - """The blob reporting configuration type.""" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' - - -class ModelType(str, Enum): - """LLMType enum class definition.""" - - # Embeddings - OpenAIEmbedding = "openai_embedding" - AzureOpenAIEmbedding = "azure_openai_embedding" - Embedding = "embedding" - - # Chat Completion - OpenAIChat = "openai_chat" - AzureOpenAIChat = "azure_openai_chat" - Chat = "chat" - - # Debug - MockChat = "mock_chat" - MockEmbedding = "mock_embedding" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' - - -class AuthType(str, Enum): - """AuthType enum class definition.""" - - APIKey = "api_key" - AzureManagedIdentity = "azure_managed_identity" - - -class AsyncType(str, Enum): - """Enum for the type of async to use.""" - - AsyncIO = "asyncio" - Threaded = "threaded" - - -class ChunkStrategyType(str, Enum): - """ChunkStrategy class definition.""" - - tokens = "tokens" - sentence = "sentence" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' - - -class SearchMethod(Enum): - """The type of search to run.""" - - LOCAL = "local" - GLOBAL = "global" - DRIFT = "drift" - BASIC = "basic" - - def __str__(self): - """Return the string representation of the enum value.""" - return self.value - - -class IndexingMethod(str, Enum): - """Enum for the type of indexing to perform.""" - - Standard = "standard" - """Traditional GraphRAG indexing, with all graph construction and summarization performed by a language model.""" - Fast = "fast" - """Fast indexing, using NLP for graph construction and language model for summarization.""" - StandardUpdate = "standard-update" - """Incremental update with standard indexing.""" - FastUpdate = "fast-update" - """Incremental update with fast indexing.""" - - -class NounPhraseExtractorType(str, Enum): - """Enum for the noun phrase extractor options.""" - - RegexEnglish = "regex_english" - """Standard extractor using regex. Fastest, but limited to English.""" - Syntactic = "syntactic_parser" - """Noun phrase extractor based on dependency parsing and NER using SpaCy.""" - CFG = "cfg" - """Noun phrase extractor combining CFG-based noun-chunk extraction and NER.""" - - -class ModularityMetric(str, Enum): - """Enum for the modularity metric to use.""" - - Graph = "graph" - """Graph modularity metric.""" - - LCC = "lcc" - - WeightedComponents = "weighted_components" - """Weighted components modularity metric.""" diff --git a/graphrag/config/environment_reader.py b/graphrag/config/environment_reader.py deleted file mode 100644 index 258422666c..0000000000 --- a/graphrag/config/environment_reader.py +++ /dev/null @@ -1,155 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A configuration reader utility class.""" - -from collections.abc import Callable -from contextlib import contextmanager -from enum import Enum -from typing import Any, TypeVar - -from environs import Env - -T = TypeVar("T") - -KeyValue = str | Enum -EnvKeySet = str | list[str] - - -def read_key(value: KeyValue) -> str: - """Read a key value.""" - if not isinstance(value, str): - return value.value.lower() - return value.lower() - - -class EnvironmentReader: - """A configuration reader utility class.""" - - _env: Env - _config_stack: list[dict] - - def __init__(self, env: Env): - self._env = env - self._config_stack = [] - - @property - def env(self): - """Get the environment object.""" - return self._env - - def _read_env( - self, env_key: str | list[str], default_value: T, read: Callable[[str, T], T] - ) -> T | None: - if isinstance(env_key, str): - env_key = [env_key] - - for k in env_key: - result = read(k.upper(), default_value) - if result is not default_value: - return result - - return default_value - - def envvar_prefix(self, prefix: KeyValue): - """Set the environment variable prefix.""" - prefix = read_key(prefix) - prefix = f"{prefix}_".upper() - return self._env.prefixed(prefix) - - def use(self, value: Any | None): - """Create a context manager to push the value into the config_stack.""" - - @contextmanager - def config_context(): - self._config_stack.append(value or {}) - try: - yield - finally: - self._config_stack.pop() - - return config_context() - - @property - def section(self) -> dict: - """Get the current section.""" - return self._config_stack[-1] if self._config_stack else {} - - def str( - self, - key: KeyValue, - env_key: EnvKeySet | None = None, - default_value: str | None = None, - ) -> str | None: - """Read a configuration value.""" - key = read_key(key) - if self.section and key in self.section: - return self.section[key] - - return self._read_env( - env_key or key, default_value, (lambda k, dv: self._env(k, dv)) - ) - - def int( - self, - key: KeyValue, - env_key: EnvKeySet | None = None, - default_value: int | None = None, - ) -> int | None: - """Read an integer configuration value.""" - key = read_key(key) - if self.section and key in self.section: - return int(self.section[key]) - return self._read_env( - env_key or key, default_value, lambda k, dv: self._env.int(k, dv) - ) - - def bool( - self, - key: KeyValue, - env_key: EnvKeySet | None = None, - default_value: bool | None = None, - ) -> bool | None: - """Read an integer configuration value.""" - key = read_key(key) - if self.section and key in self.section: - return bool(self.section[key]) - - return self._read_env( - env_key or key, default_value, lambda k, dv: self._env.bool(k, dv) - ) - - def float( - self, - key: KeyValue, - env_key: EnvKeySet | None = None, - default_value: float | None = None, - ) -> float | None: - """Read a float configuration value.""" - key = read_key(key) - if self.section and key in self.section: - return float(self.section[key]) - return self._read_env( - env_key or key, default_value, lambda k, dv: self._env.float(k, dv) - ) - - def list( - self, - key: KeyValue, - env_key: EnvKeySet | None = None, - default_value: list | None = None, - ) -> list | None: - """Parse an list configuration value.""" - key = read_key(key) - result = None - if self.section and key in self.section: - result = self.section[key] - if isinstance(result, list): - return result - - if result is None: - result = self.str(key, env_key) - if result is not None: - result = [s.strip() for s in result.split(",")] - return [s for s in result if s] - return default_value diff --git a/graphrag/config/get_embedding_settings.py b/graphrag/config/get_embedding_settings.py deleted file mode 100644 index 9522f31359..0000000000 --- a/graphrag/config/get_embedding_settings.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing get_embedding_settings.""" - -from graphrag.config.models.graph_rag_config import GraphRagConfig - - -def get_embedding_settings( - settings: GraphRagConfig, - vector_store_params: dict | None = None, -) -> dict: - """Transform GraphRAG config into settings for workflows.""" - embeddings_llm_settings = settings.get_language_model_config( - settings.embed_text.model_id - ) - vector_store_settings = settings.get_vector_store_config( - settings.embed_text.vector_store_id - ).model_dump() - - # - # If we get to this point, settings.vector_store is defined, and there's a specific setting for this embedding. - # settings.vector_store.base contains connection information, or may be undefined - # settings.vector_store. contains the specific settings for this embedding - # - strategy = settings.embed_text.resolved_strategy( - embeddings_llm_settings - ) # get the default strategy - strategy.update({ - "vector_store": { - **(vector_store_params or {}), - **(vector_store_settings), - } - }) # update the default strategy with the vector store settings - # This ensures the vector store config is part of the strategy and not the global config - return { - "strategy": strategy, - } diff --git a/graphrag/config/load_config.py b/graphrag/config/load_config.py deleted file mode 100644 index de9026037d..0000000000 --- a/graphrag/config/load_config.py +++ /dev/null @@ -1,191 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Default method for loading config.""" - -import json -import os -from pathlib import Path -from string import Template -from typing import Any - -import yaml -from dotenv import load_dotenv - -from graphrag.config.create_graphrag_config import create_graphrag_config -from graphrag.config.models.graph_rag_config import GraphRagConfig - -_default_config_files = ["settings.yaml", "settings.yml", "settings.json"] - - -def _search_for_config_in_root_dir(root: str | Path) -> Path | None: - """Resolve the config path from the given root directory. - - Parameters - ---------- - root : str | Path - The path to the root directory containing the config file. - Searches for a default config file (settings.{yaml,yml,json}). - - Returns - ------- - Path | None - returns a Path if there is a config in the root directory - Otherwise returns None. - """ - root = Path(root) - - if not root.is_dir(): - msg = f"Invalid config path: {root} is not a directory" - raise FileNotFoundError(msg) - - for file in _default_config_files: - if (root / file).is_file(): - return root / file - - return None - - -def _parse_env_variables(text: str) -> str: - """Parse environment variables in the configuration text. - - Parameters - ---------- - text : str - The configuration text. - - Returns - ------- - str - The configuration text with environment variables parsed. - - Raises - ------ - KeyError - If an environment variable is not found. - """ - return Template(text).substitute(os.environ) - - -def _load_dotenv(config_path: Path | str) -> None: - """Load the .env file if it exists in the same directory as the config file. - - Parameters - ---------- - config_path : Path | str - The path to the config file. - """ - config_path = Path(config_path) - dotenv_path = config_path.parent / ".env" - if dotenv_path.exists(): - load_dotenv(dotenv_path) - - -def _get_config_path(root_dir: Path, config_filepath: Path | None) -> Path: - """Get the configuration file path. - - Parameters - ---------- - root_dir : str | Path - The root directory of the project. Will search for the config file in this directory. - config_filepath : str | None - The path to the config file. - If None, searches for config file in root. - - Returns - ------- - Path - The configuration file path. - """ - if config_filepath: - config_path = config_filepath.resolve() - if not config_path.exists(): - msg = f"Specified Config file not found: {config_path}" - raise FileNotFoundError(msg) - else: - config_path = _search_for_config_in_root_dir(root_dir) - - if not config_path: - msg = f"Config file not found in root directory: {root_dir}" - raise FileNotFoundError(msg) - - return config_path - - -def _apply_overrides(data: dict[str, Any], overrides: dict[str, Any]) -> None: - """Apply the overrides to the raw configuration.""" - for key, value in overrides.items(): - keys = key.split(".") - target = data - current_path = keys[0] - for k in keys[:-1]: - current_path += f".{k}" - target_obj = target.get(k, {}) - if not isinstance(target_obj, dict): - msg = f"Cannot override non-dict value: data[{current_path}] is not a dict." - raise TypeError(msg) - target[k] = target_obj - target = target[k] - target[keys[-1]] = value - - -def _parse(file_extension: str, contents: str) -> dict[str, Any]: - """Parse configuration.""" - match file_extension: - case ".yaml" | ".yml": - return yaml.safe_load(contents) - case ".json": - return json.loads(contents) - case _: - msg = ( - f"Unable to parse config. Unsupported file extension: {file_extension}" - ) - raise ValueError(msg) - - -def load_config( - root_dir: Path, - config_filepath: Path | None = None, - cli_overrides: dict[str, Any] | None = None, -) -> GraphRagConfig: - """Load configuration from a file. - - Parameters - ---------- - root_dir : str | Path - The root directory of the project. Will search for the config file in this directory. - config_filepath : str | None - The path to the config file. - If None, searches for config file in root. - cli_overrides : dict[str, Any] | None - A flat dictionary of cli overrides. - Example: {'output.base_dir': 'override_value'} - - Returns - ------- - GraphRagConfig - The loaded configuration. - - Raises - ------ - FileNotFoundError - If the config file is not found. - ValueError - If the config file extension is not supported. - TypeError - If applying cli overrides to the config fails. - KeyError - If config file references a non-existent environment variable. - ValidationError - If there are pydantic validation errors when instantiating the config. - """ - root = root_dir.resolve() - config_path = _get_config_path(root, config_filepath) - _load_dotenv(config_path) - config_extension = config_path.suffix - config_text = config_path.read_text(encoding="utf-8") - config_text = _parse_env_variables(config_text) - config_data = _parse(config_extension, config_text) - if cli_overrides: - _apply_overrides(config_data, cli_overrides) - return create_graphrag_config(config_data, root_dir=str(root)) diff --git a/graphrag/config/models/cache_config.py b/graphrag/config/models/cache_config.py deleted file mode 100644 index c301e9d3f6..0000000000 --- a/graphrag/config/models/cache_config.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from pydantic import BaseModel, Field - -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.enums import CacheType - - -class CacheConfig(BaseModel): - """The default configuration section for Cache.""" - - type: CacheType | str = Field( - description="The cache type to use.", - default=graphrag_config_defaults.cache.type, - ) - base_dir: str = Field( - description="The base directory for the cache.", - default=graphrag_config_defaults.cache.base_dir, - ) - connection_string: str | None = Field( - description="The cache connection string to use.", - default=graphrag_config_defaults.cache.connection_string, - ) - container_name: str | None = Field( - description="The cache container name to use.", - default=graphrag_config_defaults.cache.container_name, - ) - storage_account_blob_url: str | None = Field( - description="The storage account blob url to use.", - default=graphrag_config_defaults.cache.storage_account_blob_url, - ) - cosmosdb_account_url: str | None = Field( - description="The cosmosdb account url to use.", - default=graphrag_config_defaults.cache.cosmosdb_account_url, - ) diff --git a/graphrag/config/models/chunking_config.py b/graphrag/config/models/chunking_config.py deleted file mode 100644 index 902bffcbb9..0000000000 --- a/graphrag/config/models/chunking_config.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from pydantic import BaseModel, Field - -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.enums import ChunkStrategyType - - -class ChunkingConfig(BaseModel): - """Configuration section for chunking.""" - - size: int = Field( - description="The chunk size to use.", - default=graphrag_config_defaults.chunks.size, - ) - overlap: int = Field( - description="The chunk overlap to use.", - default=graphrag_config_defaults.chunks.overlap, - ) - group_by_columns: list[str] = Field( - description="The chunk by columns to use.", - default=graphrag_config_defaults.chunks.group_by_columns, - ) - strategy: ChunkStrategyType = Field( - description="The chunking strategy to use.", - default=graphrag_config_defaults.chunks.strategy, - ) - encoding_model: str = Field( - description="The encoding model to use.", - default=graphrag_config_defaults.chunks.encoding_model, - ) - prepend_metadata: bool = Field( - description="Prepend metadata into each chunk.", - default=graphrag_config_defaults.chunks.prepend_metadata, - ) - chunk_size_includes_metadata: bool = Field( - description="Count metadata in max tokens.", - default=graphrag_config_defaults.chunks.chunk_size_includes_metadata, - ) diff --git a/graphrag/config/models/embed_graph_config.py b/graphrag/config/models/embed_graph_config.py deleted file mode 100644 index 72827570e2..0000000000 --- a/graphrag/config/models/embed_graph_config.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from pydantic import BaseModel, Field - -from graphrag.config.defaults import graphrag_config_defaults - - -class EmbedGraphConfig(BaseModel): - """The default configuration section for Node2Vec.""" - - enabled: bool = Field( - description="A flag indicating whether to enable node2vec.", - default=graphrag_config_defaults.embed_graph.enabled, - ) - dimensions: int = Field( - description="The node2vec vector dimensions.", - default=graphrag_config_defaults.embed_graph.dimensions, - ) - num_walks: int = Field( - description="The node2vec number of walks.", - default=graphrag_config_defaults.embed_graph.num_walks, - ) - walk_length: int = Field( - description="The node2vec walk length.", - default=graphrag_config_defaults.embed_graph.walk_length, - ) - window_size: int = Field( - description="The node2vec window size.", - default=graphrag_config_defaults.embed_graph.window_size, - ) - iterations: int = Field( - description="The node2vec iterations.", - default=graphrag_config_defaults.embed_graph.iterations, - ) - random_seed: int = Field( - description="The node2vec random seed.", - default=graphrag_config_defaults.embed_graph.random_seed, - ) - use_lcc: bool = Field( - description="Whether to use the largest connected component.", - default=graphrag_config_defaults.embed_graph.use_lcc, - ) diff --git a/graphrag/config/models/graph_rag_config.py b/graphrag/config/models/graph_rag_config.py deleted file mode 100644 index 9959d56cd7..0000000000 --- a/graphrag/config/models/graph_rag_config.py +++ /dev/null @@ -1,416 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from dataclasses import asdict -from pathlib import Path - -from devtools import pformat -from pydantic import BaseModel, Field, model_validator - -import graphrag.config.defaults as defs -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.enums import VectorStoreType -from graphrag.config.errors import LanguageModelConfigMissingError -from graphrag.config.models.basic_search_config import BasicSearchConfig -from graphrag.config.models.cache_config import CacheConfig -from graphrag.config.models.chunking_config import ChunkingConfig -from graphrag.config.models.cluster_graph_config import ClusterGraphConfig -from graphrag.config.models.community_reports_config import CommunityReportsConfig -from graphrag.config.models.drift_search_config import DRIFTSearchConfig -from graphrag.config.models.embed_graph_config import EmbedGraphConfig -from graphrag.config.models.extract_claims_config import ClaimExtractionConfig -from graphrag.config.models.extract_graph_config import ExtractGraphConfig -from graphrag.config.models.extract_graph_nlp_config import ExtractGraphNLPConfig -from graphrag.config.models.global_search_config import GlobalSearchConfig -from graphrag.config.models.input_config import InputConfig -from graphrag.config.models.language_model_config import LanguageModelConfig -from graphrag.config.models.local_search_config import LocalSearchConfig -from graphrag.config.models.prune_graph_config import PruneGraphConfig -from graphrag.config.models.reporting_config import ReportingConfig -from graphrag.config.models.snapshots_config import SnapshotsConfig -from graphrag.config.models.storage_config import StorageConfig -from graphrag.config.models.summarize_descriptions_config import ( - SummarizeDescriptionsConfig, -) -from graphrag.config.models.text_embedding_config import TextEmbeddingConfig -from graphrag.config.models.umap_config import UmapConfig -from graphrag.config.models.vector_store_config import VectorStoreConfig -from graphrag.language_model.providers.litellm.services.rate_limiter.rate_limiter_factory import ( - RateLimiterFactory, -) -from graphrag.language_model.providers.litellm.services.retry.retry_factory import ( - RetryFactory, -) - - -class GraphRagConfig(BaseModel): - """Base class for the Default-Configuration parameterization settings.""" - - def __repr__(self) -> str: - """Get a string representation.""" - return pformat(self, highlight=False) - - def __str__(self): - """Get a string representation.""" - return self.model_dump_json(indent=4) - - root_dir: str = Field( - description="The root directory for the configuration.", - default=graphrag_config_defaults.root_dir, - ) - - def _validate_root_dir(self) -> None: - """Validate the root directory.""" - if self.root_dir.strip() == "": - self.root_dir = str(Path.cwd()) - - root_dir = Path(self.root_dir).resolve() - if not root_dir.is_dir(): - msg = f"Invalid root directory: {self.root_dir} is not a directory." - raise FileNotFoundError(msg) - self.root_dir = str(root_dir) - - models: dict[str, LanguageModelConfig] = Field( - description="Available language model configurations.", - default=graphrag_config_defaults.models, - ) - - def _validate_models(self) -> None: - """Validate the models configuration. - - Ensure both a default chat model and default embedding model - have been defined. Other models may also be defined but - defaults are required for the time being as places of the - code fallback to default model configs instead - of specifying a specific model. - - TODO: Don't fallback to default models elsewhere in the code. - Forcing code to specify a model to use and allowing for any - names for model configurations. - """ - if defs.DEFAULT_CHAT_MODEL_ID not in self.models: - raise LanguageModelConfigMissingError(defs.DEFAULT_CHAT_MODEL_ID) - if defs.DEFAULT_EMBEDDING_MODEL_ID not in self.models: - raise LanguageModelConfigMissingError(defs.DEFAULT_EMBEDDING_MODEL_ID) - - def _validate_retry_services(self) -> None: - """Validate the retry services configuration.""" - retry_factory = RetryFactory() - - for model_id, model in self.models.items(): - if model.retry_strategy != "none": - if model.retry_strategy not in retry_factory: - msg = f"Retry strategy '{model.retry_strategy}' for model '{model_id}' is not registered. Available strategies: {', '.join(retry_factory.keys())}" - raise ValueError(msg) - - _ = retry_factory.create( - strategy=model.retry_strategy, - max_retries=model.max_retries, - max_retry_wait=model.max_retry_wait, - ) - - def _validate_rate_limiter_services(self) -> None: - """Validate the rate limiter services configuration.""" - rate_limiter_factory = RateLimiterFactory() - - for model_id, model in self.models.items(): - if model.rate_limit_strategy is not None: - if model.rate_limit_strategy not in rate_limiter_factory: - msg = f"Rate Limiter strategy '{model.rate_limit_strategy}' for model '{model_id}' is not registered. Available strategies: {', '.join(rate_limiter_factory.keys())}" - raise ValueError(msg) - - rpm = ( - model.requests_per_minute - if type(model.requests_per_minute) is int - else None - ) - tpm = ( - model.tokens_per_minute - if type(model.tokens_per_minute) is int - else None - ) - if rpm is not None or tpm is not None: - _ = rate_limiter_factory.create( - strategy=model.rate_limit_strategy, rpm=rpm, tpm=tpm - ) - - input: InputConfig = Field( - description="The input configuration.", default=InputConfig() - ) - """The input configuration.""" - - def _validate_input_pattern(self) -> None: - """Validate the input file pattern based on the specified type.""" - if len(self.input.file_pattern) == 0: - if self.input.file_type == defs.InputFileType.text: - self.input.file_pattern = ".*\\.txt$" - else: - self.input.file_pattern = f".*\\.{self.input.file_type.value}$" - - def _validate_input_base_dir(self) -> None: - """Validate the input base directory.""" - if self.input.storage.type == defs.StorageType.file: - if self.input.storage.base_dir.strip() == "": - msg = "input storage base directory is required for file input storage. Please rerun `graphrag init` and set the input storage configuration." - raise ValueError(msg) - self.input.storage.base_dir = str( - (Path(self.root_dir) / self.input.storage.base_dir).resolve() - ) - - chunks: ChunkingConfig = Field( - description="The chunking configuration to use.", - default=ChunkingConfig(), - ) - """The chunking configuration to use.""" - - output: StorageConfig = Field( - description="The output configuration.", - default=StorageConfig(), - ) - """The output configuration.""" - - def _validate_output_base_dir(self) -> None: - """Validate the output base directory.""" - if self.output.type == defs.StorageType.file: - if self.output.base_dir.strip() == "": - msg = "output base directory is required for file output. Please rerun `graphrag init` and set the output configuration." - raise ValueError(msg) - self.output.base_dir = str( - (Path(self.root_dir) / self.output.base_dir).resolve() - ) - - outputs: dict[str, StorageConfig] | None = Field( - description="A list of output configurations used for multi-index query.", - default=graphrag_config_defaults.outputs, - ) - - def _validate_multi_output_base_dirs(self) -> None: - """Validate the outputs dict base directories.""" - if self.outputs: - for output in self.outputs.values(): - if output.type == defs.StorageType.file: - if output.base_dir.strip() == "": - msg = "Output base directory is required for file output. Please rerun `graphrag init` and set the output configuration." - raise ValueError(msg) - output.base_dir = str( - (Path(self.root_dir) / output.base_dir).resolve() - ) - - update_index_output: StorageConfig = Field( - description="The output configuration for the updated index.", - default=StorageConfig( - base_dir=graphrag_config_defaults.update_index_output.base_dir, - ), - ) - """The output configuration for the updated index.""" - - def _validate_update_index_output_base_dir(self) -> None: - """Validate the update index output base directory.""" - if self.update_index_output.type == defs.StorageType.file: - if self.update_index_output.base_dir.strip() == "": - msg = "update_index_output base directory is required for file output. Please rerun `graphrag init` and set the update_index_output configuration." - raise ValueError(msg) - self.update_index_output.base_dir = str( - (Path(self.root_dir) / self.update_index_output.base_dir).resolve() - ) - - cache: CacheConfig = Field( - description="The cache configuration.", default=CacheConfig() - ) - """The cache configuration.""" - - reporting: ReportingConfig = Field( - description="The reporting configuration.", default=ReportingConfig() - ) - """The reporting configuration.""" - - def _validate_reporting_base_dir(self) -> None: - """Validate the reporting base directory.""" - if self.reporting.type == defs.ReportingType.file: - if self.reporting.base_dir.strip() == "": - msg = "Reporting base directory is required for file reporting. Please rerun `graphrag init` and set the reporting configuration." - raise ValueError(msg) - self.reporting.base_dir = str( - (Path(self.root_dir) / self.reporting.base_dir).resolve() - ) - - vector_store: dict[str, VectorStoreConfig] = Field( - description="The vector store configuration.", - default_factory=lambda: { - k: VectorStoreConfig(**asdict(v)) - for k, v in graphrag_config_defaults.vector_store.items() - }, - ) - """The vector store configuration.""" - - workflows: list[str] | None = Field( - description="List of workflows to run, in execution order. This always overrides any built-in workflow methods.", - default=graphrag_config_defaults.workflows, - ) - """List of workflows to run, in execution order.""" - - embed_text: TextEmbeddingConfig = Field( - description="Text embedding configuration.", - default=TextEmbeddingConfig(), - ) - """Text embedding configuration.""" - - extract_graph: ExtractGraphConfig = Field( - description="The entity extraction configuration to use.", - default=ExtractGraphConfig(), - ) - """The entity extraction configuration to use.""" - - summarize_descriptions: SummarizeDescriptionsConfig = Field( - description="The description summarization configuration to use.", - default=SummarizeDescriptionsConfig(), - ) - """The description summarization configuration to use.""" - - extract_graph_nlp: ExtractGraphNLPConfig = Field( - description="The NLP-based graph extraction configuration to use.", - default=ExtractGraphNLPConfig(), - ) - """The NLP-based graph extraction configuration to use.""" - - prune_graph: PruneGraphConfig = Field( - description="The graph pruning configuration to use.", - default=PruneGraphConfig(), - ) - """The graph pruning configuration to use.""" - - cluster_graph: ClusterGraphConfig = Field( - description="The cluster graph configuration to use.", - default=ClusterGraphConfig(), - ) - """The cluster graph configuration to use.""" - - extract_claims: ClaimExtractionConfig = Field( - description="The claim extraction configuration to use.", - default=ClaimExtractionConfig( - enabled=graphrag_config_defaults.extract_claims.enabled, - ), - ) - """The claim extraction configuration to use.""" - - community_reports: CommunityReportsConfig = Field( - description="The community reports configuration to use.", - default=CommunityReportsConfig(), - ) - """The community reports configuration to use.""" - - embed_graph: EmbedGraphConfig = Field( - description="Graph embedding configuration.", - default=EmbedGraphConfig(), - ) - """Graph Embedding configuration.""" - - umap: UmapConfig = Field( - description="The UMAP configuration to use.", default=UmapConfig() - ) - """The UMAP configuration to use.""" - - snapshots: SnapshotsConfig = Field( - description="The snapshots configuration to use.", - default=SnapshotsConfig(), - ) - """The snapshots configuration to use.""" - - local_search: LocalSearchConfig = Field( - description="The local search configuration.", default=LocalSearchConfig() - ) - """The local search configuration.""" - - global_search: GlobalSearchConfig = Field( - description="The global search configuration.", default=GlobalSearchConfig() - ) - """The global search configuration.""" - - drift_search: DRIFTSearchConfig = Field( - description="The drift search configuration.", default=DRIFTSearchConfig() - ) - """The drift search configuration.""" - - basic_search: BasicSearchConfig = Field( - description="The basic search configuration.", default=BasicSearchConfig() - ) - """The basic search configuration.""" - - def _validate_vector_store_db_uri(self) -> None: - """Validate the vector store configuration.""" - for store in self.vector_store.values(): - if store.type == VectorStoreType.LanceDB: - if not store.db_uri or store.db_uri.strip == "": - msg = "Vector store URI is required for LanceDB. Please rerun `graphrag init` and set the vector store configuration." - raise ValueError(msg) - store.db_uri = str((Path(self.root_dir) / store.db_uri).resolve()) - - def _validate_factories(self) -> None: - """Validate the factories used in the configuration.""" - self._validate_retry_services() - self._validate_rate_limiter_services() - - def get_language_model_config(self, model_id: str) -> LanguageModelConfig: - """Get a model configuration by ID. - - Parameters - ---------- - model_id : str - The ID of the model to get. Should match an ID in the models list. - - Returns - ------- - LanguageModelConfig - The model configuration if found. - - Raises - ------ - ValueError - If the model ID is not found in the configuration. - """ - if model_id not in self.models: - err_msg = f"Model ID {model_id} not found in configuration. Please rerun `graphrag init` and set the model configuration." - raise ValueError(err_msg) - - return self.models[model_id] - - def get_vector_store_config(self, vector_store_id: str) -> VectorStoreConfig: - """Get a vector store configuration by ID. - - Parameters - ---------- - vector_store_id : str - The ID of the vector store to get. Should match an ID in the vector_store list. - - Returns - ------- - VectorStoreConfig - The vector store configuration if found. - - Raises - ------ - ValueError - If the vector store ID is not found in the configuration. - """ - if vector_store_id not in self.vector_store: - err_msg = f"Vector Store ID {vector_store_id} not found in configuration. Please rerun `graphrag init` and set the vector store configuration." - raise ValueError(err_msg) - - return self.vector_store[vector_store_id] - - @model_validator(mode="after") - def _validate_model(self): - """Validate the model configuration.""" - self._validate_root_dir() - self._validate_models() - self._validate_input_pattern() - self._validate_input_base_dir() - self._validate_reporting_base_dir() - self._validate_output_base_dir() - self._validate_multi_output_base_dirs() - self._validate_update_index_output_base_dir() - self._validate_vector_store_db_uri() - self._validate_factories() - return self diff --git a/graphrag/config/models/input_config.py b/graphrag/config/models/input_config.py deleted file mode 100644 index 139dd90c46..0000000000 --- a/graphrag/config/models/input_config.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from pydantic import BaseModel, Field - -import graphrag.config.defaults as defs -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.enums import InputFileType -from graphrag.config.models.storage_config import StorageConfig - - -class InputConfig(BaseModel): - """The default configuration section for Input.""" - - storage: StorageConfig = Field( - description="The storage configuration to use for reading input documents.", - default=StorageConfig( - base_dir=graphrag_config_defaults.input.storage.base_dir, - ), - ) - file_type: InputFileType = Field( - description="The input file type to use.", - default=graphrag_config_defaults.input.file_type, - ) - encoding: str = Field( - description="The input file encoding to use.", - default=defs.graphrag_config_defaults.input.encoding, - ) - file_pattern: str = Field( - description="The input file pattern to use.", - default=graphrag_config_defaults.input.file_pattern, - ) - file_filter: dict[str, str] | None = Field( - description="The optional file filter for the input files.", - default=graphrag_config_defaults.input.file_filter, - ) - text_column: str = Field( - description="The input text column to use.", - default=graphrag_config_defaults.input.text_column, - ) - title_column: str | None = Field( - description="The input title column to use.", - default=graphrag_config_defaults.input.title_column, - ) - metadata: list[str] | None = Field( - description="The document attribute columns to use.", - default=graphrag_config_defaults.input.metadata, - ) diff --git a/graphrag/config/models/language_model_config.py b/graphrag/config/models/language_model_config.py deleted file mode 100644 index e31e311762..0000000000 --- a/graphrag/config/models/language_model_config.py +++ /dev/null @@ -1,403 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Language model configuration.""" - -import logging -from typing import Literal - -import tiktoken -from pydantic import BaseModel, Field, model_validator - -from graphrag.config.defaults import language_model_defaults -from graphrag.config.enums import AsyncType, AuthType, ModelType -from graphrag.config.errors import ( - ApiKeyMissingError, - AzureApiBaseMissingError, - AzureApiVersionMissingError, - ConflictingSettingsError, -) -from graphrag.language_model.factory import ModelFactory - -logger = logging.getLogger(__name__) - - -class LanguageModelConfig(BaseModel): - """Language model configuration.""" - - api_key: str | None = Field( - description="The API key to use for the LLM service.", - default=language_model_defaults.api_key, - ) - - def _validate_api_key(self) -> None: - """Validate the API key. - - API Key is required when using OpenAI API - or when using Azure API with API Key authentication. - For the time being, this check is extra verbose for clarity. - It will also raise an exception if an API Key is provided - when one is not expected such as the case of using Azure - Managed Identity. - - Raises - ------ - ApiKeyMissingError - If the API key is missing and is required. - """ - if self.auth_type == AuthType.APIKey and ( - self.api_key is None or self.api_key.strip() == "" - ): - raise ApiKeyMissingError( - self.type, - self.auth_type.value, - ) - - if (self.auth_type == AuthType.AzureManagedIdentity) and ( - self.api_key is not None and self.api_key.strip() != "" - ): - msg = "API Key should not be provided when using Azure Managed Identity. Please rerun `graphrag init` and remove the api_key when using Azure Managed Identity." - raise ConflictingSettingsError(msg) - - auth_type: AuthType = Field( - description="The authentication type.", - default=language_model_defaults.auth_type, - ) - - def _validate_auth_type(self) -> None: - """Validate the authentication type. - - auth_type must be api_key when using OpenAI and - can be either api_key or azure_managed_identity when using AOI. - - Raises - ------ - ConflictingSettingsError - If the Azure authentication type conflicts with the model being used. - """ - if ( - self.auth_type == AuthType.AzureManagedIdentity - and self.type != ModelType.AzureOpenAIChat - and self.type != ModelType.AzureOpenAIEmbedding - and self.model_provider != "azure" # indicates Litellm + AOI - ): - msg = f"auth_type of azure_managed_identity is not supported for model type {self.type}. Please rerun `graphrag init` and set the auth_type to api_key." - raise ConflictingSettingsError(msg) - - type: ModelType | str = Field(description="The type of LLM model to use.") - - def _validate_type(self) -> None: - """Validate the model type. - - Raises - ------ - KeyError - If the model name is not recognized. - """ - # Type should be contained by the registered models - if not ModelFactory.is_supported_model(self.type): - msg = f"Model type {self.type} is not recognized, must be one of {ModelFactory.get_chat_models() + ModelFactory.get_embedding_models()}." - raise KeyError(msg) - if self.type in [ - "openai_chat", - "openai_embedding", - "azure_openai_chat", - "azure_openai_embedding", - ]: - msg = f"Model config based on fnllm is deprecated and will be removed in GraphRAG v3, please use {ModelType.Chat} or {ModelType.Embedding} instead to switch to LiteLLM config." - logger.warning(msg) - - model_provider: str | None = Field( - description="The model provider to use.", - default=language_model_defaults.model_provider, - ) - - def _validate_model_provider(self) -> None: - """Validate the model provider. - - Required when using Litellm. - - Raises - ------ - KeyError - If the model provider is not recognized. - """ - if (self.type == ModelType.Chat or self.type == ModelType.Embedding) and ( - self.model_provider is None or self.model_provider.strip() == "" - ): - msg = f"Model provider must be specified when using type == {self.type}." - raise KeyError(msg) - - model: str = Field(description="The LLM model to use.") - encoding_model: str = Field( - description="The encoding model to use", - default=language_model_defaults.encoding_model, - ) - - def _validate_encoding_model(self) -> None: - """Validate the encoding model. - - The default behavior is to use an encoding model that matches the LLM model. - LiteLLM supports 100+ models and their tokenization. There is no need to - set the encoding model when using the new LiteLLM provider as was done with fnllm provider. - - Users can still manually specify a tiktoken based encoding model to use even with the LiteLLM provider - in which case the specified encoding model will be used regardless of the LLM model being used, even if - it is not an openai based model. - - If not using LiteLLM provider, set the encoding model based on the LLM model name. - This is for backward compatibility with existing fnllm provider until fnllm is removed. - - Raises - ------ - KeyError - If the model name is not recognized. - """ - if ( - self.type != ModelType.Chat - and self.type != ModelType.Embedding - and self.encoding_model.strip() == "" - ): - self.encoding_model = tiktoken.encoding_name_for_model(self.model) - - api_base: str | None = Field( - description="The base URL for the LLM API.", - default=language_model_defaults.api_base, - ) - - def _validate_api_base(self) -> None: - """Validate the API base. - - Required when using AOI. - - Raises - ------ - AzureApiBaseMissingError - If the API base is missing and is required. - """ - if ( - self.type == ModelType.AzureOpenAIChat - or self.type == ModelType.AzureOpenAIEmbedding - or self.model_provider == "azure" # indicates Litellm + AOI - ) and (self.api_base is None or self.api_base.strip() == ""): - raise AzureApiBaseMissingError(self.type) - - api_version: str | None = Field( - description="The version of the LLM API to use.", - default=language_model_defaults.api_version, - ) - - def _validate_api_version(self) -> None: - """Validate the API version. - - Required when using AOI. - - Raises - ------ - AzureApiBaseMissingError - If the API base is missing and is required. - """ - if ( - self.type == ModelType.AzureOpenAIChat - or self.type == ModelType.AzureOpenAIEmbedding - or self.model_provider == "azure" # indicates Litellm + AOI - ) and (self.api_version is None or self.api_version.strip() == ""): - raise AzureApiVersionMissingError(self.type) - - deployment_name: str | None = Field( - description="The deployment name to use for the LLM service.", - default=language_model_defaults.deployment_name, - ) - - def _validate_deployment_name(self) -> None: - """Validate the deployment name. - - Required when using AOI. - - Raises - ------ - AzureDeploymentNameMissingError - If the deployment name is missing and is required. - """ - if ( - self.type == ModelType.AzureOpenAIChat - or self.type == ModelType.AzureOpenAIEmbedding - or self.model_provider == "azure" # indicates Litellm + AOI - ) and (self.deployment_name is None or self.deployment_name.strip() == ""): - msg = f"deployment_name is not set for Azure-hosted model. This will default to your model name ({self.model}). If different, this should be set." - logger.debug(msg) - - organization: str | None = Field( - description="The organization to use for the LLM service.", - default=language_model_defaults.organization, - ) - proxy: str | None = Field( - description="The proxy to use for the LLM service.", - default=language_model_defaults.proxy, - ) - audience: str | None = Field( - description="Azure resource URI to use with managed identity for the llm connection.", - default=language_model_defaults.audience, - ) - model_supports_json: bool | None = Field( - description="Whether the model supports JSON output mode.", - default=language_model_defaults.model_supports_json, - ) - request_timeout: float = Field( - description="The request timeout to use.", - default=language_model_defaults.request_timeout, - ) - tokens_per_minute: int | Literal["auto"] | None = Field( - description="The number of tokens per minute to use for the LLM service.", - default=language_model_defaults.tokens_per_minute, - ) - - def _validate_tokens_per_minute(self) -> None: - """Validate the tokens per minute. - - Raises - ------ - ValueError - If the tokens per minute is less than 0. - """ - # If the value is a number, check if it is less than 1 - if isinstance(self.tokens_per_minute, int) and self.tokens_per_minute < 1: - msg = f"Tokens per minute must be a non zero positive number, 'auto' or null. Suggested value: {language_model_defaults.tokens_per_minute}." - raise ValueError(msg) - - if ( - (self.type == ModelType.Chat or self.type == ModelType.Embedding) - and self.rate_limit_strategy is not None - and self.tokens_per_minute == "auto" - ): - msg = f"tokens_per_minute cannot be set to 'auto' when using type '{self.type}'. Please set it to a positive integer or null to disable." - raise ValueError(msg) - - requests_per_minute: int | Literal["auto"] | None = Field( - description="The number of requests per minute to use for the LLM service.", - default=language_model_defaults.requests_per_minute, - ) - - def _validate_requests_per_minute(self) -> None: - """Validate the requests per minute. - - Raises - ------ - ValueError - If the requests per minute is less than 0. - """ - # If the value is a number, check if it is less than 1 - if isinstance(self.requests_per_minute, int) and self.requests_per_minute < 1: - msg = f"Requests per minute must be a non zero positive number, 'auto' or null. Suggested value: {language_model_defaults.requests_per_minute}." - raise ValueError(msg) - - if ( - (self.type == ModelType.Chat or self.type == ModelType.Embedding) - and self.rate_limit_strategy is not None - and self.requests_per_minute == "auto" - ): - msg = f"requests_per_minute cannot be set to 'auto' when using type '{self.type}'. Please set it to a positive integer or null to disable." - raise ValueError(msg) - - rate_limit_strategy: str | None = Field( - description="The rate limit strategy to use for the LLM service.", - default=language_model_defaults.rate_limit_strategy, - ) - - retry_strategy: str = Field( - description="The retry strategy to use for the LLM service.", - default=language_model_defaults.retry_strategy, - ) - max_retries: int = Field( - description="The maximum number of retries to use for the LLM service.", - default=language_model_defaults.max_retries, - ) - - def _validate_max_retries(self) -> None: - """Validate the maximum retries. - - Raises - ------ - ValueError - If the maximum retries is less than 0. - """ - if self.max_retries < 1: - msg = f"Maximum retries must be greater than or equal to 1. Suggested value: {language_model_defaults.max_retries}." - raise ValueError(msg) - - max_retry_wait: float = Field( - description="The maximum retry wait to use for the LLM service.", - default=language_model_defaults.max_retry_wait, - ) - concurrent_requests: int = Field( - description="Whether to use concurrent requests for the LLM service.", - default=language_model_defaults.concurrent_requests, - ) - async_mode: AsyncType = Field( - description="The async mode to use.", default=language_model_defaults.async_mode - ) - responses: list[str | BaseModel] | None = Field( - default=language_model_defaults.responses, - description="Static responses to use in mock mode.", - ) - max_tokens: int | None = Field( - description="The maximum number of tokens to generate.", - default=language_model_defaults.max_tokens, - ) - temperature: float = Field( - description="The temperature to use for token generation.", - default=language_model_defaults.temperature, - ) - max_completion_tokens: int | None = Field( - description="The maximum number of tokens to consume. This includes reasoning tokens for the o* reasoning models.", - default=language_model_defaults.max_completion_tokens, - ) - reasoning_effort: str | None = Field( - description="Level of effort OpenAI reasoning models should expend. Supported options are 'low', 'medium', 'high'; and OAI defaults to 'medium'.", - default=language_model_defaults.reasoning_effort, - ) - top_p: float = Field( - description="The top-p value to use for token generation.", - default=language_model_defaults.top_p, - ) - n: int = Field( - description="The number of completions to generate.", - default=language_model_defaults.n, - ) - frequency_penalty: float = Field( - description="The frequency penalty to use for token generation.", - default=language_model_defaults.frequency_penalty, - ) - presence_penalty: float = Field( - description="The presence penalty to use for token generation.", - default=language_model_defaults.presence_penalty, - ) - - def _validate_azure_settings(self) -> None: - """Validate the Azure settings. - - Raises - ------ - AzureApiBaseMissingError - If the API base is missing and is required. - AzureApiVersionMissingError - If the API version is missing and is required. - AzureDeploymentNameMissingError - If the deployment name is missing and is required. - """ - self._validate_api_base() - self._validate_api_version() - self._validate_deployment_name() - - @model_validator(mode="after") - def _validate_model(self): - self._validate_type() - self._validate_model_provider() - self._validate_auth_type() - self._validate_api_key() - self._validate_tokens_per_minute() - self._validate_requests_per_minute() - self._validate_max_retries() - self._validate_azure_settings() - self._validate_encoding_model() - return self diff --git a/graphrag/config/models/storage_config.py b/graphrag/config/models/storage_config.py deleted file mode 100644 index 3f01448c66..0000000000 --- a/graphrag/config/models/storage_config.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from pathlib import Path - -from pydantic import BaseModel, Field, field_validator - -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.enums import StorageType - - -class StorageConfig(BaseModel): - """The default configuration section for storage.""" - - type: StorageType | str = Field( - description="The storage type to use.", - default=graphrag_config_defaults.storage.type, - ) - base_dir: str = Field( - description="The base directory for the output.", - default=graphrag_config_defaults.storage.base_dir, - ) - - # Validate the base dir for multiple OS (use Path) - # if not using a cloud storage type. - @field_validator("base_dir", mode="before") - @classmethod - def validate_base_dir(cls, value, info): - """Ensure that base_dir is a valid filesystem path when using local storage.""" - # info.data contains other field values, including 'type' - if info.data.get("type") != StorageType.file: - return value - return str(Path(value)) - - connection_string: str | None = Field( - description="The storage connection string to use.", - default=graphrag_config_defaults.storage.connection_string, - ) - container_name: str | None = Field( - description="The storage container name to use.", - default=graphrag_config_defaults.storage.container_name, - ) - storage_account_blob_url: str | None = Field( - description="The storage account blob url to use.", - default=graphrag_config_defaults.storage.storage_account_blob_url, - ) - cosmosdb_account_url: str | None = Field( - description="The cosmosdb account url to use.", - default=graphrag_config_defaults.storage.cosmosdb_account_url, - ) diff --git a/graphrag/config/models/text_embedding_config.py b/graphrag/config/models/text_embedding_config.py deleted file mode 100644 index e154675a1e..0000000000 --- a/graphrag/config/models/text_embedding_config.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from pydantic import BaseModel, Field - -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.models.language_model_config import LanguageModelConfig - - -class TextEmbeddingConfig(BaseModel): - """Configuration section for text embeddings.""" - - model_id: str = Field( - description="The model ID to use for text embeddings.", - default=graphrag_config_defaults.embed_text.model_id, - ) - vector_store_id: str = Field( - description="The vector store ID to use for text embeddings.", - default=graphrag_config_defaults.embed_text.vector_store_id, - ) - batch_size: int = Field( - description="The batch size to use.", - default=graphrag_config_defaults.embed_text.batch_size, - ) - batch_max_tokens: int = Field( - description="The batch max tokens to use.", - default=graphrag_config_defaults.embed_text.batch_max_tokens, - ) - names: list[str] = Field( - description="The specific embeddings to perform.", - default=graphrag_config_defaults.embed_text.names, - ) - strategy: dict | None = Field( - description="The override strategy to use.", - default=graphrag_config_defaults.embed_text.strategy, - ) - - def resolved_strategy(self, model_config: LanguageModelConfig) -> dict: - """Get the resolved text embedding strategy.""" - from graphrag.index.operations.embed_text.embed_text import ( - TextEmbedStrategyType, - ) - - return self.strategy or { - "type": TextEmbedStrategyType.openai, - "llm": model_config.model_dump(), - "num_threads": model_config.concurrent_requests, - "batch_size": self.batch_size, - "batch_max_tokens": self.batch_max_tokens, - } diff --git a/graphrag/config/models/umap_config.py b/graphrag/config/models/umap_config.py deleted file mode 100644 index e7a0c947bc..0000000000 --- a/graphrag/config/models/umap_config.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from pydantic import BaseModel, Field - -from graphrag.config.defaults import graphrag_config_defaults - - -class UmapConfig(BaseModel): - """Configuration section for UMAP.""" - - enabled: bool = Field( - description="A flag indicating whether to enable UMAP.", - default=graphrag_config_defaults.umap.enabled, - ) diff --git a/graphrag/config/models/vector_store_config.py b/graphrag/config/models/vector_store_config.py deleted file mode 100644 index 983165dcf1..0000000000 --- a/graphrag/config/models/vector_store_config.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Parameterization settings for the default configuration.""" - -from pydantic import BaseModel, Field, model_validator - -from graphrag.config.defaults import vector_store_defaults -from graphrag.config.embeddings import all_embeddings -from graphrag.config.enums import VectorStoreType -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig - - -class VectorStoreConfig(BaseModel): - """The default configuration section for Vector Store.""" - - type: str = Field( - description="The vector store type to use.", - default=vector_store_defaults.type, - ) - - db_uri: str | None = Field( - description="The database URI to use.", - default=None, - ) - - def _validate_db_uri(self) -> None: - """Validate the database URI.""" - if self.type == VectorStoreType.LanceDB.value and ( - self.db_uri is None or self.db_uri.strip() == "" - ): - self.db_uri = vector_store_defaults.db_uri - - if self.type != VectorStoreType.LanceDB.value and ( - self.db_uri is not None and self.db_uri.strip() != "" - ): - msg = "vector_store.db_uri is only used when vector_store.type == lancedb. Please rerun `graphrag init` and select the correct vector store type." - raise ValueError(msg) - - url: str | None = Field( - description="The database URL when type == azure_ai_search.", - default=vector_store_defaults.url, - ) - - def _validate_url(self) -> None: - """Validate the database URL.""" - if self.type == VectorStoreType.AzureAISearch and ( - self.url is None or self.url.strip() == "" - ): - msg = "vector_store.url is required when vector_store.type == azure_ai_search. Please rerun `graphrag init` and select the correct vector store type." - raise ValueError(msg) - - if self.type == VectorStoreType.CosmosDB and ( - self.url is None or self.url.strip() == "" - ): - msg = "vector_store.url is required when vector_store.type == cosmos_db. Please rerun `graphrag init` and select the correct vector store type." - raise ValueError(msg) - - if self.type == VectorStoreType.LanceDB and ( - self.url is not None and self.url.strip() != "" - ): - msg = "vector_store.url is only used when vector_store.type == azure_ai_search or vector_store.type == cosmos_db. Please rerun `graphrag init` and select the correct vector store type." - raise ValueError(msg) - - api_key: str | None = Field( - description="The database API key when type == azure_ai_search.", - default=vector_store_defaults.api_key, - ) - - audience: str | None = Field( - description="The database audience when type == azure_ai_search.", - default=vector_store_defaults.audience, - ) - - container_name: str = Field( - description="The container name to use.", - default=vector_store_defaults.container_name, - ) - - database_name: str | None = Field( - description="The database name to use when type == cosmos_db.", - default=vector_store_defaults.database_name, - ) - - overwrite: bool = Field( - description="Overwrite the existing data.", - default=vector_store_defaults.overwrite, - ) - - embeddings_schema: dict[str, VectorStoreSchemaConfig] = {} - - def _validate_embeddings_schema(self) -> None: - """Validate the embeddings schema.""" - for name in self.embeddings_schema: - if name not in all_embeddings: - msg = f"vector_store.embeddings_schema contains an invalid embedding schema name: {name}. Please update your settings.yaml and select the correct embedding schema names." - raise ValueError(msg) - - if self.type == VectorStoreType.CosmosDB: - for id_field in self.embeddings_schema: - if id_field != "id": - msg = "When using CosmosDB, the id_field in embeddings_schema must be 'id'. Please update your settings.yaml and set the id_field to 'id'." - raise ValueError(msg) - - @model_validator(mode="after") - def _validate_model(self): - """Validate the model.""" - self._validate_db_uri() - self._validate_url() - self._validate_embeddings_schema() - return self diff --git a/graphrag/config/read_dotenv.py b/graphrag/config/read_dotenv.py deleted file mode 100644 index a2da5d43fe..0000000000 --- a/graphrag/config/read_dotenv.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing the read_dotenv utility.""" - -import logging -import os -from pathlib import Path - -from dotenv import dotenv_values - -logger = logging.getLogger(__name__) - - -def read_dotenv(root: str) -> None: - """Read a .env file in the given root path.""" - env_path = Path(root) / ".env" - if env_path.exists(): - logger.info("Loading pipeline .env file") - env_config = dotenv_values(f"{env_path}") - for key, value in env_config.items(): - if key not in os.environ: - os.environ[key] = value or "" - else: - logger.info("No .env file found at %s", root) diff --git a/graphrag/factory/factory.py b/graphrag/factory/factory.py deleted file mode 100644 index 0624e9bfa1..0000000000 --- a/graphrag/factory/factory.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Factory ABC.""" - -from abc import ABC -from collections.abc import Callable -from typing import Any, ClassVar, Generic, TypeVar - -T = TypeVar("T", covariant=True) - - -class Factory(ABC, Generic[T]): - """Abstract base class for factories.""" - - _instance: ClassVar["Factory | None"] = None - - def __new__(cls, *args: Any, **kwargs: Any) -> "Factory": - """Create a new instance of Factory if it does not exist.""" - if cls._instance is None: - cls._instance = super().__new__(cls, *args, **kwargs) - return cls._instance - - def __init__(self): - if not hasattr(self, "_initialized"): - self._services: dict[str, Callable[..., T]] = {} - self._initialized = True - - def __contains__(self, strategy: str) -> bool: - """Check if a strategy is registered.""" - return strategy in self._services - - def keys(self) -> list[str]: - """Get a list of registered strategy names.""" - return list(self._services.keys()) - - def register(self, *, strategy: str, service_initializer: Callable[..., T]) -> None: - """ - Register a new service. - - Args - ---- - strategy: The name of the strategy. - service_initializer: A callable that creates an instance of T. - """ - self._services[strategy] = service_initializer - - def create(self, *, strategy: str, **kwargs: Any) -> T: - """ - Create a service instance based on the strategy. - - Args - ---- - strategy: The name of the strategy. - **kwargs: Additional arguments to pass to the service initializer. - - Returns - ------- - An instance of T. - - Raises - ------ - ValueError: If the strategy is not registered. - """ - if strategy not in self._services: - msg = f"Strategy '{strategy}' is not registered." - raise ValueError(msg) - return self._services[strategy](**kwargs) diff --git a/graphrag/index/input/__init__.py b/graphrag/index/input/__init__.py deleted file mode 100644 index 15177c91db..0000000000 --- a/graphrag/index/input/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""The Indexing Engine input package root.""" diff --git a/graphrag/index/input/csv.py b/graphrag/index/input/csv.py deleted file mode 100644 index eea4864b17..0000000000 --- a/graphrag/index/input/csv.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing load method definition.""" - -import logging -from io import BytesIO - -import pandas as pd - -from graphrag.config.models.input_config import InputConfig -from graphrag.index.input.util import load_files, process_data_columns -from graphrag.storage.pipeline_storage import PipelineStorage - -logger = logging.getLogger(__name__) - - -async def load_csv( - config: InputConfig, - storage: PipelineStorage, -) -> pd.DataFrame: - """Load csv inputs from a directory.""" - logger.info("Loading csv files from %s", config.storage.base_dir) - - async def load_file(path: str, group: dict | None) -> pd.DataFrame: - if group is None: - group = {} - buffer = BytesIO(await storage.get(path, as_bytes=True)) - data = pd.read_csv(buffer, encoding=config.encoding) - additional_keys = group.keys() - if len(additional_keys) > 0: - data[[*additional_keys]] = data.apply( - lambda _row: pd.Series([group[key] for key in additional_keys]), axis=1 - ) - - data = process_data_columns(data, config, path) - - creation_date = await storage.get_creation_date(path) - data["creation_date"] = data.apply(lambda _: creation_date, axis=1) - - return data - - return await load_files(load_file, config, storage) diff --git a/graphrag/index/input/factory.py b/graphrag/index/input/factory.py deleted file mode 100644 index bc4da8c7a1..0000000000 --- a/graphrag/index/input/factory.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing create_input method definition.""" - -import logging -from collections.abc import Awaitable, Callable -from typing import cast - -import pandas as pd - -from graphrag.config.enums import InputFileType -from graphrag.config.models.input_config import InputConfig -from graphrag.index.input.csv import load_csv -from graphrag.index.input.json import load_json -from graphrag.index.input.text import load_text -from graphrag.storage.pipeline_storage import PipelineStorage - -logger = logging.getLogger(__name__) -loaders: dict[str, Callable[..., Awaitable[pd.DataFrame]]] = { - InputFileType.text: load_text, - InputFileType.csv: load_csv, - InputFileType.json: load_json, -} - - -async def create_input( - config: InputConfig, - storage: PipelineStorage, -) -> pd.DataFrame: - """Instantiate input data for a pipeline.""" - logger.info("loading input from root_dir=%s", config.storage.base_dir) - - if config.file_type in loaders: - logger.info("Loading Input %s", config.file_type) - loader = loaders[config.file_type] - result = await loader(config, storage) - # Convert metadata columns to strings and collapse them into a JSON object - if config.metadata: - if all(col in result.columns for col in config.metadata): - # Collapse the metadata columns into a single JSON object column - result["metadata"] = result[config.metadata].apply( - lambda row: row.to_dict(), axis=1 - ) - else: - value_error_msg = ( - "One or more metadata columns not found in the DataFrame." - ) - raise ValueError(value_error_msg) - - result[config.metadata] = result[config.metadata].astype(str) - - return cast("pd.DataFrame", result) - - msg = f"Unknown input type {config.file_type}" - raise ValueError(msg) diff --git a/graphrag/index/input/json.py b/graphrag/index/input/json.py deleted file mode 100644 index e2880bc888..0000000000 --- a/graphrag/index/input/json.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing load method definition.""" - -import json -import logging - -import pandas as pd - -from graphrag.config.models.input_config import InputConfig -from graphrag.index.input.util import load_files, process_data_columns -from graphrag.storage.pipeline_storage import PipelineStorage - -logger = logging.getLogger(__name__) - - -async def load_json( - config: InputConfig, - storage: PipelineStorage, -) -> pd.DataFrame: - """Load json inputs from a directory.""" - logger.info("Loading json files from %s", config.storage.base_dir) - - async def load_file(path: str, group: dict | None) -> pd.DataFrame: - if group is None: - group = {} - text = await storage.get(path, encoding=config.encoding) - as_json = json.loads(text) - # json file could just be a single object, or an array of objects - rows = as_json if isinstance(as_json, list) else [as_json] - data = pd.DataFrame(rows) - - additional_keys = group.keys() - if len(additional_keys) > 0: - data[[*additional_keys]] = data.apply( - lambda _row: pd.Series([group[key] for key in additional_keys]), axis=1 - ) - - data = process_data_columns(data, config, path) - - creation_date = await storage.get_creation_date(path) - data["creation_date"] = data.apply(lambda _: creation_date, axis=1) - - return data - - return await load_files(load_file, config, storage) diff --git a/graphrag/index/input/text.py b/graphrag/index/input/text.py deleted file mode 100644 index 1834a532eb..0000000000 --- a/graphrag/index/input/text.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing load method definition.""" - -import logging -from pathlib import Path - -import pandas as pd - -from graphrag.config.models.input_config import InputConfig -from graphrag.index.input.util import load_files -from graphrag.index.utils.hashing import gen_sha512_hash -from graphrag.storage.pipeline_storage import PipelineStorage - -logger = logging.getLogger(__name__) - - -async def load_text( - config: InputConfig, - storage: PipelineStorage, -) -> pd.DataFrame: - """Load text inputs from a directory.""" - - async def load_file(path: str, group: dict | None = None) -> pd.DataFrame: - if group is None: - group = {} - text = await storage.get(path, encoding=config.encoding) - new_item = {**group, "text": text} - new_item["id"] = gen_sha512_hash(new_item, new_item.keys()) - new_item["title"] = str(Path(path).name) - new_item["creation_date"] = await storage.get_creation_date(path) - return pd.DataFrame([new_item]) - - return await load_files(load_file, config, storage) diff --git a/graphrag/index/input/util.py b/graphrag/index/input/util.py deleted file mode 100644 index cc15183673..0000000000 --- a/graphrag/index/input/util.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Shared column processing for structured input files.""" - -import logging -import re -from typing import Any - -import pandas as pd - -from graphrag.config.models.input_config import InputConfig -from graphrag.index.utils.hashing import gen_sha512_hash -from graphrag.storage.pipeline_storage import PipelineStorage - -logger = logging.getLogger(__name__) - - -async def load_files( - loader: Any, - config: InputConfig, - storage: PipelineStorage, -) -> pd.DataFrame: - """Load files from storage and apply a loader function.""" - files = list( - storage.find( - re.compile(config.file_pattern), - file_filter=config.file_filter, - ) - ) - - if len(files) == 0: - msg = f"No {config.file_type} files found in {config.storage.base_dir}" - raise ValueError(msg) - - files_loaded = [] - - for file, group in files: - try: - files_loaded.append(await loader(file, group)) - except Exception as e: # noqa: BLE001 (catching Exception is fine here) - logger.warning("Warning! Error loading file %s. Skipping...", file) - logger.warning("Error: %s", e) - - logger.info( - "Found %d %s files, loading %d", len(files), config.file_type, len(files_loaded) - ) - result = pd.concat(files_loaded) - total_files_log = ( - f"Total number of unfiltered {config.file_type} rows: {len(result)}" - ) - logger.info(total_files_log) - return result - - -def process_data_columns( - documents: pd.DataFrame, config: InputConfig, path: str -) -> pd.DataFrame: - """Process configured data columns of a DataFrame.""" - if "id" not in documents.columns: - documents["id"] = documents.apply( - lambda x: gen_sha512_hash(x, x.keys()), axis=1 - ) - if config.text_column is not None and "text" not in documents.columns: - if config.text_column not in documents.columns: - logger.warning( - "text_column %s not found in csv file %s", - config.text_column, - path, - ) - else: - documents["text"] = documents.apply(lambda x: x[config.text_column], axis=1) - if config.title_column is not None: - if config.title_column not in documents.columns: - logger.warning( - "title_column %s not found in csv file %s", - config.title_column, - path, - ) - else: - documents["title"] = documents.apply( - lambda x: x[config.title_column], axis=1 - ) - else: - documents["title"] = documents.apply(lambda _: path, axis=1) - return documents diff --git a/graphrag/index/operations/chunk_text/__init__.py b/graphrag/index/operations/chunk_text/__init__.py deleted file mode 100644 index 1e000e6aa7..0000000000 --- a/graphrag/index/operations/chunk_text/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""The Indexing Engine text chunk package root.""" diff --git a/graphrag/index/operations/chunk_text/chunk_text.py b/graphrag/index/operations/chunk_text/chunk_text.py deleted file mode 100644 index fc50370e28..0000000000 --- a/graphrag/index/operations/chunk_text/chunk_text.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing _get_num_total, chunk, run_strategy and load_strategy methods definitions.""" - -from typing import Any, cast - -import pandas as pd - -from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.config.models.chunking_config import ChunkingConfig, ChunkStrategyType -from graphrag.index.operations.chunk_text.typing import ( - ChunkInput, - ChunkStrategy, -) -from graphrag.logger.progress import ProgressTicker, progress_ticker - - -def chunk_text( - input: pd.DataFrame, - column: str, - size: int, - overlap: int, - encoding_model: str, - strategy: ChunkStrategyType, - callbacks: WorkflowCallbacks, -) -> pd.Series: - """ - Chunk a piece of text into smaller pieces. - - ## Usage - ```yaml - args: - column: # The name of the column containing the text to chunk, this can either be a column with text, or a column with a list[tuple[doc_id, str]] - strategy: # The strategy to use to chunk the text, see below for more details - ``` - - ## Strategies - The text chunk verb uses a strategy to chunk the text. The strategy is an object which defines the strategy to use. The following strategies are available: - - ### tokens - This strategy uses the [tokens] library to chunk a piece of text. The strategy config is as follows: - - ```yaml - strategy: tokens - size: 1200 # Optional, The chunk size to use, default: 1200 - overlap: 100 # Optional, The chunk overlap to use, default: 100 - ``` - - ### sentence - This strategy uses the nltk library to chunk a piece of text into sentences. The strategy config is as follows: - - ```yaml - strategy: sentence - ``` - """ - strategy_exec = load_strategy(strategy) - - num_total = _get_num_total(input, column) - tick = progress_ticker(callbacks.progress, num_total) - - # collapse the config back to a single object to support "polymorphic" function call - config = ChunkingConfig(size=size, overlap=overlap, encoding_model=encoding_model) - - return cast( - "pd.Series", - input.apply( - cast( - "Any", - lambda x: run_strategy( - strategy_exec, - x[column], - config, - tick, - ), - ), - axis=1, - ), - ) - - -def run_strategy( - strategy_exec: ChunkStrategy, - input: ChunkInput, - config: ChunkingConfig, - tick: ProgressTicker, -) -> list[str | tuple[list[str] | None, str, int]]: - """Run strategy method definition.""" - if isinstance(input, str): - return [item.text_chunk for item in strategy_exec([input], config, tick)] - - # We can work with both just a list of text content - # or a list of tuples of (document_id, text content) - # text_to_chunk = ''' - texts = [item if isinstance(item, str) else item[1] for item in input] - - strategy_results = strategy_exec(texts, config, tick) - - results = [] - for strategy_result in strategy_results: - doc_indices = strategy_result.source_doc_indices - if isinstance(input[doc_indices[0]], str): - results.append(strategy_result.text_chunk) - else: - doc_ids = [input[doc_idx][0] for doc_idx in doc_indices] - results.append(( - doc_ids, - strategy_result.text_chunk, - strategy_result.n_tokens, - )) - return results - - -def load_strategy(strategy: ChunkStrategyType) -> ChunkStrategy: - """Load strategy method definition.""" - match strategy: - case ChunkStrategyType.tokens: - from graphrag.index.operations.chunk_text.strategies import run_tokens - - return run_tokens - case ChunkStrategyType.sentence: - # NLTK - from graphrag.index.operations.chunk_text.bootstrap import bootstrap - from graphrag.index.operations.chunk_text.strategies import run_sentences - - bootstrap() - return run_sentences - case _: - msg = f"Unknown strategy: {strategy}" - raise ValueError(msg) - - -def _get_num_total(output: pd.DataFrame, column: str) -> int: - num_total = 0 - for row in output[column]: - if isinstance(row, str): - num_total += 1 - else: - num_total += len(row) - return num_total diff --git a/graphrag/index/operations/chunk_text/strategies.py b/graphrag/index/operations/chunk_text/strategies.py deleted file mode 100644 index 4be14e408d..0000000000 --- a/graphrag/index/operations/chunk_text/strategies.py +++ /dev/null @@ -1,69 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing chunk strategies.""" - -from collections.abc import Iterable - -import nltk -import tiktoken - -from graphrag.config.models.chunking_config import ChunkingConfig -from graphrag.index.operations.chunk_text.typing import TextChunk -from graphrag.index.text_splitting.text_splitting import ( - TokenChunkerOptions, - split_multiple_texts_on_tokens, -) -from graphrag.logger.progress import ProgressTicker - - -def get_encoding_fn(encoding_name): - """Get the encoding model.""" - enc = tiktoken.get_encoding(encoding_name) - - def encode(text: str) -> list[int]: - if not isinstance(text, str): - text = f"{text}" - return enc.encode(text) - - def decode(tokens: list[int]) -> str: - return enc.decode(tokens) - - return encode, decode - - -def run_tokens( - input: list[str], - config: ChunkingConfig, - tick: ProgressTicker, -) -> Iterable[TextChunk]: - """Chunks text into chunks based on encoding tokens.""" - tokens_per_chunk = config.size - chunk_overlap = config.overlap - encoding_name = config.encoding_model - - encode, decode = get_encoding_fn(encoding_name) - return split_multiple_texts_on_tokens( - input, - TokenChunkerOptions( - chunk_overlap=chunk_overlap, - tokens_per_chunk=tokens_per_chunk, - encode=encode, - decode=decode, - ), - tick, - ) - - -def run_sentences( - input: list[str], _config: ChunkingConfig, tick: ProgressTicker -) -> Iterable[TextChunk]: - """Chunks text into multiple parts by sentence.""" - for doc_idx, text in enumerate(input): - sentences = nltk.sent_tokenize(text) - for sentence in sentences: - yield TextChunk( - text_chunk=sentence, - source_doc_indices=[doc_idx], - ) - tick(1) diff --git a/graphrag/index/operations/chunk_text/typing.py b/graphrag/index/operations/chunk_text/typing.py deleted file mode 100644 index bf58ef5ec1..0000000000 --- a/graphrag/index/operations/chunk_text/typing.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing 'TextChunk' model.""" - -from collections.abc import Callable, Iterable -from dataclasses import dataclass - -from graphrag.config.models.chunking_config import ChunkingConfig -from graphrag.logger.progress import ProgressTicker - - -@dataclass -class TextChunk: - """Text chunk class definition.""" - - text_chunk: str - source_doc_indices: list[int] - n_tokens: int | None = None - - -ChunkInput = str | list[str] | list[tuple[str, str]] -"""Input to a chunking strategy. Can be a string, a list of strings, or a list of tuples of (id, text).""" - -ChunkStrategy = Callable[ - [list[str], ChunkingConfig, ProgressTicker], Iterable[TextChunk] -] diff --git a/graphrag/index/operations/embed_graph/__init__.py b/graphrag/index/operations/embed_graph/__init__.py deleted file mode 100644 index 3c3e4b1ca4..0000000000 --- a/graphrag/index/operations/embed_graph/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""The Indexing Engine graph embed package root.""" diff --git a/graphrag/index/operations/embed_graph/embed_graph.py b/graphrag/index/operations/embed_graph/embed_graph.py deleted file mode 100644 index 0328402db2..0000000000 --- a/graphrag/index/operations/embed_graph/embed_graph.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing embed_graph and run_embeddings methods definition.""" - -import networkx as nx - -from graphrag.config.models.embed_graph_config import EmbedGraphConfig -from graphrag.index.operations.embed_graph.embed_node2vec import embed_node2vec -from graphrag.index.operations.embed_graph.typing import ( - NodeEmbeddings, -) -from graphrag.index.utils.stable_lcc import stable_largest_connected_component - - -def embed_graph( - graph: nx.Graph, - config: EmbedGraphConfig, -) -> NodeEmbeddings: - """ - Embed a graph into a vector space using node2vec. The graph is expected to be in nx.Graph format. The operation outputs a mapping between node name and vector. - - ## Usage - ```yaml - dimensions: 1536 # Optional, The number of dimensions to use for the embedding, default: 1536 - num_walks: 10 # Optional, The number of walks to use for the embedding, default: 10 - walk_length: 40 # Optional, The walk length to use for the embedding, default: 40 - window_size: 2 # Optional, The window size to use for the embedding, default: 2 - iterations: 3 # Optional, The number of iterations to use for the embedding, default: 3 - random_seed: 86 # Optional, The random seed to use for the embedding, default: 86 - ``` - """ - if config.use_lcc: - graph = stable_largest_connected_component(graph) - - # create graph embedding using node2vec - embeddings = embed_node2vec( - graph=graph, - dimensions=config.dimensions, - num_walks=config.num_walks, - walk_length=config.walk_length, - window_size=config.window_size, - iterations=config.iterations, - random_seed=config.random_seed, - ) - - pairs = zip(embeddings.nodes, embeddings.embeddings.tolist(), strict=True) - sorted_pairs = sorted(pairs, key=lambda x: x[0]) - - return dict(sorted_pairs) diff --git a/graphrag/index/operations/embed_graph/embed_node2vec.py b/graphrag/index/operations/embed_graph/embed_node2vec.py deleted file mode 100644 index a009c670f6..0000000000 --- a/graphrag/index/operations/embed_graph/embed_node2vec.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Utilities to generate graph embeddings.""" - -from dataclasses import dataclass - -import networkx as nx -import numpy as np - - -@dataclass -class NodeEmbeddings: - """Node embeddings class definition.""" - - nodes: list[str] - embeddings: np.ndarray - - -def embed_node2vec( - graph: nx.Graph | nx.DiGraph, - dimensions: int = 1536, - num_walks: int = 10, - walk_length: int = 40, - window_size: int = 2, - iterations: int = 3, - random_seed: int = 86, -) -> NodeEmbeddings: - """Generate node embeddings using Node2Vec.""" - # NOTE: This import is done here to reduce the initial import time of the graphrag package - import graspologic as gc - - # generate embedding - lcc_tensors = gc.embed.node2vec_embed( # type: ignore - graph=graph, - dimensions=dimensions, - window_size=window_size, - iterations=iterations, - num_walks=num_walks, - walk_length=walk_length, - random_seed=random_seed, - ) - return NodeEmbeddings(embeddings=lcc_tensors[0], nodes=lcc_tensors[1]) diff --git a/graphrag/index/operations/embed_graph/typing.py b/graphrag/index/operations/embed_graph/typing.py deleted file mode 100644 index fea792c9b1..0000000000 --- a/graphrag/index/operations/embed_graph/typing.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing different lists and dictionaries.""" - -# Use this for now instead of a wrapper -from typing import Any - -NodeList = list[str] -EmbeddingList = list[Any] -NodeEmbeddings = dict[str, list[float]] -"""Label -> Embedding""" diff --git a/graphrag/index/operations/embed_text/embed_text.py b/graphrag/index/operations/embed_text/embed_text.py deleted file mode 100644 index 8e6cbbcbdb..0000000000 --- a/graphrag/index/operations/embed_text/embed_text.py +++ /dev/null @@ -1,246 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing embed_text, load_strategy and create_row_from_embedding_data methods definition.""" - -import logging -from enum import Enum -from typing import Any - -import numpy as np -import pandas as pd - -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.config.embeddings import create_index_name -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.index.operations.embed_text.strategies.typing import TextEmbeddingStrategy -from graphrag.vector_stores.base import BaseVectorStore, VectorStoreDocument -from graphrag.vector_stores.factory import VectorStoreFactory - -logger = logging.getLogger(__name__) - -# Per Azure OpenAI Limits -# https://learn.microsoft.com/en-us/azure/ai-services/openai/reference -DEFAULT_EMBEDDING_BATCH_SIZE = 500 - - -class TextEmbedStrategyType(str, Enum): - """TextEmbedStrategyType class definition.""" - - openai = "openai" - mock = "mock" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' - - -async def embed_text( - input: pd.DataFrame, - callbacks: WorkflowCallbacks, - cache: PipelineCache, - embed_column: str, - strategy: dict, - embedding_name: str, - id_column: str = "id", - title_column: str | None = None, -): - """Embed a piece of text into a vector space. The operation outputs a new column containing a mapping between doc_id and vector.""" - vector_store_config = strategy.get("vector_store") - - if vector_store_config: - index_name = _get_index_name(vector_store_config, embedding_name) - vector_store: BaseVectorStore = _create_vector_store( - vector_store_config, index_name, embedding_name - ) - vector_store_workflow_config = vector_store_config.get( - embedding_name, vector_store_config - ) - return await _text_embed_with_vector_store( - input=input, - callbacks=callbacks, - cache=cache, - embed_column=embed_column, - strategy=strategy, - vector_store=vector_store, - vector_store_config=vector_store_workflow_config, - id_column=id_column, - title_column=title_column, - ) - - return await _text_embed_in_memory( - input=input, - callbacks=callbacks, - cache=cache, - embed_column=embed_column, - strategy=strategy, - ) - - -async def _text_embed_in_memory( - input: pd.DataFrame, - callbacks: WorkflowCallbacks, - cache: PipelineCache, - embed_column: str, - strategy: dict, -): - strategy_type = strategy["type"] - strategy_exec = load_strategy(strategy_type) - strategy_config = {**strategy} - - texts: list[str] = input[embed_column].to_numpy().tolist() - result = await strategy_exec(texts, callbacks, cache, strategy_config) - - return result.embeddings - - -async def _text_embed_with_vector_store( - input: pd.DataFrame, - callbacks: WorkflowCallbacks, - cache: PipelineCache, - embed_column: str, - strategy: dict[str, Any], - vector_store: BaseVectorStore, - vector_store_config: dict, - id_column: str = "id", - title_column: str | None = None, -): - strategy_type = strategy["type"] - strategy_exec = load_strategy(strategy_type) - strategy_config = {**strategy} - - # Get vector-storage configuration - insert_batch_size: int = ( - vector_store_config.get("batch_size") or DEFAULT_EMBEDDING_BATCH_SIZE - ) - - overwrite: bool = vector_store_config.get("overwrite", True) - - if embed_column not in input.columns: - msg = f"Column {embed_column} not found in input dataframe with columns {input.columns}" - raise ValueError(msg) - title = title_column or embed_column - if title not in input.columns: - msg = ( - f"Column {title} not found in input dataframe with columns {input.columns}" - ) - raise ValueError(msg) - if id_column not in input.columns: - msg = f"Column {id_column} not found in input dataframe with columns {input.columns}" - raise ValueError(msg) - - total_rows = 0 - for row in input[embed_column]: - if isinstance(row, list): - total_rows += len(row) - else: - total_rows += 1 - - i = 0 - starting_index = 0 - - all_results = [] - - num_total_batches = (input.shape[0] + insert_batch_size - 1) // insert_batch_size - while insert_batch_size * i < input.shape[0]: - logger.info( - "uploading text embeddings batch %d/%d of size %d to vector store", - i + 1, - num_total_batches, - insert_batch_size, - ) - batch = input.iloc[insert_batch_size * i : insert_batch_size * (i + 1)] - texts: list[str] = batch[embed_column].to_numpy().tolist() - titles: list[str] = batch[title].to_numpy().tolist() - ids: list[str] = batch[id_column].to_numpy().tolist() - result = await strategy_exec(texts, callbacks, cache, strategy_config) - if result.embeddings: - embeddings = [ - embedding for embedding in result.embeddings if embedding is not None - ] - all_results.extend(embeddings) - - vectors = result.embeddings or [] - documents: list[VectorStoreDocument] = [] - for doc_id, doc_text, doc_title, doc_vector in zip( - ids, texts, titles, vectors, strict=True - ): - if type(doc_vector) is np.ndarray: - doc_vector = doc_vector.tolist() - document = VectorStoreDocument( - id=doc_id, - text=doc_text, - vector=doc_vector, - attributes={"title": doc_title}, - ) - documents.append(document) - - vector_store.load_documents(documents, overwrite and i == 0) - starting_index += len(documents) - i += 1 - - return all_results - - -def _create_vector_store( - vector_store_config: dict, index_name: str, embedding_name: str | None = None -) -> BaseVectorStore: - vector_store_type: str = str(vector_store_config.get("type")) - - embeddings_schema: dict[str, VectorStoreSchemaConfig] = vector_store_config.get( - "embeddings_schema", {} - ) - single_embedding_config: VectorStoreSchemaConfig = VectorStoreSchemaConfig() - - if ( - embeddings_schema is not None - and embedding_name is not None - and embedding_name in embeddings_schema - ): - raw_config = embeddings_schema[embedding_name] - if isinstance(raw_config, dict): - single_embedding_config = VectorStoreSchemaConfig(**raw_config) - else: - single_embedding_config = raw_config - - if single_embedding_config.index_name is None: - single_embedding_config.index_name = index_name - - vector_store = VectorStoreFactory().create_vector_store( - vector_store_schema_config=single_embedding_config, - vector_store_type=vector_store_type, - **vector_store_config, - ) - - vector_store.connect(**vector_store_config) - return vector_store - - -def _get_index_name(vector_store_config: dict, embedding_name: str) -> str: - container_name = vector_store_config.get("container_name", "default") - index_name = create_index_name(container_name, embedding_name) - - msg = f"using vector store {vector_store_config.get('type')} with container_name {container_name} for embedding {embedding_name}: {index_name}" - logger.info(msg) - return index_name - - -def load_strategy(strategy: TextEmbedStrategyType) -> TextEmbeddingStrategy: - """Load strategy method definition.""" - match strategy: - case TextEmbedStrategyType.openai: - from graphrag.index.operations.embed_text.strategies.openai import ( - run as run_openai, - ) - - return run_openai - case TextEmbedStrategyType.mock: - from graphrag.index.operations.embed_text.strategies.mock import ( - run as run_mock, - ) - - return run_mock - case _: - msg = f"Unknown strategy: {strategy}" - raise ValueError(msg) diff --git a/graphrag/index/operations/embed_text/strategies/__init__.py b/graphrag/index/operations/embed_text/strategies/__init__.py deleted file mode 100644 index 8cbe7a580e..0000000000 --- a/graphrag/index/operations/embed_text/strategies/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""The Indexing Engine embed strategies package root.""" diff --git a/graphrag/index/operations/embed_text/strategies/mock.py b/graphrag/index/operations/embed_text/strategies/mock.py deleted file mode 100644 index a65ad9721f..0000000000 --- a/graphrag/index/operations/embed_text/strategies/mock.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing run and _embed_text methods definitions.""" - -import random -from collections.abc import Iterable -from typing import Any - -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.index.operations.embed_text.strategies.typing import TextEmbeddingResult -from graphrag.logger.progress import ProgressTicker, progress_ticker - - -async def run( # noqa RUF029 async is required for interface - input: list[str], - callbacks: WorkflowCallbacks, - cache: PipelineCache, - _args: dict[str, Any], -) -> TextEmbeddingResult: - """Run the Claim extraction chain.""" - input = input if isinstance(input, Iterable) else [input] - ticker = progress_ticker( - callbacks.progress, len(input), description="generate embeddings progress: " - ) - return TextEmbeddingResult( - embeddings=[_embed_text(cache, text, ticker) for text in input] - ) - - -def _embed_text(_cache: PipelineCache, _text: str, tick: ProgressTicker) -> list[float]: - """Embed a single piece of text.""" - tick(1) - return [random.random(), random.random(), random.random()] # noqa S311 diff --git a/graphrag/index/operations/embed_text/strategies/typing.py b/graphrag/index/operations/embed_text/strategies/typing.py deleted file mode 100644 index f45a7eb36e..0000000000 --- a/graphrag/index/operations/embed_text/strategies/typing.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing 'TextEmbeddingResult' model.""" - -from collections.abc import Awaitable, Callable -from dataclasses import dataclass - -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks - - -@dataclass -class TextEmbeddingResult: - """Text embedding result class definition.""" - - embeddings: list[list[float] | None] | None - - -TextEmbeddingStrategy = Callable[ - [ - list[str], - WorkflowCallbacks, - PipelineCache, - dict, - ], - Awaitable[TextEmbeddingResult], -] diff --git a/graphrag/index/operations/extract_covariates/claim_extractor.py b/graphrag/index/operations/extract_covariates/claim_extractor.py deleted file mode 100644 index e50d05ce83..0000000000 --- a/graphrag/index/operations/extract_covariates/claim_extractor.py +++ /dev/null @@ -1,236 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing 'ClaimExtractorResult' and 'ClaimExtractor' models.""" - -import logging -import traceback -from dataclasses import dataclass -from typing import Any - -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.index.typing.error_handler import ErrorHandlerFn -from graphrag.language_model.protocol.base import ChatModel -from graphrag.prompts.index.extract_claims import ( - CONTINUE_PROMPT, - EXTRACT_CLAIMS_PROMPT, - LOOP_PROMPT, -) - -DEFAULT_TUPLE_DELIMITER = "<|>" -DEFAULT_RECORD_DELIMITER = "##" -DEFAULT_COMPLETION_DELIMITER = "<|COMPLETE|>" -logger = logging.getLogger(__name__) - - -@dataclass -class ClaimExtractorResult: - """Claim extractor result class definition.""" - - output: list[dict] - source_docs: dict[str, Any] - - -class ClaimExtractor: - """Claim extractor class definition.""" - - _model: ChatModel - _extraction_prompt: str - _summary_prompt: str - _output_formatter_prompt: str - _input_text_key: str - _input_entity_spec_key: str - _input_claim_description_key: str - _tuple_delimiter_key: str - _record_delimiter_key: str - _completion_delimiter_key: str - _max_gleanings: int - _on_error: ErrorHandlerFn - - def __init__( - self, - model_invoker: ChatModel, - extraction_prompt: str | None = None, - input_text_key: str | None = None, - input_entity_spec_key: str | None = None, - input_claim_description_key: str | None = None, - input_resolved_entities_key: str | None = None, - tuple_delimiter_key: str | None = None, - record_delimiter_key: str | None = None, - completion_delimiter_key: str | None = None, - max_gleanings: int | None = None, - on_error: ErrorHandlerFn | None = None, - ): - """Init method definition.""" - self._model = model_invoker - self._extraction_prompt = extraction_prompt or EXTRACT_CLAIMS_PROMPT - self._input_text_key = input_text_key or "input_text" - self._input_entity_spec_key = input_entity_spec_key or "entity_specs" - self._tuple_delimiter_key = tuple_delimiter_key or "tuple_delimiter" - self._record_delimiter_key = record_delimiter_key or "record_delimiter" - self._completion_delimiter_key = ( - completion_delimiter_key or "completion_delimiter" - ) - self._input_claim_description_key = ( - input_claim_description_key or "claim_description" - ) - self._input_resolved_entities_key = ( - input_resolved_entities_key or "resolved_entities" - ) - self._max_gleanings = ( - max_gleanings - if max_gleanings is not None - else graphrag_config_defaults.extract_claims.max_gleanings - ) - self._on_error = on_error or (lambda _e, _s, _d: None) - - async def __call__( - self, inputs: dict[str, Any], prompt_variables: dict | None = None - ) -> ClaimExtractorResult: - """Call method definition.""" - if prompt_variables is None: - prompt_variables = {} - texts = inputs[self._input_text_key] - entity_spec = str(inputs[self._input_entity_spec_key]) - claim_description = inputs[self._input_claim_description_key] - resolved_entities = inputs.get(self._input_resolved_entities_key, {}) - source_doc_map = {} - - prompt_args = { - self._input_entity_spec_key: entity_spec, - self._input_claim_description_key: claim_description, - self._tuple_delimiter_key: prompt_variables.get(self._tuple_delimiter_key) - or DEFAULT_TUPLE_DELIMITER, - self._record_delimiter_key: prompt_variables.get(self._record_delimiter_key) - or DEFAULT_RECORD_DELIMITER, - self._completion_delimiter_key: prompt_variables.get( - self._completion_delimiter_key - ) - or DEFAULT_COMPLETION_DELIMITER, - } - - all_claims: list[dict] = [] - for doc_index, text in enumerate(texts): - document_id = f"d{doc_index}" - try: - claims = await self._process_document(prompt_args, text, doc_index) - all_claims += [ - self._clean_claim(c, document_id, resolved_entities) for c in claims - ] - source_doc_map[document_id] = text - except Exception as e: - logger.exception("error extracting claim") - self._on_error( - e, - traceback.format_exc(), - {"doc_index": doc_index, "text": text}, - ) - continue - - return ClaimExtractorResult( - output=all_claims, - source_docs=source_doc_map, - ) - - def _clean_claim( - self, claim: dict, document_id: str, resolved_entities: dict - ) -> dict: - # clean the parsed claims to remove any claims with status = False - obj = claim.get("object_id", claim.get("object")) - subject = claim.get("subject_id", claim.get("subject")) - - # If subject or object in resolved entities, then replace with resolved entity - obj = resolved_entities.get(obj, obj) - subject = resolved_entities.get(subject, subject) - claim["object_id"] = obj - claim["subject_id"] = subject - return claim - - async def _process_document( - self, prompt_args: dict, doc, doc_index: int - ) -> list[dict]: - record_delimiter = prompt_args.get( - self._record_delimiter_key, DEFAULT_RECORD_DELIMITER - ) - completion_delimiter = prompt_args.get( - self._completion_delimiter_key, DEFAULT_COMPLETION_DELIMITER - ) - - response = await self._model.achat( - self._extraction_prompt.format(**{ - self._input_text_key: doc, - **prompt_args, - }) - ) - results = response.output.content or "" - claims = results.strip().removesuffix(completion_delimiter) - - # if gleanings are specified, enter a loop to extract more claims - # there are two exit criteria: (a) we hit the configured max, (b) the model says there are no more claims - if self._max_gleanings > 0: - for i in range(self._max_gleanings): - response = await self._model.achat( - CONTINUE_PROMPT, - name=f"extract-continuation-{i}", - history=response.history, - ) - extension = response.output.content or "" - claims += record_delimiter + extension.strip().removesuffix( - completion_delimiter - ) - - # If this isn't the last loop, check to see if we should continue - if i >= self._max_gleanings - 1: - break - - response = await self._model.achat( - LOOP_PROMPT, - name=f"extract-loopcheck-{i}", - history=response.history, - ) - - if response.output.content != "Y": - break - - return self._parse_claim_tuples(results, prompt_args) - - def _parse_claim_tuples( - self, claims: str, prompt_variables: dict - ) -> list[dict[str, Any]]: - """Parse claim tuples.""" - record_delimiter = prompt_variables.get( - self._record_delimiter_key, DEFAULT_RECORD_DELIMITER - ) - completion_delimiter = prompt_variables.get( - self._completion_delimiter_key, DEFAULT_COMPLETION_DELIMITER - ) - tuple_delimiter = prompt_variables.get( - self._tuple_delimiter_key, DEFAULT_TUPLE_DELIMITER - ) - - def pull_field(index: int, fields: list[str]) -> str | None: - return fields[index].strip() if len(fields) > index else None - - result: list[dict[str, Any]] = [] - claims_values = ( - claims.strip().removesuffix(completion_delimiter).split(record_delimiter) - ) - for claim in claims_values: - claim = claim.strip().removeprefix("(").removesuffix(")") - - # Ignore the completion delimiter - if claim == completion_delimiter: - continue - - claim_fields = claim.split(tuple_delimiter) - result.append({ - "subject_id": pull_field(0, claim_fields), - "object_id": pull_field(1, claim_fields), - "type": pull_field(2, claim_fields), - "status": pull_field(3, claim_fields), - "start_date": pull_field(4, claim_fields), - "end_date": pull_field(5, claim_fields), - "description": pull_field(6, claim_fields), - "source_text": pull_field(7, claim_fields), - }) - return result diff --git a/graphrag/index/operations/extract_graph/graph_extractor.py b/graphrag/index/operations/extract_graph/graph_extractor.py deleted file mode 100644 index d1f66c3e81..0000000000 --- a/graphrag/index/operations/extract_graph/graph_extractor.py +++ /dev/null @@ -1,300 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing 'GraphExtractionResult' and 'GraphExtractor' models.""" - -import logging -import re -import traceback -from collections.abc import Mapping -from dataclasses import dataclass -from typing import Any - -import networkx as nx - -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.index.typing.error_handler import ErrorHandlerFn -from graphrag.index.utils.string import clean_str -from graphrag.language_model.protocol.base import ChatModel -from graphrag.prompts.index.extract_graph import ( - CONTINUE_PROMPT, - GRAPH_EXTRACTION_PROMPT, - LOOP_PROMPT, -) - -DEFAULT_TUPLE_DELIMITER = "<|>" -DEFAULT_RECORD_DELIMITER = "##" -DEFAULT_COMPLETION_DELIMITER = "<|COMPLETE|>" -DEFAULT_ENTITY_TYPES = ["organization", "person", "geo", "event"] - -logger = logging.getLogger(__name__) - - -@dataclass -class GraphExtractionResult: - """Unipartite graph extraction result class definition.""" - - output: nx.Graph - source_docs: dict[Any, Any] - - -class GraphExtractor: - """Unipartite graph extractor class definition.""" - - _model: ChatModel - _join_descriptions: bool - _tuple_delimiter_key: str - _record_delimiter_key: str - _entity_types_key: str - _input_text_key: str - _completion_delimiter_key: str - _entity_name_key: str - _input_descriptions_key: str - _extraction_prompt: str - _summarization_prompt: str - _max_gleanings: int - _on_error: ErrorHandlerFn - - def __init__( - self, - model_invoker: ChatModel, - tuple_delimiter_key: str | None = None, - record_delimiter_key: str | None = None, - input_text_key: str | None = None, - entity_types_key: str | None = None, - completion_delimiter_key: str | None = None, - prompt: str | None = None, - join_descriptions=True, - max_gleanings: int | None = None, - on_error: ErrorHandlerFn | None = None, - ): - """Init method definition.""" - # TODO: streamline construction - self._model = model_invoker - self._join_descriptions = join_descriptions - self._input_text_key = input_text_key or "input_text" - self._tuple_delimiter_key = tuple_delimiter_key or "tuple_delimiter" - self._record_delimiter_key = record_delimiter_key or "record_delimiter" - self._completion_delimiter_key = ( - completion_delimiter_key or "completion_delimiter" - ) - self._entity_types_key = entity_types_key or "entity_types" - self._extraction_prompt = prompt or GRAPH_EXTRACTION_PROMPT - self._max_gleanings = ( - max_gleanings - if max_gleanings is not None - else graphrag_config_defaults.extract_graph.max_gleanings - ) - self._on_error = on_error or (lambda _e, _s, _d: None) - - async def __call__( - self, texts: list[str], prompt_variables: dict[str, Any] | None = None - ) -> GraphExtractionResult: - """Call method definition.""" - if prompt_variables is None: - prompt_variables = {} - all_records: dict[int, str] = {} - source_doc_map: dict[int, str] = {} - - # Wire defaults into the prompt variables - prompt_variables = { - **prompt_variables, - self._tuple_delimiter_key: prompt_variables.get(self._tuple_delimiter_key) - or DEFAULT_TUPLE_DELIMITER, - self._record_delimiter_key: prompt_variables.get(self._record_delimiter_key) - or DEFAULT_RECORD_DELIMITER, - self._completion_delimiter_key: prompt_variables.get( - self._completion_delimiter_key - ) - or DEFAULT_COMPLETION_DELIMITER, - self._entity_types_key: ",".join( - prompt_variables[self._entity_types_key] or DEFAULT_ENTITY_TYPES - ), - } - - for doc_index, text in enumerate(texts): - try: - # Invoke the entity extraction - result = await self._process_document(text, prompt_variables) - source_doc_map[doc_index] = text - all_records[doc_index] = result - except Exception as e: - logger.exception("error extracting graph") - self._on_error( - e, - traceback.format_exc(), - { - "doc_index": doc_index, - "text": text, - }, - ) - - output = await self._process_results( - all_records, - prompt_variables.get(self._tuple_delimiter_key, DEFAULT_TUPLE_DELIMITER), - prompt_variables.get(self._record_delimiter_key, DEFAULT_RECORD_DELIMITER), - ) - - return GraphExtractionResult( - output=output, - source_docs=source_doc_map, - ) - - async def _process_document( - self, text: str, prompt_variables: dict[str, str] - ) -> str: - response = await self._model.achat( - self._extraction_prompt.format(**{ - **prompt_variables, - self._input_text_key: text, - }), - ) - results = response.output.content or "" - - # if gleanings are specified, enter a loop to extract more entities - # there are two exit criteria: (a) we hit the configured max, (b) the model says there are no more entities - if self._max_gleanings > 0: - for i in range(self._max_gleanings): - response = await self._model.achat( - CONTINUE_PROMPT, - name=f"extract-continuation-{i}", - history=response.history, - ) - results += response.output.content or "" - - # if this is the final glean, don't bother updating the continuation flag - if i >= self._max_gleanings - 1: - break - - response = await self._model.achat( - LOOP_PROMPT, - name=f"extract-loopcheck-{i}", - history=response.history, - ) - if response.output.content != "Y": - break - - return results - - async def _process_results( - self, - results: dict[int, str], - tuple_delimiter: str, - record_delimiter: str, - ) -> nx.Graph: - """Parse the result string to create an undirected unipartite graph. - - Args: - - results - dict of results from the extraction chain - - tuple_delimiter - delimiter between tuples in an output record, default is '<|>' - - record_delimiter - delimiter between records, default is '##' - Returns: - - output - unipartite graph in graphML format - """ - graph = nx.Graph() - for source_doc_id, extracted_data in results.items(): - records = [r.strip() for r in extracted_data.split(record_delimiter)] - - for record in records: - record = re.sub(r"^\(|\)$", "", record.strip()) - record_attributes = record.split(tuple_delimiter) - - if record_attributes[0] == '"entity"' and len(record_attributes) >= 4: - # add this record as a node in the G - entity_name = clean_str(record_attributes[1].upper()) - entity_type = clean_str(record_attributes[2].upper()) - entity_description = clean_str(record_attributes[3]) - - if entity_name in graph.nodes(): - node = graph.nodes[entity_name] - if self._join_descriptions: - node["description"] = "\n".join( - list({ - *_unpack_descriptions(node), - entity_description, - }) - ) - else: - if len(entity_description) > len(node["description"]): - node["description"] = entity_description - node["source_id"] = ", ".join( - list({ - *_unpack_source_ids(node), - str(source_doc_id), - }) - ) - node["type"] = ( - entity_type if entity_type != "" else node["type"] - ) - else: - graph.add_node( - entity_name, - type=entity_type, - description=entity_description, - source_id=str(source_doc_id), - ) - - if ( - record_attributes[0] == '"relationship"' - and len(record_attributes) >= 5 - ): - # add this record as edge - source = clean_str(record_attributes[1].upper()) - target = clean_str(record_attributes[2].upper()) - edge_description = clean_str(record_attributes[3]) - edge_source_id = clean_str(str(source_doc_id)) - try: - weight = float(record_attributes[-1]) - except ValueError: - weight = 1.0 - - if source not in graph.nodes(): - graph.add_node( - source, - type="", - description="", - source_id=edge_source_id, - ) - if target not in graph.nodes(): - graph.add_node( - target, - type="", - description="", - source_id=edge_source_id, - ) - if graph.has_edge(source, target): - edge_data = graph.get_edge_data(source, target) - if edge_data is not None: - weight += edge_data["weight"] - if self._join_descriptions: - edge_description = "\n".join( - list({ - *_unpack_descriptions(edge_data), - edge_description, - }) - ) - edge_source_id = ", ".join( - list({ - *_unpack_source_ids(edge_data), - str(source_doc_id), - }) - ) - graph.add_edge( - source, - target, - weight=weight, - description=edge_description, - source_id=edge_source_id, - ) - - return graph - - -def _unpack_descriptions(data: Mapping) -> list[str]: - value = data.get("description", None) - return [] if value is None else value.split("\n") - - -def _unpack_source_ids(data: Mapping) -> list[str]: - value = data.get("source_id", None) - return [] if value is None else value.split(", ") diff --git a/graphrag/index/operations/extract_graph/graph_intelligence_strategy.py b/graphrag/index/operations/extract_graph/graph_intelligence_strategy.py deleted file mode 100644 index b335d191a6..0000000000 --- a/graphrag/index/operations/extract_graph/graph_intelligence_strategy.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing run_graph_intelligence, run_extract_graph and _create_text_splitter methods to run graph intelligence.""" - -import logging - -import networkx as nx - -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.models.language_model_config import LanguageModelConfig -from graphrag.index.operations.extract_graph.graph_extractor import GraphExtractor -from graphrag.index.operations.extract_graph.typing import ( - Document, - EntityExtractionResult, - EntityTypes, - StrategyConfig, -) -from graphrag.language_model.manager import ModelManager -from graphrag.language_model.protocol.base import ChatModel - -logger = logging.getLogger(__name__) - - -async def run_graph_intelligence( - docs: list[Document], - entity_types: EntityTypes, - cache: PipelineCache, - args: StrategyConfig, -) -> EntityExtractionResult: - """Run the graph intelligence entity extraction strategy.""" - llm_config = LanguageModelConfig(**args["llm"]) - - llm = ModelManager().get_or_create_chat_model( - name="extract_graph", - model_type=llm_config.type, - config=llm_config, - cache=cache, - ) - - return await run_extract_graph(llm, docs, entity_types, args) - - -async def run_extract_graph( - model: ChatModel, - docs: list[Document], - entity_types: EntityTypes, - args: StrategyConfig, -) -> EntityExtractionResult: - """Run the entity extraction chain.""" - tuple_delimiter = args.get("tuple_delimiter", None) - record_delimiter = args.get("record_delimiter", None) - completion_delimiter = args.get("completion_delimiter", None) - extraction_prompt = args.get("extraction_prompt", None) - max_gleanings = args.get( - "max_gleanings", graphrag_config_defaults.extract_graph.max_gleanings - ) - - extractor = GraphExtractor( - model_invoker=model, - prompt=extraction_prompt, - max_gleanings=max_gleanings, - on_error=lambda e, s, d: logger.error( - "Entity Extraction Error", exc_info=e, extra={"stack": s, "details": d} - ), - ) - text_list = [doc.text.strip() for doc in docs] - - results = await extractor( - list(text_list), - { - "entity_types": entity_types, - "tuple_delimiter": tuple_delimiter, - "record_delimiter": record_delimiter, - "completion_delimiter": completion_delimiter, - }, - ) - - graph = results.output - # Map the "source_id" back to the "id" field - for _, node in graph.nodes(data=True): # type: ignore - if node is not None: - node["source_id"] = ",".join( - docs[int(id)].id for id in node["source_id"].split(",") - ) - - for _, _, edge in graph.edges(data=True): # type: ignore - if edge is not None: - edge["source_id"] = ",".join( - docs[int(id)].id for id in edge["source_id"].split(",") - ) - - entities = [ - ({"title": item[0], **(item[1] or {})}) - for item in graph.nodes(data=True) - if item is not None - ] - - relationships = nx.to_pandas_edgelist(graph) - - return EntityExtractionResult(entities, relationships, graph) diff --git a/graphrag/index/operations/extract_graph/typing.py b/graphrag/index/operations/extract_graph/typing.py deleted file mode 100644 index 3c7c134753..0000000000 --- a/graphrag/index/operations/extract_graph/typing.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing 'Document' and 'EntityExtractionResult' models.""" - -from collections.abc import Awaitable, Callable -from dataclasses import dataclass -from enum import Enum -from typing import Any - -import networkx as nx - -from graphrag.cache.pipeline_cache import PipelineCache - -ExtractedEntity = dict[str, Any] -ExtractedRelationship = dict[str, Any] -StrategyConfig = dict[str, Any] -EntityTypes = list[str] - - -@dataclass -class Document: - """Document class definition.""" - - text: str - id: str - - -@dataclass -class EntityExtractionResult: - """Entity extraction result class definition.""" - - entities: list[ExtractedEntity] - relationships: list[ExtractedRelationship] - graph: nx.Graph | None - - -EntityExtractStrategy = Callable[ - [ - list[Document], - EntityTypes, - PipelineCache, - StrategyConfig, - ], - Awaitable[EntityExtractionResult], -] - - -class ExtractEntityStrategyType(str, Enum): - """ExtractEntityStrategyType class definition.""" - - graph_intelligence = "graph_intelligence" - nltk = "nltk" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' diff --git a/graphrag/index/operations/layout_graph/__init__.py b/graphrag/index/operations/layout_graph/__init__.py deleted file mode 100644 index cc80f99a97..0000000000 --- a/graphrag/index/operations/layout_graph/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""The Indexing Engine graph layout package root.""" diff --git a/graphrag/index/operations/layout_graph/layout_graph.py b/graphrag/index/operations/layout_graph/layout_graph.py deleted file mode 100644 index 433ffc8a10..0000000000 --- a/graphrag/index/operations/layout_graph/layout_graph.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing layout_graph, _run_layout and _apply_layout_to_graph methods definition.""" - -import logging - -import networkx as nx -import pandas as pd - -from graphrag.index.operations.embed_graph.typing import NodeEmbeddings -from graphrag.index.operations.layout_graph.typing import GraphLayout - -logger = logging.getLogger(__name__) - - -def layout_graph( - graph: nx.Graph, - enabled: bool, - embeddings: NodeEmbeddings | None, -): - """ - Apply a layout algorithm to a nx.Graph. The method returns a dataframe containing the node positions. - - ## Usage - ```yaml - args: - graph: The nx.Graph to layout - embeddings: Embeddings for each node in the graph - strategy: # See strategies section below - ``` - - ## Strategies - The layout graph verb uses a strategy to layout the graph. The strategy is a json object which defines the strategy to use. The following strategies are available: - - ### umap - This strategy uses the umap algorithm to layout a graph. The strategy config is as follows: - ```yaml - strategy: - type: umap - n_neighbors: 5 # Optional, The number of neighbors to use for the umap algorithm, default: 5 - min_dist: 0.75 # Optional, The min distance to use for the umap algorithm, default: 0.75 - ``` - """ - layout = _run_layout( - graph, - enabled, - embeddings if embeddings is not None else {}, - ) - - layout_df = pd.DataFrame(layout) - return layout_df.loc[ - :, - ["label", "x", "y", "size"], - ] - - -def _run_layout( - graph: nx.Graph, - enabled: bool, - embeddings: NodeEmbeddings, -) -> GraphLayout: - if enabled: - from graphrag.index.operations.layout_graph.umap import ( - run as run_umap, - ) - - return run_umap( - graph, - embeddings, - lambda e, stack, d: logger.error( - "Error in Umap", exc_info=e, extra={"stack": stack, "details": d} - ), - ) - from graphrag.index.operations.layout_graph.zero import ( - run as run_zero, - ) - - return run_zero( - graph, - lambda e, stack, d: logger.error( - "Error in Zero", exc_info=e, extra={"stack": stack, "details": d} - ), - ) diff --git a/graphrag/index/operations/layout_graph/typing.py b/graphrag/index/operations/layout_graph/typing.py deleted file mode 100644 index ae46afa928..0000000000 --- a/graphrag/index/operations/layout_graph/typing.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -# Use this for now instead of a wrapper -"""A module containing 'NodePosition' model.""" - -from dataclasses import dataclass - - -@dataclass -class NodePosition: - """Node position class definition.""" - - label: str - cluster: str - size: float - - x: float - y: float - z: float | None = None - - def to_pandas(self) -> tuple[str, float, float, str, float]: - """To pandas method definition.""" - return self.label, self.x, self.y, self.cluster, self.size - - -GraphLayout = list[NodePosition] diff --git a/graphrag/index/operations/layout_graph/umap.py b/graphrag/index/operations/layout_graph/umap.py deleted file mode 100644 index 6550188030..0000000000 --- a/graphrag/index/operations/layout_graph/umap.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing run and _create_node_position methods definitions.""" - -import logging -import traceback - -import networkx as nx -import numpy as np - -from graphrag.index.operations.embed_graph.typing import NodeEmbeddings -from graphrag.index.operations.layout_graph.typing import ( - GraphLayout, - NodePosition, -) -from graphrag.index.typing.error_handler import ErrorHandlerFn - -# TODO: This could be handled more elegantly, like what columns to use -# for "size" or "cluster" -# We could also have a boolean to indicate to use node sizes or clusters - -logger = logging.getLogger(__name__) - - -def run( - graph: nx.Graph, - embeddings: NodeEmbeddings, - on_error: ErrorHandlerFn, -) -> GraphLayout: - """Run method definition.""" - node_clusters = [] - node_sizes = [] - - embeddings = _filter_raw_embeddings(embeddings) - nodes = list(embeddings.keys()) - embedding_vectors = [embeddings[node_id] for node_id in nodes] - - for node_id in nodes: - node = graph.nodes[node_id] - cluster = node.get("cluster", node.get("community", -1)) - node_clusters.append(cluster) - size = node.get("degree", node.get("size", 0)) - node_sizes.append(size) - - additional_args = {} - if len(node_clusters) > 0: - additional_args["node_categories"] = node_clusters - if len(node_sizes) > 0: - additional_args["node_sizes"] = node_sizes - - try: - return compute_umap_positions( - embedding_vectors=np.array(embedding_vectors), - node_labels=nodes, - **additional_args, - ) - except Exception as e: - logger.exception("Error running UMAP") - on_error(e, traceback.format_exc(), None) - # Umap may fail due to input sparseness or memory pressure. - # For now, in these cases, we'll just return a layout with all nodes at (0, 0) - result = [] - for i in range(len(nodes)): - cluster = node_clusters[i] if len(node_clusters) > 0 else 1 - result.append( - NodePosition(x=0, y=0, label=nodes[i], size=0, cluster=str(cluster)) - ) - return result - - -def _filter_raw_embeddings(embeddings: NodeEmbeddings) -> NodeEmbeddings: - return { - node_id: embedding - for node_id, embedding in embeddings.items() - if embedding is not None - } - - -def compute_umap_positions( - embedding_vectors: np.ndarray, - node_labels: list[str], - node_categories: list[int] | None = None, - node_sizes: list[int] | None = None, - min_dist: float = 0.75, - n_neighbors: int = 5, - spread: int = 1, - metric: str = "euclidean", - n_components: int = 2, - random_state: int = 86, -) -> list[NodePosition]: - """Project embedding vectors down to 2D/3D using UMAP.""" - # NOTE: This import is done here to reduce the initial import time of the graphrag package - import umap - - embedding_positions = umap.UMAP( - min_dist=min_dist, - n_neighbors=n_neighbors, - spread=spread, - n_components=n_components, - metric=metric, - random_state=random_state, - ).fit_transform(embedding_vectors) - - embedding_position_data: list[NodePosition] = [] - for index, node_name in enumerate(node_labels): - node_points = embedding_positions[index] # type: ignore - node_category = 1 if node_categories is None else node_categories[index] - node_size = 1 if node_sizes is None else node_sizes[index] - - if len(node_points) == 2: - embedding_position_data.append( - NodePosition( - label=str(node_name), - x=float(node_points[0]), - y=float(node_points[1]), - cluster=str(int(node_category)), - size=int(node_size), - ) - ) - else: - embedding_position_data.append( - NodePosition( - label=str(node_name), - x=float(node_points[0]), - y=float(node_points[1]), - z=float(node_points[2]), - cluster=str(int(node_category)), - size=int(node_size), - ) - ) - return embedding_position_data diff --git a/graphrag/index/operations/layout_graph/zero.py b/graphrag/index/operations/layout_graph/zero.py deleted file mode 100644 index 934df0030f..0000000000 --- a/graphrag/index/operations/layout_graph/zero.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing run and _create_node_position methods definitions.""" - -import logging -import traceback - -import networkx as nx - -from graphrag.index.operations.layout_graph.typing import ( - GraphLayout, - NodePosition, -) -from graphrag.index.typing.error_handler import ErrorHandlerFn - -# TODO: This could be handled more elegantly, like what columns to use -# for "size" or "cluster" -# We could also have a boolean to indicate to use node sizes or clusters - -logger = logging.getLogger(__name__) - - -def run( - graph: nx.Graph, - on_error: ErrorHandlerFn, -) -> GraphLayout: - """Run method definition.""" - node_clusters = [] - node_sizes = [] - - nodes = list(graph.nodes) - - for node_id in nodes: - node = graph.nodes[node_id] - cluster = node.get("cluster", node.get("community", -1)) - node_clusters.append(cluster) - size = node.get("degree", node.get("size", 0)) - node_sizes.append(size) - - additional_args = {} - if len(node_clusters) > 0: - additional_args["node_categories"] = node_clusters - if len(node_sizes) > 0: - additional_args["node_sizes"] = node_sizes - - try: - return get_zero_positions(node_labels=nodes, **additional_args) - except Exception as e: - logger.exception("Error running zero-position") - on_error(e, traceback.format_exc(), None) - # Umap may fail due to input sparseness or memory pressure. - # For now, in these cases, we'll just return a layout with all nodes at (0, 0) - result = [] - for i in range(len(nodes)): - cluster = node_clusters[i] if len(node_clusters) > 0 else 1 - result.append( - NodePosition(x=0, y=0, label=nodes[i], size=0, cluster=str(cluster)) - ) - return result - - -def get_zero_positions( - node_labels: list[str], - node_categories: list[int] | None = None, - node_sizes: list[int] | None = None, - three_d: bool | None = False, -) -> list[NodePosition]: - """Project embedding vectors down to 2D/3D using UMAP.""" - embedding_position_data: list[NodePosition] = [] - for index, node_name in enumerate(node_labels): - node_category = 1 if node_categories is None else node_categories[index] - node_size = 1 if node_sizes is None else node_sizes[index] - - if not three_d: - embedding_position_data.append( - NodePosition( - label=str(node_name), - x=0, - y=0, - cluster=str(int(node_category)), - size=int(node_size), - ) - ) - else: - embedding_position_data.append( - NodePosition( - label=str(node_name), - x=0, - y=0, - z=0, - cluster=str(int(node_category)), - size=int(node_size), - ) - ) - return embedding_position_data diff --git a/graphrag/index/operations/summarize_communities/strategies.py b/graphrag/index/operations/summarize_communities/strategies.py deleted file mode 100644 index 06ce44b27d..0000000000 --- a/graphrag/index/operations/summarize_communities/strategies.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing run, _run_extractor and _load_nodes_edges_for_claim_chain methods definition.""" - -import logging - -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.config.models.language_model_config import LanguageModelConfig -from graphrag.index.operations.summarize_communities.community_reports_extractor import ( - CommunityReportsExtractor, -) -from graphrag.index.operations.summarize_communities.typing import ( - CommunityReport, - Finding, - StrategyConfig, -) -from graphrag.language_model.manager import ModelManager -from graphrag.language_model.protocol.base import ChatModel - -logger = logging.getLogger(__name__) - - -async def run_graph_intelligence( - community: str | int, - input: str, - level: int, - callbacks: WorkflowCallbacks, - cache: PipelineCache, - args: StrategyConfig, -) -> CommunityReport | None: - """Run the graph intelligence entity extraction strategy.""" - llm_config = LanguageModelConfig(**args["llm"]) - llm = ModelManager().get_or_create_chat_model( - name="community_reporting", - model_type=llm_config.type, - config=llm_config, - callbacks=callbacks, - cache=cache, - ) - - return await _run_extractor(llm, community, input, level, args) - - -async def _run_extractor( - model: ChatModel, - community: str | int, - input: str, - level: int, - args: StrategyConfig, -) -> CommunityReport | None: - extractor = CommunityReportsExtractor( - model, - extraction_prompt=args.get("extraction_prompt", None), - max_report_length=args.get("max_report_length", None), - on_error=lambda e, stack, _data: logger.error( - "Community Report Extraction Error", exc_info=e, extra={"stack": stack} - ), - ) - - try: - results = await extractor(input) - report = results.structured_output - if report is None: - logger.warning("No report found for community: %s", community) - return None - - return CommunityReport( - community=community, - full_content=results.output, - level=level, - rank=report.rating, - title=report.title, - rating_explanation=report.rating_explanation, - summary=report.summary, - findings=[ - Finding(explanation=f.explanation, summary=f.summary) - for f in report.findings - ], - full_content_json=report.model_dump_json(indent=4), - ) - except Exception: - logger.exception("Error processing community: %s", community) - return None diff --git a/graphrag/index/operations/summarize_descriptions/graph_intelligence_strategy.py b/graphrag/index/operations/summarize_descriptions/graph_intelligence_strategy.py deleted file mode 100644 index d3259b290f..0000000000 --- a/graphrag/index/operations/summarize_descriptions/graph_intelligence_strategy.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing run_graph_intelligence, run_resolve_entities and _create_text_list_splitter methods to run graph intelligence.""" - -import logging - -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.config.models.language_model_config import LanguageModelConfig -from graphrag.index.operations.summarize_descriptions.description_summary_extractor import ( - SummarizeExtractor, -) -from graphrag.index.operations.summarize_descriptions.typing import ( - StrategyConfig, - SummarizedDescriptionResult, -) -from graphrag.language_model.manager import ModelManager -from graphrag.language_model.protocol.base import ChatModel - -logger = logging.getLogger(__name__) - - -async def run_graph_intelligence( - id: str | tuple[str, str], - descriptions: list[str], - cache: PipelineCache, - args: StrategyConfig, -) -> SummarizedDescriptionResult: - """Run the graph intelligence entity extraction strategy.""" - llm_config = LanguageModelConfig(**args["llm"]) - llm = ModelManager().get_or_create_chat_model( - name="summarize_descriptions", - model_type=llm_config.type, - config=llm_config, - cache=cache, - ) - - return await run_summarize_descriptions(llm, id, descriptions, args) - - -async def run_summarize_descriptions( - model: ChatModel, - id: str | tuple[str, str], - descriptions: list[str], - args: StrategyConfig, -) -> SummarizedDescriptionResult: - """Run the entity extraction chain.""" - # Extraction Arguments - summarize_prompt = args.get("summarize_prompt", None) - max_input_tokens = args["max_input_tokens"] - max_summary_length = args["max_summary_length"] - extractor = SummarizeExtractor( - model_invoker=model, - summarization_prompt=summarize_prompt, - on_error=lambda e, stack, details: logger.error( - "Entity Extraction Error", - exc_info=e, - extra={"stack": stack, "details": details}, - ), - max_summary_length=max_summary_length, - max_input_tokens=max_input_tokens, - ) - - result = await extractor(id=id, descriptions=descriptions) - return SummarizedDescriptionResult(id=result.id, description=result.description) diff --git a/graphrag/index/operations/summarize_descriptions/typing.py b/graphrag/index/operations/summarize_descriptions/typing.py deleted file mode 100644 index 55b079090d..0000000000 --- a/graphrag/index/operations/summarize_descriptions/typing.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing 'SummarizedDescriptionResult' model.""" - -from collections.abc import Awaitable, Callable -from dataclasses import dataclass -from enum import Enum -from typing import Any, NamedTuple - -from graphrag.cache.pipeline_cache import PipelineCache - -StrategyConfig = dict[str, Any] - - -@dataclass -class SummarizedDescriptionResult: - """Entity summarization result class definition.""" - - id: str | tuple[str, str] - description: str - - -SummarizationStrategy = Callable[ - [ - str | tuple[str, str], - list[str], - PipelineCache, - StrategyConfig, - ], - Awaitable[SummarizedDescriptionResult], -] - - -class DescriptionSummarizeRow(NamedTuple): - """DescriptionSummarizeRow class definition.""" - - graph: Any - - -class SummarizeStrategyType(str, Enum): - """SummarizeStrategyType class definition.""" - - graph_intelligence = "graph_intelligence" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' diff --git a/graphrag/index/text_splitting/check_token_limit.py b/graphrag/index/text_splitting/check_token_limit.py deleted file mode 100644 index 7b6a139e02..0000000000 --- a/graphrag/index/text_splitting/check_token_limit.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Token limit method definition.""" - -from graphrag.index.text_splitting.text_splitting import TokenTextSplitter - - -def check_token_limit(text, max_token): - """Check token limit.""" - text_splitter = TokenTextSplitter(chunk_size=max_token, chunk_overlap=0) - docs = text_splitter.split_text(text) - if len(docs) > 1: - return 0 - return 1 diff --git a/graphrag/index/text_splitting/text_splitting.py b/graphrag/index/text_splitting/text_splitting.py deleted file mode 100644 index f1f0785e99..0000000000 --- a/graphrag/index/text_splitting/text_splitting.py +++ /dev/null @@ -1,173 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing the 'Tokenizer', 'TextSplitter', 'NoopTextSplitter' and 'TokenTextSplitter' models.""" - -import logging -from abc import ABC, abstractmethod -from collections.abc import Callable, Iterable -from dataclasses import dataclass -from typing import Any, cast - -import pandas as pd - -from graphrag.index.operations.chunk_text.typing import TextChunk -from graphrag.logger.progress import ProgressTicker -from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer - -EncodedText = list[int] -DecodeFn = Callable[[EncodedText], str] -EncodeFn = Callable[[str], EncodedText] -LengthFn = Callable[[str], int] - -logger = logging.getLogger(__name__) - - -@dataclass(frozen=True) -class TokenChunkerOptions: - """TokenChunkerOptions data class.""" - - chunk_overlap: int - """Overlap in tokens between chunks""" - tokens_per_chunk: int - """Maximum number of tokens per chunk""" - decode: DecodeFn - """ Function to decode a list of token ids to a string""" - encode: EncodeFn - """ Function to encode a string to a list of token ids""" - - -class TextSplitter(ABC): - """Text splitter class definition.""" - - _chunk_size: int - _chunk_overlap: int - _length_function: LengthFn - _keep_separator: bool - _add_start_index: bool - _strip_whitespace: bool - - def __init__( - self, - # based on text-ada-002-embedding max input buffer length - # https://platform.openai.com/docs/guides/embeddings/second-generation-models - chunk_size: int = 8191, - chunk_overlap: int = 100, - length_function: LengthFn = len, - keep_separator: bool = False, - add_start_index: bool = False, - strip_whitespace: bool = True, - ): - """Init method definition.""" - self._chunk_size = chunk_size - self._chunk_overlap = chunk_overlap - self._length_function = length_function - self._keep_separator = keep_separator - self._add_start_index = add_start_index - self._strip_whitespace = strip_whitespace - - @abstractmethod - def split_text(self, text: str | list[str]) -> Iterable[str]: - """Split text method definition.""" - - -class NoopTextSplitter(TextSplitter): - """Noop text splitter class definition.""" - - def split_text(self, text: str | list[str]) -> Iterable[str]: - """Split text method definition.""" - return [text] if isinstance(text, str) else text - - -class TokenTextSplitter(TextSplitter): - """Token text splitter class definition.""" - - def __init__( - self, - tokenizer: Tokenizer | None = None, - **kwargs: Any, - ): - """Init method definition.""" - super().__init__(**kwargs) - self._tokenizer = tokenizer or get_tokenizer() - - def num_tokens(self, text: str) -> int: - """Return the number of tokens in a string.""" - return self._tokenizer.num_tokens(text) - - def split_text(self, text: str | list[str]) -> list[str]: - """Split text method.""" - if isinstance(text, list): - text = " ".join(text) - elif cast("bool", pd.isna(text)) or text == "": - return [] - if not isinstance(text, str): - msg = f"Attempting to split a non-string value, actual is {type(text)}" - raise TypeError(msg) - - token_chunker_options = TokenChunkerOptions( - chunk_overlap=self._chunk_overlap, - tokens_per_chunk=self._chunk_size, - decode=self._tokenizer.decode, - encode=self._tokenizer.encode, - ) - - return split_single_text_on_tokens(text=text, tokenizer=token_chunker_options) - - -def split_single_text_on_tokens(text: str, tokenizer: TokenChunkerOptions) -> list[str]: - """Split a single text and return chunks using the tokenizer.""" - result = [] - input_ids = tokenizer.encode(text) - - start_idx = 0 - cur_idx = min(start_idx + tokenizer.tokens_per_chunk, len(input_ids)) - chunk_ids = input_ids[start_idx:cur_idx] - - while start_idx < len(input_ids): - chunk_text = tokenizer.decode(list(chunk_ids)) - result.append(chunk_text) # Append chunked text as string - if cur_idx == len(input_ids): - break - start_idx += tokenizer.tokens_per_chunk - tokenizer.chunk_overlap - cur_idx = min(start_idx + tokenizer.tokens_per_chunk, len(input_ids)) - chunk_ids = input_ids[start_idx:cur_idx] - - return result - - -# Adapted from - https://github.com/langchain-ai/langchain/blob/77b359edf5df0d37ef0d539f678cf64f5557cb54/libs/langchain/langchain/text_splitter.py#L471 -# So we could have better control over the chunking process -def split_multiple_texts_on_tokens( - texts: list[str], tokenizer: TokenChunkerOptions, tick: ProgressTicker -) -> list[TextChunk]: - """Split multiple texts and return chunks with metadata using the tokenizer.""" - result = [] - mapped_ids = [] - - for source_doc_idx, text in enumerate(texts): - encoded = tokenizer.encode(text) - if tick: - tick(1) # Track progress if tick callback is provided - mapped_ids.append((source_doc_idx, encoded)) - - input_ids = [ - (source_doc_idx, id) for source_doc_idx, ids in mapped_ids for id in ids - ] - - start_idx = 0 - cur_idx = min(start_idx + tokenizer.tokens_per_chunk, len(input_ids)) - chunk_ids = input_ids[start_idx:cur_idx] - - while start_idx < len(input_ids): - chunk_text = tokenizer.decode([id for _, id in chunk_ids]) - doc_indices = list({doc_idx for doc_idx, _ in chunk_ids}) - result.append(TextChunk(chunk_text, doc_indices, len(chunk_ids))) - if cur_idx == len(input_ids): - break - start_idx += tokenizer.tokens_per_chunk - tokenizer.chunk_overlap - cur_idx = min(start_idx + tokenizer.tokens_per_chunk, len(input_ids)) - chunk_ids = input_ids[start_idx:cur_idx] - - return result diff --git a/graphrag/index/validate_config.py b/graphrag/index/validate_config.py deleted file mode 100644 index 2ba4ec1efe..0000000000 --- a/graphrag/index/validate_config.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing validate_config_names definition.""" - -import asyncio -import logging -import sys - -from graphrag.callbacks.noop_workflow_callbacks import NoopWorkflowCallbacks -from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.language_model.manager import ModelManager - -logger = logging.getLogger(__name__) - - -def validate_config_names(parameters: GraphRagConfig) -> None: - """Validate config file for model deployment name typos, by running a quick test message for each.""" - for id, config in parameters.models.items(): - if config.type in ["chat", "azure_openai", "openai"]: - llm = ModelManager().register_chat( - name="test-llm", - model_type=config.type, - config=config, - callbacks=NoopWorkflowCallbacks(), - cache=None, - ) - try: - asyncio.run( - llm.achat("This is an LLM connectivity test. Say Hello World") - ) - logger.info("LLM Config Params Validated") - except Exception as e: # noqa: BLE001 - logger.error(f"LLM configuration error detected.\n{e}") # noqa - print(f"Failed to validate language model ({id}) params", e) # noqa: T201 - sys.exit(1) - elif config.type in ["embedding", "azure_openai_embedding", "openai_embedding"]: - embed_llm = ModelManager().register_embedding( - name="test-embed-llm", - model_type=config.type, - config=config, - callbacks=NoopWorkflowCallbacks(), - cache=None, - ) - try: - asyncio.run( - embed_llm.aembed_batch(["This is an LLM Embedding Test String"]) - ) - logger.info("Embedding LLM Config Params Validated") - except Exception as e: # noqa: BLE001 - logger.error(f"Embedding configuration error detected.\n{e}") # noqa - print(f"Failed to validate embedding model ({id}) params", e) # noqa: T201 - sys.exit(1) diff --git a/graphrag/index/workflows/create_base_text_units.py b/graphrag/index/workflows/create_base_text_units.py deleted file mode 100644 index d94ee5951f..0000000000 --- a/graphrag/index/workflows/create_base_text_units.py +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing run_workflow method definition.""" - -import json -import logging -from typing import Any, cast - -import pandas as pd - -from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.config.models.chunking_config import ChunkStrategyType -from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.index.operations.chunk_text.chunk_text import chunk_text -from graphrag.index.operations.chunk_text.strategies import get_encoding_fn -from graphrag.index.typing.context import PipelineRunContext -from graphrag.index.typing.workflow import WorkflowFunctionOutput -from graphrag.index.utils.hashing import gen_sha512_hash -from graphrag.utils.storage import load_table_from_storage, write_table_to_storage - -logger = logging.getLogger(__name__) - - -async def run_workflow( - config: GraphRagConfig, - context: PipelineRunContext, -) -> WorkflowFunctionOutput: - """All the steps to transform base text_units.""" - logger.info("Workflow started: create_base_text_units") - documents = await load_table_from_storage("documents", context.output_storage) - - chunks = config.chunks - - output = create_base_text_units( - documents, - context.callbacks, - chunks.group_by_columns, - chunks.size, - chunks.overlap, - chunks.encoding_model, - strategy=chunks.strategy, - prepend_metadata=chunks.prepend_metadata, - chunk_size_includes_metadata=chunks.chunk_size_includes_metadata, - ) - - await write_table_to_storage(output, "text_units", context.output_storage) - - logger.info("Workflow completed: create_base_text_units") - return WorkflowFunctionOutput(result=output) - - -def create_base_text_units( - documents: pd.DataFrame, - callbacks: WorkflowCallbacks, - group_by_columns: list[str], - size: int, - overlap: int, - encoding_model: str, - strategy: ChunkStrategyType, - prepend_metadata: bool = False, - chunk_size_includes_metadata: bool = False, -) -> pd.DataFrame: - """All the steps to transform base text_units.""" - sort = documents.sort_values(by=["id"], ascending=[True]) - - sort["text_with_ids"] = list( - zip(*[sort[col] for col in ["id", "text"]], strict=True) - ) - - agg_dict = {"text_with_ids": list} - if "metadata" in documents: - agg_dict["metadata"] = "first" # type: ignore - - aggregated = ( - ( - sort.groupby(group_by_columns, sort=False) - if len(group_by_columns) > 0 - else sort.groupby(lambda _x: True) - ) - .agg(agg_dict) - .reset_index() - ) - aggregated.rename(columns={"text_with_ids": "texts"}, inplace=True) - - def chunker(row: pd.Series) -> Any: - line_delimiter = ".\n" - metadata_str = "" - metadata_tokens = 0 - - if prepend_metadata and "metadata" in row: - metadata = row["metadata"] - if isinstance(metadata, str): - metadata = json.loads(metadata) - if isinstance(metadata, dict): - metadata_str = ( - line_delimiter.join(f"{k}: {v}" for k, v in metadata.items()) - + line_delimiter - ) - - if chunk_size_includes_metadata: - encode, _ = get_encoding_fn(encoding_model) - metadata_tokens = len(encode(metadata_str)) - if metadata_tokens >= size: - message = "Metadata tokens exceeds the maximum tokens per chunk. Please increase the tokens per chunk." - raise ValueError(message) - - chunked = chunk_text( - pd.DataFrame([row]).reset_index(drop=True), - column="texts", - size=size - metadata_tokens, - overlap=overlap, - encoding_model=encoding_model, - strategy=strategy, - callbacks=callbacks, - )[0] - - if prepend_metadata: - for index, chunk in enumerate(chunked): - if isinstance(chunk, str): - chunked[index] = metadata_str + chunk - else: - chunked[index] = ( - (chunk[0], metadata_str + chunk[1], chunk[2]) if chunk else None - ) - - row["chunks"] = chunked - return row - - # Track progress of row-wise apply operation - total_rows = len(aggregated) - logger.info("Starting chunking process for %d documents", total_rows) - - def chunker_with_logging(row: pd.Series, row_index: int) -> Any: - """Add logging to chunker execution.""" - result = chunker(row) - logger.info("chunker progress: %d/%d", row_index + 1, total_rows) - return result - - aggregated = aggregated.apply( - lambda row: chunker_with_logging(row, row.name), axis=1 - ) - - aggregated = cast("pd.DataFrame", aggregated[[*group_by_columns, "chunks"]]) - aggregated = aggregated.explode("chunks") - aggregated.rename( - columns={ - "chunks": "chunk", - }, - inplace=True, - ) - aggregated["id"] = aggregated.apply( - lambda row: gen_sha512_hash(row, ["chunk"]), axis=1 - ) - aggregated[["document_ids", "chunk", "n_tokens"]] = pd.DataFrame( - aggregated["chunk"].tolist(), index=aggregated.index - ) - # rename for downstream consumption - aggregated.rename(columns={"chunk": "text"}, inplace=True) - - return cast( - "pd.DataFrame", aggregated[aggregated["text"].notna()].reset_index(drop=True) - ) diff --git a/graphrag/language_model/__init__.py b/graphrag/language_model/__init__.py deleted file mode 100644 index 1c84bfd23a..0000000000 --- a/graphrag/language_model/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""GraphRAG Language Models module. Allows for provider registrations while providing some out-of-the-box solutions.""" diff --git a/graphrag/language_model/cache/__init__.py b/graphrag/language_model/cache/__init__.py deleted file mode 100644 index 41cca7905f..0000000000 --- a/graphrag/language_model/cache/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Cache provider definitions for Language Models.""" diff --git a/graphrag/language_model/cache/base.py b/graphrag/language_model/cache/base.py deleted file mode 100644 index 554d02c8c5..0000000000 --- a/graphrag/language_model/cache/base.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Base cache protocol definition.""" - -from typing import Any, Protocol - - -class ModelCache(Protocol): - """Base cache protocol.""" - - async def has(self, key: str) -> bool: - """Check if the cache has a value.""" - ... - - async def get(self, key: str) -> Any | None: - """Retrieve a value from the cache.""" - ... - - async def set( - self, key: str, value: Any, metadata: dict[str, Any] | None = None - ) -> None: - """Write a value into the cache.""" - ... - - async def remove(self, key: str) -> None: - """Remove a value from the cache.""" - ... - - async def clear(self) -> None: - """Clear the cache.""" - ... - - def child(self, key: str) -> Any: - """Create a child cache.""" - ... diff --git a/graphrag/language_model/events/__init__.py b/graphrag/language_model/events/__init__.py deleted file mode 100644 index c6abec322f..0000000000 --- a/graphrag/language_model/events/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Model Event handler modules.""" diff --git a/graphrag/language_model/events/base.py b/graphrag/language_model/events/base.py deleted file mode 100644 index 940da3f1ff..0000000000 --- a/graphrag/language_model/events/base.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Base model events protocol.""" - -from typing import Any, Protocol - - -class ModelEventHandler(Protocol): - """Protocol for Model event handling.""" - - async def on_error( - self, - error: BaseException | None, - traceback: str | None = None, - arguments: dict[str, Any] | None = None, - ) -> None: - """Handle an model error.""" - ... diff --git a/graphrag/language_model/factory.py b/graphrag/language_model/factory.py deleted file mode 100644 index 92bee9dde8..0000000000 --- a/graphrag/language_model/factory.py +++ /dev/null @@ -1,123 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""A package containing a factory for supported llm types.""" - -from collections.abc import Callable -from typing import Any, ClassVar - -from graphrag.config.enums import ModelType -from graphrag.language_model.protocol.base import ChatModel, EmbeddingModel -from graphrag.language_model.providers.fnllm.models import ( - AzureOpenAIChatFNLLM, - AzureOpenAIEmbeddingFNLLM, - OpenAIChatFNLLM, - OpenAIEmbeddingFNLLM, -) -from graphrag.language_model.providers.litellm.chat_model import LitellmChatModel -from graphrag.language_model.providers.litellm.embedding_model import ( - LitellmEmbeddingModel, -) - - -class ModelFactory: - """A factory for creating Model instances.""" - - _chat_registry: ClassVar[dict[str, Callable[..., ChatModel]]] = {} - _embedding_registry: ClassVar[dict[str, Callable[..., EmbeddingModel]]] = {} - - @classmethod - def register_chat(cls, model_type: str, creator: Callable[..., ChatModel]) -> None: - """Register a ChatModel implementation.""" - cls._chat_registry[model_type] = creator - - @classmethod - def register_embedding( - cls, model_type: str, creator: Callable[..., EmbeddingModel] - ) -> None: - """Register an EmbeddingModel implementation.""" - cls._embedding_registry[model_type] = creator - - @classmethod - def create_chat_model(cls, model_type: str, **kwargs: Any) -> ChatModel: - """ - Create a ChatModel instance. - - Args: - model_type: The type of ChatModel to create. - **kwargs: Additional keyword arguments for the ChatModel constructor. - - Returns - ------- - A ChatModel instance. - """ - if model_type not in cls._chat_registry: - msg = f"ChatMOdel implementation '{model_type}' is not registered." - raise ValueError(msg) - return cls._chat_registry[model_type](**kwargs) - - @classmethod - def create_embedding_model(cls, model_type: str, **kwargs: Any) -> EmbeddingModel: - """ - Create an EmbeddingModel instance. - - Args: - model_type: The type of EmbeddingModel to create. - **kwargs: Additional keyword arguments for the EmbeddingLLM constructor. - - Returns - ------- - An EmbeddingLLM instance. - """ - if model_type not in cls._embedding_registry: - msg = f"EmbeddingModel implementation '{model_type}' is not registered." - raise ValueError(msg) - return cls._embedding_registry[model_type](**kwargs) - - @classmethod - def get_chat_models(cls) -> list[str]: - """Get the registered ChatModel implementations.""" - return list(cls._chat_registry.keys()) - - @classmethod - def get_embedding_models(cls) -> list[str]: - """Get the registered EmbeddingModel implementations.""" - return list(cls._embedding_registry.keys()) - - @classmethod - def is_supported_chat_model(cls, model_type: str) -> bool: - """Check if the given model type is supported.""" - return model_type in cls._chat_registry - - @classmethod - def is_supported_embedding_model(cls, model_type: str) -> bool: - """Check if the given model type is supported.""" - return model_type in cls._embedding_registry - - @classmethod - def is_supported_model(cls, model_type: str) -> bool: - """Check if the given model type is supported.""" - return cls.is_supported_chat_model( - model_type - ) or cls.is_supported_embedding_model(model_type) - - -# --- Register default implementations --- -ModelFactory.register_chat( - ModelType.AzureOpenAIChat.value, lambda **kwargs: AzureOpenAIChatFNLLM(**kwargs) -) -ModelFactory.register_chat( - ModelType.OpenAIChat.value, lambda **kwargs: OpenAIChatFNLLM(**kwargs) -) -ModelFactory.register_chat(ModelType.Chat, lambda **kwargs: LitellmChatModel(**kwargs)) - -ModelFactory.register_embedding( - ModelType.AzureOpenAIEmbedding.value, - lambda **kwargs: AzureOpenAIEmbeddingFNLLM(**kwargs), -) -ModelFactory.register_embedding( - ModelType.OpenAIEmbedding.value, lambda **kwargs: OpenAIEmbeddingFNLLM(**kwargs) -) -ModelFactory.register_embedding( - ModelType.Embedding, lambda **kwargs: LitellmEmbeddingModel(**kwargs) -) diff --git a/graphrag/language_model/manager.py b/graphrag/language_model/manager.py deleted file mode 100644 index bc41235dda..0000000000 --- a/graphrag/language_model/manager.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Singleton LLM Manager for ChatLLM and EmbeddingsLLM instances. - -This manager lets you register chat and embeddings LLMs independently. -It leverages the LLMFactory for instantiation. -""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, ClassVar - -from typing_extensions import Self - -from graphrag.language_model.factory import ModelFactory - -if TYPE_CHECKING: - from graphrag.language_model.protocol.base import ChatModel, EmbeddingModel - - -class ModelManager: - """Singleton manager for LLM instances.""" - - _instance: ClassVar[ModelManager | None] = None - - def __new__(cls) -> Self: - """Create a new instance of LLMManager if it does not exist.""" - if cls._instance is None: - cls._instance = super().__new__(cls) - return cls._instance # type: ignore[return-value] - - def __init__(self) -> None: - # Avoid reinitialization in the singleton. - if not hasattr(self, "_initialized"): - self.chat_models: dict[str, ChatModel] = {} - self.embedding_models: dict[str, EmbeddingModel] = {} - self._initialized = True - - @classmethod - def get_instance(cls) -> ModelManager: - """Return the singleton instance of LLMManager.""" - return cls.__new__(cls) - - def register_chat( - self, name: str, model_type: str, **chat_kwargs: Any - ) -> ChatModel: - """ - Register a ChatLLM instance under a unique name. - - Args: - name: Unique identifier for the ChatLLM instance. - model_type: Key for the ChatLLM implementation in LLMFactory. - **chat_kwargs: Additional parameters for instantiation. - """ - chat_kwargs["name"] = name - self.chat_models[name] = ModelFactory.create_chat_model( - model_type, **chat_kwargs - ) - return self.chat_models[name] - - def register_embedding( - self, name: str, model_type: str, **embedding_kwargs: Any - ) -> EmbeddingModel: - """ - Register an EmbeddingsLLM instance under a unique name. - - Args: - name: Unique identifier for the EmbeddingsLLM instance. - embedding_key: Key for the EmbeddingsLLM implementation in LLMFactory. - **embedding_kwargs: Additional parameters for instantiation. - """ - embedding_kwargs["name"] = name - self.embedding_models[name] = ModelFactory.create_embedding_model( - model_type, **embedding_kwargs - ) - return self.embedding_models[name] - - def get_chat_model(self, name: str) -> ChatModel | None: - """ - Retrieve the ChatLLM instance registered under the given name. - - Raises - ------ - ValueError: If no ChatLLM is registered under the name. - """ - if name not in self.chat_models: - msg = f"No ChatLLM registered under the name '{name}'." - raise ValueError(msg) - return self.chat_models[name] - - def get_embedding_model(self, name: str) -> EmbeddingModel | None: - """ - Retrieve the EmbeddingsLLM instance registered under the given name. - - Raises - ------ - ValueError: If no EmbeddingsLLM is registered under the name. - """ - if name not in self.embedding_models: - msg = f"No EmbeddingsLLM registered under the name '{name}'." - raise ValueError(msg) - return self.embedding_models[name] - - def get_or_create_chat_model( - self, name: str, model_type: str, **chat_kwargs: Any - ) -> ChatModel: - """ - Retrieve the ChatLLM instance registered under the given name. - - If the ChatLLM does not exist, it is created and registered. - - Args: - name: Unique identifier for the ChatLLM instance. - model_type: Key for the ChatModel implementation in LLMFactory. - **chat_kwargs: Additional parameters for instantiation. - """ - if name not in self.chat_models: - return self.register_chat(name, model_type, **chat_kwargs) - return self.chat_models[name] - - def get_or_create_embedding_model( - self, name: str, model_type: str, **embedding_kwargs: Any - ) -> EmbeddingModel: - """ - Retrieve the EmbeddingsLLM instance registered under the given name. - - If the EmbeddingsLLM does not exist, it is created and registered. - - Args: - name: Unique identifier for the EmbeddingsLLM instance. - model_type: Key for the EmbeddingsLLM implementation in LLMFactory. - **embedding_kwargs: Additional parameters for instantiation. - """ - if name not in self.embedding_models: - return self.register_embedding(name, model_type, **embedding_kwargs) - return self.embedding_models[name] - - def remove_chat(self, name: str) -> None: - """Remove the ChatLLM instance registered under the given name.""" - self.chat_models.pop(name, None) - - def remove_embedding(self, name: str) -> None: - """Remove the EmbeddingsLLM instance registered under the given name.""" - self.embedding_models.pop(name, None) - - def list_chat_models(self) -> dict[str, ChatModel]: - """Return a copy of all registered ChatLLM instances.""" - return dict(self.chat_models) - - def list_embedding_models(self) -> dict[str, EmbeddingModel]: - """Return a copy of all registered EmbeddingsLLM instances.""" - return dict(self.embedding_models) diff --git a/graphrag/language_model/protocol/__init__.py b/graphrag/language_model/protocol/__init__.py deleted file mode 100644 index 12432bd1f5..0000000000 --- a/graphrag/language_model/protocol/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Base protocol definitions for LLMs.""" diff --git a/graphrag/language_model/protocol/base.py b/graphrag/language_model/protocol/base.py deleted file mode 100644 index 74cd38746e..0000000000 --- a/graphrag/language_model/protocol/base.py +++ /dev/null @@ -1,166 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Base llm protocol definitions.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, Any, Protocol - -if TYPE_CHECKING: - from collections.abc import AsyncGenerator, Generator - - from graphrag.config.models.language_model_config import LanguageModelConfig - from graphrag.language_model.response.base import ModelResponse - - -class EmbeddingModel(Protocol): - """ - Protocol for an embedding-based Language Model (LM). - - This protocol defines the methods required for an embedding-based LM. - """ - - config: LanguageModelConfig - """Passthrough of the config used to create the model instance.""" - - async def aembed_batch( - self, text_list: list[str], **kwargs: Any - ) -> list[list[float]]: - """ - Generate an embedding vector for the given list of strings. - - Args: - text: The text to generate an embedding for. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A collections of list of floats representing the embedding vector for each item in the batch. - """ - ... - - async def aembed(self, text: str, **kwargs: Any) -> list[float]: - """ - Generate an embedding vector for the given text. - - Args: - text: The text to generate an embedding for. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A list of floats representing the embedding vector. - """ - ... - - def embed_batch(self, text_list: list[str], **kwargs: Any) -> list[list[float]]: - """ - Generate an embedding vector for the given list of strings. - - Args: - text: The text to generate an embedding for. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A collections of list of floats representing the embedding vector for each item in the batch. - """ - ... - - def embed(self, text: str, **kwargs: Any) -> list[float]: - """ - Generate an embedding vector for the given text. - - Args: - text: The text to generate an embedding for. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A list of floats representing the embedding vector. - """ - ... - - -class ChatModel(Protocol): - """ - Protocol for a chat-based Language Model (LM). - - This protocol defines the methods required for a chat-based LM. - Prompt is always required for the chat method, and any other keyword arguments are forwarded to the Model provider. - """ - - config: LanguageModelConfig - """Passthrough of the config used to create the model instance.""" - - async def achat( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> ModelResponse: - """ - Generate a response for the given text. - - Args: - prompt: The text to generate a response for. - history: The conversation history. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A string representing the response. - - """ - ... - - async def achat_stream( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> AsyncGenerator[str, None]: - """ - Generate a response for the given text using a streaming interface. - - Args: - prompt: The text to generate a response for. - history: The conversation history. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A generator that yields strings representing the response. - """ - yield "" # Yield an empty string so that the function is recognized as a generator - ... - - def chat( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> ModelResponse: - """ - Generate a response for the given text. - - Args: - prompt: The text to generate a response for. - history: The conversation history. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A string representing the response. - - """ - ... - - def chat_stream( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> Generator[str, None]: - """ - Generate a response for the given text using a streaming interface. - - Args: - prompt: The text to generate a response for. - history: The conversation history. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A generator that yields strings representing the response. - """ - ... diff --git a/graphrag/language_model/providers/__init__.py b/graphrag/language_model/providers/__init__.py deleted file mode 100644 index d635f898ba..0000000000 --- a/graphrag/language_model/providers/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Model Providers module.""" diff --git a/graphrag/language_model/providers/fnllm/cache.py b/graphrag/language_model/providers/fnllm/cache.py deleted file mode 100644 index 4554f1d158..0000000000 --- a/graphrag/language_model/providers/fnllm/cache.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""FNLLM Cache provider.""" - -from typing import Any - -from fnllm.caching import Cache as FNLLMCache - -from graphrag.cache.pipeline_cache import PipelineCache - - -class FNLLMCacheProvider(FNLLMCache): - """A cache for the pipeline.""" - - def __init__(self, cache: PipelineCache): - self._cache = cache - - async def has(self, key: str) -> bool: - """Check if the cache has a value.""" - return await self._cache.has(key) - - async def get(self, key: str) -> Any | None: - """Retrieve a value from the cache.""" - return await self._cache.get(key) - - async def set( - self, key: str, value: Any, metadata: dict[str, Any] | None = None - ) -> None: - """Write a value into the cache.""" - await self._cache.set(key, value, metadata) - - async def remove(self, key: str) -> None: - """Remove a value from the cache.""" - await self._cache.delete(key) - - async def clear(self) -> None: - """Clear the cache.""" - await self._cache.clear() - - def child(self, key: str) -> "FNLLMCacheProvider": - """Create a child cache.""" - child_cache = self._cache.child(key) - return FNLLMCacheProvider(child_cache) diff --git a/graphrag/language_model/providers/fnllm/events.py b/graphrag/language_model/providers/fnllm/events.py deleted file mode 100644 index e6f75eafe8..0000000000 --- a/graphrag/language_model/providers/fnllm/events.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""FNLLM llm events provider.""" - -from typing import Any - -from fnllm.events import LLMEvents - -from graphrag.index.typing.error_handler import ErrorHandlerFn - - -class FNLLMEvents(LLMEvents): - """FNLLM events handler that calls the error handler.""" - - def __init__(self, on_error: ErrorHandlerFn): - self._on_error = on_error - - async def on_error( - self, - error: BaseException | None, - traceback: str | None = None, - arguments: dict[str, Any] | None = None, - ) -> None: - """Handle an fnllm error.""" - self._on_error(error, traceback, arguments) diff --git a/graphrag/language_model/providers/fnllm/models.py b/graphrag/language_model/providers/fnllm/models.py deleted file mode 100644 index 059b0412ca..0000000000 --- a/graphrag/language_model/providers/fnllm/models.py +++ /dev/null @@ -1,443 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing fnllm model provider definitions.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING - -from fnllm.openai import ( - create_openai_chat_llm, - create_openai_client, - create_openai_embeddings_llm, -) - -from graphrag.language_model.providers.fnllm.events import FNLLMEvents -from graphrag.language_model.providers.fnllm.utils import ( - _create_cache, - _create_error_handler, - _create_openai_config, - run_coroutine_sync, -) -from graphrag.language_model.response.base import ( - BaseModelOutput, - BaseModelResponse, - ModelResponse, -) - -if TYPE_CHECKING: - from collections.abc import AsyncGenerator, Generator - - from fnllm.openai.types.client import OpenAIChatLLM as FNLLMChatLLM - from fnllm.openai.types.client import OpenAIEmbeddingsLLM as FNLLMEmbeddingLLM - - from graphrag.cache.pipeline_cache import PipelineCache - from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks - from graphrag.config.models.language_model_config import ( - LanguageModelConfig, - ) - - -class OpenAIChatFNLLM: - """An OpenAI Chat Model provider using the fnllm library.""" - - model: FNLLMChatLLM - - def __init__( - self, - *, - name: str, - config: LanguageModelConfig, - callbacks: WorkflowCallbacks | None = None, - cache: PipelineCache | None = None, - ) -> None: - model_config = _create_openai_config(config, azure=False) - error_handler = _create_error_handler(callbacks) if callbacks else None - model_cache = _create_cache(cache, name) - client = create_openai_client(model_config) - self.model = create_openai_chat_llm( - model_config, - client=client, - cache=model_cache, - events=FNLLMEvents(error_handler) if error_handler else None, - ) - self.config = config - - async def achat( - self, prompt: str, history: list | None = None, **kwargs - ) -> ModelResponse: - """ - Chat with the Model using the given prompt. - - Args: - prompt: The prompt to chat with. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The response from the Model. - """ - if history is None: - response = await self.model(prompt, **kwargs) - else: - response = await self.model(prompt, history=history, **kwargs) - return BaseModelResponse( - output=BaseModelOutput( - content=response.output.content, - full_response=response.output.raw_model.to_dict(), - ), - parsed_response=response.parsed_json, - history=response.history, - cache_hit=response.cache_hit, - tool_calls=response.tool_calls, - metrics=response.metrics, - ) - - async def achat_stream( - self, prompt: str, history: list | None = None, **kwargs - ) -> AsyncGenerator[str, None]: - """ - Stream Chat with the Model using the given prompt. - - Args: - prompt: The prompt to chat with. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - A generator that yields strings representing the response. - """ - if history is None: - response = await self.model(prompt, stream=True, **kwargs) - else: - response = await self.model(prompt, history=history, stream=True, **kwargs) - async for chunk in response.output.content: - if chunk is not None: - yield chunk - - def chat(self, prompt: str, history: list | None = None, **kwargs) -> ModelResponse: - """ - Chat with the Model using the given prompt. - - Args: - prompt: The prompt to chat with. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The response from the Model. - """ - return run_coroutine_sync(self.achat(prompt, history=history, **kwargs)) - - def chat_stream( - self, prompt: str, history: list | None = None, **kwargs - ) -> Generator[str, None]: - """ - Stream Chat with the Model using the given prompt. - - Args: - prompt: The prompt to chat with. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - A generator that yields strings representing the response. - """ - msg = "chat_stream is not supported for synchronous execution" - raise NotImplementedError(msg) - - -class OpenAIEmbeddingFNLLM: - """An OpenAI Embedding Model provider using the fnllm library.""" - - model: FNLLMEmbeddingLLM - - def __init__( - self, - *, - name: str, - config: LanguageModelConfig, - callbacks: WorkflowCallbacks | None = None, - cache: PipelineCache | None = None, - ) -> None: - model_config = _create_openai_config(config, azure=False) - error_handler = _create_error_handler(callbacks) if callbacks else None - model_cache = _create_cache(cache, name) - client = create_openai_client(model_config) - self.model = create_openai_embeddings_llm( - model_config, - client=client, - cache=model_cache, - events=FNLLMEvents(error_handler) if error_handler else None, - ) - self.config = config - - async def aembed_batch(self, text_list: list[str], **kwargs) -> list[list[float]]: - """ - Embed the given text using the Model. - - Args: - text: The text to embed. - kwargs: Additional arguments to pass to the LLM. - - Returns - ------- - The embeddings of the text. - """ - response = await self.model(text_list, **kwargs) - if response.output.embeddings is None: - msg = "No embeddings found in response" - raise ValueError(msg) - embeddings: list[list[float]] = response.output.embeddings - return embeddings - - async def aembed(self, text: str, **kwargs) -> list[float]: - """ - Embed the given text using the Model. - - Args: - text: The text to embed. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The embeddings of the text. - """ - response = await self.model([text], **kwargs) - if response.output.embeddings is None: - msg = "No embeddings found in response" - raise ValueError(msg) - embeddings: list[float] = response.output.embeddings[0] - return embeddings - - def embed_batch(self, text_list: list[str], **kwargs) -> list[list[float]]: - """ - Embed the given text using the Model. - - Args: - text: The text to embed. - kwargs: Additional arguments to pass to the LLM. - - Returns - ------- - The embeddings of the text. - """ - return run_coroutine_sync(self.aembed_batch(text_list, **kwargs)) - - def embed(self, text: str, **kwargs) -> list[float]: - """ - Embed the given text using the Model. - - Args: - text: The text to embed. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The embeddings of the text. - """ - return run_coroutine_sync(self.aembed(text, **kwargs)) - - -class AzureOpenAIChatFNLLM: - """An Azure OpenAI Chat LLM provider using the fnllm library.""" - - model: FNLLMChatLLM - - def __init__( - self, - *, - name: str, - config: LanguageModelConfig, - callbacks: WorkflowCallbacks | None = None, - cache: PipelineCache | None = None, - ) -> None: - model_config = _create_openai_config(config, azure=True) - error_handler = _create_error_handler(callbacks) if callbacks else None - model_cache = _create_cache(cache, name) - client = create_openai_client(model_config) - self.model = create_openai_chat_llm( - model_config, - client=client, - cache=model_cache, - events=FNLLMEvents(error_handler) if error_handler else None, - ) - self.config = config - - async def achat( - self, prompt: str, history: list | None = None, **kwargs - ) -> ModelResponse: - """ - Chat with the Model using the given prompt. - - Args: - prompt: The prompt to chat with. - history: The conversation history. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The response from the Model. - """ - if history is None: - response = await self.model(prompt, **kwargs) - else: - response = await self.model(prompt, history=history, **kwargs) - return BaseModelResponse( - output=BaseModelOutput( - content=response.output.content, - full_response=response.output.raw_model.to_dict(), - ), - parsed_response=response.parsed_json, - history=response.history, - cache_hit=response.cache_hit, - tool_calls=response.tool_calls, - metrics=response.metrics, - ) - - async def achat_stream( - self, prompt: str, history: list | None = None, **kwargs - ) -> AsyncGenerator[str, None]: - """ - Stream Chat with the Model using the given prompt. - - Args: - prompt: The prompt to chat with. - history: The conversation history. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - A generator that yields strings representing the response. - """ - if history is None: - response = await self.model(prompt, stream=True, **kwargs) - else: - response = await self.model(prompt, history=history, stream=True, **kwargs) - async for chunk in response.output.content: - if chunk is not None: - yield chunk - - def chat(self, prompt: str, history: list | None = None, **kwargs) -> ModelResponse: - """ - Chat with the Model using the given prompt. - - Args: - prompt: The prompt to chat with. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The response from the Model. - """ - return run_coroutine_sync(self.achat(prompt, history=history, **kwargs)) - - def chat_stream( - self, prompt: str, history: list | None = None, **kwargs - ) -> Generator[str, None]: - """ - Stream Chat with the Model using the given prompt. - - Args: - prompt: The prompt to chat with. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - A generator that yields strings representing the response. - """ - msg = "chat_stream is not supported for synchronous execution" - raise NotImplementedError(msg) - - -class AzureOpenAIEmbeddingFNLLM: - """An Azure OpenAI Embedding Model provider using the fnllm library.""" - - model: FNLLMEmbeddingLLM - - def __init__( - self, - *, - name: str, - config: LanguageModelConfig, - callbacks: WorkflowCallbacks | None = None, - cache: PipelineCache | None = None, - ) -> None: - model_config = _create_openai_config(config, azure=True) - error_handler = _create_error_handler(callbacks) if callbacks else None - model_cache = _create_cache(cache, name) - client = create_openai_client(model_config) - self.model = create_openai_embeddings_llm( - model_config, - client=client, - cache=model_cache, - events=FNLLMEvents(error_handler) if error_handler else None, - ) - self.config = config - - async def aembed_batch(self, text_list: list[str], **kwargs) -> list[list[float]]: - """ - Embed the given text using the Model. - - Args: - text: The text to embed. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The embeddings of the text. - """ - response = await self.model(text_list, **kwargs) - if response.output.embeddings is None: - msg = "No embeddings found in response" - raise ValueError(msg) - embeddings: list[list[float]] = response.output.embeddings - return embeddings - - async def aembed(self, text: str, **kwargs) -> list[float]: - """ - Embed the given text using the Model. - - Args: - text: The text to embed. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The embeddings of the text. - """ - response = await self.model([text], **kwargs) - if response.output.embeddings is None: - msg = "No embeddings found in response" - raise ValueError(msg) - embeddings: list[float] = response.output.embeddings[0] - return embeddings - - def embed_batch(self, text_list: list[str], **kwargs) -> list[list[float]]: - """ - Embed the given text using the Model. - - Args: - text: The text to embed. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The embeddings of the text. - """ - return run_coroutine_sync(self.aembed_batch(text_list, **kwargs)) - - def embed(self, text: str, **kwargs) -> list[float]: - """ - Embed the given text using the Model. - - Args: - text: The text to embed. - kwargs: Additional arguments to pass to the Model. - - Returns - ------- - The embeddings of the text. - """ - return run_coroutine_sync(self.aembed(text, **kwargs)) diff --git a/graphrag/language_model/providers/fnllm/utils.py b/graphrag/language_model/providers/fnllm/utils.py deleted file mode 100644 index b12b0e27b0..0000000000 --- a/graphrag/language_model/providers/fnllm/utils.py +++ /dev/null @@ -1,165 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing utils for fnllm.""" - -from __future__ import annotations - -import asyncio -import logging -import threading -from typing import TYPE_CHECKING, Any, TypeVar - -from fnllm.base.config import JsonStrategy, RetryStrategy -from fnllm.openai import AzureOpenAIConfig, OpenAIConfig, PublicOpenAIConfig -from fnllm.openai.types.chat.parameters import OpenAIChatParameters - -import graphrag.config.defaults as defs -from graphrag.language_model.providers.fnllm.cache import FNLLMCacheProvider - -if TYPE_CHECKING: - from collections.abc import Coroutine - - from graphrag.cache.pipeline_cache import PipelineCache - from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks - from graphrag.config.models.language_model_config import ( - LanguageModelConfig, - ) - from graphrag.index.typing.error_handler import ErrorHandlerFn - -logger = logging.getLogger(__name__) - - -def _create_cache(cache: PipelineCache | None, name: str) -> FNLLMCacheProvider | None: - """Create an FNLLM cache from a pipeline cache.""" - if cache is None: - return None - return FNLLMCacheProvider(cache).child(name) - - -def _create_error_handler(callbacks: WorkflowCallbacks) -> ErrorHandlerFn: # noqa: ARG001 - """Create an error handler from a WorkflowCallbacks.""" - - def on_error( - error: BaseException | None = None, - stack: str | None = None, - details: dict | None = None, - ) -> None: - logger.error( - "Error Invoking LLM", - exc_info=error, - extra={"stack": stack, "details": details}, - ) - - return on_error - - -def _create_openai_config(config: LanguageModelConfig, azure: bool) -> OpenAIConfig: - """Create an OpenAIConfig from a LanguageModelConfig.""" - encoding_model = config.encoding_model - json_strategy = ( - JsonStrategy.VALID if config.model_supports_json else JsonStrategy.LOOSE - ) - chat_parameters = OpenAIChatParameters( - **get_openai_model_parameters_from_config(config) - ) - - if azure: - if config.api_base is None: - msg = "Azure OpenAI Chat LLM requires an API base" - raise ValueError(msg) - - audience = config.audience or defs.COGNITIVE_SERVICES_AUDIENCE - return AzureOpenAIConfig( - api_key=config.api_key, - endpoint=config.api_base, - json_strategy=json_strategy, - api_version=config.api_version, - organization=config.organization, - max_retries=config.max_retries, - max_retry_wait=config.max_retry_wait, - requests_per_minute=config.requests_per_minute, - tokens_per_minute=config.tokens_per_minute, - audience=audience, - retry_strategy=RetryStrategy(config.retry_strategy), - timeout=config.request_timeout, - max_concurrency=config.concurrent_requests, - model=config.model, - encoding=encoding_model, - deployment=config.deployment_name, - chat_parameters=chat_parameters, - ) - return PublicOpenAIConfig( - api_key=config.api_key, - base_url=config.api_base, - json_strategy=json_strategy, - organization=config.organization, - retry_strategy=RetryStrategy(config.retry_strategy), - max_retries=config.max_retries, - max_retry_wait=config.max_retry_wait, - requests_per_minute=config.requests_per_minute, - tokens_per_minute=config.tokens_per_minute, - timeout=config.request_timeout, - max_concurrency=config.concurrent_requests, - model=config.model, - encoding=encoding_model, - chat_parameters=chat_parameters, - ) - - -# FNLLM does not support sync operations, so we workaround running in an available loop/thread. -T = TypeVar("T") - -_loop = asyncio.new_event_loop() - -_thr = threading.Thread(target=_loop.run_forever, name="Async Runner", daemon=True) - - -def run_coroutine_sync(coroutine: Coroutine[Any, Any, T]) -> T: - """ - Run a coroutine synchronously. - - Args: - coroutine: The coroutine to run. - - Returns - ------- - The result of the coroutine. - """ - if not _thr.is_alive(): - _thr.start() - future = asyncio.run_coroutine_threadsafe(coroutine, _loop) - return future.result() - - -def is_reasoning_model(model: str) -> bool: - """Return whether the model uses a known OpenAI reasoning model.""" - return model.lower() in {"o1", "o1-mini", "o3-mini"} - - -def get_openai_model_parameters_from_config( - config: LanguageModelConfig, -) -> dict[str, Any]: - """Get the model parameters for a given config, adjusting for reasoning API differences.""" - return get_openai_model_parameters_from_dict(config.model_dump()) - - -def get_openai_model_parameters_from_dict(config: dict[str, Any]) -> dict[str, Any]: - """Get the model parameters for a given config, adjusting for reasoning API differences.""" - params = { - "n": config.get("n"), - } - if is_reasoning_model(config["model"]): - params["max_completion_tokens"] = config.get("max_completion_tokens") - params["reasoning_effort"] = config.get("reasoning_effort") - else: - params["max_tokens"] = config.get("max_tokens") - params["temperature"] = config.get("temperature") - params["frequency_penalty"] = config.get("frequency_penalty") - params["presence_penalty"] = config.get("presence_penalty") - params["top_p"] = config.get("top_p") - - if config.get("response_format"): - params["response_format"] = config["response_format"] - - return params diff --git a/graphrag/language_model/providers/litellm/__init__.py b/graphrag/language_model/providers/litellm/__init__.py deleted file mode 100644 index a1f948aba8..0000000000 --- a/graphrag/language_model/providers/litellm/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""GraphRAG LiteLLM module. Provides LiteLLM-based implementations of chat and embedding models.""" diff --git a/graphrag/language_model/providers/litellm/chat_model.py b/graphrag/language_model/providers/litellm/chat_model.py deleted file mode 100644 index 43cb7ece98..0000000000 --- a/graphrag/language_model/providers/litellm/chat_model.py +++ /dev/null @@ -1,414 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Chat model implementation using Litellm.""" - -import inspect -import json -from collections.abc import AsyncGenerator, Generator -from typing import TYPE_CHECKING, Any, cast - -import litellm -from azure.identity import DefaultAzureCredential, get_bearer_token_provider -from litellm import ( - CustomStreamWrapper, - ModelResponse, # type: ignore - acompletion, - completion, -) -from pydantic import BaseModel, Field - -from graphrag.config.defaults import COGNITIVE_SERVICES_AUDIENCE -from graphrag.config.enums import AuthType -from graphrag.language_model.providers.litellm.request_wrappers.with_cache import ( - with_cache, -) -from graphrag.language_model.providers.litellm.request_wrappers.with_logging import ( - with_logging, -) -from graphrag.language_model.providers.litellm.request_wrappers.with_rate_limiter import ( - with_rate_limiter, -) -from graphrag.language_model.providers.litellm.request_wrappers.with_retries import ( - with_retries, -) -from graphrag.language_model.providers.litellm.types import ( - AFixedModelCompletion, - FixedModelCompletion, -) - -if TYPE_CHECKING: - from graphrag.cache.pipeline_cache import PipelineCache - from graphrag.config.models.language_model_config import LanguageModelConfig - from graphrag.language_model.response.base import ModelResponse as MR # noqa: N817 - -litellm.suppress_debug_info = True - - -def _create_base_completions( - model_config: "LanguageModelConfig", -) -> tuple[FixedModelCompletion, AFixedModelCompletion]: - """Wrap the base litellm completion function with the model configuration. - - Args - ---- - model_config: The configuration for the language model. - - Returns - ------- - A tuple containing the synchronous and asynchronous completion functions. - """ - model_provider = model_config.model_provider - model = model_config.deployment_name or model_config.model - - base_args: dict[str, Any] = { - "drop_params": True, # LiteLLM drop unsupported params for selected model. - "model": f"{model_provider}/{model}", - "timeout": model_config.request_timeout, - "top_p": model_config.top_p, - "n": model_config.n, - "temperature": model_config.temperature, - "frequency_penalty": model_config.frequency_penalty, - "presence_penalty": model_config.presence_penalty, - "api_base": model_config.api_base, - "api_version": model_config.api_version, - "api_key": model_config.api_key, - "organization": model_config.organization, - "proxy": model_config.proxy, - "audience": model_config.audience, - "max_tokens": model_config.max_tokens, - "max_completion_tokens": model_config.max_completion_tokens, - "reasoning_effort": model_config.reasoning_effort, - } - - if model_config.auth_type == AuthType.AzureManagedIdentity: - if model_config.model_provider != "azure": - msg = "Azure Managed Identity authentication is only supported for Azure models." - raise ValueError(msg) - - base_args["azure_scope"] = base_args.pop("audience") - base_args["azure_ad_token_provider"] = get_bearer_token_provider( - DefaultAzureCredential(), - model_config.audience or COGNITIVE_SERVICES_AUDIENCE, - ) - - def _base_completion(**kwargs: Any) -> ModelResponse | CustomStreamWrapper: - new_args = {**base_args, **kwargs} - - if "name" in new_args: - new_args.pop("name") - - return completion(**new_args) - - async def _base_acompletion(**kwargs: Any) -> ModelResponse | CustomStreamWrapper: - new_args = {**base_args, **kwargs} - - if "name" in new_args: - new_args.pop("name") - - return await acompletion(**new_args) - - return (_base_completion, _base_acompletion) - - -def _create_completions( - model_config: "LanguageModelConfig", - cache: "PipelineCache | None", - cache_key_prefix: str, -) -> tuple[FixedModelCompletion, AFixedModelCompletion]: - """Wrap the base litellm completion function with the model configuration and additional features. - - Wrap the base litellm completion function with instance variables based on the model configuration. - Then wrap additional features such as rate limiting, retries, and caching, if enabled. - - Final function composition order: - - Logging(Cache(Retries(RateLimiter(ModelCompletion())))) - - Args - ---- - model_config: The configuration for the language model. - cache: Optional cache for storing responses. - cache_key_prefix: Prefix for cache keys. - - Returns - ------- - A tuple containing the synchronous and asynchronous completion functions. - - """ - completion, acompletion = _create_base_completions(model_config) - - # TODO: For v2.x release, rpm/tpm can be int or str (auto) for backwards compatibility with fnllm. - # LiteLLM does not support "auto", so we have to check those values here. - # For v3 release, force rpm/tpm to be int and remove the type checks below - # and just check if rate_limit_strategy is enabled. - if model_config.rate_limit_strategy is not None: - rpm = ( - model_config.requests_per_minute - if type(model_config.requests_per_minute) is int - else None - ) - tpm = ( - model_config.tokens_per_minute - if type(model_config.tokens_per_minute) is int - else None - ) - if rpm is not None or tpm is not None: - completion, acompletion = with_rate_limiter( - sync_fn=completion, - async_fn=acompletion, - model_config=model_config, - rpm=rpm, - tpm=tpm, - ) - - if model_config.retry_strategy != "none": - completion, acompletion = with_retries( - sync_fn=completion, - async_fn=acompletion, - model_config=model_config, - ) - - if cache is not None: - completion, acompletion = with_cache( - sync_fn=completion, - async_fn=acompletion, - model_config=model_config, - cache=cache, - request_type="chat", - cache_key_prefix=cache_key_prefix, - ) - - completion, acompletion = with_logging( - sync_fn=completion, - async_fn=acompletion, - ) - - return (completion, acompletion) - - -class LitellmModelOutput(BaseModel): - """A model representing the output from a language model.""" - - content: str = Field(description="The generated text content") - full_response: None = Field( - default=None, description="The full response from the model, if available" - ) - - -class LitellmModelResponse(BaseModel): - """A model representing the response from a language model.""" - - output: LitellmModelOutput = Field(description="The output from the model") - parsed_response: BaseModel | None = Field( - default=None, description="Parsed response from the model" - ) - history: list = Field( - default_factory=list, - description="Conversation history including the prompt and response", - ) - - -class LitellmChatModel: - """LiteLLM-based Chat Model.""" - - def __init__( - self, - name: str, - config: "LanguageModelConfig", - cache: "PipelineCache | None" = None, - **kwargs: Any, - ): - self.name = name - self.config = config - self.cache = cache.child(self.name) if cache else None - self.completion, self.acompletion = _create_completions( - config, self.cache, "chat" - ) - - def _get_kwargs(self, **kwargs: Any) -> dict[str, Any]: - """Get model arguments supported by litellm.""" - args_to_include = [ - "name", - "modalities", - "prediction", - "audio", - "logit_bias", - "metadata", - "user", - "response_format", - "seed", - "tools", - "tool_choice", - "logprobs", - "top_logprobs", - "parallel_tool_calls", - "web_search_options", - "extra_headers", - "functions", - "function_call", - "thinking", - ] - new_args = {k: v for k, v in kwargs.items() if k in args_to_include} - - # If using JSON, check if response_format should be a Pydantic model or just a general JSON object - if kwargs.get("json"): - new_args["response_format"] = {"type": "json_object"} - - if ( - "json_model" in kwargs - and inspect.isclass(kwargs["json_model"]) - and issubclass(kwargs["json_model"], BaseModel) - ): - new_args["response_format"] = kwargs["json_model"] - - return new_args - - async def achat( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> "MR": - """ - Generate a response for the given prompt and history. - - Args - ---- - prompt: The prompt to generate a response for. - history: Optional chat history. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - LitellmModelResponse: The generated model response. - """ - new_kwargs = self._get_kwargs(**kwargs) - messages: list[dict[str, str]] = history or [] - messages.append({"role": "user", "content": prompt}) - - response = await self.acompletion(messages=messages, stream=False, **new_kwargs) # type: ignore - - messages.append({ - "role": "assistant", - "content": response.choices[0].message.content or "", # type: ignore - }) - - parsed_response: BaseModel | None = None - if "response_format" in new_kwargs: - parsed_dict: dict[str, Any] = json.loads( - response.choices[0].message.content or "{}" # type: ignore - ) - parsed_response = parsed_dict # type: ignore - if inspect.isclass(new_kwargs["response_format"]) and issubclass( - new_kwargs["response_format"], BaseModel - ): - # If response_format is a pydantic model, instantiate it - model_initializer = cast( - "type[BaseModel]", new_kwargs["response_format"] - ) - parsed_response = model_initializer(**parsed_dict) - - return LitellmModelResponse( - output=LitellmModelOutput( - content=response.choices[0].message.content or "" # type: ignore - ), - parsed_response=parsed_response, - history=messages, - ) - - async def achat_stream( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> AsyncGenerator[str, None]: - """ - Generate a response for the given prompt and history. - - Args - ---- - prompt: The prompt to generate a response for. - history: Optional chat history. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - AsyncGenerator[str, None]: The generated response as a stream of strings. - """ - new_kwargs = self._get_kwargs(**kwargs) - messages: list[dict[str, str]] = history or [] - messages.append({"role": "user", "content": prompt}) - - response = await self.acompletion(messages=messages, stream=True, **new_kwargs) # type: ignore - - async for chunk in response: # type: ignore - if chunk.choices and chunk.choices[0].delta.content: - yield chunk.choices[0].delta.content - - def chat(self, prompt: str, history: list | None = None, **kwargs: Any) -> "MR": - """ - Generate a response for the given prompt and history. - - Args - ---- - prompt: The prompt to generate a response for. - history: Optional chat history. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - LitellmModelResponse: The generated model response. - """ - new_kwargs = self._get_kwargs(**kwargs) - messages: list[dict[str, str]] = history or [] - messages.append({"role": "user", "content": prompt}) - - response = self.completion(messages=messages, stream=False, **new_kwargs) # type: ignore - - messages.append({ - "role": "assistant", - "content": response.choices[0].message.content or "", # type: ignore - }) - - parsed_response: BaseModel | None = None - if "response_format" in new_kwargs: - parsed_dict: dict[str, Any] = json.loads( - response.choices[0].message.content or "{}" # type: ignore - ) - parsed_response = parsed_dict # type: ignore - if inspect.isclass(new_kwargs["response_format"]) and issubclass( - new_kwargs["response_format"], BaseModel - ): - # If response_format is a pydantic model, instantiate it - model_initializer = cast( - "type[BaseModel]", new_kwargs["response_format"] - ) - parsed_response = model_initializer(**parsed_dict) - - return LitellmModelResponse( - output=LitellmModelOutput( - content=response.choices[0].message.content or "" # type: ignore - ), - parsed_response=parsed_response, - history=messages, - ) - - def chat_stream( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> Generator[str, None]: - """ - Generate a response for the given prompt and history. - - Args - ---- - prompt: The prompt to generate a response for. - history: Optional chat history. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - Generator[str, None]: The generated response as a stream of strings. - """ - new_kwargs = self._get_kwargs(**kwargs) - messages: list[dict[str, str]] = history or [] - messages.append({"role": "user", "content": prompt}) - - response = self.completion(messages=messages, stream=True, **new_kwargs) # type: ignore - - for chunk in response: - if chunk.choices and chunk.choices[0].delta.content: # type: ignore - yield chunk.choices[0].delta.content # type: ignore diff --git a/graphrag/language_model/providers/litellm/embedding_model.py b/graphrag/language_model/providers/litellm/embedding_model.py deleted file mode 100644 index 779222c37e..0000000000 --- a/graphrag/language_model/providers/litellm/embedding_model.py +++ /dev/null @@ -1,280 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Embedding model implementation using Litellm.""" - -from typing import TYPE_CHECKING, Any - -import litellm -from azure.identity import DefaultAzureCredential, get_bearer_token_provider -from litellm import ( - EmbeddingResponse, # type: ignore - aembedding, - embedding, -) - -from graphrag.config.defaults import COGNITIVE_SERVICES_AUDIENCE -from graphrag.config.enums import AuthType -from graphrag.language_model.providers.litellm.request_wrappers.with_cache import ( - with_cache, -) -from graphrag.language_model.providers.litellm.request_wrappers.with_logging import ( - with_logging, -) -from graphrag.language_model.providers.litellm.request_wrappers.with_rate_limiter import ( - with_rate_limiter, -) -from graphrag.language_model.providers.litellm.request_wrappers.with_retries import ( - with_retries, -) -from graphrag.language_model.providers.litellm.types import ( - AFixedModelEmbedding, - FixedModelEmbedding, -) - -if TYPE_CHECKING: - from graphrag.cache.pipeline_cache import PipelineCache - from graphrag.config.models.language_model_config import LanguageModelConfig - -litellm.suppress_debug_info = True - - -def _create_base_embeddings( - model_config: "LanguageModelConfig", -) -> tuple[FixedModelEmbedding, AFixedModelEmbedding]: - """Wrap the base litellm embedding function with the model configuration. - - Args - ---- - model_config: The configuration for the language model. - - Returns - ------- - A tuple containing the synchronous and asynchronous embedding functions. - """ - model_provider = model_config.model_provider - model = model_config.deployment_name or model_config.model - - base_args: dict[str, Any] = { - "drop_params": True, # LiteLLM drop unsupported params for selected model. - "model": f"{model_provider}/{model}", - "timeout": model_config.request_timeout, - "api_base": model_config.api_base, - "api_version": model_config.api_version, - "api_key": model_config.api_key, - "organization": model_config.organization, - "proxy": model_config.proxy, - "audience": model_config.audience, - } - - if model_config.auth_type == AuthType.AzureManagedIdentity: - if model_config.model_provider != "azure": - msg = "Azure Managed Identity authentication is only supported for Azure models." - raise ValueError(msg) - - base_args["azure_scope"] = base_args.pop("audience") - base_args["azure_ad_token_provider"] = get_bearer_token_provider( - DefaultAzureCredential(), - model_config.audience or COGNITIVE_SERVICES_AUDIENCE, - ) - - def _base_embedding(**kwargs: Any) -> EmbeddingResponse: - new_args = {**base_args, **kwargs} - - if "name" in new_args: - new_args.pop("name") - - return embedding(**new_args) - - async def _base_aembedding(**kwargs: Any) -> EmbeddingResponse: - new_args = {**base_args, **kwargs} - - if "name" in new_args: - new_args.pop("name") - - return await aembedding(**new_args) - - return (_base_embedding, _base_aembedding) - - -def _create_embeddings( - model_config: "LanguageModelConfig", - cache: "PipelineCache | None", - cache_key_prefix: str, -) -> tuple[FixedModelEmbedding, AFixedModelEmbedding]: - """Wrap the base litellm embedding function with the model configuration and additional features. - - Wrap the base litellm embedding function with instance variables based on the model configuration. - Then wrap additional features such as rate limiting, retries, and caching, if enabled. - - Final function composition order: - - Logging(Cache(Retries(RateLimiter(ModelEmbedding())))) - - Args - ---- - model_config: The configuration for the language model. - cache: Optional cache for storing responses. - cache_key_prefix: Prefix for cache keys. - - Returns - ------- - A tuple containing the synchronous and asynchronous embedding functions. - - """ - embedding, aembedding = _create_base_embeddings(model_config) - - # TODO: For v2.x release, rpm/tpm can be int or str (auto) for backwards compatibility with fnllm. - # LiteLLM does not support "auto", so we have to check those values here. - # For v3 release, force rpm/tpm to be int and remove the type checks below - # and just check if rate_limit_strategy is enabled. - if model_config.rate_limit_strategy is not None: - rpm = ( - model_config.requests_per_minute - if type(model_config.requests_per_minute) is int - else None - ) - tpm = ( - model_config.tokens_per_minute - if type(model_config.tokens_per_minute) is int - else None - ) - if rpm is not None or tpm is not None: - embedding, aembedding = with_rate_limiter( - sync_fn=embedding, - async_fn=aembedding, - model_config=model_config, - rpm=rpm, - tpm=tpm, - ) - - if model_config.retry_strategy != "none": - embedding, aembedding = with_retries( - sync_fn=embedding, - async_fn=aembedding, - model_config=model_config, - ) - - if cache is not None: - embedding, aembedding = with_cache( - sync_fn=embedding, - async_fn=aembedding, - model_config=model_config, - cache=cache, - request_type="embedding", - cache_key_prefix=cache_key_prefix, - ) - - embedding, aembedding = with_logging( - sync_fn=embedding, - async_fn=aembedding, - ) - - return (embedding, aembedding) - - -class LitellmEmbeddingModel: - """LiteLLM-based Embedding Model.""" - - def __init__( - self, - name: str, - config: "LanguageModelConfig", - cache: "PipelineCache | None" = None, - **kwargs: Any, - ): - self.name = name - self.config = config - self.cache = cache.child(self.name) if cache else None - self.embedding, self.aembedding = _create_embeddings( - config, self.cache, "embeddings" - ) - - def _get_kwargs(self, **kwargs: Any) -> dict[str, Any]: - """Get model arguments supported by litellm.""" - args_to_include = [ - "name", - "dimensions", - "encoding_format", - "timeout", - "user", - ] - return {k: v for k, v in kwargs.items() if k in args_to_include} - - async def aembed_batch( - self, text_list: list[str], **kwargs: Any - ) -> list[list[float]]: - """ - Batch generate embeddings. - - Args - ---- - text_list: A batch of text inputs to generate embeddings for. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A Batch of embeddings. - """ - new_kwargs = self._get_kwargs(**kwargs) - response = await self.aembedding(input=text_list, **new_kwargs) - - return [emb.get("embedding", []) for emb in response.data] - - async def aembed(self, text: str, **kwargs: Any) -> list[float]: - """ - Async embed. - - Args: - text: The text to generate an embedding for. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - An embedding. - """ - new_kwargs = self._get_kwargs(**kwargs) - response = await self.aembedding(input=[text], **new_kwargs) - - return ( - response.data[0].get("embedding", []) - if response.data and response.data[0] - else [] - ) - - def embed_batch(self, text_list: list[str], **kwargs: Any) -> list[list[float]]: - """ - Batch generate embeddings. - - Args: - text_list: A batch of text inputs to generate embeddings for. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - A Batch of embeddings. - """ - new_kwargs = self._get_kwargs(**kwargs) - response = self.embedding(input=text_list, **new_kwargs) - - return [emb.get("embedding", []) for emb in response.data] - - def embed(self, text: str, **kwargs: Any) -> list[float]: - """ - Embed a single text input. - - Args: - text: The text to generate an embedding for. - **kwargs: Additional keyword arguments (e.g., model parameters). - - Returns - ------- - An embedding. - """ - new_kwargs = self._get_kwargs(**kwargs) - response = self.embedding(input=[text], **new_kwargs) - - return ( - response.data[0].get("embedding", []) - if response.data and response.data[0] - else [] - ) diff --git a/graphrag/language_model/providers/litellm/get_cache_key.py b/graphrag/language_model/providers/litellm/get_cache_key.py deleted file mode 100644 index 0d6938d45a..0000000000 --- a/graphrag/language_model/providers/litellm/get_cache_key.py +++ /dev/null @@ -1,140 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -""" -LiteLLM cache key generation. - -Modeled after the fnllm cache key generation. -https://github.com/microsoft/essex-toolkit/blob/23d3077b65c0e8f1d89c397a2968fe570a25f790/python/fnllm/fnllm/caching/base.py#L50 -""" - -import hashlib -import inspect -import json -from typing import TYPE_CHECKING, Any - -from pydantic import BaseModel - -if TYPE_CHECKING: - from graphrag.config.models.language_model_config import LanguageModelConfig - - -_CACHE_VERSION = 3 -""" -If there's a breaking change in what we cache, we should increment this version number to invalidate existing caches. - -fnllm was on cache version 2 and though we generate -similar cache keys, the objects stored in cache by fnllm and litellm are different. -Using litellm model providers will not be able to reuse caches generated by fnllm -thus we start with version 3 for litellm. -""" - - -def get_cache_key( - model_config: "LanguageModelConfig", - prefix: str, - messages: str | None = None, - input: str | None = None, - **kwargs: Any, -) -> str: - """Generate a cache key based on the model configuration and input arguments. - - Modeled after the fnllm cache key generation. - https://github.com/microsoft/essex-toolkit/blob/23d3077b65c0e8f1d89c397a2968fe570a25f790/python/fnllm/fnllm/caching/base.py#L50 - - Args - ____ - model_config: The configuration of the language model. - prefix: A prefix for the cache key. - **kwargs: Additional model input parameters. - - Returns - ------- - `{prefix}_{data_hash}_v{version}` if prefix is provided. - """ - cache_key: dict[str, Any] = { - "parameters": _get_parameters(model_config, **kwargs), - } - - if messages is not None and input is not None: - msg = "Only one of 'messages' or 'input' should be provided." - raise ValueError(msg) - - if messages is not None: - cache_key["messages"] = messages - elif input is not None: - cache_key["input"] = input - else: - msg = "Either 'messages' or 'input' must be provided." - raise ValueError(msg) - - data_hash = _hash(json.dumps(cache_key, sort_keys=True)) - - name = kwargs.get("name") - - if name: - prefix += f"_{name}" - - return f"{prefix}_{data_hash}_v{_CACHE_VERSION}" - - -def _get_parameters( - model_config: "LanguageModelConfig", - **kwargs: Any, -) -> dict[str, Any]: - """Pluck out the parameters that define a cache key. - - Use the same parameters as fnllm except request timeout. - - embeddings: https://github.com/microsoft/essex-toolkit/blob/main/python/fnllm/fnllm/openai/types/embeddings/parameters.py#L12 - - chat: https://github.com/microsoft/essex-toolkit/blob/main/python/fnllm/fnllm/openai/types/chat/parameters.py#L25 - - Args - ____ - model_config: The configuration of the language model. - **kwargs: Additional model input parameters. - - Returns - ------- - dict[str, Any]: A dictionary of parameters that define the cache key. - """ - parameters = { - "model": model_config.deployment_name or model_config.model, - "frequency_penalty": model_config.frequency_penalty, - "max_tokens": model_config.max_tokens, - "max_completion_tokens": model_config.max_completion_tokens, - "n": model_config.n, - "presence_penalty": model_config.presence_penalty, - "temperature": model_config.temperature, - "top_p": model_config.top_p, - "reasoning_effort": model_config.reasoning_effort, - } - keys_to_cache = [ - "function_call", - "functions", - "logit_bias", - "logprobs", - "parallel_tool_calls", - "seed", - "service_tier", - "stop", - "tool_choice", - "tools", - "top_logprobs", - "user", - "dimensions", - "encoding_format", - ] - parameters.update({key: kwargs.get(key) for key in keys_to_cache if key in kwargs}) - - response_format = kwargs.get("response_format") - if inspect.isclass(response_format) and issubclass(response_format, BaseModel): - parameters["response_format"] = str(response_format) - elif response_format is not None: - parameters["response_format"] = response_format - - return parameters - - -def _hash(input: str) -> str: - """Generate a hash for the input string.""" - return hashlib.sha256(input.encode()).hexdigest() diff --git a/graphrag/language_model/providers/litellm/request_wrappers/__init__.py b/graphrag/language_model/providers/litellm/request_wrappers/__init__.py deleted file mode 100644 index b1ba631645..0000000000 --- a/graphrag/language_model/providers/litellm/request_wrappers/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM completion/embedding function wrappers.""" diff --git a/graphrag/language_model/providers/litellm/request_wrappers/with_cache.py b/graphrag/language_model/providers/litellm/request_wrappers/with_cache.py deleted file mode 100644 index d14c97206e..0000000000 --- a/graphrag/language_model/providers/litellm/request_wrappers/with_cache.py +++ /dev/null @@ -1,107 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM completion/embedding cache wrapper.""" - -import asyncio -from typing import TYPE_CHECKING, Any, Literal - -from litellm import EmbeddingResponse, ModelResponse # type: ignore - -from graphrag.language_model.providers.litellm.get_cache_key import get_cache_key -from graphrag.language_model.providers.litellm.types import ( - AsyncLitellmRequestFunc, - LitellmRequestFunc, -) - -if TYPE_CHECKING: - from graphrag.cache.pipeline_cache import PipelineCache - from graphrag.config.models.language_model_config import LanguageModelConfig - - -def with_cache( - *, - sync_fn: LitellmRequestFunc, - async_fn: AsyncLitellmRequestFunc, - model_config: "LanguageModelConfig", - cache: "PipelineCache", - request_type: Literal["chat", "embedding"], - cache_key_prefix: str, -) -> tuple[LitellmRequestFunc, AsyncLitellmRequestFunc]: - """ - Wrap the synchronous and asynchronous request functions with caching. - - Args - ---- - sync_fn: The synchronous chat/embedding request function to wrap. - async_fn: The asynchronous chat/embedding request function to wrap. - model_config: The configuration for the language model. - cache: The cache to use for storing responses. - request_type: The type of request being made, either "chat" or "embedding". - cache_key_prefix: The prefix to use for cache keys. - - Returns - ------- - A tuple containing the wrapped synchronous and asynchronous chat/embedding request functions. - """ - - def _wrapped_with_cache(**kwargs: Any) -> Any: - is_streaming = kwargs.get("stream", False) - if is_streaming: - return sync_fn(**kwargs) - cache_key = get_cache_key( - model_config=model_config, prefix=cache_key_prefix, **kwargs - ) - event_loop = asyncio.get_event_loop() - cached_response = event_loop.run_until_complete(cache.get(cache_key)) - if ( - cached_response is not None - and isinstance(cached_response, dict) - and "response" in cached_response - and cached_response["response"] is not None - and isinstance(cached_response["response"], dict) - ): - try: - if request_type == "chat": - return ModelResponse(**cached_response["response"]) - return EmbeddingResponse(**cached_response["response"]) - except Exception: # noqa: BLE001 - # Try to retrieve value from cache but if it fails, continue - # to make the request. - ... - response = sync_fn(**kwargs) - event_loop.run_until_complete( - cache.set(cache_key, {"response": response.model_dump()}) - ) - return response - - async def _wrapped_with_cache_async( - **kwargs: Any, - ) -> Any: - is_streaming = kwargs.get("stream", False) - if is_streaming: - return await async_fn(**kwargs) - cache_key = get_cache_key( - model_config=model_config, prefix=cache_key_prefix, **kwargs - ) - cached_response = await cache.get(cache_key) - if ( - cached_response is not None - and isinstance(cached_response, dict) - and "response" in cached_response - and cached_response["response"] is not None - and isinstance(cached_response["response"], dict) - ): - try: - if request_type == "chat": - return ModelResponse(**cached_response["response"]) - return EmbeddingResponse(**cached_response["response"]) - except Exception: # noqa: BLE001 - # Try to retrieve value from cache but if it fails, continue - # to make the request. - ... - response = await async_fn(**kwargs) - await cache.set(cache_key, {"response": response.model_dump()}) - return response - - return (_wrapped_with_cache, _wrapped_with_cache_async) diff --git a/graphrag/language_model/providers/litellm/request_wrappers/with_logging.py b/graphrag/language_model/providers/litellm/request_wrappers/with_logging.py deleted file mode 100644 index a353f455fc..0000000000 --- a/graphrag/language_model/providers/litellm/request_wrappers/with_logging.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM completion/embedding logging wrapper.""" - -import logging -from typing import Any - -from graphrag.language_model.providers.litellm.types import ( - AsyncLitellmRequestFunc, - LitellmRequestFunc, -) - -logger = logging.getLogger(__name__) - - -def with_logging( - *, - sync_fn: LitellmRequestFunc, - async_fn: AsyncLitellmRequestFunc, -) -> tuple[LitellmRequestFunc, AsyncLitellmRequestFunc]: - """ - Wrap the synchronous and asynchronous request functions with retries. - - Args - ---- - sync_fn: The synchronous chat/embedding request function to wrap. - async_fn: The asynchronous chat/embedding request function to wrap. - model_config: The configuration for the language model. - - Returns - ------- - A tuple containing the wrapped synchronous and asynchronous chat/embedding request functions. - """ - - def _wrapped_with_logging(**kwargs: Any) -> Any: - try: - return sync_fn(**kwargs) - except Exception as e: - logger.exception( - f"with_logging: Request failed with exception={e}", # noqa: G004, TRY401 - ) - raise - - async def _wrapped_with_logging_async( - **kwargs: Any, - ) -> Any: - try: - return await async_fn(**kwargs) - except Exception as e: - logger.exception( - f"with_logging: Async request failed with exception={e}", # noqa: G004, TRY401 - ) - raise - - return (_wrapped_with_logging, _wrapped_with_logging_async) diff --git a/graphrag/language_model/providers/litellm/request_wrappers/with_rate_limiter.py b/graphrag/language_model/providers/litellm/request_wrappers/with_rate_limiter.py deleted file mode 100644 index c0e0728f2e..0000000000 --- a/graphrag/language_model/providers/litellm/request_wrappers/with_rate_limiter.py +++ /dev/null @@ -1,97 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM completion/embedding rate limiter wrapper.""" - -from typing import TYPE_CHECKING, Any - -from litellm import token_counter # type: ignore - -from graphrag.language_model.providers.litellm.services.rate_limiter.rate_limiter_factory import ( - RateLimiterFactory, -) -from graphrag.language_model.providers.litellm.types import ( - AsyncLitellmRequestFunc, - LitellmRequestFunc, -) - -if TYPE_CHECKING: - from graphrag.config.models.language_model_config import LanguageModelConfig - - -def with_rate_limiter( - *, - sync_fn: LitellmRequestFunc, - async_fn: AsyncLitellmRequestFunc, - model_config: "LanguageModelConfig", - rpm: int | None = None, - tpm: int | None = None, -) -> tuple[LitellmRequestFunc, AsyncLitellmRequestFunc]: - """ - Wrap the synchronous and asynchronous request functions with rate limiting. - - Args - ---- - sync_fn: The synchronous chat/embedding request function to wrap. - async_fn: The asynchronous chat/embedding request function to wrap. - model_config: The configuration for the language model. - processing_event: A threading event that can be used to pause the rate limiter. - rpm: An optional requests per minute limit. - tpm: An optional tokens per minute limit. - - If `rpm` and `tpm` is set to 0 or None, rate limiting is disabled. - - Returns - ------- - A tuple containing the wrapped synchronous and asynchronous chat/embedding request functions. - """ - rate_limiter_factory = RateLimiterFactory() - - if ( - model_config.rate_limit_strategy is None - or model_config.rate_limit_strategy not in rate_limiter_factory - ): - msg = f"Rate Limiter strategy '{model_config.rate_limit_strategy}' is none or not registered. Available strategies: {', '.join(rate_limiter_factory.keys())}" - raise ValueError(msg) - - rate_limiter_service = rate_limiter_factory.create( - strategy=model_config.rate_limit_strategy, rpm=rpm, tpm=tpm - ) - - max_tokens = model_config.max_completion_tokens or model_config.max_tokens or 0 - - def _wrapped_with_rate_limiter(**kwargs: Any) -> Any: - token_count = max_tokens - if "messages" in kwargs: - token_count += token_counter( - model=model_config.model, - messages=kwargs["messages"], - ) - elif "input" in kwargs: - token_count += token_counter( - model=model_config.model, - text=kwargs["input"], - ) - - with rate_limiter_service.acquire(token_count=token_count): - return sync_fn(**kwargs) - - async def _wrapped_with_rate_limiter_async( - **kwargs: Any, - ) -> Any: - token_count = max_tokens - if "messages" in kwargs: - token_count += token_counter( - model=model_config.model, - messages=kwargs["messages"], - ) - elif "input" in kwargs: - token_count += token_counter( - model=model_config.model, - text=kwargs["input"], - ) - - with rate_limiter_service.acquire(token_count=token_count): - return await async_fn(**kwargs) - - return (_wrapped_with_rate_limiter, _wrapped_with_rate_limiter_async) diff --git a/graphrag/language_model/providers/litellm/request_wrappers/with_retries.py b/graphrag/language_model/providers/litellm/request_wrappers/with_retries.py deleted file mode 100644 index 1279f9e820..0000000000 --- a/graphrag/language_model/providers/litellm/request_wrappers/with_retries.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM completion/embedding retries wrapper.""" - -from typing import TYPE_CHECKING, Any - -from graphrag.language_model.providers.litellm.services.retry.retry_factory import ( - RetryFactory, -) -from graphrag.language_model.providers.litellm.types import ( - AsyncLitellmRequestFunc, - LitellmRequestFunc, -) - -if TYPE_CHECKING: - from graphrag.config.models.language_model_config import LanguageModelConfig - - -def with_retries( - *, - sync_fn: LitellmRequestFunc, - async_fn: AsyncLitellmRequestFunc, - model_config: "LanguageModelConfig", -) -> tuple[LitellmRequestFunc, AsyncLitellmRequestFunc]: - """ - Wrap the synchronous and asynchronous request functions with retries. - - Args - ---- - sync_fn: The synchronous chat/embedding request function to wrap. - async_fn: The asynchronous chat/embedding request function to wrap. - model_config: The configuration for the language model. - - Returns - ------- - A tuple containing the wrapped synchronous and asynchronous chat/embedding request functions. - """ - retry_factory = RetryFactory() - retry_service = retry_factory.create( - strategy=model_config.retry_strategy, - max_retries=model_config.max_retries, - max_retry_wait=model_config.max_retry_wait, - ) - - def _wrapped_with_retries(**kwargs: Any) -> Any: - return retry_service.retry(func=sync_fn, **kwargs) - - async def _wrapped_with_retries_async( - **kwargs: Any, - ) -> Any: - return await retry_service.aretry(func=async_fn, **kwargs) - - return (_wrapped_with_retries, _wrapped_with_retries_async) diff --git a/graphrag/language_model/providers/litellm/services/__init__.py b/graphrag/language_model/providers/litellm/services/__init__.py deleted file mode 100644 index dd0cf9fe2a..0000000000 --- a/graphrag/language_model/providers/litellm/services/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Services.""" diff --git a/graphrag/language_model/providers/litellm/services/rate_limiter/__init__.py b/graphrag/language_model/providers/litellm/services/rate_limiter/__init__.py deleted file mode 100644 index 3c80d9f3f1..0000000000 --- a/graphrag/language_model/providers/litellm/services/rate_limiter/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Rate Limiter.""" diff --git a/graphrag/language_model/providers/litellm/services/rate_limiter/rate_limiter_factory.py b/graphrag/language_model/providers/litellm/services/rate_limiter/rate_limiter_factory.py deleted file mode 100644 index a6ef6880ef..0000000000 --- a/graphrag/language_model/providers/litellm/services/rate_limiter/rate_limiter_factory.py +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Rate Limiter Factory.""" - -from graphrag.config.defaults import DEFAULT_RATE_LIMITER_SERVICES -from graphrag.factory.factory import Factory -from graphrag.language_model.providers.litellm.services.rate_limiter.rate_limiter import ( - RateLimiter, -) - - -class RateLimiterFactory(Factory[RateLimiter]): - """Singleton factory for creating rate limiter services.""" - - -rate_limiter_factory = RateLimiterFactory() - -for service_name, service_cls in DEFAULT_RATE_LIMITER_SERVICES.items(): - rate_limiter_factory.register( - strategy=service_name, service_initializer=service_cls - ) diff --git a/graphrag/language_model/providers/litellm/services/rate_limiter/static_rate_limiter.py b/graphrag/language_model/providers/litellm/services/rate_limiter/static_rate_limiter.py deleted file mode 100644 index 43681ceb10..0000000000 --- a/graphrag/language_model/providers/litellm/services/rate_limiter/static_rate_limiter.py +++ /dev/null @@ -1,133 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Static Rate Limiter.""" - -import threading -import time -from collections import deque -from collections.abc import Iterator -from contextlib import contextmanager -from typing import Any - -from graphrag.language_model.providers.litellm.services.rate_limiter.rate_limiter import ( - RateLimiter, -) - - -class StaticRateLimiter(RateLimiter): - """Static Rate Limiter implementation.""" - - def __init__( - self, - *, - rpm: int | None = None, - tpm: int | None = None, - default_stagger: float = 0.0, - period_in_seconds: int = 60, - **kwargs: Any, - ): - if rpm is None and tpm is None: - msg = "Both TPM and RPM cannot be None (disabled), one or both must be set to a positive integer." - raise ValueError(msg) - if (rpm is not None and rpm <= 0) or (tpm is not None and tpm <= 0): - msg = "RPM and TPM must be either None (disabled) or positive integers." - raise ValueError(msg) - if default_stagger < 0: - msg = "Default stagger must be a >= 0." - raise ValueError(msg) - if period_in_seconds <= 0: - msg = "Period in seconds must be a positive integer." - raise ValueError(msg) - self.rpm = rpm - self.tpm = tpm - self._lock = threading.Lock() - self.rate_queue: deque[float] = deque() - self.token_queue: deque[int] = deque() - self.period_in_seconds = period_in_seconds - self._last_time: float | None = None - - self.stagger = default_stagger - if self.rpm is not None and self.rpm > 0: - self.stagger = self.period_in_seconds / self.rpm - - @contextmanager - def acquire(self, *, token_count: int) -> Iterator[None]: - """ - Acquire Rate Limiter. - - Args - ---- - token_count: The estimated number of tokens for the current request. - - Yields - ------ - None: This context manager does not return any value. - """ - while True: - with self._lock: - current_time = time.time() - - # Use two sliding windows to keep track of #requests and tokens per period - # Drop old requests and tokens out of the sliding windows - while ( - len(self.rate_queue) > 0 - and self.rate_queue[0] < current_time - self.period_in_seconds - ): - self.rate_queue.popleft() - self.token_queue.popleft() - - # If sliding window still exceed request limit, wait again - # Waiting requires reacquiring the lock, allowing other threads - # to see if their request fits within the rate limiting windows - # Makes more sense for token limit than request limit - if ( - self.rpm is not None - and self.rpm > 0 - and len(self.rate_queue) >= self.rpm - ): - continue - - # Check if current token window exceeds token limit - # If it does, wait again - # This does not account for the tokens from the current request - # This is intentional, as we want to allow the current request - # to be processed if it is larger than the tpm but smaller than context window. - # tpm is a rate/soft limit and not the hard limit of context window limits. - if ( - self.tpm is not None - and self.tpm > 0 - and sum(self.token_queue) >= self.tpm - ): - continue - - # This check accounts for the current request token usage - # is within the token limits bound. - # If the current requests token limit exceeds the token limit, - # Then let it be processed. - if ( - self.tpm is not None - and self.tpm > 0 - and token_count <= self.tpm - and sum(self.token_queue) + token_count > self.tpm - ): - continue - - # If there was a previous call, check if we need to stagger - if ( - self.stagger > 0 - and ( - self._last_time # is None if this is the first hit to the rate limiter - and current_time - self._last_time - < self.stagger # If more time has passed than the stagger time, we can proceed - ) - ): - time.sleep(self.stagger - (current_time - self._last_time)) - current_time = time.time() - - # Add the current request to the sliding window - self.rate_queue.append(current_time) - self.token_queue.append(token_count) - self._last_time = current_time - break - yield diff --git a/graphrag/language_model/providers/litellm/services/retry/__init__.py b/graphrag/language_model/providers/litellm/services/retry/__init__.py deleted file mode 100644 index f01e0020e8..0000000000 --- a/graphrag/language_model/providers/litellm/services/retry/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Retry Services.""" diff --git a/graphrag/language_model/providers/litellm/services/retry/exponential_retry.py b/graphrag/language_model/providers/litellm/services/retry/exponential_retry.py deleted file mode 100644 index e008322be0..0000000000 --- a/graphrag/language_model/providers/litellm/services/retry/exponential_retry.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Exponential Retry Service.""" - -import asyncio -import logging -import random -import time -from collections.abc import Awaitable, Callable -from typing import Any - -from graphrag.language_model.providers.litellm.services.retry.retry import Retry - -logger = logging.getLogger(__name__) - - -class ExponentialRetry(Retry): - """LiteLLM Exponential Retry Service.""" - - def __init__( - self, - *, - max_retries: int = 5, - base_delay: float = 2.0, - jitter: bool = True, - **kwargs: Any, - ): - if max_retries <= 0: - msg = "max_retries must be greater than 0." - raise ValueError(msg) - - if base_delay <= 1.0: - msg = "base_delay must be greater than 1.0." - raise ValueError(msg) - - self._max_retries = max_retries - self._base_delay = base_delay - self._jitter = jitter - - def retry(self, func: Callable[..., Any], **kwargs: Any) -> Any: - """Retry a synchronous function.""" - retries = 0 - delay = 1.0 # Initial delay in seconds - while True: - try: - return func(**kwargs) - except Exception as e: - if retries >= self._max_retries: - logger.exception( - f"ExponentialRetry: Max retries exceeded, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - raise - retries += 1 - delay *= self._base_delay - logger.exception( - f"ExponentialRetry: Request failed, retrying, retries={retries}, delay={delay}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - time.sleep(delay + (self._jitter * random.uniform(0, 1))) # noqa: S311 - - async def aretry( - self, - func: Callable[..., Awaitable[Any]], - **kwargs: Any, - ) -> Any: - """Retry an asynchronous function.""" - retries = 0 - delay = 1.0 # Initial delay in seconds - while True: - try: - return await func(**kwargs) - except Exception as e: - if retries >= self._max_retries: - logger.exception( - f"ExponentialRetry: Max retries exceeded, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - raise - retries += 1 - delay *= self._base_delay - logger.exception( - f"ExponentialRetry: Request failed, retrying, retries={retries}, delay={delay}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - await asyncio.sleep(delay + (self._jitter * random.uniform(0, 1))) # noqa: S311 diff --git a/graphrag/language_model/providers/litellm/services/retry/incremental_wait_retry.py b/graphrag/language_model/providers/litellm/services/retry/incremental_wait_retry.py deleted file mode 100644 index 97fbdbf9c9..0000000000 --- a/graphrag/language_model/providers/litellm/services/retry/incremental_wait_retry.py +++ /dev/null @@ -1,81 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Incremental Wait Retry Service.""" - -import asyncio -import logging -import time -from collections.abc import Awaitable, Callable -from typing import Any - -from graphrag.language_model.providers.litellm.services.retry.retry import Retry - -logger = logging.getLogger(__name__) - - -class IncrementalWaitRetry(Retry): - """LiteLLM Incremental Wait Retry Service.""" - - def __init__( - self, - *, - max_retry_wait: float, - max_retries: int = 5, - **kwargs: Any, - ): - if max_retries <= 0: - msg = "max_retries must be greater than 0." - raise ValueError(msg) - - if max_retry_wait <= 0: - msg = "max_retry_wait must be greater than 0." - raise ValueError(msg) - - self._max_retries = max_retries - self._max_retry_wait = max_retry_wait - self._increment = max_retry_wait / max_retries - - def retry(self, func: Callable[..., Any], **kwargs: Any) -> Any: - """Retry a synchronous function.""" - retries = 0 - delay = 0.0 - while True: - try: - return func(**kwargs) - except Exception as e: - if retries >= self._max_retries: - logger.exception( - f"IncrementalWaitRetry: Max retries exceeded, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - raise - retries += 1 - delay += self._increment - logger.exception( - f"IncrementalWaitRetry: Request failed, retrying after incremental delay, retries={retries}, delay={delay}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - time.sleep(delay) - - async def aretry( - self, - func: Callable[..., Awaitable[Any]], - **kwargs: Any, - ) -> Any: - """Retry an asynchronous function.""" - retries = 0 - delay = 0.0 - while True: - try: - return await func(**kwargs) - except Exception as e: - if retries >= self._max_retries: - logger.exception( - f"IncrementalWaitRetry: Max retries exceeded, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - raise - retries += 1 - delay += self._increment - logger.exception( - f"IncrementalWaitRetry: Request failed, retrying after incremental delay, retries={retries}, delay={delay}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - await asyncio.sleep(delay) diff --git a/graphrag/language_model/providers/litellm/services/retry/native_wait_retry.py b/graphrag/language_model/providers/litellm/services/retry/native_wait_retry.py deleted file mode 100644 index 088f454213..0000000000 --- a/graphrag/language_model/providers/litellm/services/retry/native_wait_retry.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Native Retry Service.""" - -import logging -from collections.abc import Awaitable, Callable -from typing import Any - -from graphrag.language_model.providers.litellm.services.retry.retry import Retry - -logger = logging.getLogger(__name__) - - -class NativeRetry(Retry): - """LiteLLM Native Retry Service.""" - - def __init__( - self, - *, - max_retries: int = 5, - **kwargs: Any, - ): - if max_retries <= 0: - msg = "max_retries must be greater than 0." - raise ValueError(msg) - - self._max_retries = max_retries - - def retry(self, func: Callable[..., Any], **kwargs: Any) -> Any: - """Retry a synchronous function.""" - retries = 0 - while True: - try: - return func(**kwargs) - except Exception as e: - if retries >= self._max_retries: - logger.exception( - f"NativeRetry: Max retries exceeded, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - raise - retries += 1 - logger.exception( - f"NativeRetry: Request failed, immediately retrying, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - - async def aretry( - self, - func: Callable[..., Awaitable[Any]], - **kwargs: Any, - ) -> Any: - """Retry an asynchronous function.""" - retries = 0 - while True: - try: - return await func(**kwargs) - except Exception as e: - if retries >= self._max_retries: - logger.exception( - f"NativeRetry: Max retries exceeded, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - raise - retries += 1 - logger.exception( - f"NativeRetry: Request failed, immediately retrying, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) diff --git a/graphrag/language_model/providers/litellm/services/retry/random_wait_retry.py b/graphrag/language_model/providers/litellm/services/retry/random_wait_retry.py deleted file mode 100644 index 603f439d1f..0000000000 --- a/graphrag/language_model/providers/litellm/services/retry/random_wait_retry.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Random Wait Retry Service.""" - -import asyncio -import logging -import random -import time -from collections.abc import Awaitable, Callable -from typing import Any - -from graphrag.language_model.providers.litellm.services.retry.retry import Retry - -logger = logging.getLogger(__name__) - - -class RandomWaitRetry(Retry): - """LiteLLM Random Wait Retry Service.""" - - def __init__( - self, - *, - max_retry_wait: float, - max_retries: int = 5, - **kwargs: Any, - ): - if max_retries <= 0: - msg = "max_retries must be greater than 0." - raise ValueError(msg) - - if max_retry_wait <= 0: - msg = "max_retry_wait must be greater than 0." - raise ValueError(msg) - - self._max_retries = max_retries - self._max_retry_wait = max_retry_wait - - def retry(self, func: Callable[..., Any], **kwargs: Any) -> Any: - """Retry a synchronous function.""" - retries = 0 - while True: - try: - return func(**kwargs) - except Exception as e: - if retries >= self._max_retries: - logger.exception( - f"RandomWaitRetry: Max retries exceeded, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - raise - retries += 1 - delay = random.uniform(0, self._max_retry_wait) # noqa: S311 - logger.exception( - f"RandomWaitRetry: Request failed, retrying after random delay, retries={retries}, delay={delay}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - time.sleep(delay) - - async def aretry( - self, - func: Callable[..., Awaitable[Any]], - **kwargs: Any, - ) -> Any: - """Retry an asynchronous function.""" - retries = 0 - while True: - try: - return await func(**kwargs) - except Exception as e: - if retries >= self._max_retries: - logger.exception( - f"RandomWaitRetry: Max retries exceeded, retries={retries}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - raise - retries += 1 - delay = random.uniform(0, self._max_retry_wait) # noqa: S311 - logger.exception( - f"RandomWaitRetry: Request failed, retrying after random delay, retries={retries}, delay={delay}, max_retries={self._max_retries}, exception={e}", # noqa: G004, TRY401 - ) - await asyncio.sleep(delay) diff --git a/graphrag/language_model/providers/litellm/services/retry/retry.py b/graphrag/language_model/providers/litellm/services/retry/retry.py deleted file mode 100644 index 4f53e598c6..0000000000 --- a/graphrag/language_model/providers/litellm/services/retry/retry.py +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Retry Abstract Base Class.""" - -from abc import ABC, abstractmethod -from collections.abc import Awaitable, Callable -from typing import Any - - -class Retry(ABC): - """LiteLLM Retry Abstract Base Class.""" - - @abstractmethod - def __init__(self, /, **kwargs: Any): - msg = "Retry subclasses must implement the __init__ method." - raise NotImplementedError(msg) - - @abstractmethod - def retry(self, func: Callable[..., Any], **kwargs: Any) -> Any: - """Retry a synchronous function.""" - msg = "Subclasses must implement this method" - raise NotImplementedError(msg) - - @abstractmethod - async def aretry( - self, - func: Callable[..., Awaitable[Any]], - **kwargs: Any, - ) -> Any: - """Retry an asynchronous function.""" - msg = "Subclasses must implement this method" - raise NotImplementedError(msg) diff --git a/graphrag/language_model/providers/litellm/services/retry/retry_factory.py b/graphrag/language_model/providers/litellm/services/retry/retry_factory.py deleted file mode 100644 index 15b3318630..0000000000 --- a/graphrag/language_model/providers/litellm/services/retry/retry_factory.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM Retry Factory.""" - -from graphrag.config.defaults import DEFAULT_RETRY_SERVICES -from graphrag.factory.factory import Factory -from graphrag.language_model.providers.litellm.services.retry.retry import Retry - - -class RetryFactory(Factory[Retry]): - """Singleton factory for creating retry services.""" - - -retry_factory = RetryFactory() - -for service_name, service_cls in DEFAULT_RETRY_SERVICES.items(): - retry_factory.register(strategy=service_name, service_initializer=service_cls) diff --git a/graphrag/language_model/providers/litellm/types.py b/graphrag/language_model/providers/litellm/types.py deleted file mode 100644 index cec39b13e2..0000000000 --- a/graphrag/language_model/providers/litellm/types.py +++ /dev/null @@ -1,235 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""LiteLLM types.""" - -from typing import ( - Any, - Protocol, - runtime_checkable, -) - -from litellm import ( - AnthropicThinkingParam, - BaseModel, - ChatCompletionAudioParam, - ChatCompletionModality, - ChatCompletionPredictionContentParam, - CustomStreamWrapper, - EmbeddingResponse, # type: ignore - ModelResponse, # type: ignore - OpenAIWebSearchOptions, -) -from openai.types.chat.chat_completion import ( - ChatCompletion, - Choice, -) -from openai.types.chat.chat_completion_chunk import ChatCompletionChunk, ChoiceDelta -from openai.types.chat.chat_completion_chunk import Choice as ChunkChoice -from openai.types.chat.chat_completion_message import ChatCompletionMessage -from openai.types.chat.chat_completion_message_param import ChatCompletionMessageParam -from openai.types.completion_usage import ( - CompletionTokensDetails, - CompletionUsage, - PromptTokensDetails, -) -from openai.types.create_embedding_response import CreateEmbeddingResponse, Usage -from openai.types.embedding import Embedding - -LMChatCompletionMessageParam = ChatCompletionMessageParam | dict[str, str] - -LMChatCompletion = ChatCompletion -LMChoice = Choice -LMChatCompletionMessage = ChatCompletionMessage - -LMChatCompletionChunk = ChatCompletionChunk -LMChoiceChunk = ChunkChoice -LMChoiceDelta = ChoiceDelta - -LMCompletionUsage = CompletionUsage -LMPromptTokensDetails = PromptTokensDetails -LMCompletionTokensDetails = CompletionTokensDetails - - -LMEmbeddingResponse = CreateEmbeddingResponse -LMEmbedding = Embedding -LMEmbeddingUsage = Usage - - -@runtime_checkable -class FixedModelCompletion(Protocol): - """ - Synchronous chat completion function. - - Same signature as litellm.completion but without the `model` parameter - as this is already set in the model configuration. - """ - - def __call__( - self, - *, - messages: list = [], # type: ignore # noqa: B006 - stream: bool | None = None, - stream_options: dict | None = None, # type: ignore - stop=None, # type: ignore - max_completion_tokens: int | None = None, - max_tokens: int | None = None, - modalities: list[ChatCompletionModality] | None = None, - prediction: ChatCompletionPredictionContentParam | None = None, - audio: ChatCompletionAudioParam | None = None, - logit_bias: dict | None = None, # type: ignore - user: str | None = None, - # openai v1.0+ new params - response_format: dict | type[BaseModel] | None = None, # type: ignore - seed: int | None = None, - tools: list | None = None, # type: ignore - tool_choice: str | dict | None = None, # type: ignore - logprobs: bool | None = None, - top_logprobs: int | None = None, - parallel_tool_calls: bool | None = None, - web_search_options: OpenAIWebSearchOptions | None = None, - deployment_id=None, # type: ignore - extra_headers: dict | None = None, # type: ignore - # soon to be deprecated params by OpenAI - functions: list | None = None, # type: ignore - function_call: str | None = None, - # Optional liteLLM function params - thinking: AnthropicThinkingParam | None = None, - **kwargs: Any, - ) -> ModelResponse | CustomStreamWrapper: - """Chat completion function.""" - ... - - -@runtime_checkable -class AFixedModelCompletion(Protocol): - """ - Asynchronous chat completion function. - - Same signature as litellm.acompletion but without the `model` parameter - as this is already set in the model configuration. - """ - - async def __call__( - self, - *, - # Optional OpenAI params: see https://platform.openai.com/docs/api-reference/chat/create - messages: list = [], # type: ignore # noqa: B006 - stream: bool | None = None, - stream_options: dict | None = None, # type: ignore - stop=None, # type: ignore - max_completion_tokens: int | None = None, - max_tokens: int | None = None, - modalities: list[ChatCompletionModality] | None = None, - prediction: ChatCompletionPredictionContentParam | None = None, - audio: ChatCompletionAudioParam | None = None, - logit_bias: dict | None = None, # type: ignore - user: str | None = None, - # openai v1.0+ new params - response_format: dict | type[BaseModel] | None = None, # type: ignore - seed: int | None = None, - tools: list | None = None, # type: ignore - tool_choice: str | dict | None = None, # type: ignore - logprobs: bool | None = None, - top_logprobs: int | None = None, - parallel_tool_calls: bool | None = None, - web_search_options: OpenAIWebSearchOptions | None = None, - deployment_id=None, # type: ignore - extra_headers: dict | None = None, # type: ignore - # soon to be deprecated params by OpenAI - functions: list | None = None, # type: ignore - function_call: str | None = None, - # Optional liteLLM function params - thinking: AnthropicThinkingParam | None = None, - **kwargs: Any, - ) -> ModelResponse | CustomStreamWrapper: - """Chat completion function.""" - ... - - -@runtime_checkable -class FixedModelEmbedding(Protocol): - """ - Synchronous embedding function. - - Same signature as litellm.embedding but without the `model` parameter - as this is already set in the model configuration. - """ - - def __call__( - self, - *, - request_id: str | None = None, - input: list = [], # type: ignore # noqa: B006 - # Optional params - dimensions: int | None = None, - encoding_format: str | None = None, - timeout: int = 600, # default to 10 minutes - # set api_base, api_version, api_key - api_base: str | None = None, - api_version: str | None = None, - api_key: str | None = None, - api_type: str | None = None, - caching: bool = False, - user: str | None = None, - **kwargs: Any, - ) -> EmbeddingResponse: - """Embedding function.""" - ... - - -@runtime_checkable -class AFixedModelEmbedding(Protocol): - """ - Asynchronous embedding function. - - Same signature as litellm.embedding but without the `model` parameter - as this is already set in the model configuration. - """ - - async def __call__( - self, - *, - request_id: str | None = None, - input: list = [], # type: ignore # noqa: B006 - # Optional params - dimensions: int | None = None, - encoding_format: str | None = None, - timeout: int = 600, # default to 10 minutes - # set api_base, api_version, api_key - api_base: str | None = None, - api_version: str | None = None, - api_key: str | None = None, - api_type: str | None = None, - caching: bool = False, - user: str | None = None, - **kwargs: Any, - ) -> EmbeddingResponse: - """Embedding function.""" - ... - - -@runtime_checkable -class LitellmRequestFunc(Protocol): - """ - Synchronous request function. - - Represents either a chat completion or embedding function. - """ - - def __call__(self, /, **kwargs: Any) -> Any: - """Request function.""" - ... - - -@runtime_checkable -class AsyncLitellmRequestFunc(Protocol): - """ - Asynchronous request function. - - Represents either a chat completion or embedding function. - """ - - async def __call__(self, /, **kwargs: Any) -> Any: - """Request function.""" - ... diff --git a/graphrag/language_model/response/__init__.py b/graphrag/language_model/response/__init__.py deleted file mode 100644 index 3c4721caab..0000000000 --- a/graphrag/language_model/response/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing Model response definitions.""" diff --git a/graphrag/language_model/response/base.py b/graphrag/language_model/response/base.py deleted file mode 100644 index 178259c4b7..0000000000 --- a/graphrag/language_model/response/base.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""Base llm response protocol.""" - -from typing import Any, Generic, Protocol, TypeVar - -from pydantic import BaseModel, Field - -T = TypeVar("T", bound=BaseModel, covariant=True) - - -class ModelOutput(Protocol): - """Protocol for Model response's output object.""" - - @property - def content(self) -> str: - """Return the textual content of the output.""" - ... - - @property - def full_response(self) -> dict[str, Any] | None: - """Return the complete JSON response returned by the model.""" - ... - - -class ModelResponse(Protocol, Generic[T]): - """Protocol for LLM response.""" - - @property - def output(self) -> ModelOutput: - """Return the output of the response.""" - ... - - @property - def parsed_response(self) -> T | None: - """Return the parsed response.""" - ... - - @property - def history(self) -> list: - """Return the history of the response.""" - ... - - -class BaseModelOutput(BaseModel): - """Base class for LLM output.""" - - content: str = Field(..., description="The textual content of the output.") - """The textual content of the output.""" - full_response: dict[str, Any] | None = Field( - None, description="The complete JSON response returned by the LLM provider." - ) - """The complete JSON response returned by the LLM provider.""" - - -class BaseModelResponse(BaseModel, Generic[T]): - """Base class for a Model response.""" - - output: BaseModelOutput - """""" - parsed_response: T | None = None - """Parsed response.""" - history: list[Any] = Field(default_factory=list) - """History of the response.""" - tool_calls: list = Field(default_factory=list) - """Tool calls required by the Model. These will be instances of the LLM tools (with filled parameters).""" - metrics: Any | None = None - """Request/response metrics.""" - cache_hit: bool | None = None - """Whether the response was a cache hit.""" diff --git a/graphrag/language_model/response/base.pyi b/graphrag/language_model/response/base.pyi deleted file mode 100644 index 7a33b0a304..0000000000 --- a/graphrag/language_model/response/base.pyi +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -from typing import Any, Generic, Protocol, TypeVar - -from pydantic import BaseModel - -_T = TypeVar("_T", bound=BaseModel, covariant=True) - -class ModelOutput(Protocol): - @property - def content(self) -> str: ... - @property - def full_response(self) -> dict[str, Any] | None: ... - -class ModelResponse(Protocol, Generic[_T]): - @property - def output(self) -> ModelOutput: ... - @property - def parsed_response(self) -> _T | None: ... - @property - def history(self) -> list[Any]: ... - -class BaseModelOutput(BaseModel): - content: str - full_response: dict[str, Any] | None - - def __init__( - self, - content: str, - full_response: dict[str, Any] | None = None, - ) -> None: ... - -class BaseModelResponse(BaseModel, Generic[_T]): - output: BaseModelOutput - parsed_response: _T | None - history: list[Any] - tool_calls: list[Any] - metrics: Any | None - cache_hit: bool | None - - def __init__( - self, - output: BaseModelOutput, - parsed_response: _T | None = None, - history: list[Any] = ..., # default provided by Pydantic - tool_calls: list[Any] = ..., # default provided by Pydantic - metrics: Any | None = None, - cache_hit: bool | None = None, - ) -> None: ... diff --git a/graphrag/logger/factory.py b/graphrag/logger/factory.py deleted file mode 100644 index 03245d1bb0..0000000000 --- a/graphrag/logger/factory.py +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Factory functions for creating a logger.""" - -from __future__ import annotations - -import logging -from pathlib import Path -from typing import TYPE_CHECKING, ClassVar - -from graphrag.config.enums import ReportingType - -if TYPE_CHECKING: - from collections.abc import Callable - -LOG_FORMAT = "%(asctime)s.%(msecs)04d - %(levelname)s - %(name)s - %(message)s" -DATE_FORMAT = "%Y-%m-%d %H:%M:%S" - - -class LoggerFactory: - """A factory class for logger implementations. - - Includes a method for users to register a custom logger implementation. - - Configuration arguments are passed to each logger implementation as kwargs - for individual enforcement of required/optional arguments. - - Note that because we rely on the built-in Python logging architecture, this factory does not return an instance, - it merely configures the logger to your specified storage location. - """ - - _registry: ClassVar[dict[str, Callable[..., logging.Handler]]] = {} - - @classmethod - def register( - cls, reporting_type: str, creator: Callable[..., logging.Handler] - ) -> None: - """Register a custom logger implementation. - - Args: - reporting_type: The type identifier for the logger. - creator: A class or callable that initializes logging. - """ - cls._registry[reporting_type] = creator - - @classmethod - def create_logger(cls, reporting_type: str, kwargs: dict) -> logging.Handler: - """Create a logger from the provided type. - - Args: - reporting_type: The type of logger to create. - logger: The logger instance for the application. - kwargs: Additional keyword arguments for the constructor. - - Returns - ------- - A logger instance. - - Raises - ------ - ValueError: If the logger type is not registered. - """ - if reporting_type not in cls._registry: - msg = f"Unknown reporting type: {reporting_type}" - raise ValueError(msg) - - return cls._registry[reporting_type](**kwargs) - - @classmethod - def get_logger_types(cls) -> list[str]: - """Get the registered logger implementations.""" - return list(cls._registry.keys()) - - @classmethod - def is_supported_type(cls, reporting_type: str) -> bool: - """Check if the given logger type is supported.""" - return reporting_type in cls._registry - - -# --- register built-in logger implementations --- -def create_file_logger(**kwargs) -> logging.Handler: - """Create a file-based logger.""" - root_dir = kwargs["root_dir"] - base_dir = kwargs["base_dir"] - filename = kwargs["filename"] - log_dir = Path(root_dir) / base_dir - log_dir.mkdir(parents=True, exist_ok=True) - log_file_path = log_dir / filename - - handler = logging.FileHandler(str(log_file_path), mode="a") - - formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=DATE_FORMAT) - handler.setFormatter(formatter) - - return handler - - -def create_blob_logger(**kwargs) -> logging.Handler: - """Create a blob storage-based logger.""" - from graphrag.logger.blob_workflow_logger import BlobWorkflowLogger - - return BlobWorkflowLogger( - connection_string=kwargs["connection_string"], - container_name=kwargs["container_name"], - base_dir=kwargs["base_dir"], - storage_account_blob_url=kwargs["storage_account_blob_url"], - ) - - -# --- register built-in implementations --- -LoggerFactory.register(ReportingType.file.value, create_file_logger) -LoggerFactory.register(ReportingType.blob.value, create_blob_logger) diff --git a/graphrag/prompts/index/extract_graph.py b/graphrag/prompts/index/extract_graph.py deleted file mode 100644 index a94b36142e..0000000000 --- a/graphrag/prompts/index/extract_graph.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A file containing prompts definition.""" - -GRAPH_EXTRACTION_PROMPT = """ --Goal- -Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities. - --Steps- -1. Identify all entities. For each identified entity, extract the following information: -- entity_name: Name of the entity, capitalized -- entity_type: One of the following types: [{entity_types}] -- entity_description: Comprehensive description of the entity's attributes and activities -Format each entity as ("entity"{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) - -2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. -For each pair of related entities, extract the following information: -- source_entity: name of the source entity, as identified in step 1 -- target_entity: name of the target entity, as identified in step 1 -- relationship_description: explanation as to why you think the source entity and the target entity are related to each other -- relationship_strength: a numeric score indicating strength of the relationship between the source entity and target entity - Format each relationship as ("relationship"{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) - -3. Return output in English as a single list of all the entities and relationships identified in steps 1 and 2. Use **{record_delimiter}** as the list delimiter. - -4. When finished, output {completion_delimiter} - -###################### --Examples- -###################### -Example 1: -Entity_types: ORGANIZATION,PERSON -Text: -The Verdantis's Central Institution is scheduled to meet on Monday and Thursday, with the institution planning to release its latest policy decision on Thursday at 1:30 p.m. PDT, followed by a press conference where Central Institution Chair Martin Smith will take questions. Investors expect the Market Strategy Committee to hold its benchmark interest rate steady in a range of 3.5%-3.75%. -###################### -Output: -("entity"{tuple_delimiter}CENTRAL INSTITUTION{tuple_delimiter}ORGANIZATION{tuple_delimiter}The Central Institution is the Federal Reserve of Verdantis, which is setting interest rates on Monday and Thursday) -{record_delimiter} -("entity"{tuple_delimiter}MARTIN SMITH{tuple_delimiter}PERSON{tuple_delimiter}Martin Smith is the chair of the Central Institution) -{record_delimiter} -("entity"{tuple_delimiter}MARKET STRATEGY COMMITTEE{tuple_delimiter}ORGANIZATION{tuple_delimiter}The Central Institution committee makes key decisions about interest rates and the growth of Verdantis's money supply) -{record_delimiter} -("relationship"{tuple_delimiter}MARTIN SMITH{tuple_delimiter}CENTRAL INSTITUTION{tuple_delimiter}Martin Smith is the Chair of the Central Institution and will answer questions at a press conference{tuple_delimiter}9) -{completion_delimiter} - -###################### -Example 2: -Entity_types: ORGANIZATION -Text: -TechGlobal's (TG) stock skyrocketed in its opening day on the Global Exchange Thursday. But IPO experts warn that the semiconductor corporation's debut on the public markets isn't indicative of how other newly listed companies may perform. - -TechGlobal, a formerly public company, was taken private by Vision Holdings in 2014. The well-established chip designer says it powers 85% of premium smartphones. -###################### -Output: -("entity"{tuple_delimiter}TECHGLOBAL{tuple_delimiter}ORGANIZATION{tuple_delimiter}TechGlobal is a stock now listed on the Global Exchange which powers 85% of premium smartphones) -{record_delimiter} -("entity"{tuple_delimiter}VISION HOLDINGS{tuple_delimiter}ORGANIZATION{tuple_delimiter}Vision Holdings is a firm that previously owned TechGlobal) -{record_delimiter} -("relationship"{tuple_delimiter}TECHGLOBAL{tuple_delimiter}VISION HOLDINGS{tuple_delimiter}Vision Holdings formerly owned TechGlobal from 2014 until present{tuple_delimiter}5) -{completion_delimiter} - -###################### -Example 3: -Entity_types: ORGANIZATION,GEO,PERSON -Text: -Five Aurelians jailed for 8 years in Firuzabad and widely regarded as hostages are on their way home to Aurelia. - -The swap orchestrated by Quintara was finalized when $8bn of Firuzi funds were transferred to financial institutions in Krohaara, the capital of Quintara. - -The exchange initiated in Firuzabad's capital, Tiruzia, led to the four men and one woman, who are also Firuzi nationals, boarding a chartered flight to Krohaara. - -They were welcomed by senior Aurelian officials and are now on their way to Aurelia's capital, Cashion. - -The Aurelians include 39-year-old businessman Samuel Namara, who has been held in Tiruzia's Alhamia Prison, as well as journalist Durke Bataglani, 59, and environmentalist Meggie Tazbah, 53, who also holds Bratinas nationality. -###################### -Output: -("entity"{tuple_delimiter}FIRUZABAD{tuple_delimiter}GEO{tuple_delimiter}Firuzabad held Aurelians as hostages) -{record_delimiter} -("entity"{tuple_delimiter}AURELIA{tuple_delimiter}GEO{tuple_delimiter}Country seeking to release hostages) -{record_delimiter} -("entity"{tuple_delimiter}QUINTARA{tuple_delimiter}GEO{tuple_delimiter}Country that negotiated a swap of money in exchange for hostages) -{record_delimiter} -{record_delimiter} -("entity"{tuple_delimiter}TIRUZIA{tuple_delimiter}GEO{tuple_delimiter}Capital of Firuzabad where the Aurelians were being held) -{record_delimiter} -("entity"{tuple_delimiter}KROHAARA{tuple_delimiter}GEO{tuple_delimiter}Capital city in Quintara) -{record_delimiter} -("entity"{tuple_delimiter}CASHION{tuple_delimiter}GEO{tuple_delimiter}Capital city in Aurelia) -{record_delimiter} -("entity"{tuple_delimiter}SAMUEL NAMARA{tuple_delimiter}PERSON{tuple_delimiter}Aurelian who spent time in Tiruzia's Alhamia Prison) -{record_delimiter} -("entity"{tuple_delimiter}ALHAMIA PRISON{tuple_delimiter}GEO{tuple_delimiter}Prison in Tiruzia) -{record_delimiter} -("entity"{tuple_delimiter}DURKE BATAGLANI{tuple_delimiter}PERSON{tuple_delimiter}Aurelian journalist who was held hostage) -{record_delimiter} -("entity"{tuple_delimiter}MEGGIE TAZBAH{tuple_delimiter}PERSON{tuple_delimiter}Bratinas national and environmentalist who was held hostage) -{record_delimiter} -("relationship"{tuple_delimiter}FIRUZABAD{tuple_delimiter}AURELIA{tuple_delimiter}Firuzabad negotiated a hostage exchange with Aurelia{tuple_delimiter}2) -{record_delimiter} -("relationship"{tuple_delimiter}QUINTARA{tuple_delimiter}AURELIA{tuple_delimiter}Quintara brokered the hostage exchange between Firuzabad and Aurelia{tuple_delimiter}2) -{record_delimiter} -("relationship"{tuple_delimiter}QUINTARA{tuple_delimiter}FIRUZABAD{tuple_delimiter}Quintara brokered the hostage exchange between Firuzabad and Aurelia{tuple_delimiter}2) -{record_delimiter} -("relationship"{tuple_delimiter}SAMUEL NAMARA{tuple_delimiter}ALHAMIA PRISON{tuple_delimiter}Samuel Namara was a prisoner at Alhamia prison{tuple_delimiter}8) -{record_delimiter} -("relationship"{tuple_delimiter}SAMUEL NAMARA{tuple_delimiter}MEGGIE TAZBAH{tuple_delimiter}Samuel Namara and Meggie Tazbah were exchanged in the same hostage release{tuple_delimiter}2) -{record_delimiter} -("relationship"{tuple_delimiter}SAMUEL NAMARA{tuple_delimiter}DURKE BATAGLANI{tuple_delimiter}Samuel Namara and Durke Bataglani were exchanged in the same hostage release{tuple_delimiter}2) -{record_delimiter} -("relationship"{tuple_delimiter}MEGGIE TAZBAH{tuple_delimiter}DURKE BATAGLANI{tuple_delimiter}Meggie Tazbah and Durke Bataglani were exchanged in the same hostage release{tuple_delimiter}2) -{record_delimiter} -("relationship"{tuple_delimiter}SAMUEL NAMARA{tuple_delimiter}FIRUZABAD{tuple_delimiter}Samuel Namara was a hostage in Firuzabad{tuple_delimiter}2) -{record_delimiter} -("relationship"{tuple_delimiter}MEGGIE TAZBAH{tuple_delimiter}FIRUZABAD{tuple_delimiter}Meggie Tazbah was a hostage in Firuzabad{tuple_delimiter}2) -{record_delimiter} -("relationship"{tuple_delimiter}DURKE BATAGLANI{tuple_delimiter}FIRUZABAD{tuple_delimiter}Durke Bataglani was a hostage in Firuzabad{tuple_delimiter}2) -{completion_delimiter} - -###################### --Real Data- -###################### -Entity_types: {entity_types} -Text: {input_text} -###################### -Output:""" - -CONTINUE_PROMPT = "MANY entities and relationships were missed in the last extraction. Remember to ONLY emit entities that match any of the previously extracted types. Add them below using the same format:\n" -LOOP_PROMPT = "It appears some entities and relationships may have still been missed. Answer Y if there are still entities or relationships that need to be added, or N if there are none. Please answer with a single letter Y or N.\n" diff --git a/graphrag/storage/factory.py b/graphrag/storage/factory.py deleted file mode 100644 index 89c4eeee0d..0000000000 --- a/graphrag/storage/factory.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Factory functions for creating storage.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, ClassVar - -from graphrag.config.enums import StorageType -from graphrag.storage.blob_pipeline_storage import BlobPipelineStorage -from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage -from graphrag.storage.file_pipeline_storage import FilePipelineStorage -from graphrag.storage.memory_pipeline_storage import MemoryPipelineStorage - -if TYPE_CHECKING: - from collections.abc import Callable - - from graphrag.storage.pipeline_storage import PipelineStorage - - -class StorageFactory: - """A factory class for storage implementations. - - Includes a method for users to register a custom storage implementation. - - Configuration arguments are passed to each storage implementation as kwargs - for individual enforcement of required/optional arguments. - """ - - _registry: ClassVar[dict[str, Callable[..., PipelineStorage]]] = {} - - @classmethod - def register( - cls, storage_type: str, creator: Callable[..., PipelineStorage] - ) -> None: - """Register a custom storage implementation. - - Args: - storage_type: The type identifier for the storage. - creator: A class or callable that creates an instance of PipelineStorage. - - """ - cls._registry[storage_type] = creator - - @classmethod - def create_storage(cls, storage_type: str, kwargs: dict) -> PipelineStorage: - """Create a storage object from the provided type. - - Args: - storage_type: The type of storage to create. - kwargs: Additional keyword arguments for the storage constructor. - - Returns - ------- - A PipelineStorage instance. - - Raises - ------ - ValueError: If the storage type is not registered. - """ - if storage_type not in cls._registry: - msg = f"Unknown storage type: {storage_type}" - raise ValueError(msg) - - return cls._registry[storage_type](**kwargs) - - @classmethod - def get_storage_types(cls) -> list[str]: - """Get the registered storage implementations.""" - return list(cls._registry.keys()) - - @classmethod - def is_supported_type(cls, storage_type: str) -> bool: - """Check if the given storage type is supported.""" - return storage_type in cls._registry - - -# --- register built-in storage implementations --- -StorageFactory.register(StorageType.blob.value, BlobPipelineStorage) -StorageFactory.register(StorageType.cosmosdb.value, CosmosDBPipelineStorage) -StorageFactory.register(StorageType.file.value, FilePipelineStorage) -StorageFactory.register(StorageType.memory.value, MemoryPipelineStorage) diff --git a/graphrag/storage/pipeline_storage.py b/graphrag/storage/pipeline_storage.py deleted file mode 100644 index ed117a577d..0000000000 --- a/graphrag/storage/pipeline_storage.py +++ /dev/null @@ -1,99 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing 'PipelineStorage' model.""" - -import re -from abc import ABCMeta, abstractmethod -from collections.abc import Iterator -from datetime import datetime -from typing import Any - - -class PipelineStorage(metaclass=ABCMeta): - """Provide a storage interface for the pipeline. This is where the pipeline will store its output data.""" - - @abstractmethod - def find( - self, - file_pattern: re.Pattern[str], - base_dir: str | None = None, - file_filter: dict[str, Any] | None = None, - max_count=-1, - ) -> Iterator[tuple[str, dict[str, Any]]]: - """Find files in the storage using a file pattern, as well as a custom filter function.""" - - @abstractmethod - async def get( - self, key: str, as_bytes: bool | None = None, encoding: str | None = None - ) -> Any: - """Get the value for the given key. - - Args: - - key - The key to get the value for. - - as_bytes - Whether or not to return the value as bytes. - - Returns - ------- - - output - The value for the given key. - """ - - @abstractmethod - async def set(self, key: str, value: Any, encoding: str | None = None) -> None: - """Set the value for the given key. - - Args: - - key - The key to set the value for. - - value - The value to set. - """ - - @abstractmethod - async def has(self, key: str) -> bool: - """Return True if the given key exists in the storage. - - Args: - - key - The key to check for. - - Returns - ------- - - output - True if the key exists in the storage, False otherwise. - """ - - @abstractmethod - async def delete(self, key: str) -> None: - """Delete the given key from the storage. - - Args: - - key - The key to delete. - """ - - @abstractmethod - async def clear(self) -> None: - """Clear the storage.""" - - @abstractmethod - def child(self, name: str | None) -> "PipelineStorage": - """Create a child storage instance.""" - - @abstractmethod - def keys(self) -> list[str]: - """List all keys in the storage.""" - - @abstractmethod - async def get_creation_date(self, key: str) -> str: - """Get the creation date for the given key. - - Args: - - key - The key to get the creation date for. - - Returns - ------- - - output - The creation date for the given key. - """ - - -def get_timestamp_formatted_with_local_tz(timestamp: datetime) -> str: - """Get the formatted timestamp with the local time zone.""" - creation_time_local = timestamp.astimezone() - - return creation_time_local.strftime("%Y-%m-%d %H:%M:%S %z") diff --git a/graphrag/tokenizer/tokenizer.py b/graphrag/tokenizer/tokenizer.py deleted file mode 100644 index 32c0b2bd23..0000000000 --- a/graphrag/tokenizer/tokenizer.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Tokenizer Abstract Base Class.""" - -from abc import ABC, abstractmethod - - -class Tokenizer(ABC): - """Tokenizer Abstract Base Class.""" - - @abstractmethod - def encode(self, text: str) -> list[int]: - """Encode the given text into a list of tokens. - - Args - ---- - text (str): The input text to encode. - - Returns - ------- - list[int]: A list of tokens representing the encoded text. - """ - msg = "The encode method must be implemented by subclasses." - raise NotImplementedError(msg) - - @abstractmethod - def decode(self, tokens: list[int]) -> str: - """Decode a list of tokens back into a string. - - Args - ---- - tokens (list[int]): A list of tokens to decode. - - Returns - ------- - str: The decoded string from the list of tokens. - """ - msg = "The decode method must be implemented by subclasses." - raise NotImplementedError(msg) - - def num_tokens(self, text: str) -> int: - """Return the number of tokens in the given text. - - Args - ---- - text (str): The input text to analyze. - - Returns - ------- - int: The number of tokens in the input text. - """ - return len(self.encode(text)) diff --git a/graphrag/utils/api.py b/graphrag/utils/api.py deleted file mode 100644 index db3d94790d..0000000000 --- a/graphrag/utils/api.py +++ /dev/null @@ -1,287 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""API functions for the GraphRAG module.""" - -from pathlib import Path -from typing import Any - -from graphrag.cache.factory import CacheFactory -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.config.embeddings import create_index_name -from graphrag.config.models.cache_config import CacheConfig -from graphrag.config.models.storage_config import StorageConfig -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.data_model.types import TextEmbedder -from graphrag.storage.factory import StorageFactory -from graphrag.storage.pipeline_storage import PipelineStorage -from graphrag.vector_stores.base import ( - BaseVectorStore, - VectorStoreDocument, - VectorStoreSearchResult, -) -from graphrag.vector_stores.factory import VectorStoreFactory - - -class MultiVectorStore(BaseVectorStore): - """Multi Vector Store wrapper implementation.""" - - def __init__( - self, - embedding_stores: list[BaseVectorStore], - index_names: list[str], - ): - self.embedding_stores = embedding_stores - self.index_names = index_names - - def load_documents( - self, documents: list[VectorStoreDocument], overwrite: bool = True - ) -> None: - """Load documents into the vector store.""" - msg = "load_documents method not implemented" - raise NotImplementedError(msg) - - def connect(self, **kwargs: Any) -> Any: - """Connect to vector storage.""" - msg = "connect method not implemented" - raise NotImplementedError(msg) - - def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: - """Build a query filter to filter documents by id.""" - msg = "filter_by_id method not implemented" - raise NotImplementedError(msg) - - def search_by_id(self, id: str) -> VectorStoreDocument: - """Search for a document by id.""" - search_index_id = id.split("-")[0] - search_index_name = id.split("-")[1] - for index_name, embedding_store in zip( - self.index_names, self.embedding_stores, strict=False - ): - if index_name == search_index_name: - return embedding_store.search_by_id(search_index_id) - else: - message = f"Index {search_index_name} not found." - raise ValueError(message) - - def similarity_search_by_vector( - self, query_embedding: list[float], k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform a vector-based similarity search.""" - all_results = [] - for index_name, embedding_store in zip( - self.index_names, self.embedding_stores, strict=False - ): - results = embedding_store.similarity_search_by_vector( - query_embedding=query_embedding, k=k - ) - mod_results = [] - for r in results: - r.document.id = str(r.document.id) + f"-{index_name}" - mod_results += [r] - all_results += mod_results - return sorted(all_results, key=lambda x: x.score, reverse=True)[:k] - - def similarity_search_by_text( - self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform a text-based similarity search.""" - query_embedding = text_embedder(text) - if query_embedding: - return self.similarity_search_by_vector( - query_embedding=query_embedding, k=k - ) - return [] - - -def get_embedding_store( - config_args: dict[str, dict], - embedding_name: str, -) -> BaseVectorStore: - """Get the embedding description store.""" - num_indexes = len(config_args) - embedding_stores = [] - index_names = [] - for index, store in config_args.items(): - vector_store_type = store["type"] - index_name = create_index_name( - store.get("container_name", "default"), embedding_name - ) - - embeddings_schema: dict[str, VectorStoreSchemaConfig] = store.get( - "embeddings_schema", {} - ) - single_embedding_config: VectorStoreSchemaConfig = VectorStoreSchemaConfig() - - if ( - embeddings_schema is not None - and embedding_name is not None - and embedding_name in embeddings_schema - ): - raw_config = embeddings_schema[embedding_name] - if isinstance(raw_config, dict): - single_embedding_config = VectorStoreSchemaConfig(**raw_config) - else: - single_embedding_config = raw_config - - if single_embedding_config.index_name is None: - single_embedding_config.index_name = index_name - - embedding_store = VectorStoreFactory().create_vector_store( - vector_store_type=vector_store_type, - vector_store_schema_config=single_embedding_config, - **store, - ) - embedding_store.connect(**store) - # If there is only a single index, return the embedding store directly - if num_indexes == 1: - return embedding_store - embedding_stores.append(embedding_store) - index_names.append(index) - return MultiVectorStore(embedding_stores, index_names) - - -def reformat_context_data(context_data: dict) -> dict: - """ - Reformats context_data for all query responses. - - Reformats a dictionary of dataframes into a dictionary of lists. - One list entry for each record. Records are grouped by original - dictionary keys. - - Note: depending on which query algorithm is used, the context_data may not - contain the same information (keys). In this case, the default behavior will be to - set these keys as empty lists to preserve a standard output format. - """ - final_format = { - "reports": [], - "entities": [], - "relationships": [], - "claims": [], - "sources": [], - } - for key in context_data: - records = ( - context_data[key].to_dict(orient="records") - if context_data[key] is not None and not isinstance(context_data[key], dict) - else context_data[key] - ) - if len(records) < 1: - continue - final_format[key] = records - return final_format - - -def update_context_data( - context_data: Any, - links: dict[str, Any], -) -> Any: - """ - Update context data with the links dict so that it contains both the index name and community id. - - Parameters - ---------- - - context_data (str | list[pd.DataFrame] | dict[str, pd.DataFrame]): The context data to update. - - links (dict[str, Any]): A dictionary of links to the original dataframes. - - Returns - ------- - str | list[pd.DataFrame] | dict[str, pd.DataFrame]: The updated context data. - """ - updated_context_data = {} - for key in context_data: - entries = context_data[key].to_dict(orient="records") - updated_entry = [] - if key == "reports": - updated_entry = [ - dict( - entry, - index_name=links["community_reports"][int(entry["id"])][ - "index_name" - ], - index_id=links["community_reports"][int(entry["id"])]["id"], - ) - for entry in entries - ] - if key == "entities": - updated_entry = [ - dict( - entry, - entity=entry["entity"].split("-")[0], - index_name=links["entities"][int(entry["id"])]["index_name"], - index_id=links["entities"][int(entry["id"])]["id"], - ) - for entry in entries - ] - if key == "relationships": - updated_entry = [ - dict( - entry, - source=entry["source"].split("-")[0], - target=entry["target"].split("-")[0], - index_name=links["relationships"][int(entry["id"])]["index_name"], - index_id=links["relationships"][int(entry["id"])]["id"], - ) - for entry in entries - ] - if key == "claims": - updated_entry = [ - dict( - entry, - entity=entry["entity"].split("-")[0], - index_name=links["covariates"][int(entry["id"])]["index_name"], - index_id=links["covariates"][int(entry["id"])]["id"], - ) - for entry in entries - ] - if key == "sources": - updated_entry = [ - dict( - entry, - index_name=links["text_units"][int(entry["id"])]["index_name"], - index_id=links["text_units"][int(entry["id"])]["id"], - ) - for entry in entries - ] - updated_context_data[key] = updated_entry - return updated_context_data - - -def load_search_prompt(root_dir: str, prompt_config: str | None) -> str | None: - """ - Load the search prompt from disk if configured. - - If not, leave it empty - the search functions will load their defaults. - - """ - if prompt_config: - prompt_file = Path(root_dir) / prompt_config - if prompt_file.exists(): - return prompt_file.read_bytes().decode(encoding="utf-8") - return None - - -def create_storage_from_config(output: StorageConfig) -> PipelineStorage: - """Create a storage object from the config.""" - storage_config = output.model_dump() - return StorageFactory().create_storage( - storage_type=storage_config["type"], - kwargs=storage_config, - ) - - -def create_cache_from_config(cache: CacheConfig, root_dir: str) -> PipelineCache: - """Create a cache object from the config.""" - cache_config = cache.model_dump() - kwargs = {**cache_config, "root_dir": root_dir} - return CacheFactory().create_cache( - cache_type=cache_config["type"], - kwargs=kwargs, - ) - - -def truncate(text: str, max_length: int) -> str: - """Truncate a string to a maximum length.""" - if len(text) <= max_length: - return text - return text[:max_length] + "...[truncated]" diff --git a/graphrag/vector_stores/__init__.py b/graphrag/vector_stores/__init__.py deleted file mode 100644 index 4f137d07bb..0000000000 --- a/graphrag/vector_stores/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A package containing vector store implementations.""" diff --git a/graphrag/vector_stores/azure_ai_search.py b/graphrag/vector_stores/azure_ai_search.py deleted file mode 100644 index 3adce873ef..0000000000 --- a/graphrag/vector_stores/azure_ai_search.py +++ /dev/null @@ -1,214 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""A package containing the Azure AI Search vector store implementation.""" - -import json -from typing import Any - -from azure.core.credentials import AzureKeyCredential -from azure.identity import DefaultAzureCredential -from azure.search.documents import SearchClient -from azure.search.documents.indexes import SearchIndexClient -from azure.search.documents.indexes.models import ( - HnswAlgorithmConfiguration, - HnswParameters, - SearchableField, - SearchField, - SearchFieldDataType, - SearchIndex, - SimpleField, - VectorSearch, - VectorSearchAlgorithmMetric, - VectorSearchProfile, -) -from azure.search.documents.models import VectorizedQuery - -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.data_model.types import TextEmbedder -from graphrag.vector_stores.base import ( - BaseVectorStore, - VectorStoreDocument, - VectorStoreSearchResult, -) - - -class AzureAISearchVectorStore(BaseVectorStore): - """Azure AI Search vector storage implementation.""" - - index_client: SearchIndexClient - - def __init__( - self, vector_store_schema_config: VectorStoreSchemaConfig, **kwargs: Any - ) -> None: - super().__init__( - vector_store_schema_config=vector_store_schema_config, **kwargs - ) - - def connect(self, **kwargs: Any) -> Any: - """Connect to AI search vector storage.""" - url = kwargs["url"] - api_key = kwargs.get("api_key") - audience = kwargs.get("audience") - - self.vector_search_profile_name = kwargs.get( - "vector_search_profile_name", "vectorSearchProfile" - ) - - if url: - audience_arg = {"audience": audience} if audience and not api_key else {} - self.db_connection = SearchClient( - endpoint=url, - index_name=self.index_name if self.index_name else "", - credential=( - AzureKeyCredential(api_key) if api_key else DefaultAzureCredential() - ), - **audience_arg, - ) - self.index_client = SearchIndexClient( - endpoint=url, - credential=( - AzureKeyCredential(api_key) if api_key else DefaultAzureCredential() - ), - **audience_arg, - ) - else: - not_supported_error = "Azure AI Search expects `url`." - raise ValueError(not_supported_error) - - def load_documents( - self, documents: list[VectorStoreDocument], overwrite: bool = True - ) -> None: - """Load documents into an Azure AI Search index.""" - if overwrite: - if ( - self.index_name is not None - and self.index_name in self.index_client.list_index_names() - ): - self.index_client.delete_index(self.index_name) - - # Configure vector search profile - vector_search = VectorSearch( - algorithms=[ - HnswAlgorithmConfiguration( - name="HnswAlg", - parameters=HnswParameters( - metric=VectorSearchAlgorithmMetric.COSINE - ), - ) - ], - profiles=[ - VectorSearchProfile( - name=self.vector_search_profile_name, - algorithm_configuration_name="HnswAlg", - ) - ], - ) - # Configure the index - index = SearchIndex( - name=self.index_name if self.index_name else "", - fields=[ - SimpleField( - name=self.id_field, - type=SearchFieldDataType.String, - key=True, - ), - SearchField( - name=self.vector_field, - type=SearchFieldDataType.Collection(SearchFieldDataType.Single), - searchable=True, - hidden=False, # DRIFT needs to return the vector for client-side similarity - vector_search_dimensions=self.vector_size, - vector_search_profile_name=self.vector_search_profile_name, - ), - SearchableField( - name=self.text_field, type=SearchFieldDataType.String - ), - SimpleField( - name=self.attributes_field, - type=SearchFieldDataType.String, - ), - ], - vector_search=vector_search, - ) - self.index_client.create_or_update_index( - index, - ) - - batch = [ - { - self.id_field: doc.id, - self.vector_field: doc.vector, - self.text_field: doc.text, - self.attributes_field: json.dumps(doc.attributes), - } - for doc in documents - if doc.vector is not None - ] - - if len(batch) > 0: - self.db_connection.upload_documents(batch) - - def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: - """Build a query filter to filter documents by a list of ids.""" - if include_ids is None or len(include_ids) == 0: - self.query_filter = None - # Returning to keep consistency with other methods, but not needed - return self.query_filter - - # More info about odata filtering here: https://learn.microsoft.com/en-us/azure/search/search-query-odata-search-in-function - # search.in is faster that joined and/or conditions - id_filter = ",".join([f"{id!s}" for id in include_ids]) - self.query_filter = f"search.in({self.id_field}, '{id_filter}', ',')" - - # Returning to keep consistency with other methods, but not needed - # TODO: Refactor on a future PR - return self.query_filter - - def similarity_search_by_vector( - self, query_embedding: list[float], k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform a vector-based similarity search.""" - vectorized_query = VectorizedQuery( - vector=query_embedding, k_nearest_neighbors=k, fields=self.vector_field - ) - - response = self.db_connection.search( - vector_queries=[vectorized_query], - ) - - return [ - VectorStoreSearchResult( - document=VectorStoreDocument( - id=doc.get(self.id_field, ""), - text=doc.get(self.text_field, ""), - vector=doc.get(self.vector_field, []), - attributes=(json.loads(doc.get(self.attributes_field, "{}"))), - ), - # Cosine similarity between 0.333 and 1.000 - # https://learn.microsoft.com/en-us/azure/search/hybrid-search-ranking#scores-in-a-hybrid-search-results - score=doc["@search.score"], - ) - for doc in response - ] - - def similarity_search_by_text( - self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform a text-based similarity search.""" - query_embedding = text_embedder(text) - if query_embedding: - return self.similarity_search_by_vector( - query_embedding=query_embedding, k=k - ) - return [] - - def search_by_id(self, id: str) -> VectorStoreDocument: - """Search for a document by id.""" - response = self.db_connection.get_document(id) - return VectorStoreDocument( - id=response.get(self.id_field, ""), - text=response.get(self.text_field, ""), - vector=response.get(self.vector_field, []), - attributes=(json.loads(response.get(self.attributes_field, "{}"))), - ) diff --git a/graphrag/vector_stores/base.py b/graphrag/vector_stores/base.py deleted file mode 100644 index 762bc93232..0000000000 --- a/graphrag/vector_stores/base.py +++ /dev/null @@ -1,90 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Base classes for vector stores.""" - -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from typing import Any - -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.data_model.types import TextEmbedder - - -@dataclass -class VectorStoreDocument: - """A document that is stored in vector storage.""" - - id: str | int - """unique id for the document""" - - text: str | None - vector: list[float] | None - - attributes: dict[str, Any] = field(default_factory=dict) - """store any additional metadata, e.g. title, date ranges, etc""" - - -@dataclass -class VectorStoreSearchResult: - """A vector storage search result.""" - - document: VectorStoreDocument - """Document that was found.""" - - score: float - """Similarity score between -1 and 1. Higher is more similar.""" - - -class BaseVectorStore(ABC): - """The base class for vector storage data-access classes.""" - - def __init__( - self, - vector_store_schema_config: VectorStoreSchemaConfig, - db_connection: Any | None = None, - document_collection: Any | None = None, - query_filter: Any | None = None, - **kwargs: Any, - ): - self.db_connection = db_connection - self.document_collection = document_collection - self.query_filter = query_filter - self.kwargs = kwargs - - self.index_name = vector_store_schema_config.index_name - self.id_field = vector_store_schema_config.id_field - self.text_field = vector_store_schema_config.text_field - self.vector_field = vector_store_schema_config.vector_field - self.attributes_field = vector_store_schema_config.attributes_field - self.vector_size = vector_store_schema_config.vector_size - - @abstractmethod - def connect(self, **kwargs: Any) -> None: - """Connect to vector storage.""" - - @abstractmethod - def load_documents( - self, documents: list[VectorStoreDocument], overwrite: bool = True - ) -> None: - """Load documents into the vector-store.""" - - @abstractmethod - def similarity_search_by_vector( - self, query_embedding: list[float], k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform ANN search by vector.""" - - @abstractmethod - def similarity_search_by_text( - self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform ANN search by text.""" - - @abstractmethod - def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: - """Build a query filter to filter documents by id.""" - - @abstractmethod - def search_by_id(self, id: str) -> VectorStoreDocument: - """Search for a document by id.""" diff --git a/graphrag/vector_stores/factory.py b/graphrag/vector_stores/factory.py deleted file mode 100644 index 8e4f7baa30..0000000000 --- a/graphrag/vector_stores/factory.py +++ /dev/null @@ -1,96 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Factory functions for creating a vector store.""" - -from __future__ import annotations - -from typing import TYPE_CHECKING, ClassVar - -from graphrag.config.enums import VectorStoreType -from graphrag.vector_stores.azure_ai_search import AzureAISearchVectorStore -from graphrag.vector_stores.cosmosdb import CosmosDBVectorStore -from graphrag.vector_stores.lancedb import LanceDBVectorStore - -if TYPE_CHECKING: - from collections.abc import Callable - - from graphrag.config.models.vector_store_schema_config import ( - VectorStoreSchemaConfig, - ) - from graphrag.vector_stores.base import BaseVectorStore - - -class VectorStoreFactory: - """A factory for vector stores. - - Includes a method for users to register a custom vector store implementation. - - Configuration arguments are passed to each vector store implementation as kwargs - for individual enforcement of required/optional arguments. - """ - - _registry: ClassVar[dict[str, Callable[..., BaseVectorStore]]] = {} - - @classmethod - def register( - cls, vector_store_type: str, creator: Callable[..., BaseVectorStore] - ) -> None: - """Register a custom vector store implementation. - - Args: - vector_store_type: The type identifier for the vector store. - creator: A class or callable that creates an instance of BaseVectorStore. - - Raises - ------ - TypeError: If creator is a class type instead of a factory function. - """ - cls._registry[vector_store_type] = creator - - @classmethod - def create_vector_store( - cls, - vector_store_type: str, - vector_store_schema_config: VectorStoreSchemaConfig, - **kwargs: dict, - ) -> BaseVectorStore: - """Create a vector store object from the provided type. - - Args: - vector_store_type: The type of vector store to create. - kwargs: Additional keyword arguments for the vector store constructor. - - Returns - ------- - A BaseVectorStore instance. - - Raises - ------ - ValueError: If the vector store type is not registered. - """ - if vector_store_type not in cls._registry: - msg = f"Unknown vector store type: {vector_store_type}" - raise ValueError(msg) - - return cls._registry[vector_store_type]( - vector_store_schema_config=vector_store_schema_config, **kwargs - ) - - @classmethod - def get_vector_store_types(cls) -> list[str]: - """Get the registered vector store implementations.""" - return list(cls._registry.keys()) - - @classmethod - def is_supported_type(cls, vector_store_type: str) -> bool: - """Check if the given vector store type is supported.""" - return vector_store_type in cls._registry - - -# --- register built-in vector store implementations --- -VectorStoreFactory.register(VectorStoreType.LanceDB.value, LanceDBVectorStore) -VectorStoreFactory.register( - VectorStoreType.AzureAISearch.value, AzureAISearchVectorStore -) -VectorStoreFactory.register(VectorStoreType.CosmosDB.value, CosmosDBVectorStore) diff --git a/graphrag/vector_stores/lancedb.py b/graphrag/vector_stores/lancedb.py deleted file mode 100644 index e2b52858ec..0000000000 --- a/graphrag/vector_stores/lancedb.py +++ /dev/null @@ -1,176 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""The LanceDB vector storage implementation package.""" - -import json # noqa: I001 -from typing import Any -import pyarrow as pa -import numpy as np -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.data_model.types import TextEmbedder - -from graphrag.vector_stores.base import ( - BaseVectorStore, - VectorStoreDocument, - VectorStoreSearchResult, -) -import lancedb - - -class LanceDBVectorStore(BaseVectorStore): - """LanceDB vector storage implementation.""" - - def __init__( - self, vector_store_schema_config: VectorStoreSchemaConfig, **kwargs: Any - ) -> None: - super().__init__( - vector_store_schema_config=vector_store_schema_config, **kwargs - ) - - def connect(self, **kwargs: Any) -> Any: - """Connect to the vector storage.""" - self.db_connection = lancedb.connect(kwargs["db_uri"]) - - if self.index_name and self.index_name in self.db_connection.table_names(): - self.document_collection = self.db_connection.open_table(self.index_name) - - def load_documents( - self, documents: list[VectorStoreDocument], overwrite: bool = True - ) -> None: - """Load documents into vector storage.""" - # Step 1: Prepare data columns manually - ids = [] - texts = [] - vectors = [] - attributes = [] - - for document in documents: - self.vector_size = ( - len(document.vector) if document.vector else self.vector_size - ) - if document.vector is not None and len(document.vector) == self.vector_size: - ids.append(document.id) - texts.append(document.text) - vectors.append(np.array(document.vector, dtype=np.float32)) - attributes.append(json.dumps(document.attributes)) - - # Step 2: Handle empty case - if len(ids) == 0: - data = None - else: - # Step 3: Flatten the vectors and build FixedSizeListArray manually - flat_vector = np.concatenate(vectors).astype(np.float32) - flat_array = pa.array(flat_vector, type=pa.float32()) - vector_column = pa.FixedSizeListArray.from_arrays( - flat_array, self.vector_size - ) - - # Step 4: Create PyArrow table (let schema be inferred) - data = pa.table({ - self.id_field: pa.array(ids, type=pa.string()), - self.text_field: pa.array(texts, type=pa.string()), - self.vector_field: vector_column, - self.attributes_field: pa.array(attributes, type=pa.string()), - }) - - # NOTE: If modifying the next section of code, ensure that the schema remains the same. - # The pyarrow format of the 'vector' field may change if the order of operations is changed - # and will break vector search. - if overwrite: - if data: - self.document_collection = self.db_connection.create_table( - self.index_name if self.index_name else "", - data=data, - mode="overwrite", - schema=data.schema, - ) - else: - self.document_collection = self.db_connection.create_table( - self.index_name if self.index_name else "", mode="overwrite" - ) - self.document_collection.create_index( - vector_column_name=self.vector_field, index_type="IVF_FLAT" - ) - else: - # add data to existing table - self.document_collection = self.db_connection.open_table( - self.index_name if self.index_name else "" - ) - if data: - self.document_collection.add(data) - - def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: - """Build a query filter to filter documents by id.""" - if len(include_ids) == 0: - self.query_filter = None - else: - if isinstance(include_ids[0], str): - id_filter = ", ".join([f"'{id}'" for id in include_ids]) - self.query_filter = f"{self.id_field} in ({id_filter})" - else: - self.query_filter = ( - f"{self.id_field} in ({', '.join([str(id) for id in include_ids])})" - ) - return self.query_filter - - def similarity_search_by_vector( - self, query_embedding: list[float] | np.ndarray, k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform a vector-based similarity search.""" - if self.query_filter: - docs = ( - self.document_collection.search( - query=query_embedding, vector_column_name=self.vector_field - ) - .where(self.query_filter, prefilter=True) - .limit(k) - .to_list() - ) - else: - query_embedding = np.array(query_embedding, dtype=np.float32) - - docs = ( - self.document_collection.search( - query=query_embedding, vector_column_name=self.vector_field - ) - .limit(k) - .to_list() - ) - return [ - VectorStoreSearchResult( - document=VectorStoreDocument( - id=doc[self.id_field], - text=doc[self.text_field], - vector=doc[self.vector_field], - attributes=json.loads(doc[self.attributes_field]), - ), - score=1 - abs(float(doc["_distance"])), - ) - for doc in docs - ] - - def similarity_search_by_text( - self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform a similarity search using a given input text.""" - query_embedding = text_embedder(text) - if query_embedding: - return self.similarity_search_by_vector(query_embedding, k) - return [] - - def search_by_id(self, id: str) -> VectorStoreDocument: - """Search for a document by id.""" - doc = ( - self.document_collection.search() - .where(f"{self.id_field} == '{id}'", prefilter=True) - .to_list() - ) - if doc: - return VectorStoreDocument( - id=doc[0][self.id_field], - text=doc[0][self.text_field], - vector=doc[0][self.vector_field], - attributes=json.loads(doc[0][self.attributes_field]), - ) - return VectorStoreDocument(id=id, text=None, vector=None) diff --git a/packages/graphrag-cache/README.md b/packages/graphrag-cache/README.md new file mode 100644 index 0000000000..d700900b2d --- /dev/null +++ b/packages/graphrag-cache/README.md @@ -0,0 +1,109 @@ +# GraphRAG Cache + +This package contains a collection of utilities to handle GraphRAG caching implementation. + +### Basic + +This example shows how to create a JSON cache with file storage using the GraphRAG cache package's configuration system. + +```python +import asyncio +from graphrag_storage import StorageConfig, create_storage, StorageType +from graphrag_cache import CacheConfig, create_cache, CacheType, create_cache_key + +async def run(): + cache = create_cache() + + # The above is equivalent to the following: + cache = create_cache( + CacheConfig( + type=CacheType.Json, + storage=StorageConfig( + type=StorageType.File, + base_dir="cache" + ) + ), + ) + + await cache.set("my_key", {"some": "object to cache"}) + print(await cache.get("my_key")) + + # create cache key from data dict. + cache_key = create_cache_key({ + "some_arg": "some_value", + "something_else": 5 + }) + await cache.set(cache_key, {"some": "object to cache"}) + print(await cache.get(cache_key)) + +if __name__ == "__main__": + asyncio.run(run()) +``` + +### Custom Cache + +This demonstrates how to create a custom cache implementation by extending the base Cache class and registering it with the GraphRAG cache system. Once registered, the custom cache can be instantiated through the factory pattern using either CacheConfig or directly via cache_factory, allowing for extensible caching solutions tailored to specific needs. + +```python +import asyncio +from typing import Any +from graphrag_storage import Storage +from graphrag_cache import Cache, CacheConfig, create_cache, register_cache + +class MyCache(Cache): + def __init__(self, some_setting: str, optional_setting: str = "default setting", **kwargs: Any): + # Validate settings and initialize + # View the JsonCache implementation to see how to create a cache that relies on a Storage provider. + ... + + #Implement rest of interface + ... + +register_cache("MyCache", MyCache) + +async def run(): + cache = create_cache( + CacheConfig( + type="MyCache", + some_setting="My Setting" + ) + ) + + # Or use the factory directly to instantiate with a dict instead of using + # CacheConfig + create_factory + # from graphrag_cache.cache_factory import cache_factory + # cache = cache_factory.create(strategy="MyCache", init_args={"some_setting": "My Setting"}) + + await cache.set("my_key", {"some": "object to cache"}) + print(await cache.get("my_key")) + +if __name__ == "__main__": + asyncio.run(run()) +``` + +#### Details + +By default, the `create_cache` comes with the following cache providers registered that correspond to the entries in the `CacheType` enum. + +- `JsonCache` +- `MemoryCache` +- `NoopCache` + +The preregistration happens dynamically, e.g., `JsonCache` is only imported and registered if you request a `JsonCache` with `create_cache(CacheType.Json, ...)`. There is no need to manually import and register builtin cache providers when using `create_cache`. + +If you want a clean factory with no preregistered cache providers then directly import `cache_factory` and bypass using `create_cache`. The downside is that `cache_factory.create` uses a dict for init args instead of the strongly typed `CacheConfig` used with `create_cache`. + +```python +from graphrag_cache.cache_factory import cache_factory +from graphrag_cache.json_cache import JsonCache + +# cache_factory has no preregistered providers so you must register any +# providers you plan on using. +# May also register a custom implementation, see above for example. +cache_factory.register("my_cache_impl", JsonCache) + +cache = cache_factory.create(strategy="my_cache_impl", init_args={"some_setting": "..."}) + +... + +``` \ No newline at end of file diff --git a/packages/graphrag-cache/graphrag_cache/__init__.py b/packages/graphrag-cache/graphrag_cache/__init__.py new file mode 100644 index 0000000000..41caa0c72e --- /dev/null +++ b/packages/graphrag-cache/graphrag_cache/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The GraphRAG Cache package.""" + +from graphrag_cache.cache import Cache +from graphrag_cache.cache_config import CacheConfig +from graphrag_cache.cache_factory import create_cache, register_cache +from graphrag_cache.cache_key import CacheKeyCreator, create_cache_key +from graphrag_cache.cache_type import CacheType + +__all__ = [ + "Cache", + "CacheConfig", + "CacheKeyCreator", + "CacheType", + "create_cache", + "create_cache_key", + "register_cache", +] diff --git a/graphrag/cache/pipeline_cache.py b/packages/graphrag-cache/graphrag_cache/cache.py similarity index 80% rename from graphrag/cache/pipeline_cache.py rename to packages/graphrag-cache/graphrag_cache/cache.py index c68c5cfb4b..8395bb4b4c 100644 --- a/graphrag/cache/pipeline_cache.py +++ b/packages/graphrag-cache/graphrag_cache/cache.py @@ -1,17 +1,24 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing 'PipelineCache' model.""" +"""Abstract base class for cache.""" from __future__ import annotations -from abc import ABCMeta, abstractmethod -from typing import Any +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any +if TYPE_CHECKING: + from graphrag_storage import Storage -class PipelineCache(metaclass=ABCMeta): + +class Cache(ABC): """Provide a cache interface for the pipeline.""" + @abstractmethod + def __init__(self, *, storage: Storage | None, **kwargs: Any) -> None: + """Create a cache instance.""" + @abstractmethod async def get(self, key: str) -> Any: """Get the value for the given key. @@ -59,7 +66,7 @@ async def clear(self) -> None: """Clear the cache.""" @abstractmethod - def child(self, name: str) -> PipelineCache: + def child(self, name: str) -> Cache: """Create a child cache with the given name. Args: diff --git a/packages/graphrag-cache/graphrag_cache/cache_config.py b/packages/graphrag-cache/graphrag_cache/cache_config.py new file mode 100644 index 0000000000..93bcabed6d --- /dev/null +++ b/packages/graphrag-cache/graphrag_cache/cache_config.py @@ -0,0 +1,26 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Cache configuration model.""" + +from graphrag_storage import StorageConfig, StorageType +from pydantic import BaseModel, ConfigDict, Field + +from graphrag_cache.cache_type import CacheType + + +class CacheConfig(BaseModel): + """The configuration section for cache.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom cache implementations.""" + + type: str = Field( + description="The cache type to use. Builtin types include 'Json', 'Memory', and 'Noop'.", + default=CacheType.Json, + ) + + storage: StorageConfig | None = Field( + description="The storage configuration to use for file-based caches such as 'Json'.", + default_factory=lambda: StorageConfig(type=StorageType.File, base_dir="cache"), + ) diff --git a/packages/graphrag-cache/graphrag_cache/cache_factory.py b/packages/graphrag-cache/graphrag_cache/cache_factory.py new file mode 100644 index 0000000000..6b1310754c --- /dev/null +++ b/packages/graphrag-cache/graphrag_cache/cache_factory.py @@ -0,0 +1,95 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + + +"""Cache factory implementation.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory +from graphrag_storage import create_storage + +from graphrag_cache.cache_config import CacheConfig +from graphrag_cache.cache_type import CacheType + +if TYPE_CHECKING: + from graphrag_common.factory import ServiceScope + from graphrag_storage import Storage + + from graphrag_cache.cache import Cache + + +class CacheFactory(Factory["Cache"]): + """A factory class for cache implementations.""" + + +cache_factory = CacheFactory() + + +def register_cache( + cache_type: str, + cache_initializer: Callable[..., "Cache"], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom cache implementation. + + Args + ---- + - cache_type: str + The cache id to register. + - cache_initializer: Callable[..., Cache] + The cache initializer to register. + """ + cache_factory.register(cache_type, cache_initializer, scope) + + +def create_cache( + config: CacheConfig | None = None, storage: "Storage | None" = None +) -> "Cache": + """Create a cache implementation based on the given configuration. + + Args + ---- + - config: CacheConfig + The cache configuration to use. + - storage: Storage | None + The storage implementation to use for file-based caches such as 'Json'. + + Returns + ------- + Cache + The created cache implementation. + """ + config = config or CacheConfig() + config_model = config.model_dump() + cache_strategy = config.type + + if not storage and config.storage: + storage = create_storage(config.storage) + + if cache_strategy not in cache_factory: + match cache_strategy: + case CacheType.Json: + from graphrag_cache.json_cache import JsonCache + + register_cache(CacheType.Json, JsonCache) + + case CacheType.Memory: + from graphrag_cache.memory_cache import MemoryCache + + register_cache(CacheType.Memory, MemoryCache) + + case CacheType.Noop: + from graphrag_cache.noop_cache import NoopCache + + register_cache(CacheType.Noop, NoopCache) + + case _: + msg = f"CacheConfig.type '{cache_strategy}' is not registered in the CacheFactory. Registered types: {', '.join(cache_factory.keys())}." + raise ValueError(msg) + + if storage: + config_model["storage"] = storage + + return cache_factory.create(strategy=cache_strategy, init_args=config_model) diff --git a/packages/graphrag-cache/graphrag_cache/cache_key.py b/packages/graphrag-cache/graphrag_cache/cache_key.py new file mode 100644 index 0000000000..6bf4930b97 --- /dev/null +++ b/packages/graphrag-cache/graphrag_cache/cache_key.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Create cache key.""" + +from typing import Any, Protocol, runtime_checkable + +from graphrag_common.hasher import hash_data + + +@runtime_checkable +class CacheKeyCreator(Protocol): + """Create cache key function protocol. + + Args + ---- + input_args: dict[str, Any] + The input arguments for creating the cache key. + + Returns + ------- + str + The generated cache key. + """ + + def __call__( + self, + input_args: dict[str, Any], + ) -> str: + """Create cache key.""" + ... + + +def create_cache_key(input_args: dict[str, Any]) -> str: + """Create a cache key based on the input arguments.""" + return hash_data(input_args) diff --git a/packages/graphrag-cache/graphrag_cache/cache_type.py b/packages/graphrag-cache/graphrag_cache/cache_type.py new file mode 100644 index 0000000000..4b1fe966e9 --- /dev/null +++ b/packages/graphrag-cache/graphrag_cache/cache_type.py @@ -0,0 +1,15 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + + +"""Builtin cache implementation types.""" + +from enum import StrEnum + + +class CacheType(StrEnum): + """Enum for cache types.""" + + Json = "json" + Memory = "memory" + Noop = "none" diff --git a/graphrag/cache/json_pipeline_cache.py b/packages/graphrag-cache/graphrag_cache/json_cache.py similarity index 58% rename from graphrag/cache/json_pipeline_cache.py rename to packages/graphrag-cache/graphrag_cache/json_cache.py index 84cd180c52..dc78551cf2 100644 --- a/graphrag/cache/json_pipeline_cache.py +++ b/packages/graphrag-cache/graphrag_cache/json_cache.py @@ -1,31 +1,40 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing 'JsonPipelineCache' model.""" +"""A module containing 'JsonCache' model.""" import json from typing import Any -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.storage.pipeline_storage import PipelineStorage +from graphrag_storage import Storage, StorageConfig, create_storage +from graphrag_cache.cache import Cache -class JsonPipelineCache(PipelineCache): + +class JsonCache(Cache): """File pipeline cache class definition.""" - _storage: PipelineStorage - _encoding: str + _storage: Storage - def __init__(self, storage: PipelineStorage, encoding="utf-8"): + def __init__( + self, + storage: Storage | dict[str, Any] | None = None, + **kwargs: Any, + ) -> None: """Init method definition.""" - self._storage = storage - self._encoding = encoding + if storage is None: + msg = "JsonCache requires either a Storage instance to be provided or a StorageConfig to create one." + raise ValueError(msg) + if isinstance(storage, Storage): + self._storage = storage + else: + self._storage = create_storage(StorageConfig(**storage)) - async def get(self, key: str) -> str | None: + async def get(self, key: str) -> Any | None: """Get method definition.""" if await self.has(key): try: - data = await self._storage.get(key, encoding=self._encoding) + data = await self._storage.get(key) data = json.loads(data) except UnicodeDecodeError: await self._storage.delete(key) @@ -43,9 +52,7 @@ async def set(self, key: str, value: Any, debug_data: dict | None = None) -> Non if value is None: return data = {"result": value, **(debug_data or {})} - await self._storage.set( - key, json.dumps(data, ensure_ascii=False), encoding=self._encoding - ) + await self._storage.set(key, json.dumps(data, ensure_ascii=False)) async def has(self, key: str) -> bool: """Has method definition.""" @@ -60,6 +67,6 @@ async def clear(self) -> None: """Clear method definition.""" await self._storage.clear() - def child(self, name: str) -> "JsonPipelineCache": + def child(self, name: str) -> "Cache": """Child method definition.""" - return JsonPipelineCache(self._storage.child(name), encoding=self._encoding) + return JsonCache(storage=self._storage.child(name)) diff --git a/graphrag/cache/memory_pipeline_cache.py b/packages/graphrag-cache/graphrag_cache/memory_cache.py similarity index 71% rename from graphrag/cache/memory_pipeline_cache.py rename to packages/graphrag-cache/graphrag_cache/memory_cache.py index 62de552f96..0ab3ca4838 100644 --- a/graphrag/cache/memory_pipeline_cache.py +++ b/packages/graphrag-cache/graphrag_cache/memory_cache.py @@ -1,23 +1,22 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing 'InMemoryCache' model.""" +"""MemoryCache implementation.""" from typing import Any -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag_cache.cache import Cache -class InMemoryCache(PipelineCache): +class MemoryCache(Cache): """In memory cache class definition.""" _cache: dict[str, Any] _name: str - def __init__(self, name: str | None = None): + def __init__(self, **kwargs: Any) -> None: """Init method definition.""" self._cache = {} - self._name = name or "" async def get(self, key: str) -> Any: """Get the value for the given key. @@ -30,7 +29,6 @@ async def get(self, key: str) -> Any: ------- - output - The value for the given key. """ - key = self._create_cache_key(key) return self._cache.get(key) async def set(self, key: str, value: Any, debug_data: dict | None = None) -> None: @@ -40,7 +38,6 @@ async def set(self, key: str, value: Any, debug_data: dict | None = None) -> Non - key - The key to set the value for. - value - The value to set. """ - key = self._create_cache_key(key) self._cache[key] = value async def has(self, key: str) -> bool: @@ -53,7 +50,6 @@ async def has(self, key: str) -> bool: ------- - output - True if the key exists in the storage, False otherwise. """ - key = self._create_cache_key(key) return key in self._cache async def delete(self, key: str) -> None: @@ -62,17 +58,12 @@ async def delete(self, key: str) -> None: Args: - key - The key to delete. """ - key = self._create_cache_key(key) del self._cache[key] async def clear(self) -> None: """Clear the storage.""" self._cache.clear() - def child(self, name: str) -> PipelineCache: + def child(self, name: str) -> "Cache": """Create a sub cache with the given name.""" - return InMemoryCache(name) - - def _create_cache_key(self, key: str) -> str: - """Create a cache key for the given key.""" - return f"{self._name}{key}" + return MemoryCache() diff --git a/graphrag/cache/noop_pipeline_cache.py b/packages/graphrag-cache/graphrag_cache/noop_cache.py similarity index 82% rename from graphrag/cache/noop_pipeline_cache.py rename to packages/graphrag-cache/graphrag_cache/noop_cache.py index 227ef687b8..5c3fe1368a 100644 --- a/graphrag/cache/noop_pipeline_cache.py +++ b/packages/graphrag-cache/graphrag_cache/noop_cache.py @@ -1,15 +1,18 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""Module containing the NoopPipelineCache implementation.""" +"""NoopCache implementation.""" from typing import Any -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag_cache.cache import Cache -class NoopPipelineCache(PipelineCache): - """A no-op implementation of the pipeline cache, usually useful for testing.""" +class NoopCache(Cache): + """A no-op implementation of Cache, usually useful for testing.""" + + def __init__(self, **kwargs: Any) -> None: + """Init method definition.""" async def get(self, key: str) -> Any: """Get the value for the given key. @@ -56,7 +59,7 @@ async def delete(self, key: str) -> None: async def clear(self) -> None: """Clear the cache.""" - def child(self, name: str) -> PipelineCache: + def child(self, name: str) -> "Cache": """Create a child cache with the given name. Args: diff --git a/packages/graphrag-cache/graphrag_cache/py.typed b/packages/graphrag-cache/graphrag_cache/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/graphrag-cache/pyproject.toml b/packages/graphrag-cache/pyproject.toml new file mode 100644 index 0000000000..65bed4921f --- /dev/null +++ b/packages/graphrag-cache/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "graphrag-cache" +version = "2.7.1" +description = "GraphRAG cache package." +authors = [ + {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, + {name = "Andrés Morales Esquivel", email = "andresmor@microsoft.com"}, + {name = "Chris Trevino", email = "chtrevin@microsoft.com"}, + {name = "David Tittsworth", email = "datittsw@microsoft.com"}, + {name = "Dayenne de Souza", email = "ddesouza@microsoft.com"}, + {name = "Derek Worthen", email = "deworthe@microsoft.com"}, + {name = "Gaudy Blanco Meneses", email = "gaudyb@microsoft.com"}, + {name = "Ha Trinh", email = "trinhha@microsoft.com"}, + {name = "Jonathan Larson", email = "jolarso@microsoft.com"}, + {name = "Josh Bradley", email = "joshbradley@microsoft.com"}, + {name = "Kate Lytvynets", email = "kalytv@microsoft.com"}, + {name = "Kenny Zhang", email = "zhangken@microsoft.com"}, + {name = "Mónica Carvajal"}, + {name = "Nathan Evans", email = "naevans@microsoft.com"}, + {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, + {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, +] +license = "MIT" +readme = "README.md" +license-files = ["LICENSE"] +requires-python = ">=3.11,<3.14" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dependencies = [ + "graphrag-common==2.7.1", + "graphrag-storage==2.7.1", +] + +[project.urls] +Source = "https://github.com/microsoft/graphrag" + +[build-system] +requires = ["hatchling>=1.27.0,<2.0.0"] +build-backend = "hatchling.build" diff --git a/packages/graphrag-chunking/README.md b/packages/graphrag-chunking/README.md new file mode 100644 index 0000000000..64b8e13998 --- /dev/null +++ b/packages/graphrag-chunking/README.md @@ -0,0 +1,41 @@ +# GraphRAG Chunking + +This package contains a collection of text chunkers, a core config model, and a factory for acquiring instances. + +## Examples + +### Basic sentence chunking with nltk + +The SentenceChunker class splits text into individual sentences by identifying sentence boundaries. It takes input text and returns a list where each element is a separate sentence, making it easy to process text at the sentence level. + +```python +chunker = SentenceChunker() +chunks = chunker.chunk("This is a test. Another sentence.") +print(chunks) # ["This is a test.", "Another sentence."] +``` + +### Token chunking + +The TokenChunker splits text into fixed-size chunks based on token count rather than sentence boundaries. It uses a tokenizer to encode text into tokens, then creates chunks of a specified size with configurable overlap between chunks. + +```python +tokenizer = tiktoken.get_encoding("o200k_base") +chunker = TokenChunker(size=3, overlap=0, encode=tokenizer.encode, decode=tokenizer.decode) +chunks = chunker.chunk("This is a random test fragment of some text") +print(chunks) # ["This is a", " random test fragment", " of some text"] +``` + +### Using the factory via helper util + +The create_chunker factory function provides a configuration-driven approach to instantiate chunkers by accepting a ChunkingConfig object that specifies the chunking strategy and parameters. This allows for more flexible and maintainable code by separating chunker configuration from direct instantiation. + +```python +tokenizer = tiktoken.get_encoding("o200k_base") +config = ChunkingConfig( + strategy="tokens", + size=3, + overlap=0 +) +chunker = create_chunker(config, tokenizer.encode, tokenizer.decode) +... +``` \ No newline at end of file diff --git a/tests/unit/litellm_services/__init__.py b/packages/graphrag-chunking/graphrag_chunking/__init__.py similarity index 66% rename from tests/unit/litellm_services/__init__.py rename to packages/graphrag-chunking/graphrag_chunking/__init__.py index 0a3e38adfb..6610d3a82f 100644 --- a/tests/unit/litellm_services/__init__.py +++ b/packages/graphrag-chunking/graphrag_chunking/__init__.py @@ -1,2 +1,4 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License + +"""System-level chunking package.""" diff --git a/graphrag/index/operations/chunk_text/bootstrap.py b/packages/graphrag-chunking/graphrag_chunking/bootstrap_nltk.py similarity index 100% rename from graphrag/index/operations/chunk_text/bootstrap.py rename to packages/graphrag-chunking/graphrag_chunking/bootstrap_nltk.py diff --git a/packages/graphrag-chunking/graphrag_chunking/chunk_strategy_type.py b/packages/graphrag-chunking/graphrag_chunking/chunk_strategy_type.py new file mode 100644 index 0000000000..5de6321519 --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/chunk_strategy_type.py @@ -0,0 +1,13 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Chunk strategy type enumeration.""" + +from enum import StrEnum + + +class ChunkerType(StrEnum): + """ChunkerType class definition.""" + + Tokens = "tokens" + Sentence = "sentence" diff --git a/packages/graphrag-chunking/graphrag_chunking/chunker.py b/packages/graphrag-chunking/graphrag_chunking/chunker.py new file mode 100644 index 0000000000..3e44ce46f4 --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/chunker.py @@ -0,0 +1,24 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing the 'Chunker' class.""" + +from abc import ABC, abstractmethod +from collections.abc import Callable +from typing import Any + +from graphrag_chunking.text_chunk import TextChunk + + +class Chunker(ABC): + """Abstract base class for document chunkers.""" + + @abstractmethod + def __init__(self, **kwargs: Any) -> None: + """Create a chunker instance.""" + + @abstractmethod + def chunk( + self, text: str, transform: Callable[[str], str] | None = None + ) -> list[TextChunk]: + """Chunk method definition.""" diff --git a/packages/graphrag-chunking/graphrag_chunking/chunker_factory.py b/packages/graphrag-chunking/graphrag_chunking/chunker_factory.py new file mode 100644 index 0000000000..636d0909f2 --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/chunker_factory.py @@ -0,0 +1,77 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'ChunkerFactory', 'register_chunker', and 'create_chunker'.""" + +from collections.abc import Callable + +from graphrag_common.factory.factory import Factory, ServiceScope + +from graphrag_chunking.chunk_strategy_type import ChunkerType +from graphrag_chunking.chunker import Chunker +from graphrag_chunking.chunking_config import ChunkingConfig + + +class ChunkerFactory(Factory[Chunker]): + """Factory for creating Chunker instances.""" + + +chunker_factory = ChunkerFactory() + + +def register_chunker( + chunker_type: str, + chunker_initializer: Callable[..., Chunker], + scope: ServiceScope = "transient", +) -> None: + """Register a custom chunker implementation. + + Args + ---- + - chunker_type: str + The chunker id to register. + - chunker_initializer: Callable[..., Chunker] + The chunker initializer to register. + """ + chunker_factory.register(chunker_type, chunker_initializer, scope) + + +def create_chunker( + config: ChunkingConfig, + encode: Callable[[str], list[int]] | None = None, + decode: Callable[[list[int]], str] | None = None, +) -> Chunker: + """Create a chunker implementation based on the given configuration. + + Args + ---- + - config: ChunkingConfig + The chunker configuration to use. + + Returns + ------- + Chunker + The created chunker implementation. + """ + config_model = config.model_dump() + if encode is not None: + config_model["encode"] = encode + if decode is not None: + config_model["decode"] = decode + chunker_strategy = config.type + + if chunker_strategy not in chunker_factory: + match chunker_strategy: + case ChunkerType.Tokens: + from graphrag_chunking.token_chunker import TokenChunker + + register_chunker(ChunkerType.Tokens, TokenChunker) + case ChunkerType.Sentence: + from graphrag_chunking.sentence_chunker import SentenceChunker + + register_chunker(ChunkerType.Sentence, SentenceChunker) + case _: + msg = f"ChunkingConfig.strategy '{chunker_strategy}' is not registered in the ChunkerFactory. Registered types: {', '.join(chunker_factory.keys())}." + raise ValueError(msg) + + return chunker_factory.create(chunker_strategy, init_args=config_model) diff --git a/packages/graphrag-chunking/graphrag_chunking/chunking_config.py b/packages/graphrag-chunking/graphrag_chunking/chunking_config.py new file mode 100644 index 0000000000..69db1260a1 --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/chunking_config.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, ConfigDict, Field + +from graphrag_chunking.chunk_strategy_type import ChunkerType + + +class ChunkingConfig(BaseModel): + """Configuration section for chunking.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom cache implementations.""" + + type: str = Field( + description="The chunking type to use.", + default=ChunkerType.Tokens, + ) + encoding_model: str | None = Field( + description="The encoding model to use.", + default=None, + ) + size: int = Field( + description="The chunk size to use.", + default=1200, + ) + overlap: int = Field( + description="The chunk overlap to use.", + default=100, + ) + prepend_metadata: list[str] | None = Field( + description="Metadata fields from the source document to prepend on each chunk.", + default=None, + ) diff --git a/packages/graphrag-chunking/graphrag_chunking/create_chunk_results.py b/packages/graphrag-chunking/graphrag_chunking/create_chunk_results.py new file mode 100644 index 0000000000..780de6a0bc --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/create_chunk_results.py @@ -0,0 +1,32 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'create_chunk_results' function.""" + +from collections.abc import Callable + +from graphrag_chunking.text_chunk import TextChunk + + +def create_chunk_results( + chunks: list[str], + transform: Callable[[str], str] | None = None, + encode: Callable[[str], list[int]] | None = None, +) -> list[TextChunk]: + """Create chunk results from a list of text chunks. The index assignments are 0-based and assume chunks were not stripped relative to the source text.""" + results = [] + start_char = 0 + for index, chunk in enumerate(chunks): + end_char = start_char + len(chunk) - 1 # 0-based indices + result = TextChunk( + original=chunk, + text=transform(chunk) if transform else chunk, + index=index, + start_char=start_char, + end_char=end_char, + ) + if encode: + result.token_count = len(encode(result.text)) + results.append(result) + start_char = end_char + 1 + return results diff --git a/packages/graphrag-chunking/graphrag_chunking/sentence_chunker.py b/packages/graphrag-chunking/graphrag_chunking/sentence_chunker.py new file mode 100644 index 0000000000..42d8a9a211 --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/sentence_chunker.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'SentenceChunker' class.""" + +from collections.abc import Callable +from typing import Any + +import nltk + +from graphrag_chunking.bootstrap_nltk import bootstrap +from graphrag_chunking.chunker import Chunker +from graphrag_chunking.create_chunk_results import create_chunk_results +from graphrag_chunking.text_chunk import TextChunk + + +class SentenceChunker(Chunker): + """A chunker that splits text into sentence-based chunks.""" + + def __init__( + self, encode: Callable[[str], list[int]] | None = None, **kwargs: Any + ) -> None: + """Create a sentence chunker instance.""" + self._encode = encode + bootstrap() + + def chunk( + self, text: str, transform: Callable[[str], str] | None = None + ) -> list[TextChunk]: + """Chunk the text into sentence-based chunks.""" + sentences = nltk.sent_tokenize(text.strip()) + results = create_chunk_results( + sentences, transform=transform, encode=self._encode + ) + # nltk sentence tokenizer may trim whitespace, so we need to adjust start/end chars + for index, result in enumerate(results): + txt = result.text + start = result.start_char + actual_start = text.find(txt, start) + delta = actual_start - start + if delta > 0: + result.start_char += delta + result.end_char += delta + # bump the next to keep the start check from falling too far behind + if index < len(results) - 1: + results[index + 1].start_char += delta + results[index + 1].end_char += delta + return results diff --git a/packages/graphrag-chunking/graphrag_chunking/text_chunk.py b/packages/graphrag-chunking/graphrag_chunking/text_chunk.py new file mode 100644 index 0000000000..876832f734 --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/text_chunk.py @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The TextChunk dataclass.""" + +from dataclasses import dataclass + + +@dataclass +class TextChunk: + """Result of chunking a document.""" + + original: str + """Raw original text chunk before any transformation.""" + + text: str + """The final text content of this chunk.""" + + index: int + """Zero-based index of this chunk within the source document.""" + + start_char: int + """Character index where the raw chunk text begins in the source document.""" + + end_char: int + """Character index where the raw chunk text ends in the source document.""" + + token_count: int | None = None + """Number of tokens in the final chunk text, if computed.""" diff --git a/packages/graphrag-chunking/graphrag_chunking/token_chunker.py b/packages/graphrag-chunking/graphrag_chunking/token_chunker.py new file mode 100644 index 0000000000..41921a0415 --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/token_chunker.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'TokenChunker' class.""" + +from collections.abc import Callable +from typing import Any + +from graphrag_chunking.chunker import Chunker +from graphrag_chunking.create_chunk_results import create_chunk_results +from graphrag_chunking.text_chunk import TextChunk + + +class TokenChunker(Chunker): + """A chunker that splits text into token-based chunks.""" + + def __init__( + self, + size: int, + overlap: int, + encode: Callable[[str], list[int]], + decode: Callable[[list[int]], str], + **kwargs: Any, + ) -> None: + """Create a token chunker instance.""" + self._size = size + self._overlap = overlap + self._encode = encode + self._decode = decode + + def chunk( + self, text: str, transform: Callable[[str], str] | None = None + ) -> list[TextChunk]: + """Chunk the text into token-based chunks.""" + chunks = split_text_on_tokens( + text, + chunk_size=self._size, + chunk_overlap=self._overlap, + encode=self._encode, + decode=self._decode, + ) + return create_chunk_results(chunks, transform=transform, encode=self._encode) + + +def split_text_on_tokens( + text: str, + chunk_size: int, + chunk_overlap: int, + encode: Callable[[str], list[int]], + decode: Callable[[list[int]], str], +) -> list[str]: + """Split a single text and return chunks using the tokenizer.""" + result = [] + input_tokens = encode(text) + + start_idx = 0 + cur_idx = min(start_idx + chunk_size, len(input_tokens)) + chunk_tokens = input_tokens[start_idx:cur_idx] + + while start_idx < len(input_tokens): + chunk_text = decode(list(chunk_tokens)) + result.append(chunk_text) # Append chunked text as string + if cur_idx == len(input_tokens): + break + start_idx += chunk_size - chunk_overlap + cur_idx = min(start_idx + chunk_size, len(input_tokens)) + chunk_tokens = input_tokens[start_idx:cur_idx] + + return result diff --git a/packages/graphrag-chunking/graphrag_chunking/transformers.py b/packages/graphrag-chunking/graphrag_chunking/transformers.py new file mode 100644 index 0000000000..5d6f11e0e6 --- /dev/null +++ b/packages/graphrag-chunking/graphrag_chunking/transformers.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A collection of useful built-in transformers you can use for chunking.""" + +from collections.abc import Callable +from typing import Any + + +def add_metadata( + metadata: dict[str, Any], + delimiter: str = ": ", + line_delimiter: str = "\n", + append: bool = False, +) -> Callable[[str], str]: + """Add metadata to the given text, prepending by default. This utility writes the dict as rows of key/value pairs.""" + + def transformer(text: str) -> str: + metadata_str = ( + line_delimiter.join(f"{k}{delimiter}{v}" for k, v in metadata.items()) + + line_delimiter + ) + return text + metadata_str if append else metadata_str + text + + return transformer diff --git a/packages/graphrag-chunking/pyproject.toml b/packages/graphrag-chunking/pyproject.toml new file mode 100644 index 0000000000..da2b5fab7b --- /dev/null +++ b/packages/graphrag-chunking/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "graphrag-chunking" +version = "2.7.1" +description = "Chunking utilities for GraphRAG" +authors = [ + {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, + {name = "Andrés Morales Esquivel", email = "andresmor@microsoft.com"}, + {name = "Chris Trevino", email = "chtrevin@microsoft.com"}, + {name = "David Tittsworth", email = "datittsw@microsoft.com"}, + {name = "Dayenne de Souza", email = "ddesouza@microsoft.com"}, + {name = "Derek Worthen", email = "deworthe@microsoft.com"}, + {name = "Gaudy Blanco Meneses", email = "gaudyb@microsoft.com"}, + {name = "Ha Trinh", email = "trinhha@microsoft.com"}, + {name = "Jonathan Larson", email = "jolarso@microsoft.com"}, + {name = "Josh Bradley", email = "joshbradley@microsoft.com"}, + {name = "Kate Lytvynets", email = "kalytv@microsoft.com"}, + {name = "Kenny Zhang", email = "zhangken@microsoft.com"}, + {name = "Mónica Carvajal"}, + {name = "Nathan Evans", email = "naevans@microsoft.com"}, + {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, + {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, +] +license = {text = "MIT"} +readme = "README.md" +requires-python = ">=3.11,<3.14" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dependencies = [ + "graphrag-common==2.7.1", + "pydantic~=2.10", +] + +[project.urls] +Source = "https://github.com/microsoft/graphrag" + +[build-system] +requires = ["hatchling>=1.27.0,<2.0.0"] +build-backend = "hatchling.build" + diff --git a/packages/graphrag-common/README.md b/packages/graphrag-common/README.md new file mode 100644 index 0000000000..42dbde6d7a --- /dev/null +++ b/packages/graphrag-common/README.md @@ -0,0 +1,125 @@ +# GraphRAG Common + +This package provides utility modules for GraphRAG, including a flexible factory system for dependency injection and service registration, and a comprehensive configuration loading system with Pydantic model support, environment variable substitution, and automatic file discovery. + +## Factory module + +The Factory class provides a flexible dependency injection pattern that can register and create instances of classes implementing a common interface using string-based strategies. It supports both transient scope (creates new instances on each request) and singleton scope (returns the same instance after first creation). + +```python +from abc import ABC, abstractmethod + +from graphrag_common.factory import Factory + +class SampleABC(ABC): + + @abstractmethod + def get_value(self) -> str: + msg = "Subclasses must implement the get_value method." + raise NotImplementedError(msg) + + +class ConcreteClass(SampleABC): + def __init__(self, value: str): + self._value = value + + def get_value(self) -> str: + return self._value + +class SampleFactory(Factory[SampleABC]): +"""A Factory for SampleABC classes.""" + +factory = SampleFactory() + +# Registering transient services +# A new one is created for every request +factory.register("some_strategy", ConcreteTestClass) + +trans1 = factory.create("some_strategy", {"value": "test1"}) +trans2 = factory.create("some_strategy", {"value": "test2"}) + +assert trans1 is not trans2 +assert trans1.get_value() == "test1" +assert trans2.get_value() == "test2" + +# Registering singleton services +# After first creation, the same one is returned every time +factory.register("some_other_strategy", ConcreteTestClass, scope="singleton") + +single1 = factory.create("some_other_strategy", {"value": "singleton"}) +single2 = factory.create("some_other_strategy", {"value": "ignored"}) + +assert single1 is single2 +assert single1.get_value() == "singleton" +assert single2.get_value() == "singleton" +``` + +## Config module + +The load_config function provides a comprehensive configuration loading system that automatically discovers and parses YAML/JSON config files into Pydantic models with support for environment variable substitution and .env file loading. It offers flexible features like config overrides, custom parsers for different file formats, and automatically sets the working directory to the config file location for relative path resolution. + +```python +from pydantic import BaseModel, Field +from graphrag_common.config import load_config + +from pathlib import Path + +class Logging(BaseModel): + """Test nested model.""" + + directory: str = Field(default="output/logs") + filename: str = Field(default="logs.txt") + +class Config(BaseModel): + """Test configuration model.""" + + name: str = Field(description="Name field.") + logging: Logging = Field(description="Nested model field.") + +# Basic - by default: +# - searches for Path.cwd() / settings.[yaml|yml|json] +# - sets the CWD to the directory containing the config file. +# so if no custom config path is provided than CWD remains unchanged. +# - loads config_directory/.env file +# - parses ${env} in the config file +config = load_config(Config) + +# Custom file location +config = load_config(Config, "path_to_config_filename_or_directory_containing_settings.[yaml|yml|json]") + +# Using a custom file extension with +# custom config parser (str) -> dict[str, Any] +config = load_config( + config_initializer=Config, + config_path="config.toml", + config_parser=lambda contents: toml.loads(contents) # Needs toml pypi package +) + +# With overrides - provided values override whats in the config file +# Only overrides what is specified - recursively merges settings. +config = load_config( + config_initializer=Config, + overrides={ + "name": "some name", + "logging": { + "filename": "my_logs.txt" + } + }, +) + +# By default, sets CWD to directory containing config file +# So custom config paths will change the CWD. +config = load_config( + config_initializer=Config, + config_path="some/path/to/config.yaml", + set_cwd=True # default +) + +# now cwd == some/path/to +assert Path.cwd() == "some/path/to" + +# And now throughout the codebase resolving relative paths in config +# will resolve relative to the config directory +Path(config.logging.directory) == "some/path/to/output/logs" + +``` \ No newline at end of file diff --git a/graphrag/storage/__init__.py b/packages/graphrag-common/graphrag_common/__init__.py similarity index 70% rename from graphrag/storage/__init__.py rename to packages/graphrag-common/graphrag_common/__init__.py index b21f077cb1..e6f83e0260 100644 --- a/graphrag/storage/__init__.py +++ b/packages/graphrag-common/graphrag_common/__init__.py @@ -1,4 +1,4 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""The storage package root.""" +"""GraphRAG Common package.""" diff --git a/packages/graphrag-common/graphrag_common/config/__init__.py b/packages/graphrag-common/graphrag_common/config/__init__.py new file mode 100644 index 0000000000..71f24b79b7 --- /dev/null +++ b/packages/graphrag-common/graphrag_common/config/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The GraphRAG config module.""" + +from graphrag_common.config.load_config import ConfigParsingError, load_config + +__all__ = ["ConfigParsingError", "load_config"] diff --git a/packages/graphrag-common/graphrag_common/config/load_config.py b/packages/graphrag-common/graphrag_common/config/load_config.py new file mode 100644 index 0000000000..c8929149f1 --- /dev/null +++ b/packages/graphrag-common/graphrag_common/config/load_config.py @@ -0,0 +1,205 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Load configuration.""" + +import json +import os +from collections.abc import Callable +from pathlib import Path +from string import Template +from typing import Any, TypeVar + +import yaml +from dotenv import load_dotenv + +T = TypeVar("T", covariant=True) + +_default_config_files = ["settings.yaml", "settings.yml", "settings.json"] + + +class ConfigParsingError(ValueError): + """Configuration Parsing Error.""" + + def __init__(self, msg: str) -> None: + """Initialize the ConfigParsingError.""" + super().__init__(msg) + + +def _get_config_file_path(config_dir_or_file: Path) -> Path: + """Resolve the config path from the given directory or file.""" + config_dir_or_file = Path(config_dir_or_file) + + if config_dir_or_file.is_file(): + return config_dir_or_file + + if not config_dir_or_file.is_dir(): + msg = f"Invalid config path: {config_dir_or_file} is not a directory" + raise FileNotFoundError(msg) + + for file in _default_config_files: + if (config_dir_or_file / file).is_file(): + return config_dir_or_file / file + + msg = f"No 'settings.[yaml|yml|json]' config file found in directory: {config_dir_or_file}" + raise FileNotFoundError(msg) + + +def _load_dotenv(env_file_path: Path, required: bool) -> None: + """Load the .env file if it exists.""" + if not env_file_path.is_file(): + if not required: + return + msg = f"dot_env_path not found: {env_file_path}" + raise FileNotFoundError(msg) + load_dotenv(env_file_path) + + +def _parse_json(data: str) -> dict[str, Any]: + """Parse JSON data.""" + return json.loads(data) + + +def _parse_yaml(data: str) -> dict[str, Any]: + """Parse YAML data.""" + return yaml.safe_load(data) + + +def _get_parser_for_file(file_path: str | Path) -> Callable[[str], dict[str, Any]]: + """Get the parser for the given file path.""" + file_path = Path(file_path).resolve() + match file_path.suffix.lower(): + case ".json": + return _parse_json + case ".yaml" | ".yml": + return _parse_yaml + case _: + msg = ( + f"Failed to parse, {file_path}. Unsupported file extension, " + + f"{file_path.suffix}. Pass in a custom config_parser argument or " + + "use one of the supported file extensions, .json, .yaml, .yml, .toml." + ) + raise ConfigParsingError(msg) + + +def _parse_env_variables(text: str) -> str: + """Parse environment variables in the configuration text.""" + try: + return Template(text).substitute(os.environ) + except KeyError as error: + msg = f"Environment variable not found: {error}" + raise ConfigParsingError(msg) from error + + +def _recursive_merge_dicts(dest: dict[str, Any], src: dict[str, Any]) -> None: + """Recursively merge two dictionaries in place.""" + for key, value in src.items(): + if isinstance(value, dict): + if isinstance(dest.get(key), dict): + _recursive_merge_dicts(dest[key], value) + else: + dest[key] = value + else: + dest[key] = value + + +def load_config( + config_initializer: Callable[..., T], + config_path: str | Path | None = None, + overrides: dict[str, Any] | None = None, + set_cwd: bool = True, + parse_env_vars: bool = True, + load_dot_env_file: bool = True, + dot_env_path: str | Path | None = None, + config_parser: Callable[[str], dict[str, Any]] | None = None, + file_encoding: str = "utf-8", +) -> T: + """Load configuration from a file. + + Parameters + ---------- + config_initializer : Callable[..., T] + Configuration constructor/initializer. + Should accept **kwargs to initialize the configuration, + e.g., Config(**kwargs). + config_path : str | Path | None, optional (default=None) + Path to the configuration directory containing settings.[yaml|yml|json]. + Or path to a configuration file itself. + If None, search the current working directory for + settings.[yaml|yml|json]. + overrides : dict[str, Any] | None, optional (default=None) + Configuration overrides. + Useful for overriding configuration settings programmatically, + perhaps from CLI flags. + set_cwd : bool, optional (default=True) + Whether to set the current working directory to the directory + containing the configuration file. Helpful for resolving relative paths + in the configuration file. + parse_env_vars : bool, optional (default=True) + Whether to parse environment variables in the configuration text. + load_dot_env_file : bool, optional (default=True) + Whether to load the .env file prior to parsing environment variables. + dot_env_path : str | Path | None, optional (default=None) + Optional .env file to load prior to parsing env variables. + If None and load_dot_env_file is True, looks for a .env file in the + same directory as the config file. + config_parser : Callable[[str], dict[str, Any]] | None, optional (default=None) + function to parse the configuration text, (str) -> dict[str, Any]. + If None, the parser is inferred from the file extension. + Supported extensions: .json, .yaml, .yml. + file_encoding : str, optional (default="utf-8") + File encoding to use when reading the configuration file. + + Returns + ------- + T + The initialized configuration object. + + Raises + ------ + FileNotFoundError + - If the config file is not found. + - If the .env file is not found when parse_env_vars is True and dot_env_path is provided. + + ConfigParsingError + - If an environment variable is not found when parsing env variables. + - If there was a problem merging the overrides with the configuration. + - If parser=None and load_config was unable to determine how to parse + the file based on the file extension. + - If the parser fails to parse the configuration text. + """ + config_path = Path(config_path).resolve() if config_path else Path.cwd() + config_path = _get_config_file_path(config_path) + + file_contents = config_path.read_text(encoding=file_encoding) + + if parse_env_vars: + if load_dot_env_file: + required = dot_env_path is not None + dot_env_path = ( + Path(dot_env_path) if dot_env_path else config_path.parent / ".env" + ) + _load_dotenv(dot_env_path, required=required) + file_contents = _parse_env_variables(file_contents) + + if config_parser is None: + config_parser = _get_parser_for_file(config_path) + + config_data: dict[str, Any] = {} + try: + config_data = config_parser(file_contents) + except Exception as error: + msg = f"Failed to parse config_path: {config_path}. Error: {error}" + raise ConfigParsingError(msg) from error + + if overrides is not None: + try: + _recursive_merge_dicts(config_data, overrides) + except Exception as error: + msg = f"Failed to merge overrides with config_path: {config_path}. Error: {error}" + raise ConfigParsingError(msg) from error + + if set_cwd: + os.chdir(config_path.parent) + + return config_initializer(**config_data) diff --git a/packages/graphrag-common/graphrag_common/factory/__init__.py b/packages/graphrag-common/graphrag_common/factory/__init__.py new file mode 100644 index 0000000000..86b102f265 --- /dev/null +++ b/packages/graphrag-common/graphrag_common/factory/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The GraphRAG factory module.""" + +from graphrag_common.factory.factory import Factory, ServiceScope + +__all__ = ["Factory", "ServiceScope"] diff --git a/packages/graphrag-common/graphrag_common/factory/factory.py b/packages/graphrag-common/graphrag_common/factory/factory.py new file mode 100644 index 0000000000..ab001d101c --- /dev/null +++ b/packages/graphrag-common/graphrag_common/factory/factory.py @@ -0,0 +1,113 @@ +# Copyright (c) 2025 Microsoft Corporation. +# Licensed under the MIT License + +"""Factory ABC.""" + +from abc import ABC +from collections.abc import Callable +from dataclasses import dataclass +from typing import Any, ClassVar, Generic, Literal, TypeVar + +from graphrag_common.hasher import hash_data + +T = TypeVar("T", covariant=True) + +ServiceScope = Literal["singleton", "transient"] + + +@dataclass +class _ServiceDescriptor(Generic[T]): + """Descriptor for a service.""" + + scope: ServiceScope + initializer: Callable[..., T] + + +class Factory(ABC, Generic[T]): + """Abstract base class for factories.""" + + _instance: ClassVar["Factory | None"] = None + + def __new__(cls, *args: Any, **kwargs: Any) -> "Factory[T]": + """Create a new instance of Factory if it does not exist.""" + if cls._instance is None: + cls._instance = super().__new__(cls, *args, **kwargs) + return cls._instance + + def __init__(self): + if not hasattr(self, "_initialized"): + self._service_initializers: dict[str, _ServiceDescriptor[T]] = {} + self._initialized_services: dict[str, T] = {} + self._initialized = True + + def __contains__(self, strategy: str) -> bool: + """Check if a strategy is registered.""" + return strategy in self._service_initializers + + def keys(self) -> list[str]: + """Get a list of registered strategy names.""" + return list(self._service_initializers.keys()) + + def register( + self, + strategy: str, + initializer: Callable[..., T], + scope: ServiceScope = "transient", + ) -> None: + """ + Register a new service. + + Args + ---- + strategy: str + The name of the strategy. + initializer: Callable[..., T] + A callable that creates an instance of T. + scope: ServiceScope (default: "transient") + The scope of the service ("singleton" or "transient"). + Singleton services are cached based on their init args + so that the same instance is returned for the same init args. + """ + self._service_initializers[strategy] = _ServiceDescriptor(scope, initializer) + + def create(self, strategy: str, init_args: dict[str, Any] | None = None) -> T: + """ + Create a service instance based on the strategy. + + Args + ---- + strategy: str + The name of the strategy. + init_args: dict[str, Any] | None + A dictionary of keyword arguments to pass to the service initializer. + + Returns + ------- + An instance of T. + + Raises + ------ + ValueError: If the strategy is not registered. + """ + if strategy not in self._service_initializers: + msg = f"Strategy '{strategy}' is not registered. Registered strategies are: {', '.join(list(self._service_initializers.keys()))}" + raise ValueError(msg) + + # Delete entries with value None + # That way services can have default values + init_args = {k: v for k, v in (init_args or {}).items() if v is not None} + + service_descriptor = self._service_initializers[strategy] + if service_descriptor.scope == "singleton": + cache_key = hash_data({ + "strategy": strategy, + "init_args": init_args, + }) + + if cache_key not in self._initialized_services: + self._initialized_services[cache_key] = service_descriptor.initializer( + **init_args + ) + return self._initialized_services[cache_key] + + return service_descriptor.initializer(**(init_args or {})) diff --git a/packages/graphrag-common/graphrag_common/hasher/__init__.py b/packages/graphrag-common/graphrag_common/hasher/__init__.py new file mode 100644 index 0000000000..cdf27f8f80 --- /dev/null +++ b/packages/graphrag-common/graphrag_common/hasher/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The GraphRAG hasher module.""" + +from graphrag_common.hasher.hasher import ( + Hasher, + hash_data, + make_yaml_serializable, + sha256_hasher, +) + +__all__ = [ + "Hasher", + "hash_data", + "make_yaml_serializable", + "sha256_hasher", +] diff --git a/packages/graphrag-common/graphrag_common/hasher/hasher.py b/packages/graphrag-common/graphrag_common/hasher/hasher.py new file mode 100644 index 0000000000..c4af285377 --- /dev/null +++ b/packages/graphrag-common/graphrag_common/hasher/hasher.py @@ -0,0 +1,59 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The GraphRAG hasher module.""" + +import hashlib +from collections.abc import Callable +from typing import Any + +import yaml + +Hasher = Callable[[str], str] +"""Type alias for a hasher function (data: str) -> str.""" + + +def sha256_hasher(data: str) -> str: + """Generate a SHA-256 hash for the input data.""" + return hashlib.sha256(data.encode("utf-8")).hexdigest() + + +def make_yaml_serializable(data: Any) -> Any: + """Convert data to a YAML-serializable format.""" + if isinstance(data, (list, tuple)): + return tuple(make_yaml_serializable(item) for item in data) + + if isinstance(data, set): + return tuple(sorted(make_yaml_serializable(item) for item in data)) + + if isinstance(data, dict): + return tuple( + sorted((key, make_yaml_serializable(value)) for key, value in data.items()) + ) + + return str(data) + + +def hash_data(data: Any, *, hasher: Hasher | None = None) -> str: + """Hash the input data dictionary using the specified hasher function. + + Args + ---- + data: dict[str, Any] + The input data to be hashed. + The input data is serialized using yaml + to support complex data structures such as classes and functions. + hasher: Hasher | None (default: sha256_hasher) + The hasher function to use. (data: str) -> str + + Returns + ------- + str + The resulting hash of the input data. + + """ + hasher = hasher or sha256_hasher + try: + return hasher(yaml.dump(data, sort_keys=True)) + except TypeError: + return hasher(yaml.dump(make_yaml_serializable(data), sort_keys=True)) diff --git a/packages/graphrag-common/graphrag_common/py.typed b/packages/graphrag-common/graphrag_common/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/graphrag-common/pyproject.toml b/packages/graphrag-common/pyproject.toml new file mode 100644 index 0000000000..c8d221f76a --- /dev/null +++ b/packages/graphrag-common/pyproject.toml @@ -0,0 +1,43 @@ +[project] +name = "graphrag-common" +version = "2.7.1" +description = "Common utilities and types for GraphRAG" +authors = [ + {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, + {name = "Andrés Morales Esquivel", email = "andresmor@microsoft.com"}, + {name = "Chris Trevino", email = "chtrevin@microsoft.com"}, + {name = "David Tittsworth", email = "datittsw@microsoft.com"}, + {name = "Dayenne de Souza", email = "ddesouza@microsoft.com"}, + {name = "Derek Worthen", email = "deworthe@microsoft.com"}, + {name = "Gaudy Blanco Meneses", email = "gaudyb@microsoft.com"}, + {name = "Ha Trinh", email = "trinhha@microsoft.com"}, + {name = "Jonathan Larson", email = "jolarso@microsoft.com"}, + {name = "Josh Bradley", email = "joshbradley@microsoft.com"}, + {name = "Kate Lytvynets", email = "kalytv@microsoft.com"}, + {name = "Kenny Zhang", email = "zhangken@microsoft.com"}, + {name = "Mónica Carvajal"}, + {name = "Nathan Evans", email = "naevans@microsoft.com"}, + {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, + {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, +] +license = {text = "MIT"} +readme = "README.md" +requires-python = ">=3.11,<3.14" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dependencies = [ + "python-dotenv~=1.0", + "pyyaml~=6.0", +] + +[project.urls] +Source = "https://github.com/microsoft/graphrag" + +[build-system] +requires = ["hatchling>=1.27.0,<2.0.0"] +build-backend = "hatchling.build" + diff --git a/packages/graphrag-input/README.md b/packages/graphrag-input/README.md new file mode 100644 index 0000000000..5dd6cb1497 --- /dev/null +++ b/packages/graphrag-input/README.md @@ -0,0 +1,72 @@ +# GraphRAG Inputs + +This package provides input document loading utilities for GraphRAG, supporting multiple file formats including CSV, JSON, JSON Lines, and plain text. + +## Supported File Types + +The following four standard file formats are supported out of the box: + +- **CSV** - Tabular data with configurable column mappings +- **JSON** - JSON files with configurable property paths +- **JSON Lines** - Line-delimited JSON records +- **Text** - Plain text files + +### Markitdown Support + +Additionally, we support the `InputType.MarkItDown` format, which uses the [MarkItDown](https://github.com/microsoft/markitdown) library to import any supported file type. The MarkItDown converter can handle a wide variety of file formats including Office documents, PDFs, HTML, and more. + +**Note:** Additional optional dependencies may need to be installed depending on the file type you're processing. The choice of converter is determined by MarkItDowns's processing logic, which primarily uses the file extension to select the appropriate converter. Please refer to the [MarkItDown repository](https://github.com/microsoft/markitdown) for installation instructions and detailed information about supported formats. + +## Examples + +Basic usage with the factory: +```python +from graphrag_input import create_input_reader, InputConfig, InputType +from graphrag_storage import StorageConfig, create_storage + +config = InputConfig( + type=InputType.Csv, + text_column="content", + title_column="title", +) +storage = create_storage(StorageConfig(base_dir="./input")) +reader = create_input_reader(config, storage) +documents = await reader.read_files() +``` + +Import a pdf with MarkItDown: + +```bash +pip install 'markitdown[pdf]' # required dependency for pdf processing +``` + +```python +from graphrag_input import create_input_reader, InputConfig, InputType +from graphrag_storage import StorageConfig, create_storage + +config = InputConfig( + type=InputType.MarkitDown, + file_pattern=".*\\.pdf$" +) +storage = create_storage(StorageConfig(base_dir="./input")) +reader = create_input_reader(config, storage) +documents = await reader.read_files() +``` + +YAML config example for above: +```yaml +input: + type: markitdown + file_pattern: ".*\\.pdf$$" +input_storage: + type: file + base_dir: "input" +``` + +Note that when specifying column names for data extraction, we can handle nested objects (e.g., in JSON) with dot notation: +```python +from graphrag_input import get_property + +data = {"user": {"profile": {"name": "Alice"}}} +name = get_property(data, "user.profile.name") # Returns "Alice" +``` diff --git a/packages/graphrag-input/graphrag_input/__init__.py b/packages/graphrag-input/graphrag_input/__init__.py new file mode 100644 index 0000000000..e742d7f06b --- /dev/null +++ b/packages/graphrag-input/graphrag_input/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG input document loading package.""" + +from graphrag_input.get_property import get_property +from graphrag_input.input_config import InputConfig +from graphrag_input.input_reader import InputReader +from graphrag_input.input_reader_factory import create_input_reader +from graphrag_input.input_type import InputType +from graphrag_input.text_document import TextDocument + +__all__ = [ + "InputConfig", + "InputReader", + "InputType", + "TextDocument", + "create_input_reader", + "get_property", +] diff --git a/packages/graphrag-input/graphrag_input/csv.py b/packages/graphrag-input/graphrag_input/csv.py new file mode 100644 index 0000000000..6c0f51dd3a --- /dev/null +++ b/packages/graphrag-input/graphrag_input/csv.py @@ -0,0 +1,38 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'CSVFileReader' model.""" + +import csv +import logging + +from graphrag_input.structured_file_reader import StructuredFileReader +from graphrag_input.text_document import TextDocument + +logger = logging.getLogger(__name__) + + +class CSVFileReader(StructuredFileReader): + """Reader implementation for csv files.""" + + def __init__(self, file_pattern: str | None = None, **kwargs): + super().__init__( + file_pattern=file_pattern if file_pattern is not None else ".*\\.csv$", + **kwargs, + ) + + async def read_file(self, path: str) -> list[TextDocument]: + """Read a csv file into a list of documents. + + Args: + - path - The path to read the file from. + + Returns + ------- + - output - list with a TextDocument for each row in the file. + """ + file = await self._storage.get(path, encoding=self._encoding) + + reader = csv.DictReader(file.splitlines()) + rows = list(reader) + return await self.process_data_columns(rows, path) diff --git a/packages/graphrag-input/graphrag_input/get_property.py b/packages/graphrag-input/graphrag_input/get_property.py new file mode 100644 index 0000000000..8c82d69885 --- /dev/null +++ b/packages/graphrag-input/graphrag_input/get_property.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Utility for retrieving properties from nested dictionaries.""" + +from typing import Any + + +def get_property(data: dict[str, Any], path: str) -> Any: + """Retrieve a property from a dictionary using dot notation. + + Parameters + ---------- + data : dict[str, Any] + The dictionary to retrieve the property from. + path : str + A dot-separated string representing the path to the property (e.g., "foo.bar.baz"). + + Returns + ------- + Any + The value at the specified path. + + Raises + ------ + KeyError + If the path does not exist in the dictionary. + """ + keys = path.split(".") + current = data + for key in keys: + if not isinstance(current, dict) or key not in current: + msg = f"Property '{path}' not found" + raise KeyError(msg) + current = current[key] + return current diff --git a/packages/graphrag-input/graphrag_input/hashing.py b/packages/graphrag-input/graphrag_input/hashing.py new file mode 100644 index 0000000000..915824cd9f --- /dev/null +++ b/packages/graphrag-input/graphrag_input/hashing.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Hashing utilities.""" + +from collections.abc import Iterable +from hashlib import sha512 +from typing import Any + + +def gen_sha512_hash(item: dict[str, Any], hashcode: Iterable[str]) -> str: + """Generate a SHA512 hash. + + Parameters + ---------- + item : dict[str, Any] + The dictionary containing values to hash. + hashcode : Iterable[str] + The keys to include in the hash. + + Returns + ------- + str + The SHA512 hash as a hexadecimal string. + """ + hashed = "".join([str(item[column]) for column in hashcode]) + return f"{sha512(hashed.encode('utf-8'), usedforsecurity=False).hexdigest()}" diff --git a/packages/graphrag-input/graphrag_input/input_config.py b/packages/graphrag-input/graphrag_input/input_config.py new file mode 100644 index 0000000000..792ce3f85a --- /dev/null +++ b/packages/graphrag-input/graphrag_input/input_config.py @@ -0,0 +1,40 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, ConfigDict, Field + +from graphrag_input.input_type import InputType + + +class InputConfig(BaseModel): + """The default configuration section for Input.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom reader implementations.""" + + type: str = Field( + description="The input file type to use.", + default=InputType.Text, + ) + encoding: str | None = Field( + description="The input file encoding to use.", + default=None, + ) + file_pattern: str | None = Field( + description="The input file pattern to use.", + default=None, + ) + id_column: str | None = Field( + description="The input ID column to use.", + default=None, + ) + title_column: str | None = Field( + description="The input title column to use.", + default=None, + ) + text_column: str | None = Field( + description="The input text column to use.", + default=None, + ) diff --git a/packages/graphrag-input/graphrag_input/input_reader.py b/packages/graphrag-input/graphrag_input/input_reader.py new file mode 100644 index 0000000000..be95168336 --- /dev/null +++ b/packages/graphrag-input/graphrag_input/input_reader.py @@ -0,0 +1,75 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'InputReader' model.""" + +from __future__ import annotations + +import logging +import re +from abc import ABCMeta, abstractmethod +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from graphrag_storage import Storage + + from graphrag_input.text_document import TextDocument + +logger = logging.getLogger(__name__) + + +class InputReader(metaclass=ABCMeta): + """Provide a cache interface for the pipeline.""" + + def __init__( + self, + storage: Storage, + file_pattern: str, + encoding: str = "utf-8", + **kwargs, + ): + self._storage = storage + self._encoding = encoding + self._file_pattern = file_pattern + + async def read_files(self) -> list[TextDocument]: + """Load files from storage and apply a loader function based on file type. Process metadata on the results if needed.""" + files = list(self._storage.find(re.compile(self._file_pattern))) + if len(files) == 0: + msg = f"No {self._file_pattern} matches found in storage" + logger.warning(msg) + files = [] + + documents: list[TextDocument] = [] + + for file in files: + try: + documents.extend(await self.read_file(file)) + except Exception as e: # noqa: BLE001 (catching Exception is fine here) + logger.warning("Warning! Error loading file %s. Skipping...", file) + logger.warning("Error: %s", e) + + logger.info( + "Found %d %s files, loading %d", + len(files), + self._file_pattern, + len(documents), + ) + total_files_log = ( + f"Total number of unfiltered {self._file_pattern} rows: {len(documents)}" + ) + logger.info(total_files_log) + + return documents + + @abstractmethod + async def read_file(self, path: str) -> list[TextDocument]: + """Read a file into a list of documents. + + Args: + - path - The path to read the file from. + + Returns + ------- + - output - List with an entry for each document in the file. + """ diff --git a/packages/graphrag-input/graphrag_input/input_reader_factory.py b/packages/graphrag-input/graphrag_input/input_reader_factory.py new file mode 100644 index 0000000000..825665fa9d --- /dev/null +++ b/packages/graphrag-input/graphrag_input/input_reader_factory.py @@ -0,0 +1,90 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'InputReaderFactory' model.""" + +import logging +from collections.abc import Callable + +from graphrag_common.factory import Factory +from graphrag_common.factory.factory import ServiceScope +from graphrag_storage.storage import Storage + +from graphrag_input.input_config import InputConfig +from graphrag_input.input_reader import InputReader +from graphrag_input.input_type import InputType + +logger = logging.getLogger(__name__) + + +class InputReaderFactory(Factory[InputReader]): + """Factory for creating Input Reader instances.""" + + +input_reader_factory = InputReaderFactory() + + +def register_input_reader( + input_reader_type: str, + input_reader_initializer: Callable[..., InputReader], + scope: ServiceScope = "transient", +) -> None: + """Register a custom input reader implementation. + + Args + ---- + - input_reader_type: str + The input reader id to register. + - input_reader_initializer: Callable[..., InputReader] + The input reader initializer to register. + """ + input_reader_factory.register(input_reader_type, input_reader_initializer, scope) + + +def create_input_reader(config: InputConfig, storage: Storage) -> InputReader: + """Create an input reader implementation based on the given configuration. + + Args + ---- + - config: InputConfig + The input reader configuration to use. + - storage: Storage | None + The storage implementation to use for reading the files. + + Returns + ------- + InputReader + The created input reader implementation. + """ + config_model = config.model_dump() + input_strategy = config.type + + if input_strategy not in input_reader_factory: + match input_strategy: + case InputType.Csv: + from graphrag_input.csv import CSVFileReader + + register_input_reader(InputType.Csv, CSVFileReader) + case InputType.Text: + from graphrag_input.text import TextFileReader + + register_input_reader(InputType.Text, TextFileReader) + case InputType.Json: + from graphrag_input.json import JSONFileReader + + register_input_reader(InputType.Json, JSONFileReader) + case InputType.JsonLines: + from graphrag_input.jsonl import JSONLinesFileReader + + register_input_reader(InputType.JsonLines, JSONLinesFileReader) + case InputType.MarkItDown: + from graphrag_input.markitdown import MarkItDownFileReader + + register_input_reader(InputType.MarkItDown, MarkItDownFileReader) + case _: + msg = f"InputConfig.type '{input_strategy}' is not registered in the InputReaderFactory. Registered types: {', '.join(input_reader_factory.keys())}." + raise ValueError(msg) + + config_model["storage"] = storage + + return input_reader_factory.create(input_strategy, init_args=config_model) diff --git a/packages/graphrag-input/graphrag_input/input_type.py b/packages/graphrag-input/graphrag_input/input_type.py new file mode 100644 index 0000000000..39d0559c8e --- /dev/null +++ b/packages/graphrag-input/graphrag_input/input_type.py @@ -0,0 +1,25 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing input file type enum.""" + +from enum import StrEnum + + +class InputType(StrEnum): + """The input file type for the pipeline.""" + + Csv = "csv" + """The CSV input type.""" + Text = "text" + """The text input type.""" + Json = "json" + """The JSON input type.""" + JsonLines = "jsonl" + """The JSON Lines input type.""" + MarkItDown = "markitdown" + """The MarkItDown input type.""" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' diff --git a/packages/graphrag-input/graphrag_input/json.py b/packages/graphrag-input/graphrag_input/json.py new file mode 100644 index 0000000000..1e4bdefe8d --- /dev/null +++ b/packages/graphrag-input/graphrag_input/json.py @@ -0,0 +1,38 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'JSONFileReader' model.""" + +import json +import logging + +from graphrag_input.structured_file_reader import StructuredFileReader +from graphrag_input.text_document import TextDocument + +logger = logging.getLogger(__name__) + + +class JSONFileReader(StructuredFileReader): + """Reader implementation for json files.""" + + def __init__(self, file_pattern: str | None = None, **kwargs): + super().__init__( + file_pattern=file_pattern if file_pattern is not None else ".*\\.json$", + **kwargs, + ) + + async def read_file(self, path: str) -> list[TextDocument]: + """Read a JSON file into a list of documents. + + Args: + - path - The path to read the file from. + + Returns + ------- + - output - list with a TextDocument for each row in the file. + """ + text = await self._storage.get(path, encoding=self._encoding) + as_json = json.loads(text) + # json file could just be a single object, or an array of objects + rows = as_json if isinstance(as_json, list) else [as_json] + return await self.process_data_columns(rows, path) diff --git a/packages/graphrag-input/graphrag_input/jsonl.py b/packages/graphrag-input/graphrag_input/jsonl.py new file mode 100644 index 0000000000..f038aafaa5 --- /dev/null +++ b/packages/graphrag-input/graphrag_input/jsonl.py @@ -0,0 +1,38 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'JSONLinesFileReader' model.""" + +import json +import logging + +from graphrag_input.structured_file_reader import StructuredFileReader +from graphrag_input.text_document import TextDocument + +logger = logging.getLogger(__name__) + + +class JSONLinesFileReader(StructuredFileReader): + """Reader implementation for json lines files.""" + + def __init__(self, file_pattern: str | None = None, **kwargs): + super().__init__( + file_pattern=file_pattern if file_pattern is not None else ".*\\.jsonl$", + **kwargs, + ) + + async def read_file(self, path: str) -> list[TextDocument]: + """Read a JSON lines file into a list of documents. + + This differs from standard JSON files in that each line is a separate JSON object. + + Args: + - path - The path to read the file from. + + Returns + ------- + - output - list with a TextDocument for each row in the file. + """ + text = await self._storage.get(path, encoding=self._encoding) + rows = [json.loads(line) for line in text.splitlines()] + return await self.process_data_columns(rows, path) diff --git a/packages/graphrag-input/graphrag_input/markitdown.py b/packages/graphrag-input/graphrag_input/markitdown.py new file mode 100644 index 0000000000..466a2ebdd9 --- /dev/null +++ b/packages/graphrag-input/graphrag_input/markitdown.py @@ -0,0 +1,49 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'TextFileReader' model.""" + +import logging +from io import BytesIO +from pathlib import Path + +from markitdown import MarkItDown, StreamInfo + +from graphrag_input.hashing import gen_sha512_hash +from graphrag_input.input_reader import InputReader +from graphrag_input.text_document import TextDocument + +logger = logging.getLogger(__name__) + + +class MarkItDownFileReader(InputReader): + """Reader implementation for any file type supported by markitdown. + + https://github.com/microsoft/markitdown + """ + + async def read_file(self, path: str) -> list[TextDocument]: + """Read a text file into a DataFrame of documents. + + Args: + - path - The path to read the file from. + + Returns + ------- + - output - list with a TextDocument for each row in the file. + """ + bytes = await self._storage.get(path, encoding=self._encoding, as_bytes=True) + md = MarkItDown() + result = md.convert_stream( + BytesIO(bytes), stream_info=StreamInfo(extension=Path(path).suffix) + ) + text = result.markdown + + document = TextDocument( + id=gen_sha512_hash({"text": text}, ["text"]), + title=result.title if result.title else str(Path(path).name), + text=text, + creation_date=await self._storage.get_creation_date(path), + raw_data=None, + ) + return [document] diff --git a/packages/graphrag-input/graphrag_input/structured_file_reader.py b/packages/graphrag-input/graphrag_input/structured_file_reader.py new file mode 100644 index 0000000000..45628ff94d --- /dev/null +++ b/packages/graphrag-input/graphrag_input/structured_file_reader.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'StructuredFileReader' model.""" + +import logging +from typing import Any + +from graphrag_input.get_property import get_property +from graphrag_input.hashing import gen_sha512_hash +from graphrag_input.input_reader import InputReader +from graphrag_input.text_document import TextDocument + +logger = logging.getLogger(__name__) + + +class StructuredFileReader(InputReader): + """Base reader implementation for structured files such as csv and json.""" + + def __init__( + self, + id_column: str | None = None, + title_column: str | None = None, + text_column: str = "text", + **kwargs, + ): + super().__init__(**kwargs) + self._id_column = id_column + self._title_column = title_column + self._text_column = text_column + + async def process_data_columns( + self, + rows: list[dict[str, Any]], + path: str, + ) -> list[TextDocument]: + """Process configured data columns from a list of loaded dicts.""" + documents = [] + for index, row in enumerate(rows): + # text column is required - harvest from dict + text = get_property(row, self._text_column) + # id is optional - harvest from dict or hash from text + id = ( + get_property(row, self._id_column) + if self._id_column + else gen_sha512_hash({"text": text}, ["text"]) + ) + # title is optional - harvest from dict or use filename + num = f" ({index})" if len(rows) > 1 else "" + title = ( + get_property(row, self._title_column) + if self._title_column + else f"{path}{num}" + ) + creation_date = await self._storage.get_creation_date(path) + documents.append( + TextDocument( + id=id, + title=title, + text=text, + creation_date=creation_date, + raw_data=row, + ) + ) + return documents diff --git a/packages/graphrag-input/graphrag_input/text.py b/packages/graphrag-input/graphrag_input/text.py new file mode 100644 index 0000000000..5d42924181 --- /dev/null +++ b/packages/graphrag-input/graphrag_input/text.py @@ -0,0 +1,43 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'TextFileReader' model.""" + +import logging +from pathlib import Path + +from graphrag_input.hashing import gen_sha512_hash +from graphrag_input.input_reader import InputReader +from graphrag_input.text_document import TextDocument + +logger = logging.getLogger(__name__) + + +class TextFileReader(InputReader): + """Reader implementation for text files.""" + + def __init__(self, file_pattern: str | None = None, **kwargs): + super().__init__( + file_pattern=file_pattern if file_pattern is not None else ".*\\.txt$", + **kwargs, + ) + + async def read_file(self, path: str) -> list[TextDocument]: + """Read a text file into a list of documents. + + Args: + - path - The path to read the file from. + + Returns + ------- + - output - list with a TextDocument for each row in the file. + """ + text = await self._storage.get(path, encoding=self._encoding) + document = TextDocument( + id=gen_sha512_hash({"text": text}, ["text"]), + title=str(Path(path).name), + text=text, + creation_date=await self._storage.get_creation_date(path), + raw_data=None, + ) + return [document] diff --git a/packages/graphrag-input/graphrag_input/text_document.py b/packages/graphrag-input/graphrag_input/text_document.py new file mode 100644 index 0000000000..a771f30d43 --- /dev/null +++ b/packages/graphrag-input/graphrag_input/text_document.py @@ -0,0 +1,59 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""TextDocument dataclass.""" + +import logging +from dataclasses import dataclass +from typing import Any + +from graphrag_input.get_property import get_property + +logger = logging.getLogger(__name__) + + +@dataclass +class TextDocument: + """The TextDocument holds relevant content for GraphRAG indexing.""" + + id: str + """Unique identifier for the document.""" + text: str + """The main text content of the document.""" + title: str + """The title of the document.""" + creation_date: str + """The creation date of the document, ISO-8601 format.""" + raw_data: dict[str, Any] | None = None + """Raw data from source document.""" + + def get(self, field: str, default_value: Any = None) -> Any: + """ + Get a single field from the TextDocument. + + Functions like the get method on a dictionary, returning default_value if the field is not found. + + Supports nested fields using dot notation. + + This takes a two step approach for flexibility: + 1. If the field is one of the standard text document fields (id, title, text, creation_date), just grab it directly. This accommodates unstructured text for example, which just has the standard fields. + 2. Otherwise. try to extract it from the raw_data dict. This allows users to specify any column from the original input file. + + """ + if field in ["id", "title", "text", "creation_date"]: + return getattr(self, field) + + raw = self.raw_data or {} + try: + return get_property(raw, field) + except KeyError: + return default_value + + def collect(self, fields: list[str]) -> dict[str, Any]: + """Extract data fields from a TextDocument into a dict.""" + data = {} + for field in fields: + value = self.get(field) + if value is not None: + data[field] = value + return data diff --git a/packages/graphrag-input/pyproject.toml b/packages/graphrag-input/pyproject.toml new file mode 100644 index 0000000000..54ea11b85c --- /dev/null +++ b/packages/graphrag-input/pyproject.toml @@ -0,0 +1,44 @@ +[project] +name = "graphrag-input" +version = "2.7.1" +description = "Input document loading utilities for GraphRAG" +authors = [ + {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, + {name = "Andrés Morales Esquivel", email = "andresmor@microsoft.com"}, + {name = "Chris Trevino", email = "chtrevin@microsoft.com"}, + {name = "David Tittsworth", email = "datittsw@microsoft.com"}, + {name = "Dayenne de Souza", email = "ddesouza@microsoft.com"}, + {name = "Derek Worthen", email = "deworthe@microsoft.com"}, + {name = "Gaudy Blanco Meneses", email = "gaudyb@microsoft.com"}, + {name = "Ha Trinh", email = "trinhha@microsoft.com"}, + {name = "Jonathan Larson", email = "jolarso@microsoft.com"}, + {name = "Josh Bradley", email = "joshbradley@microsoft.com"}, + {name = "Kate Lytvynets", email = "kalytv@microsoft.com"}, + {name = "Kenny Zhang", email = "zhangken@microsoft.com"}, + {name = "Mónica Carvajal"}, + {name = "Nathan Evans", email = "naevans@microsoft.com"}, + {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, + {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, +] +license = {text = "MIT"} +readme = "README.md" +requires-python = ">=3.11,<3.14" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dependencies = [ + "graphrag-common==2.7.1", + "graphrag-storage==2.7.1 ", + "pydantic~=2.10", + "markitdown~=0.1.0" +] + +[project.urls] +Source = "https://github.com/microsoft/graphrag" + +[build-system] +requires = ["hatchling>=1.27.0,<2.0.0"] +build-backend = "hatchling.build" diff --git a/packages/graphrag-llm/README.md b/packages/graphrag-llm/README.md new file mode 100644 index 0000000000..30f84431fc --- /dev/null +++ b/packages/graphrag-llm/README.md @@ -0,0 +1,87 @@ +# GraphRAG LLM + +## Basic Completion + +```python +import os +from collections.abc import AsyncIterator, Iterator + +from dotenv import load_dotenv +from graphrag_llm.completion import LLMCompletion, create_completion +from graphrag_llm.config import AuthMethod, ModelConfig +from graphrag_llm.types import LLMCompletionChunk, LLMCompletionResponse +from graphrag_llm.utils import ( + gather_completion_response, + gather_completion_response_async, +) + +load_dotenv() + +api_key = os.getenv("GRAPHRAG_API_KEY") +model_config = ModelConfig( + model_provider="azure", + model=os.getenv("GRAPHRAG_MODEL", "gpt-4o"), + azure_deployment_name=os.getenv("GRAPHRAG_MODEL", "gpt-4o"), + api_base=os.getenv("GRAPHRAG_API_BASE"), + api_version=os.getenv("GRAPHRAG_API_VERSION", "2025-04-01-preview"), + api_key=api_key, + auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey, +) +llm_completion: LLMCompletion = create_completion(model_config) + +response: LLMCompletionResponse | Iterator[LLMCompletionChunk] = ( + llm_completion.completion( + messages="What is the capital of France?", + ) +) + +if isinstance(response, Iterator): + # Streaming response + for chunk in response: + print(chunk.choices[0].delta.content or "", end="", flush=True) +else: + # Non-streaming response + print(response.choices[0].message.content) + +# Alternatively, you can use the utility function to gather the full response +# The following is equivalent to the above logic. If all you care about is +# the first choice response then you can use the gather_completion_response +# utility function. +response_text = gather_completion_response(response) +print(response_text) +``` + +## Basic Embedding + +```python +from graphrag_llm.embedding import LLMEmbedding, create_embedding +from graphrag_llm.types import LLMEmbeddingResponse +from graphrag_llm.utils import gather_embeddings + +embedding_config = ModelConfig( + model_provider="azure", + model=os.getenv("GRAPHRAG_EMBEDDING_MODEL", "text-embedding-3-small"), + azure_deployment_name=os.getenv( + "GRAPHRAG_LLM_EMBEDDING_MODEL", "text-embedding-3-small" + ), + api_base=os.getenv("GRAPHRAG_API_BASE"), + api_version=os.getenv("GRAPHRAG_API_VERSION", "2025-04-01-preview"), + api_key=api_key, + auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey, +) + +llm_embedding: LLMEmbedding = create_embedding(embedding_config) + +embeddings_batch: LLMEmbeddingResponse = llm_embedding.embedding( + input=["Hello world", "How are you?"] +) +for data in embeddings_batch.data: + print(data.embedding[0:3]) + +# OR +batch = gather_embeddings(embeddings_batch) +for embedding in batch: + print(embedding[0:3]) +``` + +View the [notebooks](notebooks/README.md) for more examples. \ No newline at end of file diff --git a/packages/graphrag-llm/graphrag_llm/README.md b/packages/graphrag-llm/graphrag_llm/README.md new file mode 100644 index 0000000000..4ed411515f --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/README.md @@ -0,0 +1,83 @@ +# GraphRAG LLM + +View the [notebooks](notebooks) for detailed examples. + +## Basic Completion + +```python +import os +from collections.abc import AsyncIterator, Iterator + +from graphrag_llm.completion import LLMCompletion, create_completion +from graphrag_llm.config import ModelConfig +from graphrag_llm.types import LLMCompletionChunk, LLMCompletionResponse +from graphrag_llm.utils import ( + gather_completion_response, +) + +api_key = os.getenv("GRAPHRAG_API_KEY") +model_config = ModelConfig( + model_provider="azure", + model=os.getenv("GRAPHRAG_MODEL"), + azure_deployment_name=os.getenv("GRAPHRAG_MODEL"), + api_base=os.getenv("GRAPHRAG_API_BASE"), + api_version=os.getenv("GRAPHRAG_API_VERSION"), + api_key=api_key, + azure_managed_identity=not api_key, +) +llm_completion: LLMCompletion = create_completion(model_config) + +response: LLMCompletionResponse | Iterator[LLMCompletionChunk] = ( + llm_completion.completion( + messages="What is the capital of France?", + ) +) + +if isinstance(response, Iterator): + # Streaming response + for chunk in response: + print(chunk.choices[0].delta.content or "", end="", flush=True) +else: + # Non-streaming response + print(response.choices[0].message.content) + +# Alternatively, you can use the utility function to gather the full response +# The following is equivalent to the above logic. If all you care about is +# the first choice response then you can use the gather_completion_response +# utility function. +response_text = gather_completion_response(response) +print(response_text) +``` + +## Basic Embedding + +```python +import os +from collections.abc import AsyncIterator, Iterator + +from graphrag_llm.embedding import LLMEmbedding, create_embedding +from graphrag_llm.config import ModelConfig +from graphrag_llm.types import LLMEmbeddingResponse +from graphrag_llm.utils import ( + gather_completion_response, +) + +api_key = os.getenv("GRAPHRAG_API_KEY") +embedding_config = ModelConfig( + model_provider="azure", + model=os.getenv("GRAPHRAG_EMBEDDING_MODEL"), # type: ignore + azure_deployment_name=os.getenv("GRAPHRAG_EMBEDDING_MODEL"), + api_base=os.getenv("GRAPHRAG_API_BASE"), + api_version=os.getenv("GRAPHRAG_API_VERSION"), + api_key=api_key, + azure_managed_identity=not api_key, +) + +llm_embedding: LLMEmbedding = create_embedding(embedding_config) + +embeddings: LLMEmbeddingResponse = llm_embedding.embedding( + input=["Hello world", "How are you?"] +) +for data in embeddings.data: + print(data.embedding[0:3]) +``` \ No newline at end of file diff --git a/packages/graphrag-llm/graphrag_llm/__init__.py b/packages/graphrag-llm/graphrag_llm/__init__.py new file mode 100644 index 0000000000..c7e7b60983 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/__init__.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG LLM Package.""" + +import nest_asyncio2 + +nest_asyncio2.apply() # noqa: RUF067 diff --git a/packages/graphrag-llm/graphrag_llm/cache/__init__.py b/packages/graphrag-llm/graphrag_llm/cache/__init__.py new file mode 100644 index 0000000000..20d8b56f08 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/cache/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Cache module.""" + +from graphrag_llm.cache.create_cache_key import create_cache_key + +__all__ = [ + "create_cache_key", +] diff --git a/packages/graphrag-llm/graphrag_llm/cache/create_cache_key.py b/packages/graphrag-llm/graphrag_llm/cache/create_cache_key.py new file mode 100644 index 0000000000..7fa7ec26dd --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/cache/create_cache_key.py @@ -0,0 +1,71 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Create cache key.""" + +from typing import Any + +from graphrag_cache import create_cache_key as default_create_cache_key + +_CACHE_VERSION = 4 +""" +If there's a breaking change in what we cache, we should increment this version number to invalidate existing caches. + +fnllm was on cache version 2 and though we generate +similar cache keys, the objects stored in cache by fnllm and litellm are different. +Using litellm model providers will not be able to reuse caches generated by fnllm +thus we start with version 3 for litellm. + +graphrag-llm package is now on version 4. +This is to account for changes to the ModelConfig that affect the cache key and +occurred when pulling this package out of graphrag. +graphrag-llm, now that is supports metrics, also caches metrics which were not cached before. +""" + + +def create_cache_key( + input_args: dict[str, Any], +) -> str: + """Generate a cache key based on the model configuration and input arguments. + + Args + ____ + input_args: dict[str, Any] + The input arguments for the model call. + + Returns + ------- + str + The generated cache key in the format + `{prefix}_{data_hash}_v{version}` if prefix is provided. + """ + cache_key_parameters = _get_parameters( + input_args=input_args, + ) + return default_create_cache_key(cache_key_parameters) + + +def _get_parameters( + # model_config: "ModelConfig", + input_args: dict[str, Any], +) -> dict[str, Any]: + """Pluck out the parameters that define a cache key.""" + excluded_keys = [ + "metrics", + "stream", + "stream_options", + "mock_response", + "timeout", + "base_url", + "api_base", + "api_version", + "api_key", + "azure_ad_token_provider", + "drop_params", + ] + + parameters: dict[str, Any] = { + k: v for k, v in input_args.items() if k not in excluded_keys + } + + return parameters diff --git a/packages/graphrag-llm/graphrag_llm/completion/__init__.py b/packages/graphrag-llm/graphrag_llm/completion/__init__.py new file mode 100644 index 0000000000..ceb3a43bfb --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/completion/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Completion module for graphrag-llm.""" + +from graphrag_llm.completion.completion import LLMCompletion +from graphrag_llm.completion.completion_factory import ( + create_completion, + register_completion, +) + +__all__ = [ + "LLMCompletion", + "create_completion", + "register_completion", +] diff --git a/packages/graphrag-llm/graphrag_llm/completion/completion.py b/packages/graphrag-llm/graphrag_llm/completion/completion.py new file mode 100644 index 0000000000..0debab2731 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/completion/completion.py @@ -0,0 +1,276 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Completion Abstract Base Class.""" + +from abc import ABC, abstractmethod +from contextlib import contextmanager +from typing import TYPE_CHECKING, Any, Unpack + +from graphrag_llm.threading.completion_thread_runner import completion_thread_runner + +if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + + from graphrag_cache import Cache, CacheKeyCreator + + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsProcessor, MetricsStore + from graphrag_llm.rate_limit import RateLimiter + from graphrag_llm.retry import Retry + from graphrag_llm.threading.completion_thread_runner import ( + ThreadedLLMCompletionFunction, + ThreadedLLMCompletionResponseHandler, + ) + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import ( + LLMCompletionArgs, + LLMCompletionChunk, + LLMCompletionResponse, + ResponseFormat, + ) + + +class LLMCompletion(ABC): + """Abstract base class for language model completions.""" + + @abstractmethod + def __init__( + self, + *, + model_id: str, + model_config: "ModelConfig", + tokenizer: "Tokenizer", + metrics_store: "MetricsStore", + metrics_processor: "MetricsProcessor | None" = None, + rate_limiter: "RateLimiter | None" = None, + retrier: "Retry | None" = None, + cache: "Cache | None" = None, + cache_key_creator: "CacheKeyCreator", + **kwargs: Any, + ): + """Initialize the LLMCompletion. + + Args + ---- + model_id: str + The model ID, e.g., "openai/gpt-4o". + model_config: ModelConfig + The configuration for the language model. + tokenizer: Tokenizer + The tokenizer to use. + metrics_store: MetricsStore | None (default=None) + The metrics store to use. + metrics_processor: MetricsProcessor | None (default: None) + The metrics processor to use. + rate_limiter: RateLimiter | None (default=None) + The rate limiter to use. + retrier: Retry | None (default=None) + The retry strategy to use. + cache: Cache | None (default=None) + Optional cache for embeddings. + cache_key_creator: CacheKeyCreator | None (default=None) + Optional cache key creator function. + (dict[str, Any]) -> str + **kwargs: Any + Additional keyword arguments. + """ + raise NotImplementedError + + @abstractmethod + def supports_structured_response(self) -> bool: + """Whether the completion supports structured responses. + + Returns + ------- + bool: + True if structured responses are supported, False otherwise. + """ + raise NotImplementedError + + @abstractmethod + def completion( + self, + /, + **kwargs: Unpack["LLMCompletionArgs[ResponseFormat]"], + ) -> "LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk]": + """Sync completion method. + + Args + ---- + messages: LLMCompletionMessagesParam + The messages to send to the LLM. + Can be str | list[dict[str, str]] | list[ChatCompletionMessageParam]. + response_format: BaseModel | None (default=None) + The structured response format. + Must extend pydantic BaseModel. + stream: bool (default=False) + Whether to stream the response. + streaming is not supported when using response_format. + max_completion_tokens: int | None (default=None) + The maximum number of tokens to generate in the completion. + temperature: float | None (default=None) + The temperature to control how deterministic vs. creative the responses are. + top_p: float | None (default=None) + top_p for nucleus sampling, where the model considers tokens with + cumulative probabilities up to top_p. Values range from 0 to 1. + n: int | None (default=None) + The number of completions to generate for each prompt. + tools: list[Tool] | None (default=None) + Optional tools to use during completion. + https://docs.litellm.ai/docs/completion/function_call + **kwargs: Any + Additional keyword arguments. + + Returns + ------- + LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk]: + The completion response or an iterator of completion chunks if streaming. + + """ + raise NotImplementedError + + @abstractmethod + async def completion_async( + self, + /, + **kwargs: Unpack["LLMCompletionArgs[ResponseFormat]"], + ) -> "LLMCompletionResponse[ResponseFormat] | AsyncIterator[LLMCompletionChunk]": + """Async completion method. + + Args + ---- + messages: LLMCompletionMessagesParam + The messages to send to the LLM. + Can be str | list[dict[str, str]] | list[ChatCompletionMessageParam]. + response_format: BaseModel | None (default=None) + The structured response format. + Must extend pydantic BaseModel. + stream: bool (default=False) + Whether to stream the response. + streaming is not supported when using response_format. + max_completion_tokens: int | None (default=None) + The maximum number of tokens to generate in the completion. + temperature: float | None (default=None) + The temperature to control how deterministic vs. creative the responses are. + top_p: float | None (default=None) + top_p for nucleus sampling, where the model considers tokens with + cumulative probabilities up to top_p. Values range from 0 to 1. + n: int | None (default=None) + The number of completions to generate for each prompt. + tools: list[Tool] | None (default=None) + Optional tools to use during completion. + https://docs.litellm.ai/docs/completion/function_call + **kwargs: Any + Additional keyword arguments. + + Returns + ------- + LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk]: + The completion response or an iterator of completion chunks if streaming. + """ + raise NotImplementedError + + @contextmanager + def completion_thread_pool( + self, + *, + response_handler: "ThreadedLLMCompletionResponseHandler", + concurrency: int, + queue_limit: int = 0, + ) -> "Iterator[ThreadedLLMCompletionFunction]": + """Run a completion thread pool. + + Args + ---- + response_handler: ThreadedLLMCompletionResponseHandler + The callback function to handle completion responses. + (request_id, response|exception) -> Awaitable[None] | None + concurrency: int + The number of threads to spin up in a thread pool. + queue_limit: int (default=0) + The maximum number of items allowed in the input queue. + 0 means unlimited. + Set this to a value to create backpressure on the caller. + + Yields + ------ + ThreadedLLMCompletionFunction: + A function that can be used to submit completion requests to the thread pool. + (messages, request_id, **kwargs) -> None + + The thread pool will process the requests and invoke the provided callback + with the responses. + + same signature as LLMCompletionFunction but requires a `request_id` parameter + to identify the request and does not return anything. + """ + with completion_thread_runner( + completion=self.completion, + response_handler=response_handler, + concurrency=concurrency, + queue_limit=queue_limit, + metrics_store=self.metrics_store, + ) as completion: + yield completion + + def completion_batch( + self, + completion_requests: list["LLMCompletionArgs[ResponseFormat]"], + *, + concurrency: int, + queue_limit: int = 0, + ) -> list[ + "LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk] | Exception" + ]: + """Process a batch of completion requests using a thread pool. + + Args + ---- + completion_requests: list[LLMCompletionArgs] + A list of completion request arguments to process in parallel. + concurrency: int + The number of threads to spin up in a thread pool. + queue_limit: int (default=0) + The maximum number of items allowed in the input queue. + 0 means unlimited. + Set this to a value to create backpressure on the caller. + + Returns + ------- + list[LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk] | Exception]: + A list of completion responses or exceptions corresponding to all the requests. + """ + responses: list[ + LLMCompletionResponse[ResponseFormat] + | Iterator[LLMCompletionChunk] + | Exception + ] = [None] * len(completion_requests) # type: ignore + + def handle_response( + request_id: str, + resp: "LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk] | Exception", + ): + responses[int(request_id)] = resp + + with self.completion_thread_pool( + response_handler=handle_response, + concurrency=concurrency, + queue_limit=queue_limit, + ) as threaded_completion: + for idx, request in enumerate(completion_requests): + threaded_completion(request_id=str(idx), **request) + + return responses + + @property + @abstractmethod + def metrics_store(self) -> "MetricsStore": + """Metrics store.""" + raise NotImplementedError + + @property + @abstractmethod + def tokenizer(self) -> "Tokenizer": + """Tokenizer.""" + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/completion/completion_factory.py b/packages/graphrag-llm/graphrag_llm/completion/completion_factory.py new file mode 100644 index 0000000000..e1923b9c63 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/completion/completion_factory.py @@ -0,0 +1,150 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Completion factory.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING, Any + +from graphrag_common.factory import Factory + +from graphrag_llm.cache import create_cache_key +from graphrag_llm.config.tokenizer_config import TokenizerConfig +from graphrag_llm.config.types import LLMProviderType +from graphrag_llm.metrics.noop_metrics_store import NoopMetricsStore +from graphrag_llm.tokenizer.tokenizer_factory import create_tokenizer + +if TYPE_CHECKING: + from graphrag_cache import Cache, CacheKeyCreator + from graphrag_common.factory import ServiceScope + + from graphrag_llm.completion.completion import LLMCompletion + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsProcessor, MetricsStore + from graphrag_llm.rate_limit import RateLimiter + from graphrag_llm.retry import Retry + from graphrag_llm.tokenizer import Tokenizer + + +class CompletionFactory(Factory["LLMCompletion"]): + """Factory for creating Completion instances.""" + + +completion_factory = CompletionFactory() + + +def register_completion( + completion_type: str, + completion_initializer: Callable[..., "LLMCompletion"], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom completion implementation. + + Args + ---- + completion_type: str + The completion id to register. + completion_initializer: Callable[..., LLMCompletion] + The completion initializer to register. + scope: ServiceScope (default: "transient") + The service scope for the completion. + """ + completion_factory.register(completion_type, completion_initializer, scope) + + +def create_completion( + model_config: "ModelConfig", + *, + cache: "Cache | None" = None, + cache_key_creator: "CacheKeyCreator | None" = None, + tokenizer: "Tokenizer | None" = None, +) -> "LLMCompletion": + """Create a Completion instance based on the model configuration. + + Args + ---- + model_config: ModelConfig + The configuration for the model. + cache: Cache | None (default: None) + An optional cache instance. + cache_key_creator: CacheKeyCreator | None (default: create_cache_key) + An optional cache key creator function. + (dict[str, Any]) -> str + tokenizer: Tokenizer | None (default: litellm) + An optional tokenizer instance. + + Returns + ------- + LLMCompletion: + An instance of a LLMCompletion subclass. + """ + cache_key_creator = cache_key_creator or create_cache_key + model_id = f"{model_config.model_provider}/{model_config.model}" + strategy = model_config.type + extra: dict[str, Any] = model_config.model_extra or {} + + if strategy not in completion_factory: + match strategy: + case LLMProviderType.LiteLLM: + from graphrag_llm.completion.lite_llm_completion import ( + LiteLLMCompletion, + ) + + register_completion( + completion_type=LLMProviderType.LiteLLM, + completion_initializer=LiteLLMCompletion, + scope="singleton", + ) + case LLMProviderType.MockLLM: + from graphrag_llm.completion.mock_llm_completion import ( + MockLLMCompletion, + ) + + register_completion( + completion_type=LLMProviderType.MockLLM, + completion_initializer=MockLLMCompletion, + ) + case _: + msg = f"ModelConfig.type '{strategy}' is not registered in the CompletionFactory. Registered strategies: {', '.join(completion_factory.keys())}" + raise ValueError(msg) + + tokenizer = tokenizer or create_tokenizer(TokenizerConfig(model_id=model_id)) + + rate_limiter: RateLimiter | None = None + if model_config.rate_limit: + from graphrag_llm.rate_limit.rate_limit_factory import create_rate_limiter + + rate_limiter = create_rate_limiter(rate_limit_config=model_config.rate_limit) + + retrier: Retry | None = None + if model_config.retry: + from graphrag_llm.retry.retry_factory import create_retry + + retrier = create_retry(retry_config=model_config.retry) + + metrics_store: MetricsStore = NoopMetricsStore() + metrics_processor: MetricsProcessor | None = None + if model_config.metrics: + from graphrag_llm.metrics import create_metrics_processor, create_metrics_store + + metrics_store = create_metrics_store( + config=model_config.metrics, + id=model_id, + ) + metrics_processor = create_metrics_processor(model_config.metrics) + + return completion_factory.create( + strategy=strategy, + init_args={ + **extra, + "model_id": model_id, + "model_config": model_config, + "tokenizer": tokenizer, + "metrics_store": metrics_store, + "metrics_processor": metrics_processor, + "rate_limiter": rate_limiter, + "retrier": retrier, + "cache": cache, + "cache_key_creator": cache_key_creator, + }, + ) diff --git a/packages/graphrag-llm/graphrag_llm/completion/lite_llm_completion.py b/packages/graphrag-llm/graphrag_llm/completion/lite_llm_completion.py new file mode 100644 index 0000000000..794296604c --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/completion/lite_llm_completion.py @@ -0,0 +1,314 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLMCompletion based on litellm.""" + +from collections.abc import AsyncIterator, Iterator +from typing import TYPE_CHECKING, Any, Unpack + +import litellm +from azure.identity import DefaultAzureCredential, get_bearer_token_provider +from litellm import ModelResponse, supports_response_schema # type: ignore + +from graphrag_llm.completion.completion import LLMCompletion +from graphrag_llm.config.types import AuthMethod +from graphrag_llm.middleware import ( + with_middleware_pipeline, +) +from graphrag_llm.types import LLMCompletionChunk, LLMCompletionResponse +from graphrag_llm.utils import ( + structure_completion_response, +) + +if TYPE_CHECKING: + from graphrag_cache import Cache, CacheKeyCreator + + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsProcessor, MetricsStore + from graphrag_llm.rate_limit import RateLimiter + from graphrag_llm.retry import Retry + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import ( + AsyncLLMCompletionFunction, + LLMCompletionArgs, + LLMCompletionFunction, + LLMCompletionMessagesParam, + Metrics, + ResponseFormat, + ) + + +litellm.suppress_debug_info = True + + +class LiteLLMCompletion(LLMCompletion): + """LLMCompletion based on litellm.""" + + _model_config: "ModelConfig" + _model_id: str + _track_metrics: bool = False + _metrics_store: "MetricsStore" + _metrics_processor: "MetricsProcessor | None" + _cache: "Cache | None" + _cache_key_creator: "CacheKeyCreator" + _tokenizer: "Tokenizer" + _rate_limiter: "RateLimiter | None" + _retrier: "Retry | None" + + def __init__( + self, + *, + model_id: str, + model_config: "ModelConfig", + tokenizer: "Tokenizer", + metrics_store: "MetricsStore", + metrics_processor: "MetricsProcessor | None" = None, + rate_limiter: "RateLimiter | None" = None, + retrier: "Retry | None" = None, + cache: "Cache | None" = None, + cache_key_creator: "CacheKeyCreator", + azure_cognitive_services_audience: str = "https://cognitiveservices.azure.com/.default", + drop_unsupported_params: bool = True, + **kwargs: Any, + ) -> None: + """Initialize LiteLLMCompletion. + + Args + ---- + model_id: str + The LiteLLM model ID, e.g., "openai/gpt-4o" + model_config: ModelConfig + The configuration for the model. + tokenizer: Tokenizer + The tokenizer to use. + metrics_store: MetricsStore | None (default: None) + The metrics store to use. + metrics_processor: MetricsProcessor | None (default: None) + The metrics processor to use. + cache: Cache | None (default: None) + An optional cache instance. + cache_key_prefix: str | None (default: "chat") + The cache key prefix. Required if cache is provided. + rate_limiter: RateLimiter | None (default: None) + The rate limiter to use. + retrier: Retry | None (default: None) + The retry strategy to use. + azure_cognitive_services_audience: str (default: "https://cognitiveservices.azure.com/.default") + The audience for Azure Cognitive Services when using Managed Identity. + drop_unsupported_params: bool (default: True) + Whether to drop unsupported parameters for the model provider. + """ + self._model_id = model_id + self._model_config = model_config + self._tokenizer = tokenizer + self._metrics_store = metrics_store + self._metrics_processor = metrics_processor + self._cache = cache + self._track_metrics = metrics_processor is not None + self._cache_key_creator = cache_key_creator + self._rate_limiter = rate_limiter + self._retrier = retrier + + self._completion, self._completion_async = _create_base_completions( + model_config=model_config, + drop_unsupported_params=drop_unsupported_params, + azure_cognitive_services_audience=azure_cognitive_services_audience, + ) + + self._completion, self._completion_async = with_middleware_pipeline( + model_config=self._model_config, + model_fn=self._completion, + async_model_fn=self._completion_async, + request_type="chat", + cache=self._cache, + cache_key_creator=self._cache_key_creator, + tokenizer=self._tokenizer, + metrics_processor=self._metrics_processor, + rate_limiter=self._rate_limiter, + retrier=self._retrier, + ) + + def supports_structured_response(self) -> bool: + """Check if the model supports structured response.""" + return supports_response_schema(self._model_id) + + def completion( + self, + /, + **kwargs: Unpack["LLMCompletionArgs[ResponseFormat]"], + ) -> "LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk]": + """Sync completion method.""" + messages: LLMCompletionMessagesParam = kwargs.pop("messages") + response_format = kwargs.pop("response_format", None) + if response_format and not self.supports_structured_response(): + msg = f"Model '{self._model_id}' does not support response schemas." + raise ValueError(msg) + + is_streaming = kwargs.get("stream") or False + + if response_format is not None and is_streaming: + msg = "response_format is not supported for streaming completions." + raise ValueError(msg) + + request_metrics: Metrics | None = kwargs.pop("metrics", None) or {} + if not self._track_metrics: + request_metrics = None + + if isinstance(messages, str): + messages = [{"role": "user", "content": messages}] + + try: + response = self._completion( + messages=messages, + metrics=request_metrics, + response_format=response_format, + **kwargs, # type: ignore + ) + if response_format is not None: + structured_response = structure_completion_response( + response.content, response_format + ) + response.formatted_response = structured_response + return response + finally: + if request_metrics is not None: + self._metrics_store.update_metrics(metrics=request_metrics) + + async def completion_async( + self, + /, + **kwargs: Unpack["LLMCompletionArgs[ResponseFormat]"], + ) -> "LLMCompletionResponse[ResponseFormat] | AsyncIterator[LLMCompletionChunk]": + """Async completion method.""" + messages: LLMCompletionMessagesParam = kwargs.pop("messages") + response_format = kwargs.pop("response_format", None) + if response_format and not supports_response_schema( + self._model_id, + ): + msg = f"Model '{self._model_id}' does not support response schemas." + raise ValueError(msg) + + is_streaming = kwargs.get("stream") or False + + if response_format is not None and is_streaming: + msg = "response_format is not supported for streaming completions." + raise ValueError(msg) + + request_metrics: Metrics | None = kwargs.pop("metrics", None) or {} + if not self._track_metrics: + request_metrics = None + + if isinstance(messages, str): + messages = [{"role": "user", "content": messages}] + + try: + response = await self._completion_async( + messages=messages, + metrics=request_metrics, + response_format=response_format, + **kwargs, # type: ignore + ) + if response_format is not None: + structured_response = structure_completion_response( + response.content, response_format + ) + response.formatted_response = structured_response + return response + finally: + if request_metrics is not None: + self._metrics_store.update_metrics(metrics=request_metrics) + + @property + def metrics_store(self) -> "MetricsStore": + """Get metrics store.""" + return self._metrics_store + + @property + def tokenizer(self) -> "Tokenizer": + """Get tokenizer.""" + return self._tokenizer + + +def _create_base_completions( + *, + model_config: "ModelConfig", + drop_unsupported_params: bool, + azure_cognitive_services_audience: str, +) -> tuple["LLMCompletionFunction", "AsyncLLMCompletionFunction"]: + """Create base completions for LiteLLM. + + Convert litellm completion functions to graphrag_llm LLMCompletionFunction. + LLMCompletionFunction is close to the litellm completion function signature, + but uses a few extra params such as metrics. Remove graphrag_llm LLMCompletionFunction + specific params before calling litellm completion functions. + """ + model_provider = model_config.model_provider + model = model_config.azure_deployment_name or model_config.model + + base_args: dict[str, Any] = { + "drop_params": drop_unsupported_params, + "model": f"{model_provider}/{model}", + "api_key": model_config.api_key, + "api_base": model_config.api_base, + "api_version": model_config.api_version, + **model_config.call_args, + } + + if model_config.auth_method == AuthMethod.AzureManagedIdentity: + base_args["azure_ad_token_provider"] = get_bearer_token_provider( + DefaultAzureCredential(), azure_cognitive_services_audience + ) + + def _base_completion( + **kwargs: Any, + ) -> LLMCompletionResponse | Iterator[LLMCompletionChunk]: + kwargs.pop("metrics", None) + mock_response: str | None = kwargs.pop("mock_response", None) + json_object: bool | None = kwargs.pop("response_format_json_object", None) + new_args: dict[str, Any] = {**base_args, **kwargs} + + if model_config.mock_responses and mock_response is not None: + new_args["mock_response"] = mock_response + + if json_object and "response_format" not in new_args: + new_args["response_format"] = {"type": "json_object"} + + response = litellm.completion( + **new_args, + ) + if isinstance(response, ModelResponse): + return LLMCompletionResponse(**response.model_dump()) + + def _run_iterator() -> Iterator[LLMCompletionChunk]: + for chunk in response: + yield LLMCompletionChunk(**chunk.model_dump()) + + return _run_iterator() + + async def _base_completion_async( + **kwargs: Any, + ) -> LLMCompletionResponse | AsyncIterator[LLMCompletionChunk]: + kwargs.pop("metrics", None) + mock_response: str | None = kwargs.pop("mock_response", None) + json_object: bool | None = kwargs.pop("response_format_json_object", None) + new_args: dict[str, Any] = {**base_args, **kwargs} + + if model_config.mock_responses and mock_response is not None: + new_args["mock_response"] = mock_response + + if json_object and "response_format" not in new_args: + new_args["response_format"] = {"type": "json_object"} + + response = await litellm.acompletion( + **new_args, + ) + if isinstance(response, ModelResponse): + return LLMCompletionResponse(**response.model_dump()) + + async def _run_iterator() -> AsyncIterator[LLMCompletionChunk]: + async for chunk in response: + yield LLMCompletionChunk(**chunk.model_dump()) # type: ignore + + return _run_iterator() + + return (_base_completion, _base_completion_async) diff --git a/packages/graphrag-llm/graphrag_llm/completion/mock_llm_completion.py b/packages/graphrag-llm/graphrag_llm/completion/mock_llm_completion.py new file mode 100644 index 0000000000..c1e29fcfc4 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/completion/mock_llm_completion.py @@ -0,0 +1,134 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Mock LLMCompletion.""" + +from typing import TYPE_CHECKING, Any, Unpack + +import litellm + +from graphrag_llm.completion.completion import LLMCompletion +from graphrag_llm.utils import ( + create_completion_response, + structure_completion_response, +) + +if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsStore + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import ( + LLMCompletionArgs, + LLMCompletionChunk, + LLMCompletionResponse, + ResponseFormat, + ) + + +litellm.suppress_debug_info = True + + +class MockLLMCompletion(LLMCompletion): + """LLMCompletion based on litellm.""" + + _metrics_store: "MetricsStore" + _tokenizer: "Tokenizer" + _mock_responses: list[str] + _mock_index: int = 0 + + def __init__( + self, + *, + model_config: "ModelConfig", + tokenizer: "Tokenizer", + metrics_store: "MetricsStore", + **kwargs: Any, + ) -> None: + """Initialize LiteLLMCompletion. + + Args + ---- + model_id: str + The LiteLLM model ID, e.g., "openai/gpt-4o" + model_config: ModelConfig + The configuration for the model. + tokenizer: Tokenizer + The tokenizer to use. + metrics_store: MetricsStore | None (default: None) + The metrics store to use. + metrics_processor: MetricsProcessor | None (default: None) + The metrics processor to use. + cache: Cache | None (default: None) + An optional cache instance. + cache_key_prefix: str | None (default: "chat") + The cache key prefix. Required if cache is provided. + rate_limiter: RateLimiter | None (default: None) + The rate limiter to use. + retrier: Retry | None (default: None) + The retry strategy to use. + azure_cognitive_services_audience: str (default: "https://cognitiveservices.azure.com/.default") + The audience for Azure Cognitive Services when using Managed Identity. + drop_unsupported_params: bool (default: True) + Whether to drop unsupported parameters for the model provider. + """ + self._tokenizer = tokenizer + self._metrics_store = metrics_store + + mock_responses = model_config.mock_responses + if not isinstance(mock_responses, list) or len(mock_responses) == 0: + msg = "ModelConfig.mock_responses must be a non-empty list." + raise ValueError(msg) + + if not all(isinstance(resp, str) for resp in mock_responses): + msg = "Each item in ModelConfig.mock_responses must be a string." + raise ValueError(msg) + + self._mock_responses = mock_responses # type: ignore + + def supports_structured_response(self) -> bool: + """Check if the model supports structured response.""" + return True + + def completion( + self, + /, + **kwargs: Unpack["LLMCompletionArgs[ResponseFormat]"], + ) -> "LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk]": + """Sync completion method.""" + response_format = kwargs.pop("response_format", None) + + is_streaming = kwargs.get("stream", False) + if is_streaming: + msg = "MockLLMCompletion does not support streaming completions." + raise ValueError(msg) + + response = create_completion_response( + self._mock_responses[self._mock_index % len(self._mock_responses)] + ) + self._mock_index += 1 + if response_format is not None: + structured_response = structure_completion_response( + response.content, response_format + ) + response.formatted_response = structured_response + return response + + async def completion_async( + self, + /, + **kwargs: Unpack["LLMCompletionArgs[ResponseFormat]"], + ) -> "LLMCompletionResponse[ResponseFormat] | AsyncIterator[LLMCompletionChunk]": + """Async completion method.""" + return self.completion(**kwargs) # type: ignore + + @property + def metrics_store(self) -> "MetricsStore": + """Get metrics store.""" + return self._metrics_store + + @property + def tokenizer(self) -> "Tokenizer": + """Get tokenizer.""" + return self._tokenizer diff --git a/packages/graphrag-llm/graphrag_llm/config/__init__.py b/packages/graphrag-llm/graphrag_llm/config/__init__.py new file mode 100644 index 0000000000..fc9023dc1b --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/config/__init__.py @@ -0,0 +1,42 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Config module for graphrag-llm.""" + +from graphrag_llm.config.metrics_config import MetricsConfig +from graphrag_llm.config.model_config import ModelConfig +from graphrag_llm.config.rate_limit_config import RateLimitConfig +from graphrag_llm.config.retry_config import RetryConfig +from graphrag_llm.config.template_engine_config import TemplateEngineConfig +from graphrag_llm.config.tokenizer_config import TokenizerConfig +from graphrag_llm.config.types import ( + AuthMethod, + LLMProviderType, + MetricsProcessorType, + MetricsStoreType, + MetricsWriterType, + RateLimitType, + RetryType, + TemplateEngineType, + TemplateManagerType, + TokenizerType, +) + +__all__ = [ + "AuthMethod", + "LLMProviderType", + "MetricsConfig", + "MetricsProcessorType", + "MetricsStoreType", + "MetricsWriterType", + "ModelConfig", + "RateLimitConfig", + "RateLimitType", + "RetryConfig", + "RetryType", + "TemplateEngineConfig", + "TemplateEngineType", + "TemplateManagerType", + "TokenizerConfig", + "TokenizerType", +] diff --git a/packages/graphrag-llm/graphrag_llm/config/metrics_config.py b/packages/graphrag-llm/graphrag_llm/config/metrics_config.py new file mode 100644 index 0000000000..9d8f88a047 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/config/metrics_config.py @@ -0,0 +1,57 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics configuration.""" + +from pydantic import BaseModel, ConfigDict, Field, model_validator + +from graphrag_llm.config.types import ( + MetricsProcessorType, + MetricsStoreType, + MetricsWriterType, +) + + +class MetricsConfig(BaseModel): + """Configuration for metrics.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom metrics implementations.""" + + type: str = Field( + default=MetricsProcessorType.Default, + description="MetricsProcessor implementation to use.", + ) + + store: str = Field( + default=MetricsStoreType.Memory, + description="MetricsStore implementation to use. [memory] (default: memory).", + ) + + writer: str | None = Field( + default=MetricsWriterType.Log, + description="MetricsWriter implementation to use. [log, file] (default: log).", + ) + + log_level: int | None = Field( + default=None, + description="Log level to use when using the 'Log' metrics writer. (default: INFO)", + ) + + base_dir: str | None = Field( + default=None, + description="Base directory for file-based metrics writer. (default: ./metrics)", + ) + + def _validate_file_metrics_writer_config(self) -> None: + """Validate parameters for file-based metrics writer.""" + if self.base_dir is not None and self.base_dir.strip() == "": + msg = "base_dir must be specified for file-based metrics writer." + raise ValueError(msg) + + @model_validator(mode="after") + def _validate_model(self): + """Validate the metrics configuration based on its writer type.""" + if self.writer == MetricsWriterType.File: + self._validate_file_metrics_writer_config() + return self diff --git a/packages/graphrag-llm/graphrag_llm/config/model_config.py b/packages/graphrag-llm/graphrag_llm/config/model_config.py new file mode 100644 index 0000000000..38cfb342d9 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/config/model_config.py @@ -0,0 +1,111 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Language model configuration.""" + +import logging +from typing import Any + +from pydantic import BaseModel, ConfigDict, Field, model_validator + +from graphrag_llm.config.metrics_config import MetricsConfig +from graphrag_llm.config.rate_limit_config import RateLimitConfig +from graphrag_llm.config.retry_config import RetryConfig +from graphrag_llm.config.types import AuthMethod, LLMProviderType + +logger = logging.getLogger(__name__) + + +class ModelConfig(BaseModel): + """Configuration for a language model.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom LLM provider implementations.""" + + type: str = Field( + default=LLMProviderType.LiteLLM, + description="The type of LLM provider to use. (default: litellm)", + ) + + model_provider: str = Field( + description="The provider of the model, e.g., 'openai', 'azure', etc.", + ) + + model: str = Field( + description="The specific model to use, e.g., 'gpt-4o', 'gpt-3.5-turbo', etc.", + ) + + call_args: dict[str, Any] = Field( + default_factory=dict, + description="Base keyword arguments to pass to the model provider's API.", + ) + + api_base: str | None = Field( + default=None, + description="The base URL for the API, required for some providers like Azure.", + ) + + api_version: str | None = Field( + default=None, + description="The version of the API to use.", + ) + + api_key: str | None = Field( + default=None, + description="API key for authentication with the model provider.", + ) + + auth_method: AuthMethod = Field( + default=AuthMethod.ApiKey, + description="The authentication method to use. (default: api_key)", + ) + + azure_deployment_name: str | None = Field( + default=None, + description="The deployment name for Azure models.", + ) + + retry: RetryConfig | None = Field( + default=None, + description="Configuration for the retry strategy.", + ) + + rate_limit: RateLimitConfig | None = Field( + default=None, + description="Configuration for the rate limit behavior.", + ) + + metrics: MetricsConfig | None = Field( + default_factory=MetricsConfig, + description="Specify and configure the metric services.", + ) + + mock_responses: list[str] | list[float] = Field( + default_factory=list, + description="List of mock responses for testing.", + ) + + def _validate_lite_llm_config(self) -> None: + """Validate LiteLLM specific configuration.""" + if self.model_provider == "azure" and not self.api_base: + msg = "api_base must be specified with the 'azure' model provider." + raise ValueError(msg) + + if self.model_provider != "azure" and self.azure_deployment_name is not None: + msg = "azure_deployment_name should not be specified for non-Azure model providers." + raise ValueError(msg) + + if self.auth_method == AuthMethod.AzureManagedIdentity: + if self.api_key is not None: + msg = "api_key should not be set when using Azure Managed Identity." + raise ValueError(msg) + elif not self.api_key: + msg = "api_key must be set when auth_method=api_key." + raise ValueError(msg) + + @model_validator(mode="after") + def _validate_model(self): + """Validate model configuration after initialization.""" + if self.type == LLMProviderType.LiteLLM: + self._validate_lite_llm_config() + return self diff --git a/packages/graphrag-llm/graphrag_llm/config/rate_limit_config.py b/packages/graphrag-llm/graphrag_llm/config/rate_limit_config.py new file mode 100644 index 0000000000..df654b8e88 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/config/rate_limit_config.py @@ -0,0 +1,60 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""RateLimit configuration.""" + +from pydantic import BaseModel, ConfigDict, Field, model_validator + +from graphrag_llm.config.types import RateLimitType + + +class RateLimitConfig(BaseModel): + """Configuration for rate limit behavior.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom RateLimit implementations.""" + + type: str = Field( + default=RateLimitType.SlidingWindow, + description="The type of rate limit strategy to use. [sliding_window] (default: sliding_window).", + ) + + period_in_seconds: int | None = Field( + default=None, + description="The period in seconds for the rate limit window. (default: 60).", + ) + + requests_per_period: int | None = Field( + default=None, + description="The maximum number of requests allowed per period. (default: None, no limit).", + ) + + tokens_per_period: int | None = Field( + default=None, + description="The maximum number of tokens allowed per period. (default: None, no limit).", + ) + + def _validate_sliding_window_config(self) -> None: + """Validate Sliding Window rate limit configuration.""" + if self.period_in_seconds is not None and self.period_in_seconds <= 0: + msg = "period_in_seconds must be a positive integer for Sliding Window rate limit." + raise ValueError(msg) + + if not self.requests_per_period and not self.tokens_per_period: + msg = "At least one of requests_per_period or tokens_per_period must be specified for Sliding Window rate limit." + raise ValueError(msg) + + if self.requests_per_period is not None and self.requests_per_period <= 0: + msg = "requests_per_period must be a positive integer for Sliding Window rate limit." + raise ValueError(msg) + + if self.tokens_per_period is not None and self.tokens_per_period <= 0: + msg = "tokens_per_period must be a positive integer for Sliding Window rate limit." + raise ValueError(msg) + + @model_validator(mode="after") + def _validate_model(self): + """Validate the rate limit configuration based on its type.""" + if self.type == RateLimitType.SlidingWindow: + self._validate_sliding_window_config() + return self diff --git a/packages/graphrag-llm/graphrag_llm/config/retry_config.py b/packages/graphrag-llm/graphrag_llm/config/retry_config.py new file mode 100644 index 0000000000..01042da70b --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/config/retry_config.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Retry configuration.""" + +from pydantic import BaseModel, ConfigDict, Field, model_validator + +from graphrag_llm.config.types import RetryType + + +class RetryConfig(BaseModel): + """Configuration for retry behavior.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom Retry implementations.""" + + type: str = Field( + default=RetryType.ExponentialBackoff, + description="The type of retry strategy to use. [exponential_backoff, immediate] (default: exponential_backoff).", + ) + + max_retries: int | None = Field( + default=None, + description="The maximum number of retry attempts.", + ) + + base_delay: float | None = Field( + default=None, + description="The base delay in seconds for exponential backoff.", + ) + + jitter: bool | None = Field( + default=None, + description="Whether to apply jitter to the delay intervals in exponential backoff.", + ) + + max_delay: float | None = Field( + default=None, + description="The maximum delay in seconds between retries.", + ) + + def _validate_exponential_backoff_config(self) -> None: + """Validate Exponential Backoff retry configuration.""" + if self.max_retries is not None and self.max_retries <= 1: + msg = "max_retries must be greater than 1 for Exponential Backoff retry." + raise ValueError(msg) + + if self.base_delay is not None and self.base_delay <= 1.0: + msg = "base_delay must be greater than 1.0 for Exponential Backoff retry." + raise ValueError(msg) + + if self.max_delay is not None and self.max_delay <= 1: + msg = "max_delay must be greater than 1 for Exponential Backoff retry." + raise ValueError(msg) + + def _validate_immediate_config(self) -> None: + """Validate Immediate retry configuration.""" + if self.max_retries is not None and self.max_retries <= 1: + msg = "max_retries must be greater than 1 for Immediate retry." + raise ValueError(msg) + + @model_validator(mode="after") + def _validate_model(self): + """Validate the retry configuration based on its type.""" + if self.type == RetryType.ExponentialBackoff: + self._validate_exponential_backoff_config() + elif self.type == RetryType.Immediate: + self._validate_immediate_config() + return self diff --git a/packages/graphrag-llm/graphrag_llm/config/template_engine_config.py b/packages/graphrag-llm/graphrag_llm/config/template_engine_config.py new file mode 100644 index 0000000000..02d20acd33 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/config/template_engine_config.py @@ -0,0 +1,69 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Template engine configuration.""" + +from pydantic import BaseModel, ConfigDict, Field, model_validator + +from graphrag_llm.config.types import ( + TemplateEngineType, + TemplateManagerType, +) + + +class TemplateEngineConfig(BaseModel): + """Configuration for the template engine.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom metrics implementations.""" + + type: str = Field( + default=TemplateEngineType.Jinja, + description="The template engine to use. [jinja]", + ) + + template_manager: str = Field( + default=TemplateManagerType.File, + description="The template manager to use. [file, memory] (default: file)", + ) + + base_dir: str | None = Field( + default=None, + description="The base directory for file-based template managers.", + ) + + template_extension: str | None = Field( + default=None, + description="The file extension for locating templates in file-based template managers.", + ) + + encoding: str | None = Field( + default=None, + description="The file encoding for reading templates in file-based template managers.", + ) + + def _validate_file_template_manager_config(self) -> None: + """Validate parameters for file-based template managers.""" + if self.base_dir is not None and self.base_dir.strip() == "": + msg = "base_dir must be specified for file-based template managers." + raise ValueError(msg) + + if ( + self.template_extension is not None + and self.template_extension.strip() == "" + ): + msg = "template_extension cannot be an empty string for file-based template managers." + raise ValueError(msg) + + if ( + self.template_extension is not None + and not self.template_extension.startswith(".") + ): + self.template_extension = f".{self.template_extension}" + + @model_validator(mode="after") + def _validate_model(self): + """Validate the template engine configuration based on its type.""" + if self.template_manager == TemplateManagerType.File: + self._validate_file_template_manager_config() + return self diff --git a/packages/graphrag-llm/graphrag_llm/config/tokenizer_config.py b/packages/graphrag-llm/graphrag_llm/config/tokenizer_config.py new file mode 100644 index 0000000000..b7e6545755 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/config/tokenizer_config.py @@ -0,0 +1,51 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Tokenizer model configuration.""" + +from pydantic import BaseModel, ConfigDict, Field, model_validator + +from graphrag_llm.config.types import TokenizerType + + +class TokenizerConfig(BaseModel): + """Configuration for a tokenizer.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom LLM provider implementations.""" + + type: str = Field( + default=TokenizerType.LiteLLM, + description="The type of tokenizer to use. [litellm] (default: litellm).", + ) + + model_id: str | None = Field( + default=None, + description="The identifier for the tokenizer model. Example: openai/gpt-4o. Used by the litellm tokenizer.", + ) + + encoding_name: str | None = Field( + default=None, + description="The encoding name for the tokenizer. Example: gpt-4o.", + ) + + def _validate_litellm_config(self) -> None: + """Validate LiteLLM tokenizer configuration.""" + if self.model_id is None or self.model_id.strip() == "": + msg = "model_id must be specified for LiteLLM tokenizer." + raise ValueError(msg) + + def _validate_tiktoken_config(self) -> None: + """Validate TikToken tokenizer configuration.""" + if self.encoding_name is None or self.encoding_name.strip() == "": + msg = "encoding_name must be specified for TikToken tokenizer." + raise ValueError(msg) + + @model_validator(mode="after") + def _validate_model(self): + """Validate the tokenizer configuration based on its type.""" + if self.type == TokenizerType.LiteLLM: + self._validate_litellm_config() + elif self.type == TokenizerType.Tiktoken: + self._validate_tiktoken_config() + return self diff --git a/packages/graphrag-llm/graphrag_llm/config/types.py b/packages/graphrag-llm/graphrag_llm/config/types.py new file mode 100644 index 0000000000..320e8765fb --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/config/types.py @@ -0,0 +1,72 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + + +"""GraphRAG LLM configuration types.""" + +from enum import StrEnum + + +class LLMProviderType(StrEnum): + """Enum for LLM provider types.""" + + LiteLLM = "litellm" + MockLLM = "mock" + + +class AuthMethod(StrEnum): + """Enum for authentication methods.""" + + ApiKey = "api_key" + AzureManagedIdentity = "azure_managed_identity" + + +class MetricsProcessorType(StrEnum): + """Enum for built-in MetricsProcessor types.""" + + Default = "default" + + +class MetricsWriterType(StrEnum): + """Enum for built-in MetricsWriter types.""" + + Log = "log" + File = "file" + + +class MetricsStoreType(StrEnum): + """Enum for built-in MetricsStore types.""" + + Memory = "memory" + + +class RateLimitType(StrEnum): + """Enum for built-in RateLimit types.""" + + SlidingWindow = "sliding_window" + + +class RetryType(StrEnum): + """Enum for built-in Retry types.""" + + ExponentialBackoff = "exponential_backoff" + Immediate = "immediate" + + +class TemplateEngineType(StrEnum): + """Enum for built-in TemplateEngine types.""" + + Jinja = "jinja" + + +class TemplateManagerType(StrEnum): + """Enum for built-in TemplateEngine types.""" + + File = "file" + + +class TokenizerType(StrEnum): + """Enum for tokenizer types.""" + + LiteLLM = "litellm" + Tiktoken = "tiktoken" diff --git a/packages/graphrag-llm/graphrag_llm/embedding/__init__.py b/packages/graphrag-llm/graphrag_llm/embedding/__init__.py new file mode 100644 index 0000000000..1fb7352ea1 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/embedding/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLMEmbedding module for graphrag_llm.""" + +from graphrag_llm.embedding.embedding import LLMEmbedding +from graphrag_llm.embedding.embedding_factory import ( + create_embedding, + register_embedding, +) + +__all__ = [ + "LLMEmbedding", + "create_embedding", + "register_embedding", +] diff --git a/packages/graphrag-llm/graphrag_llm/embedding/embedding.py b/packages/graphrag-llm/graphrag_llm/embedding/embedding.py new file mode 100644 index 0000000000..b97cc3e3cf --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/embedding/embedding.py @@ -0,0 +1,191 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Completion Abstract Base Class.""" + +from abc import ABC, abstractmethod +from contextlib import contextmanager +from typing import TYPE_CHECKING, Any, Unpack + +from graphrag_llm.threading.embedding_thread_runner import embedding_thread_runner + +if TYPE_CHECKING: + from collections.abc import Iterator + + from graphrag_cache import Cache, CacheKeyCreator + + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsProcessor, MetricsStore + from graphrag_llm.rate_limit import RateLimiter + from graphrag_llm.retry import Retry + from graphrag_llm.threading.embedding_thread_runner import ( + ThreadedLLMEmbeddingFunction, + ThreadedLLMEmbeddingResponseHandler, + ) + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import LLMEmbeddingArgs, LLMEmbeddingResponse + + +class LLMEmbedding(ABC): + """Abstract base class for language model embeddings.""" + + @abstractmethod + def __init__( + self, + *, + model_id: str, + model_config: "ModelConfig", + tokenizer: "Tokenizer", + metrics_store: "MetricsStore", + metrics_processor: "MetricsProcessor | None" = None, + rate_limiter: "RateLimiter | None" = None, + retrier: "Retry | None" = None, + cache: "Cache | None" = None, + cache_key_creator: "CacheKeyCreator", + **kwargs: Any, + ): + """Initialize the LLMEmbedding. + + Args + ---- + model_id: str + The model ID, e.g., "openai/gpt-4o". + model_config: ModelConfig + The configuration for the language model. + tokenizer: Tokenizer + The tokenizer to use. + metrics_store: MetricsStore | None (default=None) + The metrics store to use. + metrics_processor: MetricsProcessor | None (default: None) + The metrics processor to use. + rate_limiter: RateLimiter | None (default=None) + The rate limiter to use. + retrier: Retry | None (default=None) + The retry strategy to use. + cache: Cache | None (default=None) + Optional cache for embeddings. + cache_key_creator: CacheKeyCreator | None (default=None) + Optional cache key creator function. + (dict[str, Any]) -> str + **kwargs: Any + Additional keyword arguments. + """ + raise NotImplementedError + + @abstractmethod + def embedding( + self, /, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> "LLMEmbeddingResponse": + """Sync embedding method.""" + raise NotImplementedError + + @abstractmethod + async def embedding_async( + self, /, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> "LLMEmbeddingResponse": + """Async embedding method.""" + raise NotImplementedError + + @contextmanager + def embedding_thread_pool( + self, + *, + response_handler: "ThreadedLLMEmbeddingResponseHandler", + concurrency: int, + queue_limit: int = 0, + ) -> "Iterator[ThreadedLLMEmbeddingFunction]": + """Run an embedding thread pool. + + Args + ---- + response_handler: ThreadedLLMEmbeddingResponseHandler + The callback function to handle embedding responses. + (request_id, response|exception) -> Awaitable[None] | None + concurrency: int + The number of threads to spin up in a thread pool. + queue_limit: int (default=0) + The maximum number of items allowed in the input queue. + 0 means unlimited. + Set this to a value to create backpressure on the caller. + + Yields + ------ + ThreadedLLMEmbeddingFunction: + A function that can be used to submit embedding requests to the thread pool. + (input, request_id, **kwargs) -> None + + The thread pool will process the requests and invoke the provided callback + with the responses. + + same signature as LLMEmbeddingFunction but requires a `request_id` parameter + to identify the request and does not return anything. + + """ + with embedding_thread_runner( + embedding=self.embedding, + response_handler=response_handler, + concurrency=concurrency, + queue_limit=queue_limit, + metrics_store=self.metrics_store, + ) as embedding: + yield embedding + + def embedding_batch( + self, + embedding_requests: list["LLMEmbeddingArgs"], + *, + concurrency: int, + queue_limit: int = 0, + ) -> list["LLMEmbeddingResponse | Exception"]: + """Process a batch of embedding requests using a thread pool. + + Args + ---- + embedding_requests: list[LLMEmbeddingArgs] + A list of embedding request arguments to process in parallel. + batch_size: int + The number of inputs to process in each batch. + concurrency: int + The number of threads to spin up in a thread pool. + queue_limit: int (default=0) + The maximum number of items allowed in the input queue. + 0 means unlimited. + Set this to a value to create backpressure on the caller. + + Returns + ------- + list[LLMEmbeddingResponse | Exception] + A list of embedding responses or exceptions for each input. + """ + results: list[LLMEmbeddingResponse | Exception] = [None] * len( + embedding_requests + ) # type: ignore + + def handle_response( + request_id: str, + response: "LLMEmbeddingResponse | Exception", + ) -> None: + index = int(request_id) + results[index] = response + + with self.embedding_thread_pool( + response_handler=handle_response, + concurrency=concurrency, + queue_limit=queue_limit, + ) as embedding: + for idx, embedding_request in enumerate(embedding_requests): + embedding(request_id=str(idx), **embedding_request) + + return results + + @property + @abstractmethod + def metrics_store(self) -> "MetricsStore": + """Metrics store.""" + raise NotImplementedError + + @property + @abstractmethod + def tokenizer(self) -> "Tokenizer": + """Tokenizer.""" + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/embedding/embedding_factory.py b/packages/graphrag-llm/graphrag_llm/embedding/embedding_factory.py new file mode 100644 index 0000000000..44592991b3 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/embedding/embedding_factory.py @@ -0,0 +1,150 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Embedding factory.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING, Any + +from graphrag_common.factory import Factory + +from graphrag_llm.cache import create_cache_key +from graphrag_llm.config.tokenizer_config import TokenizerConfig +from graphrag_llm.config.types import LLMProviderType +from graphrag_llm.metrics.noop_metrics_store import NoopMetricsStore +from graphrag_llm.tokenizer.tokenizer_factory import create_tokenizer + +if TYPE_CHECKING: + from graphrag_cache import Cache, CacheKeyCreator + from graphrag_common.factory import ServiceScope + + from graphrag_llm.config.model_config import ModelConfig + from graphrag_llm.embedding.embedding import LLMEmbedding + from graphrag_llm.metrics import MetricsProcessor, MetricsStore + from graphrag_llm.rate_limit import RateLimiter + from graphrag_llm.retry import Retry + from graphrag_llm.tokenizer import Tokenizer + + +class EmbeddingFactory(Factory["LLMEmbedding"]): + """Factory for creating Embedding instances.""" + + +embedding_factory = EmbeddingFactory() + + +def register_embedding( + embedding_type: str, + embedding_initializer: Callable[..., "LLMEmbedding"], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom completion implementation. + + Args + ---- + embedding_type: str + The embedding id to register. + embedding_initializer: Callable[..., LLMEmbedding] + The embedding initializer to register. + scope: ServiceScope (default: "transient") + The service scope for the embedding. + """ + embedding_factory.register(embedding_type, embedding_initializer, scope) + + +def create_embedding( + model_config: "ModelConfig", + *, + cache: "Cache | None" = None, + cache_key_creator: "CacheKeyCreator | None" = None, + tokenizer: "Tokenizer | None" = None, +) -> "LLMEmbedding": + """Create an Embedding instance based on the model configuration. + + Args + ---- + model_config: ModelConfig + The configuration for the model. + cache: Cache | None (default: None) + An optional cache instance. + cache_key_creator: CacheKeyCreator | None (default: create_cache_key) + An optional cache key creator function. + tokenizer: Tokenizer | None (default: litellm) + An optional tokenizer instance. + + Returns + ------- + LLMEmbedding: + An instance of an Embedding subclass. + """ + cache_key_creator = cache_key_creator or create_cache_key + model_id = f"{model_config.model_provider}/{model_config.model}" + strategy = model_config.type + extra: dict[str, Any] = model_config.model_extra or {} + + if strategy not in embedding_factory: + match strategy: + case LLMProviderType.LiteLLM: + from graphrag_llm.embedding.lite_llm_embedding import ( + LiteLLMEmbedding, + ) + + register_embedding( + embedding_type=LLMProviderType.LiteLLM, + embedding_initializer=LiteLLMEmbedding, + scope="singleton", + ) + case LLMProviderType.MockLLM: + from graphrag_llm.embedding.mock_llm_embedding import MockLLMEmbedding + + register_embedding( + embedding_type=LLMProviderType.MockLLM, + embedding_initializer=MockLLMEmbedding, + ) + case _: + msg = f"ModelConfig.type '{strategy}' is not registered in the CompletionFactory. Registered strategies: {', '.join(embedding_factory.keys())}" + raise ValueError(msg) + + tokenizer = tokenizer or create_tokenizer(TokenizerConfig(model_id=model_id)) + + rate_limiter: RateLimiter | None = None + if model_config.rate_limit: + from graphrag_llm.rate_limit.rate_limit_factory import create_rate_limiter + + rate_limiter = create_rate_limiter(rate_limit_config=model_config.rate_limit) + + retrier: Retry | None = None + if model_config.retry: + from graphrag_llm.retry.retry_factory import create_retry + + retrier = create_retry(retry_config=model_config.retry) + + metrics_store: MetricsStore = NoopMetricsStore() + metrics_processor: MetricsProcessor | None = None + if model_config.metrics: + from graphrag_llm.metrics import ( + create_metrics_processor, + create_metrics_store, + ) + + metrics_store = create_metrics_store( + config=model_config.metrics, + id=model_id, + ) + metrics_processor = create_metrics_processor(model_config.metrics) + + return embedding_factory.create( + strategy=strategy, + init_args={ + **extra, + "model_id": model_id, + "model_config": model_config, + "tokenizer": tokenizer, + "metrics_store": metrics_store, + "metrics_processor": metrics_processor, + "rate_limiter": rate_limiter, + "retrier": retrier, + "cache": cache, + "cache_key_creator": cache_key_creator, + }, + ) diff --git a/packages/graphrag-llm/graphrag_llm/embedding/lite_llm_embedding.py b/packages/graphrag-llm/graphrag_llm/embedding/lite_llm_embedding.py new file mode 100644 index 0000000000..18e39a4ea8 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/embedding/lite_llm_embedding.py @@ -0,0 +1,198 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""LLMEmbedding based on litellm.""" + +from typing import TYPE_CHECKING, Any, Unpack + +import litellm +from azure.identity import DefaultAzureCredential, get_bearer_token_provider + +from graphrag_llm.config.types import AuthMethod +from graphrag_llm.embedding.embedding import LLMEmbedding +from graphrag_llm.middleware import with_middleware_pipeline +from graphrag_llm.types import LLMEmbeddingResponse + +if TYPE_CHECKING: + from graphrag_cache import Cache, CacheKeyCreator + + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsProcessor, MetricsStore + from graphrag_llm.rate_limit import RateLimiter + from graphrag_llm.retry import Retry + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import ( + AsyncLLMEmbeddingFunction, + LLMEmbeddingArgs, + LLMEmbeddingFunction, + Metrics, + ) + +litellm.suppress_debug_info = True + + +class LiteLLMEmbedding(LLMEmbedding): + """LLMEmbedding based on litellm.""" + + _model_config: "ModelConfig" + _model_id: str + _track_metrics: bool = False + _metrics_store: "MetricsStore" + _metrics_processor: "MetricsProcessor | None" + _cache: "Cache | None" + _cache_key_creator: "CacheKeyCreator" + _tokenizer: "Tokenizer" + _rate_limiter: "RateLimiter | None" + _retrier: "Retry | None" + + def __init__( + self, + *, + model_id: str, + model_config: "ModelConfig", + tokenizer: "Tokenizer", + metrics_store: "MetricsStore", + metrics_processor: "MetricsProcessor | None" = None, + rate_limiter: "RateLimiter | None" = None, + retrier: "Retry | None" = None, + cache: "Cache | None" = None, + cache_key_creator: "CacheKeyCreator", + azure_cognitive_services_audience: str = "https://cognitiveservices.azure.com/.default", + drop_unsupported_params: bool = True, + **kwargs: Any, + ): + """Initialize LiteLLMEmbedding. + + Args + ---- + model_id: str + The LiteLLM model ID, e.g., "openai/gpt-4o" + model_config: ModelConfig + The configuration for the model. + tokenizer: Tokenizer + The tokenizer to use. + metrics_store: MetricsStore | None (default: None) + The metrics store to use. + metrics_processor: MetricsProcessor | None (default: None) + The metrics processor to use. + cache: Cache | None (default: None) + An optional cache instance. + cache_key_prefix: str | None (default: "chat") + The cache key prefix. Required if cache is provided. + rate_limiter: RateLimiter | None (default: None) + The rate limiter to use. + retrier: Retry | None (default: None) + The retry strategy to use. + azure_cognitive_services_audience: str (default: "https://cognitiveservices.azure.com/.default") + The audience for Azure Cognitive Services when using Managed Identity. + drop_unsupported_params: bool (default: True) + Whether to drop unsupported parameters for the model provider. + """ + self._model_id = model_id + self._model_config = model_config + self._tokenizer = tokenizer + self._metrics_store = metrics_store + self._metrics_processor = metrics_processor + self._track_metrics = metrics_processor is not None + self._cache = cache + self._cache_key_creator = cache_key_creator + self._rate_limiter = rate_limiter + self._retrier = retrier + + self._embedding, self._embedding_async = _create_base_embeddings( + model_config=model_config, + drop_unsupported_params=drop_unsupported_params, + azure_cognitive_services_audience=azure_cognitive_services_audience, + ) + + self._embedding, self._embedding_async = with_middleware_pipeline( + model_config=self._model_config, + model_fn=self._embedding, + async_model_fn=self._embedding_async, + request_type="embedding", + cache=self._cache, + cache_key_creator=self._cache_key_creator, + tokenizer=self._tokenizer, + metrics_processor=self._metrics_processor, + rate_limiter=self._rate_limiter, + retrier=self._retrier, + ) + + def embedding( + self, /, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> "LLMEmbeddingResponse": + """Sync embedding method.""" + request_metrics: Metrics | None = kwargs.pop("metrics", None) or {} + if not self._track_metrics: + request_metrics = None + + try: + return self._embedding(metrics=request_metrics, **kwargs) + finally: + if request_metrics: + self._metrics_store.update_metrics(metrics=request_metrics) + + async def embedding_async( + self, /, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> "LLMEmbeddingResponse": + """Async embedding method.""" + request_metrics: Metrics | None = kwargs.pop("metrics", None) or {} + if not self._track_metrics: + request_metrics = None + + try: + return await self._embedding_async(metrics=request_metrics, **kwargs) + finally: + if request_metrics: + self._metrics_store.update_metrics(metrics=request_metrics) + + @property + def metrics_store(self) -> "MetricsStore": + """Get metrics store.""" + return self._metrics_store + + @property + def tokenizer(self) -> "Tokenizer": + """Get tokenizer.""" + return self._tokenizer + + +def _create_base_embeddings( + *, + model_config: "ModelConfig", + drop_unsupported_params: bool, + azure_cognitive_services_audience: str, +) -> tuple["LLMEmbeddingFunction", "AsyncLLMEmbeddingFunction"]: + """Create base embedding functions.""" + model_provider = model_config.model_provider + model = model_config.azure_deployment_name or model_config.model + + base_args: dict[str, Any] = { + "drop_params": drop_unsupported_params, + "model": f"{model_provider}/{model}", + "api_key": model_config.api_key, + "api_base": model_config.api_base, + "api_version": model_config.api_version, + **model_config.call_args, + } + + if model_config.auth_method == AuthMethod.AzureManagedIdentity: + base_args["azure_ad_token_provider"] = get_bearer_token_provider( + DefaultAzureCredential(), azure_cognitive_services_audience + ) + + def _base_embedding(**kwargs: Any) -> LLMEmbeddingResponse: + kwargs.pop("metrics", None) # Remove metrics if present + new_args: dict[str, Any] = {**base_args, **kwargs} + + response = litellm.embedding(**new_args) + return LLMEmbeddingResponse(**response.model_dump()) + + async def _base_embedding_async(**kwargs: Any) -> LLMEmbeddingResponse: + kwargs.pop("metrics", None) # Remove metrics if present + new_args: dict[str, Any] = {**base_args, **kwargs} + + response = await litellm.aembedding(**new_args) + return LLMEmbeddingResponse(**response.model_dump()) + + return _base_embedding, _base_embedding_async diff --git a/packages/graphrag-llm/graphrag_llm/embedding/mock_llm_embedding.py b/packages/graphrag-llm/graphrag_llm/embedding/mock_llm_embedding.py new file mode 100644 index 0000000000..3b9649038c --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/embedding/mock_llm_embedding.py @@ -0,0 +1,81 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""MockLLMEmbedding.""" + +from typing import TYPE_CHECKING, Any, Unpack + +import litellm + +from graphrag_llm.embedding.embedding import LLMEmbedding +from graphrag_llm.utils import create_embedding_response + +if TYPE_CHECKING: + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsStore + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import ( + LLMEmbeddingArgs, + LLMEmbeddingResponse, + ) + +litellm.suppress_debug_info = True + + +class MockLLMEmbedding(LLMEmbedding): + """MockLLMEmbedding.""" + + _metrics_store: "MetricsStore" + _tokenizer: "Tokenizer" + _mock_responses: list[float] + _mock_index: int = 0 + + def __init__( + self, + *, + model_config: "ModelConfig", + tokenizer: "Tokenizer", + metrics_store: "MetricsStore", + **kwargs: Any, + ): + """Initialize MockLLMEmbedding.""" + self._tokenizer = tokenizer + self._metrics_store = metrics_store + + mock_responses = model_config.mock_responses + if not isinstance(mock_responses, list) or len(mock_responses) == 0: + msg = "ModelConfig.mock_responses must be a non-empty list of embedding responses." + raise ValueError(msg) + + if not all(isinstance(resp, float) for resp in mock_responses): + msg = "Each item in ModelConfig.mock_responses must be a float." + raise ValueError(msg) + + self._mock_responses = mock_responses # type: ignore + + def embedding( + self, /, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> "LLMEmbeddingResponse": + """Sync embedding method.""" + input = kwargs.get("input") + response = create_embedding_response( + self._mock_responses, batch_size=len(input) + ) + self._mock_index += 1 + return response + + async def embedding_async( + self, /, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> "LLMEmbeddingResponse": + """Async embedding method.""" + return self.embedding(**kwargs) + + @property + def metrics_store(self) -> "MetricsStore": + """Get metrics store.""" + return self._metrics_store + + @property + def tokenizer(self) -> "Tokenizer": + """Get tokenizer.""" + return self._tokenizer diff --git a/packages/graphrag-llm/graphrag_llm/metrics/__init__.py b/packages/graphrag-llm/graphrag_llm/metrics/__init__.py new file mode 100644 index 0000000000..e039bf8acf --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/__init__.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics module for graphrag-llm.""" + +from graphrag_llm.metrics.metrics_aggregator import metrics_aggregator +from graphrag_llm.metrics.metrics_processor import MetricsProcessor +from graphrag_llm.metrics.metrics_processor_factory import ( + create_metrics_processor, + register_metrics_processor, +) +from graphrag_llm.metrics.metrics_store import MetricsStore +from graphrag_llm.metrics.metrics_store_factory import ( + create_metrics_store, + register_metrics_store, +) +from graphrag_llm.metrics.metrics_writer import MetricsWriter +from graphrag_llm.metrics.metrics_writer_factory import ( + create_metrics_writer, + register_metrics_writer, +) + +__all__ = [ + "MetricsProcessor", + "MetricsStore", + "MetricsWriter", + "create_metrics_processor", + "create_metrics_store", + "create_metrics_writer", + "metrics_aggregator", + "register_metrics_processor", + "register_metrics_store", + "register_metrics_writer", +] diff --git a/packages/graphrag-llm/graphrag_llm/metrics/default_metrics_processor.py b/packages/graphrag-llm/graphrag_llm/metrics/default_metrics_processor.py new file mode 100644 index 0000000000..7249e701a1 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/default_metrics_processor.py @@ -0,0 +1,130 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Default Metrics Processor.""" + +from typing import TYPE_CHECKING, Any + +from graphrag_llm.metrics.metrics_processor import MetricsProcessor +from graphrag_llm.model_cost_registry import model_cost_registry +from graphrag_llm.types import LLMCompletionResponse, LLMEmbeddingResponse + +if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + + from graphrag_llm.config import ModelConfig + from graphrag_llm.types import ( + LLMCompletionChunk, + Metrics, + ) + + +class DefaultMetricsProcessor(MetricsProcessor): + """Default metrics processor that does nothing.""" + + def __init__(self, **kwargs: Any) -> None: + """Initialize DefaultMetricsProcessor.""" + + def process_metrics( + self, + *, + model_config: "ModelConfig", + metrics: "Metrics", + input_args: dict[str, Any], + response: "LLMCompletionResponse \ + | Iterator[LLMCompletionChunk] \ + | AsyncIterator[LLMCompletionChunk] \ + | LLMEmbeddingResponse", + ) -> None: + """Process metrics.""" + self._process_metrics_common( + model_config=model_config, + metrics=metrics, + input_args=input_args, + response=response, + ) + + def _process_metrics_common( + self, + *, + model_config: "ModelConfig", + metrics: "Metrics", + input_args: dict[str, Any], + response: "LLMCompletionResponse \ + | Iterator[LLMCompletionChunk] \ + | AsyncIterator[LLMCompletionChunk] \ + | LLMEmbeddingResponse", + ) -> None: + if isinstance(response, LLMCompletionResponse): + self._process_lm_chat_completion( + model_config=model_config, + metrics=metrics, + input_args=input_args, + response=response, + ) + elif isinstance(response, LLMEmbeddingResponse): + self._process_lm_embedding_response( + model_config=model_config, + metrics=metrics, + input_args=input_args, + response=response, + ) + + def _process_lm_chat_completion( + self, + model_config: "ModelConfig", + metrics: "Metrics", + input_args: dict[str, Any], + response: "LLMCompletionResponse", + ) -> None: + """Process LMChatCompletion metrics.""" + prompt_tokens = response.usage.prompt_tokens if response.usage else 0 + completion_tokens = response.usage.completion_tokens if response.usage else 0 + total_tokens = prompt_tokens + completion_tokens + + if total_tokens > 0: + metrics["responses_with_tokens"] = 1 + metrics["prompt_tokens"] = prompt_tokens + metrics["completion_tokens"] = completion_tokens + metrics["total_tokens"] = total_tokens + + model_id = f"{model_config.model_provider}/{model_config.model}" + model_costs = model_cost_registry.get_model_costs(model_id) + + if not model_costs: + return + + input_cost = prompt_tokens * model_costs["input_cost_per_token"] + output_cost = completion_tokens * model_costs["output_cost_per_token"] + total_cost = input_cost + output_cost + + metrics["responses_with_cost"] = 1 + metrics["input_cost"] = input_cost + metrics["output_cost"] = output_cost + metrics["total_cost"] = total_cost + + def _process_lm_embedding_response( + self, + model_config: "ModelConfig", + metrics: "Metrics", + input_args: dict[str, Any], + response: "LLMEmbeddingResponse", + ) -> None: + """Process LLMEmbeddingResponse metrics.""" + prompt_tokens = response.usage.prompt_tokens if response.usage else 0 + + if prompt_tokens > 0: + metrics["responses_with_tokens"] = 1 + metrics["prompt_tokens"] = prompt_tokens + metrics["total_tokens"] = prompt_tokens + + model_id = f"{model_config.model_provider}/{model_config.model}" + model_costs = model_cost_registry.get_model_costs(model_id) + + if not model_costs: + return + + input_cost = prompt_tokens * model_costs["input_cost_per_token"] + metrics["responses_with_cost"] = 1 + metrics["input_cost"] = input_cost + metrics["total_cost"] = input_cost diff --git a/packages/graphrag-llm/graphrag_llm/metrics/file_metrics_writer.py b/packages/graphrag-llm/graphrag_llm/metrics/file_metrics_writer.py new file mode 100644 index 0000000000..c80f345279 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/file_metrics_writer.py @@ -0,0 +1,37 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""File metrics writer implementation.""" + +import json +from collections.abc import Callable +from datetime import datetime, timezone +from pathlib import Path +from typing import TYPE_CHECKING, Any + +from graphrag_llm.metrics.metrics_writer import MetricsWriter + +if TYPE_CHECKING: + from graphrag_llm.types import Metrics + + +class FileMetricsWriter(MetricsWriter): + """File metrics writer implementation.""" + + _log_method: Callable[..., None] | None = None + _base_dir: Path + _file_path: Path + + def __init__(self, *, base_dir: str | None = None, **kwargs: Any) -> None: + """Initialize FileMetricsWriter.""" + self._base_dir = Path(base_dir or Path.cwd()).resolve() + now = datetime.now(timezone.utc).astimezone().strftime("%Y%m%d_%H%M%S") + self._file_path = self._base_dir / f"{now}.jsonl" + + self._base_dir.mkdir(parents=True, exist_ok=True) + + def write_metrics(self, *, id: str, metrics: "Metrics") -> None: + """Write the given metrics.""" + record = json.dumps({"id": id, "metrics": metrics}) + with self._file_path.open("a", encoding="utf-8") as f: + f.write(f"{record}\n") diff --git a/packages/graphrag-llm/graphrag_llm/metrics/log_metrics_writer.py b/packages/graphrag-llm/graphrag_llm/metrics/log_metrics_writer.py new file mode 100644 index 0000000000..f09b878a12 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/log_metrics_writer.py @@ -0,0 +1,39 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Log metrics writer implementation.""" + +import json +import logging +from collections.abc import Callable +from typing import TYPE_CHECKING, Any + +from graphrag_llm.metrics.metrics_writer import MetricsWriter + +if TYPE_CHECKING: + from graphrag_llm.types import Metrics + +logger = logging.getLogger(__name__) + +_log_methods = { + logging.DEBUG: logger.debug, + logging.INFO: logger.info, + logging.WARNING: logger.warning, + logging.ERROR: logger.error, + logging.CRITICAL: logger.critical, +} + + +class LogMetricsWriter(MetricsWriter): + """Log metrics writer implementation.""" + + _log_method: Callable[..., None] = _log_methods[logging.INFO] + + def __init__(self, *, log_level: int | None = None, **kwargs: Any) -> None: + """Initialize LogMetricsWriter.""" + if log_level and log_level in _log_methods: + self._log_method = _log_methods[log_level] + + def write_metrics(self, *, id: str, metrics: "Metrics") -> None: + """Write the given metrics.""" + self._log_method(f"Metrics for {id}: {json.dumps(metrics, indent=2)}") diff --git a/packages/graphrag-llm/graphrag_llm/metrics/memory_metrics_store.py b/packages/graphrag-llm/graphrag_llm/metrics/memory_metrics_store.py new file mode 100644 index 0000000000..c2456299e1 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/memory_metrics_store.py @@ -0,0 +1,112 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Default metrics store.""" + +import atexit +import threading +from typing import TYPE_CHECKING, Any + +from graphrag_llm.metrics.metrics_aggregator import metrics_aggregator +from graphrag_llm.metrics.metrics_store import MetricsStore + +if TYPE_CHECKING: + from graphrag_llm.metrics.metrics_writer import MetricsWriter + from graphrag_llm.types import Metrics + +_default_sort_order: list[str] = [ + "attempted_request_count", + "successful_response_count", + "failed_response_count", + "failure_rate", + "requests_with_retries", + "retries", + "retry_rate", + "compute_duration_seconds", + "compute_duration_per_response_seconds", + "runtime_duration_seconds", + "cached_responses", + "cache_hit_rate", + "streaming_responses", + "responses_with_tokens", + "prompt_tokens", + "completion_tokens", + "total_tokens", + "tokens_per_response", + "responses_with_cost", + "input_cost", + "output_cost", + "total_cost", + "cost_per_response", +] + + +class MemoryMetricsStore(MetricsStore): + """Store for metrics.""" + + _metrics_writer: "MetricsWriter | None" = None + _id: str + _sort_order: list[str] + _thread_lock: threading.Lock + _metrics: "Metrics" + + def __init__( + self, + *, + id: str, + metrics_writer: "MetricsWriter | None" = None, + sort_order: list[str] | None = None, + **kwargs: Any, + ) -> None: + """Initialize MemoryMetricsStore.""" + self._id = id + self._sort_order = sort_order or _default_sort_order + self._thread_lock = threading.Lock() + self._metrics = {} + + if metrics_writer: + self._metrics_writer = metrics_writer + atexit.register(self._on_exit_) + + def _on_exit_(self) -> None: + if self._metrics_writer: + self._metrics_writer.write_metrics(id=self._id, metrics=self.get_metrics()) + + @property + def id(self) -> str: + """Get the ID of the metrics store.""" + return self._id + + def update_metrics(self, *, metrics: "Metrics") -> None: + """Update the store with multiple metrics.""" + with self._thread_lock: + for name, value in metrics.items(): + if name in self._metrics: + self._metrics[name] += value + else: + self._metrics[name] = value + + def _sort_metrics(self) -> "Metrics": + """Sort metrics based on the predefined sort order.""" + sorted_metrics: Metrics = {} + for key in self._sort_order: + if key in self._metrics: + sorted_metrics[key] = self._metrics[key] + for key in self._metrics: + if key not in sorted_metrics: + sorted_metrics[key] = self._metrics[key] + return sorted_metrics + + def get_metrics(self) -> "Metrics": + """Get all metrics from the store.""" + metrics_aggregator.aggregate(self._metrics) + return self._sort_metrics() + + def clear_metrics(self) -> None: + """Clear all metrics from the store. + + Returns + ------- + None + """ + self._metrics = {} diff --git a/packages/graphrag-llm/graphrag_llm/metrics/metrics_aggregator.py b/packages/graphrag-llm/graphrag_llm/metrics/metrics_aggregator.py new file mode 100644 index 0000000000..53726e75c2 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/metrics_aggregator.py @@ -0,0 +1,142 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics aggregator module.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING, Any, ClassVar + +from typing_extensions import Self + +if TYPE_CHECKING: + from graphrag_llm.types.types import Metrics + + +class MetricsAggregator: + """Metrics Aggregator.""" + + _instance: ClassVar["Self | None"] = None + _aggregate_functions: dict[str, Callable[["Metrics"], None]] + + def __new__(cls, *args: Any, **kwargs: Any) -> Self: + """Create a new instance of MetricsAggregator if it does not exist.""" + if cls._instance is None: + cls._instance = super().__new__(cls, *args, **kwargs) + return cls._instance + + def __init__(self): + if not hasattr(self, "_initialized"): + self._initialized = True + self._aggregate_functions = {} + + def register(self, name: str, func: Callable[["Metrics"], None]) -> None: + """Register an aggregate function. + + Args + ---- + name: str + The name of the aggregate function. + func: Callable[[Metrics], None] + The aggregate function to register. It should take a Metrics + dictionary as input and return None, modifying the Metrics in place. + """ + self._aggregate_functions[name] = func + + def clear(self, name: str | None = None) -> None: + """Clear registered aggregate functions. + + Args + ---- + name: str | None + The name of the aggregate function to clear. If None, clears all + registered aggregate functions. + + """ + if name: + self._aggregate_functions.pop(name, None) + else: + self._aggregate_functions.clear() + + def aggregate(self, metrics: "Metrics") -> None: + """Aggregate metrics using registered aggregate functions. + + Args + ---- + metrics: Metrics + The metrics dictionary to aggregate. + """ + for func in self._aggregate_functions.values(): + func(metrics) + + +def _failure_rate(metrics: "Metrics") -> None: + """Calculate failure rate metric.""" + attempted = metrics.get("attempted_request_count", 0) + failed = metrics.get("failed_response_count", 0) + if attempted > 0: + metrics["failure_rate"] = failed / attempted + else: + metrics["failure_rate"] = 0.0 + + +def _retry_rate(metrics: "Metrics") -> None: + """Calculate failure rate metric.""" + attempted = metrics.get("attempted_request_count", 0) + retries = metrics.get("retries", 0) + if attempted > 0 and "retries" in metrics: + metrics["retry_rate"] = retries / (retries + attempted) + elif "retries" in metrics: + metrics["retry_rate"] = 0.0 + + +def _tokens_per_response(metrics: "Metrics") -> None: + """Calculate tokens per response metric.""" + responses = metrics.get("responses_with_tokens", 0) + total_tokens = metrics.get("total_tokens", 0) + if responses > 0: + metrics["tokens_per_response"] = total_tokens / responses + else: + metrics["tokens_per_response"] = 0.0 + + +def _cost_per_response(metrics: "Metrics") -> None: + """Calculate cost per response metric.""" + responses = metrics.get("responses_with_cost", 0) + total_cost = metrics.get("total_cost", 0) + if responses > 0: + metrics["cost_per_response"] = total_cost / responses + else: + metrics["cost_per_response"] = 0.0 + + +def _compute_duration_per_response(metrics: "Metrics") -> None: + """Calculate compute duration per response metric.""" + responses = metrics.get("successful_response_count", 0) + streaming_responses = metrics.get("streaming_responses", 0) + responses = responses - streaming_responses + compute_duration = metrics.get("compute_duration_seconds", 0) + if responses > 0: + metrics["compute_duration_per_response_seconds"] = compute_duration / responses + else: + metrics["compute_duration_per_response_seconds"] = 0.0 + + +def _cache_hit_rate(metrics: "Metrics") -> None: + """Calculate cache hit rate metric.""" + responses = metrics.get("successful_response_count", 0) + cached = metrics.get("cached_responses", 0) + if responses > 0: + metrics["cache_hit_rate"] = cached / responses + else: + metrics["cache_hit_rate"] = 0.0 + + +metrics_aggregator = MetricsAggregator() +metrics_aggregator.register("failure_rate", _failure_rate) +metrics_aggregator.register("retry_rate", _retry_rate) +metrics_aggregator.register("tokens_per_response", _tokens_per_response) +metrics_aggregator.register("cost_per_response", _cost_per_response) +metrics_aggregator.register( + "compute_duration_per_response", _compute_duration_per_response +) +metrics_aggregator.register("cache_hit_rate", _cache_hit_rate) diff --git a/packages/graphrag-llm/graphrag_llm/metrics/metrics_processor.py b/packages/graphrag-llm/graphrag_llm/metrics/metrics_processor.py new file mode 100644 index 0000000000..61893742db --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/metrics_processor.py @@ -0,0 +1,59 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics processor abstract base class.""" + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + + from graphrag_llm.config import ModelConfig + from graphrag_llm.types import ( + LLMCompletionChunk, + LLMCompletionResponse, + LLMEmbeddingResponse, + Metrics, + ) + + +class MetricsProcessor(ABC): + """Abstract base class for metrics processors.""" + + @abstractmethod + def __init__(self, **kwargs: Any): + """Initialize MetricsProcessor.""" + raise NotImplementedError + + @abstractmethod + def process_metrics( + self, + *, + model_config: "ModelConfig", + metrics: "Metrics", + input_args: dict[str, Any], + response: "LLMCompletionResponse \ + | Iterator[LLMCompletionChunk] \ + | AsyncIterator[LLMCompletionChunk] \ + | LLMEmbeddingResponse", + ) -> None: + """Process metrics. + + Update the metrics dictionary in place. + + Args + ---- + metrics: Metrics + The metrics to process. + input_args: dict[str, Any] + The input arguments passed to completion or embedding + used to generate the response. + response: LLMCompletionResponse | Iterator[LLMCompletionChunk] | LLMEmbeddingResponse + Either a completion or embedding response from the LLM. + + Returns + ------- + None + """ + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/metrics/metrics_processor_factory.py b/packages/graphrag-llm/graphrag_llm/metrics/metrics_processor_factory.py new file mode 100644 index 0000000000..74f0111a9c --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/metrics_processor_factory.py @@ -0,0 +1,79 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics processor factory.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory + +from graphrag_llm.config.types import MetricsProcessorType +from graphrag_llm.metrics.metrics_processor import MetricsProcessor + +if TYPE_CHECKING: + from graphrag_llm.config import MetricsConfig + + +class MetricsProcessorFactory(Factory[MetricsProcessor]): + """Factory for creating MetricsProcessor instances.""" + + +metrics_processor_factory = MetricsProcessorFactory() + + +def register_metrics_processor( + processor_type: str, + processor_initializer: Callable[..., MetricsProcessor], +) -> None: + """Register a custom metrics processor implementation. + + Args + ---- + processor_type: str + The metrics processor id to register. + processor_initializer: Callable[..., MetricsProcessor] + The metrics processor initializer to register. + """ + metrics_processor_factory.register(processor_type, processor_initializer) + + +def create_metrics_processor(metrics_config: "MetricsConfig") -> MetricsProcessor: + """Create a MetricsProcessor instance based on the configuration. + + Args + ---- + metrics_config: MetricsConfig + The configuration for the metrics processor. + + Returns + ------- + MetricsProcessor: + An instance of a MetricsProcessor subclass. + """ + strategy = metrics_config.type + init_args = metrics_config.model_dump() + + if strategy not in metrics_processor_factory: + match strategy: + case MetricsProcessorType.Default: + from graphrag_llm.metrics.default_metrics_processor import ( + DefaultMetricsProcessor, + ) + + metrics_processor_factory.register( + strategy=MetricsProcessorType.Default, + initializer=DefaultMetricsProcessor, + scope="singleton", + ) + case _: + msg = f"MetricsConfig.processor '{strategy}' is not registered in the MetricsProcessorFactory. Registered strategies: {', '.join(metrics_processor_factory.keys())}" + raise ValueError(msg) + + return metrics_processor_factory.create( + strategy=strategy, + init_args={ + **init_args, + "metrics_config": metrics_config, + }, + ) diff --git a/packages/graphrag-llm/graphrag_llm/metrics/metrics_store.py b/packages/graphrag-llm/graphrag_llm/metrics/metrics_store.py new file mode 100644 index 0000000000..a9933f203d --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/metrics_store.py @@ -0,0 +1,81 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics Store.""" + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.metrics.metrics_writer import MetricsWriter + from graphrag_llm.types import Metrics + + +class MetricsStore(ABC): + """Abstract base class for metrics stores.""" + + @abstractmethod + def __init__( + self, + *, + id: str, + metrics_writer: "MetricsWriter | None" = None, + **kwargs: Any, + ) -> None: + """Initialize MetricsStore. + + Args + ---- + id: str + The ID of the metrics store. + One metric store is created per ID so a good + candidate is the model id (e.g., openai/gpt-4o). + That way one store tracks and aggregates the metrics + per model. + metrics_writer: MetricsWriter + The metrics writer to use for writing metrics. + + """ + raise NotImplementedError + + @property + @abstractmethod + def id(self) -> str: + """Get the ID of the metrics store.""" + raise NotImplementedError + + @abstractmethod + def update_metrics(self, *, metrics: "Metrics") -> None: + """Update the store with multiple metrics. + + Args + ---- + metrics: Metrics + The metrics to merge into the store. + + Returns + ------- + None + """ + raise NotImplementedError + + @abstractmethod + def get_metrics(self) -> "Metrics": + """Get all metrics from the store. + + Returns + ------- + Metrics: + All metrics stored in the store. + """ + raise NotImplementedError + + @abstractmethod + def clear_metrics(self) -> None: + """Clear all metrics from the store. + + Returns + ------- + None + """ + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/metrics/metrics_store_factory.py b/packages/graphrag-llm/graphrag_llm/metrics/metrics_store_factory.py new file mode 100644 index 0000000000..51e06fc0dc --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/metrics_store_factory.py @@ -0,0 +1,91 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics store factory.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING, Any + +from graphrag_common.factory import Factory + +from graphrag_llm.config.types import MetricsStoreType +from graphrag_llm.metrics.metrics_store import MetricsStore + +if TYPE_CHECKING: + from graphrag_common.factory import ServiceScope + + from graphrag_llm.config import MetricsConfig + from graphrag_llm.metrics.metrics_writer import MetricsWriter + + +class MetricsStoreFactory(Factory[MetricsStore]): + """Factory for creating MetricsProcessor instances.""" + + +metrics_store_factory = MetricsStoreFactory() + + +def register_metrics_store( + store_type: str, + store_initializer: Callable[..., MetricsStore], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom metrics store implementation. + + Args + ---- + store_type: str + The metrics store id to register. + store_initializer: Callable[..., MetricsStore] + The metrics store initializer to register. + """ + metrics_store_factory.register(store_type, store_initializer, scope) + + +def create_metrics_store(config: "MetricsConfig", id: str) -> MetricsStore: + """Create a MetricsStore instance based on the configuration. + + Args + ---- + config: MetricsConfig + The configuration for the metrics store. + id: str + The identifier for the metrics store. + Example: openai/gpt-4o + + Returns + ------- + MetricsStore: + An instance of a MetricsStore subclass. + """ + strategy = config.store + metrics_writer: MetricsWriter | None = None + if config.writer: + from graphrag_llm.metrics.metrics_writer_factory import create_metrics_writer + + metrics_writer = create_metrics_writer(config) + init_args: dict[str, Any] = config.model_dump() + + if strategy not in metrics_store_factory: + match strategy: + case MetricsStoreType.Memory: + from graphrag_llm.metrics.memory_metrics_store import MemoryMetricsStore + + register_metrics_store( + store_type=strategy, + store_initializer=MemoryMetricsStore, + scope="singleton", + ) + case _: + msg = f"MetricsConfig.store '{strategy}' is not registered in the MetricsStoreFactory. Registered strategies: {', '.join(metrics_store_factory.keys())}" + raise ValueError(msg) + + return metrics_store_factory.create( + strategy=strategy, + init_args={ + **init_args, + "id": id, + "metrics_config": config, + "metrics_writer": metrics_writer, + }, + ) diff --git a/packages/graphrag-llm/graphrag_llm/metrics/metrics_writer.py b/packages/graphrag-llm/graphrag_llm/metrics/metrics_writer.py new file mode 100644 index 0000000000..4e5df0a980 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/metrics_writer.py @@ -0,0 +1,32 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics writer abstract base class.""" + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.types import Metrics + + +class MetricsWriter(ABC): + """Abstract base class for metrics writers.""" + + @abstractmethod + def __init__(self, **kwargs: Any) -> None: + """Initialize MetricsWriter.""" + raise NotImplementedError + + @abstractmethod + def write_metrics(self, *, id: str, metrics: "Metrics") -> None: + """Write the given metrics. + + Args + ---- + id : str + The identifier for the metrics. + metrics : Metrics + The metrics data to write. + """ + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/metrics/metrics_writer_factory.py b/packages/graphrag-llm/graphrag_llm/metrics/metrics_writer_factory.py new file mode 100644 index 0000000000..fac8c5957d --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/metrics_writer_factory.py @@ -0,0 +1,91 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + + +"""Metrics writer factory.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory + +from graphrag_llm.config.types import MetricsWriterType +from graphrag_llm.metrics.metrics_writer import MetricsWriter + +if TYPE_CHECKING: + from graphrag_common.factory import ServiceScope + + from graphrag_llm.config import MetricsConfig + + +class MetricsWriterFactory(Factory[MetricsWriter]): + """Metrics writer factory.""" + + +metrics_writer_factory = MetricsWriterFactory() + + +def register_metrics_writer( + metrics_writer_type: str, + metrics_writer_initializer: Callable[..., MetricsWriter], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom metrics writer implementation. + + Args + ---- + metrics_writer_type: str + The metrics writer id to register. + metrics_writer_initializer: Callable[..., MetricsWriter] + The metrics writer initializer to register. + scope: ServiceScope (default: "transient") + The service scope for the metrics writer. + """ + metrics_writer_factory.register( + metrics_writer_type, metrics_writer_initializer, scope + ) + + +def create_metrics_writer(metrics_config: "MetricsConfig") -> MetricsWriter: + """Create a MetricsWriter instance based on the configuration. + + Args + ---- + metrics_config: MetricsConfig + The configuration for the metrics writer. + + Returns + ------- + MetricsWriter: + An instance of a MetricsWriter subclass. + """ + strategy = metrics_config.writer + if not strategy: + msg = "MetricsConfig.writer needs to be set to create a MetricsWriter." + raise ValueError(msg) + + init_args = metrics_config.model_dump() + + if strategy not in metrics_writer_factory: + match strategy: + case MetricsWriterType.Log: + from graphrag_llm.metrics.log_metrics_writer import LogMetricsWriter + + metrics_writer_factory.register( + strategy=MetricsWriterType.Log, + initializer=LogMetricsWriter, + scope="singleton", + ) + case MetricsWriterType.File: + from graphrag_llm.metrics.file_metrics_writer import FileMetricsWriter + + metrics_writer_factory.register( + strategy=MetricsWriterType.File, + initializer=FileMetricsWriter, + scope="singleton", + ) + case _: + msg = f"MetricsConfig.writer '{strategy}' is not registered in the MetricsWriterFactory. Registered strategies: {', '.join(metrics_writer_factory.keys())}" + raise ValueError(msg) + + return metrics_writer_factory.create(strategy=strategy, init_args=init_args) diff --git a/packages/graphrag-llm/graphrag_llm/metrics/noop_metrics_store.py b/packages/graphrag-llm/graphrag_llm/metrics/noop_metrics_store.py new file mode 100644 index 0000000000..dbd41e13f7 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/metrics/noop_metrics_store.py @@ -0,0 +1,41 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Noop metrics store.""" + +from typing import Any + +from graphrag_llm.metrics.metrics_store import MetricsStore +from graphrag_llm.types import Metrics + + +class NoopMetricsStore(MetricsStore): + """Noop store for metrics.""" + + def __init__( + self, + **kwargs: Any, + ) -> None: + """Initialize NoopMetricsStore.""" + + @property + def id(self) -> str: + """Get the ID of the metrics store.""" + return "" + + def update_metrics(self, *, metrics: Metrics) -> None: + """Noop update.""" + return + + def get_metrics(self) -> Metrics: + """Noop get all metrics from the store.""" + return {} + + def clear_metrics(self) -> None: + """Clear all metrics from the store. + + Returns + ------- + None + """ + return diff --git a/packages/graphrag-llm/graphrag_llm/middleware/__init__.py b/packages/graphrag-llm/graphrag_llm/middleware/__init__.py new file mode 100644 index 0000000000..d038b28594 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/__init__.py @@ -0,0 +1,24 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Middleware.""" + +from graphrag_llm.middleware.with_cache import with_cache +from graphrag_llm.middleware.with_errors_for_testing import with_errors_for_testing +from graphrag_llm.middleware.with_logging import with_logging +from graphrag_llm.middleware.with_metrics import with_metrics +from graphrag_llm.middleware.with_middleware_pipeline import with_middleware_pipeline +from graphrag_llm.middleware.with_rate_limiting import with_rate_limiting +from graphrag_llm.middleware.with_request_count import with_request_count +from graphrag_llm.middleware.with_retries import with_retries + +__all__ = [ + "with_cache", + "with_errors_for_testing", + "with_logging", + "with_metrics", + "with_middleware_pipeline", + "with_rate_limiting", + "with_request_count", + "with_retries", +] diff --git a/packages/graphrag-llm/graphrag_llm/middleware/with_cache.py b/packages/graphrag-llm/graphrag_llm/middleware/with_cache.py new file mode 100644 index 0000000000..2809538073 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/with_cache.py @@ -0,0 +1,153 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Cache middleware.""" + +import asyncio +from typing import TYPE_CHECKING, Any, Literal + +from graphrag_llm.types import LLMCompletionResponse, LLMEmbeddingResponse + +if TYPE_CHECKING: + from graphrag_cache import Cache, CacheKeyCreator + + from graphrag_llm.types import ( + AsyncLLMFunction, + LLMFunction, + Metrics, + ) + + +def with_cache( + *, + sync_middleware: "LLMFunction", + async_middleware: "AsyncLLMFunction", + request_type: Literal["chat", "embedding"], + cache: "Cache", + cache_key_creator: "CacheKeyCreator", +) -> tuple[ + "LLMFunction", + "AsyncLLMFunction", +]: + """Wrap model functions with cache middleware. + + Args + ---- + sync_middleware: LLMFunction + The synchronous model function to wrap. + Either a completion function or an embedding function. + async_middleware: AsyncLLMFunction + The asynchronous model function to wrap. + Either a completion function or an embedding function. + cache: Cache + The cache instance to use. + request_type: Literal["chat", "embedding"] + The type of request, either "chat" or "embedding". + cache_key_creator: CacheKeyCreator + The cache key creator to use. + + Returns + ------- + tuple[LLMFunction, AsyncLLMFunction] + The synchronous and asynchronous model functions with caching. + + """ + + def _cache_middleware( + **kwargs: Any, + ): + is_streaming = kwargs.get("stream") or False + is_mocked = kwargs.get("mock_response") or False + metrics: Metrics | None = kwargs.get("metrics") + + if is_streaming or is_mocked: + # don't cache streaming or mocked responses + return sync_middleware(**kwargs) + + cache_key = cache_key_creator(kwargs) + + event_loop = asyncio.new_event_loop() + asyncio.set_event_loop(event_loop) + cached_response = event_loop.run_until_complete(cache.get(cache_key)) + if ( + cached_response is not None + and isinstance(cached_response, dict) + and "response" in cached_response + and cached_response["response"] is not None + and isinstance(cached_response["response"], dict) + ): + try: + if ( + metrics is not None + and "metrics" in cached_response + and cached_response["metrics"] is not None + and isinstance(cached_response["metrics"], dict) + ): + metrics.update(cached_response["metrics"]) + metrics["cached_responses"] = 1 + + if request_type == "chat": + return LLMCompletionResponse(**cached_response["response"]) + return LLMEmbeddingResponse(**cached_response["response"]) + except Exception: # noqa: BLE001 + # Try to retrieve value from cache but if it fails, continue + # to make the request. + ... + + response = sync_middleware(**kwargs) + cache_value = { + "response": response.model_dump(), # type: ignore + "metrics": metrics if metrics is not None else {}, + } + event_loop.run_until_complete(cache.set(cache_key, cache_value)) + event_loop.close() + return response + + async def _cache_middleware_async( + **kwargs: Any, + ): + is_streaming = kwargs.get("stream") or False + is_mocked = kwargs.get("mock_response") or False + metrics: Metrics | None = kwargs.get("metrics") + + if is_streaming or is_mocked: + # don't cache streaming or mocked responses + return await async_middleware(**kwargs) + + cache_key = cache_key_creator(kwargs) + + cached_response = await cache.get(cache_key) + if ( + cached_response is not None + and isinstance(cached_response, dict) + and "response" in cached_response + and cached_response["response"] is not None + and isinstance(cached_response["response"], dict) + ): + try: + if ( + metrics is not None + and "metrics" in cached_response + and cached_response["metrics"] is not None + and isinstance(cached_response["metrics"], dict) + ): + metrics.update(cached_response["metrics"]) + metrics["cached_responses"] = 1 + + if request_type == "chat": + return LLMCompletionResponse(**cached_response["response"]) + return LLMEmbeddingResponse(**cached_response["response"]) + except Exception: # noqa: BLE001 + # Try to retrieve value from cache but if it fails, continue + # to make the request. + ... + + response = await async_middleware(**kwargs) + cache_value = { + "response": response.model_dump(), # type: ignore + "metrics": metrics if metrics is not None else {}, + } + await cache.set(cache_key, cache_value) + return response + + return (_cache_middleware, _cache_middleware_async) # type: ignore diff --git a/packages/graphrag-llm/graphrag_llm/middleware/with_errors_for_testing.py b/packages/graphrag-llm/graphrag_llm/middleware/with_errors_for_testing.py new file mode 100644 index 0000000000..cabdb1eaa4 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/with_errors_for_testing.py @@ -0,0 +1,83 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Error testing middleware.""" + +import asyncio +import random +import time +from typing import TYPE_CHECKING, Any + +import litellm.exceptions as exceptions + +if TYPE_CHECKING: + from graphrag_llm.types import ( + AsyncLLMFunction, + LLMFunction, + ) + + +def with_errors_for_testing( + *, + sync_middleware: "LLMFunction", + async_middleware: "AsyncLLMFunction", + failure_rate: float = 0.0, + exception_type: str = "ValueError", + exception_args: list[Any] | None = None, +) -> tuple[ + "LLMFunction", + "AsyncLLMFunction", +]: + """Wrap model functions with error testing middleware. + + Args + ---- + sync_middleware: LLMFunction + The synchronous model function to wrap. + Either a completion function or an embedding function. + async_middleware: AsyncLLMFunction + The asynchronous model function to wrap. + Either a completion function or an embedding function. + failure_rate: float + The failure rate for testing, between 0.0 and 1.0. + Defaults to 0.0 (no failures). + exception_type: str + The name of the exceptions class from litellm.exceptions to raise. + Defaults to "ValueError". + exception_args: list[Any] | None + The arguments to pass to the exception when raising it. Defaults to None, + which results in a default message. + + Returns + ------- + tuple[LLMFunction, AsyncLLMFunction] + The synchronous and asynchronous model functions wrapped with error testing middleware. + """ + + def _errors_middleware( + **kwargs: Any, + ): + if failure_rate > 0.0 and random.random() <= failure_rate: # noqa: S311 + time.sleep(0.5) + + exception_cls = exceptions.__dict__.get(exception_type, ValueError) + raise exception_cls( + *(exception_args or ["Simulated failure for debugging purposes."]) + ) + + return sync_middleware(**kwargs) + + async def _errors_middleware_async( + **kwargs: Any, + ): + if failure_rate > 0.0 and random.random() <= failure_rate: # noqa: S311 + await asyncio.sleep(0.5) + + exception_cls = exceptions.__dict__.get(exception_type, ValueError) + raise exception_cls( + *(exception_args or ["Simulated failure for debugging purposes."]) + ) + + return await async_middleware(**kwargs) + + return (_errors_middleware, _errors_middleware_async) # type: ignore diff --git a/packages/graphrag-llm/graphrag_llm/middleware/with_logging.py b/packages/graphrag-llm/graphrag_llm/middleware/with_logging.py new file mode 100644 index 0000000000..121ffbdbb6 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/with_logging.py @@ -0,0 +1,73 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Request count middleware.""" + +import logging +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.types import ( + AsyncLLMFunction, + LLMFunction, + Metrics, + ) + +logger = logging.getLogger(__name__) + + +def with_logging( + *, + sync_middleware: "LLMFunction", + async_middleware: "AsyncLLMFunction", +) -> tuple[ + "LLMFunction", + "AsyncLLMFunction", +]: + """Wrap model functions with logging middleware. + + Args + ---- + sync_middleware: LLMFunction + The synchronous model function to wrap. + Either a completion function or an embedding function. + async_middleware: AsyncLLMFunction + The asynchronous model function to wrap. + Either a completion function or an embedding function. + + Returns + ------- + tuple[LLMFunction, AsyncLLMFunction] + The synchronous and asynchronous model functions wrapped with request count middleware. + """ + + def _request_count_middleware( + **kwargs: Any, + ): + metrics: Metrics | None = kwargs.get("metrics") + try: + return sync_middleware(**kwargs) + except Exception as e: + retries = metrics.get("retries", None) if metrics else None + retry_str = f" after {retries} retries" if retries else "" + logger.exception( + f"Request failed{retry_str} with exception={e}", # noqa: G004, TRY401 + ) + raise + + async def _request_count_middleware_async( + **kwargs: Any, + ): + metrics: Metrics | None = kwargs.get("metrics") + + try: + return await async_middleware(**kwargs) + except Exception as e: + retries = metrics.get("retries", None) if metrics else None + retry_str = f" after {retries} retries" if retries else "" + logger.exception( + f"Async request failed{retry_str} with exception={e}", # noqa: G004, TRY401 + ) + raise + + return (_request_count_middleware, _request_count_middleware_async) # type: ignore diff --git a/packages/graphrag-llm/graphrag_llm/middleware/with_metrics.py b/packages/graphrag-llm/graphrag_llm/middleware/with_metrics.py new file mode 100644 index 0000000000..64ff7a41f7 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/with_metrics.py @@ -0,0 +1,98 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Metrics middleware to process metrics using a MetricsProcessor.""" + +import time +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsProcessor + from graphrag_llm.types import ( + AsyncLLMFunction, + LLMFunction, + Metrics, + ) + + +def with_metrics( + *, + model_config: "ModelConfig", + sync_middleware: "LLMFunction", + async_middleware: "AsyncLLMFunction", + metrics_processor: "MetricsProcessor", +) -> tuple[ + "LLMFunction", + "AsyncLLMFunction", +]: + """Wrap model functions with metrics middleware. + + Args + ---- + model_config: ModelConfig + The model configuration. + sync_middleware: LLMFunction + The synchronous model function to wrap. + Either a completion function or an embedding function. + async_middleware: AsyncLLMFunction + The asynchronous model function to wrap. + Either a completion function or an embedding function. + metrics_processor: MetricsProcessor + The metrics processor to use. + + Returns + ------- + tuple[LLMFunction, AsyncLLMFunction] + The synchronous and asynchronous model functions wrapped with metrics middleware. + + """ + + def _metrics_middleware( + **kwargs: Any, + ): + metrics: Metrics | None = kwargs.get("metrics") + start_time = time.time() + response = sync_middleware(**kwargs) + end_time = time.time() + + if metrics is not None: + metrics_processor.process_metrics( + model_config=model_config, + metrics=metrics, + input_args=kwargs, + response=response, + ) + if kwargs.get("stream"): + metrics["compute_duration_seconds"] = 0 + metrics["streaming_responses"] = 1 + else: + metrics["compute_duration_seconds"] = end_time - start_time + metrics["streaming_responses"] = 0 + return response + + async def _metrics_middleware_async( + **kwargs: Any, + ): + metrics: Metrics | None = kwargs.get("metrics") + + start_time = time.time() + response = await async_middleware(**kwargs) + end_time = time.time() + + if metrics is not None: + metrics_processor.process_metrics( + model_config=model_config, + metrics=metrics, + input_args=kwargs, + response=response, + ) + if kwargs.get("stream"): + metrics["compute_duration_seconds"] = 0 + metrics["streaming_responses"] = 1 + else: + metrics["compute_duration_seconds"] = end_time - start_time + metrics["streaming_responses"] = 0 + return response + + return (_metrics_middleware, _metrics_middleware_async) # type: ignore diff --git a/packages/graphrag-llm/graphrag_llm/middleware/with_middleware_pipeline.py b/packages/graphrag-llm/graphrag_llm/middleware/with_middleware_pipeline.py new file mode 100644 index 0000000000..41860acfaf --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/with_middleware_pipeline.py @@ -0,0 +1,154 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Wraps model functions in middleware pipeline.""" + +from typing import TYPE_CHECKING, Literal + +from graphrag_llm.middleware.with_cache import with_cache +from graphrag_llm.middleware.with_errors_for_testing import with_errors_for_testing +from graphrag_llm.middleware.with_logging import with_logging +from graphrag_llm.middleware.with_metrics import with_metrics +from graphrag_llm.middleware.with_rate_limiting import with_rate_limiting +from graphrag_llm.middleware.with_request_count import with_request_count +from graphrag_llm.middleware.with_retries import with_retries + +if TYPE_CHECKING: + from graphrag_cache import Cache, CacheKeyCreator + + from graphrag_llm.config import ModelConfig + from graphrag_llm.metrics import MetricsProcessor + from graphrag_llm.rate_limit import RateLimiter + from graphrag_llm.retry import Retry + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import ( + AsyncLLMFunction, + LLMFunction, + ) + + +def with_middleware_pipeline( + *, + model_config: "ModelConfig", + model_fn: "LLMFunction", + async_model_fn: "AsyncLLMFunction", + metrics_processor: "MetricsProcessor | None", + cache: "Cache | None", + cache_key_creator: "CacheKeyCreator", + request_type: Literal["chat", "embedding"], + tokenizer: "Tokenizer", + rate_limiter: "RateLimiter | None", + retrier: "Retry | None", +) -> tuple[ + "LLMFunction", + "AsyncLLMFunction", +]: + """Wrap model functions in middleware pipeline. + + Full Pipeline Order: + - with_requests_counts: Counts incoming requests and + successes, and failures that bubble back up. + - with_cache: Returns cached responses when available + and caches new successful responses that bubble back up. + - with_retries: Retries failed requests. + Since the retry middleware occurs prior to rate limiting, + all retries get back in line for rate limiting. This is + to avoid threads that retry rapidly against an endpoint, + thus increasing the required cooldown. + - with_rate_limiting: Rate limits requests. + - with_metrics: Collects metrics about the request and responses. + - with_errors_for_testing: Raises errors for testing purposes. + Relies on ModelConfig.failure_rate_for_testing to determine + the failure rate. 'failure_rate_for_testing' is not an exposed + configuration option and is only intended for internal testing. + + Args + ---- + model_config: ModelConfig + The model configuration. + model_fn: LLMFunction + The synchronous model function to wrap. + Either a completion function or an embedding function. + async_model_fn: AsyncLLMFunction + The asynchronous model function to wrap. + Either a completion function or an embedding function. + metrics_processor: MetricsProcessor | None + The metrics processor to use. If None, metrics middleware is skipped. + cache: Cache | None + The cache instance to use. If None, caching middleware is skipped. + cache_key_creator: CacheKeyCreator + The cache key creator to use. + request_type: Literal["chat", "embedding"] + The type of request, either "chat" or "embedding". + The middleware pipeline is used for both completions and embeddings + and some of the steps need to know which type of request it is. + tokenizer: Tokenizer + The tokenizer to use for rate limiting. + rate_limiter: RateLimiter | None + The rate limiter to use. If None, rate limiting middleware is skipped. + retrier: Retry | None + The retrier to use. If None, retry middleware is skipped. + + Returns + ------- + tuple[LLMFunction, AsyncLLMFunction] + The synchronous and asynchronous model functions wrapped in the middleware pipeline. + """ + extra_config = model_config.model_extra or {} + failure_rate_for_testing = extra_config.get("failure_rate_for_testing", 0.0) + + if failure_rate_for_testing > 0.0: + model_fn, async_model_fn = with_errors_for_testing( + sync_middleware=model_fn, + async_middleware=async_model_fn, + failure_rate=failure_rate_for_testing, + exception_type=extra_config.get( + "failure_rate_for_testing_exception_type", "ValueError" + ), + exception_args=extra_config.get("failure_rate_for_testing_exception_args"), + ) + + if metrics_processor: + model_fn, async_model_fn = with_metrics( + model_config=model_config, + sync_middleware=model_fn, + async_middleware=async_model_fn, + metrics_processor=metrics_processor, + ) + + if rate_limiter: + model_fn, async_model_fn = with_rate_limiting( + sync_middleware=model_fn, + async_middleware=async_model_fn, + tokenizer=tokenizer, + rate_limiter=rate_limiter, + ) + + if retrier: + model_fn, async_model_fn = with_retries( + sync_middleware=model_fn, + async_middleware=async_model_fn, + retrier=retrier, + ) + + if cache: + model_fn, async_model_fn = with_cache( + sync_middleware=model_fn, + async_middleware=async_model_fn, + request_type=request_type, + cache=cache, + cache_key_creator=cache_key_creator, + ) + + if metrics_processor: + model_fn, async_model_fn = with_request_count( + sync_middleware=model_fn, + async_middleware=async_model_fn, + ) + + model_fn, async_model_fn = with_logging( + sync_middleware=model_fn, + async_middleware=async_model_fn, + ) + + return (model_fn, async_model_fn) diff --git a/packages/graphrag-llm/graphrag_llm/middleware/with_rate_limiting.py b/packages/graphrag-llm/graphrag_llm/middleware/with_rate_limiting.py new file mode 100644 index 0000000000..8d1b09a393 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/with_rate_limiting.py @@ -0,0 +1,79 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Rate limit middleware.""" + +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.rate_limit import RateLimiter + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import ( + AsyncLLMFunction, + LLMFunction, + ) + + +def with_rate_limiting( + *, + sync_middleware: "LLMFunction", + async_middleware: "AsyncLLMFunction", + rate_limiter: "RateLimiter", + tokenizer: "Tokenizer", +) -> tuple[ + "LLMFunction", + "AsyncLLMFunction", +]: + """Wrap model functions with rate limit middleware. + + Args + ---- + sync_middleware: LLMFunction + The synchronous model function to wrap. + Either a completion function or an embedding function. + async_middleware: AsyncLLMFunction + The asynchronous model function to wrap. + Either a completion function or an embedding function. + rate_limiter: RateLimiter + The rate limiter to use. + tokenizer: Tokenizer + The tokenizer to use for counting tokens. + + Returns + ------- + tuple[LLMFunction, AsyncLLMFunction] + The synchronous and asynchronous model functions wrapped with rate limit middleware. + """ + + def _rate_limit_middleware( + **kwargs: Any, + ): + token_count = int( + kwargs.get("max_tokens") or kwargs.get("max_completion_tokens") or 0 + ) + messages = kwargs.get("messages") # completion call + input: list[str] | None = kwargs.get("input") # embedding call + if messages: + token_count += tokenizer.num_prompt_tokens(messages=messages) + elif input: + token_count += sum(tokenizer.num_tokens(text) for text in input) + + with rate_limiter.acquire(token_count): + return sync_middleware(**kwargs) + + async def _rate_limit_middleware_async( + **kwargs: Any, + ): + token_count = int( + kwargs.get("max_tokens") or kwargs.get("max_completion_tokens") or 0 + ) + messages = kwargs.get("messages") # completion call + input = kwargs.get("input") # embedding call + if messages: + token_count += tokenizer.num_prompt_tokens(messages=messages) + elif input: + token_count += sum(tokenizer.num_tokens(text) for text in input) + with rate_limiter.acquire(token_count): + return await async_middleware(**kwargs) + + return (_rate_limit_middleware, _rate_limit_middleware_async) # type: ignore diff --git a/packages/graphrag-llm/graphrag_llm/middleware/with_request_count.py b/packages/graphrag-llm/graphrag_llm/middleware/with_request_count.py new file mode 100644 index 0000000000..24f61d8f47 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/with_request_count.py @@ -0,0 +1,81 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Request count middleware.""" + +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.types import ( + AsyncLLMFunction, + LLMFunction, + Metrics, + ) + + +def with_request_count( + *, + sync_middleware: "LLMFunction", + async_middleware: "AsyncLLMFunction", +) -> tuple[ + "LLMFunction", + "AsyncLLMFunction", +]: + """Wrap model functions with request count middleware. + + This is the first step in the middleware pipeline. + It counts how many requests were made, how many succeeded, and how many failed + + Args + ---- + sync_middleware: LLMFunction + The synchronous model function to wrap. + Either a completion function or an embedding function. + async_middleware: AsyncLLMFunction + The asynchronous model function to wrap. + Either a completion function or an embedding function. + + Returns + ------- + tuple[LLMFunction, AsyncLLMFunction] + The synchronous and asynchronous model functions wrapped with request count middleware. + """ + + def _request_count_middleware( + **kwargs: Any, + ): + metrics: Metrics | None = kwargs.get("metrics") + if metrics is not None: + metrics["attempted_request_count"] = 1 + metrics["successful_response_count"] = 0 + metrics["failed_response_count"] = 0 + try: + result = sync_middleware(**kwargs) + if metrics is not None: + metrics["successful_response_count"] = 1 + return result # noqa: TRY300 + except Exception: + if metrics is not None: + metrics["failed_response_count"] = 1 + raise + + async def _request_count_middleware_async( + **kwargs: Any, + ): + metrics: Metrics | None = kwargs.get("metrics") + + if metrics is not None: + metrics["attempted_request_count"] = 1 + metrics["successful_response_count"] = 0 + metrics["failed_response_count"] = 0 + try: + result = await async_middleware(**kwargs) + if metrics is not None: + metrics["successful_response_count"] = 1 + return result # noqa: TRY300 + except Exception: + if metrics is not None: + metrics["failed_response_count"] = 1 + raise + + return (_request_count_middleware, _request_count_middleware_async) # type: ignore diff --git a/packages/graphrag-llm/graphrag_llm/middleware/with_retries.py b/packages/graphrag-llm/graphrag_llm/middleware/with_retries.py new file mode 100644 index 0000000000..1e7e17b208 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/middleware/with_retries.py @@ -0,0 +1,60 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Retry middleware.""" + +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.retry import Retry + from graphrag_llm.types import ( + AsyncLLMFunction, + LLMFunction, + ) + + +def with_retries( + *, + sync_middleware: "LLMFunction", + async_middleware: "AsyncLLMFunction", + retrier: "Retry", +) -> tuple[ + "LLMFunction", + "AsyncLLMFunction", +]: + """Wrap model functions with retry middleware. + + Args + ---- + sync_middleware: LLMFunction + The synchronous model function to wrap. + Either a completion function or an embedding function. + async_middleware: AsyncLLMFunction + The asynchronous model function to wrap. + Either a completion function or an embedding function. + retrier: Retry + The retrier instance to use for retrying failed requests. + + Returns + ------- + tuple[LLMFunction, AsyncLLMFunction] + The synchronous and asynchronous model functions wrapped with retry middleware. + """ + + def _retry_middleware( + **kwargs: Any, + ): + return retrier.retry( + func=sync_middleware, + input_args=kwargs, + ) + + async def _retry_middleware_async( + **kwargs: Any, + ): + return await retrier.retry_async( + func=async_middleware, + input_args=kwargs, + ) + + return (_retry_middleware, _retry_middleware_async) # type: ignore diff --git a/packages/graphrag-llm/graphrag_llm/model_cost_registry/__init__.py b/packages/graphrag-llm/graphrag_llm/model_cost_registry/__init__.py new file mode 100644 index 0000000000..2742335b5d --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/model_cost_registry/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Model cost registry module.""" + +from graphrag_llm.model_cost_registry.model_cost_registry import ( + ModelCosts, + model_cost_registry, +) + +__all__ = ["ModelCosts", "model_cost_registry"] diff --git a/packages/graphrag-llm/graphrag_llm/model_cost_registry/model_cost_registry.py b/packages/graphrag-llm/graphrag_llm/model_cost_registry/model_cost_registry.py new file mode 100644 index 0000000000..09a45bc750 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/model_cost_registry/model_cost_registry.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Model cost registry module.""" + +from typing import Any, ClassVar, TypedDict + +from litellm import model_cost +from typing_extensions import Self + + +class ModelCosts(TypedDict): + """Model costs.""" + + input_cost_per_token: float + output_cost_per_token: float + + +class ModelCostRegistry: + """Registry for model costs.""" + + _instance: ClassVar["Self | None"] = None + _model_costs: dict[str, ModelCosts] + + def __new__(cls, *args: Any, **kwargs: Any) -> Self: + """Create a new instance of ModelCostRegistry if it does not exist.""" + if cls._instance is None: + cls._instance = super().__new__(cls, *args, **kwargs) + return cls._instance + + def __init__(self): + if not hasattr(self, "_initialized"): + self._model_costs = model_cost + self._initialized = True + + def register_model_costs(self, model: str, costs: ModelCosts) -> None: + """Register the cost per unit for a given model. + + Args + ---- + model: str + The model id, e.g., "openai/gpt-4o". + costs: ModelCosts + The costs associated with the model. + """ + self._model_costs[model] = costs + + def get_model_costs(self, model: str) -> ModelCosts | None: + """Retrieve the cost per unit for a given model. + + Args + ---- + model: str + The model id, e.g., "openai/gpt-4o". + + Returns + ------- + ModelCosts | None + The costs associated with the model, or None if not found. + + """ + return self._model_costs.get(model) + + +model_cost_registry = ModelCostRegistry() diff --git a/packages/graphrag-llm/graphrag_llm/py.typed b/packages/graphrag-llm/graphrag_llm/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/graphrag-llm/graphrag_llm/rate_limit/__init__.py b/packages/graphrag-llm/graphrag_llm/rate_limit/__init__.py new file mode 100644 index 0000000000..4c3316102d --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/rate_limit/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Rate limit module for graphrag-llm.""" + +from graphrag_llm.rate_limit.rate_limit_factory import ( + create_rate_limiter, + register_rate_limiter, +) +from graphrag_llm.rate_limit.rate_limiter import RateLimiter + +__all__ = [ + "RateLimiter", + "create_rate_limiter", + "register_rate_limiter", +] diff --git a/packages/graphrag-llm/graphrag_llm/rate_limit/rate_limit_factory.py b/packages/graphrag-llm/graphrag_llm/rate_limit/rate_limit_factory.py new file mode 100644 index 0000000000..c15cd65c67 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/rate_limit/rate_limit_factory.py @@ -0,0 +1,84 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Rate limit factory.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory + +from graphrag_llm.config import RateLimitType +from graphrag_llm.rate_limit.rate_limiter import RateLimiter + +if TYPE_CHECKING: + from graphrag_common.factory import ServiceScope + + from graphrag_llm.config import RateLimitConfig + + +class RateLimitFactory(Factory[RateLimiter]): + """Factory to create RateLimiter instances.""" + + +rate_limit_factory = RateLimitFactory() + + +def register_rate_limiter( + rate_limit_type: str, + rate_limiter_initializer: Callable[..., RateLimiter], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom RateLimiter implementation. + + Args + ---- + rate_limit_type: str + The rate limit id to register. + rate_limiter_initializer: Callable[..., RateLimiter] + The rate limiter initializer to register. + scope: ServiceScope (default: "transient") + The service scope for the rate limiter instance. + """ + rate_limit_factory.register( + strategy=rate_limit_type, + initializer=rate_limiter_initializer, + scope=scope, + ) + + +def create_rate_limiter( + rate_limit_config: "RateLimitConfig", +) -> RateLimiter: + """Create a RateLimiter instance. + + Args + ---- + rate_limit_config: RateLimitConfig + The configuration for the rate limit strategy. + + Returns + ------- + RateLimiter: + An instance of a RateLimiter subclass. + """ + strategy = rate_limit_config.type + init_args = rate_limit_config.model_dump() + + if strategy not in rate_limit_factory: + match strategy: + case RateLimitType.SlidingWindow: + from graphrag_llm.rate_limit.sliding_window_rate_limiter import ( + SlidingWindowRateLimiter, + ) + + register_rate_limiter( + rate_limit_type=RateLimitType.SlidingWindow, + rate_limiter_initializer=SlidingWindowRateLimiter, + ) + + case _: + msg = f"RateLimitConfig.type '{strategy}' is not registered in the RateLimitFactory. Registered strategies: {', '.join(rate_limit_factory.keys())}" + raise ValueError(msg) + + return rate_limit_factory.create(strategy=strategy, init_args=init_args) diff --git a/graphrag/language_model/providers/litellm/services/rate_limiter/rate_limiter.py b/packages/graphrag-llm/graphrag_llm/rate_limit/rate_limiter.py similarity index 66% rename from graphrag/language_model/providers/litellm/services/rate_limiter/rate_limiter.py rename to packages/graphrag-llm/graphrag_llm/rate_limit/rate_limiter.py index 24a01a42a0..14c32402cf 100644 --- a/graphrag/language_model/providers/litellm/services/rate_limiter/rate_limiter.py +++ b/packages/graphrag-llm/graphrag_llm/rate_limit/rate_limiter.py @@ -15,23 +15,24 @@ class RateLimiter(ABC): @abstractmethod def __init__( self, - /, **kwargs: Any, - ) -> None: ... + ) -> None: + """Initialize the Rate Limiter.""" + raise NotImplementedError @abstractmethod @contextmanager - def acquire(self, *, token_count: int) -> Iterator[None]: + def acquire(self, token_count: int) -> Iterator[None]: """ Acquire Rate Limiter. Args ---- - token_count: The estimated number of tokens for the current request. + token_count: int + The estimated number of prompt and response tokens for the current request. Yields ------ None: This context manager does not return any value. """ - msg = "RateLimiter subclasses must implement the acquire method." - raise NotImplementedError(msg) + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/rate_limit/sliding_window_rate_limiter.py b/packages/graphrag-llm/graphrag_llm/rate_limit/sliding_window_rate_limiter.py new file mode 100644 index 0000000000..c8eb89e5a7 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/rate_limit/sliding_window_rate_limiter.py @@ -0,0 +1,143 @@ +# Copyright (c) 2025 Microsoft Corporation. +# Licensed under the MIT License + +"""LiteLLM Static Rate Limiter.""" + +import threading +import time +from collections import deque +from collections.abc import Iterator +from contextlib import contextmanager +from typing import Any + +from graphrag_llm.rate_limit.rate_limiter import RateLimiter + + +class SlidingWindowRateLimiter(RateLimiter): + """Sliding Window Rate Limiter implementation.""" + + _rpp: int | None = None + _tpp: int | None = None + _lock: threading.Lock + _rate_queue: deque[float] + _token_queue: deque[int] + _period_in_seconds: int + _last_time: float | None = None + _stagger: float = 0.0 + + def __init__( + self, + *, + period_in_seconds: int = 60, + requests_per_period: int | None = None, + tokens_per_period: int | None = None, + **kwargs: Any, + ): + """Initialize the Sliding Window Rate Limiter. + + Args + ---- + period_in_seconds: int + The time period in seconds for rate limiting. + requests_per_period: int | None + The maximum number of requests allowed per time period. If None, request limiting is disabled. + tokens_per_period: int | None + The maximum number of tokens allowed per time period. If None, token limiting is disabled. + + Raises + ------ + ValueError + If period_in_seconds is not a positive integer. + If requests_per_period or tokens_per_period are not positive integers. + """ + self._rpp = requests_per_period + self._tpp = tokens_per_period + self._lock = threading.Lock() + self._rate_queue: deque[float] = deque() + self._token_queue: deque[int] = deque() + self._period_in_seconds = period_in_seconds + self._last_time: float | None = None + + if self._rpp is not None and self._rpp > 0: + self._stagger = self._period_in_seconds / self._rpp + + @contextmanager + def acquire(self, token_count: int) -> Iterator[None]: + """ + Acquire Rate Limiter. + + Args + ---- + token_count: The estimated number of tokens for the current request. + + Yields + ------ + None: This context manager does not return any value. + """ + while True: + with self._lock: + current_time = time.time() + + # Use two sliding windows to keep track of requests and tokens per period + # Drop old requests and tokens out of the sliding windows + while ( + len(self._rate_queue) > 0 + and self._rate_queue[0] < current_time - self._period_in_seconds + ): + self._rate_queue.popleft() + self._token_queue.popleft() + + # If sliding window still exceed request limit, wait again + # Waiting requires reacquiring the lock, allowing other threads + # to see if their request fits within the rate limiting windows + # Makes more sense for token limit than request limit + if ( + self._rpp is not None + and self._rpp > 0 + and len(self._rate_queue) >= self._rpp + ): + continue + + # Check if current token window exceeds token limit + # If it does, wait again + # This does not account for the tokens from the current request + # This is intentional, as we want to allow the current request + # to be processed if it is larger than the tpm but smaller than context window. + # tpm is a rate/soft limit and not the hard limit of context window limits. + if ( + self._tpp is not None + and self._tpp > 0 + and sum(self._token_queue) >= self._tpp + ): + continue + + # This check accounts for the current request token usage + # is within the token limits bound. + # If the current requests tokens exceeds the token limit, + # Then let it be processed. + if ( + self._tpp is not None + and self._tpp > 0 + and token_count <= self._tpp + and sum(self._token_queue) + token_count > self._tpp + ): + continue + + # If there was a previous call, check if we need to stagger + if ( + self._stagger > 0 + and ( + self._last_time # is None if this is the first hit to the rate limiter + and current_time - self._last_time + < self._stagger # If more time has passed than the stagger time, we can proceed + ) + ): + time.sleep(self._stagger - (current_time - self._last_time)) + current_time = time.time() + + # Add the current request to the sliding window + self._rate_queue.append(current_time) + self._token_queue.append(token_count) + self._last_time = current_time + break + yield diff --git a/packages/graphrag-llm/graphrag_llm/retry/__init__.py b/packages/graphrag-llm/graphrag_llm/retry/__init__.py new file mode 100644 index 0000000000..638c958e37 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/retry/__init__.py @@ -0,0 +1,13 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Retry module for graphrag-llm.""" + +from graphrag_llm.retry.retry import Retry +from graphrag_llm.retry.retry_factory import create_retry, register_retry + +__all__ = [ + "Retry", + "create_retry", + "register_retry", +] diff --git a/packages/graphrag-llm/graphrag_llm/retry/exceptions_to_skip.py b/packages/graphrag-llm/graphrag_llm/retry/exceptions_to_skip.py new file mode 100644 index 0000000000..f751b2ad28 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/retry/exceptions_to_skip.py @@ -0,0 +1,22 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""List of exception names to skip for retries.""" + +_default_exceptions_to_skip = [ + "BadRequestError", + "UnsupportedParamsError", + "ContextWindowExceededError", + "ContentPolicyViolationError", + "ImageFetchError", + "InvalidRequestError", + "AuthenticationError", + "PermissionDeniedError", + "NotFoundError", + "UnprocessableEntityError", + "APIConnectionError", + "APIError", + "ServiceUnavailableError", + "APIResponseValidationError", + "BudgetExceededError", +] diff --git a/packages/graphrag-llm/graphrag_llm/retry/exponential_retry.py b/packages/graphrag-llm/graphrag_llm/retry/exponential_retry.py new file mode 100644 index 0000000000..f7abc9b0a8 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/retry/exponential_retry.py @@ -0,0 +1,119 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Exponential backoff retry implementation.""" + +import asyncio +import random +import time +from collections.abc import Awaitable, Callable +from typing import TYPE_CHECKING, Any + +from graphrag_llm.retry.exceptions_to_skip import _default_exceptions_to_skip +from graphrag_llm.retry.retry import Retry + +if TYPE_CHECKING: + from graphrag_llm.types import Metrics + + +class ExponentialRetry(Retry): + """Exponential backoff retry implementation.""" + + _base_delay: float + _jitter: bool + _max_retries: int + _max_delay: float + _exceptions_to_skip: list[str] + + def __init__( + self, + *, + max_retries: int = 7, # 2^7 = 128 second max delay with default settings + base_delay: float = 2.0, + jitter: bool = True, + max_delay: float | None = None, + exceptions_to_skip: list[str] | None = None, + **kwargs: dict, + ) -> None: + """Initialize ExponentialRetry. + + Args + ---- + max_retries: int (default=7, 2^7 = 128 second max delay with default settings) + The maximum number of retries to attempt. + base_delay: float + The base delay multiplier for exponential backoff. + jitter: bool + Whether to apply jitter to the delay intervals. + max_delay: float | None + The maximum delay between retries. If None, there is no limit. + + Raises + ------ + ValueError + If max_retries is less than or equal to 0. + If base_delay is less than or equal to 1.0. + """ + self._base_delay = base_delay + self._jitter = jitter + self._max_retries = max_retries + self._max_delay = max_delay or float("inf") + self._exceptions_to_skip = exceptions_to_skip or _default_exceptions_to_skip + + def retry(self, *, func: Callable[..., Any], input_args: dict[str, Any]) -> Any: + """Retry a synchronous function.""" + retries: int = 0 + delay = 1.0 + metrics: Metrics | None = input_args.get("metrics") + while True: + try: + return func(**input_args) + except Exception as e: + if e.__class__.__name__ in self._exceptions_to_skip: + raise + + if retries >= self._max_retries: + raise + retries += 1 + delay *= self._base_delay + sleep_delay = min( + self._max_delay, + delay + (self._jitter * random.uniform(0, 1)), # noqa: S311 + ) + + time.sleep(sleep_delay) + finally: + if metrics is not None: + metrics["retries"] = retries + metrics["requests_with_retries"] = 1 if retries > 0 else 0 + + async def retry_async( + self, + *, + func: Callable[..., Awaitable[Any]], + input_args: dict[str, Any], + ) -> Any: + """Retry an asynchronous function.""" + retries: int = 0 + delay = 1.0 + metrics: Metrics | None = input_args.get("metrics") + while True: + try: + return await func(**input_args) + except Exception as e: + if e.__class__.__name__ in self._exceptions_to_skip: + raise + if retries >= self._max_retries: + raise + retries += 1 + delay *= self._base_delay + sleep_delay = min( + self._max_delay, + delay + (self._jitter * random.uniform(0, 1)), # noqa: S311 + ) + + await asyncio.sleep(sleep_delay) + finally: + if metrics is not None: + metrics["retries"] = retries + metrics["requests_with_retries"] = 1 if retries > 0 else 0 diff --git a/packages/graphrag-llm/graphrag_llm/retry/immediate_retry.py b/packages/graphrag-llm/graphrag_llm/retry/immediate_retry.py new file mode 100644 index 0000000000..cb8150c089 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/retry/immediate_retry.py @@ -0,0 +1,85 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Native (immediate) retry implementation.""" + +from collections.abc import Awaitable, Callable +from typing import TYPE_CHECKING, Any + +from graphrag_llm.retry.exceptions_to_skip import _default_exceptions_to_skip +from graphrag_llm.retry.retry import Retry + +if TYPE_CHECKING: + from graphrag_llm.types import Metrics + + +class ImmediateRetry(Retry): + """Immediate retry implementation.""" + + _max_retries: int + _exceptions_to_skip: list[str] + + def __init__( + self, + *, + max_retries: int = 7, + exceptions_to_skip: list[str] | None = None, + **kwargs: dict, + ) -> None: + """Initialize ImmediateRetry. + + Args + ---- + max_retries: int (default=7) + The maximum number of retries to attempt. + + Raises + ------ + ValueError + If max_retries is less than or equal to 0. + """ + self._max_retries = max_retries + self._exceptions_to_skip = exceptions_to_skip or _default_exceptions_to_skip + + def retry(self, *, func: Callable[..., Any], input_args: dict[str, Any]) -> Any: + """Retry a synchronous function.""" + retries: int = 0 + metrics: Metrics | None = input_args.get("metrics") + while True: + try: + return func(**input_args) + except Exception as e: + if e.__class__.__name__ in self._exceptions_to_skip: + raise + + if retries >= self._max_retries: + raise + retries += 1 + finally: + if metrics is not None: + metrics["retries"] = retries + metrics["requests_with_retries"] = 1 if retries > 0 else 0 + + async def retry_async( + self, + *, + func: Callable[..., Awaitable[Any]], + input_args: dict[str, Any], + ) -> Any: + """Retry an asynchronous function.""" + retries: int = 0 + metrics: Metrics | None = input_args.get("metrics") + while True: + try: + return await func(**input_args) + except Exception as e: + if e.__class__.__name__ in self._exceptions_to_skip: + raise + + if retries >= self._max_retries: + raise + retries += 1 + finally: + if metrics is not None: + metrics["retries"] = retries + metrics["requests_with_retries"] = 1 if retries > 0 else 0 diff --git a/packages/graphrag-llm/graphrag_llm/retry/retry.py b/packages/graphrag-llm/graphrag_llm/retry/retry.py new file mode 100644 index 0000000000..5ed07070e8 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/retry/retry.py @@ -0,0 +1,32 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Retry abstract base class.""" + +from abc import ABC, abstractmethod +from collections.abc import Awaitable, Callable +from typing import Any + + +class Retry(ABC): + """Retry Abstract Base Class.""" + + @abstractmethod + def __init__(self, /, **kwargs: Any): + """Initialize Retry.""" + raise NotImplementedError + + @abstractmethod + def retry(self, *, func: Callable[..., Any], input_args: dict[str, Any]) -> Any: + """Retry a synchronous function.""" + raise NotImplementedError + + @abstractmethod + async def retry_async( + self, + *, + func: Callable[..., Awaitable[Any]], + input_args: dict[str, Any], + ) -> Any: + """Retry an asynchronous function.""" + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/retry/retry_factory.py b/packages/graphrag-llm/graphrag_llm/retry/retry_factory.py new file mode 100644 index 0000000000..e0d9cc8489 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/retry/retry_factory.py @@ -0,0 +1,86 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Retry factory.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory + +from graphrag_llm.config.types import RetryType +from graphrag_llm.retry.retry import Retry + +if TYPE_CHECKING: + from graphrag_common.factory import ServiceScope + + from graphrag_llm.config.retry_config import RetryConfig + + +class RetryFactory(Factory[Retry]): + """Factory to create Retry instances.""" + + +retry_factory = RetryFactory() + + +def register_retry( + retry_type: str, + retry_initializer: Callable[..., Retry], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom Retry implementation. + + Args + ---- + retry_type: str + The retry id to register. + retry_initializer: Callable[..., Retry] + The retry initializer to register. + """ + retry_factory.register( + strategy=retry_type, + initializer=retry_initializer, + scope=scope, + ) + + +def create_retry( + retry_config: "RetryConfig", +) -> Retry: + """Create a Retry instance. + + Args + ---- + retry_config: RetryConfig + The configuration for the retry strategy. + + Returns + ------- + Retry: + An instance of a Retry subclass. + """ + strategy = retry_config.type + init_args = retry_config.model_dump() + + if strategy not in retry_factory: + match strategy: + case RetryType.ExponentialBackoff: + from graphrag_llm.retry.exponential_retry import ExponentialRetry + + retry_factory.register( + strategy=RetryType.ExponentialBackoff, + initializer=ExponentialRetry, + ) + case RetryType.Immediate: + from graphrag_llm.retry.immediate_retry import ImmediateRetry + + retry_factory.register( + strategy=RetryType.Immediate, + initializer=ImmediateRetry, + ) + case _: + msg = f"RetryConfig.type '{strategy}' is not registered in the RetryFactory. Registered strategies: {', '.join(retry_factory.keys())}" + raise ValueError(msg) + + return retry_factory.create(strategy=strategy, init_args=init_args) diff --git a/packages/graphrag-llm/graphrag_llm/templating/__init__.py b/packages/graphrag-llm/graphrag_llm/templating/__init__.py new file mode 100644 index 0000000000..3dd39619ac --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/templating/__init__.py @@ -0,0 +1,24 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Templates module.""" + +from graphrag_llm.templating.template_engine import TemplateEngine +from graphrag_llm.templating.template_engine_factory import ( + create_template_engine, + register_template_engine, +) +from graphrag_llm.templating.template_manager import TemplateManager +from graphrag_llm.templating.template_manager_factory import ( + create_template_manager, + register_template_manager, +) + +__all__ = [ + "TemplateEngine", + "TemplateManager", + "create_template_engine", + "create_template_manager", + "register_template_engine", + "register_template_manager", +] diff --git a/packages/graphrag-llm/graphrag_llm/templating/file_template_manager.py b/packages/graphrag-llm/graphrag_llm/templating/file_template_manager.py new file mode 100644 index 0000000000..a4f9a679fc --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/templating/file_template_manager.py @@ -0,0 +1,76 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""In-memory template manager implementation.""" + +from pathlib import Path +from typing import Any + +from graphrag_llm.templating.template_manager import TemplateManager + + +class FileTemplateManager(TemplateManager): + """Abstract base class for template managers.""" + + _encoding: str + _templates_extension: str + _templates_dir: Path + + def __init__( + self, + base_dir: str = "templates", + template_extension: str = ".jinja", + encoding: str = "utf-8", + **kwargs: Any, + ) -> None: + """Initialize the template manager. + + Args + ---- + base_dir: str (default="./templates") + The base directory where templates are stored. + template_extension: str (default=".jinja") + The file extension for template files. + encoding: str (default="utf-8") + The encoding used to read template files. + + Raises + ------ + ValueError + If the base directory does not exist or is not a directory. + If the template_extension is an empty string. + """ + self._templates = {} + self._encoding = encoding + + self._templates_extension = template_extension + + self._templates_dir = Path(base_dir).resolve() + if not self._templates_dir.exists() or not self._templates_dir.is_dir(): + msg = f"Templates directory '{base_dir}' does not exist or is not a directory." + raise ValueError(msg) + + def get(self, template_name: str) -> str | None: + """Retrieve a template by its name.""" + template_file = ( + self._templates_dir / f"{template_name}{self._templates_extension}" + ) + if template_file.exists() and template_file.is_file(): + return template_file.read_text(encoding=self._encoding) + return None + + def register(self, template_name: str, template: str) -> None: + """Register a new template.""" + self._templates[template_name] = template + template_path = ( + self._templates_dir / f"{template_name}{self._templates_extension}" + ) + template_path.write_text(template, encoding=self._encoding) + + def keys(self) -> list[str]: + """List all registered template names.""" + return list(self._templates.keys()) + + def __contains__(self, template_name: str) -> bool: + """Check if a template is registered.""" + return template_name in self._templates diff --git a/packages/graphrag-llm/graphrag_llm/templating/jinja_template_engine.py b/packages/graphrag-llm/graphrag_llm/templating/jinja_template_engine.py new file mode 100644 index 0000000000..e520e4b0cc --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/templating/jinja_template_engine.py @@ -0,0 +1,55 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Jinja template engine.""" + +from typing import TYPE_CHECKING, Any + +from jinja2 import StrictUndefined, Template, UndefinedError + +from graphrag_llm.templating.template_engine import TemplateEngine + +if TYPE_CHECKING: + from graphrag_llm.templating.template_manager import TemplateManager + + +class JinjaTemplateEngine(TemplateEngine): + """Jinja template engine.""" + + _templates: dict[str, Template] + _template_manager: "TemplateManager" + + def __init__(self, *, template_manager: "TemplateManager", **kwargs: Any) -> None: + """Initialize the template engine. + + Args + ---- + template_manager: TemplateManager + The template manager to use for loading templates. + """ + self._templates = {} + self._template_manager = template_manager + + def render(self, template_name: str, context: dict[str, Any]) -> str: + """Render a template with the given context.""" + jinja_template = self._templates.get(template_name) + if jinja_template is None: + template_contents = self._template_manager.get(template_name) + if template_contents is None: + msg = f"Template '{template_name}' not found." + raise KeyError(msg) + jinja_template = Template(template_contents, undefined=StrictUndefined) + self._templates[template_name] = jinja_template + try: + return jinja_template.render(**context) + except UndefinedError as e: + msg = f"Missing key in context for template '{template_name}': {e.message}" + raise KeyError(msg) from e + except Exception as e: + msg = f"Error rendering template '{template_name}': {e!s}" + raise RuntimeError(msg) from e + + @property + def template_manager(self) -> "TemplateManager": + """Template manager associated with this engine.""" + return self._template_manager diff --git a/packages/graphrag-llm/graphrag_llm/templating/template_engine.py b/packages/graphrag-llm/graphrag_llm/templating/template_engine.py new file mode 100644 index 0000000000..29b3250145 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/templating/template_engine.py @@ -0,0 +1,53 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Abstract base class for template engines.""" + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.templating.template_manager import TemplateManager + + +class TemplateEngine(ABC): + """Abstract base class for template engines.""" + + @abstractmethod + def __init__(self, *, template_manager: "TemplateManager", **kwargs: Any) -> None: + """Initialize the template engine. + + Args + ---- + template_manager: TemplateManager + The template manager to use for loading templates. + + """ + raise NotImplementedError + + @abstractmethod + def render(self, template_name: str, context: dict[str, Any]) -> str: + """Render a template with the given context. + + Args + ---- + template_name: str + The name of the template to render. + context: dict[str, str] + The context to use for rendering the template. + + Returns + ------- + str: The rendered template. + + Raises + ------ + KeyError: If the template is not found or a required key is missing in the context. + """ + raise NotImplementedError + + @property + @abstractmethod + def template_manager(self) -> "TemplateManager": + """Template manager associated with this engine.""" + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/templating/template_engine_factory.py b/packages/graphrag-llm/graphrag_llm/templating/template_engine_factory.py new file mode 100644 index 0000000000..fb7fbbbaf8 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/templating/template_engine_factory.py @@ -0,0 +1,95 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Template engine factory implementation.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory + +from graphrag_llm.config.template_engine_config import TemplateEngineConfig +from graphrag_llm.config.types import TemplateEngineType +from graphrag_llm.templating.template_engine import TemplateEngine +from graphrag_llm.templating.template_manager_factory import create_template_manager + +if TYPE_CHECKING: + from graphrag_common.factory import ServiceScope + + +class TemplateEngineFactory(Factory[TemplateEngine]): + """Factory for creating template engine instances.""" + + +template_engine_factory = TemplateEngineFactory() + + +def register_template_engine( + template_engine_type: str, + template_engine_initializer: Callable[..., TemplateEngine], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom template engine implementation. + + Args + ---- + template_engine_type: str + The template engine id to register. + template_engine_initializer: Callable[..., TemplateEngine] + The template engine initializer to register. + scope: ServiceScope (default: "transient") + The service scope for the template engine instance. + """ + template_engine_factory.register( + strategy=template_engine_type, + initializer=template_engine_initializer, + scope=scope, + ) + + +def create_template_engine( + template_engine_config: TemplateEngineConfig | None = None, +) -> TemplateEngine: + """Create a TemplateEngine instance. + + Args + ---- + template_engine_config: TemplateEngineConfig | None + The configuration for the template engine. If None, defaults will be used. + + Returns + ------- + TemplateEngine: + An instance of a TemplateEngine subclass. + """ + template_engine_config = template_engine_config or TemplateEngineConfig() + + strategy = template_engine_config.type + template_manager = create_template_manager( + template_engine_config=template_engine_config + ) + init_args = template_engine_config.model_dump() + + if strategy not in template_engine_factory: + match strategy: + case TemplateEngineType.Jinja: + from graphrag_llm.templating.jinja_template_engine import ( + JinjaTemplateEngine, + ) + + template_engine_factory.register( + strategy=TemplateEngineType.Jinja, + initializer=JinjaTemplateEngine, + scope="singleton", + ) + case _: + msg = f"TemplateEngineConfig.type '{strategy}' is not registered in the TemplateEngineFactory. Registered strategies: {', '.join(template_engine_factory.keys())}" + raise ValueError(msg) + + return template_engine_factory.create( + strategy=strategy, + init_args={ + **init_args, + "template_manager": template_manager, + }, + ) diff --git a/packages/graphrag-llm/graphrag_llm/templating/template_manager.py b/packages/graphrag-llm/graphrag_llm/templating/template_manager.py new file mode 100644 index 0000000000..6731176d96 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/templating/template_manager.py @@ -0,0 +1,65 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Abstract base class for template managers.""" + +from abc import ABC, abstractmethod +from typing import Any + + +class TemplateManager(ABC): + """Abstract base class for template managers.""" + + @abstractmethod + def __init__(self, **kwargs: Any) -> None: + """Initialize the template manager.""" + raise NotImplementedError + + @abstractmethod + def get(self, template_name: str) -> str | None: + """Retrieve a template by its name. + + Args + ---- + template_name: str + The name of the template to retrieve. + + Returns + ------- + str | None: The content of the template, if found. + """ + raise NotImplementedError + + @abstractmethod + def register(self, template_name: str, template: str) -> None: + """Register a new template. + + Args + ---- + template_name: str + The name of the template. + template: str + The content of the template. + """ + raise NotImplementedError + + @abstractmethod + def keys(self) -> list[str]: + """List all registered template names. + + Returns + ------- + list[str]: A list of registered template names. + """ + raise NotImplementedError + + @abstractmethod + def __contains__(self, template_name: str) -> bool: + """Check if a template is registered. + + Args + ---- + template_name: str + The name of the template to check. + """ + raise NotImplementedError diff --git a/packages/graphrag-llm/graphrag_llm/templating/template_manager_factory.py b/packages/graphrag-llm/graphrag_llm/templating/template_manager_factory.py new file mode 100644 index 0000000000..9de35a3693 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/templating/template_manager_factory.py @@ -0,0 +1,82 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Template manager factory implementation.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory + +from graphrag_llm.config.template_engine_config import TemplateEngineConfig +from graphrag_llm.config.types import TemplateManagerType +from graphrag_llm.templating.template_manager import TemplateManager + +if TYPE_CHECKING: + from graphrag_common.factory import ServiceScope + + +class TemplateManagerFactory(Factory[TemplateManager]): + """Factory for creating template manager instances.""" + + +template_manager_factory = TemplateManagerFactory() + + +def register_template_manager( + template_manager_type: str, + template_manager_initializer: Callable[..., TemplateManager], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom template manager implementation. + + Args + ---- + - template_manager_type: str + The template manager id to register. + - template_manager_initializer: Callable[..., TemplateManager] + The template manager initializer to register. + """ + template_manager_factory.register( + strategy=template_manager_type, + initializer=template_manager_initializer, + scope=scope, + ) + + +def create_template_manager( + template_engine_config: TemplateEngineConfig | None = None, +) -> TemplateManager: + """Create a TemplateManager instance. + + Args + ---- + template_engine_config: TemplateEngineConfig + The configuration for the template engine. + + Returns + ------- + TemplateManager: + An instance of a TemplateManager subclass. + """ + template_engine_config = template_engine_config or TemplateEngineConfig() + strategy = template_engine_config.template_manager + init_args = template_engine_config.model_dump() + + if strategy not in template_manager_factory: + match strategy: + case TemplateManagerType.File: + from graphrag_llm.templating.file_template_manager import ( + FileTemplateManager, + ) + + template_manager_factory.register( + strategy=TemplateManagerType.File, + initializer=FileTemplateManager, + scope="singleton", + ) + case _: + msg = f"TemplateEngineConfig.template_manager '{strategy}' is not registered in the TemplateManagerFactory. Registered strategies: {', '.join(template_manager_factory.keys())}" + raise ValueError(msg) + + return template_manager_factory.create(strategy=strategy, init_args=init_args) diff --git a/packages/graphrag-llm/graphrag_llm/threading/__init__.py b/packages/graphrag-llm/graphrag_llm/threading/__init__.py new file mode 100644 index 0000000000..cc797aceed --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/threading/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Threading module.""" + +from graphrag_llm.threading.completion_thread_runner import completion_thread_runner + +__all__ = [ + "completion_thread_runner", +] diff --git a/packages/graphrag-llm/graphrag_llm/threading/completion_thread.py b/packages/graphrag-llm/graphrag_llm/threading/completion_thread.py new file mode 100644 index 0000000000..4b0dbd4f4b --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/threading/completion_thread.py @@ -0,0 +1,91 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Completion Thread.""" + +import threading +from queue import Empty, Queue +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from collections.abc import Iterator + + from graphrag_llm.types import ( + LLMCompletionArgs, + LLMCompletionChunk, + LLMCompletionFunction, + LLMCompletionResponse, + ) + + +LLMCompletionRequestQueue = Queue[tuple[str, "LLMCompletionArgs"] | None] +"""Input queue for LLM completions. + +A queue for tracking requests to be made to a completion endpoint. +Each item in the queue is a tuple containing a request ID and a dictionary of +completion arguments. A `None` value indicates that the thread should terminate. + +Queue Item Type: + tuple[request_id, completion_args_dict] | None + +Items in the queue are processed by a thread pool in which the results are placed +into an output queue to be handled by a response handler. +""" + + +LLMCompletionResponseQueue = Queue[ + tuple[ + str, + "LLMCompletionResponse | Iterator[LLMCompletionChunk] | Exception", + ] + | None +] +"""Output queue for LLM completion responses. + +A queue for tracking responses from completion requests. Each item in the queue is a tuple +containing the request ID and the corresponding response, which can be a full response, +a stream of chunks, or an exception if the request failed. A `None` value indicates that the +thread should terminate. + +Queue Item Type: + tuple[request_id, response | exception] | None + +Items in the queue are produced by a thread pool that processes completion requests +from an input queue. This output queue is then consumed by a response handler provided +by the user. +""" + + +class CompletionThread(threading.Thread): + """Thread for handling LLM completions.""" + + def __init__( + self, + *, + quit_process_event: threading.Event, + input_queue: LLMCompletionRequestQueue, + output_queue: LLMCompletionResponseQueue, + completion: "LLMCompletionFunction", + ) -> None: + super().__init__() + self._quit_process_event = quit_process_event + self._input_queue = input_queue + self._output_queue = output_queue + self._completion = completion + + def run(self): + """Run the completion thread.""" + while True and not self._quit_process_event.is_set(): + try: + input_data = self._input_queue.get(timeout=1) + except Empty: + continue + if input_data is None: + break + request_id, data = input_data + try: + response = self._completion(**data) + + self._output_queue.put((request_id, response)) + except Exception as e: # noqa: BLE001 + self._output_queue.put((request_id, e)) diff --git a/packages/graphrag-llm/graphrag_llm/threading/completion_thread_runner.py b/packages/graphrag-llm/graphrag_llm/threading/completion_thread_runner.py new file mode 100644 index 0000000000..bb34cf4c54 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/threading/completion_thread_runner.py @@ -0,0 +1,243 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Completion Thread Runner.""" + +import asyncio +import sys +import threading +import time +from collections.abc import Awaitable, Iterator +from contextlib import contextmanager +from queue import Empty, Queue +from typing import TYPE_CHECKING, Protocol, Unpack, runtime_checkable + +from graphrag_llm.threading.completion_thread import CompletionThread + +if TYPE_CHECKING: + from graphrag_llm.metrics import MetricsStore + from graphrag_llm.threading.completion_thread import ( + LLMCompletionRequestQueue, + LLMCompletionResponseQueue, + ) + from graphrag_llm.types import ( + LLMCompletionArgs, + LLMCompletionChunk, + LLMCompletionFunction, + LLMCompletionResponse, + ) + + +@runtime_checkable +class ThreadedLLMCompletionResponseHandler(Protocol): + """Threaded completion response handler. + + This function is used to handle responses from the threaded completion runner. + + Args + ---- + request_id: str + The request ID associated with the completion request. + resp: LLMCompletionResponse | Iterator[LLMCompletionChunk] | Exception + The completion response, which can be a full response, a stream of chunks, + or an exception if the request failed. + + Returns + ------- + Awaitable[None] | None + The callback can be asynchronous or synchronous. + """ + + def __call__( + self, + request_id: str, + response: "LLMCompletionResponse | Iterator[LLMCompletionChunk] | Exception", + /, + ) -> Awaitable[None] | None: + """Threaded completion response handler.""" + ... + + +@runtime_checkable +class ThreadedLLMCompletionFunction(Protocol): + """Threaded completion function. + + This function is used to submit requests to a thread pool for processing. + The thread pool will process the requests and invoke the provided callback + with the responses. + + same signature as LLMCompletionFunction but requires a `request_id` parameter + to identify the request and does not return anything. + + Args + ---- + messages: LLMCompletionMessagesParam + The messages to send to the LLM. + Can be str | list[dict[str, str]] | list[ChatCompletionMessageParam]. + request_id: str + The request ID to associate with the completion request. + response_format: BaseModel | None (default=None) + The structured response format. + Must extend pydantic BaseModel. + stream: bool (default=False) + Whether to stream the response. + streaming is not supported when using response_format. + max_completion_tokens: int | None (default=None) + The maximum number of tokens to generate in the completion. + temperature: float | None (default=None) + The temperature to control how deterministic vs. creative the responses are. + top_p: float | None (default=None) + top_p for nucleus sampling, where the model considers tokens with + cumulative probabilities up to top_p. Values range from 0 to 1. + n: int | None (default=None) + The number of completions to generate for each prompt. + tools: list[Tool] | None (default=None) + Optional tools to use during completion. + https://docs.litellm.ai/docs/completion/function_call + **kwargs: Any + Additional keyword arguments. + + Returns + ------- + None + """ + + def __call__( + self, + /, + request_id: str, + **kwargs: Unpack["LLMCompletionArgs"], + ) -> None: + """Threaded Chat completion function.""" + ... + + +def _start_completion_thread_pool( + *, + completion: "LLMCompletionFunction", + quit_process_event: threading.Event, + concurrency: int, + queue_limit: int, +) -> tuple[ + list[CompletionThread], + "LLMCompletionRequestQueue", + "LLMCompletionResponseQueue", +]: + threads: list[CompletionThread] = [] + input_queue: LLMCompletionRequestQueue = Queue(queue_limit) + output_queue: LLMCompletionResponseQueue = Queue() + for _ in range(concurrency): + thread = CompletionThread( + quit_process_event=quit_process_event, + input_queue=input_queue, + output_queue=output_queue, + completion=completion, + ) + thread.start() + threads.append(thread) + + return threads, input_queue, output_queue + + +@contextmanager +def completion_thread_runner( + *, + completion: "LLMCompletionFunction", + response_handler: ThreadedLLMCompletionResponseHandler, + concurrency: int, + queue_limit: int = 0, + metrics_store: "MetricsStore | None" = None, +) -> Iterator[ThreadedLLMCompletionFunction]: + """Run a completion thread pool. + + Args + ---- + completion: LLMCompletion + The LLMCompletion instance to use for processing requests. + response_handler: ThreadedLLMCompletionResponseHandler + The callback function to handle completion responses. + (request_id, response|exception) -> Awaitable[None] | None + concurrency: int + The number of threads to spin up in a thread pool. + queue_limit: int (default=0) + The maximum number of items allowed in the input queue. + 0 means unlimited. + Set this to a value to create backpressure on the caller. + metrics_store: MetricsStore | None (default=None) + Optional metrics store to record runtime duration. + + Yields + ------ + ThreadedLLMCompletionFunction: + A function that can be used to submit completion requests to the thread pool. + (messages, request_id, **kwargs) -> None + + The thread pool will process the requests and invoke the provided callback + with the responses. + + same signature as LLMCompletionFunction but requires a `request_id` parameter + to identify the request and does not return anything. + """ + quit_process_event = threading.Event() + threads, input_queue, output_queue = _start_completion_thread_pool( + completion=completion, + quit_process_event=quit_process_event, + concurrency=concurrency, + queue_limit=queue_limit, + ) + + def _process_output( + quit_process_event: threading.Event, + output_queue: "LLMCompletionResponseQueue", + callback: ThreadedLLMCompletionResponseHandler, + ): + while True and not quit_process_event.is_set(): + try: + data = output_queue.get(timeout=1) + except Empty: + continue + if data is None: + break + request_id, response = data + response = callback(request_id, response) + + if asyncio.iscoroutine(response): + response = asyncio.run(response) + + def _process_input(request_id: str, **kwargs: Unpack["LLMCompletionArgs"]): + if not request_id: + msg = "request_id needs to be passed as a keyword argument" + raise ValueError(msg) + input_queue.put((request_id, kwargs)) + + handle_response_thread = threading.Thread( + target=_process_output, + args=(quit_process_event, output_queue, response_handler), + ) + handle_response_thread.start() + + def _cleanup(): + for _ in threads: + input_queue.put(None) + + for thread in threads: + while thread.is_alive(): + thread.join(timeout=1) + + output_queue.put(None) + + while handle_response_thread.is_alive(): + handle_response_thread.join(timeout=1) + + start_time = time.time() + try: + yield _process_input + _cleanup() + except KeyboardInterrupt: + quit_process_event.set() + sys.exit(1) + finally: + end_time = time.time() + runtime = end_time - start_time + if metrics_store: + metrics_store.update_metrics(metrics={"runtime_duration_seconds": runtime}) diff --git a/packages/graphrag-llm/graphrag_llm/threading/embedding_thread.py b/packages/graphrag-llm/graphrag_llm/threading/embedding_thread.py new file mode 100644 index 0000000000..7980d08fc1 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/threading/embedding_thread.py @@ -0,0 +1,88 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Embedding Thread.""" + +import threading +from queue import Empty, Queue +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from graphrag_llm.types import ( + LLMEmbeddingArgs, + LLMEmbeddingFunction, + LLMEmbeddingResponse, + ) + + +LLMEmbeddingRequestQueue = Queue[tuple[str, "LLMEmbeddingArgs"] | None] +"""Input queue for LLM embeddings. + +A queue for tracking requests to be made to an embedding endpoint. +Each item in the queue is a tuple containing a request ID and a dictionary of +embedding arguments. A `None` value indicates that the thread should terminate. + +Queue Item Type: + tuple[request_id, embedding_args_dict] | None + +Items in the queue are processed by a thread pool in which the results are placed +into an output queue to be handled by a response handler. +""" + +LLMEmbeddingResponseQueue = Queue[ + tuple[ + str, + "LLMEmbeddingResponse | Exception", + ] + | None +] +"""Output queue for LLM embedding responses. + +A queue for tracking responses from embedding requests. Each item in the queue is a tuple +containing the request ID and the corresponding response, which can be a full response +or an exception if the request failed. A `None` value indicates that the +thread should terminate. + +Queue Item Type: + tuple[request_id, response | exception] | None + +Items in the queue are produced by a thread pool that processes embedding requests +from an input queue. This output queue is then consumed by a response handler provided +by the user. +""" + + +class EmbeddingThread(threading.Thread): + """Thread for handling LLM embeddings.""" + + def __init__( + self, + *, + quit_process_event: threading.Event, + input_queue: LLMEmbeddingRequestQueue, + output_queue: LLMEmbeddingResponseQueue, + embedding: "LLMEmbeddingFunction", + ) -> None: + super().__init__() + self._quit_process_event = quit_process_event + self._input_queue = input_queue + self._output_queue = output_queue + self._embedding = embedding + + def run(self) -> None: + """Run the embedding thread.""" + while not self._quit_process_event.is_set(): + try: + input_data = self._input_queue.get(timeout=0.1) + except Empty: + continue + + if input_data is None: + break + request_id, data = input_data + try: + response = self._embedding(**data) + + self._output_queue.put((request_id, response)) + except Exception as e: # noqa: BLE001 + self._output_queue.put((request_id, e)) diff --git a/packages/graphrag-llm/graphrag_llm/threading/embedding_thread_runner.py b/packages/graphrag-llm/graphrag_llm/threading/embedding_thread_runner.py new file mode 100644 index 0000000000..995e69ffda --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/threading/embedding_thread_runner.py @@ -0,0 +1,216 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Embedding Thread Runner.""" + +import asyncio +import sys +import threading +import time +from collections.abc import Awaitable, Iterator +from contextlib import contextmanager +from queue import Empty, Queue +from typing import TYPE_CHECKING, Protocol, Unpack, runtime_checkable + +from graphrag_llm.threading.embedding_thread import EmbeddingThread + +if TYPE_CHECKING: + from graphrag_llm.metrics import MetricsStore + from graphrag_llm.threading.embedding_thread import ( + LLMEmbeddingRequestQueue, + LLMEmbeddingResponseQueue, + ) + from graphrag_llm.types import ( + LLMEmbeddingArgs, + LLMEmbeddingFunction, + LLMEmbeddingResponse, + ) + + +@runtime_checkable +class ThreadedLLMEmbeddingResponseHandler(Protocol): + """Threaded embedding response handler. + + This function is used to handle responses from the threaded embedding runner. + + Args + ---- + request_id: str + The request ID associated with the embedding request. + resp: LLMEmbeddingResponse | Exception + The embedding response, which can be a full response or + an exception if the request failed. + + Returns + ------- + Awaitable[None] | None + The callback can be asynchronous or synchronous. + """ + + def __call__( + self, + request_id: str, + response: "LLMEmbeddingResponse | Exception", + /, + ) -> Awaitable[None] | None: + """Threaded embedding response handler.""" + ... + + +@runtime_checkable +class ThreadedLLMEmbeddingFunction(Protocol): + """Threaded embedding function. + + This function is used to make embedding requests in a threaded context. + + Args + ---- + request_id: str + The request ID associated with the embedding request. + input: list[str] + The input texts to be embedded. + **kwargs: Any + Additional keyword arguments. + + Returns + ------- + LLMEmbeddingResponse + The embedding response. + """ + + def __call__( + self, /, request_id: str, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> None: + """Threaded embedding function.""" + ... + + +def _start_embedding_thread_pool( + *, + embedding: "LLMEmbeddingFunction", + quit_process_event: threading.Event, + concurrency: int, + queue_limit: int, +) -> tuple[ + list["EmbeddingThread"], + "LLMEmbeddingRequestQueue", + "LLMEmbeddingResponseQueue", +]: + threads: list[EmbeddingThread] = [] + input_queue: LLMEmbeddingRequestQueue = Queue(queue_limit) + output_queue: LLMEmbeddingResponseQueue = Queue() + for _ in range(concurrency): + thread = EmbeddingThread( + quit_process_event=quit_process_event, + input_queue=input_queue, + output_queue=output_queue, + embedding=embedding, + ) + thread.start() + threads.append(thread) + + return threads, input_queue, output_queue + + +@contextmanager +def embedding_thread_runner( + *, + embedding: "LLMEmbeddingFunction", + response_handler: ThreadedLLMEmbeddingResponseHandler, + concurrency: int, + queue_limit: int = 0, + metrics_store: "MetricsStore | None" = None, +) -> Iterator[ThreadedLLMEmbeddingFunction]: + """Run an embedding thread pool. + + Args + ---- + embedding: LLMEmbeddingFunction + The LLMEmbeddingFunction instance to use for processing requests. + response_handler: ThreadedLLMEmbeddingResponseHandler + The callback function to handle embedding responses. + (request_id, response|exception) -> Awaitable[None] | None + concurrency: int + The number of threads to spin up in a thread pool. + queue_limit: int (default=0) + The maximum number of items allowed in the input queue. + 0 means unlimited. + Set this to a value to create backpressure on the caller. + metrics_store: MetricsStore | None (default=None) + Optional metrics store to record runtime duration. + + Yields + ------ + ThreadedLLMEmbeddingFunction: + A function that can be used to submit embedding requests to the thread pool. + (input, request_id, **kwargs) -> None + + The thread pool will process the requests and invoke the provided callback + with the responses. + + same signature as LLMEmbeddingFunction but requires a `request_id` parameter + to identify the request and does not return anything. + """ + quit_process_event = threading.Event() + threads, input_queue, output_queue = _start_embedding_thread_pool( + embedding=embedding, + quit_process_event=quit_process_event, + concurrency=concurrency, + queue_limit=queue_limit, + ) + + def _process_output( + quit_process_event: threading.Event, + output_queue: "LLMEmbeddingResponseQueue", + callback: ThreadedLLMEmbeddingResponseHandler, + ): + while True and not quit_process_event.is_set(): + try: + data = output_queue.get(timeout=1) + except Empty: + continue + if data is None: + break + request_id, response = data + response = callback(request_id, response) + + if asyncio.iscoroutine(response): + response = asyncio.run(response) + + def _process_input(request_id: str, **kwargs: Unpack["LLMEmbeddingArgs"]): + if not request_id: + msg = "request_id needs to be passed as a keyword argument" + raise ValueError(msg) + input_queue.put((request_id, kwargs)) + + handle_response_thread = threading.Thread( + target=_process_output, + args=(quit_process_event, output_queue, response_handler), + ) + handle_response_thread.start() + + def _cleanup(): + for _ in threads: + input_queue.put(None) + + for thread in threads: + while thread.is_alive(): + thread.join(timeout=1) + + output_queue.put(None) + + while handle_response_thread.is_alive(): + handle_response_thread.join(timeout=1) + + start_time = time.time() + try: + yield _process_input + _cleanup() + except KeyboardInterrupt: + quit_process_event.set() + sys.exit(1) + finally: + end_time = time.time() + runtime = end_time - start_time + if metrics_store: + metrics_store.update_metrics(metrics={"runtime_duration_seconds": runtime}) diff --git a/packages/graphrag-llm/graphrag_llm/tokenizer/__init__.py b/packages/graphrag-llm/graphrag_llm/tokenizer/__init__.py new file mode 100644 index 0000000000..0010fd2b5f --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/tokenizer/__init__.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Tokenizer module.""" + +from graphrag_llm.tokenizer.tokenizer import Tokenizer +from graphrag_llm.tokenizer.tokenizer_factory import ( + create_tokenizer, + register_tokenizer, +) + +__all__ = [ + "Tokenizer", + "create_tokenizer", + "register_tokenizer", +] diff --git a/graphrag/tokenizer/litellm_tokenizer.py b/packages/graphrag-llm/graphrag_llm/tokenizer/lite_llm_tokenizer.py similarity index 56% rename from graphrag/tokenizer/litellm_tokenizer.py rename to packages/graphrag-llm/graphrag_llm/tokenizer/lite_llm_tokenizer.py index 1a85f56086..392f113eba 100644 --- a/graphrag/tokenizer/litellm_tokenizer.py +++ b/packages/graphrag-llm/graphrag_llm/tokenizer/lite_llm_tokenizer.py @@ -3,45 +3,52 @@ """LiteLLM Tokenizer.""" +from typing import Any + from litellm import decode, encode # type: ignore -from graphrag.tokenizer.tokenizer import Tokenizer +from graphrag_llm.tokenizer.tokenizer import Tokenizer -class LitellmTokenizer(Tokenizer): +class LiteLLMTokenizer(Tokenizer): """LiteLLM Tokenizer.""" - def __init__(self, model_name: str) -> None: + _model_id: str + + def __init__(self, *, model_id: str, **kwargs: Any) -> None: """Initialize the LiteLLM Tokenizer. Args ---- - model_name (str): The name of the LiteLLM model to use for tokenization. + model_id: str + The LiteLLM model ID, e.g., "openai/gpt-4o". """ - self.model_name = model_name + self._model_id = model_id def encode(self, text: str) -> list[int]: """Encode the given text into a list of tokens. Args ---- - text (str): The input text to encode. + text: str + The input text to encode. Returns ------- list[int]: A list of tokens representing the encoded text. """ - return encode(model=self.model_name, text=text) + return encode(model=self._model_id, text=text) def decode(self, tokens: list[int]) -> str: """Decode a list of tokens back into a string. Args ---- - tokens (list[int]): A list of tokens to decode. + tokens: list[int] + A list of tokens to decode. Returns ------- str: The decoded string from the list of tokens. """ - return decode(model=self.model_name, tokens=tokens) + return decode(model=self._model_id, tokens=tokens) diff --git a/graphrag/tokenizer/tiktoken_tokenizer.py b/packages/graphrag-llm/graphrag_llm/tokenizer/tiktoken_tokenizer.py similarity index 52% rename from graphrag/tokenizer/tiktoken_tokenizer.py rename to packages/graphrag-llm/graphrag_llm/tokenizer/tiktoken_tokenizer.py index fa6c6e9b43..9388c13b51 100644 --- a/graphrag/tokenizer/tiktoken_tokenizer.py +++ b/packages/graphrag-llm/graphrag_llm/tokenizer/tiktoken_tokenizer.py @@ -1,47 +1,55 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""Tiktoken Tokenizer.""" +"""LiteLLM Tokenizer.""" + +from typing import Any import tiktoken -from graphrag.tokenizer.tokenizer import Tokenizer +from graphrag_llm.tokenizer.tokenizer import Tokenizer class TiktokenTokenizer(Tokenizer): - """Tiktoken Tokenizer.""" + """LiteLLM Tokenizer.""" + + _encoding_name: str - def __init__(self, encoding_name: str) -> None: + def __init__(self, *, encoding_name: str, **kwargs: Any) -> None: """Initialize the Tiktoken Tokenizer. Args ---- - encoding_name (str): The name of the Tiktoken encoding to use for tokenization. + encoding_name: str + The encoding name, e.g., "gpt-4o". """ - self.encoding = tiktoken.get_encoding(encoding_name) + self._encoding_name = encoding_name + self._encoding = tiktoken.get_encoding(encoding_name) def encode(self, text: str) -> list[int]: """Encode the given text into a list of tokens. Args ---- - text (str): The input text to encode. + text: str + The input text to encode. Returns ------- list[int]: A list of tokens representing the encoded text. """ - return self.encoding.encode(text) + return self._encoding.encode(text) def decode(self, tokens: list[int]) -> str: """Decode a list of tokens back into a string. Args ---- - tokens (list[int]): A list of tokens to decode. + tokens: list[int] + A list of tokens to decode. Returns ------- str: The decoded string from the list of tokens. """ - return self.encoding.decode(tokens) + return self._encoding.decode(tokens) diff --git a/packages/graphrag-llm/graphrag_llm/tokenizer/tokenizer.py b/packages/graphrag-llm/graphrag_llm/tokenizer/tokenizer.py new file mode 100644 index 0000000000..37bc3de721 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/tokenizer/tokenizer.py @@ -0,0 +1,111 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Tokenizer Abstract Base Class.""" + +from abc import ABC, abstractmethod +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from graphrag_llm.types import LLMCompletionMessagesParam + + +class Tokenizer(ABC): + """Tokenizer Abstract Base Class.""" + + @abstractmethod + def __init__(self, **kwargs: Any) -> None: + """Initialize the LiteLLM Tokenizer.""" + + @abstractmethod + def encode(self, text: str) -> list[int]: + """Encode the given text into a list of tokens. + + Args + ---- + text: str + The input text to encode. + + Returns + ------- + list[int]: A list of tokens representing the encoded text. + """ + raise NotImplementedError + + @abstractmethod + def decode(self, tokens: list[int]) -> str: + """Decode a list of tokens back into a string. + + Args + ---- + tokens: list[int] + A list of tokens to decode. + + Returns + ------- + str: The decoded string from the list of tokens. + """ + raise NotImplementedError + + def num_prompt_tokens( + self, + messages: "LLMCompletionMessagesParam", + ) -> int: + """Count the number of tokens in a prompt for a given model. + + Counts the number of tokens used for roles, names, and content in the messages. + + modeled after: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb + + Args + ---- + messages: LLMCompletionMessagesParam + The messages comprising the prompt. Can either be a string or a list of message dicts. + + Returns + ------- + int: The number of tokens in the prompt. + """ + total_tokens = 3 # overhead for reply + tokens_per_message = 3 # fixed overhead per message + tokens_per_name = 1 # fixed overhead per name field + + if isinstance(messages, str): + return ( + self.num_tokens(messages) + + total_tokens + + tokens_per_message + + tokens_per_name + ) + + for message in messages: + total_tokens += tokens_per_message + if not isinstance(message, dict): + message = message.model_dump() + for key, value in message.items(): + if key == "content": + if isinstance(value, str): + total_tokens += self.num_tokens(value) + elif isinstance(value, list): + for part in value: + if isinstance(part, dict) and "text" in part: + total_tokens += self.num_tokens(part["text"]) + elif key == "role": + total_tokens += self.num_tokens(str(value)) + elif key == "name": + total_tokens += self.num_tokens(str(value)) + tokens_per_name + return total_tokens + + def num_tokens(self, text: str) -> int: + """Return the number of tokens in the given text. + + Args + ---- + text: str + The input text to analyze. + + Returns + ------- + int: The number of tokens in the input text. + """ + return len(self.encode(text)) diff --git a/packages/graphrag-llm/graphrag_llm/tokenizer/tokenizer_factory.py b/packages/graphrag-llm/graphrag_llm/tokenizer/tokenizer_factory.py new file mode 100644 index 0000000000..929991c616 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/tokenizer/tokenizer_factory.py @@ -0,0 +1,89 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Tokenizer factory.""" + +from collections.abc import Callable +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory + +from graphrag_llm.config.types import TokenizerType +from graphrag_llm.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_common.factory import ServiceScope + + from graphrag_llm.config.tokenizer_config import TokenizerConfig + + +class TokenizerFactory(Factory[Tokenizer]): + """Factory for creating Tokenizer instances.""" + + +tokenizer_factory = TokenizerFactory() + + +def register_tokenizer( + tokenizer_type: str, + tokenizer_initializer: Callable[..., Tokenizer], + scope: "ServiceScope" = "transient", +) -> None: + """Register a custom tokenizer implementation. + + Args + ---- + tokenizer_type: str + The tokenizer id to register. + tokenizer_initializer: Callable[..., Tokenizer] + The tokenizer initializer to register. + """ + tokenizer_factory.register(tokenizer_type, tokenizer_initializer, scope) + + +def create_tokenizer(tokenizer_config: "TokenizerConfig") -> Tokenizer: + """Create a Tokenizer instance based on the configuration. + + Args + ---- + tokenizer_config: TokenizerConfig + The configuration for the tokenizer. + + Returns + ------- + Tokenizer: + An instance of a Tokenizer subclass. + """ + strategy = tokenizer_config.type + init_args = tokenizer_config.model_dump() + + if strategy not in tokenizer_factory: + match strategy: + case TokenizerType.LiteLLM: + from graphrag_llm.tokenizer.lite_llm_tokenizer import ( + LiteLLMTokenizer, + ) + + register_tokenizer( + TokenizerType.LiteLLM, + LiteLLMTokenizer, + scope="singleton", + ) + case TokenizerType.Tiktoken: + from graphrag_llm.tokenizer.tiktoken_tokenizer import ( + TiktokenTokenizer, + ) + + register_tokenizer( + TokenizerType.Tiktoken, + TiktokenTokenizer, + scope="singleton", + ) + case _: + msg = f"TokenizerConfig.type '{strategy}' is not registered in the TokenizerFactory. Registered strategies: {', '.join(tokenizer_factory.keys())}" + raise ValueError(msg) + + return tokenizer_factory.create( + strategy=strategy, + init_args=init_args, + ) diff --git a/packages/graphrag-llm/graphrag_llm/types/__init__.py b/packages/graphrag-llm/graphrag_llm/types/__init__.py new file mode 100644 index 0000000000..6453ff6163 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/types/__init__.py @@ -0,0 +1,58 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Types module for graphrag-llm.""" + +from graphrag_llm.types.types import ( + AsyncLLMCompletionFunction, + AsyncLLMEmbeddingFunction, + AsyncLLMFunction, + LLMChoice, + LLMChoiceChunk, + LLMChoiceDelta, + LLMCompletionArgs, + LLMCompletionChunk, + LLMCompletionFunction, + LLMCompletionFunctionToolParam, + LLMCompletionMessage, + LLMCompletionMessagesParam, + LLMCompletionResponse, + LLMCompletionTokensDetails, + LLMCompletionUsage, + LLMEmbedding, + LLMEmbeddingArgs, + LLMEmbeddingFunction, + LLMEmbeddingResponse, + LLMEmbeddingUsage, + LLMFunction, + LLMPromptTokensDetails, + Metrics, + ResponseFormat, +) + +__all__ = [ + "AsyncLLMCompletionFunction", + "AsyncLLMEmbeddingFunction", + "AsyncLLMFunction", + "LLMChoice", + "LLMChoiceChunk", + "LLMChoiceDelta", + "LLMCompletionArgs", + "LLMCompletionChunk", + "LLMCompletionFunction", + "LLMCompletionFunctionToolParam", + "LLMCompletionMessage", + "LLMCompletionMessagesParam", + "LLMCompletionResponse", + "LLMCompletionTokensDetails", + "LLMCompletionUsage", + "LLMEmbedding", + "LLMEmbeddingArgs", + "LLMEmbeddingFunction", + "LLMEmbeddingResponse", + "LLMEmbeddingUsage", + "LLMFunction", + "LLMPromptTokensDetails", + "Metrics", + "ResponseFormat", +] diff --git a/packages/graphrag-llm/graphrag_llm/types/types.py b/packages/graphrag-llm/graphrag_llm/types/types.py new file mode 100644 index 0000000000..0980cba3aa --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/types/types.py @@ -0,0 +1,265 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Types for graphrag-llm.""" + +from collections.abc import AsyncIterator, Awaitable, Iterator, Sequence +from typing import ( + Any, + Generic, + Literal, + Protocol, + Required, + TypeVar, + Unpack, + runtime_checkable, +) + +from litellm import ( + AnthropicThinkingParam, + ChatCompletionAudioParam, + ChatCompletionModality, + ChatCompletionPredictionContentParam, + OpenAIWebSearchOptions, +) +from openai.types.chat.chat_completion import ( + ChatCompletion, + Choice, +) +from openai.types.chat.chat_completion_chunk import ChatCompletionChunk, ChoiceDelta +from openai.types.chat.chat_completion_chunk import Choice as ChunkChoice +from openai.types.chat.chat_completion_function_tool_param import ( + ChatCompletionFunctionToolParam, +) +from openai.types.chat.chat_completion_message import ChatCompletionMessage +from openai.types.chat.chat_completion_message_param import ChatCompletionMessageParam +from openai.types.completion_usage import ( + CompletionTokensDetails, + CompletionUsage, + PromptTokensDetails, +) +from openai.types.create_embedding_response import CreateEmbeddingResponse, Usage +from openai.types.embedding import Embedding +from pydantic import BaseModel, computed_field +from typing_extensions import TypedDict + +LLMCompletionMessagesParam = str | Sequence[ChatCompletionMessageParam | dict[str, Any]] + +LLMChoice = Choice +LLMCompletionMessage = ChatCompletionMessage + +LLMCompletionChunk = ChatCompletionChunk +LLMChoiceChunk = ChunkChoice +LLMChoiceDelta = ChoiceDelta + +LLMCompletionUsage = CompletionUsage +LLMPromptTokensDetails = PromptTokensDetails +LLMCompletionTokensDetails = CompletionTokensDetails + + +LLMEmbedding = Embedding +LLMEmbeddingUsage = Usage + +LLMCompletionFunctionToolParam = ChatCompletionFunctionToolParam + + +Metrics = dict[str, float] +"""Represents single request metrics and aggregated metrics for an entire model. + +example: { + "duration_ms": 123.45, + "successful_requests": 1, +} + +On the individual request level, successful_requests will be either 0 or 1. +On the aggregated model level, successful_requests will be the sum of all +successful requests. +""" + +ResponseFormat = TypeVar( + "ResponseFormat", + bound=BaseModel, +) +"""Generic type variable for structured response format.""" + + +class LLMCompletionResponse(ChatCompletion, Generic[ResponseFormat]): + """LLM Completion Response extending OpenAI ChatCompletion. + + The response type returned by graphrag-llm LLMCompletionFunction. + graphrag-llm automatically handles structured response parsing based on the + provided ResponseFormat model. + """ + + formatted_response: ResponseFormat | None = None # type: ignore + """Formatted response according to the specified response_format json schema.""" + + @computed_field + @property + def content(self) -> str: + """Get the content of the first choice message.""" + return self.choices[0].message.content or "" + + +class LLMCompletionArgs( + TypedDict, Generic[ResponseFormat], total=False, extra_items=Any +): + """Arguments for LLMCompletionFunction. + + Same signature as litellm.completion but without the `model` parameter + as this is already set in the model configuration. + """ + + messages: Required[LLMCompletionMessagesParam] + response_format: type[ResponseFormat] | None + timeout: float | None + temperature: float | None + top_p: float | None + n: int | None + stream: bool | None + stream_options: dict | None + stop: None + max_completion_tokens: int | None + max_tokens: int | None + modalities: list[ChatCompletionModality] | None + prediction: ChatCompletionPredictionContentParam | None + audio: ChatCompletionAudioParam | None + presence_penalty: float | None + frequency_penalty: float | None + logit_bias: dict | None + user: str | None + reasoning_effort: ( + Literal["none", "minimal", "low", "medium", "high", "default"] | None + ) + seed: int | None + tools: list | None + tool_choice: str | dict | None + logprobs: bool | None + top_logprobs: int | None + parallel_tool_calls: bool | None + web_search_options: OpenAIWebSearchOptions | None + deployment_id: Any + extra_headers: dict | None + safety_identifier: str | None + functions: list | None + function_call: str | None + thinking: AnthropicThinkingParam | None + + +@runtime_checkable +class LLMCompletionFunction(Protocol): + """Synchronous completion function. + + Same signature as litellm.completion but without the `model` parameter + as this is already set in the model configuration. + """ + + def __call__( + self, /, **kwargs: Unpack[LLMCompletionArgs[ResponseFormat]] + ) -> LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk]: + """Completion function.""" + ... + + +@runtime_checkable +class AsyncLLMCompletionFunction(Protocol): + """Asynchronous completion function. + + Same signature as litellm.completion but without the `model` parameter + as this is already set in the model configuration. + """ + + def __call__( + self, /, **kwargs: Unpack[LLMCompletionArgs[ResponseFormat]] + ) -> Awaitable[ + LLMCompletionResponse[ResponseFormat] | AsyncIterator[LLMCompletionChunk] + ]: + """Completion function.""" + ... + + +class LLMEmbeddingResponse(CreateEmbeddingResponse): + """LLM Embedding Response extending OpenAI CreateEmbeddingResponse. + + The response type returned by graphrag-llm LLMEmbeddingFunction. + Adds utilities for accessing embeddings. + """ + + @computed_field + @property + def embeddings(self) -> list[list[float]]: + """Get the embeddings as a list of lists of floats.""" + return [data.embedding for data in self.data] + + @computed_field + @property + def first_embedding(self) -> list[float]: + """Get the first embedding.""" + return self.embeddings[0] if self.embeddings else [] + + +class LLMEmbeddingArgs(TypedDict, total=False, extra_items=Any): + """Arguments for embedding functions. + + Same signature as litellm.embedding but without the `model` parameter + as this is already set in the model configuration. + """ + + input: Required[list[str]] + dimensions: int | None + encoding_format: str | None + timeout: int + user: str | None + + +@runtime_checkable +class LLMEmbeddingFunction(Protocol): + """Synchronous embedding function. + + Same signature as litellm.embedding but without the `model` parameter + as this is already set in the model configuration. + """ + + def __call__( + self, + /, + **kwargs: Unpack[LLMEmbeddingArgs], + ) -> LLMEmbeddingResponse: + """Embedding function.""" + ... + + +@runtime_checkable +class AsyncLLMEmbeddingFunction(Protocol): + """Asynchronous embedding function. + + Same signature as litellm.aembedding but without the `model` parameter + as this is already set in the model configuration. + """ + + async def __call__( + self, + /, + **kwargs: Unpack[LLMEmbeddingArgs], + ) -> LLMEmbeddingResponse: + """Embedding function.""" + ... + + +LLMFunction = TypeVar("LLMFunction", LLMCompletionFunction, LLMEmbeddingFunction) +"""Generic representation of completion and embedding functions. + +This type is used in the middleware pipeline as the pipeline can handle both +completion and embedding functions. That way services such as retries, caching, +and rate limiting can be reused for both completions and embeddings. +""" + +AsyncLLMFunction = TypeVar( + "AsyncLLMFunction", AsyncLLMCompletionFunction, AsyncLLMEmbeddingFunction +) +"""Generic representation of asynchronous completion and embedding functions. + +This type is used in the middleware pipeline as the pipeline can handle both +completion and embedding functions. That way services such as retries, caching, +and rate limiting can be reused for both completions and embeddings. +""" diff --git a/packages/graphrag-llm/graphrag_llm/utils/__init__.py b/packages/graphrag-llm/graphrag_llm/utils/__init__.py new file mode 100644 index 0000000000..8ae722bfbc --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/utils/__init__.py @@ -0,0 +1,40 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Utils module.""" + +from graphrag_llm.utils.completion_messages_builder import ( + CompletionContentPartBuilder, + CompletionMessagesBuilder, +) +from graphrag_llm.utils.create_completion_response import ( + create_completion_response, +) +from graphrag_llm.utils.create_embedding_response import create_embedding_response +from graphrag_llm.utils.function_tool_manager import ( + FunctionArgumentModel, + FunctionDefinition, + FunctionToolManager, + ToolMessage, +) +from graphrag_llm.utils.gather_completion_response import ( + gather_completion_response, + gather_completion_response_async, +) +from graphrag_llm.utils.structure_response import ( + structure_completion_response, +) + +__all__ = [ + "CompletionContentPartBuilder", + "CompletionMessagesBuilder", + "FunctionArgumentModel", + "FunctionDefinition", + "FunctionToolManager", + "ToolMessage", + "create_completion_response", + "create_embedding_response", + "gather_completion_response", + "gather_completion_response_async", + "structure_completion_response", +] diff --git a/packages/graphrag-llm/graphrag_llm/utils/completion_messages_builder.py b/packages/graphrag-llm/graphrag_llm/utils/completion_messages_builder.py new file mode 100644 index 0000000000..f61e60e6c4 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/utils/completion_messages_builder.py @@ -0,0 +1,328 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""ChatCompletionMessageParamBuilder class.""" + +from collections.abc import Iterable +from typing import TYPE_CHECKING, Literal + +from openai.types.chat.chat_completion_assistant_message_param import ( + ChatCompletionAssistantMessageParam, +) +from openai.types.chat.chat_completion_content_part_image_param import ( + ChatCompletionContentPartImageParam, + ImageURL, +) +from openai.types.chat.chat_completion_content_part_input_audio_param import ( + ChatCompletionContentPartInputAudioParam, + InputAudio, +) +from openai.types.chat.chat_completion_content_part_param import ( + ChatCompletionContentPartParam, +) +from openai.types.chat.chat_completion_content_part_text_param import ( + ChatCompletionContentPartTextParam, +) +from openai.types.chat.chat_completion_developer_message_param import ( + ChatCompletionDeveloperMessageParam, +) +from openai.types.chat.chat_completion_function_message_param import ( + ChatCompletionFunctionMessageParam, +) +from openai.types.chat.chat_completion_message import ChatCompletionMessage +from openai.types.chat.chat_completion_system_message_param import ( + ChatCompletionSystemMessageParam, +) +from openai.types.chat.chat_completion_tool_message_param import ( + ChatCompletionToolMessageParam, +) +from openai.types.chat.chat_completion_user_message_param import ( + ChatCompletionUserMessageParam, +) + +if TYPE_CHECKING: + from openai.types.chat.chat_completion_message_param import ( + ChatCompletionMessageParam, + ) + + from graphrag_llm.types import LLMCompletionMessagesParam + + +class CompletionMessagesBuilder: + """CompletionMessagesBuilder class.""" + + def __init__(self) -> None: + """Initialize CompletionMessagesBuilder.""" + self._messages: list[ChatCompletionMessageParam] = [] + + def add_system_message( + self, + content: str | Iterable[ChatCompletionContentPartTextParam], + name: str | None = None, + ) -> "CompletionMessagesBuilder": + """Add system message. + + Parameters + ---------- + content : str | Iterable[ChatCompletionContentPartTextParam] + Content of the system message. + If passing in Iterable[ChatCompletionContentPartTextParam], may use + `CompletionContentPartBuilder` to build the content. + name : str | None + Optional name for the participant. + + Returns + ------- + None + """ + if name: + self._messages.append( + ChatCompletionSystemMessageParam( + role="system", content=content, name=name + ) + ) + else: + self._messages.append( + ChatCompletionSystemMessageParam(role="system", content=content) + ) + return self + + def add_developer_message( + self, + content: str | Iterable[ChatCompletionContentPartTextParam], + name: str | None = None, + ) -> "CompletionMessagesBuilder": + """Add developer message. + + Parameters + ---------- + content : str | Iterable[ChatCompletionContentPartTextParam] + Content of the developer message. + If passing in Iterable[ChatCompletionContentPartTextParam], may use + `CompletionContentPartBuilder` to build the content. + name : str | None + Optional name for the participant. + + Returns + ------- + None + """ + if name: + self._messages.append( + ChatCompletionDeveloperMessageParam( + role="developer", content=content, name=name + ) + ) + else: + self._messages.append( + ChatCompletionDeveloperMessageParam(role="developer", content=content) + ) + + return self + + def add_tool_message( + self, + content: str | Iterable[ChatCompletionContentPartTextParam], + tool_call_id: str, + ) -> "CompletionMessagesBuilder": + """Add developer message. + + Parameters + ---------- + content : str | Iterable[ChatCompletionContentPartTextParam] + Content of the developer message. + If passing in Iterable[ChatCompletionContentPartTextParam], may use + `CompletionContentPartBuilder` to build the content. + tool_call_id : str + ID of the tool call that this message is responding to. + + Returns + ------- + None + """ + self._messages.append( + ChatCompletionToolMessageParam( + role="tool", content=content, tool_call_id=tool_call_id + ) + ) + + return self + + def add_function_message( + self, + function_name: str, + content: str | None = None, + ) -> "CompletionMessagesBuilder": + """Add function message. + + Parameters + ---------- + function_name : str + Name of the function to call. + content : str | None + Content of the function message. + + Returns + ------- + None + """ + self._messages.append( + ChatCompletionFunctionMessageParam( + role="function", content=content, name=function_name + ) + ) + + return self + + def add_user_message( + self, + content: str | Iterable[ChatCompletionContentPartParam], + name: str | None = None, + ) -> "CompletionMessagesBuilder": + """Add user message. + + Parameters + ---------- + content : str | Iterable[ChatCompletionContentPartParam] + Content of the user message. + If passing in Iterable[ChatCompletionContentPartParam], may use + `CompletionContentPartBuilder` to build the content. + name : str | None + Optional name for the participant. + + Returns + ------- + None + """ + if name: + self._messages.append( + ChatCompletionUserMessageParam(role="user", content=content, name=name) + ) + else: + self._messages.append( + ChatCompletionUserMessageParam(role="user", content=content) + ) + + return self + + def add_assistant_message( + self, + message: str | ChatCompletionMessage, + name: str | None = None, + ) -> "CompletionMessagesBuilder": + """Add assistant message. + + Parameters + ---------- + message : ChatCompletionMessage + Previous response message. + name : str | None + Optional name for the participant. + + Returns + ------- + None + """ + args = { + "role": "assistant", + "content": message if isinstance(message, str) else message.content, + "refusal": None if isinstance(message, str) else message.refusal, + } + if name: + args["name"] = name + if not isinstance(message, str): + if message.function_call: + args["function_call"] = message.function_call + if message.tool_calls: + args["tool_calls"] = message.tool_calls + if message.audio: + args["audio"] = message.audio + + self._messages.append(ChatCompletionAssistantMessageParam(**args)) + + return self + + def build(self) -> "LLMCompletionMessagesParam": + """Get messages.""" + return self._messages + + +class CompletionContentPartBuilder: + """CompletionContentPartBuilder class.""" + + def __init__(self) -> None: + """Initialize CompletionContentPartBuilder.""" + self._content_parts: list[ChatCompletionContentPartParam] = [] + + def add_text_part(self, text: str) -> "CompletionContentPartBuilder": + """Add text part. + + Parameters + ---------- + text : str + Text content. + + Returns + ------- + None + """ + self._content_parts.append( + ChatCompletionContentPartTextParam(text=text, type="text") + ) + return self + + def add_image_part( + self, url: str, detail: Literal["auto", "low", "high"] + ) -> "CompletionContentPartBuilder": + """Add image part. + + Parameters + ---------- + url : str + Either an URL of the image or the base64 encoded image data. + detail : Literal["auto", "low", "high"] + Specifies the detail level of the image. + + Returns + ------- + None + """ + self._content_parts.append( + ChatCompletionContentPartImageParam( + image_url=ImageURL(url=url, detail=detail), type="image_url" + ) + ) + return self + + def add_audio_part( + self, data: str, _format: Literal["wav", "mp3"] + ) -> "CompletionContentPartBuilder": + """Add audio part. + + Parameters + ---------- + data : str + Base64 encoded audio data. + _format : Literal["wav", "mp3"] + The format of the encoded audio data. Currently supports "wav" and "mp3". + + Returns + ------- + None + """ + self._content_parts.append( + ChatCompletionContentPartInputAudioParam( + input_audio=InputAudio(data=data, format=_format), type="input_audio" + ) + ) + return self + + def build(self) -> list[ChatCompletionContentPartParam]: + """Get content parts. + + Returns + ------- + list[ChatCompletionContentPartParam] + List of content parts. + """ + return self._content_parts diff --git a/packages/graphrag-llm/graphrag_llm/utils/create_completion_response.py b/packages/graphrag-llm/graphrag_llm/utils/create_completion_response.py new file mode 100644 index 0000000000..7f7ffd9091 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/utils/create_completion_response.py @@ -0,0 +1,45 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Create completion response.""" + +from graphrag_llm.types import ( + LLMChoice, + LLMCompletionMessage, + LLMCompletionResponse, + LLMCompletionUsage, +) + + +def create_completion_response(response: str) -> LLMCompletionResponse: + """Create a completion response object. + + Args: + response: The completion response string. + + Returns + ------- + LLMCompletionResponse: The completion response object. + """ + return LLMCompletionResponse( + id="completion-id", + object="chat.completion", + created=0, + model="mock-model", + choices=[ + LLMChoice( + index=0, + message=LLMCompletionMessage( + role="assistant", + content=response, + ), + finish_reason="stop", + ) + ], + usage=LLMCompletionUsage( + prompt_tokens=0, + completion_tokens=0, + total_tokens=0, + ), + formatted_response=None, + ) diff --git a/packages/graphrag-llm/graphrag_llm/utils/create_embedding_response.py b/packages/graphrag-llm/graphrag_llm/utils/create_embedding_response.py new file mode 100644 index 0000000000..b651a32816 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/utils/create_embedding_response.py @@ -0,0 +1,39 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Create embedding response utilities.""" + +from graphrag_llm.types import LLMEmbedding, LLMEmbeddingResponse, LLMEmbeddingUsage + + +def create_embedding_response( + embeddings: list[float], batch_size: int = 1 +) -> LLMEmbeddingResponse: + """Create a CreateEmbeddingResponse object. + + Args: + embeddings: List of embedding vectors. + model: The model used to create the embeddings. + + Returns + ------- + An LLMEmbeddingResponse object. + """ + embeddings_objects = [ + LLMEmbedding( + object="embedding", + embedding=embeddings, + index=index, + ) + for index in range(batch_size) + ] + + return LLMEmbeddingResponse( + object="list", + data=embeddings_objects, + model="mock-model", + usage=LLMEmbeddingUsage( + prompt_tokens=0, + total_tokens=0, + ), + ) diff --git a/packages/graphrag-llm/graphrag_llm/utils/function_tool_manager.py b/packages/graphrag-llm/graphrag_llm/utils/function_tool_manager.py new file mode 100644 index 0000000000..029008c6b0 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/utils/function_tool_manager.py @@ -0,0 +1,138 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Function tool manager.""" + +import json +from collections.abc import Callable +from typing import TYPE_CHECKING, Any, Generic, TypeVar + +from openai import pydantic_function_tool +from pydantic import BaseModel +from typing_extensions import TypedDict + +if TYPE_CHECKING: + from graphrag_llm.types import LLMCompletionFunctionToolParam, LLMCompletionResponse + +FunctionArgumentModel = TypeVar( + "FunctionArgumentModel", bound=BaseModel, covariant=True +) + + +class FunctionDefinition(TypedDict, Generic[FunctionArgumentModel]): + """Function definition.""" + + name: str + description: str + input_model: type[FunctionArgumentModel] + function: Callable[[FunctionArgumentModel], str] + + +class ToolMessage(TypedDict): + """Function tool response message to be added to message history.""" + + content: str + tool_call_id: str + + +class FunctionToolManager: + """Function tool manager.""" + + _tools: dict[str, FunctionDefinition[Any]] + + def __init__(self) -> None: + """Initialize FunctionToolManager.""" + self._tools = {} + + def register_function_tool( + self, + *, + name: str, + description: str, + input_model: type[FunctionArgumentModel], + function: Callable[[FunctionArgumentModel], str], + ) -> None: + """Register function tool. + + Args + ---- + name: str + The name of the function tool. + description: str + The description of the function tool. + input_model: type[T] + The pydantic model type for the function tool input. + function: Callable[[T], str] + The function to call for the function tool. + """ + self._tools[name] = { + "name": name, + "description": description, + "input_model": input_model, + "function": function, + } + + def definitions(self) -> list["LLMCompletionFunctionToolParam"]: + """Get function tool definitions. + + Returns + ------- + list[LLMCompletionFunctionToolParam] + List of function tool definitions. + """ + return [ + pydantic_function_tool( + tool_def["input_model"], + name=tool_def["name"], + description=tool_def["description"], + ) + for tool_def in self._tools.values() + ] + + def call_functions(self, response: "LLMCompletionResponse") -> list[ToolMessage]: + """Call functions based on the response. + + Args + ---- + response: LLMCompletionResponse + The LLM completion response. + + Returns + ------- + list[ToolMessage] + The list of tool response messages to be added to the message history. + """ + if not response.choices[0].message.tool_calls: + return [] + + tool_messages: list[ToolMessage] = [] + + for tool_call in response.choices[0].message.tool_calls: + if tool_call.type != "function": + continue + tool_id = tool_call.id + function_name = tool_call.function.name + function_args = tool_call.function.arguments + + if function_name not in self._tools: + msg = f"Function '{function_name}' not registered." + raise ValueError(msg) + + tool_def = self._tools[function_name] + input_model = tool_def["input_model"] + function = tool_def["function"] + + try: + parsed_args_dict = json.loads(function_args) + input_model_instance = input_model(**parsed_args_dict) + except Exception as e: + msg = f"Failed to parse arguments for function '{function_name}': {e}" + raise ValueError(msg) from e + + result = function(input_model_instance) + tool_messages.append({ + "content": result, + "tool_call_id": tool_id, + }) + + return tool_messages diff --git a/packages/graphrag-llm/graphrag_llm/utils/gather_completion_response.py b/packages/graphrag-llm/graphrag_llm/utils/gather_completion_response.py new file mode 100644 index 0000000000..0722e95efd --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/utils/gather_completion_response.py @@ -0,0 +1,57 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Gather Completion Response Utility.""" + +from collections.abc import AsyncIterator, Iterator +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from graphrag_llm.types import ( + LLMCompletionChunk, + LLMCompletionResponse, + ) + + +def gather_completion_response( + response: "LLMCompletionResponse | Iterator[LLMCompletionChunk]", +) -> str: + """Gather completion response from an iterator of response chunks. + + Args + ---- + response: LMChatCompletion | Iterator[LLMChatCompletionChunk] + The completion response or an iterator of response chunks. + + Returns + ------- + The gathered response as a single string. + """ + if isinstance(response, Iterator): + return "".join(chunk.choices[0].delta.content or "" for chunk in response) + + return response.choices[0].message.content or "" + + +async def gather_completion_response_async( + response: "LLMCompletionResponse | AsyncIterator[LLMCompletionChunk]", +) -> str: + """Gather completion response from an iterator of response chunks. + + Args + ---- + response: LMChatCompletion | AsyncIterator[LLMChatCompletionChunk] + The completion response or an iterator of response chunks. + + Returns + ------- + The gathered response as a single string. + """ + if isinstance(response, AsyncIterator): + gathered_content = "" + async for chunk in response: + gathered_content += chunk.choices[0].delta.content or "" + + return gathered_content + + return response.choices[0].message.content or "" diff --git a/packages/graphrag-llm/graphrag_llm/utils/structure_response.py b/packages/graphrag-llm/graphrag_llm/utils/structure_response.py new file mode 100644 index 0000000000..dfc261bc87 --- /dev/null +++ b/packages/graphrag-llm/graphrag_llm/utils/structure_response.py @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Structure response as pydantic base model.""" + +import json +from typing import Any, TypeVar + +from pydantic import BaseModel + +T = TypeVar("T", bound=BaseModel, covariant=True) + + +def structure_completion_response(response: str, model: type[T]) -> T: + """Structure completion response as pydantic base model. + + Args + ---- + response: str + The completion response as a JSON string. + model: type[T] + The pydantic base model type to structure the response into. + + Returns + ------- + The structured response as a pydantic base model. + """ + parsed_dict: dict[str, Any] = json.loads(response) + return model(**parsed_dict) diff --git a/packages/graphrag-llm/notebooks/01_basic.ipynb b/packages/graphrag-llm/notebooks/01_basic.ipynb new file mode 100644 index 0000000000..d015231e35 --- /dev/null +++ b/packages/graphrag-llm/notebooks/01_basic.ipynb @@ -0,0 +1,415 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6e35563a", + "metadata": {}, + "source": [ + "# Basic Completion and Embedding Examples\n", + "\n", + "## Completion\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "aa03e40d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The capital of France is Paris.\n", + "The capital of France is Paris.\n", + "Full Response:\n", + "{\n", + " \"id\": \"chatcmpl-CyPuxOjKPmvuCvJwTJiLRH1lwO77J\",\n", + " \"choices\": [\n", + " {\n", + " \"finish_reason\": \"stop\",\n", + " \"index\": 0,\n", + " \"logprobs\": null,\n", + " \"message\": {\n", + " \"content\": \"The capital of France is Paris.\",\n", + " \"refusal\": null,\n", + " \"role\": \"assistant\",\n", + " \"annotations\": [],\n", + " \"audio\": null,\n", + " \"function_call\": null,\n", + " \"tool_calls\": null\n", + " },\n", + " \"provider_specific_fields\": {}\n", + " }\n", + " ],\n", + " \"created\": 1768515343,\n", + " \"model\": \"gpt-4o-2024-05-13\",\n", + " \"object\": \"chat.completion\",\n", + " \"service_tier\": null,\n", + " \"system_fingerprint\": \"fp_3eed281ddb\",\n", + " \"usage\": {\n", + " \"completion_tokens\": 8,\n", + " \"prompt_tokens\": 14,\n", + " \"total_tokens\": 22,\n", + " \"completion_tokens_details\": {\n", + " \"accepted_prediction_tokens\": 0,\n", + " \"audio_tokens\": 0,\n", + " \"reasoning_tokens\": 0,\n", + " \"rejected_prediction_tokens\": 0,\n", + " \"text_tokens\": null\n", + " },\n", + " \"prompt_tokens_details\": {\n", + " \"audio_tokens\": 0,\n", + " \"cached_tokens\": 0,\n", + " \"text_tokens\": null,\n", + " \"image_tokens\": null\n", + " }\n", + " },\n", + " \"formatted_response\": null,\n", + " \"content\": \"The capital of France is Paris.\"\n", + "}\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import os\n", + "from collections.abc import AsyncIterator, Iterator\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "from graphrag_llm.types import LLMCompletionChunk, LLMCompletionResponse\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "response: LLMCompletionResponse | Iterator[LLMCompletionChunk] = (\n", + " llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + " )\n", + ")\n", + "\n", + "if isinstance(response, Iterator):\n", + " # Streaming response\n", + " for chunk in response:\n", + " print(chunk.choices[0].delta.content or \"\", end=\"\", flush=True)\n", + "else:\n", + " # Non-streaming response\n", + " print(response.choices[0].message.content)\n", + " # Or alternatively, access via the content property\n", + " # This is equivalent to the above line, getting the content of the first choice\n", + " print(response.content)\n", + "\n", + "print(\"Full Response:\")\n", + "print(response.model_dump_json(indent=2)) # type: ignore" + ] + }, + { + "cell_type": "markdown", + "id": "558392ce", + "metadata": {}, + "source": [ + "## Async Completion\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "8405fcb7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The capital of France is Paris.\n" + ] + } + ], + "source": [ + "response: LLMCompletionResponse = await llm_completion.completion_async(\n", + " messages=\"What is the capital of France?\",\n", + ") # type: ignore\n", + "print(response.content)" + ] + }, + { + "cell_type": "markdown", + "id": "e70fc49a", + "metadata": {}, + "source": [ + "## Streaming Completion\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "9f60c4e7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The capital of France is Paris." + ] + } + ], + "source": [ + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + " stream=True,\n", + ")\n", + "\n", + "if isinstance(response, Iterator):\n", + " # Streaming response\n", + " for chunk in response:\n", + " print(chunk.choices[0].delta.content or \"\", end=\"\", flush=True)" + ] + }, + { + "cell_type": "markdown", + "id": "fe8c2e35", + "metadata": {}, + "source": [ + "## Async Streaming Completion\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "0be849ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The capital of France is Paris." + ] + } + ], + "source": [ + "response = await llm_completion.completion_async(\n", + " messages=\"What is the capital of France?\",\n", + " stream=True,\n", + ")\n", + "\n", + "if isinstance(response, AsyncIterator):\n", + " # Streaming response\n", + " async for chunk in response:\n", + " print(chunk.choices[0].delta.content or \"\", end=\"\", flush=True)" + ] + }, + { + "cell_type": "markdown", + "id": "c32070ad", + "metadata": {}, + "source": [ + "## Completion Arguments\n", + "\n", + "The completion API adheres to litellm completion API and thus the OpanAI SDK API. The `messages` parameter can be one of the following:\n", + "\n", + "- `str`: Raw string for the prompt.\n", + "- `list[dict[str, Any]]`: A list of dicts in the form `{\"role\": \"user|system|...\", \"content\": \"...\"}`\n", + "- `list[ChatCompletionMessageParam]`: A list of OpenAI `ChatCompletionMessageParam`. `graphrag_llm.utils` provides a `ChatCompletionMessageParamBuilder` to help construct these objects. See the message builder notebook for more details on using `ChatCompletionMessageParamBuilder`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "8fe480cb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The capital of France is Paris.\n", + "The capital of France is Paris.\n", + "Arrr, ye got me there, matey! Truth be, back in 2006, them fancy scallywags at the International Astronomical Union be sayin' Pluto ain't a full-fledged planet no more. They be callin' it a \"dwarf planet\" now. So, officially, she be a dwarf planet, savvy?\n" + ] + } + ], + "source": [ + "from graphrag_llm.utils import (\n", + " CompletionMessagesBuilder,\n", + ")\n", + "\n", + "# raw string input\n", + "response1: LLMCompletionResponse = llm_completion.completion(\n", + " messages=\"What is the capital of France?\"\n", + ") # type: ignore\n", + "print(response1.content)\n", + "\n", + "# list of message dicts input\n", + "response2: LLMCompletionResponse = llm_completion.completion(\n", + " messages=[{\"role\": \"user\", \"content\": \"What is the capital of France?\"}]\n", + ") # type: ignore\n", + "print(response2.content)\n", + "\n", + "# using the builder to create complex message\n", + "messages = (\n", + " CompletionMessagesBuilder()\n", + " .add_system_message(\n", + " \"You are a helpful assistant that likes to talk like a pirate. Respond as if you are a pirate using pirate speak.\"\n", + " )\n", + " .add_user_message(\"Is pluto a planet? Respond with a yes or no.\")\n", + " .add_assistant_message(\"Aye, matey! Pluto be a planet in me book.\")\n", + " .add_user_message(\"Are you sure? I want the truth. Can you elaborate?\")\n", + " .build()\n", + ")\n", + "\n", + "response3: LLMCompletionResponse = llm_completion.completion(messages=messages) # type: ignore\n", + "print(response3.content)" + ] + }, + { + "cell_type": "markdown", + "id": "dda66594", + "metadata": {}, + "source": [ + "## Embedding\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "51fe336b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-0.002078542485833168, -0.04908587411046028, 0.020946789532899857]\n", + "[0.027567066252231598, -0.026544300839304924, -0.027091361582279205]\n" + ] + } + ], + "source": [ + "from graphrag_llm.embedding import LLMEmbedding, create_embedding\n", + "from graphrag_llm.types import LLMEmbeddingResponse\n", + "\n", + "embedding_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_EMBEDDING_MODEL\", \"text-embedding-3-small\"),\n", + " azure_deployment_name=os.getenv(\n", + " \"GRAPHRAG_LLM_EMBEDDING_MODEL\", \"text-embedding-3-small\"\n", + " ),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "\n", + "llm_embedding: LLMEmbedding = create_embedding(embedding_config)\n", + "\n", + "embeddings_batch: LLMEmbeddingResponse = llm_embedding.embedding(\n", + " input=[\"Hello world\", \"How are you?\"]\n", + ")\n", + "for embedding in embeddings_batch.embeddings:\n", + " print(embedding[0:3])" + ] + }, + { + "cell_type": "markdown", + "id": "e3b7bedf", + "metadata": {}, + "source": [ + "### First Embedding\n", + "\n", + "`.embedding` batches by default, it takes a list of strings to embed. If embedding a single string then you can use `.first_embedding` on the response to obtain the first embedding.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e428c64a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0.05073608458042145, 0.003799507161602378, 0.019212841987609863]\n" + ] + } + ], + "source": [ + "embedding_response = llm_embedding.embedding(\n", + " input=[\"This is a single input string for embedding.\"]\n", + ")\n", + "\n", + "print(embedding_response.first_embedding[0:3])" + ] + }, + { + "cell_type": "markdown", + "id": "6b4cf0fa", + "metadata": {}, + "source": [ + "## Async Embedding\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c9519657", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[-0.002078542485833168, -0.04908587411046028, 0.020946789532899857]\n", + "[0.027567066252231598, -0.026544300839304924, -0.027091361582279205]\n" + ] + } + ], + "source": [ + "embeddings_batch = await llm_embedding.embedding_async(\n", + " input=[\"Hello world\", \"How are you?\"]\n", + ")\n", + "\n", + "for embedding in embeddings_batch.embeddings:\n", + " print(embedding[0:3])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/02_encoding_decoding.ipynb b/packages/graphrag-llm/notebooks/02_encoding_decoding.ipynb new file mode 100644 index 0000000000..3a43503fdd --- /dev/null +++ b/packages/graphrag-llm/notebooks/02_encoding_decoding.ipynb @@ -0,0 +1,169 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "578551ee", + "metadata": {}, + "source": [ + "# Encoding/Decoding\n", + "\n", + "`LLMCompletion` and `LLMEmbedding` expose a `Tokenizer` property corresponding to the underlying model.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "986a0bad", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Encoded tokens: [9906, 11, 1917, 0]\n", + "Number of tokens: 4\n", + "Number of tokens: 4\n", + "Decoded text: Hello, world!\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "encoded = llm_completion.tokenizer.encode(\"Hello, world!\")\n", + "print(f\"Encoded tokens: {encoded}\")\n", + "print(f\"Number of tokens: {len(encoded)}\")\n", + "# OR\n", + "print(f\"Number of tokens: {llm_completion.tokenizer.num_tokens('Hello, world!')}\")\n", + "decoded = llm_completion.tokenizer.decode(encoded)\n", + "print(f\"Decoded text: {decoded}\")" + ] + }, + { + "cell_type": "markdown", + "id": "4e4a7515", + "metadata": {}, + "source": [ + "## Standalone Tokenizer\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5920cf74", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Encoded tokens: [9906, 11, 1917, 0]\n", + "Number of tokens: 4\n", + "Decoded text: Hello, world!\n" + ] + } + ], + "source": [ + "from graphrag_llm.config import TokenizerConfig, TokenizerType\n", + "from graphrag_llm.tokenizer import create_tokenizer\n", + "\n", + "tokenizer = create_tokenizer(\n", + " TokenizerConfig(\n", + " type=TokenizerType.LiteLLM,\n", + " model_id=\"openai/text-embedding-3-small\",\n", + " )\n", + ")\n", + "\n", + "encoded = tokenizer.encode(\"Hello, world!\")\n", + "print(f\"Encoded tokens: {encoded}\")\n", + "print(f\"Number of tokens: {len(encoded)}\")\n", + "decoded = tokenizer.decode(encoded)\n", + "print(f\"Decoded text: {decoded}\")" + ] + }, + { + "cell_type": "markdown", + "id": "115f63b9", + "metadata": {}, + "source": [ + "## Tiktoken\n", + "\n", + "By default, `LLMCompletion` and `LLMEmbedding` use a litellm based tokenizer that supports the 100+ models that litellm supports but you may use a tiktoken based tokenizer by specifying a tokenizer type of `TokenizerType.Tiktoken` and providing an `encoding_name` to the config.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "abeb9753", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Encoded tokens: [13225, 11, 2375, 0]\n", + "Encoded tokens: [13225, 11, 2375, 0]\n" + ] + } + ], + "source": [ + "tokenizer = create_tokenizer(\n", + " TokenizerConfig(\n", + " type=TokenizerType.Tiktoken,\n", + " encoding_name=\"o200k_base\",\n", + " )\n", + ")\n", + "encoded = tokenizer.encode(\"Hello, world!\")\n", + "print(f\"Encoded tokens: {encoded}\")\n", + "\n", + "# Using with LLMCompletion\n", + "llm_completion: LLMCompletion = create_completion(model_config, tokenizer=tokenizer)\n", + "\n", + "encoded = llm_completion.tokenizer.encode(\"Hello, world!\")\n", + "print(f\"Encoded tokens: {encoded}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/03_structured_responses.ipynb b/packages/graphrag-llm/notebooks/03_structured_responses.ipynb new file mode 100644 index 0000000000..f01499d2d2 --- /dev/null +++ b/packages/graphrag-llm/notebooks/03_structured_responses.ipynb @@ -0,0 +1,170 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5b094500", + "metadata": {}, + "source": [ + "# Structured Response\n", + "\n", + "`LLMCompletion.completion` accepts a `response_format` parameter that is a pydantic model for parsing and returning structured responses.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "a79c242b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "City: Seattle\n", + " Temperature: 11.1 °C\n", + " Condition: sunny\n", + "City: San Francisco\n", + " Temperature: 23.9 °C\n", + " Condition: cloudy\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "from graphrag_llm.types import LLMCompletionResponse\n", + "from pydantic import BaseModel, Field\n", + "\n", + "load_dotenv()\n", + "\n", + "\n", + "class LocalWeather(BaseModel):\n", + " \"\"\"City weather information model.\"\"\"\n", + "\n", + " city: str = Field(description=\"The name of the city\")\n", + " temperature: float = Field(description=\"The temperature in Celsius\")\n", + " condition: str = Field(description=\"The weather condition description\")\n", + "\n", + "\n", + "class WeatherReports(BaseModel):\n", + " \"\"\"Weather information model.\"\"\"\n", + "\n", + " reports: list[LocalWeather] = Field(\n", + " description=\"The weather reports for multiple cities\"\n", + " )\n", + "\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "response: LLMCompletionResponse[WeatherReports] = llm_completion.completion(\n", + " messages=\"It is sunny and 52 degrees fahrenheit in Seattle. It is cloudy and 75 degrees fahrenheit in San Francisco.\",\n", + " response_format=WeatherReports,\n", + ") # type: ignore\n", + "\n", + "local_weather_reports: WeatherReports = response.formatted_response # type: ignore\n", + "for report in local_weather_reports.reports:\n", + " print(f\"City: {report.city}\")\n", + " print(f\" Temperature: {report.temperature} °C\")\n", + " print(f\" Condition: {report.condition}\")" + ] + }, + { + "cell_type": "markdown", + "id": "6dcfa20c", + "metadata": {}, + "source": [ + "## Checking for support\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "aa1edadb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Supports structured responses: True\n" + ] + } + ], + "source": [ + "print(f\"Supports structured responses: {llm_completion.supports_structured_response()}\")" + ] + }, + { + "cell_type": "markdown", + "id": "6360f512", + "metadata": {}, + "source": [ + "## Streaming\n", + "\n", + "Streaming is not supported when using `response_format`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "e08b9ba6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Error during streaming completion: response_format is not supported for streaming completions.\n" + ] + } + ], + "source": [ + "try:\n", + " response = llm_completion.completion(\n", + " messages=\"It is sunny and 52 degrees fahrenheit in Seattle. It is cloudy and 75 degrees fahrenheit in San Francisco.\",\n", + " response_format=WeatherReports,\n", + " stream=True,\n", + " )\n", + "except Exception as e: # noqa: BLE001\n", + " print(f\"Error during streaming completion: {e}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/04_metrics.ipynb b/packages/graphrag-llm/notebooks/04_metrics.ipynb new file mode 100644 index 0000000000..e8649f0a93 --- /dev/null +++ b/packages/graphrag-llm/notebooks/04_metrics.ipynb @@ -0,0 +1,595 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4dc68732", + "metadata": {}, + "source": [ + "# Metrics\n", + "\n", + "Metrics are automatically tracked for completion and embedding calls.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "868deb65", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 1,\n", + " \"successful_response_count\": 1,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 3.4281113147735596,\n", + " \"compute_duration_per_response_seconds\": 3.4281113147735596,\n", + " \"cache_hit_rate\": 0.0,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 1,\n", + " \"prompt_tokens\": 14,\n", + " \"completion_tokens\": 8,\n", + " \"total_tokens\": 22,\n", + " \"tokens_per_response\": 22.0,\n", + " \"responses_with_cost\": 1,\n", + " \"input_cost\": 3.5000000000000004e-05,\n", + " \"output_cost\": 8e-05,\n", + " \"total_cost\": 0.000115,\n", + " \"cost_per_response\": 0.000115\n", + "}\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import json\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "dd9e7e19", + "metadata": {}, + "source": [ + "## Disable Metrics\n", + "\n", + "Set `metrics` to `None` in the `ModelConfig` to disable metrics.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "44ab5fcd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metrics for: \n", + "{}\n" + ] + } + ], + "source": [ + "model_config.metrics = None\n", + "llm_completion_no_metrics: LLMCompletion = create_completion(model_config)\n", + "\n", + "response = llm_completion_no_metrics.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "\n", + "# Now .metrics_store should be a NoOpMetricsStore\n", + "print(f\"Metrics for: {llm_completion_no_metrics.metrics_store.id}\")\n", + "print(json.dumps(llm_completion_no_metrics.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "f38a5a44", + "metadata": {}, + "source": [ + "## Automatic Metrics Logging\n", + "\n", + "Metrics foreach instantiated model are automatically logged on process exit. To see this, update the log level to info.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "16b71da8", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[92m22:45:27 - LiteLLM:INFO\u001b[0m: utils.py:3373 - \n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "INFO:LiteLLM:\n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "\u001b[92m22:45:27 - LiteLLM:INFO\u001b[0m: utils.py:1286 - Wrapper: Completed Call, calling success_handler\n", + "INFO:LiteLLM:Wrapper: Completed Call, calling success_handler\n", + "INFO:graphrag_llm.metrics.log_metrics_writer:Metrics for azure/gpt-4o: {\n", + " \"attempted_request_count\": 1,\n", + " \"successful_response_count\": 1,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 0.3004579544067383,\n", + " \"compute_duration_per_response_seconds\": 0.3004579544067383,\n", + " \"cache_hit_rate\": 0.0,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 1,\n", + " \"prompt_tokens\": 14,\n", + " \"completion_tokens\": 8,\n", + " \"total_tokens\": 22,\n", + " \"tokens_per_response\": 22.0,\n", + " \"responses_with_cost\": 1,\n", + " \"input_cost\": 3.5000000000000004e-05,\n", + " \"output_cost\": 8e-05,\n", + " \"total_cost\": 0.000115,\n", + " \"cost_per_response\": 0.000115\n", + "}\n" + ] + } + ], + "source": [ + "import logging\n", + "\n", + "logging.basicConfig(level=logging.INFO)\n", + "\n", + "llm_completion.metrics_store.clear_metrics()\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "\n", + "# NOTE: Call _on_exit_ to simulate application exit since\n", + "# the notebook process does not exit and the llm_completion\n", + "# object is not garbage collected.\n", + "# This should not be called in normal python scripts.\n", + "llm_completion.metrics_store._on_exit_() # type: ignore" + ] + }, + { + "cell_type": "markdown", + "id": "7d97bd8c", + "metadata": {}, + "source": [ + "## Save Metrics to a File\n", + "\n", + "Instead of logging on exit, metrics can automatically be saved to a file on exit by using a `MetricsWriter.File` metrics writer.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "4c16806a", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:azure.identity._credentials.environment:No environment configuration found.\n", + "INFO:azure.identity._credentials.managed_identity:ManagedIdentityCredential will use IMDS\n", + "\u001b[92m22:45:27 - LiteLLM:INFO\u001b[0m: utils.py:3373 - \n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "INFO:LiteLLM:\n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "\u001b[92m22:45:28 - LiteLLM:INFO\u001b[0m: utils.py:1286 - Wrapper: Completed Call, calling success_handler\n", + "INFO:LiteLLM:Wrapper: Completed Call, calling success_handler\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Contents of metrics\\20260111_211007.jsonl:\n", + "{\"id\": \"azure/gpt-4o\", \"metrics\": {\"attempted_request_count\": 1, \"successful_response_count\": 1, \"failed_response_count\": 0, \"failure_rate\": 0.0, \"requests_with_retries\": 0, \"retries\": 0, \"retry_rate\": 0.0, \"compute_duration_seconds\": 0.6868698596954346, \"compute_duration_per_response_seconds\": 0.6868698596954346, \"streaming_responses\": 0, \"responses_with_tokens\": 1, \"prompt_tokens\": 14, \"completion_tokens\": 8, \"total_tokens\": 22, \"tokens_per_response\": 22.0, \"responses_with_cost\": 1, \"input_cost\": 3.5000000000000004e-05, \"output_cost\": 8e-05, \"total_cost\": 0.000115, \"cost_per_response\": 0.000115}}\n", + "\n" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "\n", + "from graphrag_llm.config import MetricsConfig, MetricsWriterType\n", + "\n", + "model_config.metrics = MetricsConfig(\n", + " writer=MetricsWriterType.File,\n", + " base_dir=\"./metrics\", # Default\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "\n", + "# NOTE: Call _on_exit_ to simulate application exit since\n", + "# the notebook process does not exit and the llm_completion\n", + "# object is not garbage collected.\n", + "# This should not be called in normal python scripts.\n", + "llm_completion.metrics_store._on_exit_() # type: ignore\n", + "\n", + "metrics_dir = Path(\"./metrics\")\n", + "for metric_file in metrics_dir.glob(\"*.jsonl\"):\n", + " print(f\"Contents of {metric_file}:\")\n", + " print(metric_file.read_text())\n", + " break # Just print one file for brevity" + ] + }, + { + "cell_type": "markdown", + "id": "9076af04", + "metadata": {}, + "source": [ + "## Default Metrics\n", + "\n", + "- `attempted_request_count`: Number of network requests made, not including retries.\n", + "- `successful_response_count`: Number of successful responses.\n", + "- `failed_response_count`: Number of network requests that threw errors and could not be resolved even after retries. `successful_response_count + failed_response_count` should equal `attempted_request_count` unless the job or process was killed early.\n", + "- `failure_rate`: `failed_response_count / attempted_request_count`.\n", + "- `requests_with_retries`: Number of original requests that had to go through a retry loop.\n", + "- `retries`: Number of network requests that were retries.\n", + "- `retry_rate`: `retries / (retries + attempted_request_count)`\n", + "- `compute_duration_seconds`: Total number of seconds to complete all non-streaming network requests.\n", + "- `compute_duration_per_response_seconds`: `compute_duration_seconds / successful non-streaming responses`\n", + "- `runtime_duration_seconds`: Only present if using the batching utilities. The batching utilities run multiple completions/embedding in parallel so `runtime_duration_seconds` is the actual runtime duration. Comparing this with `compute_duration_seconds` indicates how much time was saved using the batching utilities vs if all network requests ran in series.\n", + "- `cached_responses`: Number of cached responses. Only present if using a cache. When a response is cached so are the corresponding metrics. When a response is retrieved from the cache the corresponding metrics are also retrieved from the cache and provided in the overall metrics so metrics like `compute_duration_seconds`, `input_cost`, `output_cost`, etc include cached rsponses metrics. This is helpful when having to resume stopped jobs or rerunning failed jobs. At the end of the job the metrics indicate how long and costly the job would have been when running off a fresh cache/no cache. The `cached_responses` only indicates how many network requests were skipped and retrieved from cache.\n", + "- `streaming_responses`: Number of requests using the `stream=True` parameter. Many metrics such as token counts and costs are not tracked for streaming requests as that would require analyzing the stream to completion within the middleware stack and preventing the ability to build true streaming interfaces with `graphrag-llm`\n", + "- `responses_with_tokens`: Number of responses in which token counts were obtained. Typically this should equal `successful_response_count - streaming_responses`.\n", + "- `prompt_tokens`: Total number of prompt tokens used accross all successful non-streaming network requests.\n", + "- `completion_tokens`: Total number of completion tokens accress all succesful non-streaming network requests.\n", + "- `total_tokens`: `prompt_tokens + completion_tokens`\n", + "- `tokens_per_response`: `total_tokens / responses_with_tokens`\n", + "- `responses_with_cost`: Number of responses in which costs were calculated. typically this should equal `successful_response_count - streaming_responses`.\n", + "- `input_cost`: Cost of the input tokens accross all successful non-streaming network requests.\n", + "- `output_cost`: Cost of the output tokens accross all successful non-streaming network requests.\n", + "- `total_cost`: `input_cost + output_cost`\n", + "- `cost_per_response`: `total_cost / responses_with_cost`.\n" + ] + }, + { + "cell_type": "markdown", + "id": "2749473e", + "metadata": {}, + "source": [ + "## Custom Model Costs\n", + "\n", + "The default metrics include costs for prompt tokens and completion tokens. These are calculated using a registry of known models and associated costs managed by litellm: https://github.com/BerriAI/litellm/blob/main/model_prices_and_context_window.json\n", + "\n", + "One can register custom model costs if using a custom model that is not in the registry or one that differs from the known/default cost.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7a47f496", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[92m22:45:28 - LiteLLM:INFO\u001b[0m: utils.py:3373 - \n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "INFO:LiteLLM:\n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "\u001b[92m22:45:28 - LiteLLM:INFO\u001b[0m: utils.py:1286 - Wrapper: Completed Call, calling success_handler\n", + "INFO:LiteLLM:Wrapper: Completed Call, calling success_handler\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"attempted_request_count\": 1,\n", + " \"successful_response_count\": 1,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 0.3090023994445801,\n", + " \"compute_duration_per_response_seconds\": 0.3090023994445801,\n", + " \"cache_hit_rate\": 0.0,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 1,\n", + " \"prompt_tokens\": 14,\n", + " \"completion_tokens\": 8,\n", + " \"total_tokens\": 22,\n", + " \"tokens_per_response\": 22.0,\n", + " \"responses_with_cost\": 1,\n", + " \"input_cost\": 14000,\n", + " \"output_cost\": 40000,\n", + " \"total_cost\": 54000,\n", + " \"cost_per_response\": 54000.0\n", + "}\n" + ] + } + ], + "source": [ + "from graphrag_llm.model_cost_registry import model_cost_registry\n", + "\n", + "model_cost_registry.register_model_costs(\n", + " model=\"azure/gpt-4o\", # This should use format \"{model_provider}/{model_name}\" and not the azure deployment name\n", + " costs={\n", + " # Expensive model\n", + " \"input_cost_per_token\": 1000,\n", + " \"output_cost_per_token\": 5000,\n", + " },\n", + ")\n", + "\n", + "llm_completion.metrics_store.clear_metrics()\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "4132a718", + "metadata": {}, + "source": [ + "## Custom Metrics Processor\n", + "\n", + "It is possible to register a custom metrics processor if one needs to track metrics not already tracked.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "f68ed4bb", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "INFO:azure.identity._credentials.environment:No environment configuration found.\n", + "INFO:azure.identity._credentials.managed_identity:ManagedIdentityCredential will use IMDS\n", + "\u001b[92m22:45:28 - LiteLLM:INFO\u001b[0m: utils.py:3373 - \n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "INFO:LiteLLM:\n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "\u001b[92m22:45:28 - LiteLLM:INFO\u001b[0m: utils.py:1286 - Wrapper: Completed Call, calling success_handler\n", + "INFO:LiteLLM:Wrapper: Completed Call, calling success_handler\n", + "\u001b[92m22:45:28 - LiteLLM:INFO\u001b[0m: utils.py:3373 - \n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "INFO:LiteLLM:\n", + "LiteLLM completion() model= gpt-4o; provider = azure\n", + "\u001b[92m22:45:29 - LiteLLM:INFO\u001b[0m: utils.py:1286 - Wrapper: Completed Call, calling success_handler\n", + "INFO:LiteLLM:Wrapper: Completed Call, calling success_handler\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 2,\n", + " \"successful_response_count\": 2,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 0.6117346286773682,\n", + " \"compute_duration_per_response_seconds\": 0.3058673143386841,\n", + " \"cache_hit_rate\": 0.0,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 2,\n", + " \"prompt_tokens\": 28,\n", + " \"completion_tokens\": 16,\n", + " \"total_tokens\": 44,\n", + " \"tokens_per_response\": 22.0,\n", + " \"responses_with_cost\": 2,\n", + " \"input_cost\": 28000,\n", + " \"output_cost\": 80000,\n", + " \"total_cost\": 108000,\n", + " \"cost_per_response\": 54000.0,\n", + " \"responses_with_temperature\": 1,\n", + " \"temperature_rate\": 0.5\n", + "}\n" + ] + } + ], + "source": [ + "import json\n", + "import os\n", + "from collections.abc import AsyncIterator, Iterator\n", + "from typing import Any\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import MetricsConfig, MetricsWriterType, ModelConfig\n", + "from graphrag_llm.metrics import metrics_aggregator, register_metrics_processor\n", + "from graphrag_llm.metrics.default_metrics_processor import DefaultMetricsProcessor\n", + "from graphrag_llm.types import (\n", + " LLMCompletionChunk,\n", + " LLMCompletionResponse,\n", + " LLMEmbeddingResponse,\n", + " Metrics,\n", + ")\n", + "\n", + "load_dotenv()\n", + "\n", + "\n", + "class MyCustomMetricsProcessor(DefaultMetricsProcessor):\n", + " \"\"\"Custom metrics processor.\n", + "\n", + " Inheriting from DefaultMetricsProcessor to add to the default metrics being\n", + " tracked instead of implementing the interface from scratch.\n", + "\n", + " Metrics = dict[str, float]. The metrics passed to process_metrics method\n", + " represent the metrics for a single request. Typically, you will count/flag\n", + " metrics of interest per request and then aggregate them in the metrics_aggregator.\n", + " \"\"\"\n", + "\n", + " def __init__(self, some_custom_option: str, **kwargs: Any) -> None:\n", + " \"\"\"Initialize the custom metrics processor.\"\"\"\n", + " super().__init__(**kwargs)\n", + " self._some_custom_option = some_custom_option # Not actually used\n", + "\n", + " def process_metrics(\n", + " self,\n", + " *,\n", + " model_config: ModelConfig,\n", + " metrics: Metrics,\n", + " input_args: dict[str, Any],\n", + " response: LLMCompletionResponse\n", + " | Iterator[LLMCompletionChunk]\n", + " | AsyncIterator[LLMCompletionChunk]\n", + " | LLMEmbeddingResponse,\n", + " ) -> None:\n", + " \"\"\"On top of the default metrics, track if temperature argument was used.\n", + "\n", + " Expected to mutate the metrics dict in place with metrics you want to track.\n", + "\n", + " process_metrics is only called for successful requests and will be passed in the response\n", + " from either a completion or embedding call.\n", + "\n", + " Args\n", + " ----\n", + " model_config: ModelConfig\n", + " The model config used for the request.\n", + " metrics: Metrics\n", + " The metrics dict to be mutated in place.\n", + " input_args: dict[str, Any]\n", + " The input arguments passed to completion or embedding.\n", + " response: LLMChatCompletion | Iterator[LLMChatCompletionChunk] | LLMEmbeddingResponse\n", + " Either a completion or embedding response from the LLM.\n", + " \"\"\"\n", + " # Track default metrics first\n", + " super().process_metrics(\n", + " model_config=model_config,\n", + " metrics=metrics,\n", + " input_args=input_args,\n", + " response=response,\n", + " )\n", + "\n", + " metrics[\"responses_with_temperature\"] = 1 if \"temperature\" in input_args else 0\n", + "\n", + "\n", + "# Register custom metrics processor\n", + "register_metrics_processor(\n", + " processor_type=\"custom_with_temperature\",\n", + " processor_initializer=MyCustomMetricsProcessor,\n", + ")\n", + "\n", + "\n", + "# Custom aggregator to calculate temperature usage rate\n", + "def _temperature_rate(metrics: \"Metrics\") -> None:\n", + " \"\"\"Calculate temperature usage rate.\n", + "\n", + " Custom aggregate function to track the usage rate of temperature parameter.\n", + "\n", + " Here, metrics represents the aggregated metrics for the current model.\n", + " \"\"\"\n", + " responses = metrics.get(\"successful_response_count\", 0)\n", + " temperature_responses = metrics.get(\"responses_with_temperature\", 0)\n", + " if responses > 0:\n", + " metrics[\"temperature_rate\"] = temperature_responses / responses\n", + " else:\n", + " metrics[\"temperature_rate\"] = 0.0\n", + "\n", + "\n", + "# Register custom aggregator\n", + "metrics_aggregator.register(\"temperature_rate\", _temperature_rate)\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + " metrics=MetricsConfig(\n", + " # Use the custom metrics processor registered above\n", + " type=\"custom_with_temperature\",\n", + " some_custom_option=\"example_option_value\", # type: ignore\n", + " writer=MetricsWriterType.File,\n", + " base_dir=\"./metrics\", # Default\n", + " ),\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "\n", + "response_with_temperature = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + " temperature=0.7,\n", + ")\n", + "\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/05_caching.ipynb b/packages/graphrag-llm/notebooks/05_caching.ipynb new file mode 100644 index 0000000000..75067a54e6 --- /dev/null +++ b/packages/graphrag-llm/notebooks/05_caching.ipynb @@ -0,0 +1,264 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "347b0fc9", + "metadata": {}, + "source": [ + "# Caching\n", + "\n", + "To enabling caching, pass in a `Cache` instance to the `create_completion` or `create_embedding` functions.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96b0c42f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 3,\n", + " \"successful_response_count\": 3,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 2.8864328861236572,\n", + " \"compute_duration_per_response_seconds\": 0.9621442953745524,\n", + " \"cached_responses\": 1,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 3,\n", + " \"prompt_tokens\": 191,\n", + " \"completion_tokens\": 59,\n", + " \"total_tokens\": 250,\n", + " \"tokens_per_response\": 83.33333333333333,\n", + " \"responses_with_cost\": 3,\n", + " \"input_cost\": 0.0004775,\n", + " \"output_cost\": 0.00059,\n", + " \"total_cost\": 0.0010675,\n", + " \"cost_per_response\": 0.0003558333333333334\n", + "}\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import json\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_cache import CacheConfig, CacheType, create_cache\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "from graphrag_storage import StorageConfig, StorageType\n", + "\n", + "load_dotenv()\n", + "\n", + "cache = create_cache()\n", + "# The above default is equivalent to:\n", + "cache = create_cache(\n", + " CacheConfig(\n", + " type=CacheType.Json,\n", + " storage=StorageConfig(type=StorageType.File, base_dir=\"cache\"),\n", + " )\n", + ")\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config, cache=cache)\n", + "\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "metrics = llm_completion.metrics_store.get_metrics()\n", + "print(json.dumps(metrics, indent=2))\n", + "assert metrics[\"cached_responses\"] == 1" + ] + }, + { + "cell_type": "markdown", + "id": "c70a72fc", + "metadata": {}, + "source": [ + "## Note on the above metrics\n", + "\n", + "`cached_responses == 1` since the request was cached by the time the second call was made.\n", + "\n", + "The `cached_responses` indicates how many cache hits occurred but the rest of the metrics exist as if a cache was not used. For example, `compute_duration_seconds` and all the token counts and cost counts are as if cache was not used. This is because both the response and metrics are cached and retrieved from the cache when a cache hit occurs. Metrics were designed to give an idea of how long and costly a job would be if there were no cache.\n" + ] + }, + { + "cell_type": "markdown", + "id": "27b026d7", + "metadata": {}, + "source": [ + "## Tests\n", + "\n", + "This is in here because notebooks are being used as integration tests. This ensures objects are being loaded and deserialized from cache properly and the cache is bypassing the rate limiting.\n" + ] + }, + { + "cell_type": "markdown", + "id": "22cc179e", + "metadata": {}, + "source": [ + "### Test Timing\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "efb228ce", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total time for 100 requests: 0.3867683410644531 seconds\n" + ] + } + ], + "source": [ + "import time\n", + "\n", + "from graphrag_llm.config import RateLimitConfig, RateLimitType\n", + "\n", + "model_config.rate_limit = RateLimitConfig(\n", + " type=RateLimitType.SlidingWindow,\n", + " period_in_seconds=60, # limit requests per minute\n", + " requests_per_period=1, # max 1 request per minute. Without cache this would take forever\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config, cache=cache)\n", + "\n", + "start_time = time.time()\n", + "for _ in range(100):\n", + " response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + " )\n", + "end_time = time.time()\n", + "total_time = end_time - start_time\n", + "print(f\"Total time for 100 requests: {total_time} seconds\")\n", + "assert total_time < 5.0 # Ensure that caching is effective" + ] + }, + { + "cell_type": "markdown", + "id": "dcf4bf16", + "metadata": {}, + "source": [ + "### Test Structured Responses\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "21e0e1e4", + "metadata": {}, + "outputs": [], + "source": [ + "from graphrag_llm.types import LLMCompletionResponse\n", + "from pydantic import BaseModel, Field\n", + "\n", + "\n", + "class LocalWeather(BaseModel):\n", + " \"\"\"City weather information model.\"\"\"\n", + "\n", + " city: str = Field(description=\"The name of the city\")\n", + " temperature: float = Field(description=\"The temperature in Celsius\")\n", + " condition: str = Field(description=\"The weather condition description\")\n", + "\n", + "\n", + "class WeatherReports(BaseModel):\n", + " \"\"\"Weather information model.\"\"\"\n", + "\n", + " reports: list[LocalWeather] = Field(\n", + " description=\"The weather reports for multiple cities\"\n", + " )\n", + "\n", + "\n", + "llm_completion.metrics_store.clear_metrics()\n", + "response: LLMCompletionResponse[WeatherReports] = llm_completion.completion( # type: ignore\n", + " messages=\"It is sunny and 52 degrees fahrenheit in Seattle. It is cloudy and 75 degrees fahrenheit in San Francisco.\",\n", + " response_format=WeatherReports,\n", + ") # type: ignore\n", + "response: LLMCompletionResponse[WeatherReports] = llm_completion.completion( # type: ignore\n", + " messages=\"It is sunny and 52 degrees fahrenheit in Seattle. It is cloudy and 75 degrees fahrenheit in San Francisco.\",\n", + " response_format=WeatherReports,\n", + ") # type: ignore\n", + "\n", + "metrics = llm_completion.metrics_store.get_metrics()\n", + "assert metrics[\"cached_responses\"] == 1, (\n", + " f\"Expected 1 cached response, got {metrics['cached_responses']}\"\n", + ")\n", + "\n", + "\n", + "# Changing the response format should not hit the cache and\n", + "# instead be a new request and store a new response in the cache.\n", + "\n", + "\n", + "class WeatherReports2(BaseModel):\n", + " \"\"\"Weather information model.\"\"\"\n", + "\n", + " local_reports: list[LocalWeather] = Field(\n", + " description=\"The weather reports for multiple cities\"\n", + " )\n", + "\n", + "\n", + "llm_completion.metrics_store.clear_metrics()\n", + "# Same request but different response format. Should not hit cache.\n", + "response: LLMCompletionResponse[WeatherReports2] = llm_completion.completion(\n", + " messages=\"It is sunny and 52 degrees fahrenheit in Seattle. It is cloudy and 75 degrees fahrenheit in San Francisco.\",\n", + " response_format=WeatherReports2,\n", + ") # type: ignore\n", + "\n", + "metrics = llm_completion.metrics_store.get_metrics()\n", + "assert metrics.get(\"cached_responses\", 0) == 0, (\n", + " f\"Expected 0 cached responses, got {metrics['cached_responses']}\"\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/06_retries.ipynb b/packages/graphrag-llm/notebooks/06_retries.ipynb new file mode 100644 index 0000000000..a49dd1d2d5 --- /dev/null +++ b/packages/graphrag-llm/notebooks/06_retries.ipynb @@ -0,0 +1,115 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "d75247ed", + "metadata": {}, + "source": [ + "# Retries\n", + "\n", + "Retries are disabled by default. Retries can be enabled with the following example.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "299065b7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 1,\n", + " \"successful_response_count\": 1,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 1,\n", + " \"retries\": 2,\n", + " \"retry_rate\": 0.6666666666666666,\n", + " \"compute_duration_seconds\": 2.6571085453033447,\n", + " \"compute_duration_per_response_seconds\": 2.6571085453033447,\n", + " \"cache_hit_rate\": 0.0,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 1,\n", + " \"prompt_tokens\": 14,\n", + " \"completion_tokens\": 8,\n", + " \"total_tokens\": 22,\n", + " \"tokens_per_response\": 22.0,\n", + " \"responses_with_cost\": 1,\n", + " \"input_cost\": 3.5000000000000004e-05,\n", + " \"output_cost\": 8e-05,\n", + " \"total_cost\": 0.000115,\n", + " \"cost_per_response\": 0.000115\n", + "}\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import json\n", + "import logging\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig, RetryConfig, RetryType\n", + "\n", + "load_dotenv()\n", + "\n", + "logging.basicConfig(level=logging.CRITICAL)\n", + "\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + " retry=RetryConfig(\n", + " type=RetryType.ExponentialBackoff, max_retries=7, base_delay=2.0, jitter=True\n", + " ),\n", + " # Internal option to test error handling and retries\n", + " failure_rate_for_testing=0.5, # type: ignore\n", + ")\n", + "\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/07_rate_limiting.ipynb b/packages/graphrag-llm/notebooks/07_rate_limiting.ipynb new file mode 100644 index 0000000000..081382eac6 --- /dev/null +++ b/packages/graphrag-llm/notebooks/07_rate_limiting.ipynb @@ -0,0 +1,129 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0a68b531", + "metadata": {}, + "source": [ + "# Rate Limiting\n", + "\n", + "Rate limiting is disabled by default. Requests can be limited by either requests per period or tokens per period or both.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "df4fa775", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Time taken for two requests: 20.87 seconds\n", + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 2,\n", + " \"successful_response_count\": 2,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 3.534508228302002,\n", + " \"compute_duration_per_response_seconds\": 1.767254114151001,\n", + " \"cache_hit_rate\": 0.0,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 2,\n", + " \"prompt_tokens\": 28,\n", + " \"completion_tokens\": 16,\n", + " \"total_tokens\": 44,\n", + " \"tokens_per_response\": 22.0,\n", + " \"responses_with_cost\": 2,\n", + " \"input_cost\": 7.000000000000001e-05,\n", + " \"output_cost\": 0.00016,\n", + " \"total_cost\": 0.00023,\n", + " \"cost_per_response\": 0.000115\n", + "}\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import json\n", + "import os\n", + "import time\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig, RateLimitConfig, RateLimitType\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + " rate_limit=RateLimitConfig(\n", + " type=RateLimitType.SlidingWindow,\n", + " period_in_seconds=60, # limit requests per minute\n", + " requests_per_period=3, # max 3 requests per minute. Fire one off every 20 seconds\n", + " ),\n", + ")\n", + "\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "start_time = time.time()\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "response = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ")\n", + "end_time = time.time()\n", + "total_time = end_time - start_time\n", + "assert total_time >= 20, \"Rate limiting did not work as expected.\"\n", + "\n", + "print(f\"Time taken for two requests: {total_time:.2f} seconds\")\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "59f92d3f", + "metadata": {}, + "source": [ + "Notice that the `compute_duration_seconds` in the metrics only tracks how long a network request actually takes and does track paused periods that occur due to rate limits.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/08_batching.ipynb b/packages/graphrag-llm/notebooks/08_batching.ipynb new file mode 100644 index 0000000000..fccd984ddd --- /dev/null +++ b/packages/graphrag-llm/notebooks/08_batching.ipynb @@ -0,0 +1,536 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "91a0ee2b", + "metadata": {}, + "source": [ + "# Batching\n" + ] + }, + { + "cell_type": "markdown", + "id": "422fcc73", + "metadata": {}, + "source": [ + "## Completion Batching\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "88e715fe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "In the velvet silence of the night,\n", + "A canvas vast and infinite unfolds,\n", + "Where stories of the cosmos,\n", + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 10,\n", + " \"successful_response_count\": 10,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 157.70280289649963,\n", + " \"compute_duration_per_response_seconds\": 15.770280289649964,\n", + " \"runtime_duration_seconds\": 18.660003900527954,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 10,\n", + " \"prompt_tokens\": 280,\n", + " \"completion_tokens\": 9234,\n", + " \"total_tokens\": 9514,\n", + " \"tokens_per_response\": 951.4,\n", + " \"responses_with_cost\": 10,\n", + " \"input_cost\": 0.0007,\n", + " \"output_cost\": 0.09234,\n", + " \"total_cost\": 0.09304000000000001,\n", + " \"cost_per_response\": 0.009304000000000002\n", + "}\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import json\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "from graphrag_llm.types import LLMCompletionArgs\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "\n", + "completion_requests: list[LLMCompletionArgs] = [\n", + " {\n", + " \"messages\": \"Write a 1000 word poem about the night sky and all the wonders and mysteries of the universe.\"\n", + " },\n", + "] * 10\n", + "\n", + "# Spins up to 25 concurrent requests\n", + "# Which is more than the number of requests being made\n", + "# and since rate limiting is not enabled, all the requests fire off immediately\n", + "# and complete as fast as the LLM provider allows\n", + "responses = llm_completion.completion_batch(completion_requests, concurrency=25)\n", + "for response in responses:\n", + " if isinstance(response, Exception):\n", + " print(f\"Error: {response}\")\n", + " else:\n", + " # Print the first 100 characters of the first successful response\n", + " print(response.content[0:100]) # type: ignore\n", + " break\n", + "\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "668e1f94", + "metadata": {}, + "source": [ + "Notice the difference between `compute_duration_seconds` and `runtime_duration_seconds`. The former indicates how long all the network requests took to complete and would be how long the whole process took to complete if running the requests in series. The latter indicates how long the batch as a whole took to complete when running with concurrency.\n" + ] + }, + { + "cell_type": "markdown", + "id": "49ec7716", + "metadata": {}, + "source": [ + "### With Rate Limiting\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "eb73f940", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 10,\n", + " \"successful_response_count\": 10,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 108.16670417785645,\n", + " \"compute_duration_per_response_seconds\": 10.816670417785645,\n", + " \"runtime_duration_seconds\": 38.489975929260254,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 10,\n", + " \"prompt_tokens\": 280,\n", + " \"completion_tokens\": 8965,\n", + " \"total_tokens\": 9245,\n", + " \"tokens_per_response\": 924.5,\n", + " \"responses_with_cost\": 10,\n", + " \"input_cost\": 0.0007,\n", + " \"output_cost\": 0.08965000000000002,\n", + " \"total_cost\": 0.09035000000000001,\n", + " \"cost_per_response\": 0.009035000000000001\n", + "}\n" + ] + } + ], + "source": [ + "from graphrag_llm.config import RateLimitConfig, RateLimitType\n", + "\n", + "model_config.rate_limit = RateLimitConfig(\n", + " type=RateLimitType.SlidingWindow,\n", + " period_in_seconds=60, # limit requests per minute\n", + " requests_per_period=20, # max 20 requests per minute. Fire one off every 3 seconds\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "llm_completion.metrics_store.clear_metrics()\n", + "\n", + "responses = llm_completion.completion_batch(completion_requests, concurrency=25)\n", + "\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "ceb93f24", + "metadata": {}, + "source": [ + "Notice the `runtime_duration_seconds` is now much slower as the requests are being throttled by the rate limit.\n" + ] + }, + { + "cell_type": "markdown", + "id": "05bd00e6", + "metadata": {}, + "source": [ + "### With Cache\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "3cb345ec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 10,\n", + " \"successful_response_count\": 10,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 93.54697012901306,\n", + " \"compute_duration_per_response_seconds\": 9.354697012901307,\n", + " \"runtime_duration_seconds\": 10.748144149780273,\n", + " \"cached_responses\": 6,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 10,\n", + " \"prompt_tokens\": 280,\n", + " \"completion_tokens\": 7869,\n", + " \"total_tokens\": 8149,\n", + " \"tokens_per_response\": 814.9,\n", + " \"responses_with_cost\": 10,\n", + " \"input_cost\": 0.0007,\n", + " \"output_cost\": 0.07869000000000001,\n", + " \"total_cost\": 0.07939000000000002,\n", + " \"cost_per_response\": 0.007939000000000002\n", + "}\n" + ] + } + ], + "source": [ + "from graphrag_cache import create_cache\n", + "\n", + "cache = create_cache()\n", + "\n", + "# Redisable rate limiting\n", + "model_config.rate_limit = None\n", + "\n", + "llm_completion: LLMCompletion = create_completion(model_config, cache=cache)\n", + "llm_completion.metrics_store.clear_metrics()\n", + "\n", + "responses = llm_completion.completion_batch(completion_requests, concurrency=4)\n", + "\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "6de2c4cf", + "metadata": {}, + "source": [ + "Notice the `cached_responses == 6` since we are spinning up `4` threads. The first 4 requests are fired off immediately prior to any data in the cache. This means when identical requests are fired in the same thread cycle they will all hit the model since the cache is not yet populated.\n", + "\n", + "The `cached_responses` indicates how many cache hits occurred but the rest of the metrics exist as if a cache was not used. For example, `compute_duration_seconds` and all the tokens and cost counts are as if cache was not used so `compute_duration_seconds` includes network timings for the cached responses. This is because both the response and metrics are cached and retrieved from the cache when a cache hit occurs. This means the above metrics should closely match the metrics from the first example in this notebook other than the `runtime_duration_seconds` which gives the true idea of how long a job takes to run. Rerunning a job with a fully hydrated cache should result in a quick `runtime_duration_seconds`. Metrics were designed to give an idea of how long and costly a job would be if there were no cache.\n" + ] + }, + { + "cell_type": "markdown", + "id": "3e6d20d6", + "metadata": {}, + "source": [ + "## Embedding Batching\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2e95c4e6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Embedding vector length: 1536\n", + "[0.012382184155285358, -0.0487498939037323, 0.02962493523955345, 0.0321056991815567, -0.030259549617767334]\n", + "Embedding vector length: 1536\n", + "[-0.01842353865504265, -0.00725775770843029, 0.0036669441033154726, -0.0542047917842865, -0.022724902257323265]\n", + "Embedding vector length: 1536\n", + "[-0.055969491600990295, 0.023217301815748215, -0.007630861829966307, 0.002210293198004365, 0.01284848153591156]\n", + "Metrics for: azure/text-embedding-3-small\n", + "{\n", + " \"attempted_request_count\": 2,\n", + " \"successful_response_count\": 2,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 2.0372798442840576,\n", + " \"compute_duration_per_response_seconds\": 1.0186399221420288,\n", + " \"runtime_duration_seconds\": 1.02105712890625,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 2,\n", + " \"prompt_tokens\": 23,\n", + " \"total_tokens\": 23,\n", + " \"tokens_per_response\": 11.5,\n", + " \"responses_with_cost\": 2,\n", + " \"input_cost\": 4.6e-07,\n", + " \"total_cost\": 4.6e-07,\n", + " \"cost_per_response\": 2.3e-07\n", + "}\n" + ] + } + ], + "source": [ + "from graphrag_llm.embedding import LLMEmbedding, create_embedding\n", + "from graphrag_llm.types import LLMEmbeddingArgs\n", + "\n", + "embedding_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_EMBEDDING_MODEL\", \"text-embedding-3-small\"),\n", + " azure_deployment_name=os.getenv(\n", + " \"GRAPHRAG_LLM_EMBEDDING_MODEL\", \"text-embedding-3-small\"\n", + " ),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "\n", + "llm_embedding: LLMEmbedding = create_embedding(embedding_config)\n", + "\n", + "# A single embedding request already accepts a list of inputs to embed\n", + "# Here we demonstrate batching multiple embedding requests concurrently\n", + "# The first request has two inputs to embed and the second has one input\n", + "embedding_requests: list[LLMEmbeddingArgs] = [\n", + " {\"input\": [\"Hello World.\", \"The quick brown fox jumps over the lazy dog.\"]},\n", + " {\"input\": [\"GraphRag is an amazing LLM framework.\"]},\n", + "]\n", + "\n", + "responses = llm_embedding.embedding_batch(embedding_requests, concurrency=4)\n", + "for response in responses:\n", + " if isinstance(response, Exception):\n", + " print(f\"Error: {response}\")\n", + " else:\n", + " for embedding in response.embeddings:\n", + " print(f\"Embedding vector length: {len(embedding)}\")\n", + " print(embedding[0:5]) # Print first 5 dimensions of the embedding vector\n", + "\n", + "print(f\"Metrics for: {llm_embedding.metrics_store.id}\")\n", + "print(json.dumps(llm_embedding.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "0ab62eca", + "metadata": {}, + "source": [ + "## Details\n", + "\n", + "The batch utils start up `concurrency` number of threads in a thread pool and then push all requests into an input queue where free threads pick up the next request to process. The threads will process requests within any defined rate limits and retry any failed request according to the retry settings. If a request fails after all the retries the thread will capture the exception and return it. Thus the batch result may contain exceptions.\n" + ] + }, + { + "cell_type": "markdown", + "id": "005ee408", + "metadata": {}, + "source": [ + "## Thread Pool\n", + "\n", + "The batch utils are convenient if all your requests are loaded in memory. If you wish to stream over an input source then you can use the lower level thread pool utils.\n" + ] + }, + { + "cell_type": "markdown", + "id": "b4a6553c", + "metadata": {}, + "source": [ + "### Completion Thread Pool\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "05643c93", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "request_number_1: Succeeded\n", + "request_number_2: Succeeded\n", + "request_number_6: Succeeded\n", + "request_number_9: Succeeded\n", + "request_number_0: Succeeded\n", + "request_number_5: Succeeded\n", + "request_number_7: Succeeded\n", + "request_number_4: Succeeded\n", + "request_number_3: Succeeded\n", + "request_number_8: Succeeded\n", + "Metrics for: azure/gpt-4o\n", + "{\n", + " \"attempted_request_count\": 10,\n", + " \"successful_response_count\": 10,\n", + " \"failed_response_count\": 0,\n", + " \"failure_rate\": 0.0,\n", + " \"requests_with_retries\": 0,\n", + " \"retries\": 0,\n", + " \"retry_rate\": 0.0,\n", + " \"compute_duration_seconds\": 107.33663082122803,\n", + " \"compute_duration_per_response_seconds\": 10.733663082122803,\n", + " \"runtime_duration_seconds\": 0.04277801513671875,\n", + " \"cached_responses\": 10,\n", + " \"streaming_responses\": 0,\n", + " \"responses_with_tokens\": 10,\n", + " \"prompt_tokens\": 280,\n", + " \"completion_tokens\": 9240,\n", + " \"total_tokens\": 9520,\n", + " \"tokens_per_response\": 952.0,\n", + " \"responses_with_cost\": 10,\n", + " \"input_cost\": 0.0007,\n", + " \"output_cost\": 0.0924,\n", + " \"total_cost\": 0.0931,\n", + " \"cost_per_response\": 0.00931\n", + "}\n" + ] + } + ], + "source": [ + "from collections.abc import Iterator\n", + "\n", + "from graphrag_llm.types import LLMCompletionChunk, LLMCompletionResponse\n", + "\n", + "llm_completion.metrics_store.clear_metrics()\n", + "\n", + "\n", + "# The response handler may also be asynchronous if needed\n", + "def _handle_response(\n", + " request_id: str,\n", + " resp: LLMCompletionResponse | Iterator[LLMCompletionChunk] | Exception,\n", + "):\n", + " # Imagine streaming responses to disk or elsewhere\n", + " if isinstance(resp, Exception):\n", + " print(f\"{request_id}: Failed\")\n", + " else:\n", + " print(f\"{request_id}: Succeeded\")\n", + "\n", + "\n", + "with llm_completion.completion_thread_pool(\n", + " response_handler=_handle_response,\n", + " concurrency=25,\n", + " # set queue_limit to create backpressure on reading the requests\n", + " queue_limit=10,\n", + ") as completion:\n", + " # Iterating over a list of completion requests already in memory\n", + " # but can imagine reading them from disk or another source\n", + " # The completion function returned from the context manager\n", + " # will block if the queue_limit is reached until some requests complete\n", + " # and also requires a request_id for tracking the requests\n", + " # and allowing you to identify them in the response handler\n", + " for index, request in enumerate(completion_requests):\n", + " completion(request_id=f\"request_number_{index}\", **request)\n", + "\n", + "# Using the same request that was used in the caching example so\n", + "# this should complete instantly from cache\n", + "print(f\"Metrics for: {llm_completion.metrics_store.id}\")\n", + "print(json.dumps(llm_completion.metrics_store.get_metrics(), indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "6e254d56", + "metadata": {}, + "source": [ + "### Embedding Thread Pool\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7eed1a15", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "embedding_request_number_1: Succeeded\n", + "embedding_request_number_0: Succeeded\n" + ] + } + ], + "source": [ + "from graphrag_llm.types import LLMEmbeddingResponse\n", + "\n", + "llm_embedding.metrics_store.clear_metrics()\n", + "\n", + "\n", + "# The response handler may also be asynchronous if needed\n", + "def _handle_response(\n", + " request_id: str,\n", + " resp: LLMEmbeddingResponse | Exception,\n", + "):\n", + " if isinstance(resp, Exception):\n", + " print(f\"{request_id}: Failed\")\n", + " else:\n", + " print(f\"{request_id}: Succeeded\")\n", + "\n", + "\n", + "with llm_embedding.embedding_thread_pool(\n", + " response_handler=_handle_response,\n", + " concurrency=25,\n", + " queue_limit=10,\n", + ") as embedding:\n", + " for index, request in enumerate(embedding_requests):\n", + " embedding(request_id=f\"embedding_request_number_{index}\", **request)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/09_message_builder_and_history.ipynb b/packages/graphrag-llm/notebooks/09_message_builder_and_history.ipynb new file mode 100644 index 0000000000..acae5c7f2d --- /dev/null +++ b/packages/graphrag-llm/notebooks/09_message_builder_and_history.ipynb @@ -0,0 +1,199 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b22254c3", + "metadata": {}, + "source": [ + "# Message Builder\n", + "\n", + "The completion API adheres to litellm completion API and thus the OpanAI SDK API. The `messages` parameter can be one of the following:\n", + "\n", + "- `str`: Raw string for the prompt.\n", + "- `list[dict[str, Any]]`: A list of dicts in the form `{\"role\": \"user|system|...\", \"content\": \"...\"}`\n", + "- `list[ChatCompletionMessageParam]`: A list of OpenAI `ChatCompletionMessageParam`.\n", + "\n", + "`graphrag_llm.utils` provides a `ChatCompletionMessageParamBuilder` to help construct these objects. Below are examples of using the builder.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "553f83d9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Arrr, ye got me there, matey. Truth be, Pluto ain't considered a full-fledged planet no more. Back in 2006, them scallywags at the International Astronomical Union demoted it to a “dwarf planet.” So in the eyes of modern astronomers, 'tis a no.\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "from graphrag_llm.types import LLMCompletionResponse\n", + "from graphrag_llm.utils import (\n", + " CompletionMessagesBuilder,\n", + ")\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "\n", + "messages = (\n", + " CompletionMessagesBuilder()\n", + " .add_system_message(\n", + " \"You are a helpful assistant that likes to talk like a pirate. Respond as if you are a pirate using pirate speak.\"\n", + " )\n", + " .add_user_message(\"Is pluto a planet? Respond with a yes or no.\")\n", + " .add_assistant_message(\"Aye, matey! Pluto be a planet in me book.\")\n", + " .add_user_message(\"Are you sure? I want the truth. Can you elaborate?\")\n", + " .build()\n", + ")\n", + "\n", + "response: LLMCompletionResponse = llm_completion.completion(messages=messages) # type: ignore\n", + "\n", + "print(response.content)" + ] + }, + { + "cell_type": "markdown", + "id": "acb265fe", + "metadata": {}, + "source": [ + "## Other Message Types\n", + "\n", + "Can use the `ChatCompletionMessageParamBuilder` along with `ChatCompletionContentPartParamBuilder` to build more complicated messages such as those using images.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c7b094a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The image features a capybara floating in space. The backdrop displays a colorful and vibrant interstellar scene filled with nebulae and stars, showcasing various shades of blue, purple, pink, and green. The capybara is slightly tilted with its face foregrounded, giving a whimsical and surreal feel as if it is soaring through the cosmos.\n" + ] + } + ], + "source": [ + "from graphrag_llm.utils import CompletionContentPartBuilder\n", + "\n", + "messages = (\n", + " CompletionMessagesBuilder()\n", + " .add_user_message(\n", + " # Instead of providing a string we are providing content parts\n", + " # By using the CompletionContentPartBuilder\n", + " CompletionContentPartBuilder()\n", + " .add_text_part(\"Describe this image\")\n", + " .add_image_part(\n", + " # Can also be a base64 encoded image string\n", + " url=\"https://th.bing.com/th/id/OUG.0A10DBFCEB3A9A7C6707FCF6F0D96BFD?cb=ucfimg2&ucfimg=1&rs=1&pid=ImgDetMain&o=7&rm=3\",\n", + " detail=\"high\",\n", + " )\n", + " .build()\n", + " )\n", + " .build()\n", + ")\n", + "\n", + "response: LLMCompletionResponse = llm_completion.completion(messages=messages) # type: ignore\n", + "print(response.content)" + ] + }, + { + "cell_type": "markdown", + "id": "e8b9be3e", + "metadata": {}, + "source": [ + "## History\n", + "\n", + "The first example eluded to how the `ChatCompletionMessageParamBuilder` can be used to track history.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92abc427", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "User: Is Pluto a planet? Answer with a yes or no.\n", + "Assistant: No.\n", + "User: Can you elaborate?\n", + "Assistant: In 2006, the International Astronomical Union (IAU) redefined the criteria for classifying planets. According to this new definition, for an object to be considered a planet, it must:\n", + "\n", + "1. Orbit the Sun.\n", + "2. Be spherical in shape (have sufficient mass for its gravity to overcome rigid body forces so that it assumes a nearly round shape).\n", + "3. Have cleared its orbit of other debris.\n", + "\n", + "Pluto meets the first two criteria but does not meet the third criterion because it shares its orbit with other objects in the Kuiper Belt. Therefore, Pluto was reclassified as a \"dwarf planet.\"\n" + ] + } + ], + "source": [ + "user_messages = [\"Is Pluto a planet? Answer with a yes or no.\", \"Can you elaborate?\"]\n", + "\n", + "messages_builder = CompletionMessagesBuilder()\n", + "\n", + "for msg in user_messages:\n", + " print(f\"User: {msg}\")\n", + "\n", + " messages_builder.add_user_message(msg)\n", + "\n", + " response: LLMCompletionResponse = llm_completion.completion(\n", + " messages=messages_builder.build()\n", + " ) # type: ignore\n", + " print(f\"Assistant: {response.content}\")\n", + "\n", + " messages_builder.add_assistant_message(response.content)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/10_tool_calling.ipynb b/packages/graphrag-llm/notebooks/10_tool_calling.ipynb new file mode 100644 index 0000000000..8ebec94eb1 --- /dev/null +++ b/packages/graphrag-llm/notebooks/10_tool_calling.ipynb @@ -0,0 +1,387 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a56845b0", + "metadata": {}, + "source": [ + "# Function Tool Calling\n", + "\n", + "In order to use function tools, the completion endpoint needs a json schema of the function(s). This notebook uses `pydantic` to describe a function and its parameters and the `OpenAI` built-in `pydantic_function_tool` to create the necessary json schema. Other techniques may be used to create a definition for your functions.\n" + ] + }, + { + "cell_type": "markdown", + "id": "daf62482", + "metadata": {}, + "source": [ + "## Manual Function Tool Calling\n", + "\n", + "This example demonstrates function tool calling by manually using `pydantic` and `pydantic_function_tool`. See the next example for a simplified approach.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "53437ac4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adding 5 and 7 gives you 12.\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import json\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "from graphrag_llm.types import LLMCompletionResponse\n", + "from graphrag_llm.utils import (\n", + " CompletionMessagesBuilder,\n", + ")\n", + "from openai import pydantic_function_tool\n", + "from pydantic import BaseModel, ConfigDict, Field\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "\n", + "class AddTwoNumbers(BaseModel):\n", + " \"\"\"Input Argument for add two numbers.\"\"\"\n", + "\n", + " model_config = ConfigDict(\n", + " extra=\"forbid\",\n", + " )\n", + "\n", + " a: int = Field(description=\"The first number to add.\")\n", + " b: int = Field(description=\"The second number to add.\")\n", + "\n", + "\n", + "# The actual function\n", + "def add_two_numbers(options: AddTwoNumbers) -> int:\n", + " \"\"\"Add two numbers.\"\"\"\n", + " return options.a + options.b\n", + "\n", + "\n", + "add_definition = pydantic_function_tool(\n", + " AddTwoNumbers,\n", + " # Function name and description\n", + " name=\"my_add_two_numbers_function\",\n", + " description=\"Add two numbers.\",\n", + ")\n", + "\n", + "# Mapping of available functions\n", + "available_functions = {\n", + " \"my_add_two_numbers_function\": {\n", + " \"function\": add_two_numbers,\n", + " \"input_model\": AddTwoNumbers,\n", + " },\n", + "}\n", + "\n", + "messages_builder = CompletionMessagesBuilder().add_user_message(\n", + " \"Add 5 and 7 using a function call.\"\n", + ")\n", + "\n", + "response: LLMCompletionResponse = llm_completion.completion(\n", + " messages=messages_builder.build(),\n", + " tools=[add_definition],\n", + ") # type: ignore\n", + "\n", + "if not response.choices[0].message.tool_calls:\n", + " msg = \"No function call found in response.\"\n", + " raise ValueError(msg)\n", + "\n", + "# Add the assistant message with the function call to the message history\n", + "messages_builder.add_assistant_message(\n", + " message=response.choices[0].message,\n", + ")\n", + "\n", + "for tool_call in response.choices[0].message.tool_calls:\n", + " tool_id = tool_call.id\n", + " if tool_call.type != \"function\":\n", + " continue\n", + " function_name = tool_call.function.name\n", + " function_args = tool_call.function.arguments\n", + "\n", + " args_dict = json.loads(function_args)\n", + "\n", + " InputModel = available_functions[function_name][\"input_model\"]\n", + " function = available_functions[function_name][\"function\"]\n", + " input_options = InputModel(**args_dict)\n", + "\n", + " result = function(input_options)\n", + "\n", + " messages_builder.add_tool_message(\n", + " content=str(result),\n", + " tool_call_id=tool_id,\n", + " )\n", + "\n", + "final_response: LLMCompletionResponse = llm_completion.completion(\n", + " messages=messages_builder.build(),\n", + ") # type: ignore\n", + "print(final_response.content)" + ] + }, + { + "cell_type": "markdown", + "id": "b31c7a9c", + "metadata": {}, + "source": [ + "### Function Tool Definition\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "eb6950e8", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"type\": \"function\",\n", + " \"function\": {\n", + " \"name\": \"my_add_two_numbers_function\",\n", + " \"strict\": true,\n", + " \"parameters\": {\n", + " \"additionalProperties\": false,\n", + " \"description\": \"Input Argument for add two numbers.\",\n", + " \"properties\": {\n", + " \"a\": {\n", + " \"description\": \"The first number to add.\",\n", + " \"title\": \"A\",\n", + " \"type\": \"integer\"\n", + " },\n", + " \"b\": {\n", + " \"description\": \"The second number to add.\",\n", + " \"title\": \"B\",\n", + " \"type\": \"integer\"\n", + " }\n", + " },\n", + " \"required\": [\n", + " \"a\",\n", + " \"b\"\n", + " ],\n", + " \"title\": \"AddTwoNumbers\",\n", + " \"type\": \"object\"\n", + " },\n", + " \"description\": \"Add two numbers.\"\n", + " }\n", + "}\n" + ] + } + ], + "source": [ + "# View the output schema\n", + "# This is what is passed to the completion tools param\n", + "# Created using pydantic and pydantic_function_tool\n", + "# but may be created manually as well\n", + "print(json.dumps(add_definition, indent=2))" + ] + }, + { + "cell_type": "markdown", + "id": "660de4c9", + "metadata": {}, + "source": [ + "## Tool Calling with FunctionToolManager\n", + "\n", + "If using `pydantic` to describe function arguments, you can use the `FunctionToolManager` to register functions, produce defintions, and call functions in response to the LLM. This helps automate some of the above work.\n", + "\n", + "The following example demonstrates calling multiple functions in one LLM call.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4fae701e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adding numbers: 3 8\n", + "Multiplying numbers: 9 5\n", + "Reversing text: GraphRAG\n", + "3 + 8 is 11, 9 * 5 is 45, and the reversed string 'GraphRAG' is 'GARhparG'.\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import AuthMethod, ModelConfig\n", + "from graphrag_llm.types import LLMCompletionResponse\n", + "from graphrag_llm.utils import (\n", + " CompletionMessagesBuilder,\n", + " FunctionToolManager,\n", + ")\n", + "from pydantic import BaseModel, ConfigDict, Field\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "\n", + "class NumbersInput(BaseModel):\n", + " \"\"\"Numbers input.\"\"\"\n", + "\n", + " model_config = ConfigDict(\n", + " extra=\"forbid\",\n", + " )\n", + "\n", + " a: int = Field(description=\"The first number.\")\n", + " b: int = Field(description=\"The second number.\")\n", + "\n", + "\n", + "def add(options: NumbersInput) -> str:\n", + " \"\"\"Add two numbers.\"\"\"\n", + " # Print something to ensure function is called for verification\n", + " print(\"Adding numbers:\", options.a, options.b)\n", + " return str(options.a + options.b)\n", + "\n", + "\n", + "def multiply(options: NumbersInput) -> str:\n", + " \"\"\"Multiply two numbers.\"\"\"\n", + " # Print something to ensure function is called for verification\n", + " print(\"Multiplying numbers:\", options.a, options.b)\n", + " return str(options.a * options.b)\n", + "\n", + "\n", + "class TextInput(BaseModel):\n", + " \"\"\"Text input.\"\"\"\n", + "\n", + " model_config = ConfigDict(\n", + " extra=\"forbid\",\n", + " )\n", + "\n", + " test: str = Field(description=\"The string to reverse.\")\n", + "\n", + "\n", + "def reverse_text(options: TextInput) -> str:\n", + " \"\"\"Reverse a string.\"\"\"\n", + " # Print something to ensure function is called for verification\n", + " print(\"Reversing text:\", options.test)\n", + " return options.test[::-1]\n", + "\n", + "\n", + "function_tool_manager = FunctionToolManager()\n", + "\n", + "function_tool_manager.register_function_tool(\n", + " name=\"add\",\n", + " description=\"Add two numbers.\",\n", + " function=add,\n", + " input_model=NumbersInput,\n", + ")\n", + "function_tool_manager.register_function_tool(\n", + " name=\"multiply\",\n", + " description=\"Multiply two numbers.\",\n", + " function=multiply,\n", + " input_model=NumbersInput,\n", + ")\n", + "function_tool_manager.register_function_tool(\n", + " name=\"reverse_text\",\n", + " description=\"Reverse a string.\",\n", + " function=reverse_text,\n", + " input_model=TextInput,\n", + ")\n", + "\n", + "\n", + "messages_builder = CompletionMessagesBuilder().add_user_message(\n", + " \"What is 3 + 8 and 9 * 5? Also, reverse the string 'GraphRAG'.\"\n", + ")\n", + "\n", + "# Multiple tool calls in parallel\n", + "response: LLMCompletionResponse = llm_completion.completion(\n", + " messages=messages_builder.build(),\n", + " tools=function_tool_manager.definitions(),\n", + " parallel_tool_calls=True,\n", + ") # type: ignore\n", + "\n", + "# Add the assistant message with the function call to the message history\n", + "messages_builder.add_assistant_message(\n", + " message=response.choices[0].message,\n", + ")\n", + "\n", + "tool_results = function_tool_manager.call_functions(response)\n", + "\n", + "for tool_message in tool_results:\n", + " messages_builder.add_tool_message(**tool_message)\n", + "\n", + "final_response: LLMCompletionResponse = llm_completion.completion(\n", + " messages=messages_builder.build(),\n", + ") # type: ignore\n", + "print(final_response.content)" + ] + }, + { + "cell_type": "markdown", + "id": "b2d36f7a", + "metadata": {}, + "source": [ + "## MCP Tools\n", + "\n", + "**Not currently supported**. `graphrag_llm` currently only implements the `completion` endpoints which do not support MCP tools.\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/11_templating.ipynb b/packages/graphrag-llm/notebooks/11_templating.ipynb new file mode 100644 index 0000000000..bfee940c53 --- /dev/null +++ b/packages/graphrag-llm/notebooks/11_templating.ipynb @@ -0,0 +1,149 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6945138b", + "metadata": {}, + "source": [ + "# Templating\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3322e6a7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The rendered message to parse: \n", + "It is sunny and 52 degrees fahrenheit in Seattle.\n", + "\n", + "It is cloudy and 75 degrees fahrenheit in San Francisco.\n", + "\n", + "City: Seattle\n", + " Temperature: 11.1 °C\n", + " Condition: Sunny\n", + "City: San Francisco\n", + " Temperature: 23.9 °C\n", + " Condition: Cloudy\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import os\n", + "\n", + "from dotenv import load_dotenv\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import (\n", + " AuthMethod,\n", + " ModelConfig,\n", + " TemplateEngineConfig,\n", + " TemplateEngineType,\n", + " TemplateManagerType,\n", + ")\n", + "from graphrag_llm.templating import create_template_engine\n", + "from graphrag_llm.types import LLMCompletionResponse\n", + "from pydantic import BaseModel, Field\n", + "\n", + "load_dotenv()\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " model_provider=\"azure\",\n", + " model=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " azure_deployment_name=os.getenv(\"GRAPHRAG_MODEL\", \"gpt-4o\"),\n", + " api_base=os.getenv(\"GRAPHRAG_API_BASE\"),\n", + " api_version=os.getenv(\"GRAPHRAG_API_VERSION\", \"2025-04-01-preview\"),\n", + " api_key=api_key,\n", + " auth_method=AuthMethod.AzureManagedIdentity if not api_key else AuthMethod.ApiKey,\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "\n", + "template_engine = create_template_engine()\n", + "\n", + "# The above default is the same as the following configuration:\n", + "template_engine = create_template_engine(\n", + " TemplateEngineConfig(\n", + " type=TemplateEngineType.Jinja,\n", + " template_manager=TemplateManagerType.File,\n", + " base_dir=\"templates\",\n", + " template_extension=\".jinja\",\n", + " encoding=\"utf-8\",\n", + " )\n", + ")\n", + "\n", + "msg = template_engine.render(\n", + " # Name of the template file without extension\n", + " template_name=\"weather_listings\",\n", + " # Values to fill in the template\n", + " context={\n", + " \"weather_reports\": [\n", + " {\"city\": \"Seattle\", \"temperature_f\": 52, \"condition\": \"sunny\"},\n", + " {\"city\": \"San Francisco\", \"temperature_f\": 75, \"condition\": \"cloudy\"},\n", + " ]\n", + " },\n", + ")\n", + "\n", + "\n", + "print(f\"The rendered message to parse: {msg}\")\n", + "\n", + "\n", + "# Structured response parsing using pydantic\n", + "class LocalWeather(BaseModel):\n", + " \"\"\"City weather information model.\"\"\"\n", + "\n", + " city: str = Field(description=\"The name of the city\")\n", + " temperature: float = Field(description=\"The temperature in Celsius\")\n", + " condition: str = Field(description=\"The weather condition description\")\n", + "\n", + "\n", + "class WeatherReports(BaseModel):\n", + " \"\"\"Weather information model.\"\"\"\n", + "\n", + " reports: list[LocalWeather] = Field(\n", + " description=\"The weather reports for multiple cities\"\n", + " )\n", + "\n", + "\n", + "response: LLMCompletionResponse[WeatherReports] = llm_completion.completion(\n", + " messages=msg,\n", + " response_format=WeatherReports,\n", + ") # type: ignore\n", + "\n", + "local_weather_reports: WeatherReports = response.formatted_response # type: ignore\n", + "for report in local_weather_reports.reports:\n", + " print(f\"City: {report.city}\")\n", + " print(f\" Temperature: {report.temperature} °C\")\n", + " print(f\" Condition: {report.condition}\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/12_mocking.ipynb b/packages/graphrag-llm/notebooks/12_mocking.ipynb new file mode 100644 index 0000000000..6cee72f293 --- /dev/null +++ b/packages/graphrag-llm/notebooks/12_mocking.ipynb @@ -0,0 +1,164 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9418b981", + "metadata": {}, + "source": [ + "# Mocking\n" + ] + }, + { + "cell_type": "markdown", + "id": "1d000d70", + "metadata": {}, + "source": [ + "## Completions\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "792c4fa3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Who cares?\n", + "You tell me!\n", + "{\"reports\":[{\"city\":\"New York\",\"temperature\":22.5,\"condition\":\"Sunny\"}]}\n", + "Who cares?\n" + ] + } + ], + "source": [ + "# Copyright (c) 2024 Microsoft Corporation.\n", + "# Licensed under the MIT License\n", + "\n", + "import os\n", + "\n", + "from graphrag_llm.completion import LLMCompletion, create_completion\n", + "from graphrag_llm.config import LLMProviderType, ModelConfig\n", + "from graphrag_llm.types import LLMCompletionResponse\n", + "from pydantic import BaseModel, Field\n", + "\n", + "\n", + "class LocalWeather(BaseModel):\n", + " \"\"\"City weather information model.\"\"\"\n", + "\n", + " city: str = Field(description=\"The name of the city\")\n", + " temperature: float = Field(description=\"The temperature in Celsius\")\n", + " condition: str = Field(description=\"The weather condition description\")\n", + "\n", + "\n", + "class WeatherReports(BaseModel):\n", + " \"\"\"Weather information model.\"\"\"\n", + "\n", + " reports: list[LocalWeather] = Field(\n", + " description=\"The weather reports for multiple cities\"\n", + " )\n", + "\n", + "\n", + "weather_reports = WeatherReports(\n", + " reports=[\n", + " LocalWeather(city=\"New York\", temperature=22.5, condition=\"Sunny\"),\n", + " ]\n", + ")\n", + "\n", + "api_key = os.getenv(\"GRAPHRAG_API_KEY\")\n", + "model_config = ModelConfig(\n", + " type=LLMProviderType.MockLLM,\n", + " model_provider=\"openai\",\n", + " model=\"gpt-4o\",\n", + " mock_responses=[\"Who cares?\", \"You tell me!\", weather_reports.model_dump_json()],\n", + ")\n", + "llm_completion: LLMCompletion = create_completion(model_config)\n", + "\n", + "response: LLMCompletionResponse = llm_completion.completion(\n", + " messages=\"What is the capital of France?\",\n", + ") # type: ignore\n", + "\n", + "print(response.content)\n", + "\n", + "response: LLMCompletionResponse = llm_completion.completion(\n", + " messages=\"Should be second response\",\n", + ") # type: ignore\n", + "print(response.content)\n", + "\n", + "response_formatted: LLMCompletionResponse[WeatherReports] = llm_completion.completion(\n", + " messages=\"Structured response.\",\n", + " response_format=WeatherReports,\n", + ") # type: ignore\n", + "print(response_formatted.formatted_response.model_dump_json()) # type: ignore\n", + "\n", + "response: LLMCompletionResponse = llm_completion.completion(\n", + " messages=\"Should cycle back to first response\",\n", + ") # type: ignore\n", + "print(response.content)" + ] + }, + { + "cell_type": "markdown", + "id": "2c8f1b7a", + "metadata": {}, + "source": [ + "## Embeddings\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6eec6dc3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1.0, 2.0, 3.0]\n", + "[1.0, 2.0, 3.0]\n" + ] + } + ], + "source": [ + "from graphrag_llm.embedding import LLMEmbedding, create_embedding\n", + "\n", + "embedding_config = ModelConfig(\n", + " type=LLMProviderType.MockLLM,\n", + " model_provider=\"openai\",\n", + " model=\"text-embedding-3-small\",\n", + " mock_responses=[1.0, 2.0, 3.0],\n", + ")\n", + "\n", + "llm_embedding: LLMEmbedding = create_embedding(embedding_config)\n", + "\n", + "embeddings_response = llm_embedding.embedding(input=[\"Hello world\", \"How are you?\"])\n", + "for embedding in embeddings_response.embeddings:\n", + " print(embedding[0:3])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.9" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/packages/graphrag-llm/notebooks/README.md b/packages/graphrag-llm/notebooks/README.md new file mode 100644 index 0000000000..0496ddc6aa --- /dev/null +++ b/packages/graphrag-llm/notebooks/README.md @@ -0,0 +1,11 @@ +To run the notebooks you need to add a `.env` file to the `notebooks` directory with the following information + +``` +GRAPHRAG_MODEL="..." +GRAPHRAG_EMBEDDING_MODEL="..." +GRAPHRAG_API_BASE="..." +# API Key and version are optional +# If not provided, Azure managed identity will be used +GRAPHRAG_API_KEY="..." +GRAPHRAG_API_VERSION="..." +``` \ No newline at end of file diff --git a/packages/graphrag-llm/notebooks/templates/weather_listings.jinja b/packages/graphrag-llm/notebooks/templates/weather_listings.jinja new file mode 100644 index 0000000000..b3f083dea8 --- /dev/null +++ b/packages/graphrag-llm/notebooks/templates/weather_listings.jinja @@ -0,0 +1,3 @@ +{% for report in weather_reports %} +It is {{report.condition}} and {{report.temperature_f}} degrees fahrenheit in {{report.city}}. +{% endfor %} \ No newline at end of file diff --git a/packages/graphrag-llm/pyproject.toml b/packages/graphrag-llm/pyproject.toml new file mode 100644 index 0000000000..b10639a702 --- /dev/null +++ b/packages/graphrag-llm/pyproject.toml @@ -0,0 +1,46 @@ +[project] +name = "graphrag-llm" +version = "2.7.1" +description = "GraphRAG LLM package." +authors = [ + {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, + {name = "Andrés Morales Esquivel", email = "andresmor@microsoft.com"}, + {name = "Chris Trevino", email = "chtrevin@microsoft.com"}, + {name = "David Tittsworth", email = "datittsw@microsoft.com"}, + {name = "Dayenne de Souza", email = "ddesouza@microsoft.com"}, + {name = "Derek Worthen", email = "deworthe@microsoft.com"}, + {name = "Gaudy Blanco Meneses", email = "gaudyb@microsoft.com"}, + {name = "Ha Trinh", email = "trinhha@microsoft.com"}, + {name = "Jonathan Larson", email = "jolarso@microsoft.com"}, + {name = "Josh Bradley", email = "joshbradley@microsoft.com"}, + {name = "Kate Lytvynets", email = "kalytv@microsoft.com"}, + {name = "Kenny Zhang", email = "zhangken@microsoft.com"}, + {name = "Mónica Carvajal"}, + {name = "Nathan Evans", email = "naevans@microsoft.com"}, + {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, + {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, +] +license = "MIT" +readme = "README.md" +license-files = ["LICENSE"] +requires-python = ">=3.10,<3.13" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +dependencies = [ + "azure-identity~=1.19.0", + "graphrag-cache==2.7.1", + "graphrag-common==2.7.1", + "jinja2~=3.1", + "litellm~=1.80", + "nest-asyncio2~=1.7", + "pydantic~=2.10", + "typing-extensions~=4.12" +] + +[build-system] +requires = ["hatchling>=1.27.0,<2.0.0"] +build-backend = "hatchling.build" diff --git a/packages/graphrag-storage/README.md b/packages/graphrag-storage/README.md new file mode 100644 index 0000000000..d190130f19 --- /dev/null +++ b/packages/graphrag-storage/README.md @@ -0,0 +1,92 @@ +# GraphRAG Storage + +This package provides a unified storage abstraction layer with support for multiple backends including file system, Azure Blob, Azure Cosmos, and memory storage. It features a factory-based creation system with configuration-driven setup and extensible architecture for implementing custom storage providers. + +## Basic + +This example creates a file storage system using the GraphRAG storage package's configuration system. The example shows setting up file storage in a specified directory and demonstrates basic storage operations like setting and getting key-value pairs. + +```python +import asyncio +from graphrag_storage import StorageConfig, create_storage, StorageType + +async def run(): + storage = create_storage( + StorageConfig( + type=StorageType.File + base_dir="output" + ) + ) + + await storage.set("my_key", "value") + print(await storage.get("my_key")) + +if __name__ == "__main__": + asyncio.run(run()) +``` + +## Custom Storage + +Here we create a custom storage implementation by extending the base Storage class and registering it with the GraphRAG storage system. Once registered, the custom storage can be instantiated through the factory pattern using either StorageConfig or directly via storage_factory, enabling extensible storage solutions for different backends. + +```python +import asyncio +from typing import Any +from graphrag_storage import Storage, StorageConfig, create_storage, register_storage + +class MyStorage(Storage): + def __init__(self, some_setting: str, optional_setting: str = "default setting", **kwargs: Any): + # Validate settings and initialize + ... + + #Implement rest of interface + ... + +register_storage("MyStorage", MyStorage) + +async def run(): + storage = create_storage( + StorageConfig( + type="MyStorage" + some_setting="My Setting" + ) + ) + # Or use the factory directly to instantiate with a dict instead of using + # StorageConfig + create_factory + # from graphrag_storage.storage_factory import storage_factory + # storage = storage_factory.create(strategy="MyStorage", init_args={"some_setting": "My Setting"}) + + await storage.set("my_key", "value") + print(await storage.get("my_key")) + +if __name__ == "__main__": + asyncio.run(run()) +``` + +## Details + +By default, the `create_storage` comes with the following storage providers registered that correspond to the entries in the `StorageType` enum. + +- `FileStorage` +- `AzureBlobStorage` +- `AzureCosmosStorage` +- `MemoryStorage` + +The preregistration happens dynamically, e.g., `FileStorage` is only imported and registered if you request a `FileStorage` with `create_storage(StorageType.File, ...)`. There is no need to manually import and register builtin storage providers when using `create_storage`. + +If you want a clean factory with no preregistered storage providers then directly import `storage_factory` and bypass using `create_storage`. The downside is that `storage_factory.create` uses a dict for init args instead of the strongly typed `StorageConfig` used with `create_storage`. + +```python +from graphrag_storage.storage_factory import storage_factory +from graphrag_storage.file_storage import FileStorage + +# storage_factory has no preregistered providers so you must register any +# providers you plan on using. +# May also register a custom implementation, see above for example. +storage_factory.register("my_storage_key", FileStorage) + +storage = storage_factory.create(strategy="my_storage_key", init_args={"base_dir": "...", "other_settings": "..."}) + +... + +``` \ No newline at end of file diff --git a/packages/graphrag-storage/graphrag_storage/__init__.py b/packages/graphrag-storage/graphrag_storage/__init__.py new file mode 100644 index 0000000000..2ae67be741 --- /dev/null +++ b/packages/graphrag-storage/graphrag_storage/__init__.py @@ -0,0 +1,20 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The GraphRAG Storage package.""" + +from graphrag_storage.storage import Storage +from graphrag_storage.storage_config import StorageConfig +from graphrag_storage.storage_factory import ( + create_storage, + register_storage, +) +from graphrag_storage.storage_type import StorageType + +__all__ = [ + "Storage", + "StorageConfig", + "StorageType", + "create_storage", + "register_storage", +] diff --git a/graphrag/storage/blob_pipeline_storage.py b/packages/graphrag-storage/graphrag_storage/azure_blob_storage.py similarity index 51% rename from graphrag/storage/blob_pipeline_storage.py rename to packages/graphrag-storage/graphrag_storage/azure_blob_storage.py index 2a5ba8c41f..68cca2c017 100644 --- a/graphrag/storage/blob_pipeline_storage.py +++ b/packages/graphrag-storage/graphrag_storage/azure_blob_storage.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""Azure Blob Storage implementation of PipelineStorage.""" +"""Azure Blob Storage implementation of Storage.""" import logging import re @@ -12,64 +12,68 @@ from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient -from graphrag.storage.pipeline_storage import ( - PipelineStorage, +from graphrag_storage.storage import ( + Storage, get_timestamp_formatted_with_local_tz, ) logger = logging.getLogger(__name__) -class BlobPipelineStorage(PipelineStorage): +class AzureBlobStorage(Storage): """The Blob-Storage implementation.""" _connection_string: str | None _container_name: str - _path_prefix: str + _base_dir: str | None _encoding: str - _storage_account_blob_url: str | None + _account_url: str | None + _blob_service_client: BlobServiceClient + _storage_account_name: str | None - def __init__(self, **kwargs: Any) -> None: + def __init__( + self, + container_name: str, + account_url: str | None = None, + connection_string: str | None = None, + base_dir: str | None = None, + encoding: str = "utf-8", + **kwargs: Any, + ) -> None: """Create a new BlobStorage instance.""" - connection_string = kwargs.get("connection_string") - storage_account_blob_url = kwargs.get("storage_account_blob_url") - path_prefix = kwargs.get("base_dir") - container_name = kwargs["container_name"] - if container_name is None: - msg = "No container name provided for blob storage." - raise ValueError(msg) - if connection_string is None and storage_account_blob_url is None: - msg = "No storage account blob url provided for blob storage." + if connection_string is not None and account_url is not None: + msg = "AzureBlobStorage requires only one of connection_string or account_url to be specified, not both." + logger.error(msg) raise ValueError(msg) - logger.info("Creating blob storage at %s", container_name) + _validate_blob_container_name(container_name) + + logger.info( + "Creating blob storage at [%s] and base_dir [%s]", + container_name, + base_dir, + ) if connection_string: self._blob_service_client = BlobServiceClient.from_connection_string( connection_string ) - else: - if storage_account_blob_url is None: - msg = "Either connection_string or storage_account_blob_url must be provided." - raise ValueError(msg) - + elif account_url: self._blob_service_client = BlobServiceClient( - account_url=storage_account_blob_url, + account_url=account_url, credential=DefaultAzureCredential(), ) - self._encoding = kwargs.get("encoding", "utf-8") + else: + msg = "AzureBlobStorage requires either a connection_string or account_url to be specified." + logger.error(msg) + raise ValueError(msg) + + self._encoding = encoding self._container_name = container_name self._connection_string = connection_string - self._path_prefix = path_prefix or "" - self._storage_account_blob_url = storage_account_blob_url + self._base_dir = base_dir + self._account_url = account_url self._storage_account_name = ( - storage_account_blob_url.split("//")[1].split(".")[0] - if storage_account_blob_url - else None - ) - logger.debug( - "creating blob storage at container=%s, path=%s", - self._container_name, - self._path_prefix, + account_url.split("//")[1].split(".")[0] if account_url else None ) self._create_container() @@ -82,6 +86,7 @@ def _create_container(self) -> None: for container in self._blob_service_client.list_containers() ] if container_name not in container_names: + logger.debug("Creating new container [%s]", container_name) self._blob_service_client.create_container(container_name) def _delete_container(self) -> None: @@ -100,85 +105,63 @@ def _container_exists(self) -> bool: def find( self, file_pattern: re.Pattern[str], - base_dir: str | None = None, - file_filter: dict[str, Any] | None = None, - max_count=-1, - ) -> Iterator[tuple[str, dict[str, Any]]]: - """Find blobs in a container using a file pattern, as well as a custom filter function. + ) -> Iterator[str]: + """Find blobs in a container using a file pattern. Params: - base_dir: The name of the base container. file_pattern: The file pattern to use. - file_filter: A dictionary of key-value pairs to filter the blobs. - max_count: The maximum number of blobs to return. If -1, all blobs are returned. Returns ------- An iterator of blob names and their corresponding regex matches. """ - base_dir = base_dir or "" - logger.info( - "search container %s for files matching %s", + "Search container [%s] in base_dir [%s] for files matching [%s]", self._container_name, + self._base_dir, file_pattern.pattern, ) def _blobname(blob_name: str) -> str: - if blob_name.startswith(self._path_prefix): - blob_name = blob_name.replace(self._path_prefix, "", 1) + if self._base_dir and blob_name.startswith(self._base_dir): + blob_name = blob_name.replace(self._base_dir, "", 1) if blob_name.startswith("/"): blob_name = blob_name[1:] return blob_name - def item_filter(item: dict[str, Any]) -> bool: - if file_filter is None: - return True - - return all( - re.search(value, item[key]) for key, value in file_filter.items() - ) - try: container_client = self._blob_service_client.get_container_client( self._container_name ) - all_blobs = list(container_client.list_blobs()) - + all_blobs = list(container_client.list_blobs(self._base_dir)) + logger.debug("All blobs: %s", [blob.name for blob in all_blobs]) num_loaded = 0 num_total = len(list(all_blobs)) num_filtered = 0 for blob in all_blobs: match = file_pattern.search(blob.name) - if match and blob.name.startswith(base_dir): - group = match.groupdict() - if item_filter(group): - yield (_blobname(blob.name), group) - num_loaded += 1 - if max_count > 0 and num_loaded >= max_count: - break - else: - num_filtered += 1 + if match: + yield _blobname(blob.name) + num_loaded += 1 else: num_filtered += 1 - logger.debug( - "Blobs loaded: %d, filtered: %d, total: %d", - num_loaded, - num_filtered, - num_total, - ) + logger.debug( + "Blobs loaded: %d, filtered: %d, total: %d", + num_loaded, + num_filtered, + num_total, + ) except Exception: # noqa: BLE001 logger.warning( - "Error finding blobs: base_dir=%s, file_pattern=%s, file_filter=%s", - base_dir, + "Error finding blobs: base_dir=%s, file_pattern=%s", + self._base_dir, file_pattern, - file_filter, ) async def get( self, key: str, as_bytes: bool | None = False, encoding: str | None = None ) -> Any: - """Get a value from the cache.""" + """Get a value from the blob.""" try: key = self._keyname(key) container_client = self._blob_service_client.get_container_client( @@ -196,7 +179,7 @@ async def get( return blob_data async def set(self, key: str, value: Any, encoding: str | None = None) -> None: - """Set a value in the cache.""" + """Set a value in the blob.""" try: key = self._keyname(key) container_client = self._blob_service_client.get_container_client( @@ -211,46 +194,8 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: except Exception: logger.exception("Error setting key %s: %s", key) - def _set_df_json(self, key: str, dataframe: Any) -> None: - """Set a json dataframe.""" - if self._connection_string is None and self._storage_account_name: - dataframe.to_json( - self._abfs_url(key), - storage_options={ - "account_name": self._storage_account_name, - "credential": DefaultAzureCredential(), - }, - orient="records", - lines=True, - force_ascii=False, - ) - else: - dataframe.to_json( - self._abfs_url(key), - storage_options={"connection_string": self._connection_string}, - orient="records", - lines=True, - force_ascii=False, - ) - - def _set_df_parquet(self, key: str, dataframe: Any) -> None: - """Set a parquet dataframe.""" - if self._connection_string is None and self._storage_account_name: - dataframe.to_parquet( - self._abfs_url(key), - storage_options={ - "account_name": self._storage_account_name, - "credential": DefaultAzureCredential(), - }, - ) - else: - dataframe.to_parquet( - self._abfs_url(key), - storage_options={"connection_string": self._connection_string}, - ) - async def has(self, key: str) -> bool: - """Check if a key exists in the cache.""" + """Check if a key exists in the blob.""" key = self._keyname(key) container_client = self._blob_service_client.get_container_client( self._container_name @@ -259,7 +204,7 @@ async def has(self, key: str) -> bool: return blob_client.exists() async def delete(self, key: str) -> None: - """Delete a key from the cache.""" + """Delete a key from the blob.""" key = self._keyname(key) container_client = self._blob_service_client.get_container_client( self._container_name @@ -270,17 +215,17 @@ async def delete(self, key: str) -> None: async def clear(self) -> None: """Clear the cache.""" - def child(self, name: str | None) -> "PipelineStorage": + def child(self, name: str | None) -> "Storage": """Create a child storage instance.""" if name is None: return self - path = str(Path(self._path_prefix) / name) - return BlobPipelineStorage( + path = str(Path(self._base_dir) / name) if self._base_dir else name + return AzureBlobStorage( connection_string=self._connection_string, container_name=self._container_name, encoding=self._encoding, base_dir=path, - storage_account_blob_url=self._storage_account_blob_url, + account_url=self._account_url, ) def keys(self) -> list[str]: @@ -290,15 +235,10 @@ def keys(self) -> list[str]: def _keyname(self, key: str) -> str: """Get the key name.""" - return str(Path(self._path_prefix) / key) - - def _abfs_url(self, key: str) -> str: - """Get the ABFS URL.""" - path = str(Path(self._container_name) / self._path_prefix / key) - return f"abfs://{path}" + return str(Path(self._base_dir) / key) if self._base_dir else key async def get_creation_date(self, key: str) -> str: - """Get a value from the cache.""" + """Get creation date for the blob.""" try: key = self._keyname(key) container_client = self._blob_service_client.get_container_client( @@ -312,7 +252,7 @@ async def get_creation_date(self, key: str) -> str: return "" -def validate_blob_container_name(container_name: str): +def _validate_blob_container_name(container_name: str) -> None: """ Check if the provided blob container name is valid based on Azure rules. @@ -332,34 +272,7 @@ def validate_blob_container_name(container_name: str): ------- bool: True if valid, False otherwise. """ - # Check the length of the name - if len(container_name) < 3 or len(container_name) > 63: - return ValueError( - f"Container name must be between 3 and 63 characters in length. Name provided was {len(container_name)} characters long." - ) - - # Check if the name starts with a letter or number - if not container_name[0].isalnum(): - return ValueError( - f"Container name must start with a letter or number. Starting character was {container_name[0]}." - ) - - # Check for valid characters (letters, numbers, hyphen) and lowercase letters - if not re.match(r"^[a-z0-9-]+$", container_name): - return ValueError( - f"Container name must only contain:\n- lowercase letters\n- numbers\n- or hyphens\nName provided was {container_name}." - ) - - # Check for consecutive hyphens - if "--" in container_name: - return ValueError( - f"Container name cannot contain consecutive hyphens. Name provided was {container_name}." - ) - - # Check for hyphens at the end of the name - if container_name[-1] == "-": - return ValueError( - f"Container name cannot end with a hyphen. Name provided was {container_name}." - ) - - return True + # Match alphanumeric or single hyphen not at the start or end, repeated 3-63 times. + if not re.match(r"^(?:[0-9a-z]|(? None: + def __init__( + self, + database_name: str, + container_name: str, + connection_string: str | None = None, + account_url: str | None = None, + encoding: str = "utf-8", + **kwargs: Any, + ) -> None: """Create a CosmosDB storage instance.""" logger.info("Creating cosmosdb storage") - cosmosdb_account_url = kwargs.get("cosmosdb_account_url") - connection_string = kwargs.get("connection_string") - database_name = kwargs["base_dir"] - container_name = kwargs["container_name"] - if not database_name: - msg = "No base_dir provided for database name" + database_name = database_name + if database_name is None: + msg = "CosmosDB Storage requires a base_dir to be specified. This is used as the database name." + logger.error(msg) raise ValueError(msg) - if connection_string is None and cosmosdb_account_url is None: - msg = "connection_string or cosmosdb_account_url is required." + + if connection_string is not None and account_url is not None: + msg = "CosmosDB Storage requires either a connection_string or cosmosdb_account_url to be specified, not both." + logger.error(msg) raise ValueError(msg) if connection_string: self._cosmos_client = CosmosClient.from_connection_string(connection_string) - else: - if cosmosdb_account_url is None: - msg = ( - "Either connection_string or cosmosdb_account_url must be provided." - ) - raise ValueError(msg) + elif account_url: self._cosmos_client = CosmosClient( - url=cosmosdb_account_url, + url=account_url, credential=DefaultAzureCredential(), ) - self._encoding = kwargs.get("encoding", "utf-8") + else: + msg = "CosmosDB Storage requires either a connection_string or cosmosdb_account_url to be specified." + logger.error(msg) + raise ValueError(msg) + + self._encoding = encoding self._database_name = database_name self._connection_string = connection_string - self._cosmosdb_account_url = cosmosdb_account_url + self._cosmosdb_account_url = account_url self._container_name = container_name self._cosmosdb_account_name = ( - cosmosdb_account_url.split("//")[1].split(".")[0] - if cosmosdb_account_url - else None + account_url.split("//")[1].split(".")[0] if account_url else None ) self._no_id_prefixes = [] logger.debug( - "creating cosmosdb storage with account: %s and database: %s and container: %s", + "Creating cosmosdb storage with account [%s] and database [%s] and container [%s]", self._cosmosdb_account_name, self._database_name, self._container_name, @@ -120,48 +126,30 @@ def _delete_container(self) -> None: def find( self, file_pattern: re.Pattern[str], - base_dir: str | None = None, - file_filter: dict[str, Any] | None = None, - max_count=-1, - ) -> Iterator[tuple[str, dict[str, Any]]]: - """Find documents in a Cosmos DB container using a file pattern regex and custom file filter (optional). + ) -> Iterator[str]: + """Find documents in a Cosmos DB container using a file pattern regex. Params: - base_dir: The name of the base directory (not used in Cosmos DB context). file_pattern: The file pattern to use. - file_filter: A dictionary of key-value pairs to filter the documents. - max_count: The maximum number of documents to return. If -1, all documents are returned. Returns ------- An iterator of document IDs and their corresponding regex matches. """ - base_dir = base_dir or "" logger.info( - "search container %s for documents matching %s", + "Search container [%s] for documents matching [%s]", self._container_name, file_pattern.pattern, ) if not self._database_client or not self._container_client: return - def item_filter(item: dict[str, Any]) -> bool: - if file_filter is None: - return True - return all( - re.search(value, item.get(key, "")) - for key, value in file_filter.items() - ) - try: query = "SELECT * FROM c WHERE RegexMatch(c.id, @pattern)" parameters: list[dict[str, Any]] = [ {"name": "@pattern", "value": file_pattern.pattern} ] - if file_filter: - for key, value in file_filter.items(): - query += f" AND c.{key} = @{key}" - parameters.append({"name": f"@{key}", "value": value}) + items = list( self._container_client.query_items( query=query, @@ -169,6 +157,7 @@ def item_filter(item: dict[str, Any]) -> bool: enable_cross_partition_query=True, ) ) + logger.debug("All items: %s", [item["id"] for item in items]) num_loaded = 0 num_total = len(items) if num_total == 0: @@ -177,26 +166,20 @@ def item_filter(item: dict[str, Any]) -> bool: for item in items: match = file_pattern.search(item["id"]) if match: - group = match.groupdict() - if item_filter(group): - yield (item["id"], group) - num_loaded += 1 - if max_count > 0 and num_loaded >= max_count: - break - else: - num_filtered += 1 + yield item["id"] + num_loaded += 1 else: num_filtered += 1 - progress_status = _create_progress_status( - num_loaded, num_filtered, num_total - ) - logger.debug( - "Progress: %s (%d/%d completed)", - progress_status.description, - progress_status.completed_items, - progress_status.total_items, - ) + progress_status = _create_progress_status( + num_loaded, num_filtered, num_total + ) + logger.debug( + "Progress: %s (%d/%d completed)", + progress_status.description, + progress_status.completed_items, + progress_status.total_items, + ) except Exception: # noqa: BLE001 logger.warning( "An error occurred while searching for documents in Cosmos DB." @@ -330,7 +313,7 @@ def keys(self) -> list[str]: msg = "CosmosDB storage does yet not support listing keys." raise NotImplementedError(msg) - def child(self, name: str | None) -> PipelineStorage: + def child(self, name: str | None) -> "Storage": """Create a child storage instance.""" return self diff --git a/graphrag/storage/file_pipeline_storage.py b/packages/graphrag-storage/graphrag_storage/file_storage.py similarity index 51% rename from graphrag/storage/file_pipeline_storage.py rename to packages/graphrag-storage/graphrag_storage/file_storage.py index a52a92d36d..547659abcd 100644 --- a/graphrag/storage/file_pipeline_storage.py +++ b/packages/graphrag-storage/graphrag_storage/file_storage.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""File-based Storage implementation of PipelineStorage.""" +"""File-based Storage implementation of Storage.""" import logging import os @@ -16,86 +16,65 @@ from aiofiles.os import remove from aiofiles.ospath import exists -from graphrag.storage.pipeline_storage import ( - PipelineStorage, +from graphrag_storage.storage import ( + Storage, get_timestamp_formatted_with_local_tz, ) logger = logging.getLogger(__name__) -class FilePipelineStorage(PipelineStorage): +class FileStorage(Storage): """File storage class definition.""" - _root_dir: str + _base_dir: Path _encoding: str - def __init__(self, **kwargs: Any) -> None: + def __init__(self, base_dir: str, encoding: str = "utf-8", **kwargs: Any) -> None: """Create a file based storage.""" - self._root_dir = kwargs.get("base_dir", "") - self._encoding = kwargs.get("encoding", "utf-8") - logger.info("Creating file storage at %s", self._root_dir) - Path(self._root_dir).mkdir(parents=True, exist_ok=True) + self._base_dir = Path(base_dir).resolve() + self._encoding = encoding + logger.info("Creating file storage at [%s]", self._base_dir) + self._base_dir.mkdir(parents=True, exist_ok=True) def find( self, file_pattern: re.Pattern[str], - base_dir: str | None = None, - file_filter: dict[str, Any] | None = None, - max_count=-1, - ) -> Iterator[tuple[str, dict[str, Any]]]: - """Find files in the storage using a file pattern, as well as a custom filter function.""" - - def item_filter(item: dict[str, Any]) -> bool: - if file_filter is None: - return True - return all( - re.search(value, item[key]) for key, value in file_filter.items() - ) - - search_path = Path(self._root_dir) / (base_dir or "") + ) -> Iterator[str]: + """Find files in the storage using a file pattern.""" logger.info( - "search %s for files matching %s", search_path, file_pattern.pattern + "Search [%s] for files matching [%s]", self._base_dir, file_pattern.pattern ) - all_files = list(search_path.rglob("**/*")) + all_files = list(self._base_dir.rglob("**/*")) + logger.debug("All files and folders: %s", [file.name for file in all_files]) num_loaded = 0 num_total = len(all_files) num_filtered = 0 for file in all_files: match = file_pattern.search(f"{file}") if match: - group = match.groupdict() - if item_filter(group): - filename = f"{file}".replace(self._root_dir, "") - if filename.startswith(os.sep): - filename = filename[1:] - yield (filename, group) - num_loaded += 1 - if max_count > 0 and num_loaded >= max_count: - break - else: - num_filtered += 1 + filename = f"{file}".replace(str(self._base_dir), "", 1) + if filename.startswith(os.sep): + filename = filename[1:] + yield filename + num_loaded += 1 else: num_filtered += 1 - logger.debug( - "Files loaded: %d, filtered: %d, total: %d", - num_loaded, - num_filtered, - num_total, - ) + logger.debug( + "Files loaded: %d, filtered: %d, total: %d", + num_loaded, + num_filtered, + num_total, + ) async def get( self, key: str, as_bytes: bool | None = False, encoding: str | None = None ) -> Any: """Get method definition.""" - file_path = join_path(self._root_dir, key) + file_path = _join_path(self._base_dir, key) if await self.has(key): return await self._read_file(file_path, as_bytes, encoding) - if await exists(key): - # Lookup for key, as it is pressumably a new file loaded from inputs - # and not yet written to storage - return await self._read_file(key, as_bytes, encoding) return None @@ -122,7 +101,7 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: write_type = "wb" if is_bytes else "w" encoding = None if is_bytes else encoding or self._encoding async with aiofiles.open( - join_path(self._root_dir, key), + _join_path(self._base_dir, key), cast("Any", write_type), encoding=encoding, ) as f: @@ -130,35 +109,35 @@ async def set(self, key: str, value: Any, encoding: str | None = None) -> None: async def has(self, key: str) -> bool: """Has method definition.""" - return await exists(join_path(self._root_dir, key)) + return await exists(_join_path(self._base_dir, key)) async def delete(self, key: str) -> None: """Delete method definition.""" if await self.has(key): - await remove(join_path(self._root_dir, key)) + await remove(_join_path(self._base_dir, key)) async def clear(self) -> None: """Clear method definition.""" - for file in Path(self._root_dir).glob("*"): + for file in self._base_dir.glob("*"): if file.is_dir(): shutil.rmtree(file) else: file.unlink() - def child(self, name: str | None) -> "PipelineStorage": + def child(self, name: str | None) -> "Storage": """Create a child storage instance.""" if name is None: return self - child_path = str(Path(self._root_dir) / Path(name)) - return FilePipelineStorage(base_dir=child_path, encoding=self._encoding) + child_path = str(self._base_dir / name) + return FileStorage(base_dir=child_path, encoding=self._encoding) def keys(self) -> list[str]: """Return the keys in the storage.""" - return [item.name for item in Path(self._root_dir).iterdir() if item.is_file()] + return [item.name for item in self._base_dir.iterdir() if item.is_file()] async def get_creation_date(self, key: str) -> str: """Get the creation date of a file.""" - file_path = Path(join_path(self._root_dir, key)) + file_path = _join_path(self._base_dir, key) creation_timestamp = file_path.stat().st_ctime creation_time_utc = datetime.fromtimestamp(creation_timestamp, tz=timezone.utc) @@ -166,6 +145,6 @@ async def get_creation_date(self, key: str) -> str: return get_timestamp_formatted_with_local_tz(creation_time_utc) -def join_path(file_path: str, file_name: str) -> Path: +def _join_path(file_path: Path, file_name: str) -> Path: """Join a path and a file. Independent of the OS.""" - return Path(file_path) / Path(file_name).parent / Path(file_name).name + return (file_path / Path(file_name).parent / Path(file_name).name).resolve() diff --git a/graphrag/storage/memory_pipeline_storage.py b/packages/graphrag-storage/graphrag_storage/memory_storage.py similarity index 79% rename from graphrag/storage/memory_pipeline_storage.py rename to packages/graphrag-storage/graphrag_storage/memory_storage.py index 3567e3d1e3..f92a52a204 100644 --- a/graphrag/storage/memory_pipeline_storage.py +++ b/packages/graphrag-storage/graphrag_storage/memory_storage.py @@ -1,24 +1,29 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing 'InMemoryStorage' model.""" +"""In-memory storage implementation.""" from typing import TYPE_CHECKING, Any -from graphrag.storage.file_pipeline_storage import FilePipelineStorage +from graphrag_storage.file_storage import FileStorage if TYPE_CHECKING: - from graphrag.storage.pipeline_storage import PipelineStorage + from graphrag_storage.storage import Storage -class MemoryPipelineStorage(FilePipelineStorage): +class MemoryStorage(FileStorage): """In memory storage class definition.""" _storage: dict[str, Any] - def __init__(self): + def __init__(self, **kwargs: Any) -> None: """Init method definition.""" - super().__init__() + kwargs = { + "base_dir": "", + **kwargs, + } + kwargs.pop("type", None) + super().__init__(**kwargs) self._storage = {} async def get( @@ -69,9 +74,9 @@ async def clear(self) -> None: """Clear the storage.""" self._storage.clear() - def child(self, name: str | None) -> "PipelineStorage": + def child(self, name: str | None) -> "Storage": """Create a child storage instance.""" - return MemoryPipelineStorage() + return MemoryStorage() def keys(self) -> list[str]: """Return the keys in the storage.""" diff --git a/packages/graphrag-storage/graphrag_storage/py.typed b/packages/graphrag-storage/graphrag_storage/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/graphrag-storage/graphrag_storage/storage.py b/packages/graphrag-storage/graphrag_storage/storage.py new file mode 100644 index 0000000000..d8016d4ae7 --- /dev/null +++ b/packages/graphrag-storage/graphrag_storage/storage.py @@ -0,0 +1,141 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Abstract base class for storage.""" + +import re +from abc import ABC, abstractmethod +from collections.abc import Iterator +from datetime import datetime +from typing import Any + + +class Storage(ABC): + """Provide a storage interface.""" + + @abstractmethod + def __init__(self, **kwargs: Any) -> None: + """Create a storage instance.""" + + @abstractmethod + def find( + self, + file_pattern: re.Pattern[str], + ) -> Iterator[str]: + """Find files in the storage using a file pattern. + + Args + ---- + - file_pattern: re.Pattern[str] + The file pattern to use for finding files. + + Returns + ------- + Iterator[str]: + An iterator over the found file keys. + + """ + + @abstractmethod + async def get( + self, key: str, as_bytes: bool | None = None, encoding: str | None = None + ) -> Any: + """Get the value for the given key. + + Args + ---- + - key: str + The key to get the value for. + - as_bytes: bool | None, optional (default=None) + Whether or not to return the value as bytes. + - encoding: str | None, optional (default=None) + The encoding to use when decoding the value. + + Returns + ------- + Any: + The value for the given key. + """ + + @abstractmethod + async def set(self, key: str, value: Any, encoding: str | None = None) -> None: + """Set the value for the given key. + + Args + ---- + - key: str + The key to set the value for. + - value: Any + The value to set. + """ + + @abstractmethod + async def has(self, key: str) -> bool: + """Return True if the given key exists in the storage. + + Args + ---- + - key: str + The key to check for. + + Returns + ------- + bool: + True if the key exists in the storage, False otherwise. + """ + + @abstractmethod + async def delete(self, key: str) -> None: + """Delete the given key from the storage. + + Args + ---- + - key: str + The key to delete. + """ + + @abstractmethod + async def clear(self) -> None: + """Clear the storage.""" + + @abstractmethod + def child(self, name: str | None) -> "Storage": + """Create a child storage instance. + + Args + ---- + - name: str | None + The name of the child storage. + + Returns + ------- + Storage + The child storage instance. + + """ + + @abstractmethod + def keys(self) -> list[str]: + """List all keys in the storage.""" + + @abstractmethod + async def get_creation_date(self, key: str) -> str: + """Get the creation date for the given key. + + Args + ---- + - key: str + The key to get the creation date for. + + Returns + ------- + str: + The creation date for the given key. + """ + + +def get_timestamp_formatted_with_local_tz(timestamp: datetime) -> str: + """Get the formatted timestamp with the local time zone.""" + creation_time_local = timestamp.astimezone() + + return creation_time_local.strftime("%Y-%m-%d %H:%M:%S %z") diff --git a/packages/graphrag-storage/graphrag_storage/storage_config.py b/packages/graphrag-storage/graphrag_storage/storage_config.py new file mode 100644 index 0000000000..45cd63a734 --- /dev/null +++ b/packages/graphrag-storage/graphrag_storage/storage_config.py @@ -0,0 +1,48 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Storage configuration model.""" + +from pydantic import BaseModel, ConfigDict, Field + +from graphrag_storage.storage_type import StorageType + + +class StorageConfig(BaseModel): + """The default configuration section for storage.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom storage implementations.""" + + type: str = Field( + description="The storage type to use. Builtin types include 'File', 'AzureBlob', and 'AzureCosmos'.", + default=StorageType.File, + ) + + encoding: str | None = Field( + description="The encoding to use for file storage.", + default=None, + ) + + base_dir: str | None = Field( + description="The base directory for the output when using file or AzureBlob storage.", + default=None, + ) + + connection_string: str | None = Field( + description="The connection string for remote services.", + default=None, + ) + + container_name: str | None = Field( + description="The Azure Blob Storage container name or CosmosDB container name to use.", + default=None, + ) + account_url: str | None = Field( + description="The account url for Azure services.", + default=None, + ) + database_name: str | None = Field( + description="The database name to use.", + default=None, + ) diff --git a/packages/graphrag-storage/graphrag_storage/storage_factory.py b/packages/graphrag-storage/graphrag_storage/storage_factory.py new file mode 100644 index 0000000000..0b525fec5f --- /dev/null +++ b/packages/graphrag-storage/graphrag_storage/storage_factory.py @@ -0,0 +1,78 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + + +"""Storage factory implementation.""" + +from collections.abc import Callable + +from graphrag_common.factory import Factory, ServiceScope + +from graphrag_storage.storage import Storage +from graphrag_storage.storage_config import StorageConfig +from graphrag_storage.storage_type import StorageType + + +class StorageFactory(Factory[Storage]): + """A factory class for storage implementations.""" + + +storage_factory = StorageFactory() + + +def register_storage( + storage_type: str, + storage_initializer: Callable[..., Storage], + scope: ServiceScope = "transient", +) -> None: + """Register a custom storage implementation. + + Args + ---- + - storage_type: str + The storage id to register. + - storage_initializer: Callable[..., Storage] + The storage initializer to register. + """ + storage_factory.register(storage_type, storage_initializer, scope) + + +def create_storage(config: StorageConfig) -> Storage: + """Create a storage implementation based on the given configuration. + + Args + ---- + - config: StorageConfig + The storage configuration to use. + + Returns + ------- + Storage + The created storage implementation. + """ + config_model = config.model_dump() + storage_strategy = config.type + + if storage_strategy not in storage_factory: + match storage_strategy: + case StorageType.File: + from graphrag_storage.file_storage import FileStorage + + register_storage(StorageType.File, FileStorage) + case StorageType.Memory: + from graphrag_storage.memory_storage import MemoryStorage + + register_storage(StorageType.Memory, MemoryStorage) + case StorageType.AzureBlob: + from graphrag_storage.azure_blob_storage import AzureBlobStorage + + register_storage(StorageType.AzureBlob, AzureBlobStorage) + case StorageType.AzureCosmos: + from graphrag_storage.azure_cosmos_storage import AzureCosmosStorage + + register_storage(StorageType.AzureCosmos, AzureCosmosStorage) + case _: + msg = f"StorageConfig.type '{storage_strategy}' is not registered in the StorageFactory. Registered types: {', '.join(storage_factory.keys())}." + raise ValueError(msg) + + return storage_factory.create(storage_strategy, config_model) diff --git a/packages/graphrag-storage/graphrag_storage/storage_type.py b/packages/graphrag-storage/graphrag_storage/storage_type.py new file mode 100644 index 0000000000..dd2b1376fd --- /dev/null +++ b/packages/graphrag-storage/graphrag_storage/storage_type.py @@ -0,0 +1,16 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + + +"""Builtin storage implementation types.""" + +from enum import StrEnum + + +class StorageType(StrEnum): + """Enum for storage types.""" + + File = "file" + Memory = "memory" + AzureBlob = "blob" + AzureCosmos = "cosmosdb" diff --git a/packages/graphrag-storage/pyproject.toml b/packages/graphrag-storage/pyproject.toml new file mode 100644 index 0000000000..e21020061f --- /dev/null +++ b/packages/graphrag-storage/pyproject.toml @@ -0,0 +1,48 @@ +[project] +name = "graphrag-storage" +version = "2.7.1" +description = "GraphRAG storage package." +authors = [ + {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, + {name = "Andrés Morales Esquivel", email = "andresmor@microsoft.com"}, + {name = "Chris Trevino", email = "chtrevin@microsoft.com"}, + {name = "David Tittsworth", email = "datittsw@microsoft.com"}, + {name = "Dayenne de Souza", email = "ddesouza@microsoft.com"}, + {name = "Derek Worthen", email = "deworthe@microsoft.com"}, + {name = "Gaudy Blanco Meneses", email = "gaudyb@microsoft.com"}, + {name = "Ha Trinh", email = "trinhha@microsoft.com"}, + {name = "Jonathan Larson", email = "jolarso@microsoft.com"}, + {name = "Josh Bradley", email = "joshbradley@microsoft.com"}, + {name = "Kate Lytvynets", email = "kalytv@microsoft.com"}, + {name = "Kenny Zhang", email = "zhangken@microsoft.com"}, + {name = "Mónica Carvajal"}, + {name = "Nathan Evans", email = "naevans@microsoft.com"}, + {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, + {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, +] +license = {text = "MIT"} +readme = "README.md" +requires-python = ">=3.11,<3.14" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dependencies = [ + "aiofiles~=24.1", + "azure-cosmos~=4.9", + "azure-identity~=1.19", + "azure-storage-blob~=12.24", + "graphrag-common==2.7.1", + "pandas~=2.3", + "pydantic~=2.10", +] + +[project.urls] +Source = "https://github.com/microsoft/graphrag" + +[build-system] +requires = ["hatchling>=1.27.0,<2.0.0"] +build-backend = "hatchling.build" + diff --git a/packages/graphrag-vectors/README.md b/packages/graphrag-vectors/README.md new file mode 100644 index 0000000000..fb97f08a86 --- /dev/null +++ b/packages/graphrag-vectors/README.md @@ -0,0 +1,111 @@ +# GraphRAG Vectors + +This package provides vector store implementations for GraphRAG with support for multiple backends including LanceDB, Azure AI Search, and Azure Cosmos DB. It offers both a convenient configuration-driven API and direct factory access for creating and managing vector stores with flexible index schema definitions. + +## Basic usage with the utility function (recommended) + +This demonstrates the recommended approach to create a vector store using the create_vector_store convenience function with configuration objects that specify the store type and index schema. The example shows setting up a LanceDB vector store with a defined index configuration, then connecting to it and creating the index for vector operations. + +```python +from graphrag_vectors import ( + create_vector_store, + VectorStoreType, + IndexSchema, +) + +# Create a vector store using the convenience function +store_config = VectorStoreConfig( + type="lancedb", + db_uri="lance" +) + +schema_config = IndexSchema( + index_name="my_index", + vector_size=1536, +) + +vector_store = create_vector_store( + config=store_config + index_schema=schema_config, +) + +vector_store.connect() +vector_store.create_index() +``` + +## Basic usage implementing the factory directly + +This example shows a different approach to create vector stores by directly using the vector_store_factory with enum types and dictionary-based initialization arguments. This method provides more direct control over the factory creation process while bypassing the convenience function layer. + +```python +from graphrag_vectors import ( + VectorStoreFactory, + vector_store_factory, + VectorStoreType, + IndexSchema, +) + +# Create a vector store using the factory +schema_config = IndexSchema( + index_name="my_index", + vector_size=1536, +) + +vector_store = vector_store_factory.create( + VectorStoreType.LanceDB, + { + "index_schema": schema_config, + "db_uri": "./lancedb" + } +) + +vector_store.connect() +vector_store.create_index() +``` + +## Supported Vector Stores + +- **LanceDB**: Local vector database +- **Azure AI Search**: Azure's managed search service with vector capabilities +- **Azure Cosmos DB**: Azure's NoSQL database with vector search support + +## Custom Vector Store + +You can register custom vector store implementations: + +```python +from graphrag_vectors import VectorStore, register_vector_store, create_vector_store + +class MyCustomVectorStore(VectorStore): + def __init__(self, my_param): + self.my_param = my_param + + def connect(self): + # Implementation + pass + + def create_index(self): + # Implementation + pass + + # ... implement other required methods + +# Register your custom implementation +register_vector_store("my_custom_store", MyCustomVectorStore) + +# Use your custom vector store +config = VectorStoreConfig( + type="my_custom_store", + my_param="something" +) +custom_store = create_vector_store( + config=config, + index_schema=schema_config, +) +``` + +## Configuration + +Vector stores are configured using: +- `VectorStoreConfig`: baseline parameters for the store +- `IndexSchema`: Schema configuration for the specific index to create/connect to (index name, field names, vector size) diff --git a/packages/graphrag-vectors/graphrag_vectors/__init__.py b/packages/graphrag-vectors/graphrag_vectors/__init__.py new file mode 100644 index 0000000000..915d1f0cd1 --- /dev/null +++ b/packages/graphrag-vectors/graphrag_vectors/__init__.py @@ -0,0 +1,34 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""GraphRAG vector store implementations.""" + +from graphrag_vectors.index_schema import IndexSchema +from graphrag_vectors.types import TextEmbedder +from graphrag_vectors.vector_store import ( + VectorStore, + VectorStoreDocument, + VectorStoreSearchResult, +) +from graphrag_vectors.vector_store_config import VectorStoreConfig +from graphrag_vectors.vector_store_factory import ( + VectorStoreFactory, + create_vector_store, + register_vector_store, + vector_store_factory, +) +from graphrag_vectors.vector_store_type import VectorStoreType + +__all__ = [ + "IndexSchema", + "TextEmbedder", + "VectorStore", + "VectorStoreConfig", + "VectorStoreDocument", + "VectorStoreFactory", + "VectorStoreSearchResult", + "VectorStoreType", + "create_vector_store", + "register_vector_store", + "vector_store_factory", +] diff --git a/packages/graphrag-vectors/graphrag_vectors/azure_ai_search.py b/packages/graphrag-vectors/graphrag_vectors/azure_ai_search.py new file mode 100644 index 0000000000..fcbb5e48ae --- /dev/null +++ b/packages/graphrag-vectors/graphrag_vectors/azure_ai_search.py @@ -0,0 +1,173 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A package containing the Azure AI Search vector store implementation.""" + +from typing import Any + +from azure.core.credentials import AzureKeyCredential +from azure.identity import DefaultAzureCredential +from azure.search.documents import SearchClient +from azure.search.documents.indexes import SearchIndexClient +from azure.search.documents.indexes.models import ( + HnswAlgorithmConfiguration, + HnswParameters, + SearchField, + SearchFieldDataType, + SearchIndex, + SimpleField, + VectorSearch, + VectorSearchAlgorithmMetric, + VectorSearchProfile, +) +from azure.search.documents.models import VectorizedQuery + +from graphrag_vectors.vector_store import ( + VectorStore, + VectorStoreDocument, + VectorStoreSearchResult, +) + + +class AzureAISearchVectorStore(VectorStore): + """Azure AI Search vector storage implementation.""" + + index_client: SearchIndexClient + + def __init__( + self, + url: str, + api_key: str | None = None, + audience: str | None = None, + vector_search_profile_name: str = "vectorSearchProfile", + **kwargs: Any, + ): + super().__init__(**kwargs) + if not url: + msg = "url must be provided for Azure AI Search." + raise ValueError(msg) + self.url = url + self.api_key = api_key + self.audience = audience + self.vector_search_profile_name = vector_search_profile_name + + def connect(self) -> Any: + """Connect to AI search vector storage.""" + audience_arg = ( + {"audience": self.audience} if self.audience and not self.api_key else {} + ) + self.db_connection = SearchClient( + endpoint=self.url, + index_name=self.index_name, + credential=( + AzureKeyCredential(self.api_key) + if self.api_key + else DefaultAzureCredential() + ), + **audience_arg, + ) + self.index_client = SearchIndexClient( + endpoint=self.url, + credential=( + AzureKeyCredential(self.api_key) + if self.api_key + else DefaultAzureCredential() + ), + **audience_arg, + ) + + def create_index(self) -> None: + """Load documents into an Azure AI Search index.""" + if ( + self.index_name is not None + and self.index_name in self.index_client.list_index_names() + ): + self.index_client.delete_index(self.index_name) + + # Configure vector search profile + vector_search = VectorSearch( + algorithms=[ + HnswAlgorithmConfiguration( + name="HnswAlg", + parameters=HnswParameters( + metric=VectorSearchAlgorithmMetric.COSINE + ), + ) + ], + profiles=[ + VectorSearchProfile( + name=self.vector_search_profile_name, + algorithm_configuration_name="HnswAlg", + ) + ], + ) + # Configure the index + index = SearchIndex( + name=self.index_name, + fields=[ + SimpleField( + name=self.id_field, + type=SearchFieldDataType.String, + key=True, + ), + SearchField( + name=self.vector_field, + type=SearchFieldDataType.Collection(SearchFieldDataType.Single), + searchable=True, + hidden=False, # DRIFT needs to return the vector for client-side similarity + vector_search_dimensions=self.vector_size, + vector_search_profile_name=self.vector_search_profile_name, + ), + ], + vector_search=vector_search, + ) + self.index_client.create_or_update_index( + index, + ) + + def load_documents(self, documents: list[VectorStoreDocument]) -> None: + """Load documents into an Azure AI Search index.""" + batch = [ + { + self.id_field: doc.id, + self.vector_field: doc.vector, + } + for doc in documents + if doc.vector is not None + ] + + if len(batch) > 0: + self.db_connection.upload_documents(batch) + + def similarity_search_by_vector( + self, query_embedding: list[float], k: int = 10 + ) -> list[VectorStoreSearchResult]: + """Perform a vector-based similarity search.""" + vectorized_query = VectorizedQuery( + vector=query_embedding, k_nearest_neighbors=k, fields=self.vector_field + ) + + response = self.db_connection.search( + vector_queries=[vectorized_query], + ) + + return [ + VectorStoreSearchResult( + document=VectorStoreDocument( + id=doc.get(self.id_field, ""), + vector=doc.get(self.vector_field, []), + ), + # Cosine similarity between 0.333 and 1.000 + # https://learn.microsoft.com/en-us/azure/search/hybrid-search-ranking#scores-in-a-hybrid-search-results + score=doc["@search.score"], + ) + for doc in response + ] + + def search_by_id(self, id: str) -> VectorStoreDocument: + """Search for a document by id.""" + response = self.db_connection.get_document(id) + return VectorStoreDocument( + id=response.get(self.id_field, ""), + vector=response.get(self.vector_field, []), + ) diff --git a/graphrag/vector_stores/cosmosdb.py b/packages/graphrag-vectors/graphrag_vectors/cosmosdb.py similarity index 65% rename from graphrag/vector_stores/cosmosdb.py rename to packages/graphrag-vectors/graphrag_vectors/cosmosdb.py index 6703c0ff08..fcff47e782 100644 --- a/graphrag/vector_stores/cosmosdb.py +++ b/packages/graphrag-vectors/graphrag_vectors/cosmosdb.py @@ -3,7 +3,6 @@ """A package containing the CosmosDB vector store implementation.""" -import json from typing import Any from azure.cosmos import ContainerProxy, CosmosClient, DatabaseProxy @@ -11,16 +10,14 @@ from azure.cosmos.partition_key import PartitionKey from azure.identity import DefaultAzureCredential -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.data_model.types import TextEmbedder -from graphrag.vector_stores.base import ( - BaseVectorStore, +from graphrag_vectors.vector_store import ( + VectorStore, VectorStoreDocument, VectorStoreSearchResult, ) -class CosmosDBVectorStore(BaseVectorStore): +class CosmosDBVectorStore(VectorStore): """Azure CosmosDB vector storage implementation.""" _cosmos_client: CosmosClient @@ -28,58 +25,56 @@ class CosmosDBVectorStore(BaseVectorStore): _container_client: ContainerProxy def __init__( - self, vector_store_schema_config: VectorStoreSchemaConfig, **kwargs: Any - ) -> None: - super().__init__( - vector_store_schema_config=vector_store_schema_config, **kwargs - ) + self, + database_name: str, + connection_string: str | None = None, + url: str | None = None, + **kwargs, + ): + super().__init__(**kwargs) + if self.id_field != "id": + msg = "CosmosDB requires the id_field to be 'id'." + raise ValueError(msg) + if not connection_string and not url: + msg = "Either connection_string or url must be provided for CosmosDB." + raise ValueError(msg) - def connect(self, **kwargs: Any) -> Any: + self.database_name = database_name + self.connection_string = connection_string + self.url = url + + def connect(self) -> Any: """Connect to CosmosDB vector storage.""" - connection_string = kwargs.get("connection_string") - if connection_string: - self._cosmos_client = CosmosClient.from_connection_string(connection_string) + if self.connection_string: + self._cosmos_client = CosmosClient.from_connection_string( + self.connection_string + ) else: - url = kwargs.get("url") - if not url: - msg = "Either connection_string or url must be provided." - raise ValueError(msg) self._cosmos_client = CosmosClient( - url=url, credential=DefaultAzureCredential() + url=self.url, credential=DefaultAzureCredential() ) - database_name = kwargs.get("database_name") - if database_name is None: - msg = "Database name must be provided." - raise ValueError(msg) - self._database_name = database_name - if self.index_name is None: - msg = "Index name is empty or not provided." - raise ValueError(msg) - self._container_name = self.index_name - - self.vector_size = self.vector_size self._create_database() self._create_container() def _create_database(self) -> None: """Create the database if it doesn't exist.""" - self._cosmos_client.create_database_if_not_exists(id=self._database_name) + self._cosmos_client.create_database_if_not_exists(id=self.database_name) self._database_client = self._cosmos_client.get_database_client( - self._database_name + self.database_name ) def _delete_database(self) -> None: """Delete the database if it exists.""" if self._database_exists(): - self._cosmos_client.delete_database(self._database_name) + self._cosmos_client.delete_database(self.database_name) def _database_exists(self) -> bool: """Check if the database exists.""" existing_database_names = [ database["id"] for database in self._cosmos_client.list_databases() ] - return self._database_name in existing_database_names + return self.database_name in existing_database_names def _create_container(self) -> None: """Create the container if it doesn't exist.""" @@ -117,7 +112,7 @@ def _create_container(self) -> None: # Create the container and container client self._database_client.create_container_if_not_exists( - id=self._container_name, + id=self.index_name, partition_key=partition_key, indexing_policy=indexing_policy, vector_embedding_policy=vector_embedding_policy, @@ -128,58 +123,51 @@ def _create_container(self) -> None: # Create the container with compatible indexing policy self._database_client.create_container_if_not_exists( - id=self._container_name, + id=self.index_name, partition_key=partition_key, indexing_policy=indexing_policy, vector_embedding_policy=vector_embedding_policy, ) self._container_client = self._database_client.get_container_client( - self._container_name + self.index_name ) def _delete_container(self) -> None: """Delete the vector store container in the database if it exists.""" if self._container_exists(): - self._database_client.delete_container(self._container_name) + self._database_client.delete_container(self.index_name) def _container_exists(self) -> bool: """Check if the container name exists in the database.""" existing_container_names = [ container["id"] for container in self._database_client.list_containers() ] - return self._container_name in existing_container_names + return self.index_name in existing_container_names - def load_documents( - self, documents: list[VectorStoreDocument], overwrite: bool = True - ) -> None: + def create_index(self) -> None: """Load documents into CosmosDB.""" # Create a CosmosDB container on overwrite - if overwrite: - self._delete_container() - self._create_container() + self._delete_container() + self._create_container() if self._container_client is None: msg = "Container client is not initialized." raise ValueError(msg) + def load_documents(self, documents: list[VectorStoreDocument]) -> None: + """Load documents into CosmosDB.""" # Upload documents to CosmosDB for doc in documents: if doc.vector is not None: - print("Document to store:") # noqa: T201 - print(doc) # noqa: T201 doc_json = { self.id_field: doc.id, self.vector_field: doc.vector, - self.text_field: doc.text, - self.attributes_field: json.dumps(doc.attributes), } - print("Storing document in CosmosDB:") # noqa: T201 - print(doc_json) # noqa: T201 self._container_client.upsert_item(doc_json) def similarity_search_by_vector( - self, query_embedding: list[float], k: int = 10, **kwargs: Any + self, query_embedding: list[float], k: int = 10 ) -> list[VectorStoreSearchResult]: """Perform a vector-based similarity search.""" if self._container_client is None: @@ -187,7 +175,7 @@ def similarity_search_by_vector( raise ValueError(msg) try: - query = f"SELECT TOP {k} c.{self.id_field}, c.{self.text_field}, c.{self.vector_field}, c.{self.attributes_field}, VectorDistance(c.{self.vector_field}, @embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.{self.vector_field}, @embedding)" # noqa: S608 + query = f"SELECT TOP {k} c.{self.id_field}, c.{self.vector_field}, VectorDistance(c.{self.vector_field}, @embedding) AS SimilarityScore FROM c ORDER BY VectorDistance(c.{self.vector_field}, @embedding)" # noqa: S608 query_params = [{"name": "@embedding", "value": query_embedding}] items = list( self._container_client.query_items( @@ -199,7 +187,7 @@ def similarity_search_by_vector( except (CosmosHttpResponseError, ValueError): # Currently, the CosmosDB emulator does not support the VectorDistance function. # For emulator or test environments - fetch all items and calculate distance locally - query = f"SELECT c.{self.id_field}, c.{self.text_field}, c.{self.vector_field}, c.{self.attributes_field} FROM c" # noqa: S608 + query = f"SELECT c.{self.id_field}, c.{self.vector_field} FROM c" # noqa: S608 items = list( self._container_client.query_items( query=query, @@ -231,40 +219,13 @@ def cosine_similarity(a, b): VectorStoreSearchResult( document=VectorStoreDocument( id=item.get(self.id_field, ""), - text=item.get(self.text_field, ""), vector=item.get(self.vector_field, []), - attributes=(json.loads(item.get(self.attributes_field, "{}"))), ), score=item.get("SimilarityScore", 0.0), ) for item in items ] - def similarity_search_by_text( - self, text: str, text_embedder: TextEmbedder, k: int = 10, **kwargs: Any - ) -> list[VectorStoreSearchResult]: - """Perform a text-based similarity search.""" - query_embedding = text_embedder(text) - if query_embedding: - return self.similarity_search_by_vector( - query_embedding=query_embedding, k=k - ) - return [] - - def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: - """Build a query filter to filter documents by a list of ids.""" - if include_ids is None or len(include_ids) == 0: - self.query_filter = None - else: - if isinstance(include_ids[0], str): - id_filter = ", ".join([f"'{id}'" for id in include_ids]) - else: - id_filter = ", ".join([str(id) for id in include_ids]) - self.query_filter = ( - f"SELECT * FROM c WHERE c.{self.id_field} IN ({id_filter})" # noqa: S608 - ) - return self.query_filter - def search_by_id(self, id: str) -> VectorStoreDocument: """Search for a document by id.""" if self._container_client is None: @@ -275,8 +236,6 @@ def search_by_id(self, id: str) -> VectorStoreDocument: return VectorStoreDocument( id=item.get(self.id_field, ""), vector=item.get(self.vector_field, []), - text=item.get(self.text_field, ""), - attributes=(json.loads(item.get(self.attributes_field, "{}"))), ) def clear(self) -> None: diff --git a/graphrag/config/models/vector_store_schema_config.py b/packages/graphrag-vectors/graphrag_vectors/index_schema.py similarity index 74% rename from graphrag/config/models/vector_store_schema_config.py rename to packages/graphrag-vectors/graphrag_vectors/index_schema.py index e149192515..2eacc3f0c0 100644 --- a/graphrag/config/models/vector_store_schema_config.py +++ b/packages/graphrag-vectors/graphrag_vectors/index_schema.py @@ -7,7 +7,7 @@ from pydantic import BaseModel, Field, model_validator -DEFAULT_VECTOR_SIZE: int = 1536 +DEFAULT_VECTOR_SIZE: int = 3072 VALID_IDENTIFIER_REGEX = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*$") @@ -17,9 +17,13 @@ def is_valid_field_name(field: str) -> bool: return bool(VALID_IDENTIFIER_REGEX.match(field)) -class VectorStoreSchemaConfig(BaseModel): +class IndexSchema(BaseModel): """The default configuration section for Vector Store Schema.""" + index_name: str = Field( + description="The index name to use.", default="vector_index" + ) + id_field: str = Field( description="The ID field to use.", default="id", @@ -30,30 +34,16 @@ class VectorStoreSchemaConfig(BaseModel): default="vector", ) - text_field: str = Field( - description="The text field to use.", - default="text", - ) - - attributes_field: str = Field( - description="The attributes field to use.", - default="attributes", - ) - vector_size: int = Field( description="The vector size to use.", default=DEFAULT_VECTOR_SIZE, ) - index_name: str | None = Field(description="The index name to use.", default=None) - def _validate_schema(self) -> None: """Validate the schema.""" for field in [ self.id_field, self.vector_field, - self.text_field, - self.attributes_field, ]: if not is_valid_field_name(field): msg = f"Unsafe or invalid field name: {field}" diff --git a/packages/graphrag-vectors/graphrag_vectors/lancedb.py b/packages/graphrag-vectors/graphrag_vectors/lancedb.py new file mode 100644 index 0000000000..a133a268ee --- /dev/null +++ b/packages/graphrag-vectors/graphrag_vectors/lancedb.py @@ -0,0 +1,128 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""The LanceDB vector storage implementation package.""" + +from typing import Any + +import lancedb +import numpy as np +import pyarrow as pa + +from graphrag_vectors.vector_store import ( + VectorStore, + VectorStoreDocument, + VectorStoreSearchResult, +) + + +class LanceDBVectorStore(VectorStore): + """LanceDB vector storage implementation.""" + + def __init__(self, db_uri: str = "lancedb", **kwargs: Any): + super().__init__(**kwargs) + self.db_uri = db_uri + + def connect(self) -> Any: + """Connect to the vector storage.""" + self.db_connection = lancedb.connect(self.db_uri) + + if self.index_name and self.index_name in self.db_connection.table_names(): + self.document_collection = self.db_connection.open_table(self.index_name) + + def create_index(self) -> None: + """Create index.""" + dummy_vector = np.zeros(self.vector_size, dtype=np.float32) + flat_array = pa.array(dummy_vector, type=pa.float32()) + vector_column = pa.FixedSizeListArray.from_arrays(flat_array, self.vector_size) + + data = pa.table({ + self.id_field: pa.array(["__DUMMY__"], type=pa.string()), + self.vector_field: vector_column, + }) + + self.document_collection = self.db_connection.create_table( + self.index_name if self.index_name else "", + data=data, + mode="overwrite", + schema=data.schema, + ) + + # Step 5: Create index now that schema exists + self.document_collection.create_index( + vector_column_name=self.vector_field, index_type="IVF_FLAT" + ) + + def load_documents(self, documents: list[VectorStoreDocument]) -> None: + """Load documents into vector storage.""" + self.document_collection.delete(f"{self.id_field} = '__DUMMY__'") + + # Step 1: Prepare data columns manually + ids = [] + vectors = [] + + for document in documents: + self.vector_size = ( + len(document.vector) if document.vector else self.vector_size + ) + if document.vector is not None and len(document.vector) == self.vector_size: + ids.append(document.id) + vectors.append(np.array(document.vector, dtype=np.float32)) + + # Step 2: Handle empty case + if len(ids) == 0: + data = None + else: + # Step 3: Flatten the vectors and build FixedSizeListArray manually + flat_vector = np.concatenate(vectors).astype(np.float32) + flat_array = pa.array(flat_vector, type=pa.float32()) + vector_column = pa.FixedSizeListArray.from_arrays( + flat_array, self.vector_size + ) + + # Step 4: Create PyArrow table (let schema be inferred) + data = pa.table({ + self.id_field: pa.array(ids, type=pa.string()), + self.vector_field: vector_column, + }) + + if data: + self.document_collection.add(data) + + def similarity_search_by_vector( + self, query_embedding: list[float] | np.ndarray, k: int = 10 + ) -> list[VectorStoreSearchResult]: + """Perform a vector-based similarity search.""" + query_embedding = np.array(query_embedding, dtype=np.float32) + + docs = ( + self.document_collection + .search(query=query_embedding, vector_column_name=self.vector_field) + .limit(k) + .to_list() + ) + return [ + VectorStoreSearchResult( + document=VectorStoreDocument( + id=doc[self.id_field], + vector=doc[self.vector_field], + ), + score=1 - abs(float(doc["_distance"])), + ) + for doc in docs + ] + + def search_by_id(self, id: str) -> VectorStoreDocument: + """Search for a document by id.""" + doc = ( + self.document_collection + .search() + .where(f"{self.id_field} == '{id}'", prefilter=True) + .to_list() + ) + if doc: + return VectorStoreDocument( + id=doc[0][self.id_field], + vector=doc[0][self.vector_field], + ) + return VectorStoreDocument(id=id, vector=None) diff --git a/packages/graphrag-vectors/graphrag_vectors/types.py b/packages/graphrag-vectors/graphrag_vectors/types.py new file mode 100644 index 0000000000..63b032486c --- /dev/null +++ b/packages/graphrag-vectors/graphrag_vectors/types.py @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Common types for vector stores.""" + +from collections.abc import Callable + +TextEmbedder = Callable[[str], list[float]] diff --git a/packages/graphrag-vectors/graphrag_vectors/vector_store.py b/packages/graphrag-vectors/graphrag_vectors/vector_store.py new file mode 100644 index 0000000000..de19bb5a4c --- /dev/null +++ b/packages/graphrag-vectors/graphrag_vectors/vector_store.py @@ -0,0 +1,81 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Base classes for vector stores.""" + +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Any + +from graphrag_vectors.types import TextEmbedder + + +@dataclass +class VectorStoreDocument: + """A document that is stored in vector storage.""" + + id: str | int + """unique id for the document""" + + vector: list[float] | None + + +@dataclass +class VectorStoreSearchResult: + """A vector storage search result.""" + + document: VectorStoreDocument + """Document that was found.""" + + score: float + """Similarity score between -1 and 1. Higher is more similar.""" + + +class VectorStore(ABC): + """The base class for vector storage data-access classes.""" + + def __init__( + self, + index_name: str = "vector_index", + id_field: str = "id", + vector_field: str = "vector", + vector_size: int = 3072, + **kwargs: Any, + ): + self.index_name = index_name + self.id_field = id_field + self.vector_field = vector_field + self.vector_size = vector_size + + @abstractmethod + def connect(self) -> None: + """Connect to vector storage.""" + + @abstractmethod + def create_index(self) -> None: + """Create index.""" + + @abstractmethod + def load_documents(self, documents: list[VectorStoreDocument]) -> None: + """Load documents into the vector-store.""" + + @abstractmethod + def similarity_search_by_vector( + self, query_embedding: list[float], k: int = 10 + ) -> list[VectorStoreSearchResult]: + """Perform ANN search by vector.""" + + def similarity_search_by_text( + self, text: str, text_embedder: TextEmbedder, k: int = 10 + ) -> list[VectorStoreSearchResult]: + """Perform a text-based similarity search.""" + query_embedding = text_embedder(text) + if query_embedding: + return self.similarity_search_by_vector( + query_embedding=query_embedding, k=k + ) + return [] + + @abstractmethod + def search_by_id(self, id: str) -> VectorStoreDocument: + """Search for a document by id.""" diff --git a/packages/graphrag-vectors/graphrag_vectors/vector_store_config.py b/packages/graphrag-vectors/graphrag_vectors/vector_store_config.py new file mode 100644 index 0000000000..17f70af86d --- /dev/null +++ b/packages/graphrag-vectors/graphrag_vectors/vector_store_config.py @@ -0,0 +1,53 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, ConfigDict, Field + +from graphrag_vectors.index_schema import IndexSchema +from graphrag_vectors.vector_store_type import VectorStoreType + + +class VectorStoreConfig(BaseModel): + """The default configuration section for Vector Store.""" + + model_config = ConfigDict(extra="allow") + """Allow extra fields to support custom vector implementations.""" + + type: str = Field( + description="The vector store type to use.", + default=VectorStoreType.LanceDB, + ) + + db_uri: str | None = Field( + description="The database URI to use (only used by lancedb for built-in stores).", + default=None, + ) + + url: str | None = Field( + description="The database URL when type == azure_ai_search or cosmosdb.", + default=None, + ) + + api_key: str | None = Field( + description="The database API key when type == azure_ai_search.", + default=None, + ) + + audience: str | None = Field( + description="The database audience when type == azure_ai_search.", + default=None, + ) + + connection_string: str | None = Field( + description="The connection string when type == cosmosdb.", + default=None, + ) + + database_name: str | None = Field( + description="The database name to use when type == cosmosdb.", + default=None, + ) + + index_schema: dict[str, IndexSchema] = {} diff --git a/packages/graphrag-vectors/graphrag_vectors/vector_store_factory.py b/packages/graphrag-vectors/graphrag_vectors/vector_store_factory.py new file mode 100644 index 0000000000..6d94fa63a9 --- /dev/null +++ b/packages/graphrag-vectors/graphrag_vectors/vector_store_factory.py @@ -0,0 +1,99 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Factory functions for creating a vector store.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from graphrag_common.factory import Factory, ServiceScope + +from graphrag_vectors.vector_store import VectorStore +from graphrag_vectors.vector_store_type import VectorStoreType + +if TYPE_CHECKING: + from collections.abc import Callable + + from graphrag_vectors.index_schema import IndexSchema + from graphrag_vectors.vector_store_config import VectorStoreConfig + + +class VectorStoreFactory(Factory[VectorStore]): + """A factory for vector stores. + + Includes a method for users to register a custom vector store implementation. + + Configuration arguments are passed to each vector store implementation as kwargs + for individual enforcement of required/optional arguments. + """ + + +vector_store_factory = VectorStoreFactory() + + +def register_vector_store( + vector_store_type: str, + vector_store_initializer: Callable[..., VectorStore], + scope: ServiceScope = "transient", +) -> None: + """Register a custom vector store implementation. + + Args + ---- + - vector_store_type: str + The vector store id to register. + - vector_store_initializer: Callable[..., VectorStore] + The vector store initializer to register. + - scope: ServiceScope + The service scope for the vector store (default: "transient"). + """ + vector_store_factory.register(vector_store_type, vector_store_initializer, scope) + + +def create_vector_store( + config: VectorStoreConfig, index_schema: IndexSchema +) -> VectorStore: + """Create a vector store implementation based on the given type and configuration. + + Args + ---- + - config: VectorStoreConfig + The base vector store configuration. + - index_schema: IndexSchema + The index schema configuration for the vector store instance - i.e., for the specific table we are reading/writing. + + Returns + ------- + VectorStore + The created vector store implementation. + """ + strategy = config.type + + # Lazy load built-in implementations + if strategy not in vector_store_factory: + match strategy: + case VectorStoreType.LanceDB: + from graphrag_vectors.lancedb import LanceDBVectorStore + + register_vector_store(VectorStoreType.LanceDB, LanceDBVectorStore) + case VectorStoreType.AzureAISearch: + from graphrag_vectors.azure_ai_search import AzureAISearchVectorStore + + register_vector_store( + VectorStoreType.AzureAISearch, AzureAISearchVectorStore + ) + case VectorStoreType.CosmosDB: + from graphrag_vectors.cosmosdb import CosmosDBVectorStore + + register_vector_store(VectorStoreType.CosmosDB, CosmosDBVectorStore) + case _: + msg = f"Vector store type '{strategy}' is not registered in the VectorStoreFactory. Registered types: {', '.join(vector_store_factory.keys())}." + raise ValueError(msg) + + # collapse the base config and specific index config into a single dict for the initializer + config_model = config.model_dump() + index_model = index_schema.model_dump() + return vector_store_factory.create( + strategy, init_args={**config_model, **index_model} + ) diff --git a/packages/graphrag-vectors/graphrag_vectors/vector_store_type.py b/packages/graphrag-vectors/graphrag_vectors/vector_store_type.py new file mode 100644 index 0000000000..86b60bf2fc --- /dev/null +++ b/packages/graphrag-vectors/graphrag_vectors/vector_store_type.py @@ -0,0 +1,14 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Vector store type enum.""" + +from enum import StrEnum + + +class VectorStoreType(StrEnum): + """The supported vector store types.""" + + LanceDB = "lancedb" + AzureAISearch = "azure_ai_search" + CosmosDB = "cosmosdb" diff --git a/packages/graphrag-vectors/pyproject.toml b/packages/graphrag-vectors/pyproject.toml new file mode 100644 index 0000000000..8dedf25f99 --- /dev/null +++ b/packages/graphrag-vectors/pyproject.toml @@ -0,0 +1,49 @@ +[project] +name = "graphrag-vectors" +version = "2.7.1" +description = "GraphRAG vector store package." +authors = [ + {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, + {name = "Andrés Morales Esquivel", email = "andresmor@microsoft.com"}, + {name = "Chris Trevino", email = "chtrevin@microsoft.com"}, + {name = "David Tittsworth", email = "datittsw@microsoft.com"}, + {name = "Dayenne de Souza", email = "ddesouza@microsoft.com"}, + {name = "Derek Worthen", email = "deworthe@microsoft.com"}, + {name = "Gaudy Blanco Meneses", email = "gaudyb@microsoft.com"}, + {name = "Ha Trinh", email = "trinhha@microsoft.com"}, + {name = "Jonathan Larson", email = "jolarso@microsoft.com"}, + {name = "Josh Bradley", email = "joshbradley@microsoft.com"}, + {name = "Kate Lytvynets", email = "kalytv@microsoft.com"}, + {name = "Kenny Zhang", email = "zhangken@microsoft.com"}, + {name = "Mónica Carvajal"}, + {name = "Nathan Evans", email = "naevans@microsoft.com"}, + {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, + {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, +] +license = {text = "MIT"} +readme = "README.md" +requires-python = ">=3.11,<3.14" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] +dependencies = [ + "azure-core~=1.32", + "azure-cosmos~=4.9", + "azure-identity~=1.19", + "azure-search-documents~=11.6", + "graphrag-common==2.7.1", + "lancedb~=0.24.1", + "numpy~=2.1", + "pyarrow~=22.0", + "pydantic~=2.10", +] + +[project.urls] +Source = "https://github.com/microsoft/graphrag" + +[build-system] +requires = ["hatchling>=1.27.0,<2.0.0"] +build-backend = "hatchling.build" diff --git a/packages/graphrag/README.md b/packages/graphrag/README.md new file mode 100644 index 0000000000..2de7d4d0f0 --- /dev/null +++ b/packages/graphrag/README.md @@ -0,0 +1,76 @@ +# GraphRAG + +👉 [Microsoft Research Blog Post](https://www.microsoft.com/en-us/research/blog/graphrag-unlocking-llm-discovery-on-narrative-private-data/)
    +👉 [Read the docs](https://microsoft.github.io/graphrag)
    +👉 [GraphRAG Arxiv](https://arxiv.org/pdf/2404.16130) + +

    + +## Overview + +The GraphRAG project is a data pipeline and transformation suite that is designed to extract meaningful, structured data from unstructured text using the power of LLMs. + +To learn more about GraphRAG and how it can be used to enhance your LLM's ability to reason about your private data, please visit the Microsoft Research Blog Post. + +## Quickstart + +To get started with the GraphRAG system we recommend trying the [command line quickstart](https://microsoft.github.io/graphrag/get_started/). + +## Repository Guidance + +This repository presents a methodology for using knowledge graph memory structures to enhance LLM outputs. Please note that the provided code serves as a demonstration and is not an officially supported Microsoft offering. + +⚠️ *Warning: GraphRAG indexing can be an expensive operation, please read all of the documentation to understand the process and costs involved, and start small.* + +## Diving Deeper + +- To learn about our contribution guidelines, see [CONTRIBUTING.md](./CONTRIBUTING.md) +- To start developing _GraphRAG_, see [DEVELOPING.md](./DEVELOPING.md) +- Join the conversation and provide feedback in the [GitHub Discussions tab!](https://github.com/microsoft/graphrag/discussions) + +## Prompt Tuning + +Using _GraphRAG_ with your data out of the box may not yield the best possible results. +We strongly recommend to fine-tune your prompts following the [Prompt Tuning Guide](https://microsoft.github.io/graphrag/prompt_tuning/overview/) in our documentation. + +## Versioning + +Please see the [breaking changes](./breaking-changes.md) document for notes on our approach to versioning the project. + +*Always run `uv run poe init --root [path] --force` between minor version bumps to ensure you have the latest config format. Run the provided migration notebook between major version bumps if you want to avoid re-indexing prior datasets. Note that this will overwrite your configuration and prompts, so backup if necessary.* + +## Responsible AI FAQ + +See [RAI_TRANSPARENCY.md](./RAI_TRANSPARENCY.md) + +- [What is GraphRAG?](./RAI_TRANSPARENCY.md#what-is-graphrag) +- [What can GraphRAG do?](./RAI_TRANSPARENCY.md#what-can-graphrag-do) +- [What are GraphRAG’s intended use(s)?](./RAI_TRANSPARENCY.md#what-are-graphrags-intended-uses) +- [How was GraphRAG evaluated? What metrics are used to measure performance?](./RAI_TRANSPARENCY.md#how-was-graphrag-evaluated-what-metrics-are-used-to-measure-performance) +- [What are the limitations of GraphRAG? How can users minimize the impact of GraphRAG’s limitations when using the system?](./RAI_TRANSPARENCY.md#what-are-the-limitations-of-graphrag-how-can-users-minimize-the-impact-of-graphrags-limitations-when-using-the-system) +- [What operational factors and settings allow for effective and responsible use of GraphRAG?](./RAI_TRANSPARENCY.md#what-operational-factors-and-settings-allow-for-effective-and-responsible-use-of-graphrag) + +## Trademarks + +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft +trademarks or logos is subject to and must follow +[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. +Any use of third-party trademarks or logos are subject to those third-party's policies. + +## Privacy + +[Microsoft Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement) diff --git a/graphrag/__init__.py b/packages/graphrag/graphrag/__init__.py similarity index 100% rename from graphrag/__init__.py rename to packages/graphrag/graphrag/__init__.py diff --git a/graphrag/__main__.py b/packages/graphrag/graphrag/__main__.py similarity index 100% rename from graphrag/__main__.py rename to packages/graphrag/graphrag/__main__.py diff --git a/graphrag/api/__init__.py b/packages/graphrag/graphrag/api/__init__.py similarity index 79% rename from graphrag/api/__init__.py rename to packages/graphrag/graphrag/api/__init__.py index a3a06033bc..05692c4182 100644 --- a/graphrag/api/__init__.py +++ b/packages/graphrag/graphrag/api/__init__.py @@ -18,10 +18,6 @@ global_search_streaming, local_search, local_search_streaming, - multi_index_basic_search, - multi_index_drift_search, - multi_index_global_search, - multi_index_local_search, ) from graphrag.prompt_tune.types import DocSelectionType @@ -37,10 +33,6 @@ "drift_search_streaming", "basic_search", "basic_search_streaming", - "multi_index_basic_search", - "multi_index_drift_search", - "multi_index_global_search", - "multi_index_local_search", # prompt tuning API "DocSelectionType", "generate_indexing_prompts", diff --git a/graphrag/api/index.py b/packages/graphrag/graphrag/api/index.py similarity index 94% rename from graphrag/api/index.py rename to packages/graphrag/graphrag/api/index.py index 7265e46187..cc9d0956d5 100644 --- a/graphrag/api/index.py +++ b/packages/graphrag/graphrag/api/index.py @@ -30,7 +30,6 @@ async def build_index( config: GraphRagConfig, method: IndexingMethod | str = IndexingMethod.Standard, is_update_run: bool = False, - memory_profile: bool = False, callbacks: list[WorkflowCallbacks] | None = None, additional_context: dict[str, Any] | None = None, verbose: bool = False, @@ -67,9 +66,6 @@ async def build_index( outputs: list[PipelineRunResult] = [] - if memory_profile: - logger.warning("New pipeline does not yet support memory profiling.") - logger.info("Initializing indexing pipeline...") # todo: this could propagate out to the cli for better clarity, but will be a breaking api change method = _get_method(method, is_update_run) @@ -86,8 +82,9 @@ async def build_index( input_documents=input_documents, ): outputs.append(output) - if output.errors and len(output.errors) > 0: + if output.error is not None: logger.error("Workflow %s completed with errors", output.workflow) + workflow_callbacks.pipeline_error(output.error) else: logger.info("Workflow %s completed successfully", output.workflow) logger.debug(str(output.result)) diff --git a/graphrag/api/prompt_tune.py b/packages/graphrag/graphrag/api/prompt_tune.py similarity index 87% rename from graphrag/api/prompt_tune.py rename to packages/graphrag/graphrag/api/prompt_tune.py index 43fb0a5590..e1741f014b 100644 --- a/graphrag/api/prompt_tune.py +++ b/packages/graphrag/graphrag/api/prompt_tune.py @@ -12,15 +12,11 @@ """ import logging -from typing import Annotated -import annotated_types +from graphrag_llm.completion import create_completion from pydantic import PositiveInt, validate_call -from graphrag.callbacks.noop_workflow_callbacks import NoopWorkflowCallbacks -from graphrag.config.defaults import graphrag_config_defaults from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.language_model.manager import ModelManager from graphrag.logger.standard_logging import init_loggers from graphrag.prompt_tune.defaults import MAX_TOKEN_COUNT, PROMPT_TUNING_MODEL_ID from graphrag.prompt_tune.generator.community_report_rating import ( @@ -55,10 +51,6 @@ @validate_call(config={"arbitrary_types_allowed": True}) async def generate_indexing_prompts( config: GraphRagConfig, - chunk_size: PositiveInt = graphrag_config_defaults.chunks.size, - overlap: Annotated[ - int, annotated_types.Gt(-1) - ] = graphrag_config_defaults.chunks.overlap, limit: PositiveInt = 15, selection_method: DocSelectionType = DocSelectionType.RANDOM, domain: str | None = None, @@ -100,8 +92,6 @@ async def generate_indexing_prompts( limit=limit, select_method=selection_method, logger=logger, - chunk_size=chunk_size, - overlap=overlap, n_subset_max=n_subset_max, k=k, ) @@ -109,16 +99,10 @@ async def generate_indexing_prompts( # Create LLM from config # TODO: Expose a way to specify Prompt Tuning model ID through config logger.info("Retrieving language model configuration...") - default_llm_settings = config.get_language_model_config(PROMPT_TUNING_MODEL_ID) + default_llm_settings = config.get_completion_model_config(PROMPT_TUNING_MODEL_ID) logger.info("Creating language model...") - llm = ModelManager().register_chat( - name="prompt_tuning", - model_type=default_llm_settings.type, - config=default_llm_settings, - callbacks=NoopWorkflowCallbacks(), - cache=None, - ) + llm = create_completion(default_llm_settings) if not domain: logger.info("Generating domain...") @@ -137,8 +121,8 @@ async def generate_indexing_prompts( ) entity_types = None - extract_graph_llm_settings = config.get_language_model_config( - config.extract_graph.model_id + extract_graph_llm_settings = config.get_completion_model_config( + config.extract_graph.completion_model_id ) if discover_entity_types: logger.info("Generating entity types...") @@ -147,7 +131,7 @@ async def generate_indexing_prompts( domain=domain, persona=persona, docs=doc_list, - json_mode=extract_graph_llm_settings.model_supports_json or False, + json_mode=True, ) logger.info("Generating entity relationship examples...") diff --git a/packages/graphrag/graphrag/api/query.py b/packages/graphrag/graphrag/api/query.py new file mode 100644 index 0000000000..fe50d56a45 --- /dev/null +++ b/packages/graphrag/graphrag/api/query.py @@ -0,0 +1,546 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +""" +Query Engine API. + +This API provides access to the query engine of graphrag, allowing external applications +to hook into graphrag and run queries over a knowledge graph generated by graphrag. + +Contains the following functions: + - global_search: Perform a global search. + - global_search_streaming: Perform a global search and stream results back. + - local_search: Perform a local search. + - local_search_streaming: Perform a local search and stream results back. + +WARNING: This API is under development and may undergo changes in future releases. +Backwards compatibility is not guaranteed at this time. +""" + +import logging +from collections.abc import AsyncGenerator +from typing import Any + +import pandas as pd +from pydantic import validate_call + +from graphrag.callbacks.noop_query_callbacks import NoopQueryCallbacks +from graphrag.callbacks.query_callbacks import QueryCallbacks +from graphrag.config.embeddings import ( + community_full_content_embedding, + entity_description_embedding, + text_unit_text_embedding, +) +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.logger.standard_logging import init_loggers +from graphrag.query.factory import ( + get_basic_search_engine, + get_drift_search_engine, + get_global_search_engine, + get_local_search_engine, +) +from graphrag.query.indexer_adapters import ( + read_indexer_communities, + read_indexer_covariates, + read_indexer_entities, + read_indexer_relationships, + read_indexer_report_embeddings, + read_indexer_reports, + read_indexer_text_units, +) +from graphrag.utils.api import ( + get_embedding_store, + load_search_prompt, + truncate, +) +from graphrag.utils.cli import redact + +# Initialize standard logger +logger = logging.getLogger(__name__) + + +@validate_call(config={"arbitrary_types_allowed": True}) +async def global_search( + config: GraphRagConfig, + entities: pd.DataFrame, + communities: pd.DataFrame, + community_reports: pd.DataFrame, + community_level: int | None, + dynamic_community_selection: bool, + response_type: str, + query: str, + callbacks: list[QueryCallbacks] | None = None, + verbose: bool = False, +) -> tuple[ + str | dict[str, Any] | list[dict[str, Any]], + str | list[pd.DataFrame] | dict[str, pd.DataFrame], +]: + """Perform a global search and return the context data and response. + + Parameters + ---------- + - config (GraphRagConfig): A graphrag configuration (from settings.yaml) + - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) + - communities (pd.DataFrame): A DataFrame containing the final communities (from communities.parquet) + - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) + - community_level (int): The community level to search at. + - dynamic_community_selection (bool): Enable dynamic community selection instead of using all community reports at a fixed level. Note that you can still provide community_level cap the maximum level to search. + - response_type (str): The type of response to return. + - query (str): The user query to search for. + + Returns + ------- + TODO: Document the search response type and format. + """ + init_loggers(config=config, verbose=verbose, filename="query.log") + + callbacks = callbacks or [] + full_response = "" + context_data = {} + + def on_context(context: Any) -> None: + nonlocal context_data + context_data = context + + local_callbacks = NoopQueryCallbacks() + local_callbacks.on_context = on_context + callbacks.append(local_callbacks) + + logger.debug("Executing global search query: %s", query) + async for chunk in global_search_streaming( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + community_level=community_level, + dynamic_community_selection=dynamic_community_selection, + response_type=response_type, + query=query, + callbacks=callbacks, + ): + full_response += chunk + logger.debug("Query response: %s", truncate(full_response, 400)) + return full_response, context_data + + +@validate_call(config={"arbitrary_types_allowed": True}) +def global_search_streaming( + config: GraphRagConfig, + entities: pd.DataFrame, + communities: pd.DataFrame, + community_reports: pd.DataFrame, + community_level: int | None, + dynamic_community_selection: bool, + response_type: str, + query: str, + callbacks: list[QueryCallbacks] | None = None, + verbose: bool = False, +) -> AsyncGenerator: + """Perform a global search and return the context data and response via a generator. + + Context data is returned as a dictionary of lists, with one list entry for each record. + + Parameters + ---------- + - config (GraphRagConfig): A graphrag configuration (from settings.yaml) + - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) + - communities (pd.DataFrame): A DataFrame containing the final communities (from communities.parquet) + - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) + - community_level (int): The community level to search at. + - dynamic_community_selection (bool): Enable dynamic community selection instead of using all community reports at a fixed level. Note that you can still provide community_level cap the maximum level to search. + - response_type (str): The type of response to return. + - query (str): The user query to search for. + + Returns + ------- + TODO: Document the search response type and format. + """ + init_loggers(config=config, verbose=verbose, filename="query.log") + + communities_ = read_indexer_communities(communities, community_reports) + reports = read_indexer_reports( + community_reports, + communities, + community_level=community_level, + dynamic_community_selection=dynamic_community_selection, + ) + entities_ = read_indexer_entities( + entities, communities, community_level=community_level + ) + map_prompt = load_search_prompt(config.global_search.map_prompt) + reduce_prompt = load_search_prompt(config.global_search.reduce_prompt) + knowledge_prompt = load_search_prompt(config.global_search.knowledge_prompt) + + logger.debug("Executing streaming global search query: %s", query) + search_engine = get_global_search_engine( + config, + reports=reports, + entities=entities_, + communities=communities_, + response_type=response_type, + dynamic_community_selection=dynamic_community_selection, + map_system_prompt=map_prompt, + reduce_system_prompt=reduce_prompt, + general_knowledge_inclusion_prompt=knowledge_prompt, + callbacks=callbacks, + ) + return search_engine.stream_search(query=query) + + +@validate_call(config={"arbitrary_types_allowed": True}) +async def local_search( + config: GraphRagConfig, + entities: pd.DataFrame, + communities: pd.DataFrame, + community_reports: pd.DataFrame, + text_units: pd.DataFrame, + relationships: pd.DataFrame, + covariates: pd.DataFrame | None, + community_level: int, + response_type: str, + query: str, + callbacks: list[QueryCallbacks] | None = None, + verbose: bool = False, +) -> tuple[ + str | dict[str, Any] | list[dict[str, Any]], + str | list[pd.DataFrame] | dict[str, pd.DataFrame], +]: + """Perform a local search and return the context data and response. + + ---------- + - config (GraphRagConfig): A graphrag configuration (from settings.yaml) + - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) + - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) + - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) + - relationships (pd.DataFrame): A DataFrame containing the final relationships (from relationships.parquet) + - covariates (pd.DataFrame): A DataFrame containing the final covariates (from covariates.parquet) + - community_level (int): The community level to search at. + - response_type (str): The response type to return. + - query (str): The user query to search for. + + Returns + ------- + TODO: Document the search response type and format. + """ + init_loggers(config=config, verbose=verbose, filename="query.log") + + callbacks = callbacks or [] + full_response = "" + context_data = {} + + def on_context(context: Any) -> None: + nonlocal context_data + context_data = context + + local_callbacks = NoopQueryCallbacks() + local_callbacks.on_context = on_context + callbacks.append(local_callbacks) + + logger.debug("Executing local search query: %s", query) + async for chunk in local_search_streaming( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + text_units=text_units, + relationships=relationships, + covariates=covariates, + community_level=community_level, + response_type=response_type, + query=query, + callbacks=callbacks, + ): + full_response += chunk + logger.debug("Query response: %s", truncate(full_response, 400)) + return full_response, context_data + + +@validate_call(config={"arbitrary_types_allowed": True}) +def local_search_streaming( + config: GraphRagConfig, + entities: pd.DataFrame, + communities: pd.DataFrame, + community_reports: pd.DataFrame, + text_units: pd.DataFrame, + relationships: pd.DataFrame, + covariates: pd.DataFrame | None, + community_level: int, + response_type: str, + query: str, + callbacks: list[QueryCallbacks] | None = None, + verbose: bool = False, +) -> AsyncGenerator: + """Perform a local search and return the context data and response via a generator. + + Parameters + ---------- + - config (GraphRagConfig): A graphrag configuration (from settings.yaml) + - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) + - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) + - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) + - relationships (pd.DataFrame): A DataFrame containing the final relationships (from relationships.parquet) + - covariates (pd.DataFrame): A DataFrame containing the final covariates (from covariates.parquet) + - community_level (int): The community level to search at. + - response_type (str): The response type to return. + - query (str): The user query to search for. + + Returns + ------- + TODO: Document the search response type and format. + """ + init_loggers(config=config, verbose=verbose, filename="query.log") + + msg = f"Vector Store Args: {redact(config.vector_store.model_dump())}" + logger.debug(msg) + + description_embedding_store = get_embedding_store( + config=config.vector_store, + embedding_name=entity_description_embedding, + ) + + entities_ = read_indexer_entities(entities, communities, community_level) + covariates_ = read_indexer_covariates(covariates) if covariates is not None else [] + prompt = load_search_prompt(config.local_search.prompt) + + logger.debug("Executing streaming local search query: %s", query) + search_engine = get_local_search_engine( + config=config, + reports=read_indexer_reports(community_reports, communities, community_level), + text_units=read_indexer_text_units(text_units), + entities=entities_, + relationships=read_indexer_relationships(relationships), + covariates={"claims": covariates_}, + description_embedding_store=description_embedding_store, + response_type=response_type, + system_prompt=prompt, + callbacks=callbacks, + ) + return search_engine.stream_search(query=query) + + +@validate_call(config={"arbitrary_types_allowed": True}) +async def drift_search( + config: GraphRagConfig, + entities: pd.DataFrame, + communities: pd.DataFrame, + community_reports: pd.DataFrame, + text_units: pd.DataFrame, + relationships: pd.DataFrame, + community_level: int, + response_type: str, + query: str, + callbacks: list[QueryCallbacks] | None = None, + verbose: bool = False, +) -> tuple[ + str | dict[str, Any] | list[dict[str, Any]], + str | list[pd.DataFrame] | dict[str, pd.DataFrame], +]: + """Perform a DRIFT search and return the context data and response. + + Parameters + ---------- + - config (GraphRagConfig): A graphrag configuration (from settings.yaml) + - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) + - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) + - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) + - relationships (pd.DataFrame): A DataFrame containing the final relationships (from relationships.parquet) + - community_level (int): The community level to search at. + - query (str): The user query to search for. + + Returns + ------- + TODO: Document the search response type and format. + """ + init_loggers(config=config, verbose=verbose, filename="query.log") + + callbacks = callbacks or [] + full_response = "" + context_data = {} + + def on_context(context: Any) -> None: + nonlocal context_data + context_data = context + + local_callbacks = NoopQueryCallbacks() + local_callbacks.on_context = on_context + callbacks.append(local_callbacks) + + logger.debug("Executing drift search query: %s", query) + async for chunk in drift_search_streaming( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + text_units=text_units, + relationships=relationships, + community_level=community_level, + response_type=response_type, + query=query, + callbacks=callbacks, + ): + full_response += chunk + logger.debug("Query response: %s", truncate(full_response, 400)) + return full_response, context_data + + +@validate_call(config={"arbitrary_types_allowed": True}) +def drift_search_streaming( + config: GraphRagConfig, + entities: pd.DataFrame, + communities: pd.DataFrame, + community_reports: pd.DataFrame, + text_units: pd.DataFrame, + relationships: pd.DataFrame, + community_level: int, + response_type: str, + query: str, + callbacks: list[QueryCallbacks] | None = None, + verbose: bool = False, +) -> AsyncGenerator: + """Perform a DRIFT search and return the context data and response. + + Parameters + ---------- + - config (GraphRagConfig): A graphrag configuration (from settings.yaml) + - entities (pd.DataFrame): A DataFrame containing the final entities (from entities.parquet) + - community_reports (pd.DataFrame): A DataFrame containing the final community reports (from community_reports.parquet) + - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) + - relationships (pd.DataFrame): A DataFrame containing the final relationships (from relationships.parquet) + - community_level (int): The community level to search at. + - query (str): The user query to search for. + + Returns + ------- + TODO: Document the search response type and format. + """ + init_loggers(config=config, verbose=verbose, filename="query.log") + + msg = f"Vector Store Args: {redact(config.vector_store.model_dump())}" + logger.debug(msg) + + description_embedding_store = get_embedding_store( + config=config.vector_store, + embedding_name=entity_description_embedding, + ) + + full_content_embedding_store = get_embedding_store( + config=config.vector_store, + embedding_name=community_full_content_embedding, + ) + + entities_ = read_indexer_entities(entities, communities, community_level) + reports = read_indexer_reports(community_reports, communities, community_level) + read_indexer_report_embeddings(reports, full_content_embedding_store) + prompt = load_search_prompt(config.drift_search.prompt) + reduce_prompt = load_search_prompt(config.drift_search.reduce_prompt) + + logger.debug("Executing streaming drift search query: %s", query) + search_engine = get_drift_search_engine( + config=config, + reports=reports, + text_units=read_indexer_text_units(text_units), + entities=entities_, + relationships=read_indexer_relationships(relationships), + description_embedding_store=description_embedding_store, + local_system_prompt=prompt, + reduce_system_prompt=reduce_prompt, + response_type=response_type, + callbacks=callbacks, + ) + return search_engine.stream_search(query=query) + + +@validate_call(config={"arbitrary_types_allowed": True}) +async def basic_search( + config: GraphRagConfig, + text_units: pd.DataFrame, + response_type: str, + query: str, + callbacks: list[QueryCallbacks] | None = None, + verbose: bool = False, +) -> tuple[ + str | dict[str, Any] | list[dict[str, Any]], + str | list[pd.DataFrame] | dict[str, pd.DataFrame], +]: + """Perform a basic search and return the context data and response. + + Parameters + ---------- + - config (GraphRagConfig): A graphrag configuration (from settings.yaml) + - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) + - query (str): The user query to search for. + + Returns + ------- + TODO: Document the search response type and format. + """ + init_loggers(config=config, verbose=verbose, filename="query.log") + + callbacks = callbacks or [] + full_response = "" + context_data = {} + + def on_context(context: Any) -> None: + nonlocal context_data + context_data = context + + local_callbacks = NoopQueryCallbacks() + local_callbacks.on_context = on_context + callbacks.append(local_callbacks) + + logger.debug("Executing basic search query: %s", query) + async for chunk in basic_search_streaming( + config=config, + text_units=text_units, + response_type=response_type, + query=query, + callbacks=callbacks, + ): + full_response += chunk + logger.debug("Query response: %s", truncate(full_response, 400)) + return full_response, context_data + + +@validate_call(config={"arbitrary_types_allowed": True}) +def basic_search_streaming( + config: GraphRagConfig, + text_units: pd.DataFrame, + response_type: str, + query: str, + callbacks: list[QueryCallbacks] | None = None, + verbose: bool = False, +) -> AsyncGenerator: + """Perform a local search and return the context data and response via a generator. + + Parameters + ---------- + - config (GraphRagConfig): A graphrag configuration (from settings.yaml) + - text_units (pd.DataFrame): A DataFrame containing the final text units (from text_units.parquet) + - query (str): The user query to search for. + + Returns + ------- + TODO: Document the search response type and format. + """ + init_loggers(config=config, verbose=verbose, filename="query.log") + + msg = f"Vector Store Args: {redact(config.vector_store.model_dump())}" + logger.debug(msg) + + embedding_store = get_embedding_store( + config=config.vector_store, + embedding_name=text_unit_text_embedding, + ) + + prompt = load_search_prompt(config.basic_search.prompt) + + logger.debug("Executing streaming basic search query: %s", query) + search_engine = get_basic_search_engine( + config=config, + text_units=read_indexer_text_units(text_units), + text_unit_embeddings=embedding_store, + response_type=response_type, + system_prompt=prompt, + callbacks=callbacks, + ) + return search_engine.stream_search(query=query) diff --git a/graphrag/factory/__init__.py b/packages/graphrag/graphrag/cache/__init__.py similarity index 78% rename from graphrag/factory/__init__.py rename to packages/graphrag/graphrag/cache/__init__.py index 55bd738251..60ffdf7a1f 100644 --- a/graphrag/factory/__init__.py +++ b/packages/graphrag/graphrag/cache/__init__.py @@ -1,4 +1,4 @@ # Copyright (c) 2025 Microsoft Corporation. # Licensed under the MIT License -"""Factory module.""" +"""Cache module.""" diff --git a/packages/graphrag/graphrag/cache/cache_key_creator.py b/packages/graphrag/graphrag/cache/cache_key_creator.py new file mode 100644 index 0000000000..704035f253 --- /dev/null +++ b/packages/graphrag/graphrag/cache/cache_key_creator.py @@ -0,0 +1,44 @@ +# Copyright (c) 2025 Microsoft Corporation. +# Licensed under the MIT License + +"""Cache key creation for Graphrag.""" + +from typing import Any + +from graphrag_llm.cache import create_cache_key + +_CACHE_VERSION = 4 +""" +If there's a breaking change in what we cache, we should increment this version number to invalidate existing caches. + +fnllm was on cache version 2 and though we generate +similar cache keys, the objects stored in cache by fnllm and litellm are different. +Using litellm model providers will not be able to reuse caches generated by fnllm +thus we start with version 3 for litellm. + +graphrag-llm package is now on version 4. +This is to account for changes to the ModelConfig that affect the cache key and +occurred when pulling this package out of graphrag. +graphrag-llm, now that is supports metrics, also caches metrics which were not cached before. +""" + + +def cache_key_creator( + input_args: dict[str, Any], +) -> str: + """Generate a cache key based on input arguments. + + Args + ____ + input_args: dict[str, Any] + The input arguments for the model call. + + Returns + ------- + str + The generated cache key in the format + `{prefix}_{data_hash}_v{version}` if prefix is provided. + """ + base_key = create_cache_key(input_args) + + return f"{base_key}_v{_CACHE_VERSION}" diff --git a/graphrag/callbacks/__init__.py b/packages/graphrag/graphrag/callbacks/__init__.py similarity index 100% rename from graphrag/callbacks/__init__.py rename to packages/graphrag/graphrag/callbacks/__init__.py diff --git a/graphrag/callbacks/console_workflow_callbacks.py b/packages/graphrag/graphrag/callbacks/console_workflow_callbacks.py similarity index 90% rename from graphrag/callbacks/console_workflow_callbacks.py rename to packages/graphrag/graphrag/callbacks/console_workflow_callbacks.py index dbe7e0d552..547c5ed258 100644 --- a/graphrag/callbacks/console_workflow_callbacks.py +++ b/packages/graphrag/graphrag/callbacks/console_workflow_callbacks.py @@ -37,6 +37,10 @@ def workflow_end(self, name: str, instance: object) -> None: if self._verbose: print(instance) + def pipeline_error(self, error: BaseException) -> None: + """Execute this callback when an error occurs in the pipeline.""" + print(f"Pipeline error: {error}") + def progress(self, progress: Progress) -> None: """Handle when progress occurs.""" complete = progress.completed_items or 0 diff --git a/graphrag/callbacks/llm_callbacks.py b/packages/graphrag/graphrag/callbacks/llm_callbacks.py similarity index 100% rename from graphrag/callbacks/llm_callbacks.py rename to packages/graphrag/graphrag/callbacks/llm_callbacks.py diff --git a/graphrag/callbacks/noop_query_callbacks.py b/packages/graphrag/graphrag/callbacks/noop_query_callbacks.py similarity index 100% rename from graphrag/callbacks/noop_query_callbacks.py rename to packages/graphrag/graphrag/callbacks/noop_query_callbacks.py diff --git a/graphrag/callbacks/noop_workflow_callbacks.py b/packages/graphrag/graphrag/callbacks/noop_workflow_callbacks.py similarity index 89% rename from graphrag/callbacks/noop_workflow_callbacks.py rename to packages/graphrag/graphrag/callbacks/noop_workflow_callbacks.py index 9f9ac2aee0..19aba39a0c 100644 --- a/graphrag/callbacks/noop_workflow_callbacks.py +++ b/packages/graphrag/graphrag/callbacks/noop_workflow_callbacks.py @@ -25,3 +25,6 @@ def workflow_end(self, name: str, instance: object) -> None: def progress(self, progress: Progress) -> None: """Handle when progress occurs.""" + + def pipeline_error(self, error: BaseException) -> None: + """Execute this callback when an error occurs in the pipeline.""" diff --git a/graphrag/callbacks/query_callbacks.py b/packages/graphrag/graphrag/callbacks/query_callbacks.py similarity index 100% rename from graphrag/callbacks/query_callbacks.py rename to packages/graphrag/graphrag/callbacks/query_callbacks.py diff --git a/graphrag/callbacks/workflow_callbacks.py b/packages/graphrag/graphrag/callbacks/workflow_callbacks.py similarity index 89% rename from graphrag/callbacks/workflow_callbacks.py rename to packages/graphrag/graphrag/callbacks/workflow_callbacks.py index 0429cff809..3fb09710f9 100644 --- a/graphrag/callbacks/workflow_callbacks.py +++ b/packages/graphrag/graphrag/callbacks/workflow_callbacks.py @@ -35,3 +35,7 @@ def workflow_end(self, name: str, instance: object) -> None: def progress(self, progress: Progress) -> None: """Handle when progress occurs.""" ... + + def pipeline_error(self, error: BaseException) -> None: + """Execute this callback when an error occurs in the pipeline.""" + ... diff --git a/graphrag/callbacks/workflow_callbacks_manager.py b/packages/graphrag/graphrag/callbacks/workflow_callbacks_manager.py similarity index 85% rename from graphrag/callbacks/workflow_callbacks_manager.py rename to packages/graphrag/graphrag/callbacks/workflow_callbacks_manager.py index 1ca0c097e5..9d3803f1be 100644 --- a/graphrag/callbacks/workflow_callbacks_manager.py +++ b/packages/graphrag/graphrag/callbacks/workflow_callbacks_manager.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing the WorkflowCallbacks registry.""" +"""A module containing 'WorkflowCallbacksManager' model.""" from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.index.typing.pipeline_run_result import PipelineRunResult @@ -50,3 +50,9 @@ def progress(self, progress: Progress) -> None: for callback in self._callbacks: if hasattr(callback, "progress"): callback.progress(progress) + + def pipeline_error(self, error: BaseException) -> None: + """Execute this callback when an error occurs in the pipeline.""" + for callback in self._callbacks: + if hasattr(callback, "pipeline_error"): + callback.pipeline_error(error) diff --git a/graphrag/cli/__init__.py b/packages/graphrag/graphrag/cli/__init__.py similarity index 100% rename from graphrag/cli/__init__.py rename to packages/graphrag/graphrag/cli/__init__.py diff --git a/graphrag/cli/index.py b/packages/graphrag/graphrag/cli/index.py similarity index 69% rename from graphrag/cli/index.py rename to packages/graphrag/graphrag/cli/index.py index b5464d2544..94a40cde48 100644 --- a/graphrag/cli/index.py +++ b/packages/graphrag/graphrag/cli/index.py @@ -9,9 +9,11 @@ import warnings from pathlib import Path +from graphrag_cache.cache_type import CacheType + import graphrag.api as api from graphrag.callbacks.console_workflow_callbacks import ConsoleWorkflowCallbacks -from graphrag.config.enums import CacheType, IndexingMethod +from graphrag.config.enums import IndexingMethod from graphrag.config.load_config import load_config from graphrag.index.validate_config import validate_config_names from graphrag.utils.cli import redact @@ -43,26 +45,17 @@ def index_cli( root_dir: Path, method: IndexingMethod, verbose: bool, - memprofile: bool, cache: bool, - config_filepath: Path | None, dry_run: bool, skip_validation: bool, - output_dir: Path | None, ): """Run the pipeline with the given config.""" - cli_overrides = {} - if output_dir: - cli_overrides["output.base_dir"] = str(output_dir) - cli_overrides["reporting.base_dir"] = str(output_dir) - cli_overrides["update_index_output.base_dir"] = str(output_dir) - config = load_config(root_dir, config_filepath, cli_overrides) + config = load_config(root_dir=root_dir) _run_index( config=config, method=method, is_update_run=False, verbose=verbose, - memprofile=memprofile, cache=cache, dry_run=dry_run, skip_validation=skip_validation, @@ -73,27 +66,19 @@ def update_cli( root_dir: Path, method: IndexingMethod, verbose: bool, - memprofile: bool, cache: bool, - config_filepath: Path | None, skip_validation: bool, - output_dir: Path | None, ): """Run the pipeline with the given config.""" - cli_overrides = {} - if output_dir: - cli_overrides["output.base_dir"] = str(output_dir) - cli_overrides["reporting.base_dir"] = str(output_dir) - cli_overrides["update_index_output.base_dir"] = str(output_dir) - - config = load_config(root_dir, config_filepath, cli_overrides) + config = load_config( + root_dir=root_dir, + ) _run_index( config=config, method=method, is_update_run=True, verbose=verbose, - memprofile=memprofile, cache=cache, dry_run=False, skip_validation=skip_validation, @@ -105,7 +90,6 @@ def _run_index( method, is_update_run, verbose, - memprofile, cache, dry_run, skip_validation, @@ -120,7 +104,7 @@ def _run_index( ) if not cache: - config.cache.type = CacheType.none + config.cache.type = CacheType.Noop if not skip_validation: validate_config_names(config) @@ -142,20 +126,10 @@ def _run_index( config=config, method=method, is_update_run=is_update_run, - memory_profile=memprofile, callbacks=[ConsoleWorkflowCallbacks(verbose=verbose)], verbose=verbose, ) ) - encountered_errors = any( - output.errors and len(output.errors) > 0 for output in outputs - ) - - if encountered_errors: - logger.error( - "Errors occurred during the pipeline run, see logs for more details." - ) - else: - logger.info("All workflows completed successfully.") + encountered_errors = any(output.error is not None for output in outputs) sys.exit(1 if encountered_errors else 0) diff --git a/graphrag/cli/initialize.py b/packages/graphrag/graphrag/cli/initialize.py similarity index 75% rename from graphrag/cli/initialize.py rename to packages/graphrag/graphrag/cli/initialize.py index 09215f8c5d..3bf0c69c76 100644 --- a/graphrag/cli/initialize.py +++ b/packages/graphrag/graphrag/cli/initialize.py @@ -6,6 +6,7 @@ import logging from pathlib import Path +from graphrag.config.defaults import graphrag_config_defaults from graphrag.config.init_content import INIT_DOTENV, INIT_YAML from graphrag.prompts.index.community_report import ( COMMUNITY_REPORT_PROMPT, @@ -34,7 +35,9 @@ logger = logging.getLogger(__name__) -def initialize_project_at(path: Path, force: bool) -> None: +def initialize_project_at( + path: Path, force: bool, model: str, embedding_model: str +) -> None: """ Initialize the project at the given path. @@ -51,26 +54,30 @@ def initialize_project_at(path: Path, force: bool) -> None: If the project already exists and force is False. """ logger.info("Initializing project at %s", path) - root = Path(path) - if not root.exists(): - root.mkdir(parents=True, exist_ok=True) + root = Path(path).resolve() + root.mkdir(parents=True, exist_ok=True) settings_yaml = root / "settings.yaml" if settings_yaml.exists() and not force: msg = f"Project already initialized at {root}" raise ValueError(msg) - with settings_yaml.open("wb") as file: - file.write(INIT_YAML.encode(encoding="utf-8", errors="strict")) + input_path = ( + root / (graphrag_config_defaults.input_storage.base_dir or "input") + ).resolve() + input_path.mkdir(parents=True, exist_ok=True) + # using replace with custom tokens instead of format here because we have a placeholder for GRAPHRAG_API_KEY that is used later for .env overlay + formatted = INIT_YAML.replace("", model).replace( + "", embedding_model + ) + settings_yaml.write_text(formatted, encoding="utf-8", errors="strict") dotenv = root / ".env" if not dotenv.exists() or force: - with dotenv.open("wb") as file: - file.write(INIT_DOTENV.encode(encoding="utf-8", errors="strict")) + dotenv.write_text(INIT_DOTENV, encoding="utf-8", errors="strict") prompts_dir = root / "prompts" - if not prompts_dir.exists(): - prompts_dir.mkdir(parents=True, exist_ok=True) + prompts_dir.mkdir(parents=True, exist_ok=True) prompts = { "extract_graph": GRAPH_EXTRACTION_PROMPT, @@ -91,5 +98,4 @@ def initialize_project_at(path: Path, force: bool) -> None: for name, content in prompts.items(): prompt_file = prompts_dir / f"{name}.txt" if not prompt_file.exists() or force: - with prompt_file.open("wb") as file: - file.write(content.encode(encoding="utf-8", errors="strict")) + prompt_file.write_text(content, encoding="utf-8", errors="strict") diff --git a/graphrag/cli/main.py b/packages/graphrag/graphrag/cli/main.py similarity index 81% rename from graphrag/cli/main.py rename to packages/graphrag/graphrag/cli/main.py index bc0e9f39ac..5259cf4b85 100644 --- a/graphrag/cli/main.py +++ b/packages/graphrag/graphrag/cli/main.py @@ -10,7 +10,11 @@ import typer -from graphrag.config.defaults import graphrag_config_defaults +from graphrag.config.defaults import ( + DEFAULT_COMPLETION_MODEL, + DEFAULT_EMBEDDING_MODEL, + graphrag_config_defaults, +) from graphrag.config.enums import IndexingMethod, SearchMethod from graphrag.prompt_tune.defaults import LIMIT, MAX_TOKEN_COUNT, N_SUBSET_MAX, K from graphrag.prompt_tune.types import DocSelectionType @@ -64,9 +68,9 @@ def completer(incomplete: str) -> list[str]: # Apply wildcard matching if required if match_wildcard: completions = filter( - lambda i: wildcard_match(i, match_wildcard) - if match_wildcard - else False, + lambda i: ( + wildcard_match(i, match_wildcard) if match_wildcard else False + ), completions, ) @@ -94,15 +98,28 @@ def completer(incomplete: str) -> list[str]: @app.command("init") def _initialize_cli( root: Path = typer.Option( - Path(), + Path.cwd(), "--root", "-r", help="The project root directory.", dir_okay=True, writable=True, + file_okay=False, resolve_path=True, autocompletion=ROOT_AUTOCOMPLETE, ), + model: str = typer.Option( + DEFAULT_COMPLETION_MODEL, + "--model", + "-m", + prompt="Specify the default chat model to use", + ), + embedding_model: str = typer.Option( + DEFAULT_EMBEDDING_MODEL, + "--embedding", + "-e", + prompt="Specify the default embedding model to use", + ), force: bool = typer.Option( False, "--force", @@ -113,28 +130,21 @@ def _initialize_cli( """Generate a default configuration file.""" from graphrag.cli.initialize import initialize_project_at - initialize_project_at(path=root, force=force) + initialize_project_at( + path=root, force=force, model=model, embedding_model=embedding_model + ) @app.command("index") def _index_cli( - config: Path | None = typer.Option( - None, - "--config", - "-c", - help="The configuration to use.", - exists=True, - file_okay=True, - readable=True, - autocompletion=CONFIG_AUTOCOMPLETE, - ), root: Path = typer.Option( - Path(), + Path.cwd(), "--root", "-r", help="The project root directory.", exists=True, dir_okay=True, + file_okay=False, writable=True, resolve_path=True, autocompletion=ROOT_AUTOCOMPLETE, @@ -151,11 +161,6 @@ def _index_cli( "-v", help="Run the indexing pipeline with verbose logging", ), - memprofile: bool = typer.Option( - False, - "--memprofile", - help="Run the indexing pipeline with memory profiling", - ), dry_run: bool = typer.Option( False, "--dry-run", @@ -174,18 +179,6 @@ def _index_cli( "--skip-validation", help="Skip any preflight validation. Useful when running no LLM steps.", ), - output: Path | None = typer.Option( - None, - "--output", - "-o", - help=( - "Indexing pipeline output directory. " - "Overrides output.base_dir in the configuration file." - ), - dir_okay=True, - writable=True, - resolve_path=True, - ), ) -> None: """Build a knowledge graph index.""" from graphrag.cli.index import index_cli @@ -193,35 +186,23 @@ def _index_cli( index_cli( root_dir=root, verbose=verbose, - memprofile=memprofile, cache=cache, - config_filepath=config, dry_run=dry_run, skip_validation=skip_validation, - output_dir=output, method=method, ) @app.command("update") def _update_cli( - config: Path | None = typer.Option( - None, - "--config", - "-c", - help="The configuration to use.", - exists=True, - file_okay=True, - readable=True, - autocompletion=CONFIG_AUTOCOMPLETE, - ), root: Path = typer.Option( - Path(), + Path.cwd(), "--root", "-r", help="The project root directory.", exists=True, dir_okay=True, + file_okay=False, writable=True, resolve_path=True, autocompletion=ROOT_AUTOCOMPLETE, @@ -238,11 +219,6 @@ def _update_cli( "-v", help="Run the indexing pipeline with verbose logging.", ), - memprofile: bool = typer.Option( - False, - "--memprofile", - help="Run the indexing pipeline with memory profiling.", - ), cache: bool = typer.Option( True, "--cache/--no-cache", @@ -253,18 +229,6 @@ def _update_cli( "--skip-validation", help="Skip any preflight validation. Useful when running no LLM steps.", ), - output: Path | None = typer.Option( - None, - "--output", - "-o", - help=( - "Indexing pipeline output directory. " - "Overrides output.base_dir in the configuration file." - ), - dir_okay=True, - writable=True, - resolve_path=True, - ), ) -> None: """ Update an existing knowledge graph index. @@ -276,11 +240,8 @@ def _update_cli( update_cli( root_dir=root, verbose=verbose, - memprofile=memprofile, cache=cache, - config_filepath=config, skip_validation=skip_validation, - output_dir=output, method=method, ) @@ -288,26 +249,17 @@ def _update_cli( @app.command("prompt-tune") def _prompt_tune_cli( root: Path = typer.Option( - Path(), + Path.cwd(), "--root", "-r", help="The project root directory.", exists=True, dir_okay=True, + file_okay=False, writable=True, resolve_path=True, autocompletion=ROOT_AUTOCOMPLETE, ), - config: Path | None = typer.Option( - None, - "--config", - "-c", - help="The configuration to use.", - exists=True, - file_okay=True, - readable=True, - autocompletion=CONFIG_AUTOCOMPLETE, - ), verbose: bool = typer.Option( False, "--verbose", @@ -354,14 +306,14 @@ def _prompt_tune_cli( help="The minimum number of examples to generate/include in the entity extraction prompt.", ), chunk_size: int = typer.Option( - graphrag_config_defaults.chunks.size, + graphrag_config_defaults.chunking.size, "--chunk-size", - help="The size of each example text chunk. Overrides chunks.size in the configuration file.", + help="The size of each example text chunk. Overrides chunking.size in the configuration file.", ), overlap: int = typer.Option( - graphrag_config_defaults.chunks.overlap, + graphrag_config_defaults.chunking.overlap, "--overlap", - help="The overlap size for chunking documents. Overrides chunks.overlap in the configuration file.", + help="The overlap size for chunking documents. Overrides chunking.overlap in the configuration file.", ), language: str | None = typer.Option( None, @@ -392,7 +344,6 @@ def _prompt_tune_cli( loop.run_until_complete( prompt_tune( root=root, - config=config, domain=domain, verbose=verbose, selection_method=selection_method, @@ -412,28 +363,27 @@ def _prompt_tune_cli( @app.command("query") def _query_cli( + query: str = typer.Argument( + help="The query to execute.", + ), + root: Path = typer.Option( + Path.cwd(), + "--root", + "-r", + help="The project root directory.", + exists=True, + dir_okay=True, + file_okay=False, + writable=True, + resolve_path=True, + autocompletion=ROOT_AUTOCOMPLETE, + ), method: SearchMethod = typer.Option( - ..., + SearchMethod.GLOBAL.value, "--method", "-m", help="The query algorithm to use.", ), - query: str = typer.Option( - ..., - "--query", - "-q", - help="The query to execute.", - ), - config: Path | None = typer.Option( - None, - "--config", - "-c", - help="The configuration to use.", - exists=True, - file_okay=True, - readable=True, - autocompletion=CONFIG_AUTOCOMPLETE, - ), verbose: bool = typer.Option( False, "--verbose", @@ -451,17 +401,6 @@ def _query_cli( resolve_path=True, autocompletion=ROOT_AUTOCOMPLETE, ), - root: Path = typer.Option( - Path(), - "--root", - "-r", - help="The project root directory.", - exists=True, - dir_okay=True, - writable=True, - resolve_path=True, - autocompletion=ROOT_AUTOCOMPLETE, - ), community_level: int = typer.Option( 2, "--community-level", @@ -500,7 +439,6 @@ def _query_cli( match method: case SearchMethod.LOCAL: run_local_search( - config_filepath=config, data_dir=data, root_dir=root, community_level=community_level, @@ -511,7 +449,6 @@ def _query_cli( ) case SearchMethod.GLOBAL: run_global_search( - config_filepath=config, data_dir=data, root_dir=root, community_level=community_level, @@ -523,7 +460,6 @@ def _query_cli( ) case SearchMethod.DRIFT: run_drift_search( - config_filepath=config, data_dir=data, root_dir=root, community_level=community_level, @@ -534,9 +470,9 @@ def _query_cli( ) case SearchMethod.BASIC: run_basic_search( - config_filepath=config, data_dir=data, root_dir=root, + response_type=response_type, streaming=streaming, query=query, verbose=verbose, diff --git a/graphrag/cli/prompt_tune.py b/packages/graphrag/graphrag/cli/prompt_tune.py similarity index 90% rename from graphrag/cli/prompt_tune.py rename to packages/graphrag/graphrag/cli/prompt_tune.py index 2646776f6f..249dd7cd07 100644 --- a/graphrag/cli/prompt_tune.py +++ b/packages/graphrag/graphrag/cli/prompt_tune.py @@ -24,7 +24,6 @@ async def prompt_tune( root: Path, - config: Path | None, domain: str | None, verbose: bool, selection_method: api.DocSelectionType, @@ -43,7 +42,6 @@ async def prompt_tune( Parameters ---------- - - config: The configuration file. - root: The root directory. - domain: The domain to map the input documents to. - verbose: Enable verbose logging. @@ -58,15 +56,16 @@ async def prompt_tune( - k: The number of documents to select when using auto selection method. - min_examples_required: The minimum number of examples required for entity extraction prompts. """ - root_path = Path(root).resolve() - graph_config = load_config(root_path, config) + graph_config = load_config( + root_dir=root, + ) # override chunking config in the configuration - if chunk_size != graph_config.chunks.size: - graph_config.chunks.size = chunk_size + if chunk_size != graph_config.chunking.size: + graph_config.chunking.size = chunk_size - if overlap != graph_config.chunks.overlap: - graph_config.chunks.overlap = overlap + if overlap != graph_config.chunking.overlap: + graph_config.chunking.overlap = overlap # configure the root logger with the specified log level from graphrag.logger.standard_logging import init_loggers @@ -82,8 +81,6 @@ async def prompt_tune( prompts = await api.generate_indexing_prompts( config=graph_config, - chunk_size=chunk_size, - overlap=overlap, limit=limit, selection_method=selection_method, domain=domain, diff --git a/packages/graphrag/graphrag/cli/query.py b/packages/graphrag/graphrag/cli/query.py new file mode 100644 index 0000000000..ae06a88c95 --- /dev/null +++ b/packages/graphrag/graphrag/cli/query.py @@ -0,0 +1,396 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""CLI implementation of the query subcommand.""" + +import asyncio +import sys +from pathlib import Path +from typing import TYPE_CHECKING, Any + +from graphrag_storage import create_storage + +import graphrag.api as api +from graphrag.callbacks.noop_query_callbacks import NoopQueryCallbacks +from graphrag.config.load_config import load_config +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.utils.storage import load_table_from_storage, storage_has_table + +if TYPE_CHECKING: + import pandas as pd + +# ruff: noqa: T201 + + +def run_global_search( + data_dir: Path | None, + root_dir: Path, + community_level: int | None, + dynamic_community_selection: bool, + response_type: str, + streaming: bool, + query: str, + verbose: bool, +): + """Perform a global search with a given query. + + Loads index files required for global search and calls the Query API. + """ + cli_overrides: dict[str, Any] = {} + if data_dir: + cli_overrides["output_storage"] = {"base_dir": str(data_dir)} + config = load_config( + root_dir=root_dir, + cli_overrides=cli_overrides, + ) + + dataframe_dict = _resolve_output_files( + config=config, + output_list=[ + "entities", + "communities", + "community_reports", + ], + optional_list=[], + ) + + entities: pd.DataFrame = dataframe_dict["entities"] + communities: pd.DataFrame = dataframe_dict["communities"] + community_reports: pd.DataFrame = dataframe_dict["community_reports"] + + if streaming: + + async def run_streaming_search(): + full_response = "" + context_data = {} + + def on_context(context: Any) -> None: + nonlocal context_data + context_data = context + + callbacks = NoopQueryCallbacks() + callbacks.on_context = on_context + + async for stream_chunk in api.global_search_streaming( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + community_level=community_level, + dynamic_community_selection=dynamic_community_selection, + response_type=response_type, + query=query, + callbacks=[callbacks], + verbose=verbose, + ): + full_response += stream_chunk + print(stream_chunk, end="") + sys.stdout.flush() + print() + return full_response, context_data + + return asyncio.run(run_streaming_search()) + # not streaming + response, context_data = asyncio.run( + api.global_search( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + community_level=community_level, + dynamic_community_selection=dynamic_community_selection, + response_type=response_type, + query=query, + verbose=verbose, + ) + ) + print(response) + + return response, context_data + + +def run_local_search( + data_dir: Path | None, + root_dir: Path, + community_level: int, + response_type: str, + streaming: bool, + query: str, + verbose: bool, +): + """Perform a local search with a given query. + + Loads index files required for local search and calls the Query API. + """ + cli_overrides: dict[str, Any] = {} + if data_dir: + cli_overrides["output_storage"] = {"base_dir": str(data_dir)} + config = load_config( + root_dir=root_dir, + cli_overrides=cli_overrides, + ) + + dataframe_dict = _resolve_output_files( + config=config, + output_list=[ + "communities", + "community_reports", + "text_units", + "relationships", + "entities", + ], + optional_list=[ + "covariates", + ], + ) + + communities: pd.DataFrame = dataframe_dict["communities"] + community_reports: pd.DataFrame = dataframe_dict["community_reports"] + text_units: pd.DataFrame = dataframe_dict["text_units"] + relationships: pd.DataFrame = dataframe_dict["relationships"] + entities: pd.DataFrame = dataframe_dict["entities"] + covariates: pd.DataFrame | None = dataframe_dict["covariates"] + + if streaming: + + async def run_streaming_search(): + full_response = "" + context_data = {} + + def on_context(context: Any) -> None: + nonlocal context_data + context_data = context + + callbacks = NoopQueryCallbacks() + callbacks.on_context = on_context + + async for stream_chunk in api.local_search_streaming( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + text_units=text_units, + relationships=relationships, + covariates=covariates, + community_level=community_level, + response_type=response_type, + query=query, + callbacks=[callbacks], + verbose=verbose, + ): + full_response += stream_chunk + print(stream_chunk, end="") + sys.stdout.flush() + print() + return full_response, context_data + + return asyncio.run(run_streaming_search()) + # not streaming + response, context_data = asyncio.run( + api.local_search( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + text_units=text_units, + relationships=relationships, + covariates=covariates, + community_level=community_level, + response_type=response_type, + query=query, + verbose=verbose, + ) + ) + print(response) + + return response, context_data + + +def run_drift_search( + data_dir: Path | None, + root_dir: Path, + community_level: int, + response_type: str, + streaming: bool, + query: str, + verbose: bool, +): + """Perform a local search with a given query. + + Loads index files required for local search and calls the Query API. + """ + cli_overrides: dict[str, Any] = {} + if data_dir: + cli_overrides["output_storage"] = {"base_dir": str(data_dir)} + config = load_config( + root_dir=root_dir, + cli_overrides=cli_overrides, + ) + + dataframe_dict = _resolve_output_files( + config=config, + output_list=[ + "communities", + "community_reports", + "text_units", + "relationships", + "entities", + ], + ) + + communities: pd.DataFrame = dataframe_dict["communities"] + community_reports: pd.DataFrame = dataframe_dict["community_reports"] + text_units: pd.DataFrame = dataframe_dict["text_units"] + relationships: pd.DataFrame = dataframe_dict["relationships"] + entities: pd.DataFrame = dataframe_dict["entities"] + + if streaming: + + async def run_streaming_search(): + full_response = "" + context_data = {} + + def on_context(context: Any) -> None: + nonlocal context_data + context_data = context + + callbacks = NoopQueryCallbacks() + callbacks.on_context = on_context + + async for stream_chunk in api.drift_search_streaming( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + text_units=text_units, + relationships=relationships, + community_level=community_level, + response_type=response_type, + query=query, + callbacks=[callbacks], + verbose=verbose, + ): + full_response += stream_chunk + print(stream_chunk, end="") + sys.stdout.flush() + print() + return full_response, context_data + + return asyncio.run(run_streaming_search()) + + # not streaming + response, context_data = asyncio.run( + api.drift_search( + config=config, + entities=entities, + communities=communities, + community_reports=community_reports, + text_units=text_units, + relationships=relationships, + community_level=community_level, + response_type=response_type, + query=query, + verbose=verbose, + ) + ) + print(response) + + return response, context_data + + +def run_basic_search( + data_dir: Path | None, + root_dir: Path, + response_type: str, + streaming: bool, + query: str, + verbose: bool, +): + """Perform a basics search with a given query. + + Loads index files required for basic search and calls the Query API. + """ + cli_overrides: dict[str, Any] = {} + if data_dir: + cli_overrides["output_storage"] = {"base_dir": str(data_dir)} + config = load_config( + root_dir=root_dir, + cli_overrides=cli_overrides, + ) + + dataframe_dict = _resolve_output_files( + config=config, + output_list=[ + "text_units", + ], + ) + + text_units: pd.DataFrame = dataframe_dict["text_units"] + + if streaming: + + async def run_streaming_search(): + full_response = "" + context_data = {} + + def on_context(context: Any) -> None: + nonlocal context_data + context_data = context + + callbacks = NoopQueryCallbacks() + callbacks.on_context = on_context + + async for stream_chunk in api.basic_search_streaming( + config=config, + text_units=text_units, + response_type=response_type, + query=query, + callbacks=[callbacks], + verbose=verbose, + ): + full_response += stream_chunk + print(stream_chunk, end="") + sys.stdout.flush() + print() + return full_response, context_data + + return asyncio.run(run_streaming_search()) + # not streaming + response, context_data = asyncio.run( + api.basic_search( + config=config, + text_units=text_units, + response_type=response_type, + query=query, + verbose=verbose, + ) + ) + print(response) + + return response, context_data + + +def _resolve_output_files( + config: GraphRagConfig, + output_list: list[str], + optional_list: list[str] | None = None, +) -> dict[str, Any]: + """Read indexing output files to a dataframe dict.""" + dataframe_dict = {} + storage_obj = create_storage(config.output_storage) + for name in output_list: + df_value = asyncio.run(load_table_from_storage(name=name, storage=storage_obj)) + dataframe_dict[name] = df_value + + # for optional output files, set the dict entry to None instead of erroring out if it does not exist + if optional_list: + for optional_file in optional_list: + file_exists = asyncio.run(storage_has_table(optional_file, storage_obj)) + if file_exists: + df_value = asyncio.run( + load_table_from_storage(name=optional_file, storage=storage_obj) + ) + dataframe_dict[optional_file] = df_value + else: + dataframe_dict[optional_file] = None + return dataframe_dict diff --git a/graphrag/config/__init__.py b/packages/graphrag/graphrag/config/__init__.py similarity index 100% rename from graphrag/config/__init__.py rename to packages/graphrag/graphrag/config/__init__.py diff --git a/graphrag/config/defaults.py b/packages/graphrag/graphrag/config/defaults.py similarity index 59% rename from graphrag/config/defaults.py rename to packages/graphrag/graphrag/config/defaults.py index 6ec2e2d2bb..640933581a 100644 --- a/graphrag/config/defaults.py +++ b/packages/graphrag/graphrag/config/defaults.py @@ -3,73 +3,43 @@ """Common default configuration values.""" -from collections.abc import Callable from dataclasses import dataclass, field from pathlib import Path from typing import ClassVar +from graphrag_cache import CacheType +from graphrag_chunking.chunk_strategy_type import ChunkerType +from graphrag_input import InputType +from graphrag_llm.config import AuthMethod +from graphrag_storage import StorageType +from graphrag_vectors import VectorStoreType + from graphrag.config.embeddings import default_embeddings from graphrag.config.enums import ( AsyncType, - AuthType, - CacheType, - ChunkStrategyType, - InputFileType, - ModelType, NounPhraseExtractorType, ReportingType, - StorageType, - VectorStoreType, ) from graphrag.index.operations.build_noun_graph.np_extractors.stop_words import ( EN_STOP_WORDS, ) -from graphrag.language_model.providers.litellm.services.rate_limiter.rate_limiter import ( - RateLimiter, -) -from graphrag.language_model.providers.litellm.services.rate_limiter.static_rate_limiter import ( - StaticRateLimiter, -) -from graphrag.language_model.providers.litellm.services.retry.exponential_retry import ( - ExponentialRetry, -) -from graphrag.language_model.providers.litellm.services.retry.incremental_wait_retry import ( - IncrementalWaitRetry, -) -from graphrag.language_model.providers.litellm.services.retry.native_wait_retry import ( - NativeRetry, -) -from graphrag.language_model.providers.litellm.services.retry.random_wait_retry import ( - RandomWaitRetry, -) -from graphrag.language_model.providers.litellm.services.retry.retry import Retry +DEFAULT_INPUT_BASE_DIR = "input" DEFAULT_OUTPUT_BASE_DIR = "output" -DEFAULT_CHAT_MODEL_ID = "default_chat_model" -DEFAULT_CHAT_MODEL_TYPE = ModelType.Chat -DEFAULT_CHAT_MODEL = "gpt-4-turbo-preview" -DEFAULT_CHAT_MODEL_AUTH_TYPE = AuthType.APIKey +DEFAULT_CACHE_BASE_DIR = "cache" +DEFAULT_UPDATE_OUTPUT_BASE_DIR = "update_output" +DEFAULT_COMPLETION_MODEL_ID = "default_completion_model" +DEFAULT_COMPLETION_MODEL_AUTH_TYPE = AuthMethod.ApiKey +DEFAULT_COMPLETION_MODEL = "gpt-4.1" DEFAULT_EMBEDDING_MODEL_ID = "default_embedding_model" -DEFAULT_EMBEDDING_MODEL_TYPE = ModelType.Embedding -DEFAULT_EMBEDDING_MODEL = "text-embedding-3-small" -DEFAULT_EMBEDDING_MODEL_AUTH_TYPE = AuthType.APIKey +DEFAULT_EMBEDDING_MODEL_AUTH_TYPE = AuthMethod.ApiKey +DEFAULT_EMBEDDING_MODEL = "text-embedding-3-large" DEFAULT_MODEL_PROVIDER = "openai" -DEFAULT_VECTOR_STORE_ID = "default_vector_store" -ENCODING_MODEL = "cl100k_base" +ENCODING_MODEL = "o200k_base" COGNITIVE_SERVICES_AUDIENCE = "https://cognitiveservices.azure.com/.default" - -DEFAULT_RETRY_SERVICES: dict[str, Callable[..., Retry]] = { - "native": NativeRetry, - "exponential_backoff": ExponentialRetry, - "random_wait": RandomWaitRetry, - "incremental_wait": IncrementalWaitRetry, -} - -DEFAULT_RATE_LIMITER_SERVICES: dict[str, Callable[..., RateLimiter]] = { - "static": StaticRateLimiter, -} +DEFAULT_ENTITY_TYPES = ["organization", "person", "geo", "event"] @dataclass @@ -79,33 +49,19 @@ class BasicSearchDefaults: prompt: None = None k: int = 10 max_context_tokens: int = 12_000 - chat_model_id: str = DEFAULT_CHAT_MODEL_ID + completion_model_id: str = DEFAULT_COMPLETION_MODEL_ID embedding_model_id: str = DEFAULT_EMBEDDING_MODEL_ID @dataclass -class CacheDefaults: - """Default values for cache.""" - - type: ClassVar[CacheType] = CacheType.file - base_dir: str = "cache" - connection_string: None = None - container_name: None = None - storage_account_blob_url: None = None - cosmosdb_account_url: None = None - - -@dataclass -class ChunksDefaults: - """Default values for chunks.""" +class ChunkingDefaults: + """Default values for chunking.""" + type: str = ChunkerType.Tokens size: int = 1200 overlap: int = 100 - group_by_columns: list[str] = field(default_factory=lambda: ["id"]) - strategy: ClassVar[ChunkStrategyType] = ChunkStrategyType.tokens - encoding_model: str = "cl100k_base" - prepend_metadata: bool = False - chunk_size_includes_metadata: bool = False + encoding_model: str = ENCODING_MODEL + prepend_metadata: None = None @dataclass @@ -125,8 +81,8 @@ class CommunityReportDefaults: text_prompt: None = None max_length: int = 2000 max_input_length: int = 8000 - strategy: None = None - model_id: str = DEFAULT_CHAT_MODEL_ID + completion_model_id: str = DEFAULT_COMPLETION_MODEL_ID + model_instance_name: str = "community_reporting" @dataclass @@ -154,35 +110,19 @@ class DriftSearchDefaults: local_search_n: int = 1 local_search_llm_max_gen_tokens: int | None = None local_search_llm_max_gen_completion_tokens: int | None = None - chat_model_id: str = DEFAULT_CHAT_MODEL_ID + completion_model_id: str = DEFAULT_COMPLETION_MODEL_ID embedding_model_id: str = DEFAULT_EMBEDDING_MODEL_ID -@dataclass -class EmbedGraphDefaults: - """Default values for embedding graph.""" - - enabled: bool = False - dimensions: int = 1536 - num_walks: int = 10 - walk_length: int = 40 - window_size: int = 2 - iterations: int = 3 - random_seed: int = 597832 - use_lcc: bool = True - - @dataclass class EmbedTextDefaults: """Default values for embedding text.""" - model: str = "text-embedding-3-small" + embedding_model_id: str = DEFAULT_EMBEDDING_MODEL_ID + model_instance_name: str = "text_embedding" batch_size: int = 16 batch_max_tokens: int = 8191 - model_id: str = DEFAULT_EMBEDDING_MODEL_ID names: list[str] = field(default_factory=lambda: default_embeddings) - strategy: None = None - vector_store_id: str = DEFAULT_VECTOR_STORE_ID @dataclass @@ -195,8 +135,8 @@ class ExtractClaimsDefaults: "Any claims or facts that could be relevant to information discovery." ) max_gleanings: int = 1 - strategy: None = None - model_id: str = DEFAULT_CHAT_MODEL_ID + completion_model_id: str = DEFAULT_COMPLETION_MODEL_ID + model_instance_name: str = "extract_claims" @dataclass @@ -208,8 +148,8 @@ class ExtractGraphDefaults: default_factory=lambda: ["organization", "person", "geo", "event"] ) max_gleanings: int = 1 - strategy: None = None - model_id: str = DEFAULT_CHAT_MODEL_ID + completion_model_id: str = DEFAULT_COMPLETION_MODEL_ID + model_instance_name: str = "extract_graph" @dataclass @@ -266,75 +206,54 @@ class GlobalSearchDefaults: dynamic_search_num_repeats: int = 1 dynamic_search_use_summary: bool = False dynamic_search_max_level: int = 2 - chat_model_id: str = DEFAULT_CHAT_MODEL_ID + completion_model_id: str = DEFAULT_COMPLETION_MODEL_ID @dataclass class StorageDefaults: """Default values for storage.""" - type: ClassVar[StorageType] = StorageType.file - base_dir: str = DEFAULT_OUTPUT_BASE_DIR - connection_string: None = None - container_name: None = None - storage_account_blob_url: None = None - cosmosdb_account_url: None = None + type: str = StorageType.File + encoding: str | None = None + base_dir: str | None = None + azure_connection_string: None = None + azure_container_name: None = None + azure_account_url: None = None + azure_cosmosdb_account_url: None = None + + +@dataclass +class InputDefaults: + """Default values for input.""" + + type: ClassVar[InputType] = InputType.Text + encoding: str | None = None + file_pattern: None = None + id_column: None = None + title_column: None = None + text_column: None = None @dataclass class InputStorageDefaults(StorageDefaults): """Default values for input storage.""" - base_dir: str = "input" + base_dir: str | None = DEFAULT_INPUT_BASE_DIR @dataclass -class InputDefaults: - """Default values for input.""" +class CacheStorageDefaults(StorageDefaults): + """Default values for cache storage.""" - storage: InputStorageDefaults = field(default_factory=InputStorageDefaults) - file_type: ClassVar[InputFileType] = InputFileType.text - encoding: str = "utf-8" - file_pattern: str = "" - file_filter: None = None - text_column: str = "text" - title_column: None = None - metadata: None = None + base_dir: str | None = DEFAULT_CACHE_BASE_DIR @dataclass -class LanguageModelDefaults: - """Default values for language model.""" - - api_key: None = None - auth_type: ClassVar[AuthType] = AuthType.APIKey - model_provider: str | None = None - encoding_model: str = "" - max_tokens: int | None = None - temperature: float = 0 - max_completion_tokens: int | None = None - reasoning_effort: str | None = None - top_p: float = 1 - n: int = 1 - frequency_penalty: float = 0.0 - presence_penalty: float = 0.0 - request_timeout: float = 180.0 - api_base: None = None - api_version: None = None - deployment_name: None = None - organization: None = None - proxy: None = None - audience: None = None - model_supports_json: None = None - tokens_per_minute: None = None - requests_per_minute: None = None - rate_limit_strategy: str | None = "static" - retry_strategy: str = "exponential_backoff" - max_retries: int = 10 - max_retry_wait: float = 10.0 - concurrent_requests: int = 25 - responses: None = None - async_mode: AsyncType = AsyncType.Threaded +class CacheDefaults: + """Default values for cache.""" + + type: CacheType = CacheType.Json + storage: CacheStorageDefaults = field(default_factory=CacheStorageDefaults) @dataclass @@ -348,15 +267,15 @@ class LocalSearchDefaults: top_k_entities: int = 10 top_k_relationships: int = 10 max_context_tokens: int = 12_000 - chat_model_id: str = DEFAULT_CHAT_MODEL_ID + completion_model_id: str = DEFAULT_COMPLETION_MODEL_ID embedding_model_id: str = DEFAULT_EMBEDDING_MODEL_ID @dataclass -class OutputDefaults(StorageDefaults): +class OutputStorageDefaults(StorageDefaults): """Default values for output.""" - base_dir: str = DEFAULT_OUTPUT_BASE_DIR + base_dir: str | None = DEFAULT_OUTPUT_BASE_DIR @dataclass @@ -399,22 +318,15 @@ class SummarizeDescriptionsDefaults: prompt: None = None max_length: int = 500 max_input_tokens: int = 4_000 - strategy: None = None - model_id: str = DEFAULT_CHAT_MODEL_ID - - -@dataclass -class UmapDefaults: - """Default values for UMAP.""" - - enabled: bool = False + completion_model_id: str = DEFAULT_COMPLETION_MODEL_ID + model_instance_name: str = "summarize_descriptions" @dataclass -class UpdateIndexOutputDefaults(StorageDefaults): +class UpdateOutputStorageDefaults(StorageDefaults): """Default values for update index output.""" - base_dir: str = "update_output" + base_dir: str | None = DEFAULT_UPDATE_OUTPUT_BASE_DIR @dataclass @@ -423,33 +335,28 @@ class VectorStoreDefaults: type: ClassVar[str] = VectorStoreType.LanceDB.value db_uri: str = str(Path(DEFAULT_OUTPUT_BASE_DIR) / "lancedb") - container_name: str = "default" - overwrite: bool = True - url: None = None - api_key: None = None - audience: None = None - database_name: None = None - schema: None = None @dataclass class GraphRagConfigDefaults: """Default values for GraphRAG.""" - root_dir: str = "" models: dict = field(default_factory=dict) + completion_models: dict = field(default_factory=dict) + embedding_models: dict = field(default_factory=dict) + concurrent_requests: int = 25 + async_mode: AsyncType = AsyncType.Threaded reporting: ReportingDefaults = field(default_factory=ReportingDefaults) - storage: StorageDefaults = field(default_factory=StorageDefaults) - output: OutputDefaults = field(default_factory=OutputDefaults) - outputs: None = None - update_index_output: UpdateIndexOutputDefaults = field( - default_factory=UpdateIndexOutputDefaults + input_storage: InputStorageDefaults = field(default_factory=InputStorageDefaults) + output_storage: OutputStorageDefaults = field(default_factory=OutputStorageDefaults) + update_output_storage: UpdateOutputStorageDefaults = field( + default_factory=UpdateOutputStorageDefaults ) cache: CacheDefaults = field(default_factory=CacheDefaults) input: InputDefaults = field(default_factory=InputDefaults) - embed_graph: EmbedGraphDefaults = field(default_factory=EmbedGraphDefaults) + embed_text: EmbedTextDefaults = field(default_factory=EmbedTextDefaults) - chunks: ChunksDefaults = field(default_factory=ChunksDefaults) + chunking: ChunkingDefaults = field(default_factory=ChunkingDefaults) snapshots: SnapshotsDefaults = field(default_factory=SnapshotsDefaults) extract_graph: ExtractGraphDefaults = field(default_factory=ExtractGraphDefaults) extract_graph_nlp: ExtractGraphNLPDefaults = field( @@ -464,17 +371,15 @@ class GraphRagConfigDefaults: extract_claims: ExtractClaimsDefaults = field(default_factory=ExtractClaimsDefaults) prune_graph: PruneGraphDefaults = field(default_factory=PruneGraphDefaults) cluster_graph: ClusterGraphDefaults = field(default_factory=ClusterGraphDefaults) - umap: UmapDefaults = field(default_factory=UmapDefaults) local_search: LocalSearchDefaults = field(default_factory=LocalSearchDefaults) global_search: GlobalSearchDefaults = field(default_factory=GlobalSearchDefaults) drift_search: DriftSearchDefaults = field(default_factory=DriftSearchDefaults) basic_search: BasicSearchDefaults = field(default_factory=BasicSearchDefaults) - vector_store: dict[str, VectorStoreDefaults] = field( - default_factory=lambda: {DEFAULT_VECTOR_STORE_ID: VectorStoreDefaults()} + vector_store: VectorStoreDefaults = field( + default_factory=lambda: VectorStoreDefaults() ) workflows: None = None -language_model_defaults = LanguageModelDefaults() vector_store_defaults = VectorStoreDefaults() graphrag_config_defaults = GraphRagConfigDefaults() diff --git a/packages/graphrag/graphrag/config/embeddings.py b/packages/graphrag/graphrag/config/embeddings.py new file mode 100644 index 0000000000..7456ffca5a --- /dev/null +++ b/packages/graphrag/graphrag/config/embeddings.py @@ -0,0 +1,19 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing embeddings values.""" + +entity_description_embedding = "entity_description" +community_full_content_embedding = "community_full_content" +text_unit_text_embedding = "text_unit_text" + +all_embeddings: set[str] = { + entity_description_embedding, + community_full_content_embedding, + text_unit_text_embedding, +} +default_embeddings: list[str] = [ + entity_description_embedding, + community_full_content_embedding, + text_unit_text_embedding, +] diff --git a/packages/graphrag/graphrag/config/enums.py b/packages/graphrag/graphrag/config/enums.py new file mode 100644 index 0000000000..5084f2154b --- /dev/null +++ b/packages/graphrag/graphrag/config/enums.py @@ -0,0 +1,77 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing config enums.""" + +from __future__ import annotations + +from enum import Enum + + +class ReportingType(str, Enum): + """The reporting configuration type for the pipeline.""" + + file = "file" + """The file reporting configuration type.""" + blob = "blob" + """The blob reporting configuration type.""" + + def __repr__(self): + """Get a string representation.""" + return f'"{self.value}"' + + +class AsyncType(str, Enum): + """Enum for the type of async to use.""" + + AsyncIO = "asyncio" + Threaded = "threaded" + + +class SearchMethod(Enum): + """The type of search to run.""" + + LOCAL = "local" + GLOBAL = "global" + DRIFT = "drift" + BASIC = "basic" + + def __str__(self): + """Return the string representation of the enum value.""" + return self.value + + +class IndexingMethod(str, Enum): + """Enum for the type of indexing to perform.""" + + Standard = "standard" + """Traditional GraphRAG indexing, with all graph construction and summarization performed by a language model.""" + Fast = "fast" + """Fast indexing, using NLP for graph construction and language model for summarization.""" + StandardUpdate = "standard-update" + """Incremental update with standard indexing.""" + FastUpdate = "fast-update" + """Incremental update with fast indexing.""" + + +class NounPhraseExtractorType(str, Enum): + """Enum for the noun phrase extractor options.""" + + RegexEnglish = "regex_english" + """Standard extractor using regex. Fastest, but limited to English.""" + Syntactic = "syntactic_parser" + """Noun phrase extractor based on dependency parsing and NER using SpaCy.""" + CFG = "cfg" + """Noun phrase extractor combining CFG-based noun-chunk extraction and NER.""" + + +class ModularityMetric(str, Enum): + """Enum for the modularity metric to use.""" + + Graph = "graph" + """Graph modularity metric.""" + + LCC = "lcc" + + WeightedComponents = "weighted_components" + """Weighted components modularity metric.""" diff --git a/graphrag/config/errors.py b/packages/graphrag/graphrag/config/errors.py similarity index 80% rename from graphrag/config/errors.py rename to packages/graphrag/graphrag/config/errors.py index 32a20b838c..6dbe25ad40 100644 --- a/graphrag/config/errors.py +++ b/packages/graphrag/graphrag/config/errors.py @@ -33,15 +33,6 @@ def __init__(self, llm_type: str) -> None: super().__init__(msg) -class LanguageModelConfigMissingError(ValueError): - """Missing model configuration error.""" - - def __init__(self, key: str = "") -> None: - """Init method definition.""" - msg = f'A {key} model configuration is required. Please rerun `graphrag init` and set models["{key}"] in settings.yaml.' - super().__init__(msg) - - class ConflictingSettingsError(ValueError): """Missing model configuration error.""" diff --git a/graphrag/config/init_content.py b/packages/graphrag/graphrag/config/init_content.py similarity index 52% rename from graphrag/config/init_content.py rename to packages/graphrag/graphrag/config/init_content.py index fd16f20d35..9973d1920f 100644 --- a/graphrag/config/init_content.py +++ b/packages/graphrag/graphrag/config/init_content.py @@ -6,7 +6,6 @@ import graphrag.config.defaults as defs from graphrag.config.defaults import ( graphrag_config_defaults, - language_model_defaults, vector_store_defaults, ) @@ -17,117 +16,98 @@ ### LLM settings ### ## There are a number of settings to tune the threading and token limits for LLM calls - check the docs. -models: - {defs.DEFAULT_CHAT_MODEL_ID}: - type: {defs.DEFAULT_CHAT_MODEL_TYPE.value} +completion_models: + {defs.DEFAULT_COMPLETION_MODEL_ID}: model_provider: {defs.DEFAULT_MODEL_PROVIDER} - auth_type: {defs.DEFAULT_CHAT_MODEL_AUTH_TYPE.value} # or azure_managed_identity + model: + auth_method: {defs.DEFAULT_COMPLETION_MODEL_AUTH_TYPE} # or azure_managed_identity api_key: ${{GRAPHRAG_API_KEY}} # set this in the generated .env file, or remove if managed identity - model: {defs.DEFAULT_CHAT_MODEL} - # api_base: https://.openai.azure.com - # api_version: 2024-05-01-preview - model_supports_json: true # recommended if this is available for your model. - concurrent_requests: {language_model_defaults.concurrent_requests} - async_mode: {language_model_defaults.async_mode.value} # or asyncio - retry_strategy: {language_model_defaults.retry_strategy} - max_retries: {language_model_defaults.max_retries} - tokens_per_minute: null - requests_per_minute: null + retry: + type: exponential_backoff + +embedding_models: {defs.DEFAULT_EMBEDDING_MODEL_ID}: - type: {defs.DEFAULT_EMBEDDING_MODEL_TYPE.value} model_provider: {defs.DEFAULT_MODEL_PROVIDER} - auth_type: {defs.DEFAULT_EMBEDDING_MODEL_AUTH_TYPE.value} + model: + auth_method: {defs.DEFAULT_EMBEDDING_MODEL_AUTH_TYPE} api_key: ${{GRAPHRAG_API_KEY}} - model: {defs.DEFAULT_EMBEDDING_MODEL} - # api_base: https://.openai.azure.com - # api_version: 2024-05-01-preview - concurrent_requests: {language_model_defaults.concurrent_requests} - async_mode: {language_model_defaults.async_mode.value} # or asyncio - retry_strategy: {language_model_defaults.retry_strategy} - max_retries: {language_model_defaults.max_retries} - tokens_per_minute: null - requests_per_minute: null - -### Input settings ### + retry: + type: exponential_backoff + +### Document processing settings ### input: - storage: - type: {graphrag_config_defaults.input.storage.type.value} # or blob - base_dir: "{graphrag_config_defaults.input.storage.base_dir}" - file_type: {graphrag_config_defaults.input.file_type.value} # [csv, text, json] + type: {graphrag_config_defaults.input.type.value} # [csv, text, json, jsonl] -chunks: - size: {graphrag_config_defaults.chunks.size} - overlap: {graphrag_config_defaults.chunks.overlap} - group_by_columns: [{",".join(graphrag_config_defaults.chunks.group_by_columns)}] +chunking: + type: {graphrag_config_defaults.chunking.type} + size: {graphrag_config_defaults.chunking.size} + overlap: {graphrag_config_defaults.chunking.overlap} + encoding_model: {graphrag_config_defaults.chunking.encoding_model} -### Output/storage settings ### +### Storage settings ### ## If blob storage is specified in the following four sections, ## connection_string and container_name must be provided -output: - type: {graphrag_config_defaults.output.type.value} # [file, blob, cosmosdb] - base_dir: "{graphrag_config_defaults.output.base_dir}" - -cache: - type: {graphrag_config_defaults.cache.type.value} # [file, blob, cosmosdb] - base_dir: "{graphrag_config_defaults.cache.base_dir}" +input_storage: + type: {graphrag_config_defaults.input_storage.type} # [file, blob, cosmosdb] + base_dir: "{graphrag_config_defaults.input_storage.base_dir}" + +output_storage: + type: {graphrag_config_defaults.output_storage.type} # [file, blob, cosmosdb] + base_dir: "{graphrag_config_defaults.output_storage.base_dir}" reporting: type: {graphrag_config_defaults.reporting.type.value} # [file, blob] base_dir: "{graphrag_config_defaults.reporting.base_dir}" +cache: + type: {graphrag_config_defaults.cache.type} # [json, memory, none] + storage: + type: {graphrag_config_defaults.cache.storage.type} # [file, blob, cosmosdb] + base_dir: "{graphrag_config_defaults.cache.storage.base_dir}" + vector_store: - {defs.DEFAULT_VECTOR_STORE_ID}: - type: {vector_store_defaults.type} - db_uri: {vector_store_defaults.db_uri} - container_name: {vector_store_defaults.container_name} + type: {vector_store_defaults.type} + db_uri: {vector_store_defaults.db_uri} ### Workflow settings ### embed_text: - model_id: {graphrag_config_defaults.embed_text.model_id} - vector_store_id: {graphrag_config_defaults.embed_text.vector_store_id} + embedding_model_id: {graphrag_config_defaults.embed_text.embedding_model_id} extract_graph: - model_id: {graphrag_config_defaults.extract_graph.model_id} + completion_model_id: {graphrag_config_defaults.extract_graph.completion_model_id} prompt: "prompts/extract_graph.txt" entity_types: [{",".join(graphrag_config_defaults.extract_graph.entity_types)}] max_gleanings: {graphrag_config_defaults.extract_graph.max_gleanings} summarize_descriptions: - model_id: {graphrag_config_defaults.summarize_descriptions.model_id} + completion_model_id: {graphrag_config_defaults.summarize_descriptions.completion_model_id} prompt: "prompts/summarize_descriptions.txt" max_length: {graphrag_config_defaults.summarize_descriptions.max_length} extract_graph_nlp: text_analyzer: extractor_type: {graphrag_config_defaults.extract_graph_nlp.text_analyzer.extractor_type.value} # [regex_english, syntactic_parser, cfg] - async_mode: {graphrag_config_defaults.extract_graph_nlp.async_mode.value} # or asyncio cluster_graph: max_cluster_size: {graphrag_config_defaults.cluster_graph.max_cluster_size} extract_claims: enabled: false - model_id: {graphrag_config_defaults.extract_claims.model_id} + completion_model_id: {graphrag_config_defaults.extract_claims.completion_model_id} prompt: "prompts/extract_claims.txt" description: "{graphrag_config_defaults.extract_claims.description}" max_gleanings: {graphrag_config_defaults.extract_claims.max_gleanings} community_reports: - model_id: {graphrag_config_defaults.community_reports.model_id} + completion_model_id: {graphrag_config_defaults.community_reports.completion_model_id} graph_prompt: "prompts/community_report_graph.txt" text_prompt: "prompts/community_report_text.txt" max_length: {graphrag_config_defaults.community_reports.max_length} max_input_length: {graphrag_config_defaults.community_reports.max_input_length} -embed_graph: - enabled: false # if true, will generate node2vec embeddings for nodes - -umap: - enabled: false # if true, will generate UMAP embeddings for nodes (embed_graph must also be enabled) - snapshots: graphml: false embeddings: false @@ -137,24 +117,24 @@ ## See the config docs: https://microsoft.github.io/graphrag/config/yaml/#query local_search: - chat_model_id: {graphrag_config_defaults.local_search.chat_model_id} + completion_model_id: {graphrag_config_defaults.local_search.completion_model_id} embedding_model_id: {graphrag_config_defaults.local_search.embedding_model_id} prompt: "prompts/local_search_system_prompt.txt" global_search: - chat_model_id: {graphrag_config_defaults.global_search.chat_model_id} + completion_model_id: {graphrag_config_defaults.global_search.completion_model_id} map_prompt: "prompts/global_search_map_system_prompt.txt" reduce_prompt: "prompts/global_search_reduce_system_prompt.txt" knowledge_prompt: "prompts/global_search_knowledge_system_prompt.txt" drift_search: - chat_model_id: {graphrag_config_defaults.drift_search.chat_model_id} + completion_model_id: {graphrag_config_defaults.drift_search.completion_model_id} embedding_model_id: {graphrag_config_defaults.drift_search.embedding_model_id} prompt: "prompts/drift_search_system_prompt.txt" reduce_prompt: "prompts/drift_search_reduce_prompt.txt" basic_search: - chat_model_id: {graphrag_config_defaults.basic_search.chat_model_id} + completion_model_id: {graphrag_config_defaults.basic_search.completion_model_id} embedding_model_id: {graphrag_config_defaults.basic_search.embedding_model_id} prompt: "prompts/basic_search_system_prompt.txt" """ diff --git a/packages/graphrag/graphrag/config/load_config.py b/packages/graphrag/graphrag/config/load_config.py new file mode 100644 index 0000000000..104bd59d43 --- /dev/null +++ b/packages/graphrag/graphrag/config/load_config.py @@ -0,0 +1,47 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Default method for loading config.""" + +from pathlib import Path +from typing import Any + +from graphrag_common.config import load_config as lc + +from graphrag.config.models.graph_rag_config import GraphRagConfig + + +def load_config( + root_dir: str | Path, + cli_overrides: dict[str, Any] | None = None, +) -> GraphRagConfig: + """Load configuration from a file. + + Parameters + ---------- + root_dir : str | Path + The root directory of the project. + Searches for settings.[yaml|yml|json] config files. + cli_overrides : dict[str, Any] | None + A nested dictionary of cli overrides. + Example: {'output': {'base_dir': 'override_value'}} + + Returns + ------- + GraphRagConfig + The loaded configuration. + + Raises + ------ + FileNotFoundError + If the config file is not found. + ConfigParsingError + If there was an error parsing the config file or its environment variables. + ValidationError + If there are pydantic validation errors when instantiating the config. + """ + return lc( + config_initializer=GraphRagConfig, + config_path=root_dir, + overrides=cli_overrides, + ) diff --git a/graphrag/config/models/__init__.py b/packages/graphrag/graphrag/config/models/__init__.py similarity index 100% rename from graphrag/config/models/__init__.py rename to packages/graphrag/graphrag/config/models/__init__.py diff --git a/graphrag/config/models/basic_search_config.py b/packages/graphrag/graphrag/config/models/basic_search_config.py similarity index 90% rename from graphrag/config/models/basic_search_config.py rename to packages/graphrag/graphrag/config/models/basic_search_config.py index 66a1e68577..5b48b74d82 100644 --- a/graphrag/config/models/basic_search_config.py +++ b/packages/graphrag/graphrag/config/models/basic_search_config.py @@ -15,9 +15,9 @@ class BasicSearchConfig(BaseModel): description="The basic search prompt to use.", default=graphrag_config_defaults.basic_search.prompt, ) - chat_model_id: str = Field( + completion_model_id: str = Field( description="The model ID to use for basic search.", - default=graphrag_config_defaults.basic_search.chat_model_id, + default=graphrag_config_defaults.basic_search.completion_model_id, ) embedding_model_id: str = Field( description="The model ID to use for text embeddings.", diff --git a/graphrag/config/models/cluster_graph_config.py b/packages/graphrag/graphrag/config/models/cluster_graph_config.py similarity index 100% rename from graphrag/config/models/cluster_graph_config.py rename to packages/graphrag/graphrag/config/models/cluster_graph_config.py diff --git a/graphrag/config/models/community_reports_config.py b/packages/graphrag/graphrag/config/models/community_reports_config.py similarity index 55% rename from graphrag/config/models/community_reports_config.py rename to packages/graphrag/graphrag/config/models/community_reports_config.py index b4e9259489..604eafe484 100644 --- a/graphrag/config/models/community_reports_config.py +++ b/packages/graphrag/graphrag/config/models/community_reports_config.py @@ -3,20 +3,36 @@ """Parameterization settings for the default configuration.""" +from dataclasses import dataclass from pathlib import Path from pydantic import BaseModel, Field from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.models.language_model_config import LanguageModelConfig +from graphrag.prompts.index.community_report import COMMUNITY_REPORT_PROMPT +from graphrag.prompts.index.community_report_text_units import ( + COMMUNITY_REPORT_TEXT_PROMPT, +) + + +@dataclass +class CommunityReportPrompts: + """Community report prompt templates.""" + + graph_prompt: str + text_prompt: str class CommunityReportsConfig(BaseModel): """Configuration section for community reports.""" - model_id: str = Field( + completion_model_id: str = Field( description="The model ID to use for community reports.", - default=graphrag_config_defaults.community_reports.model_id, + default=graphrag_config_defaults.community_reports.completion_model_id, + ) + model_instance_name: str = Field( + description="The model singleton instance name. This primarily affects the cache storage partitioning.", + default=graphrag_config_defaults.community_reports.model_instance_name, ) graph_prompt: str | None = Field( description="The community report extraction prompt to use for graph-based summarization.", @@ -34,32 +50,14 @@ class CommunityReportsConfig(BaseModel): description="The maximum input length in tokens to use when generating reports.", default=graphrag_config_defaults.community_reports.max_input_length, ) - strategy: dict | None = Field( - description="The override strategy to use.", - default=graphrag_config_defaults.community_reports.strategy, - ) - - def resolved_strategy( - self, root_dir: str, model_config: LanguageModelConfig - ) -> dict: - """Get the resolved community report extraction strategy.""" - from graphrag.index.operations.summarize_communities.typing import ( - CreateCommunityReportsStrategyType, - ) - return self.strategy or { - "type": CreateCommunityReportsStrategyType.graph_intelligence, - "llm": model_config.model_dump(), - "graph_prompt": (Path(root_dir) / self.graph_prompt).read_text( - encoding="utf-8" - ) + def resolved_prompts(self) -> CommunityReportPrompts: + """Get the resolved community report extraction prompts.""" + return CommunityReportPrompts( + graph_prompt=Path(self.graph_prompt).read_text(encoding="utf-8") if self.graph_prompt - else None, - "text_prompt": (Path(root_dir) / self.text_prompt).read_text( - encoding="utf-8" - ) + else COMMUNITY_REPORT_PROMPT, + text_prompt=Path(self.text_prompt).read_text(encoding="utf-8") if self.text_prompt - else None, - "max_report_length": self.max_length, - "max_input_length": self.max_input_length, - } + else COMMUNITY_REPORT_TEXT_PROMPT, + ) diff --git a/graphrag/config/models/drift_search_config.py b/packages/graphrag/graphrag/config/models/drift_search_config.py similarity index 97% rename from graphrag/config/models/drift_search_config.py rename to packages/graphrag/graphrag/config/models/drift_search_config.py index a6edf66474..ce77fc6b1f 100644 --- a/graphrag/config/models/drift_search_config.py +++ b/packages/graphrag/graphrag/config/models/drift_search_config.py @@ -19,9 +19,9 @@ class DRIFTSearchConfig(BaseModel): description="The drift search reduce prompt to use.", default=graphrag_config_defaults.drift_search.reduce_prompt, ) - chat_model_id: str = Field( + completion_model_id: str = Field( description="The model ID to use for drift search.", - default=graphrag_config_defaults.drift_search.chat_model_id, + default=graphrag_config_defaults.drift_search.completion_model_id, ) embedding_model_id: str = Field( description="The model ID to use for drift search.", diff --git a/packages/graphrag/graphrag/config/models/embed_text_config.py b/packages/graphrag/graphrag/config/models/embed_text_config.py new file mode 100644 index 0000000000..9720c5aec4 --- /dev/null +++ b/packages/graphrag/graphrag/config/models/embed_text_config.py @@ -0,0 +1,33 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from pydantic import BaseModel, Field + +from graphrag.config.defaults import graphrag_config_defaults + + +class EmbedTextConfig(BaseModel): + """Configuration section for text embeddings.""" + + embedding_model_id: str = Field( + description="The model ID to use for text embeddings.", + default=graphrag_config_defaults.embed_text.embedding_model_id, + ) + model_instance_name: str = Field( + description="The model singleton instance name. This primarily affects the cache storage partitioning.", + default=graphrag_config_defaults.embed_text.model_instance_name, + ) + batch_size: int = Field( + description="The batch size to use.", + default=graphrag_config_defaults.embed_text.batch_size, + ) + batch_max_tokens: int = Field( + description="The batch max tokens to use.", + default=graphrag_config_defaults.embed_text.batch_max_tokens, + ) + names: list[str] = Field( + description="The specific embeddings to perform.", + default=graphrag_config_defaults.embed_text.names, + ) diff --git a/graphrag/config/models/extract_claims_config.py b/packages/graphrag/graphrag/config/models/extract_claims_config.py similarity index 55% rename from graphrag/config/models/extract_claims_config.py rename to packages/graphrag/graphrag/config/models/extract_claims_config.py index 166cc29d4e..db8e525a70 100644 --- a/graphrag/config/models/extract_claims_config.py +++ b/packages/graphrag/graphrag/config/models/extract_claims_config.py @@ -3,24 +3,36 @@ """Parameterization settings for the default configuration.""" +from dataclasses import dataclass from pathlib import Path from pydantic import BaseModel, Field from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.models.language_model_config import LanguageModelConfig +from graphrag.prompts.index.extract_claims import EXTRACT_CLAIMS_PROMPT -class ClaimExtractionConfig(BaseModel): +@dataclass +class ClaimExtractionPrompts: + """Claim extraction prompt templates.""" + + extraction_prompt: str + + +class ExtractClaimsConfig(BaseModel): """Configuration section for claim extraction.""" enabled: bool = Field( description="Whether claim extraction is enabled.", default=graphrag_config_defaults.extract_claims.enabled, ) - model_id: str = Field( + completion_model_id: str = Field( description="The model ID to use for claim extraction.", - default=graphrag_config_defaults.extract_claims.model_id, + default=graphrag_config_defaults.extract_claims.completion_model_id, + ) + model_instance_name: str = Field( + description="The model singleton instance name. This primarily affects the cache storage partitioning.", + default=graphrag_config_defaults.extract_claims.model_instance_name, ) prompt: str | None = Field( description="The claim extraction prompt to use.", @@ -34,22 +46,11 @@ class ClaimExtractionConfig(BaseModel): description="The maximum number of entity gleanings to use.", default=graphrag_config_defaults.extract_claims.max_gleanings, ) - strategy: dict | None = Field( - description="The override strategy to use.", - default=graphrag_config_defaults.extract_claims.strategy, - ) - def resolved_strategy( - self, root_dir: str, model_config: LanguageModelConfig - ) -> dict: - """Get the resolved claim extraction strategy.""" - return self.strategy or { - "llm": model_config.model_dump(), - "extraction_prompt": (Path(root_dir) / self.prompt).read_text( - encoding="utf-8" - ) + def resolved_prompts(self) -> ClaimExtractionPrompts: + """Get the resolved claim extraction prompts.""" + return ClaimExtractionPrompts( + extraction_prompt=Path(self.prompt).read_text(encoding="utf-8") if self.prompt - else None, - "claim_description": self.description, - "max_gleanings": self.max_gleanings, - } + else EXTRACT_CLAIMS_PROMPT, + ) diff --git a/graphrag/config/models/extract_graph_config.py b/packages/graphrag/graphrag/config/models/extract_graph_config.py similarity index 50% rename from graphrag/config/models/extract_graph_config.py rename to packages/graphrag/graphrag/config/models/extract_graph_config.py index 915ff5d8a5..22323a998b 100644 --- a/graphrag/config/models/extract_graph_config.py +++ b/packages/graphrag/graphrag/config/models/extract_graph_config.py @@ -3,20 +3,32 @@ """Parameterization settings for the default configuration.""" +from dataclasses import dataclass from pathlib import Path from pydantic import BaseModel, Field from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.models.language_model_config import LanguageModelConfig +from graphrag.prompts.index.extract_graph import GRAPH_EXTRACTION_PROMPT + + +@dataclass +class ExtractGraphPrompts: + """Graph extraction prompt templates.""" + + extraction_prompt: str class ExtractGraphConfig(BaseModel): """Configuration section for entity extraction.""" - model_id: str = Field( + completion_model_id: str = Field( description="The model ID to use for text embeddings.", - default=graphrag_config_defaults.extract_graph.model_id, + default=graphrag_config_defaults.extract_graph.completion_model_id, + ) + model_instance_name: str = Field( + description="The model singleton instance name. This primarily affects the cache storage partitioning.", + default=graphrag_config_defaults.extract_graph.model_instance_name, ) prompt: str | None = Field( description="The entity extraction prompt to use.", @@ -30,26 +42,11 @@ class ExtractGraphConfig(BaseModel): description="The maximum number of entity gleanings to use.", default=graphrag_config_defaults.extract_graph.max_gleanings, ) - strategy: dict | None = Field( - description="Override the default entity extraction strategy", - default=graphrag_config_defaults.extract_graph.strategy, - ) - - def resolved_strategy( - self, root_dir: str, model_config: LanguageModelConfig - ) -> dict: - """Get the resolved entity extraction strategy.""" - from graphrag.index.operations.extract_graph.typing import ( - ExtractEntityStrategyType, - ) - return self.strategy or { - "type": ExtractEntityStrategyType.graph_intelligence, - "llm": model_config.model_dump(), - "extraction_prompt": (Path(root_dir) / self.prompt).read_text( - encoding="utf-8" - ) + def resolved_prompts(self) -> ExtractGraphPrompts: + """Get the resolved graph extraction prompts.""" + return ExtractGraphPrompts( + extraction_prompt=Path(self.prompt).read_text(encoding="utf-8") if self.prompt - else None, - "max_gleanings": self.max_gleanings, - } + else GRAPH_EXTRACTION_PROMPT, + ) diff --git a/graphrag/config/models/extract_graph_nlp_config.py b/packages/graphrag/graphrag/config/models/extract_graph_nlp_config.py similarity index 100% rename from graphrag/config/models/extract_graph_nlp_config.py rename to packages/graphrag/graphrag/config/models/extract_graph_nlp_config.py diff --git a/graphrag/config/models/global_search_config.py b/packages/graphrag/graphrag/config/models/global_search_config.py similarity index 96% rename from graphrag/config/models/global_search_config.py rename to packages/graphrag/graphrag/config/models/global_search_config.py index c350efcea6..1b48500ed2 100644 --- a/graphrag/config/models/global_search_config.py +++ b/packages/graphrag/graphrag/config/models/global_search_config.py @@ -19,9 +19,9 @@ class GlobalSearchConfig(BaseModel): description="The global search reducer to use.", default=graphrag_config_defaults.global_search.reduce_prompt, ) - chat_model_id: str = Field( + completion_model_id: str = Field( description="The model ID to use for global search.", - default=graphrag_config_defaults.global_search.chat_model_id, + default=graphrag_config_defaults.global_search.completion_model_id, ) knowledge_prompt: str | None = Field( description="The global search general prompt to use.", diff --git a/packages/graphrag/graphrag/config/models/graph_rag_config.py b/packages/graphrag/graphrag/config/models/graph_rag_config.py new file mode 100644 index 0000000000..84fb2de884 --- /dev/null +++ b/packages/graphrag/graphrag/config/models/graph_rag_config.py @@ -0,0 +1,325 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Parameterization settings for the default configuration.""" + +from dataclasses import asdict +from pathlib import Path + +from devtools import pformat +from graphrag_cache import CacheConfig +from graphrag_chunking.chunking_config import ChunkingConfig +from graphrag_input import InputConfig +from graphrag_llm.config import ModelConfig +from graphrag_storage import StorageConfig, StorageType +from graphrag_vectors import IndexSchema, VectorStoreConfig, VectorStoreType +from pydantic import BaseModel, Field, model_validator + +from graphrag.config.defaults import graphrag_config_defaults +from graphrag.config.embeddings import all_embeddings +from graphrag.config.enums import AsyncType, ReportingType +from graphrag.config.models.basic_search_config import BasicSearchConfig +from graphrag.config.models.cluster_graph_config import ClusterGraphConfig +from graphrag.config.models.community_reports_config import CommunityReportsConfig +from graphrag.config.models.drift_search_config import DRIFTSearchConfig +from graphrag.config.models.embed_text_config import EmbedTextConfig +from graphrag.config.models.extract_claims_config import ExtractClaimsConfig +from graphrag.config.models.extract_graph_config import ExtractGraphConfig +from graphrag.config.models.extract_graph_nlp_config import ExtractGraphNLPConfig +from graphrag.config.models.global_search_config import GlobalSearchConfig +from graphrag.config.models.local_search_config import LocalSearchConfig +from graphrag.config.models.prune_graph_config import PruneGraphConfig +from graphrag.config.models.reporting_config import ReportingConfig +from graphrag.config.models.snapshots_config import SnapshotsConfig +from graphrag.config.models.summarize_descriptions_config import ( + SummarizeDescriptionsConfig, +) + + +class GraphRagConfig(BaseModel): + """Base class for the Default-Configuration parameterization settings.""" + + def __repr__(self) -> str: + """Get a string representation.""" + return pformat(self, highlight=False) + + def __str__(self): + """Get a string representation.""" + return self.model_dump_json(indent=4) + + completion_models: dict[str, ModelConfig] = Field( + description="Available completion model configurations.", + default=graphrag_config_defaults.completion_models, + ) + + embedding_models: dict[str, ModelConfig] = Field( + description="Available embedding model configurations.", + default=graphrag_config_defaults.embedding_models, + ) + + concurrent_requests: int = Field( + description="The default number of concurrent requests to make to language models.", + default=graphrag_config_defaults.concurrent_requests, + ) + + async_mode: AsyncType = Field( + description="The default asynchronous mode to use for language model requests.", + default=graphrag_config_defaults.async_mode, + ) + + input: InputConfig = Field( + description="The input configuration.", default=InputConfig() + ) + """The input configuration.""" + + input_storage: StorageConfig = Field( + description="The input storage configuration.", + default=StorageConfig( + base_dir=graphrag_config_defaults.input_storage.base_dir, + ), + ) + """The input storage configuration.""" + + def _validate_input_base_dir(self) -> None: + """Validate the input base directory.""" + if self.input_storage.type == StorageType.File: + if not self.input_storage.base_dir: + msg = "input storage base directory is required for file input storage. Please rerun `graphrag init` and set the input storage configuration." + raise ValueError(msg) + self.input_storage.base_dir = str( + Path(self.input_storage.base_dir).resolve() + ) + + chunking: ChunkingConfig = Field( + description="The chunking configuration to use.", + default=ChunkingConfig( + type=graphrag_config_defaults.chunking.type, + size=graphrag_config_defaults.chunking.size, + overlap=graphrag_config_defaults.chunking.overlap, + encoding_model=graphrag_config_defaults.chunking.encoding_model, + prepend_metadata=graphrag_config_defaults.chunking.prepend_metadata, + ), + ) + """The chunking configuration to use.""" + + output_storage: StorageConfig = Field( + description="The output configuration.", + default=StorageConfig( + base_dir=graphrag_config_defaults.output_storage.base_dir, + ), + ) + """The output configuration.""" + + def _validate_output_base_dir(self) -> None: + """Validate the output base directory.""" + if self.output_storage.type == StorageType.File: + if not self.output_storage.base_dir: + msg = "output base directory is required for file output. Please rerun `graphrag init` and set the output configuration." + raise ValueError(msg) + self.output_storage.base_dir = str( + Path(self.output_storage.base_dir).resolve() + ) + + update_output_storage: StorageConfig = Field( + description="The output configuration for the updated index.", + default=StorageConfig( + base_dir=graphrag_config_defaults.update_output_storage.base_dir, + ), + ) + """The output configuration for the updated index.""" + + def _validate_update_output_storage_base_dir(self) -> None: + """Validate the update output base directory.""" + if self.update_output_storage.type == StorageType.File: + if not self.update_output_storage.base_dir: + msg = "update_output_storage base directory is required for file output. Please rerun `graphrag init` and set the update_output_storage configuration." + raise ValueError(msg) + self.update_output_storage.base_dir = str( + Path(self.update_output_storage.base_dir).resolve() + ) + + cache: CacheConfig = Field( + description="The cache configuration.", + default=CacheConfig(**asdict(graphrag_config_defaults.cache)), + ) + """The cache configuration.""" + + reporting: ReportingConfig = Field( + description="The reporting configuration.", default=ReportingConfig() + ) + """The reporting configuration.""" + + def _validate_reporting_base_dir(self) -> None: + """Validate the reporting base directory.""" + if self.reporting.type == ReportingType.file: + if self.reporting.base_dir.strip() == "": + msg = "Reporting base directory is required for file reporting. Please rerun `graphrag init` and set the reporting configuration." + raise ValueError(msg) + self.reporting.base_dir = str(Path(self.reporting.base_dir).resolve()) + + vector_store: VectorStoreConfig = Field( + description="The vector store configuration.", default=VectorStoreConfig() + ) + """The vector store configuration.""" + + workflows: list[str] | None = Field( + description="List of workflows to run, in execution order. This always overrides any built-in workflow methods.", + default=graphrag_config_defaults.workflows, + ) + """List of workflows to run, in execution order.""" + + embed_text: EmbedTextConfig = Field( + description="Text embedding configuration.", + default=EmbedTextConfig(), + ) + """Text embedding configuration.""" + + extract_graph: ExtractGraphConfig = Field( + description="The entity extraction configuration to use.", + default=ExtractGraphConfig(), + ) + """The entity extraction configuration to use.""" + + summarize_descriptions: SummarizeDescriptionsConfig = Field( + description="The description summarization configuration to use.", + default=SummarizeDescriptionsConfig(), + ) + """The description summarization configuration to use.""" + + extract_graph_nlp: ExtractGraphNLPConfig = Field( + description="The NLP-based graph extraction configuration to use.", + default=ExtractGraphNLPConfig(), + ) + """The NLP-based graph extraction configuration to use.""" + + prune_graph: PruneGraphConfig = Field( + description="The graph pruning configuration to use.", + default=PruneGraphConfig(), + ) + """The graph pruning configuration to use.""" + + cluster_graph: ClusterGraphConfig = Field( + description="The cluster graph configuration to use.", + default=ClusterGraphConfig(), + ) + """The cluster graph configuration to use.""" + + extract_claims: ExtractClaimsConfig = Field( + description="The claim extraction configuration to use.", + default=ExtractClaimsConfig( + enabled=graphrag_config_defaults.extract_claims.enabled, + ), + ) + """The claim extraction configuration to use.""" + + community_reports: CommunityReportsConfig = Field( + description="The community reports configuration to use.", + default=CommunityReportsConfig(), + ) + """The community reports configuration to use.""" + + snapshots: SnapshotsConfig = Field( + description="The snapshots configuration to use.", + default=SnapshotsConfig(), + ) + """The snapshots configuration to use.""" + + local_search: LocalSearchConfig = Field( + description="The local search configuration.", default=LocalSearchConfig() + ) + """The local search configuration.""" + + global_search: GlobalSearchConfig = Field( + description="The global search configuration.", default=GlobalSearchConfig() + ) + """The global search configuration.""" + + drift_search: DRIFTSearchConfig = Field( + description="The drift search configuration.", default=DRIFTSearchConfig() + ) + """The drift search configuration.""" + + basic_search: BasicSearchConfig = Field( + description="The basic search configuration.", default=BasicSearchConfig() + ) + """The basic search configuration.""" + + def _validate_vector_store(self) -> None: + """Validate the vector store configuration specifically in the GraphRAG context. This checks and sets required dynamic defaults for the embeddings we require.""" + self._validate_vector_store_db_uri() + # check and insert/overlay schemas for all of the core embeddings + # note that this does not require that they are used, only that they have a schema + # the embed_text block has the list of actual embeddings + if not self.vector_store.index_schema: + self.vector_store.index_schema = {} + for embedding in all_embeddings: + if embedding not in self.vector_store.index_schema: + self.vector_store.index_schema[embedding] = IndexSchema( + index_name=embedding, + ) + + def _validate_vector_store_db_uri(self) -> None: + """Validate the vector store configuration.""" + store = self.vector_store + if store.type == VectorStoreType.LanceDB: + if not store.db_uri or store.db_uri.strip == "": + store.db_uri = graphrag_config_defaults.vector_store.db_uri + store.db_uri = str(Path(store.db_uri).resolve()) + + def get_completion_model_config(self, model_id: str) -> ModelConfig: + """Get a completion model configuration by ID. + + Parameters + ---------- + model_id : str + The ID of the model to get. Should match an ID in the completion_models list. + + Returns + ------- + ModelConfig + The model configuration if found. + + Raises + ------ + ValueError + If the model ID is not found in the configuration. + """ + if model_id not in self.completion_models: + err_msg = f"Model ID {model_id} not found in completion_models. Please rerun `graphrag init` and set the completion_models configuration." + raise ValueError(err_msg) + + return self.completion_models[model_id] + + def get_embedding_model_config(self, model_id: str) -> ModelConfig: + """Get an embedding model configuration by ID. + + Parameters + ---------- + model_id : str + The ID of the model to get. Should match an ID in the embedding_models list. + + Returns + ------- + ModelConfig + The model configuration if found. + + Raises + ------ + ValueError + If the model ID is not found in the configuration. + """ + if model_id not in self.embedding_models: + err_msg = f"Model ID {model_id} not found in embedding_models. Please rerun `graphrag init` and set the embedding_models configuration." + raise ValueError(err_msg) + + return self.embedding_models[model_id] + + @model_validator(mode="after") + def _validate_model(self): + """Validate the model configuration.""" + self._validate_input_base_dir() + self._validate_reporting_base_dir() + self._validate_output_base_dir() + self._validate_update_output_storage_base_dir() + self._validate_vector_store() + return self diff --git a/graphrag/config/models/local_search_config.py b/packages/graphrag/graphrag/config/models/local_search_config.py similarity index 93% rename from graphrag/config/models/local_search_config.py rename to packages/graphrag/graphrag/config/models/local_search_config.py index 4cf31ffe0e..c9adbe9098 100644 --- a/graphrag/config/models/local_search_config.py +++ b/packages/graphrag/graphrag/config/models/local_search_config.py @@ -15,9 +15,9 @@ class LocalSearchConfig(BaseModel): description="The local search prompt to use.", default=graphrag_config_defaults.local_search.prompt, ) - chat_model_id: str = Field( + completion_model_id: str = Field( description="The model ID to use for local search.", - default=graphrag_config_defaults.local_search.chat_model_id, + default=graphrag_config_defaults.local_search.completion_model_id, ) embedding_model_id: str = Field( description="The model ID to use for text embeddings.", diff --git a/graphrag/config/models/prune_graph_config.py b/packages/graphrag/graphrag/config/models/prune_graph_config.py similarity index 100% rename from graphrag/config/models/prune_graph_config.py rename to packages/graphrag/graphrag/config/models/prune_graph_config.py diff --git a/graphrag/config/models/reporting_config.py b/packages/graphrag/graphrag/config/models/reporting_config.py similarity index 95% rename from graphrag/config/models/reporting_config.py rename to packages/graphrag/graphrag/config/models/reporting_config.py index 0e33736058..7443ea2961 100644 --- a/graphrag/config/models/reporting_config.py +++ b/packages/graphrag/graphrag/config/models/reporting_config.py @@ -28,7 +28,7 @@ class ReportingConfig(BaseModel): description="The reporting container name to use.", default=graphrag_config_defaults.reporting.container_name, ) - storage_account_blob_url: str | None = Field( + account_url: str | None = Field( description="The storage account blob url to use.", default=graphrag_config_defaults.reporting.storage_account_blob_url, ) diff --git a/graphrag/config/models/snapshots_config.py b/packages/graphrag/graphrag/config/models/snapshots_config.py similarity index 100% rename from graphrag/config/models/snapshots_config.py rename to packages/graphrag/graphrag/config/models/snapshots_config.py diff --git a/graphrag/config/models/summarize_descriptions_config.py b/packages/graphrag/graphrag/config/models/summarize_descriptions_config.py similarity index 56% rename from graphrag/config/models/summarize_descriptions_config.py rename to packages/graphrag/graphrag/config/models/summarize_descriptions_config.py index ef293f69c8..ac8f1dbca3 100644 --- a/graphrag/config/models/summarize_descriptions_config.py +++ b/packages/graphrag/graphrag/config/models/summarize_descriptions_config.py @@ -3,20 +3,32 @@ """Parameterization settings for the default configuration.""" +from dataclasses import dataclass from pathlib import Path from pydantic import BaseModel, Field from graphrag.config.defaults import graphrag_config_defaults -from graphrag.config.models.language_model_config import LanguageModelConfig +from graphrag.prompts.index.summarize_descriptions import SUMMARIZE_PROMPT + + +@dataclass +class SummarizeDescriptionsPrompts: + """Description summarization prompt templates.""" + + summarize_prompt: str class SummarizeDescriptionsConfig(BaseModel): """Configuration section for description summarization.""" - model_id: str = Field( + completion_model_id: str = Field( description="The model ID to use for summarization.", - default=graphrag_config_defaults.summarize_descriptions.model_id, + default=graphrag_config_defaults.summarize_descriptions.completion_model_id, + ) + model_instance_name: str = Field( + description="The model singleton instance name. This primarily affects the cache storage partitioning.", + default=graphrag_config_defaults.summarize_descriptions.model_instance_name, ) prompt: str | None = Field( description="The description summarization prompt to use.", @@ -30,27 +42,11 @@ class SummarizeDescriptionsConfig(BaseModel): description="Maximum tokens to submit from the input entity descriptions.", default=graphrag_config_defaults.summarize_descriptions.max_input_tokens, ) - strategy: dict | None = Field( - description="The override strategy to use.", - default=graphrag_config_defaults.summarize_descriptions.strategy, - ) - - def resolved_strategy( - self, root_dir: str, model_config: LanguageModelConfig - ) -> dict: - """Get the resolved description summarization strategy.""" - from graphrag.index.operations.summarize_descriptions.summarize_descriptions import ( - SummarizeStrategyType, - ) - return self.strategy or { - "type": SummarizeStrategyType.graph_intelligence, - "llm": model_config.model_dump(), - "summarize_prompt": (Path(root_dir) / self.prompt).read_text( - encoding="utf-8" - ) + def resolved_prompts(self) -> SummarizeDescriptionsPrompts: + """Get the resolved description summarization prompts.""" + return SummarizeDescriptionsPrompts( + summarize_prompt=Path(self.prompt).read_text(encoding="utf-8") if self.prompt - else None, - "max_summary_length": self.max_length, - "max_input_tokens": self.max_input_tokens, - } + else SUMMARIZE_PROMPT, + ) diff --git a/graphrag/data_model/__init__.py b/packages/graphrag/graphrag/data_model/__init__.py similarity index 100% rename from graphrag/data_model/__init__.py rename to packages/graphrag/graphrag/data_model/__init__.py diff --git a/graphrag/data_model/community.py b/packages/graphrag/graphrag/data_model/community.py similarity index 100% rename from graphrag/data_model/community.py rename to packages/graphrag/graphrag/data_model/community.py diff --git a/graphrag/data_model/community_report.py b/packages/graphrag/graphrag/data_model/community_report.py similarity index 100% rename from graphrag/data_model/community_report.py rename to packages/graphrag/graphrag/data_model/community_report.py diff --git a/graphrag/data_model/covariate.py b/packages/graphrag/graphrag/data_model/covariate.py similarity index 100% rename from graphrag/data_model/covariate.py rename to packages/graphrag/graphrag/data_model/covariate.py diff --git a/graphrag/data_model/document.py b/packages/graphrag/graphrag/data_model/document.py similarity index 100% rename from graphrag/data_model/document.py rename to packages/graphrag/graphrag/data_model/document.py diff --git a/graphrag/data_model/entity.py b/packages/graphrag/graphrag/data_model/entity.py similarity index 100% rename from graphrag/data_model/entity.py rename to packages/graphrag/graphrag/data_model/entity.py diff --git a/graphrag/data_model/identified.py b/packages/graphrag/graphrag/data_model/identified.py similarity index 100% rename from graphrag/data_model/identified.py rename to packages/graphrag/graphrag/data_model/identified.py diff --git a/graphrag/data_model/named.py b/packages/graphrag/graphrag/data_model/named.py similarity index 100% rename from graphrag/data_model/named.py rename to packages/graphrag/graphrag/data_model/named.py diff --git a/graphrag/data_model/relationship.py b/packages/graphrag/graphrag/data_model/relationship.py similarity index 100% rename from graphrag/data_model/relationship.py rename to packages/graphrag/graphrag/data_model/relationship.py diff --git a/graphrag/data_model/schemas.py b/packages/graphrag/graphrag/data_model/schemas.py similarity index 95% rename from graphrag/data_model/schemas.py rename to packages/graphrag/graphrag/data_model/schemas.py index 42d28d9029..c0926b9bb7 100644 --- a/graphrag/data_model/schemas.py +++ b/packages/graphrag/graphrag/data_model/schemas.py @@ -13,8 +13,6 @@ NODE_DEGREE = "degree" NODE_FREQUENCY = "frequency" NODE_DETAILS = "node_details" -NODE_X = "x" -NODE_Y = "y" # POST-PREP EDGE TABLE SCHEMA EDGE_SOURCE = "source" @@ -54,7 +52,7 @@ RELATIONSHIP_IDS = "relationship_ids" TEXT_UNIT_IDS = "text_unit_ids" COVARIATE_IDS = "covariate_ids" -DOCUMENT_IDS = "document_ids" +DOCUMENT_ID = "document_id" PERIOD = "period" SIZE = "size" @@ -66,7 +64,7 @@ N_TOKENS = "n_tokens" CREATION_DATE = "creation_date" -METADATA = "metadata" +RAW_DATA = "raw_data" # the following lists define the final content and ordering of columns in the data model parquet outputs ENTITIES_FINAL_COLUMNS = [ @@ -78,8 +76,6 @@ TEXT_UNIT_IDS, NODE_FREQUENCY, NODE_DEGREE, - NODE_X, - NODE_Y, ] RELATIONSHIPS_FINAL_COLUMNS = [ @@ -146,7 +142,7 @@ SHORT_ID, TEXT, N_TOKENS, - DOCUMENT_IDS, + DOCUMENT_ID, ENTITY_IDS, RELATIONSHIP_IDS, COVARIATE_IDS, @@ -159,5 +155,5 @@ TEXT, TEXT_UNIT_IDS, CREATION_DATE, - METADATA, + RAW_DATA, ] diff --git a/graphrag/data_model/text_unit.py b/packages/graphrag/graphrag/data_model/text_unit.py similarity index 89% rename from graphrag/data_model/text_unit.py rename to packages/graphrag/graphrag/data_model/text_unit.py index 07b1b9ae9c..55006ab15b 100644 --- a/graphrag/data_model/text_unit.py +++ b/packages/graphrag/graphrag/data_model/text_unit.py @@ -28,8 +28,8 @@ class TextUnit(Identified): n_tokens: int | None = None """The number of tokens in the text (optional).""" - document_ids: list[str] | None = None - """List of document IDs in which the text unit appears (optional).""" + document_id: str | None = None + """ID of the document in which the text unit appears (optional).""" attributes: dict[str, Any] | None = None """A dictionary of additional attributes associated with the text unit (optional).""" @@ -45,7 +45,7 @@ def from_dict( relationships_key: str = "relationship_ids", covariates_key: str = "covariate_ids", n_tokens_key: str = "n_tokens", - document_ids_key: str = "document_ids", + document_id_key: str = "document_id", attributes_key: str = "attributes", ) -> "TextUnit": """Create a new text unit from the dict data.""" @@ -57,6 +57,6 @@ def from_dict( relationship_ids=d.get(relationships_key), covariate_ids=d.get(covariates_key), n_tokens=d.get(n_tokens_key), - document_ids=d.get(document_ids_key), + document_id=d.get(document_id_key), attributes=d.get(attributes_key), ) diff --git a/graphrag/data_model/types.py b/packages/graphrag/graphrag/data_model/types.py similarity index 100% rename from graphrag/data_model/types.py rename to packages/graphrag/graphrag/data_model/types.py diff --git a/graphrag/index/__init__.py b/packages/graphrag/graphrag/index/__init__.py similarity index 100% rename from graphrag/index/__init__.py rename to packages/graphrag/graphrag/index/__init__.py diff --git a/graphrag/index/operations/__init__.py b/packages/graphrag/graphrag/index/operations/__init__.py similarity index 100% rename from graphrag/index/operations/__init__.py rename to packages/graphrag/graphrag/index/operations/__init__.py diff --git a/graphrag/index/operations/build_noun_graph/__init__.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/__init__.py similarity index 100% rename from graphrag/index/operations/build_noun_graph/__init__.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/__init__.py diff --git a/graphrag/index/operations/build_noun_graph/build_noun_graph.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/build_noun_graph.py similarity index 90% rename from graphrag/index/operations/build_noun_graph/build_noun_graph.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/build_noun_graph.py index dca2644ca9..32c2ef7b9d 100644 --- a/graphrag/index/operations/build_noun_graph/build_noun_graph.py +++ b/packages/graphrag/graphrag/index/operations/build_noun_graph/build_noun_graph.py @@ -7,9 +7,8 @@ import numpy as np import pandas as pd +from graphrag_cache import Cache -from graphrag.cache.noop_pipeline_cache import NoopPipelineCache -from graphrag.cache.pipeline_cache import PipelineCache from graphrag.config.enums import AsyncType from graphrag.index.operations.build_noun_graph.np_extractors.base import ( BaseNounPhraseExtractor, @@ -23,9 +22,9 @@ async def build_noun_graph( text_unit_df: pd.DataFrame, text_analyzer: BaseNounPhraseExtractor, normalize_edge_weights: bool, - num_threads: int = 4, - async_mode: AsyncType = AsyncType.Threaded, - cache: PipelineCache | None = None, + num_threads: int, + async_mode: AsyncType, + cache: Cache, ) -> tuple[pd.DataFrame, pd.DataFrame]: """Build a noun graph from text units.""" text_units = text_unit_df.loc[:, ["id", "text"]] @@ -43,9 +42,9 @@ async def build_noun_graph( async def _extract_nodes( text_unit_df: pd.DataFrame, text_analyzer: BaseNounPhraseExtractor, - num_threads: int = 4, - async_mode: AsyncType = AsyncType.Threaded, - cache: PipelineCache | None = None, + num_threads: int, + async_mode: AsyncType, + cache: Cache, ) -> pd.DataFrame: """ Extract initial nodes and edges from text units. @@ -53,7 +52,6 @@ async def _extract_nodes( Input: text unit df with schema [id, text, document_id] Returns a dataframe with schema [id, title, frequency, text_unit_ids]. """ - cache = cache or NoopPipelineCache() cache = cache.child("extract_noun_phrases") async def extract(row): @@ -66,7 +64,7 @@ async def extract(row): await cache.set(key, result) return result - text_unit_df["noun_phrases"] = await derive_from_rows( + text_unit_df["noun_phrases"] = await derive_from_rows( # type: ignore text_unit_df, extract, num_threads=num_threads, @@ -100,11 +98,14 @@ def _extract_edges( Input: nodes_df with schema [id, title, frequency, text_unit_ids] Returns: edges_df with schema [source, target, weight, text_unit_ids] """ + if nodes_df.empty: + return pd.DataFrame(columns=["source", "target", "weight", "text_unit_ids"]) + text_units_df = nodes_df.explode("text_unit_ids") text_units_df = text_units_df.rename(columns={"text_unit_ids": "text_unit_id"}) - text_units_df = ( - text_units_df.groupby("text_unit_id") + text_units_df + .groupby("text_unit_id") .agg({"title": lambda x: list(x) if len(x) > 1 else np.nan}) .reset_index() ) diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/__init__.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/__init__.py similarity index 100% rename from graphrag/index/operations/build_noun_graph/np_extractors/__init__.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/__init__.py diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/base.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/base.py similarity index 100% rename from graphrag/index/operations/build_noun_graph/np_extractors/base.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/base.py diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/cfg_extractor.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/cfg_extractor.py similarity index 98% rename from graphrag/index/operations/build_noun_graph/np_extractors/cfg_extractor.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/cfg_extractor.py index 68c636ac03..60941eefc0 100644 --- a/graphrag/index/operations/build_noun_graph/np_extractors/cfg_extractor.py +++ b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/cfg_extractor.py @@ -165,7 +165,8 @@ def _tag_noun_phrases( return { "cleaned_tokens": cleaned_tokens, - "cleaned_text": self.word_delimiter.join(cleaned_tokens) + "cleaned_text": self.word_delimiter + .join(cleaned_tokens) .replace("\n", "") .upper(), "is_valid_entity": has_valid_entity, diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/factory.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/factory.py similarity index 100% rename from graphrag/index/operations/build_noun_graph/np_extractors/factory.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/factory.py diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/np_validator.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/np_validator.py similarity index 100% rename from graphrag/index/operations/build_noun_graph/np_extractors/np_validator.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/np_validator.py diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/regex_extractor.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/regex_extractor.py similarity index 97% rename from graphrag/index/operations/build_noun_graph/np_extractors/regex_extractor.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/regex_extractor.py index 2f14b68e0d..b5490188b8 100644 --- a/graphrag/index/operations/build_noun_graph/np_extractors/regex_extractor.py +++ b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/regex_extractor.py @@ -110,7 +110,8 @@ def _tag_noun_phrases( ) and all(len(token) <= self.max_word_length for token in cleaned_tokens) return { "cleaned_tokens": cleaned_tokens, - "cleaned_text": self.word_delimiter.join(token for token in cleaned_tokens) + "cleaned_text": self.word_delimiter + .join(token for token in cleaned_tokens) .replace("\n", "") .upper(), "has_proper_nouns": has_proper_nouns, diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/resource_loader.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/resource_loader.py similarity index 100% rename from graphrag/index/operations/build_noun_graph/np_extractors/resource_loader.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/resource_loader.py diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/stop_words.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/stop_words.py similarity index 100% rename from graphrag/index/operations/build_noun_graph/np_extractors/stop_words.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/stop_words.py diff --git a/graphrag/index/operations/build_noun_graph/np_extractors/syntactic_parsing_extractor.py b/packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/syntactic_parsing_extractor.py similarity index 100% rename from graphrag/index/operations/build_noun_graph/np_extractors/syntactic_parsing_extractor.py rename to packages/graphrag/graphrag/index/operations/build_noun_graph/np_extractors/syntactic_parsing_extractor.py diff --git a/graphrag/index/operations/cluster_graph.py b/packages/graphrag/graphrag/index/operations/cluster_graph.py similarity index 94% rename from graphrag/index/operations/cluster_graph.py rename to packages/graphrag/graphrag/index/operations/cluster_graph.py index de16e2d35c..ff4632ea17 100644 --- a/graphrag/index/operations/cluster_graph.py +++ b/packages/graphrag/graphrag/index/operations/cluster_graph.py @@ -1,13 +1,13 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing cluster_graph, apply_clustering and run_layout methods definition.""" +"""A module containing cluster_graph method definition.""" import logging import networkx as nx -from graspologic.partition import hierarchical_leiden +from graphrag.index.utils.graphs import hierarchical_leiden from graphrag.index.utils.stable_lcc import stable_largest_connected_component Communities = list[tuple[int, int, int, list[str]]] diff --git a/graphrag/index/operations/compute_degree.py b/packages/graphrag/graphrag/index/operations/compute_degree.py similarity index 86% rename from graphrag/index/operations/compute_degree.py rename to packages/graphrag/graphrag/index/operations/compute_degree.py index b720bf6de5..8de95ad2e2 100644 --- a/graphrag/index/operations/compute_degree.py +++ b/packages/graphrag/graphrag/index/operations/compute_degree.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing create_graph definition.""" +"""A module containing compute_degree method definition.""" import networkx as nx import pandas as pd diff --git a/graphrag/index/operations/compute_edge_combined_degree.py b/packages/graphrag/graphrag/index/operations/compute_edge_combined_degree.py similarity index 94% rename from graphrag/index/operations/compute_edge_combined_degree.py rename to packages/graphrag/graphrag/index/operations/compute_edge_combined_degree.py index f6c75b008e..440fe39222 100644 --- a/graphrag/index/operations/compute_edge_combined_degree.py +++ b/packages/graphrag/graphrag/index/operations/compute_edge_combined_degree.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing compute_edge_combined_degree methods definition.""" +"""A module containing compute_edge_combined_degree method definition.""" from typing import cast diff --git a/graphrag/index/operations/create_graph.py b/packages/graphrag/graphrag/index/operations/create_graph.py similarity index 100% rename from graphrag/index/operations/create_graph.py rename to packages/graphrag/graphrag/index/operations/create_graph.py diff --git a/graphrag/index/operations/embed_text/__init__.py b/packages/graphrag/graphrag/index/operations/embed_text/__init__.py similarity index 100% rename from graphrag/index/operations/embed_text/__init__.py rename to packages/graphrag/graphrag/index/operations/embed_text/__init__.py diff --git a/packages/graphrag/graphrag/index/operations/embed_text/embed_text.py b/packages/graphrag/graphrag/index/operations/embed_text/embed_text.py new file mode 100644 index 0000000000..af0b79bbb5 --- /dev/null +++ b/packages/graphrag/graphrag/index/operations/embed_text/embed_text.py @@ -0,0 +1,89 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing embed_text method definition.""" + +import logging +from typing import TYPE_CHECKING + +import numpy as np +import pandas as pd +from graphrag_llm.tokenizer import Tokenizer +from graphrag_vectors import VectorStore, VectorStoreDocument + +from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks +from graphrag.index.operations.embed_text.run_embed_text import run_embed_text + +if TYPE_CHECKING: + from graphrag_llm.embedding import LLMEmbedding + +logger = logging.getLogger(__name__) + + +async def embed_text( + input: pd.DataFrame, + callbacks: WorkflowCallbacks, + model: "LLMEmbedding", + tokenizer: Tokenizer, + embed_column: str, + batch_size: int, + batch_max_tokens: int, + num_threads: int, + vector_store: VectorStore, + id_column: str = "id", +): + """Embed a piece of text into a vector space. The operation outputs a new column containing a mapping between doc_id and vector.""" + if embed_column not in input.columns: + msg = f"Column {embed_column} not found in input dataframe with columns {input.columns}" + raise ValueError(msg) + if id_column not in input.columns: + msg = f"Column {id_column} not found in input dataframe with columns {input.columns}" + raise ValueError(msg) + + vector_store.create_index() + + index = 0 + + all_results = [] + + num_total_batches = (input.shape[0] + batch_size - 1) // batch_size + while batch_size * index < input.shape[0]: + logger.info( + "uploading text embeddings batch %d/%d of size %d to vector store", + index + 1, + num_total_batches, + batch_size, + ) + batch = input.iloc[batch_size * index : batch_size * (index + 1)] + texts: list[str] = batch[embed_column].tolist() + ids: list[str] = batch[id_column].tolist() + result = await run_embed_text( + texts, + callbacks, + model, + tokenizer, + batch_size, + batch_max_tokens, + num_threads, + ) + if result.embeddings: + embeddings = [ + embedding for embedding in result.embeddings if embedding is not None + ] + all_results.extend(embeddings) + + vectors = result.embeddings or [] + documents: list[VectorStoreDocument] = [] + for doc_id, doc_vector in zip(ids, vectors, strict=True): + if type(doc_vector) is np.ndarray: + doc_vector = doc_vector.tolist() + document = VectorStoreDocument( + id=doc_id, + vector=doc_vector, + ) + documents.append(document) + + vector_store.load_documents(documents) + index += 1 + + return all_results diff --git a/graphrag/index/operations/embed_text/strategies/openai.py b/packages/graphrag/graphrag/index/operations/embed_text/run_embed_text.py similarity index 66% rename from graphrag/index/operations/embed_text/strategies/openai.py rename to packages/graphrag/graphrag/index/operations/embed_text/run_embed_text.py index ef8aadff6b..6755c146bb 100644 --- a/graphrag/index/operations/embed_text/strategies/openai.py +++ b/packages/graphrag/graphrag/index/operations/embed_text/run_embed_text.py @@ -1,59 +1,56 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing run method definition.""" +"""A module containing 'TextEmbeddingResult' model and run_embed_text method definition.""" import asyncio import logging -from typing import Any +from dataclasses import dataclass +from typing import TYPE_CHECKING import numpy as np +from graphrag_chunking.token_chunker import split_text_on_tokens +from graphrag_llm.tokenizer import Tokenizer -from graphrag.cache.pipeline_cache import PipelineCache from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.config.models.language_model_config import LanguageModelConfig -from graphrag.index.operations.embed_text.strategies.typing import TextEmbeddingResult -from graphrag.index.text_splitting.text_splitting import TokenTextSplitter from graphrag.index.utils.is_null import is_null -from graphrag.language_model.manager import ModelManager -from graphrag.language_model.protocol.base import EmbeddingModel from graphrag.logger.progress import ProgressTicker, progress_ticker -from graphrag.tokenizer.get_tokenizer import get_tokenizer + +if TYPE_CHECKING: + from graphrag_llm.embedding import LLMEmbedding logger = logging.getLogger(__name__) -async def run( +@dataclass +class TextEmbeddingResult: + """Text embedding result class definition.""" + + embeddings: list[list[float] | None] | None + + +async def run_embed_text( input: list[str], callbacks: WorkflowCallbacks, - cache: PipelineCache, - args: dict[str, Any], + model: "LLMEmbedding", + tokenizer: Tokenizer, + batch_size: int, + batch_max_tokens: int, + num_threads: int, ) -> TextEmbeddingResult: """Run the Claim extraction chain.""" if is_null(input): return TextEmbeddingResult(embeddings=None) - batch_size = args.get("batch_size", 16) - batch_max_tokens = args.get("batch_max_tokens", 8191) - llm_config = args["llm"] - llm_config = LanguageModelConfig(**args["llm"]) - splitter = _get_splitter(llm_config, batch_max_tokens) - model = ModelManager().get_or_create_embedding_model( - name="text_embedding", - model_type=llm_config.type, - config=llm_config, - callbacks=callbacks, - cache=cache, - ) - semaphore: asyncio.Semaphore = asyncio.Semaphore(args.get("num_threads", 4)) + semaphore: asyncio.Semaphore = asyncio.Semaphore(num_threads) # Break up the input texts. The sizes here indicate how many snippets are in each input text - texts, input_sizes = _prepare_embed_texts(input, splitter) + texts, input_sizes = _prepare_embed_texts(input, tokenizer, batch_max_tokens) text_batches = _create_text_batches( texts, + tokenizer, batch_size, batch_max_tokens, - splitter, ) logger.info( "embedding %d inputs via %d snippets using %d batches. max_batch_size=%d, batch_max_tokens=%d", @@ -76,25 +73,16 @@ async def run( return TextEmbeddingResult(embeddings=embeddings) -def _get_splitter( - config: LanguageModelConfig, batch_max_tokens: int -) -> TokenTextSplitter: - return TokenTextSplitter( - tokenizer=get_tokenizer(model_config=config), - chunk_size=batch_max_tokens, - ) - - async def _execute( - model: EmbeddingModel, + model: "LLMEmbedding", chunks: list[list[str]], tick: ProgressTicker, semaphore: asyncio.Semaphore, ) -> list[list[float]]: async def embed(chunk: list[str]): async with semaphore: - chunk_embeddings = await model.aembed_batch(chunk) - result = np.array(chunk_embeddings) + embeddings_response = await model.embedding_async(input=chunk) + result = np.array(embeddings_response.embeddings) tick(1) return result @@ -106,9 +94,9 @@ async def embed(chunk: list[str]): def _create_text_batches( texts: list[str], + tokenizer: Tokenizer, max_batch_size: int, max_batch_tokens: int, - splitter: TokenTextSplitter, ) -> list[list[str]]: """Create batches of texts to embed.""" # https://learn.microsoft.com/en-us/azure/ai-services/openai/reference @@ -118,7 +106,7 @@ def _create_text_batches( current_batch_tokens = 0 for text in texts: - token_count = splitter.num_tokens(text) + token_count = tokenizer.num_tokens(text) if ( len(current_batch) >= max_batch_size or current_batch_tokens + token_count > max_batch_tokens @@ -137,18 +125,23 @@ def _create_text_batches( def _prepare_embed_texts( - input: list[str], splitter: TokenTextSplitter + input: list[str], + tokenizer: Tokenizer, + batch_max_tokens: int = 8191, + chunk_overlap: int = 100, ) -> tuple[list[str], list[int]]: sizes: list[int] = [] snippets: list[str] = [] for text in input: - # Split the input text and filter out any empty content - split_texts = splitter.split_text(text) - if split_texts is None: - continue + split_texts = split_text_on_tokens( + text, + chunk_size=batch_max_tokens, + chunk_overlap=chunk_overlap, + encode=tokenizer.encode, + decode=tokenizer.decode, + ) split_texts = [text for text in split_texts if len(text) > 0] - sizes.append(len(split_texts)) snippets.extend(split_texts) diff --git a/graphrag/index/operations/extract_covariates/__init__.py b/packages/graphrag/graphrag/index/operations/extract_covariates/__init__.py similarity index 100% rename from graphrag/index/operations/extract_covariates/__init__.py rename to packages/graphrag/graphrag/index/operations/extract_covariates/__init__.py diff --git a/packages/graphrag/graphrag/index/operations/extract_covariates/claim_extractor.py b/packages/graphrag/graphrag/index/operations/extract_covariates/claim_extractor.py new file mode 100644 index 0000000000..a334f360c2 --- /dev/null +++ b/packages/graphrag/graphrag/index/operations/extract_covariates/claim_extractor.py @@ -0,0 +1,193 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'ClaimExtractorResult' and 'ClaimExtractor' models.""" + +import logging +import traceback +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any + +from graphrag_llm.utils import ( + CompletionMessagesBuilder, +) + +from graphrag.config.defaults import graphrag_config_defaults +from graphrag.index.typing.error_handler import ErrorHandlerFn +from graphrag.prompts.index.extract_claims import ( + CONTINUE_PROMPT, + LOOP_PROMPT, +) + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + +INPUT_TEXT_KEY = "input_text" +INPUT_ENTITY_SPEC_KEY = "entity_specs" +INPUT_CLAIM_DESCRIPTION_KEY = "claim_description" +INPUT_RESOLVED_ENTITIES_KEY = "resolved_entities" +RECORD_DELIMITER_KEY = "record_delimiter" +COMPLETION_DELIMITER_KEY = "completion_delimiter" +TUPLE_DELIMITER = "<|>" +RECORD_DELIMITER = "##" +COMPLETION_DELIMITER = "<|COMPLETE|>" +logger = logging.getLogger(__name__) + + +@dataclass +class ClaimExtractorResult: + """Claim extractor result class definition.""" + + output: list[dict] + source_docs: dict[str, Any] + + +class ClaimExtractor: + """Claim extractor class definition.""" + + _model: "LLMCompletion" + _extraction_prompt: str + _max_gleanings: int + _on_error: ErrorHandlerFn + + def __init__( + self, + model: "LLMCompletion", + extraction_prompt: str, + max_gleanings: int | None = None, + on_error: ErrorHandlerFn | None = None, + ): + """Init method definition.""" + self._model = model + self._extraction_prompt = extraction_prompt + self._max_gleanings = ( + max_gleanings + if max_gleanings is not None + else graphrag_config_defaults.extract_claims.max_gleanings + ) + self._on_error = on_error or (lambda _e, _s, _d: None) + + async def __call__( + self, + texts, + entity_spec, + resolved_entities, + claim_description, + ) -> ClaimExtractorResult: + """Call method definition.""" + source_doc_map = {} + all_claims: list[dict] = [] + for doc_index, text in enumerate(texts): + document_id = f"d{doc_index}" + try: + claims = await self._process_document( + text, claim_description, entity_spec + ) + all_claims += [ + self._clean_claim(c, document_id, resolved_entities) for c in claims + ] + source_doc_map[document_id] = text + except Exception as e: + logger.exception("error extracting claim") + self._on_error( + e, + traceback.format_exc(), + {"doc_index": doc_index, "text": text}, + ) + continue + + return ClaimExtractorResult( + output=all_claims, + source_docs=source_doc_map, + ) + + def _clean_claim( + self, claim: dict, document_id: str, resolved_entities: dict + ) -> dict: + # clean the parsed claims to remove any claims with status = False + obj = claim.get("object_id", claim.get("object")) + subject = claim.get("subject_id", claim.get("subject")) + + # If subject or object in resolved entities, then replace with resolved entity + obj = resolved_entities.get(obj, obj) + subject = resolved_entities.get(subject, subject) + claim["object_id"] = obj + claim["subject_id"] = subject + return claim + + async def _process_document( + self, text: str, claim_description: str, entity_spec: dict + ) -> list[dict]: + messages_builder = CompletionMessagesBuilder().add_user_message( + self._extraction_prompt.format(**{ + INPUT_TEXT_KEY: text, + INPUT_CLAIM_DESCRIPTION_KEY: claim_description, + INPUT_ENTITY_SPEC_KEY: entity_spec, + }) + ) + + response: LLMCompletionResponse = await self._model.completion_async( + messages=messages_builder.build(), + ) # type: ignore + results = response.content + messages_builder.add_assistant_message(results) + claims = results.strip().removesuffix(COMPLETION_DELIMITER) + + # if gleanings are specified, enter a loop to extract more claims + # there are two exit criteria: (a) we hit the configured max, (b) the model says there are no more claims + if self._max_gleanings > 0: + for i in range(self._max_gleanings): + messages_builder.add_user_message(CONTINUE_PROMPT) + response: LLMCompletionResponse = await self._model.completion_async( + messages=messages_builder.build(), + ) # type: ignore + extension = response.content + messages_builder.add_assistant_message(extension) + claims += RECORD_DELIMITER + extension.strip().removesuffix( + COMPLETION_DELIMITER + ) + + # If this isn't the last loop, check to see if we should continue + if i >= self._max_gleanings - 1: + break + + messages_builder.add_user_message(LOOP_PROMPT) + response: LLMCompletionResponse = await self._model.completion_async( + messages=messages_builder.build(), + ) # type: ignore + + if response.content != "Y": + break + + return self._parse_claim_tuples(results) + + def _parse_claim_tuples(self, claims: str) -> list[dict[str, Any]]: + """Parse claim tuples.""" + + def pull_field(index: int, fields: list[str]) -> str | None: + return fields[index].strip() if len(fields) > index else None + + result: list[dict[str, Any]] = [] + claims_values = ( + claims.strip().removesuffix(COMPLETION_DELIMITER).split(RECORD_DELIMITER) + ) + for claim in claims_values: + claim = claim.strip().removeprefix("(").removesuffix(")") + + # Ignore the completion delimiter + if claim == COMPLETION_DELIMITER: + continue + + claim_fields = claim.split(TUPLE_DELIMITER) + result.append({ + "subject_id": pull_field(0, claim_fields), + "object_id": pull_field(1, claim_fields), + "type": pull_field(2, claim_fields), + "status": pull_field(3, claim_fields), + "start_date": pull_field(4, claim_fields), + "end_date": pull_field(5, claim_fields), + "description": pull_field(6, claim_fields), + "source_text": pull_field(7, claim_fields), + }) + return result diff --git a/graphrag/index/operations/extract_covariates/extract_covariates.py b/packages/graphrag/graphrag/index/operations/extract_covariates/extract_covariates.py similarity index 56% rename from graphrag/index/operations/extract_covariates/extract_covariates.py rename to packages/graphrag/graphrag/index/operations/extract_covariates/extract_covariates.py index d29ca61e9d..2d366511e2 100644 --- a/graphrag/index/operations/extract_covariates/extract_covariates.py +++ b/packages/graphrag/graphrag/index/operations/extract_covariates/extract_covariates.py @@ -6,59 +6,51 @@ import logging from collections.abc import Iterable from dataclasses import asdict -from typing import Any +from typing import TYPE_CHECKING, Any import pandas as pd -from graphrag.cache.pipeline_cache import PipelineCache from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.config.defaults import graphrag_config_defaults from graphrag.config.enums import AsyncType -from graphrag.config.models.language_model_config import LanguageModelConfig from graphrag.index.operations.extract_covariates.claim_extractor import ClaimExtractor from graphrag.index.operations.extract_covariates.typing import ( Covariate, CovariateExtractionResult, ) from graphrag.index.utils.derive_from_rows import derive_from_rows -from graphrag.language_model.manager import ModelManager - -logger = logging.getLogger(__name__) +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion -DEFAULT_ENTITY_TYPES = ["organization", "person", "geo", "event"] +logger = logging.getLogger(__name__) async def extract_covariates( input: pd.DataFrame, callbacks: WorkflowCallbacks, - cache: PipelineCache, + model: "LLMCompletion", column: str, covariate_type: str, - strategy: dict[str, Any] | None, - async_mode: AsyncType = AsyncType.AsyncIO, - entity_types: list[str] | None = None, - num_threads: int = 4, + max_gleanings: int, + claim_description: str, + prompt: str, + entity_types: list[str], + num_threads: int, + async_type: AsyncType, ): """Extract claims from a piece of text.""" - logger.debug("extract_covariates strategy=%s", strategy) - if entity_types is None: - entity_types = DEFAULT_ENTITY_TYPES - resolved_entities_map = {} - strategy = strategy or {} - strategy_config = {**strategy} - async def run_strategy(row): text = row[column] result = await run_extract_claims( input=text, entity_types=entity_types, resolved_entities_map=resolved_entities_map, - callbacks=callbacks, - cache=cache, - strategy_config=strategy_config, + model=model, + max_gleanings=max_gleanings, + claim_description=claim_description, + prompt=prompt, ) return [ create_row_from_claim_data(row, item, covariate_type) @@ -69,8 +61,8 @@ async def run_strategy(row): input, run_strategy, callbacks, - async_type=async_mode, num_threads=num_threads, + async_type=async_type, progress_msg="extract covariates progress: ", ) return pd.DataFrame([item for row in results for item in row or []]) @@ -85,53 +77,29 @@ async def run_extract_claims( input: str | Iterable[str], entity_types: list[str], resolved_entities_map: dict[str, str], - callbacks: WorkflowCallbacks, - cache: PipelineCache, - strategy_config: dict[str, Any], + model: "LLMCompletion", + max_gleanings: int, + claim_description: str, + prompt: str, ) -> CovariateExtractionResult: """Run the Claim extraction chain.""" - llm_config = LanguageModelConfig(**strategy_config["llm"]) - llm = ModelManager().get_or_create_chat_model( - name="extract_claims", - model_type=llm_config.type, - config=llm_config, - callbacks=callbacks, - cache=cache, - ) - - extraction_prompt = strategy_config.get("extraction_prompt") - max_gleanings = strategy_config.get( - "max_gleanings", graphrag_config_defaults.extract_claims.max_gleanings - ) - tuple_delimiter = strategy_config.get("tuple_delimiter") - record_delimiter = strategy_config.get("record_delimiter") - completion_delimiter = strategy_config.get("completion_delimiter") - extractor = ClaimExtractor( - model_invoker=llm, - extraction_prompt=extraction_prompt, + model=model, + extraction_prompt=prompt, max_gleanings=max_gleanings, on_error=lambda e, s, d: logger.error( "Claim Extraction Error", exc_info=e, extra={"stack": s, "details": d} ), ) - claim_description = strategy_config.get("claim_description") - if claim_description is None: - msg = "claim_description is required for claim extraction" - raise ValueError(msg) - input = [input] if isinstance(input, str) else input - results = await extractor({ - "input_text": input, - "entity_specs": entity_types, - "resolved_entities": resolved_entities_map, - "claim_description": claim_description, - "tuple_delimiter": tuple_delimiter, - "record_delimiter": record_delimiter, - "completion_delimiter": completion_delimiter, - }) + results = await extractor( + texts=input, + entity_spec=entity_types, + resolved_entities=resolved_entities_map, + claim_description=claim_description, + ) claim_data = results.output return CovariateExtractionResult([create_covariate(item) for item in claim_data]) diff --git a/graphrag/index/operations/extract_covariates/typing.py b/packages/graphrag/graphrag/index/operations/extract_covariates/typing.py similarity index 93% rename from graphrag/index/operations/extract_covariates/typing.py rename to packages/graphrag/graphrag/index/operations/extract_covariates/typing.py index a524b2bc17..d5e82ad2fc 100644 --- a/graphrag/index/operations/extract_covariates/typing.py +++ b/packages/graphrag/graphrag/index/operations/extract_covariates/typing.py @@ -7,7 +7,8 @@ from dataclasses import dataclass from typing import Any -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag_cache import Cache + from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks @@ -42,7 +43,7 @@ class CovariateExtractionResult: list[str], dict[str, str], WorkflowCallbacks, - PipelineCache, + Cache, dict[str, Any], ], Awaitable[CovariateExtractionResult], diff --git a/graphrag/index/operations/extract_graph/__init__.py b/packages/graphrag/graphrag/index/operations/extract_graph/__init__.py similarity index 100% rename from graphrag/index/operations/extract_graph/__init__.py rename to packages/graphrag/graphrag/index/operations/extract_graph/__init__.py diff --git a/graphrag/index/operations/extract_graph/extract_graph.py b/packages/graphrag/graphrag/index/operations/extract_graph/extract_graph.py similarity index 50% rename from graphrag/index/operations/extract_graph/extract_graph.py rename to packages/graphrag/graphrag/index/operations/extract_graph/extract_graph.py index 76bcf40c76..7ab881c2ab 100644 --- a/graphrag/index/operations/extract_graph/extract_graph.py +++ b/packages/graphrag/graphrag/index/operations/extract_graph/extract_graph.py @@ -1,71 +1,60 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing entity_extract methods.""" +"""A module containing extract_graph method.""" import logging -from typing import Any +from typing import TYPE_CHECKING import pandas as pd -from graphrag.cache.pipeline_cache import PipelineCache from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.config.enums import AsyncType -from graphrag.index.operations.extract_graph.typing import ( - Document, - EntityExtractStrategy, - ExtractEntityStrategyType, -) +from graphrag.index.operations.extract_graph.graph_extractor import GraphExtractor from graphrag.index.utils.derive_from_rows import derive_from_rows -logger = logging.getLogger(__name__) - +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion -DEFAULT_ENTITY_TYPES = ["organization", "person", "geo", "event"] +logger = logging.getLogger(__name__) async def extract_graph( text_units: pd.DataFrame, callbacks: WorkflowCallbacks, - cache: PipelineCache, text_column: str, id_column: str, - strategy: dict[str, Any] | None, - async_mode: AsyncType = AsyncType.AsyncIO, - entity_types=DEFAULT_ENTITY_TYPES, - num_threads: int = 4, + model: "LLMCompletion", + prompt: str, + entity_types: list[str], + max_gleanings: int, + num_threads: int, + async_type: AsyncType, ) -> tuple[pd.DataFrame, pd.DataFrame]: """Extract a graph from a piece of text using a language model.""" - logger.debug("entity_extract strategy=%s", strategy) - if entity_types is None: - entity_types = DEFAULT_ENTITY_TYPES - strategy = strategy or {} - strategy_exec = _load_strategy( - strategy.get("type", ExtractEntityStrategyType.graph_intelligence) - ) - strategy_config = {**strategy} - num_started = 0 async def run_strategy(row): nonlocal num_started text = row[text_column] id = row[id_column] - result = await strategy_exec( - [Document(text=text, id=id)], - entity_types, - cache, - strategy_config, + result = await _run_extract_graph( + text=text, + source_id=id, + entity_types=entity_types, + model=model, + prompt=prompt, + max_gleanings=max_gleanings, ) num_started += 1 - return [result.entities, result.relationships, result.graph] + return result results = await derive_from_rows( text_units, run_strategy, callbacks, - async_type=async_mode, num_threads=num_threads, + async_type=async_type, progress_msg="extract graph progress: ", ) @@ -73,8 +62,8 @@ async def run_strategy(row): relationship_dfs = [] for result in results: if result: - entity_dfs.append(pd.DataFrame(result[0])) - relationship_dfs.append(pd.DataFrame(result[1])) + entity_dfs.append(result[0]) + relationship_dfs.append(result[1]) entities = _merge_entities(entity_dfs) relationships = _merge_relationships(relationship_dfs) @@ -82,25 +71,39 @@ async def run_strategy(row): return (entities, relationships) -def _load_strategy(strategy_type: ExtractEntityStrategyType) -> EntityExtractStrategy: - """Load strategy method definition.""" - match strategy_type: - case ExtractEntityStrategyType.graph_intelligence: - from graphrag.index.operations.extract_graph.graph_intelligence_strategy import ( - run_graph_intelligence, - ) +async def _run_extract_graph( + text: str, + source_id: str, + entity_types: list[str], + model: "LLMCompletion", + prompt: str, + max_gleanings: int, +) -> tuple[pd.DataFrame, pd.DataFrame]: + """Run the graph intelligence entity extraction strategy.""" + extractor = GraphExtractor( + model=model, + prompt=prompt, + max_gleanings=max_gleanings, + on_error=lambda e, s, d: logger.error( + "Entity Extraction Error", exc_info=e, extra={"stack": s, "details": d} + ), + ) + text = text.strip() - return run_graph_intelligence + entities_df, relationships_df = await extractor( + text, + entity_types=entity_types, + source_id=source_id, + ) - case _: - msg = f"Unknown strategy: {strategy_type}" - raise ValueError(msg) + return (entities_df, relationships_df) def _merge_entities(entity_dfs) -> pd.DataFrame: all_entities = pd.concat(entity_dfs, ignore_index=True) return ( - all_entities.groupby(["title", "type"], sort=False) + all_entities + .groupby(["title", "type"], sort=False) .agg( description=("description", list), text_unit_ids=("source_id", list), @@ -113,7 +116,8 @@ def _merge_entities(entity_dfs) -> pd.DataFrame: def _merge_relationships(relationship_dfs) -> pd.DataFrame: all_relationships = pd.concat(relationship_dfs, ignore_index=False) return ( - all_relationships.groupby(["source", "target"], sort=False) + all_relationships + .groupby(["source", "target"], sort=False) .agg( description=("description", list), text_unit_ids=("source_id", list), diff --git a/packages/graphrag/graphrag/index/operations/extract_graph/graph_extractor.py b/packages/graphrag/graphrag/index/operations/extract_graph/graph_extractor.py new file mode 100644 index 0000000000..ce78c0f6b9 --- /dev/null +++ b/packages/graphrag/graphrag/index/operations/extract_graph/graph_extractor.py @@ -0,0 +1,188 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Graph extraction helpers that return tabular data.""" + +import logging +import re +import traceback +from typing import TYPE_CHECKING, Any + +import pandas as pd +from graphrag_llm.utils import ( + CompletionMessagesBuilder, +) + +from graphrag.index.typing.error_handler import ErrorHandlerFn +from graphrag.index.utils.string import clean_str +from graphrag.prompts.index.extract_graph import ( + CONTINUE_PROMPT, + LOOP_PROMPT, +) + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + +INPUT_TEXT_KEY = "input_text" +RECORD_DELIMITER_KEY = "record_delimiter" +COMPLETION_DELIMITER_KEY = "completion_delimiter" +ENTITY_TYPES_KEY = "entity_types" +TUPLE_DELIMITER = "<|>" +RECORD_DELIMITER = "##" +COMPLETION_DELIMITER = "<|COMPLETE|>" + +logger = logging.getLogger(__name__) + + +class GraphExtractor: + """Unipartite graph extractor class definition.""" + + _model: "LLMCompletion" + _extraction_prompt: str + _max_gleanings: int + _on_error: ErrorHandlerFn + + def __init__( + self, + model: "LLMCompletion", + prompt: str, + max_gleanings: int, + on_error: ErrorHandlerFn | None = None, + ): + """Init method definition.""" + self._model = model + self._extraction_prompt = prompt + self._max_gleanings = max_gleanings + self._on_error = on_error or (lambda _e, _s, _d: None) + + async def __call__( + self, text: str, entity_types: list[str], source_id: str + ) -> tuple[pd.DataFrame, pd.DataFrame]: + """Extract entities and relationships from the supplied text.""" + try: + # Invoke the entity extraction + result = await self._process_document(text, entity_types) + except Exception as e: # pragma: no cover - defensive logging + logger.exception("error extracting graph") + self._on_error( + e, + traceback.format_exc(), + { + "source_id": source_id, + "text": text, + }, + ) + return _empty_entities_df(), _empty_relationships_df() + + return self._process_result( + result, + source_id, + TUPLE_DELIMITER, + RECORD_DELIMITER, + ) + + async def _process_document(self, text: str, entity_types: list[str]) -> str: + messages_builder = CompletionMessagesBuilder().add_user_message( + self._extraction_prompt.format(**{ + INPUT_TEXT_KEY: text, + ENTITY_TYPES_KEY: ",".join(entity_types), + }) + ) + + response: LLMCompletionResponse = await self._model.completion_async( + messages=messages_builder.build(), + ) # type: ignore + results = response.content + messages_builder.add_assistant_message(results) + + # if gleanings are specified, enter a loop to extract more entities + # there are two exit criteria: (a) we hit the configured max, (b) the model says there are no more entities + if self._max_gleanings > 0: + for i in range(self._max_gleanings): + messages_builder.add_user_message(CONTINUE_PROMPT) + response: LLMCompletionResponse = await self._model.completion_async( + messages=messages_builder.build(), + ) # type: ignore + response_text = response.content + messages_builder.add_assistant_message(response_text) + results += response_text + + # if this is the final glean, don't bother updating the continuation flag + if i >= self._max_gleanings - 1: + break + + messages_builder.add_user_message(LOOP_PROMPT) + response: LLMCompletionResponse = await self._model.completion_async( + messages=messages_builder.build(), + ) # type: ignore + if response.content != "Y": + break + + return results + + def _process_result( + self, + result: str, + source_id: str, + tuple_delimiter: str, + record_delimiter: str, + ) -> tuple[pd.DataFrame, pd.DataFrame]: + """Parse the result string into entity and relationship data frames.""" + entities: list[dict[str, Any]] = [] + relationships: list[dict[str, Any]] = [] + + records = [r.strip() for r in result.split(record_delimiter)] + + for raw_record in records: + record = re.sub(r"^\(|\)$", "", raw_record.strip()) + if not record or record == COMPLETION_DELIMITER: + continue + + record_attributes = record.split(tuple_delimiter) + record_type = record_attributes[0] + + if record_type == '"entity"' and len(record_attributes) >= 4: + entity_name = clean_str(record_attributes[1].upper()) + entity_type = clean_str(record_attributes[2].upper()) + entity_description = clean_str(record_attributes[3]) + entities.append({ + "title": entity_name, + "type": entity_type, + "description": entity_description, + "source_id": source_id, + }) + + if record_type == '"relationship"' and len(record_attributes) >= 5: + source = clean_str(record_attributes[1].upper()) + target = clean_str(record_attributes[2].upper()) + edge_description = clean_str(record_attributes[3]) + try: + weight = float(record_attributes[-1]) + except ValueError: + weight = 1.0 + + relationships.append({ + "source": source, + "target": target, + "description": edge_description, + "source_id": source_id, + "weight": weight, + }) + + entities_df = pd.DataFrame(entities) if entities else _empty_entities_df() + relationships_df = ( + pd.DataFrame(relationships) if relationships else _empty_relationships_df() + ) + + return entities_df, relationships_df + + +def _empty_entities_df() -> pd.DataFrame: + return pd.DataFrame(columns=["title", "type", "description", "source_id"]) + + +def _empty_relationships_df() -> pd.DataFrame: + return pd.DataFrame( + columns=["source", "target", "weight", "description", "source_id"] + ) diff --git a/graphrag/index/operations/finalize_community_reports.py b/packages/graphrag/graphrag/index/operations/finalize_community_reports.py similarity index 82% rename from graphrag/index/operations/finalize_community_reports.py rename to packages/graphrag/graphrag/index/operations/finalize_community_reports.py index 124e17e430..4446e3ee8f 100644 --- a/graphrag/index/operations/finalize_community_reports.py +++ b/packages/graphrag/graphrag/index/operations/finalize_community_reports.py @@ -3,11 +3,10 @@ """All the steps to transform final entities.""" -from uuid import uuid4 - import pandas as pd from graphrag.data_model.schemas import COMMUNITY_REPORTS_FINAL_COLUMNS +from graphrag.index.utils.hashing import gen_sha512_hash def finalize_community_reports( @@ -25,7 +24,9 @@ def finalize_community_reports( community_reports["community"] = community_reports["community"].astype(int) community_reports["human_readable_id"] = community_reports["community"] - community_reports["id"] = [uuid4().hex for _ in range(len(community_reports))] + community_reports["id"] = community_reports.apply( + lambda row: gen_sha512_hash(row, ["full_content"]), axis=1 + ) return community_reports.loc[ :, diff --git a/graphrag/index/operations/finalize_entities.py b/packages/graphrag/graphrag/index/operations/finalize_entities.py similarity index 59% rename from graphrag/index/operations/finalize_entities.py rename to packages/graphrag/graphrag/index/operations/finalize_entities.py index cd1dbb83eb..28ac2a55f0 100644 --- a/graphrag/index/operations/finalize_entities.py +++ b/packages/graphrag/graphrag/index/operations/finalize_entities.py @@ -7,38 +7,20 @@ import pandas as pd -from graphrag.config.models.embed_graph_config import EmbedGraphConfig from graphrag.data_model.schemas import ENTITIES_FINAL_COLUMNS from graphrag.index.operations.compute_degree import compute_degree from graphrag.index.operations.create_graph import create_graph -from graphrag.index.operations.embed_graph.embed_graph import embed_graph -from graphrag.index.operations.layout_graph.layout_graph import layout_graph def finalize_entities( entities: pd.DataFrame, relationships: pd.DataFrame, - embed_config: EmbedGraphConfig | None = None, - layout_enabled: bool = False, ) -> pd.DataFrame: """All the steps to transform final entities.""" graph = create_graph(relationships, edge_attr=["weight"]) - graph_embeddings = None - if embed_config is not None and embed_config.enabled: - graph_embeddings = embed_graph( - graph, - embed_config, - ) - layout = layout_graph( - graph, - layout_enabled, - embeddings=graph_embeddings, - ) degrees = compute_degree(graph) - final_entities = ( - entities.merge(layout, left_on="title", right_on="label", how="left") - .merge(degrees, on="title", how="left") - .drop_duplicates(subset="title") + final_entities = entities.merge(degrees, on="title", how="left").drop_duplicates( + subset="title" ) final_entities = final_entities.loc[entities["title"].notna()].reset_index() # disconnected nodes and those with no community even at level 0 can be missing degree diff --git a/graphrag/index/operations/finalize_relationships.py b/packages/graphrag/graphrag/index/operations/finalize_relationships.py similarity index 100% rename from graphrag/index/operations/finalize_relationships.py rename to packages/graphrag/graphrag/index/operations/finalize_relationships.py diff --git a/graphrag/index/operations/graph_to_dataframes.py b/packages/graphrag/graphrag/index/operations/graph_to_dataframes.py similarity index 95% rename from graphrag/index/operations/graph_to_dataframes.py rename to packages/graphrag/graphrag/index/operations/graph_to_dataframes.py index dbc608f640..632eb12586 100644 --- a/graphrag/index/operations/graph_to_dataframes.py +++ b/packages/graphrag/graphrag/index/operations/graph_to_dataframes.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing create_graph definition.""" +"""A module containing graph_to_dataframes method definition.""" import networkx as nx import pandas as pd diff --git a/graphrag/index/operations/prune_graph.py b/packages/graphrag/graphrag/index/operations/prune_graph.py similarity index 91% rename from graphrag/index/operations/prune_graph.py rename to packages/graphrag/graphrag/index/operations/prune_graph.py index d826558584..11a5335b4e 100644 --- a/graphrag/index/operations/prune_graph.py +++ b/packages/graphrag/graphrag/index/operations/prune_graph.py @@ -5,11 +5,11 @@ from typing import TYPE_CHECKING, cast -import graspologic as glc import networkx as nx import numpy as np import graphrag.data_model.schemas as schemas +from graphrag.index.utils.graphs import largest_connected_component if TYPE_CHECKING: from networkx.classes.reportviews import DegreeView @@ -50,7 +50,8 @@ def prune_graph( graph.remove_nodes_from([ node for node, data in graph.nodes(data=True) - if data[schemas.NODE_FREQUENCY] < min_node_freq + if schemas.NODE_FREQUENCY not in data + or data[schemas.NODE_FREQUENCY] < min_node_freq ]) if max_node_freq_std is not None: upper_threshold = _get_upper_threshold_by_std( @@ -64,6 +65,9 @@ def prune_graph( ]) # remove edges by min weight + if len(graph.edges) == 0: + return graph + if min_edge_weight_pct > 0: min_edge_weight = np.percentile( [data[schemas.EDGE_WEIGHT] for _, _, data in graph.edges(data=True)], @@ -78,7 +82,7 @@ def prune_graph( ]) if lcc_only: - return glc.utils.largest_connected_component(graph) # type: ignore + return largest_connected_component(graph) return graph diff --git a/graphrag/index/operations/snapshot_graphml.py b/packages/graphrag/graphrag/index/operations/snapshot_graphml.py similarity index 83% rename from graphrag/index/operations/snapshot_graphml.py rename to packages/graphrag/graphrag/index/operations/snapshot_graphml.py index c1eb9b0688..9124038401 100644 --- a/graphrag/index/operations/snapshot_graphml.py +++ b/packages/graphrag/graphrag/index/operations/snapshot_graphml.py @@ -4,14 +4,13 @@ """A module containing snapshot_graphml method definition.""" import networkx as nx - -from graphrag.storage.pipeline_storage import PipelineStorage +from graphrag_storage import Storage async def snapshot_graphml( input: str | nx.Graph, name: str, - storage: PipelineStorage, + storage: Storage, ) -> None: """Take a entire snapshot of a graph to standard graphml format.""" graphml = input if isinstance(input, str) else "\n".join(nx.generate_graphml(input)) diff --git a/graphrag/index/operations/summarize_communities/__init__.py b/packages/graphrag/graphrag/index/operations/summarize_communities/__init__.py similarity index 100% rename from graphrag/index/operations/summarize_communities/__init__.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/__init__.py diff --git a/graphrag/index/operations/summarize_communities/build_mixed_context.py b/packages/graphrag/graphrag/index/operations/summarize_communities/build_mixed_context.py similarity index 95% rename from graphrag/index/operations/summarize_communities/build_mixed_context.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/build_mixed_context.py index 0e0a4e39f0..27f4d35e7d 100644 --- a/graphrag/index/operations/summarize_communities/build_mixed_context.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/build_mixed_context.py @@ -1,14 +1,15 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing the build_mixed_context method definition.""" + +"""A module containing build_mixed_context method definition.""" import pandas as pd +from graphrag_llm.tokenizer import Tokenizer import graphrag.data_model.schemas as schemas from graphrag.index.operations.summarize_communities.graph_context.sort_context import ( sort_context, ) -from graphrag.tokenizer.tokenizer import Tokenizer def build_mixed_context( diff --git a/graphrag/index/operations/summarize_communities/community_reports_extractor.py b/packages/graphrag/graphrag/index/operations/summarize_communities/community_reports_extractor.py similarity index 76% rename from graphrag/index/operations/summarize_communities/community_reports_extractor.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/community_reports_extractor.py index 1442a44a1b..4513abe95b 100644 --- a/graphrag/index/operations/summarize_communities/community_reports_extractor.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/community_reports_extractor.py @@ -6,12 +6,14 @@ import logging import traceback from dataclasses import dataclass +from typing import TYPE_CHECKING from pydantic import BaseModel, Field from graphrag.index.typing.error_handler import ErrorHandlerFn -from graphrag.language_model.protocol.base import ChatModel -from graphrag.prompts.index.community_report import COMMUNITY_REPORT_PROMPT + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion logger = logging.getLogger(__name__) @@ -50,7 +52,7 @@ class CommunityReportsResult: class CommunityReportsExtractor: """Community reports extractor class definition.""" - _model: ChatModel + _model: "LLMCompletion" _extraction_prompt: str _output_formatter_prompt: str _on_error: ErrorHandlerFn @@ -58,16 +60,16 @@ class CommunityReportsExtractor: def __init__( self, - model_invoker: ChatModel, - extraction_prompt: str | None = None, + model: "LLMCompletion", + extraction_prompt: str, + max_report_length: int, on_error: ErrorHandlerFn | None = None, - max_report_length: int | None = None, ): """Init method definition.""" - self._model = model_invoker - self._extraction_prompt = extraction_prompt or COMMUNITY_REPORT_PROMPT + self._model = model + self._extraction_prompt = extraction_prompt self._on_error = on_error or (lambda _e, _s, _d: None) - self._max_report_length = max_report_length or 1500 + self._max_report_length = max_report_length async def __call__(self, input_text: str): """Call method definition.""" @@ -77,14 +79,12 @@ async def __call__(self, input_text: str): INPUT_TEXT_KEY: input_text, MAX_LENGTH_KEY: str(self._max_report_length), }) - response = await self._model.achat( - prompt, - json=True, # Leaving this as True to avoid creating new cache entries - name="create_community_report", - json_model=CommunityReportResponse, # A model is required when using json mode + response = await self._model.completion_async( + messages=prompt, + response_format=CommunityReportResponse, # A model is required when using json mode ) - output = response.parsed_response + output = response.formatted_response # type: ignore except Exception as e: logger.exception("error generating community report") self._on_error(e, traceback.format_exc(), None) diff --git a/graphrag/index/operations/summarize_communities/explode_communities.py b/packages/graphrag/graphrag/index/operations/summarize_communities/explode_communities.py similarity index 100% rename from graphrag/index/operations/summarize_communities/explode_communities.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/explode_communities.py diff --git a/graphrag/index/operations/summarize_communities/graph_context/__init__.py b/packages/graphrag/graphrag/index/operations/summarize_communities/graph_context/__init__.py similarity index 100% rename from graphrag/index/operations/summarize_communities/graph_context/__init__.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/graph_context/__init__.py diff --git a/graphrag/index/operations/summarize_communities/graph_context/context_builder.py b/packages/graphrag/graphrag/index/operations/summarize_communities/graph_context/context_builder.py similarity index 96% rename from graphrag/index/operations/summarize_communities/graph_context/context_builder.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/graph_context/context_builder.py index 34d281b3f8..f8e140fd98 100644 --- a/graphrag/index/operations/summarize_communities/graph_context/context_builder.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/graph_context/context_builder.py @@ -7,6 +7,7 @@ from typing import cast import pandas as pd +from graphrag_llm.tokenizer import Tokenizer import graphrag.data_model.schemas as schemas from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks @@ -30,7 +31,6 @@ where_column_equals, ) from graphrag.logger.progress import progress_iterable -from graphrag.tokenizer.tokenizer import Tokenizer logger = logging.getLogger(__name__) @@ -79,7 +79,7 @@ def _prepare_reports_at_level( edge_df.loc[:, schemas.EDGE_SOURCE].isin(nodes_set) & edge_df.loc[:, schemas.EDGE_TARGET].isin(nodes_set) ] - level_edge_df.loc[:, schemas.EDGE_DETAILS] = level_edge_df.loc[ + level_edge_df.loc[:, schemas.EDGE_DETAILS] = level_edge_df.loc[ # type: ignore :, [ schemas.SHORT_ID, @@ -99,14 +99,16 @@ def _prepare_reports_at_level( # Merge node and edge details # Group edge details by node and aggregate into lists source_edges = ( - level_edge_df.groupby(schemas.EDGE_SOURCE) + level_edge_df + .groupby(schemas.EDGE_SOURCE) .agg({schemas.EDGE_DETAILS: "first"}) .reset_index() .rename(columns={schemas.EDGE_SOURCE: schemas.TITLE}) ) target_edges = ( - level_edge_df.groupby(schemas.EDGE_TARGET) + level_edge_df + .groupby(schemas.EDGE_TARGET) .agg({schemas.EDGE_DETAILS: "first"}) .reset_index() .rename(columns={schemas.EDGE_TARGET: schemas.TITLE}) @@ -129,7 +131,8 @@ def _prepare_reports_at_level( # Aggregate node and edge details merged_node_df = ( - merged_node_df.groupby([ + merged_node_df + .groupby([ schemas.TITLE, schemas.COMMUNITY_ID, schemas.COMMUNITY_LEVEL, @@ -155,8 +158,9 @@ def _prepare_reports_at_level( ) # Create the ALL_CONTEXT column - merged_node_df[schemas.ALL_CONTEXT] = ( - merged_node_df.loc[ + merged_node_df[schemas.ALL_CONTEXT] = ( # type: ignore + merged_node_df + .loc[ :, [ schemas.TITLE, @@ -175,7 +179,8 @@ def _prepare_reports_at_level( # group all node details by community community_df = ( - merged_node_df.groupby(schemas.COMMUNITY_ID) + merged_node_df + .groupby(schemas.COMMUNITY_ID) .agg({schemas.ALL_CONTEXT: list}) .reset_index() ) @@ -351,7 +356,8 @@ def _get_community_df( axis=1, ) community_df = ( - community_df.groupby(schemas.COMMUNITY_ID) + community_df + .groupby(schemas.COMMUNITY_ID) .agg({schemas.ALL_CONTEXT: list}) .reset_index() ) diff --git a/graphrag/index/operations/summarize_communities/graph_context/sort_context.py b/packages/graphrag/graphrag/index/operations/summarize_communities/graph_context/sort_context.py similarity index 99% rename from graphrag/index/operations/summarize_communities/graph_context/sort_context.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/graph_context/sort_context.py index 3b7863f2f8..18d843e4c5 100644 --- a/graphrag/index/operations/summarize_communities/graph_context/sort_context.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/graph_context/sort_context.py @@ -3,9 +3,9 @@ """Sort context by degree in descending order.""" import pandas as pd +from graphrag_llm.tokenizer import Tokenizer import graphrag.data_model.schemas as schemas -from graphrag.tokenizer.tokenizer import Tokenizer def sort_context( diff --git a/graphrag/index/operations/summarize_communities/summarize_communities.py b/packages/graphrag/graphrag/index/operations/summarize_communities/summarize_communities.py similarity index 55% rename from graphrag/index/operations/summarize_communities/summarize_communities.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/summarize_communities.py index c31a4b0d77..7330b3f80e 100644 --- a/graphrag/index/operations/summarize_communities/summarize_communities.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/summarize_communities.py @@ -1,29 +1,35 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing create_community_reports and load_strategy methods definition.""" +"""A module containing summarize_communities method definition.""" import logging from collections.abc import Callable +from typing import TYPE_CHECKING import pandas as pd +from graphrag_llm.tokenizer import Tokenizer import graphrag.data_model.schemas as schemas -from graphrag.cache.pipeline_cache import PipelineCache from graphrag.callbacks.noop_workflow_callbacks import NoopWorkflowCallbacks from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.config.enums import AsyncType +from graphrag.index.operations.summarize_communities.community_reports_extractor import ( + CommunityReportsExtractor, +) from graphrag.index.operations.summarize_communities.typing import ( CommunityReport, CommunityReportsStrategy, - CreateCommunityReportsStrategyType, + Finding, ) from graphrag.index.operations.summarize_communities.utils import ( get_levels, ) from graphrag.index.utils.derive_from_rows import derive_from_rows from graphrag.logger.progress import progress_ticker -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion logger = logging.getLogger(__name__) @@ -34,20 +40,20 @@ async def summarize_communities( local_contexts, level_context_builder: Callable, callbacks: WorkflowCallbacks, - cache: PipelineCache, - strategy: dict, + model: "LLMCompletion", + prompt: str, tokenizer: Tokenizer, max_input_length: int, - async_mode: AsyncType = AsyncType.AsyncIO, - num_threads: int = 4, + max_report_length: int, + num_threads: int, + async_type: AsyncType, ): """Generate community summaries.""" reports: list[CommunityReport | None] = [] tick = progress_ticker(callbacks.progress, len(local_contexts)) - strategy_exec = load_strategy(strategy["type"]) - strategy_config = {**strategy} community_hierarchy = ( - communities.explode("children") + communities + .explode("children") .rename({"children": "sub_community"}, axis=1) .loc[:, ["community", "level", "sub_community"]] ).dropna() @@ -70,13 +76,13 @@ async def summarize_communities( async def run_generate(record): result = await _generate_report( - strategy_exec, + run_extractor, community_id=record[schemas.COMMUNITY_ID], community_level=record[schemas.COMMUNITY_LEVEL], community_context=record[schemas.CONTEXT_STRING], - callbacks=callbacks, - cache=cache, - strategy=strategy_config, + model=model, + extraction_prompt=prompt, + max_report_length=max_report_length, ) tick() return result @@ -86,7 +92,7 @@ async def run_generate(record): run_generate, callbacks=NoopWorkflowCallbacks(), num_threads=num_threads, - async_type=async_mode, + async_type=async_type, progress_msg=f"level {levels[i]} summarize communities progress: ", ) reports.extend([lr for lr in local_reports if lr is not None]) @@ -96,35 +102,63 @@ async def run_generate(record): async def _generate_report( runner: CommunityReportsStrategy, - callbacks: WorkflowCallbacks, - cache: PipelineCache, - strategy: dict, + model: "LLMCompletion", + extraction_prompt: str, community_id: int, community_level: int, community_context: str, + max_report_length: int, ) -> CommunityReport | None: """Generate a report for a single community.""" return await runner( community_id, community_context, community_level, - callbacks, - cache, - strategy, + model, + extraction_prompt, + max_report_length, ) -def load_strategy( - strategy: CreateCommunityReportsStrategyType, -) -> CommunityReportsStrategy: - """Load strategy method definition.""" - match strategy: - case CreateCommunityReportsStrategyType.graph_intelligence: - from graphrag.index.operations.summarize_communities.strategies import ( - run_graph_intelligence, - ) +async def run_extractor( + community: str | int, + input: str, + level: int, + model: "LLMCompletion", + extraction_prompt: str, + max_report_length: int, +) -> CommunityReport | None: + """Run the graph intelligence entity extraction strategy.""" + extractor = CommunityReportsExtractor( + model, + extraction_prompt=extraction_prompt, + max_report_length=max_report_length, + on_error=lambda e, stack, _data: logger.error( + "Community Report Extraction Error", exc_info=e, extra={"stack": stack} + ), + ) + + try: + results = await extractor(input) + report = results.structured_output + if report is None: + logger.warning("No report found for community: %s", community) + return None - return run_graph_intelligence - case _: - msg = f"Unknown strategy: {strategy}" - raise ValueError(msg) + return CommunityReport( + community=community, + full_content=results.output, + level=level, + rank=report.rating, + title=report.title, + rating_explanation=report.rating_explanation, + summary=report.summary, + findings=[ + Finding(explanation=f.explanation, summary=f.summary) + for f in report.findings + ], + full_content_json=report.model_dump_json(indent=4), + ) + except Exception: + logger.exception("Error processing community: %s", community) + return None diff --git a/graphrag/index/operations/summarize_communities/text_unit_context/__init__.py b/packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/__init__.py similarity index 100% rename from graphrag/index/operations/summarize_communities/text_unit_context/__init__.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/__init__.py diff --git a/graphrag/index/operations/summarize_communities/text_unit_context/context_builder.py b/packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/context_builder.py similarity index 97% rename from graphrag/index/operations/summarize_communities/text_unit_context/context_builder.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/context_builder.py index 8d6e0ae2e0..c377417369 100644 --- a/graphrag/index/operations/summarize_communities/text_unit_context/context_builder.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/context_builder.py @@ -7,6 +7,7 @@ from typing import cast import pandas as pd +from graphrag_llm.tokenizer import Tokenizer import graphrag.data_model.schemas as schemas from graphrag.index.operations.summarize_communities.build_mixed_context import ( @@ -18,7 +19,6 @@ from graphrag.index.operations.summarize_communities.text_unit_context.sort_context import ( sort_context, ) -from graphrag.tokenizer.tokenizer import Tokenizer logger = logging.getLogger(__name__) @@ -65,7 +65,8 @@ def build_local_context( ) context_df = ( - context_df.groupby([schemas.COMMUNITY_ID, schemas.COMMUNITY_LEVEL]) + context_df + .groupby([schemas.COMMUNITY_ID, schemas.COMMUNITY_LEVEL]) .agg({schemas.ALL_CONTEXT: list}) .reset_index() ) @@ -198,7 +199,8 @@ def build_level_context( axis=1, ) community_df = ( - community_df.groupby(schemas.COMMUNITY_ID) + community_df + .groupby(schemas.COMMUNITY_ID) .agg({schemas.ALL_CONTEXT: list}) .reset_index() ) diff --git a/graphrag/index/operations/summarize_communities/text_unit_context/prep_text_units.py b/packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/prep_text_units.py similarity index 94% rename from graphrag/index/operations/summarize_communities/text_unit_context/prep_text_units.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/prep_text_units.py index af31ee74ea..c1d9398733 100644 --- a/graphrag/index/operations/summarize_communities/text_unit_context/prep_text_units.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/prep_text_units.py @@ -29,7 +29,8 @@ def prep_text_units( [schemas.TITLE, schemas.COMMUNITY_ID, schemas.NODE_DEGREE, schemas.ID] ] text_unit_degrees = ( - node_to_text_ids.groupby([schemas.COMMUNITY_ID, schemas.ID]) + node_to_text_ids + .groupby([schemas.COMMUNITY_ID, schemas.ID]) .agg({schemas.NODE_DEGREE: "sum"}) .reset_index() ) diff --git a/graphrag/index/operations/summarize_communities/text_unit_context/sort_context.py b/packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/sort_context.py similarity index 98% rename from graphrag/index/operations/summarize_communities/text_unit_context/sort_context.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/sort_context.py index 7bad931b59..b062551337 100644 --- a/graphrag/index/operations/summarize_communities/text_unit_context/sort_context.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/text_unit_context/sort_context.py @@ -6,9 +6,9 @@ import logging import pandas as pd +from graphrag_llm.tokenizer import Tokenizer import graphrag.data_model.schemas as schemas -from graphrag.tokenizer.tokenizer import Tokenizer logger = logging.getLogger(__name__) diff --git a/graphrag/index/operations/summarize_communities/typing.py b/packages/graphrag/graphrag/index/operations/summarize_communities/typing.py similarity index 57% rename from graphrag/index/operations/summarize_communities/typing.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/typing.py index 6dddf3d6b1..73d8dd6f89 100644 --- a/graphrag/index/operations/summarize_communities/typing.py +++ b/packages/graphrag/graphrag/index/operations/summarize_communities/typing.py @@ -4,18 +4,14 @@ """A module containing 'Finding' and 'CommunityReport' models.""" from collections.abc import Awaitable, Callable -from enum import Enum -from typing import Any +from typing import TYPE_CHECKING, Any from typing_extensions import TypedDict -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion -ExtractedEntity = dict[str, Any] -StrategyConfig = dict[str, Any] RowContext = dict[str, Any] -EntityTypes = list[str] Claim = dict[str, Any] @@ -45,19 +41,9 @@ class CommunityReport(TypedDict): str | int, str, int, - WorkflowCallbacks, - PipelineCache, - StrategyConfig, + "LLMCompletion", + str, + int, ], Awaitable[CommunityReport | None], ] - - -class CreateCommunityReportsStrategyType(str, Enum): - """CreateCommunityReportsStrategyType class definition.""" - - graph_intelligence = "graph_intelligence" - - def __repr__(self): - """Get a string representation.""" - return f'"{self.value}"' diff --git a/graphrag/index/operations/summarize_communities/utils.py b/packages/graphrag/graphrag/index/operations/summarize_communities/utils.py similarity index 100% rename from graphrag/index/operations/summarize_communities/utils.py rename to packages/graphrag/graphrag/index/operations/summarize_communities/utils.py diff --git a/graphrag/index/operations/summarize_descriptions/__init__.py b/packages/graphrag/graphrag/index/operations/summarize_descriptions/__init__.py similarity index 100% rename from graphrag/index/operations/summarize_descriptions/__init__.py rename to packages/graphrag/graphrag/index/operations/summarize_descriptions/__init__.py diff --git a/graphrag/index/operations/summarize_descriptions/description_summary_extractor.py b/packages/graphrag/graphrag/index/operations/summarize_descriptions/description_summary_extractor.py similarity index 84% rename from graphrag/index/operations/summarize_descriptions/description_summary_extractor.py rename to packages/graphrag/graphrag/index/operations/summarize_descriptions/description_summary_extractor.py index 6a44ee1df7..f74a549ca6 100644 --- a/graphrag/index/operations/summarize_descriptions/description_summary_extractor.py +++ b/packages/graphrag/graphrag/index/operations/summarize_descriptions/description_summary_extractor.py @@ -1,15 +1,17 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""A module containing 'GraphExtractionResult' and 'GraphExtractor' models.""" +"""A module containing 'SummarizationResult' and 'SummarizeExtractor' models.""" import json from dataclasses import dataclass +from typing import TYPE_CHECKING from graphrag.index.typing.error_handler import ErrorHandlerFn -from graphrag.language_model.protocol.base import ChatModel -from graphrag.prompts.index.summarize_descriptions import SUMMARIZE_PROMPT -from graphrag.tokenizer.get_tokenizer import get_tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse # these tokens are used in the prompt ENTITY_NAME_KEY = "entity_name" @@ -28,7 +30,7 @@ class SummarizationResult: class SummarizeExtractor: """Unipartite graph extractor class definition.""" - _model: ChatModel + _model: "LLMCompletion" _summarization_prompt: str _on_error: ErrorHandlerFn _max_summary_length: int @@ -36,17 +38,17 @@ class SummarizeExtractor: def __init__( self, - model_invoker: ChatModel, + model: "LLMCompletion", max_summary_length: int, max_input_tokens: int, - summarization_prompt: str | None = None, + summarization_prompt: str, on_error: ErrorHandlerFn | None = None, ): """Init method definition.""" # TODO: streamline construction - self._model = model_invoker - self._tokenizer = get_tokenizer(model_invoker.config) - self._summarization_prompt = summarization_prompt or SUMMARIZE_PROMPT + self._model = model + self._tokenizer = model.tokenizer + self._summarization_prompt = summarization_prompt self._on_error = on_error or (lambda _e, _s, _d: None) self._max_summary_length = max_summary_length self._max_input_tokens = max_input_tokens @@ -119,15 +121,14 @@ async def _summarize_descriptions_with_llm( self, id: str | tuple[str, str] | list[str], descriptions: list[str] ): """Summarize descriptions using the LLM.""" - response = await self._model.achat( - self._summarization_prompt.format(**{ + response: LLMCompletionResponse = await self._model.completion_async( + messages=self._summarization_prompt.format(**{ ENTITY_NAME_KEY: json.dumps(id, ensure_ascii=False), DESCRIPTION_LIST_KEY: json.dumps( sorted(descriptions), ensure_ascii=False ), MAX_LENGTH_KEY: self._max_summary_length, }), - name="summarize", - ) + ) # type: ignore # Calculate result - return str(response.output.content) + return response.content diff --git a/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py b/packages/graphrag/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py similarity index 66% rename from graphrag/index/operations/summarize_descriptions/summarize_descriptions.py rename to packages/graphrag/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py index 780c94b329..a959afd79b 100644 --- a/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py +++ b/packages/graphrag/graphrag/index/operations/summarize_descriptions/summarize_descriptions.py @@ -5,18 +5,22 @@ import asyncio import logging -from typing import Any +from typing import TYPE_CHECKING import pandas as pd -from graphrag.cache.pipeline_cache import PipelineCache from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks +from graphrag.index.operations.summarize_descriptions.description_summary_extractor import ( + SummarizeExtractor, +) from graphrag.index.operations.summarize_descriptions.typing import ( - SummarizationStrategy, - SummarizeStrategyType, + SummarizedDescriptionResult, ) from graphrag.logger.progress import ProgressTicker, progress_ticker +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + logger = logging.getLogger(__name__) @@ -24,17 +28,13 @@ async def summarize_descriptions( entities_df: pd.DataFrame, relationships_df: pd.DataFrame, callbacks: WorkflowCallbacks, - cache: PipelineCache, - strategy: dict[str, Any] | None = None, - num_threads: int = 4, + model: "LLMCompletion", + max_summary_length: int, + max_input_tokens: int, + prompt: str, + num_threads: int, ) -> tuple[pd.DataFrame, pd.DataFrame]: """Summarize entity and relationship descriptions from an entity graph, using a language model.""" - logger.debug("summarize_descriptions strategy=%s", strategy) - strategy = strategy or {} - strategy_exec = load_strategy( - strategy.get("type", SummarizeStrategyType.graph_intelligence) - ) - strategy_config = {**strategy} async def get_summarized( nodes: pd.DataFrame, edges: pd.DataFrame, semaphore: asyncio.Semaphore @@ -99,7 +99,14 @@ async def do_summarize_descriptions( semaphore: asyncio.Semaphore, ): async with semaphore: - results = await strategy_exec(id, descriptions, cache, strategy_config) + results = await run_summarize_descriptions( + id, + descriptions, + model, + max_summary_length, + max_input_tokens, + prompt, + ) ticker(1) return results @@ -108,15 +115,26 @@ async def do_summarize_descriptions( return await get_summarized(entities_df, relationships_df, semaphore) -def load_strategy(strategy_type: SummarizeStrategyType) -> SummarizationStrategy: - """Load strategy method definition.""" - match strategy_type: - case SummarizeStrategyType.graph_intelligence: - from graphrag.index.operations.summarize_descriptions.graph_intelligence_strategy import ( - run_graph_intelligence, - ) +async def run_summarize_descriptions( + id: str | tuple[str, str], + descriptions: list[str], + model: "LLMCompletion", + max_summary_length: int, + max_input_tokens: int, + prompt: str, +) -> SummarizedDescriptionResult: + """Run the graph intelligence entity extraction strategy.""" + extractor = SummarizeExtractor( + model=model, + summarization_prompt=prompt, + on_error=lambda e, stack, details: logger.error( + "Entity Extraction Error", + exc_info=e, + extra={"stack": stack, "details": details}, + ), + max_summary_length=max_summary_length, + max_input_tokens=max_input_tokens, + ) - return run_graph_intelligence - case _: - msg = f"Unknown strategy: {strategy_type}" - raise ValueError(msg) + result = await extractor(id=id, descriptions=descriptions) + return SummarizedDescriptionResult(id=result.id, description=result.description) diff --git a/packages/graphrag/graphrag/index/operations/summarize_descriptions/typing.py b/packages/graphrag/graphrag/index/operations/summarize_descriptions/typing.py new file mode 100644 index 0000000000..5a912caec4 --- /dev/null +++ b/packages/graphrag/graphrag/index/operations/summarize_descriptions/typing.py @@ -0,0 +1,21 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'SummarizedDescriptionResult' model.""" + +from dataclasses import dataclass +from typing import Any, NamedTuple + + +@dataclass +class SummarizedDescriptionResult: + """Entity summarization result class definition.""" + + id: str | tuple[str, str] + description: str + + +class DescriptionSummarizeRow(NamedTuple): + """DescriptionSummarizeRow class definition.""" + + graph: Any diff --git a/graphrag/index/run/__init__.py b/packages/graphrag/graphrag/index/run/__init__.py similarity index 100% rename from graphrag/index/run/__init__.py rename to packages/graphrag/graphrag/index/run/__init__.py diff --git a/graphrag/index/run/run_pipeline.py b/packages/graphrag/graphrag/index/run/run_pipeline.py similarity index 90% rename from graphrag/index/run/run_pipeline.py rename to packages/graphrag/graphrag/index/run/run_pipeline.py index f652db7acd..a4ce17582c 100644 --- a/graphrag/index/run/run_pipeline.py +++ b/packages/graphrag/graphrag/index/run/run_pipeline.py @@ -12,6 +12,8 @@ from typing import Any import pandas as pd +from graphrag_cache import create_cache +from graphrag_storage import Storage, create_storage from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.config.models.graph_rag_config import GraphRagConfig @@ -19,8 +21,6 @@ from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.pipeline import Pipeline from graphrag.index.typing.pipeline_run_result import PipelineRunResult -from graphrag.storage.pipeline_storage import PipelineStorage -from graphrag.utils.api import create_cache_from_config, create_storage_from_config from graphrag.utils.storage import load_table_from_storage, write_table_to_storage logger = logging.getLogger(__name__) @@ -35,11 +35,9 @@ async def run_pipeline( input_documents: pd.DataFrame | None = None, ) -> AsyncIterable[PipelineRunResult]: """Run all workflows using a simplified pipeline.""" - root_dir = config.root_dir - - input_storage = create_storage_from_config(config.input.storage) - output_storage = create_storage_from_config(config.output) - cache = create_cache_from_config(config.cache, root_dir) + input_storage = create_storage(config.input_storage) + output_storage = create_storage(config.output_storage) + cache = create_cache(config.cache) # load existing state in case any workflows are stateful state_json = await output_storage.get("context.json") @@ -51,7 +49,7 @@ async def run_pipeline( if is_update_run: logger.info("Running incremental indexing.") - update_storage = create_storage_from_config(config.update_index_output) + update_storage = create_storage(config.update_output_storage) # we use this to store the new subset index, and will merge its content with the previous index update_timestamp = time.strftime("%Y%m%d-%H%M%S") timestamped_storage = update_storage.child(update_timestamp) @@ -121,7 +119,7 @@ async def _run_pipeline( result = await workflow_function(config, context) context.callbacks.workflow_end(name, result) yield PipelineRunResult( - workflow=name, result=result.result, state=context.state, errors=None + workflow=name, result=result.result, state=context.state, error=None ) context.stats.workflows[name] = {"overall": time.time() - work_time} if result.stop: @@ -135,7 +133,7 @@ async def _run_pipeline( except Exception as e: logger.exception("error running workflow %s", last_workflow) yield PipelineRunResult( - workflow=last_workflow, result=None, state=context.state, errors=[e] + workflow=last_workflow, result=None, state=context.state, error=e ) @@ -158,10 +156,10 @@ async def _dump_json(context: PipelineRunContext) -> None: async def _copy_previous_output( - storage: PipelineStorage, - copy_storage: PipelineStorage, + storage: Storage, + copy_storage: Storage, ): for file in storage.find(re.compile(r"\.parquet$")): - base_name = file[0].replace(".parquet", "") + base_name = file.replace(".parquet", "") table = await load_table_from_storage(base_name, storage) await write_table_to_storage(table, base_name, copy_storage) diff --git a/graphrag/index/run/utils.py b/packages/graphrag/graphrag/index/run/utils.py similarity index 63% rename from graphrag/index/run/utils.py rename to packages/graphrag/graphrag/index/run/utils.py index 52b1f0bd31..be6914a6d6 100644 --- a/graphrag/index/run/utils.py +++ b/packages/graphrag/graphrag/index/run/utils.py @@ -3,8 +3,11 @@ """Utility functions for the GraphRAG run module.""" -from graphrag.cache.memory_pipeline_cache import InMemoryCache -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag_cache import Cache +from graphrag_cache.memory_cache import MemoryCache +from graphrag_storage import Storage, create_storage +from graphrag_storage.memory_storage import MemoryStorage + from graphrag.callbacks.noop_workflow_callbacks import NoopWorkflowCallbacks from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.callbacks.workflow_callbacks_manager import WorkflowCallbacksManager @@ -12,26 +15,23 @@ from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.state import PipelineState from graphrag.index.typing.stats import PipelineRunStats -from graphrag.storage.memory_pipeline_storage import MemoryPipelineStorage -from graphrag.storage.pipeline_storage import PipelineStorage -from graphrag.utils.api import create_storage_from_config def create_run_context( - input_storage: PipelineStorage | None = None, - output_storage: PipelineStorage | None = None, - previous_storage: PipelineStorage | None = None, - cache: PipelineCache | None = None, + input_storage: Storage | None = None, + output_storage: Storage | None = None, + previous_storage: Storage | None = None, + cache: Cache | None = None, callbacks: WorkflowCallbacks | None = None, stats: PipelineRunStats | None = None, state: PipelineState | None = None, ) -> PipelineRunContext: """Create the run context for the pipeline.""" return PipelineRunContext( - input_storage=input_storage or MemoryPipelineStorage(), - output_storage=output_storage or MemoryPipelineStorage(), - previous_storage=previous_storage or MemoryPipelineStorage(), - cache=cache or InMemoryCache(), + input_storage=input_storage or MemoryStorage(), + output_storage=output_storage or MemoryStorage(), + previous_storage=previous_storage or MemoryStorage(), + cache=cache or MemoryCache(), callbacks=callbacks or NoopWorkflowCallbacks(), stats=stats or PipelineRunStats(), state=state or {}, @@ -50,10 +50,10 @@ def create_callback_chain( def get_update_storages( config: GraphRagConfig, timestamp: str -) -> tuple[PipelineStorage, PipelineStorage, PipelineStorage]: +) -> tuple[Storage, Storage, Storage]: """Get storage objects for the update index run.""" - output_storage = create_storage_from_config(config.output) - update_storage = create_storage_from_config(config.update_index_output) + output_storage = create_storage(config.output_storage) + update_storage = create_storage(config.update_output_storage) timestamped_storage = update_storage.child(timestamp) delta_storage = timestamped_storage.child("delta") previous_storage = timestamped_storage.child("previous") diff --git a/graphrag/index/text_splitting/__init__.py b/packages/graphrag/graphrag/index/text_splitting/__init__.py similarity index 100% rename from graphrag/index/text_splitting/__init__.py rename to packages/graphrag/graphrag/index/text_splitting/__init__.py diff --git a/packages/graphrag/graphrag/index/text_splitting/text_splitting.py b/packages/graphrag/graphrag/index/text_splitting/text_splitting.py new file mode 100644 index 0000000000..0f42cd6ba5 --- /dev/null +++ b/packages/graphrag/graphrag/index/text_splitting/text_splitting.py @@ -0,0 +1,102 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing 'TokenTextSplitter' class and 'split_single_text_on_tokens' function.""" + +import logging +from abc import ABC +from collections.abc import Callable +from typing import cast + +import pandas as pd +from graphrag_llm.tokenizer import Tokenizer + +from graphrag.tokenizer.get_tokenizer import get_tokenizer + +EncodedText = list[int] +DecodeFn = Callable[[EncodedText], str] +EncodeFn = Callable[[str], EncodedText] +LengthFn = Callable[[str], int] + +logger = logging.getLogger(__name__) + + +class TokenTextSplitter(ABC): + """Token text splitter class definition.""" + + _chunk_size: int + _chunk_overlap: int + _length_function: LengthFn + _keep_separator: bool + _add_start_index: bool + _strip_whitespace: bool + + def __init__( + self, + # based on OpenAI embedding chunk size limits + # https://devblogs.microsoft.com/azure-sql/embedding-models-and-dimensions-optimizing-the-performance-resource-usage-ratio/ + chunk_size: int = 8191, + chunk_overlap: int = 100, + length_function: LengthFn = len, + keep_separator: bool = False, + add_start_index: bool = False, + strip_whitespace: bool = True, + tokenizer: Tokenizer | None = None, + ): + """Init method definition.""" + self._chunk_size = chunk_size + self._chunk_overlap = chunk_overlap + self._length_function = length_function + self._keep_separator = keep_separator + self._add_start_index = add_start_index + self._strip_whitespace = strip_whitespace + self._tokenizer = tokenizer or get_tokenizer() + + def num_tokens(self, text: str) -> int: + """Return the number of tokens in a string.""" + return self._tokenizer.num_tokens(text) + + def split_text(self, text: str | list[str]) -> list[str]: + """Split text method.""" + if isinstance(text, list): + text = " ".join(text) + elif cast("bool", pd.isna(text)) or text == "": + return [] + if not isinstance(text, str): + msg = f"Attempting to split a non-string value, actual is {type(text)}" + raise TypeError(msg) + + return split_single_text_on_tokens( + text, + chunk_overlap=self._chunk_overlap, + tokens_per_chunk=self._chunk_size, + decode=self._tokenizer.decode, + encode=self._tokenizer.encode, + ) + + +def split_single_text_on_tokens( + text: str, + tokens_per_chunk: int, + chunk_overlap: int, + encode: EncodeFn, + decode: DecodeFn, +) -> list[str]: + """Split a single text and return chunks using the tokenizer.""" + result = [] + input_ids = encode(text) + + start_idx = 0 + cur_idx = min(start_idx + tokens_per_chunk, len(input_ids)) + chunk_ids = input_ids[start_idx:cur_idx] + + while start_idx < len(input_ids): + chunk_text = decode(list(chunk_ids)) + result.append(chunk_text) # Append chunked text as string + if cur_idx == len(input_ids): + break + start_idx += tokens_per_chunk - chunk_overlap + cur_idx = min(start_idx + tokens_per_chunk, len(input_ids)) + chunk_ids = input_ids[start_idx:cur_idx] + + return result diff --git a/graphrag/index/typing/__init__.py b/packages/graphrag/graphrag/index/typing/__init__.py similarity index 100% rename from graphrag/index/typing/__init__.py rename to packages/graphrag/graphrag/index/typing/__init__.py diff --git a/graphrag/index/typing/context.py b/packages/graphrag/graphrag/index/typing/context.py similarity index 79% rename from graphrag/index/typing/context.py rename to packages/graphrag/graphrag/index/typing/context.py index ef2e1f7ea5..95e7f898f9 100644 --- a/graphrag/index/typing/context.py +++ b/packages/graphrag/graphrag/index/typing/context.py @@ -6,11 +6,11 @@ from dataclasses import dataclass -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag_cache import Cache from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.index.typing.state import PipelineState from graphrag.index.typing.stats import PipelineRunStats -from graphrag.storage.pipeline_storage import PipelineStorage +from graphrag_storage import Storage @dataclass @@ -18,13 +18,13 @@ class PipelineRunContext: """Provides the context for the current pipeline run.""" stats: PipelineRunStats - input_storage: PipelineStorage + input_storage: Storage "Storage for input documents." - output_storage: PipelineStorage + output_storage: Storage "Long-term storage for pipeline verbs to use. Items written here will be written to the storage provider." - previous_storage: PipelineStorage + previous_storage: Storage "Storage for previous pipeline run when running in update mode." - cache: PipelineCache + cache: Cache "Cache instance for reading previous LLM responses." callbacks: WorkflowCallbacks "Callbacks to be called during the pipeline run." diff --git a/graphrag/index/typing/error_handler.py b/packages/graphrag/graphrag/index/typing/error_handler.py similarity index 100% rename from graphrag/index/typing/error_handler.py rename to packages/graphrag/graphrag/index/typing/error_handler.py diff --git a/graphrag/index/typing/pipeline.py b/packages/graphrag/graphrag/index/typing/pipeline.py similarity index 100% rename from graphrag/index/typing/pipeline.py rename to packages/graphrag/graphrag/index/typing/pipeline.py diff --git a/graphrag/index/typing/pipeline_run_result.py b/packages/graphrag/graphrag/index/typing/pipeline_run_result.py similarity index 94% rename from graphrag/index/typing/pipeline_run_result.py rename to packages/graphrag/graphrag/index/typing/pipeline_run_result.py index f6a68d82a0..b39e030268 100644 --- a/graphrag/index/typing/pipeline_run_result.py +++ b/packages/graphrag/graphrag/index/typing/pipeline_run_result.py @@ -19,4 +19,4 @@ class PipelineRunResult: """The result of the workflow function. This can be anything - we use it only for logging downstream, and expect each workflow function to write official outputs to the provided storage.""" state: PipelineState """Ongoing pipeline context state object.""" - errors: list[BaseException] | None + error: BaseException | None diff --git a/graphrag/index/typing/state.py b/packages/graphrag/graphrag/index/typing/state.py similarity index 100% rename from graphrag/index/typing/state.py rename to packages/graphrag/graphrag/index/typing/state.py diff --git a/graphrag/index/typing/stats.py b/packages/graphrag/graphrag/index/typing/stats.py similarity index 100% rename from graphrag/index/typing/stats.py rename to packages/graphrag/graphrag/index/typing/stats.py diff --git a/graphrag/index/typing/workflow.py b/packages/graphrag/graphrag/index/typing/workflow.py similarity index 100% rename from graphrag/index/typing/workflow.py rename to packages/graphrag/graphrag/index/typing/workflow.py diff --git a/graphrag/index/update/__init__.py b/packages/graphrag/graphrag/index/update/__init__.py similarity index 100% rename from graphrag/index/update/__init__.py rename to packages/graphrag/graphrag/index/update/__init__.py diff --git a/graphrag/index/update/communities.py b/packages/graphrag/graphrag/index/update/communities.py similarity index 100% rename from graphrag/index/update/communities.py rename to packages/graphrag/graphrag/index/update/communities.py diff --git a/graphrag/index/update/entities.py b/packages/graphrag/graphrag/index/update/entities.py similarity index 96% rename from graphrag/index/update/entities.py rename to packages/graphrag/graphrag/index/update/entities.py index 7a74d1b6e0..fe9bb2347b 100644 --- a/graphrag/index/update/entities.py +++ b/packages/graphrag/graphrag/index/update/entities.py @@ -51,7 +51,8 @@ def _group_and_resolve_entities( # Group by title and resolve conflicts aggregated = ( - combined.groupby("title") + combined + .groupby("title") .agg({ "id": "first", "type": "first", @@ -60,8 +61,6 @@ def _group_and_resolve_entities( # Concatenate nd.array into a single list "text_unit_ids": lambda x: list(itertools.chain(*x.tolist())), "degree": "first", # todo: we could probably re-compute this with the entire new graph - "x": "first", - "y": "first", }) .reset_index() ) diff --git a/graphrag/index/update/incremental_index.py b/packages/graphrag/graphrag/index/update/incremental_index.py similarity index 87% rename from graphrag/index/update/incremental_index.py rename to packages/graphrag/graphrag/index/update/incremental_index.py index ac56e30df4..81f917e187 100644 --- a/graphrag/index/update/incremental_index.py +++ b/packages/graphrag/graphrag/index/update/incremental_index.py @@ -7,8 +7,8 @@ import numpy as np import pandas as pd +from graphrag_storage import Storage -from graphrag.storage.pipeline_storage import PipelineStorage from graphrag.utils.storage import ( load_table_from_storage, write_table_to_storage, @@ -31,16 +31,14 @@ class InputDelta: deleted_inputs: pd.DataFrame -async def get_delta_docs( - input_dataset: pd.DataFrame, storage: PipelineStorage -) -> InputDelta: +async def get_delta_docs(input_dataset: pd.DataFrame, storage: Storage) -> InputDelta: """Get the delta between the input dataset and the final documents. Parameters ---------- input_dataset : pd.DataFrame The input dataset. - storage : PipelineStorage + storage : Storage The Pipeline storage. Returns @@ -65,9 +63,9 @@ async def get_delta_docs( async def concat_dataframes( name: str, - previous_storage: PipelineStorage, - delta_storage: PipelineStorage, - output_storage: PipelineStorage, + previous_storage: Storage, + delta_storage: Storage, + output_storage: Storage, ) -> pd.DataFrame: """Concatenate dataframes.""" old_df = await load_table_from_storage(name, previous_storage) diff --git a/graphrag/index/update/relationships.py b/packages/graphrag/graphrag/index/update/relationships.py similarity index 97% rename from graphrag/index/update/relationships.py rename to packages/graphrag/graphrag/index/update/relationships.py index 8174d9cca3..e08cb8493a 100644 --- a/graphrag/index/update/relationships.py +++ b/packages/graphrag/graphrag/index/update/relationships.py @@ -50,7 +50,8 @@ def _update_and_merge_relationships( # Group by title and resolve conflicts aggregated = ( - merged_relationships.groupby(["source", "target"]) + merged_relationships + .groupby(["source", "target"]) .agg({ "id": "first", "human_readable_id": "first", diff --git a/graphrag/index/utils/__init__.py b/packages/graphrag/graphrag/index/utils/__init__.py similarity index 100% rename from graphrag/index/utils/__init__.py rename to packages/graphrag/graphrag/index/utils/__init__.py diff --git a/graphrag/index/utils/dataframes.py b/packages/graphrag/graphrag/index/utils/dataframes.py similarity index 100% rename from graphrag/index/utils/dataframes.py rename to packages/graphrag/graphrag/index/utils/dataframes.py diff --git a/graphrag/index/utils/derive_from_rows.py b/packages/graphrag/graphrag/index/utils/derive_from_rows.py similarity index 96% rename from graphrag/index/utils/derive_from_rows.py rename to packages/graphrag/graphrag/index/utils/derive_from_rows.py index 663d78c1c8..bb4e8a3016 100644 --- a/graphrag/index/utils/derive_from_rows.py +++ b/packages/graphrag/graphrag/index/utils/derive_from_rows.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""Apply a generic transform function to each row in a table.""" +"""A module containing derive_from_rows, derive_from_rows_asyncio_threads, and derive_from_rows_asyncio methods.""" import asyncio import inspect @@ -55,9 +55,6 @@ async def derive_from_rows( raise ValueError(msg) -"""A module containing the derive_from_rows_async method.""" - - async def derive_from_rows_asyncio_threads( input: pd.DataFrame, transform: Callable[[pd.Series], Awaitable[ItemType]], @@ -88,9 +85,6 @@ async def execute_task(task: Coroutine) -> ItemType | None: ) -"""A module containing the derive_from_rows_async method.""" - - async def derive_from_rows_asyncio( input: pd.DataFrame, transform: Callable[[pd.Series], Awaitable[ItemType]], diff --git a/graphrag/index/utils/dicts.py b/packages/graphrag/graphrag/index/utils/dicts.py similarity index 100% rename from graphrag/index/utils/dicts.py rename to packages/graphrag/graphrag/index/utils/dicts.py diff --git a/graphrag/index/utils/graphs.py b/packages/graphrag/graphrag/index/utils/graphs.py similarity index 61% rename from graphrag/index/utils/graphs.py rename to packages/graphrag/graphrag/index/utils/graphs.py index 6c06e05cbc..02f2693cbe 100644 --- a/graphrag/index/utils/graphs.py +++ b/packages/graphrag/graphrag/index/utils/graphs.py @@ -1,22 +1,136 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -"""Collection of graph utility functions.""" +""" +Collection of graph utility functions. + +These are largely copies/re-implementations of graspologic methods to avoid dependency issues. +""" import logging -from typing import cast +import math +from collections import defaultdict +from typing import Any, cast +import graspologic_native as gn import networkx as nx import numpy as np import pandas as pd -from graspologic.partition import hierarchical_leiden, modularity -from graspologic.utils import largest_connected_component from graphrag.config.enums import ModularityMetric logger = logging.getLogger(__name__) +def largest_connected_component(graph: nx.Graph) -> nx.Graph: + """Return the largest connected component of the graph.""" + graph = graph.copy() + lcc_nodes = max(nx.connected_components(graph), key=len) + lcc = graph.subgraph(lcc_nodes).copy() + lcc.remove_nodes_from([n for n in lcc if n not in lcc_nodes]) + return cast("nx.Graph", lcc) + + +def _nx_to_edge_list( + graph: nx.Graph, + weight_attribute: str = "weight", + weight_default: float = 1.0, +) -> list[tuple[str, str, float]]: + """ + Convert an undirected, non-multigraph networkx graph to a list of edges. + + Each edge is represented as a tuple of (source_str, target_str, weight). + """ + edge_list: list[tuple[str, str, float]] = [] + + # Decide how to retrieve the weight data + edge_iter = graph.edges(data=weight_attribute, default=weight_default) # type: ignore + + for source, target, weight in edge_iter: + source_str = str(source) + target_str = str(target) + edge_list.append((source_str, target_str, float(weight))) + + return edge_list + + +def hierarchical_leiden( + graph: nx.Graph, + max_cluster_size: int = 10, + random_seed: int | None = 0xDEADBEEF, +) -> list[gn.HierarchicalCluster]: + """Run hierarchical leiden on the graph.""" + return gn.hierarchical_leiden( + edges=_nx_to_edge_list(graph), + max_cluster_size=max_cluster_size, + seed=random_seed, + starting_communities=None, + resolution=1.0, + randomness=0.001, + use_modularity=True, + iterations=1, + ) + + +def modularity( + graph: nx.Graph, + partitions: dict[Any, int], + weight_attribute: str = "weight", + resolution: float = 1.0, +) -> float: + """Given an undirected graph and a dictionary of vertices to community ids, calculate the modularity.""" + components = _modularity_components(graph, partitions, weight_attribute, resolution) + return sum(components.values()) + + +def _modularity_component( + intra_community_degree: float, + total_community_degree: float, + network_degree_sum: float, + resolution: float, +) -> float: + community_degree_ratio = math.pow(total_community_degree, 2.0) / ( + 2.0 * network_degree_sum + ) + return (intra_community_degree - resolution * community_degree_ratio) / ( + 2.0 * network_degree_sum + ) + + +def _modularity_components( + graph: nx.Graph, + partitions: dict[Any, int], + weight_attribute: str = "weight", + resolution: float = 1.0, +) -> dict[int, float]: + total_edge_weight = 0.0 + communities = set(partitions.values()) + + degree_sums_within_community: dict[int, float] = defaultdict(lambda: 0.0) + degree_sums_for_community: dict[int, float] = defaultdict(lambda: 0.0) + for vertex, neighbor_vertex, weight in graph.edges(data=weight_attribute): + vertex_community = partitions[vertex] + neighbor_community = partitions[neighbor_vertex] + if vertex_community == neighbor_community: + if vertex == neighbor_vertex: + degree_sums_within_community[vertex_community] += weight + else: + degree_sums_within_community[vertex_community] += weight * 2.0 + degree_sums_for_community[vertex_community] += weight + degree_sums_for_community[neighbor_community] += weight + total_edge_weight += weight + + return { + comm: _modularity_component( + degree_sums_within_community[comm], + degree_sums_for_community[comm], + total_edge_weight, + resolution, + ) + for comm in communities + } + + def calculate_root_modularity( graph: nx.Graph, max_cluster_size: int = 10, @@ -26,7 +140,7 @@ def calculate_root_modularity( hcs = hierarchical_leiden( graph, max_cluster_size=max_cluster_size, random_seed=random_seed ) - root_clusters = hcs.first_level_hierarchical_clustering() + root_clusters = first_level_hierarchical_clustering(hcs) return modularity(graph, root_clusters) @@ -39,7 +153,7 @@ def calculate_leaf_modularity( hcs = hierarchical_leiden( graph, max_cluster_size=max_cluster_size, random_seed=random_seed ) - leaf_clusters = hcs.final_level_hierarchical_clustering() + leaf_clusters = final_level_hierarchical_clustering(hcs) return modularity(graph, leaf_clusters) @@ -147,9 +261,6 @@ def calculate_modularity( random_seed=random_seed, use_root_modularity=use_root_modularity, ) - case _: - msg = f"Unknown modularity metric type: {modularity_metric}" - raise ValueError(msg) def calculate_pmi_edge_weights( @@ -181,14 +292,16 @@ def calculate_pmi_edge_weights( edges_df["prop_weight"] = edges_df[edge_weight_col] / total_edge_weights edges_df = ( - edges_df.merge( + edges_df + .merge( copied_nodes_df, left_on=edge_source_col, right_on=node_name_col, how="left" ) .drop(columns=[node_name_col]) .rename(columns={"prop_occurrence": "source_prop"}) ) edges_df = ( - edges_df.merge( + edges_df + .merge( copied_nodes_df, left_on=edge_target_col, right_on=node_name_col, how="left" ) .drop(columns=[node_name_col]) @@ -227,8 +340,10 @@ def calculate_rrf_edge_weights( method="min", ascending=False ) edges_df[edge_weight_col] = edges_df.apply( - lambda x: (1 / (rrf_smoothing_factor + x["pmi_rank"])) - + (1 / (rrf_smoothing_factor + x["raw_weight_rank"])), + lambda x: ( + (1 / (rrf_smoothing_factor + x["pmi_rank"])) + + (1 / (rrf_smoothing_factor + x["raw_weight_rank"])) + ), axis=1, ) @@ -240,3 +355,32 @@ def get_upper_threshold_by_std(data: list[float] | list[int], std_trim: float) - mean = np.mean(data) std = np.std(data) return cast("float", mean + std_trim * std) + + +def first_level_hierarchical_clustering( + hcs: list[gn.HierarchicalCluster], +) -> dict[Any, int]: + """first_level_hierarchical_clustering. + + Returns + ------- + dict[Any, int] + The initial leiden algorithm clustering results as a dictionary + of node id to community id. + """ + return {entry.node: entry.cluster for entry in hcs if entry.level == 0} + + +def final_level_hierarchical_clustering( + hcs: list[gn.HierarchicalCluster], +) -> dict[Any, int]: + """ + final_level_hierarchical_clustering. + + Returns + ------- + dict[Any, int] + The last leiden algorithm clustering results as a dictionary + of node id to community id. + """ + return {entry.node: entry.cluster for entry in hcs if entry.is_final_cluster} diff --git a/graphrag/index/utils/hashing.py b/packages/graphrag/graphrag/index/utils/hashing.py similarity index 100% rename from graphrag/index/utils/hashing.py rename to packages/graphrag/graphrag/index/utils/hashing.py diff --git a/graphrag/index/utils/is_null.py b/packages/graphrag/graphrag/index/utils/is_null.py similarity index 100% rename from graphrag/index/utils/is_null.py rename to packages/graphrag/graphrag/index/utils/is_null.py diff --git a/graphrag/index/utils/stable_lcc.py b/packages/graphrag/graphrag/index/utils/stable_lcc.py similarity index 94% rename from graphrag/index/utils/stable_lcc.py rename to packages/graphrag/graphrag/index/utils/stable_lcc.py index 070311331b..806c0fd486 100644 --- a/graphrag/index/utils/stable_lcc.py +++ b/packages/graphrag/graphrag/index/utils/stable_lcc.py @@ -8,12 +8,11 @@ import networkx as nx +from graphrag.index.utils.graphs import largest_connected_component + def stable_largest_connected_component(graph: nx.Graph) -> nx.Graph: """Return the largest connected component of the graph, with nodes and edges sorted in a stable way.""" - # NOTE: The import is done here to reduce the initial import time of the module - from graspologic.utils import largest_connected_component - graph = graph.copy() graph = cast("nx.Graph", largest_connected_component(graph)) graph = normalize_node_names(graph) diff --git a/graphrag/index/utils/string.py b/packages/graphrag/graphrag/index/utils/string.py similarity index 100% rename from graphrag/index/utils/string.py rename to packages/graphrag/graphrag/index/utils/string.py diff --git a/graphrag/index/utils/uuid.py b/packages/graphrag/graphrag/index/utils/uuid.py similarity index 100% rename from graphrag/index/utils/uuid.py rename to packages/graphrag/graphrag/index/utils/uuid.py diff --git a/packages/graphrag/graphrag/index/validate_config.py b/packages/graphrag/graphrag/index/validate_config.py new file mode 100644 index 0000000000..4062b8de9a --- /dev/null +++ b/packages/graphrag/graphrag/index/validate_config.py @@ -0,0 +1,41 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing validate_config_names definition.""" + +import asyncio +import logging +import sys + +from graphrag_llm.completion import create_completion +from graphrag_llm.embedding import create_embedding + +from graphrag.config.models.graph_rag_config import GraphRagConfig + +logger = logging.getLogger(__name__) + + +def validate_config_names(parameters: GraphRagConfig) -> None: + """Validate config file for model deployment name typos, by running a quick test message for each.""" + for id, config in parameters.completion_models.items(): + llm = create_completion(config) + try: + llm.completion(messages="This is an LLM connectivity test. Say Hello World") + logger.info("LLM Config Params Validated") + except Exception as e: # noqa: BLE001 + logger.error(f"LLM configuration error detected.\n{e}") # noqa + print(f"Failed to validate language model ({id}) params", e) # noqa: T201 + sys.exit(1) + for id, config in parameters.embedding_models.items(): + embed_llm = create_embedding(config) + try: + asyncio.run( + embed_llm.embedding_async( + input=["This is an LLM Embedding Test String"] + ) + ) + logger.info("Embedding LLM Config Params Validated") + except Exception as e: # noqa: BLE001 + logger.error(f"Embedding configuration error detected.\n{e}") # noqa + print(f"Failed to validate embedding model ({id}) params", e) # noqa: T201 + sys.exit(1) diff --git a/graphrag/index/workflows/__init__.py b/packages/graphrag/graphrag/index/workflows/__init__.py similarity index 98% rename from graphrag/index/workflows/__init__.py rename to packages/graphrag/graphrag/index/workflows/__init__.py index 5567baceff..6dee90c097 100644 --- a/graphrag/index/workflows/__init__.py +++ b/packages/graphrag/graphrag/index/workflows/__init__.py @@ -74,7 +74,7 @@ ) # register all of our built-in workflows at once -PipelineFactory.register_all({ +PipelineFactory.register_all({ # noqa: RUF067 "load_input_documents": run_load_input_documents, "load_update_documents": run_load_update_documents, "create_base_text_units": run_create_base_text_units, diff --git a/packages/graphrag/graphrag/index/workflows/create_base_text_units.py b/packages/graphrag/graphrag/index/workflows/create_base_text_units.py new file mode 100644 index 0000000000..ec6abc2578 --- /dev/null +++ b/packages/graphrag/graphrag/index/workflows/create_base_text_units.py @@ -0,0 +1,118 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A module containing run_workflow method definition.""" + +import logging +from typing import Any, cast + +import pandas as pd +from graphrag_chunking.chunker import Chunker +from graphrag_chunking.chunker_factory import create_chunker +from graphrag_chunking.transformers import add_metadata +from graphrag_input import TextDocument +from graphrag_llm.tokenizer import Tokenizer + +from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks +from graphrag.config.models.graph_rag_config import GraphRagConfig +from graphrag.index.typing.context import PipelineRunContext +from graphrag.index.typing.workflow import WorkflowFunctionOutput +from graphrag.index.utils.hashing import gen_sha512_hash +from graphrag.logger.progress import progress_ticker +from graphrag.tokenizer.get_tokenizer import get_tokenizer +from graphrag.utils.storage import load_table_from_storage, write_table_to_storage + +logger = logging.getLogger(__name__) + + +async def run_workflow( + config: GraphRagConfig, + context: PipelineRunContext, +) -> WorkflowFunctionOutput: + """All the steps to transform base text_units.""" + logger.info("Workflow started: create_base_text_units") + documents = await load_table_from_storage("documents", context.output_storage) + + tokenizer = get_tokenizer(encoding_model=config.chunking.encoding_model) + chunker = create_chunker(config.chunking, tokenizer.encode, tokenizer.decode) + output = create_base_text_units( + documents, + context.callbacks, + tokenizer=tokenizer, + chunker=chunker, + prepend_metadata=config.chunking.prepend_metadata, + ) + + await write_table_to_storage(output, "text_units", context.output_storage) + + logger.info("Workflow completed: create_base_text_units") + return WorkflowFunctionOutput(result=output) + + +def create_base_text_units( + documents: pd.DataFrame, + callbacks: WorkflowCallbacks, + tokenizer: Tokenizer, + chunker: Chunker, + prepend_metadata: list[str] | None = None, +) -> pd.DataFrame: + """All the steps to transform base text_units.""" + documents.sort_values(by=["id"], ascending=[True], inplace=True) + + total_rows = len(documents) + tick = progress_ticker(callbacks.progress, total_rows) + + # Track progress of row-wise apply operation + logger.info("Starting chunking process for %d documents", total_rows) + + def chunker_with_logging(row: pd.Series, row_index: int) -> Any: + if prepend_metadata: + # create a standard text document for metadata plucking + # ignore any additional fields in case the input dataframe has extra columns + document = TextDocument( + id=row["id"], + title=row["title"], + text=row["text"], + creation_date=row["creation_date"], + raw_data=row["raw_data"], + ) + metadata = document.collect(prepend_metadata) + transformer = add_metadata( + metadata=metadata, line_delimiter=".\n" + ) # delim with . for back-compat older indexes + else: + transformer = None + + row["chunks"] = [ + chunk.text for chunk in chunker.chunk(row["text"], transform=transformer) + ] + + tick() + logger.info("chunker progress: %d/%d", row_index + 1, total_rows) + return row + + text_units = documents.apply( + lambda row: chunker_with_logging(row, row.name), axis=1 + ) + + text_units = cast("pd.DataFrame", text_units[["id", "chunks"]]) + text_units = text_units.explode("chunks") + text_units.rename( + columns={ + "id": "document_id", + "chunks": "text", + }, + inplace=True, + ) + + text_units["id"] = text_units.apply( + lambda row: gen_sha512_hash(row, ["text"]), axis=1 + ) + # get a final token measurement + text_units["n_tokens"] = text_units["text"].apply( + lambda x: len(tokenizer.encode(x)) + ) + + return cast( + "pd.DataFrame", text_units[text_units["text"].notna()].reset_index(drop=True) + ) diff --git a/graphrag/index/workflows/create_communities.py b/packages/graphrag/graphrag/index/workflows/create_communities.py similarity index 98% rename from graphrag/index/workflows/create_communities.py rename to packages/graphrag/graphrag/index/workflows/create_communities.py index c06d5f4b28..4394593e99 100644 --- a/graphrag/index/workflows/create_communities.py +++ b/packages/graphrag/graphrag/index/workflows/create_communities.py @@ -96,7 +96,8 @@ def create_communities( matched = targets.loc[targets["community_x"] == targets["community_y"]] text_units = matched.explode("text_unit_ids") grouped = ( - text_units.groupby(["community_x", "level_x", "parent_x"]) + text_units + .groupby(["community_x", "level_x", "parent_x"]) .agg(relationship_ids=("id", list), text_unit_ids=("text_unit_ids", list)) .reset_index() ) diff --git a/graphrag/index/workflows/create_community_reports.py b/packages/graphrag/graphrag/index/workflows/create_community_reports.py similarity index 75% rename from graphrag/index/workflows/create_community_reports.py rename to packages/graphrag/graphrag/index/workflows/create_community_reports.py index bf98655c01..abfdeca45a 100644 --- a/graphrag/index/workflows/create_community_reports.py +++ b/packages/graphrag/graphrag/index/workflows/create_community_reports.py @@ -4,16 +4,17 @@ """A module containing run_workflow method definition.""" import logging +from typing import TYPE_CHECKING import pandas as pd +from graphrag_llm.completion import create_completion +from graphrag_llm.tokenizer import Tokenizer import graphrag.data_model.schemas as schemas -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag.cache.cache_key_creator import cache_key_creator from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.config.defaults import graphrag_config_defaults from graphrag.config.enums import AsyncType from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.config.models.language_model_config import LanguageModelConfig from graphrag.index.operations.finalize_community_reports import ( finalize_community_reports, ) @@ -29,13 +30,15 @@ ) from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.workflow import WorkflowFunctionOutput -from graphrag.tokenizer.get_tokenizer import get_tokenizer from graphrag.utils.storage import ( load_table_from_storage, storage_has_table, write_table_to_storage, ) +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + logger = logging.getLogger(__name__) @@ -54,25 +57,32 @@ async def run_workflow( ): claims = await load_table_from_storage("covariates", context.output_storage) - community_reports_llm_settings = config.get_language_model_config( - config.community_reports.model_id + model_config = config.get_completion_model_config( + config.community_reports.completion_model_id ) - async_mode = community_reports_llm_settings.async_mode - num_threads = community_reports_llm_settings.concurrent_requests - summarization_strategy = config.community_reports.resolved_strategy( - config.root_dir, community_reports_llm_settings + prompts = config.community_reports.resolved_prompts() + + model = create_completion( + model_config, + cache=context.cache.child(config.community_reports.model_instance_name), + cache_key_creator=cache_key_creator, ) + tokenizer = model.tokenizer + output = await create_community_reports( edges_input=edges, entities=entities, communities=communities, claims_input=claims, callbacks=context.callbacks, - cache=context.cache, - summarization_strategy=summarization_strategy, - async_mode=async_mode, - num_threads=num_threads, + model=model, + tokenizer=tokenizer, + prompt=prompts.graph_prompt, + max_input_length=config.community_reports.max_input_length, + max_report_length=config.community_reports.max_length, + num_threads=config.concurrent_requests, + async_type=config.async_mode, ) await write_table_to_storage(output, "community_reports", context.output_storage) @@ -87,10 +97,13 @@ async def create_community_reports( communities: pd.DataFrame, claims_input: pd.DataFrame | None, callbacks: WorkflowCallbacks, - cache: PipelineCache, - summarization_strategy: dict, - async_mode: AsyncType = AsyncType.AsyncIO, - num_threads: int = 4, + model: "LLMCompletion", + tokenizer: Tokenizer, + prompt: str, + max_input_length: int, + max_report_length: int, + num_threads: int, + async_type: AsyncType, ) -> pd.DataFrame: """All the steps to transform community reports.""" nodes = explode_communities(communities, entities) @@ -102,15 +115,6 @@ async def create_community_reports( if claims_input is not None: claims = _prep_claims(claims_input) - summarization_strategy["extraction_prompt"] = summarization_strategy["graph_prompt"] - - model_config = LanguageModelConfig(**summarization_strategy["llm"]) - tokenizer = get_tokenizer(model_config) - - max_input_length = summarization_strategy.get( - "max_input_length", graphrag_config_defaults.community_reports.max_input_length - ) - local_contexts = build_local_context( nodes, edges, @@ -126,12 +130,13 @@ async def create_community_reports( local_contexts, build_level_context, callbacks, - cache, - summarization_strategy, + model=model, + prompt=prompt, tokenizer=tokenizer, max_input_length=max_input_length, - async_mode=async_mode, + max_report_length=max_report_length, num_threads=num_threads, + async_type=async_type, ) return finalize_community_reports(community_reports, communities) @@ -145,7 +150,7 @@ def _prep_nodes(input: pd.DataFrame) -> pd.DataFrame: ) # Create NODE_DETAILS column - input.loc[:, schemas.NODE_DETAILS] = input.loc[ + input.loc[:, schemas.NODE_DETAILS] = input.loc[ # type: ignore :, [ schemas.SHORT_ID, @@ -163,7 +168,7 @@ def _prep_edges(input: pd.DataFrame) -> pd.DataFrame: input.fillna(value={schemas.DESCRIPTION: "No Description"}, inplace=True) # Create EDGE_DETAILS column - input.loc[:, schemas.EDGE_DETAILS] = input.loc[ + input.loc[:, schemas.EDGE_DETAILS] = input.loc[ # type: ignore :, [ schemas.SHORT_ID, @@ -182,7 +187,7 @@ def _prep_claims(input: pd.DataFrame) -> pd.DataFrame: input.fillna(value={schemas.DESCRIPTION: "No Description"}, inplace=True) # Create CLAIM_DETAILS column - input.loc[:, schemas.CLAIM_DETAILS] = input.loc[ + input.loc[:, schemas.CLAIM_DETAILS] = input.loc[ # type: ignore :, [ schemas.SHORT_ID, diff --git a/graphrag/index/workflows/create_community_reports_text.py b/packages/graphrag/graphrag/index/workflows/create_community_reports_text.py similarity index 67% rename from graphrag/index/workflows/create_community_reports_text.py rename to packages/graphrag/graphrag/index/workflows/create_community_reports_text.py index 20286f7c55..8a6be96e68 100644 --- a/graphrag/index/workflows/create_community_reports_text.py +++ b/packages/graphrag/graphrag/index/workflows/create_community_reports_text.py @@ -4,15 +4,16 @@ """A module containing run_workflow method definition.""" import logging +from typing import TYPE_CHECKING import pandas as pd +from graphrag_llm.completion import create_completion +from graphrag_llm.tokenizer import Tokenizer -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag.cache.cache_key_creator import cache_key_creator from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks -from graphrag.config.defaults import graphrag_config_defaults from graphrag.config.enums import AsyncType from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.config.models.language_model_config import LanguageModelConfig from graphrag.index.operations.finalize_community_reports import ( finalize_community_reports, ) @@ -28,9 +29,11 @@ ) from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.workflow import WorkflowFunctionOutput -from graphrag.tokenizer.get_tokenizer import get_tokenizer from graphrag.utils.storage import load_table_from_storage, write_table_to_storage +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + logger = logging.getLogger(__name__) @@ -45,24 +48,31 @@ async def run_workflow( text_units = await load_table_from_storage("text_units", context.output_storage) - community_reports_llm_settings = config.get_language_model_config( - config.community_reports.model_id + model_config = config.get_completion_model_config( + config.community_reports.completion_model_id ) - async_mode = community_reports_llm_settings.async_mode - num_threads = community_reports_llm_settings.concurrent_requests - summarization_strategy = config.community_reports.resolved_strategy( - config.root_dir, community_reports_llm_settings + model = create_completion( + model_config, + cache=context.cache.child(config.community_reports.model_instance_name), + cache_key_creator=cache_key_creator, ) + tokenizer = model.tokenizer + + prompts = config.community_reports.resolved_prompts() + output = await create_community_reports_text( entities, communities, text_units, context.callbacks, - context.cache, - summarization_strategy, - async_mode=async_mode, - num_threads=num_threads, + model=model, + tokenizer=tokenizer, + prompt=prompts.text_prompt, + max_input_length=config.community_reports.max_input_length, + max_report_length=config.community_reports.max_length, + num_threads=config.concurrent_requests, + async_type=config.async_mode, ) await write_table_to_storage(output, "community_reports", context.output_storage) @@ -76,23 +86,17 @@ async def create_community_reports_text( communities: pd.DataFrame, text_units: pd.DataFrame, callbacks: WorkflowCallbacks, - cache: PipelineCache, - summarization_strategy: dict, - async_mode: AsyncType = AsyncType.AsyncIO, - num_threads: int = 4, + model: "LLMCompletion", + tokenizer: Tokenizer, + prompt: str, + max_input_length: int, + max_report_length: int, + num_threads: int, + async_type: AsyncType, ) -> pd.DataFrame: """All the steps to transform community reports.""" nodes = explode_communities(communities, entities) - summarization_strategy["extraction_prompt"] = summarization_strategy["text_prompt"] - - max_input_length = summarization_strategy.get( - "max_input_length", graphrag_config_defaults.community_reports.max_input_length - ) - - model_config = LanguageModelConfig(**summarization_strategy["llm"]) - tokenizer = get_tokenizer(model_config) - local_contexts = build_local_context( communities, text_units, nodes, tokenizer, max_input_length ) @@ -103,12 +107,13 @@ async def create_community_reports_text( local_contexts, build_level_context, callbacks, - cache, - summarization_strategy, + model=model, + prompt=prompt, tokenizer=tokenizer, max_input_length=max_input_length, - async_mode=async_mode, + max_report_length=max_report_length, num_threads=num_threads, + async_type=async_type, ) return finalize_community_reports(community_reports, communities) diff --git a/graphrag/index/workflows/create_final_documents.py b/packages/graphrag/graphrag/index/workflows/create_final_documents.py similarity index 81% rename from graphrag/index/workflows/create_final_documents.py rename to packages/graphrag/graphrag/index/workflows/create_final_documents.py index af81e8dfa8..554fbc4254 100644 --- a/graphrag/index/workflows/create_final_documents.py +++ b/packages/graphrag/graphrag/index/workflows/create_final_documents.py @@ -37,19 +37,15 @@ def create_final_documents( documents: pd.DataFrame, text_units: pd.DataFrame ) -> pd.DataFrame: """All the steps to transform final documents.""" - exploded = ( - text_units.explode("document_ids") - .loc[:, ["id", "document_ids", "text"]] - .rename( - columns={ - "document_ids": "chunk_doc_id", - "id": "chunk_id", - "text": "chunk_text", - } - ) + renamed = text_units.loc[:, ["id", "document_id", "text"]].rename( + columns={ + "document_id": "chunk_doc_id", + "id": "chunk_id", + "text": "chunk_text", + } ) - joined = exploded.merge( + joined = renamed.merge( documents, left_on="chunk_doc_id", right_on="id", @@ -71,7 +67,7 @@ def create_final_documents( rejoined["id"] = rejoined["id"].astype(str) rejoined["human_readable_id"] = rejoined.index - if "metadata" not in rejoined.columns: - rejoined["metadata"] = pd.Series(dtype="object") + if "raw_data" not in rejoined.columns: + rejoined["raw_data"] = pd.Series(dtype="object") return rejoined.loc[:, DOCUMENTS_FINAL_COLUMNS] diff --git a/graphrag/index/workflows/create_final_text_units.py b/packages/graphrag/graphrag/index/workflows/create_final_text_units.py similarity index 93% rename from graphrag/index/workflows/create_final_text_units.py rename to packages/graphrag/graphrag/index/workflows/create_final_text_units.py index 373b9b4cb4..c16e08bb7c 100644 --- a/graphrag/index/workflows/create_final_text_units.py +++ b/packages/graphrag/graphrag/index/workflows/create_final_text_units.py @@ -59,7 +59,7 @@ def create_final_text_units( final_covariates: pd.DataFrame | None, ) -> pd.DataFrame: """All the steps to transform the text units.""" - selected = text_units.loc[:, ["id", "text", "document_ids", "n_tokens"]] + selected = text_units.loc[:, ["id", "text", "document_id", "n_tokens"]] selected["human_readable_id"] = selected.index entity_join = _entities(final_entities) @@ -88,7 +88,8 @@ def _entities(df: pd.DataFrame) -> pd.DataFrame: unrolled = selected.explode(["text_unit_ids"]).reset_index(drop=True) return ( - unrolled.groupby("text_unit_ids", sort=False) + unrolled + .groupby("text_unit_ids", sort=False) .agg(entity_ids=("id", "unique")) .reset_index() .rename(columns={"text_unit_ids": "id"}) @@ -100,7 +101,8 @@ def _relationships(df: pd.DataFrame) -> pd.DataFrame: unrolled = selected.explode(["text_unit_ids"]).reset_index(drop=True) return ( - unrolled.groupby("text_unit_ids", sort=False) + unrolled + .groupby("text_unit_ids", sort=False) .agg(relationship_ids=("id", "unique")) .reset_index() .rename(columns={"text_unit_ids": "id"}) @@ -111,7 +113,8 @@ def _covariates(df: pd.DataFrame) -> pd.DataFrame: selected = df.loc[:, ["id", "text_unit_id"]] return ( - selected.groupby("text_unit_id", sort=False) + selected + .groupby("text_unit_id", sort=False) .agg(covariate_ids=("id", "unique")) .reset_index() .rename(columns={"text_unit_id": "id"}) diff --git a/graphrag/index/workflows/extract_covariates.py b/packages/graphrag/graphrag/index/workflows/extract_covariates.py similarity index 62% rename from graphrag/index/workflows/extract_covariates.py rename to packages/graphrag/graphrag/index/workflows/extract_covariates.py index 63adb1d0b9..18b470a8b1 100644 --- a/graphrag/index/workflows/extract_covariates.py +++ b/packages/graphrag/graphrag/index/workflows/extract_covariates.py @@ -4,13 +4,15 @@ """A module containing run_workflow method definition.""" import logging -from typing import Any +from typing import TYPE_CHECKING from uuid import uuid4 import pandas as pd +from graphrag_llm.completion import create_completion -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag.cache.cache_key_creator import cache_key_creator from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks +from graphrag.config.defaults import DEFAULT_ENTITY_TYPES from graphrag.config.enums import AsyncType from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.data_model.schemas import COVARIATES_FINAL_COLUMNS @@ -21,6 +23,9 @@ from graphrag.index.typing.workflow import WorkflowFunctionOutput from graphrag.utils.storage import load_table_from_storage, write_table_to_storage +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + logger = logging.getLogger(__name__) @@ -34,25 +39,29 @@ async def run_workflow( if config.extract_claims.enabled: text_units = await load_table_from_storage("text_units", context.output_storage) - extract_claims_llm_settings = config.get_language_model_config( - config.extract_claims.model_id + model_config = config.get_completion_model_config( + config.extract_claims.completion_model_id ) - extraction_strategy = config.extract_claims.resolved_strategy( - config.root_dir, extract_claims_llm_settings + + model = create_completion( + model_config, + cache=context.cache.child(config.extract_claims.model_instance_name), + cache_key_creator=cache_key_creator, ) - async_mode = extract_claims_llm_settings.async_mode - num_threads = extract_claims_llm_settings.concurrent_requests + prompts = config.extract_claims.resolved_prompts() output = await extract_covariates( - text_units, - context.callbacks, - context.cache, - "claim", - extraction_strategy, - async_mode=async_mode, - entity_types=None, - num_threads=num_threads, + text_units=text_units, + callbacks=context.callbacks, + model=model, + covariate_type="claim", + max_gleanings=config.extract_claims.max_gleanings, + claim_description=config.extract_claims.description, + prompt=prompts.extraction_prompt, + entity_types=DEFAULT_ENTITY_TYPES, + num_threads=config.concurrent_requests, + async_type=config.async_mode, ) await write_table_to_storage(output, "covariates", context.output_storage) @@ -64,27 +73,32 @@ async def run_workflow( async def extract_covariates( text_units: pd.DataFrame, callbacks: WorkflowCallbacks, - cache: PipelineCache, + model: "LLMCompletion", covariate_type: str, - extraction_strategy: dict[str, Any] | None, - async_mode: AsyncType = AsyncType.AsyncIO, - entity_types: list[str] | None = None, - num_threads: int = 4, + max_gleanings: int, + claim_description: str, + prompt: str, + entity_types: list[str], + num_threads: int, + async_type: AsyncType, ) -> pd.DataFrame: """All the steps to extract and format covariates.""" # reassign the id because it will be overwritten in the output by a covariate one # this also results in text_unit_id being copied to the output covariate table text_units["text_unit_id"] = text_units["id"] + covariates = await extractor( input=text_units, callbacks=callbacks, - cache=cache, + model=model, column="text", covariate_type=covariate_type, - strategy=extraction_strategy, - async_mode=async_mode, + max_gleanings=max_gleanings, + claim_description=claim_description, + prompt=prompt, entity_types=entity_types, num_threads=num_threads, + async_type=async_type, ) text_units.drop(columns=["text_unit_id"], inplace=True) # don't pollute the global covariates["id"] = covariates["covariate_type"].apply(lambda _x: str(uuid4())) diff --git a/graphrag/index/workflows/extract_graph.py b/packages/graphrag/graphrag/index/workflows/extract_graph.py similarity index 58% rename from graphrag/index/workflows/extract_graph.py rename to packages/graphrag/graphrag/index/workflows/extract_graph.py index 592502f6da..6d6520e401 100644 --- a/graphrag/index/workflows/extract_graph.py +++ b/packages/graphrag/graphrag/index/workflows/extract_graph.py @@ -4,11 +4,12 @@ """A module containing run_workflow method definition.""" import logging -from typing import Any +from typing import TYPE_CHECKING import pandas as pd +from graphrag_llm.completion import create_completion -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag.cache.cache_key_creator import cache_key_creator from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.config.enums import AsyncType from graphrag.config.models.graph_rag_config import GraphRagConfig @@ -22,6 +23,9 @@ from graphrag.index.typing.workflow import WorkflowFunctionOutput from graphrag.utils.storage import load_table_from_storage, write_table_to_storage +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + logger = logging.getLogger(__name__) @@ -33,30 +37,40 @@ async def run_workflow( logger.info("Workflow started: extract_graph") text_units = await load_table_from_storage("text_units", context.output_storage) - extract_graph_llm_settings = config.get_language_model_config( - config.extract_graph.model_id + extraction_model_config = config.get_completion_model_config( + config.extract_graph.completion_model_id ) - extraction_strategy = config.extract_graph.resolved_strategy( - config.root_dir, extract_graph_llm_settings + extraction_prompts = config.extract_graph.resolved_prompts() + extraction_model = create_completion( + extraction_model_config, + cache=context.cache.child(config.extract_graph.model_instance_name), + cache_key_creator=cache_key_creator, ) - summarization_llm_settings = config.get_language_model_config( - config.summarize_descriptions.model_id + summarization_model_config = config.get_completion_model_config( + config.summarize_descriptions.completion_model_id ) - summarization_strategy = config.summarize_descriptions.resolved_strategy( - config.root_dir, summarization_llm_settings + summarization_prompts = config.summarize_descriptions.resolved_prompts() + summarization_model = create_completion( + summarization_model_config, + cache=context.cache.child(config.summarize_descriptions.model_instance_name), + cache_key_creator=cache_key_creator, ) entities, relationships, raw_entities, raw_relationships = await extract_graph( text_units=text_units, callbacks=context.callbacks, - cache=context.cache, - extraction_strategy=extraction_strategy, - extraction_num_threads=extract_graph_llm_settings.concurrent_requests, - extraction_async_mode=extract_graph_llm_settings.async_mode, + extraction_model=extraction_model, + extraction_prompt=extraction_prompts.extraction_prompt, entity_types=config.extract_graph.entity_types, - summarization_strategy=summarization_strategy, - summarization_num_threads=summarization_llm_settings.concurrent_requests, + max_gleanings=config.extract_graph.max_gleanings, + extraction_num_threads=config.concurrent_requests, + extraction_async_type=config.async_mode, + summarization_model=summarization_model, + max_summary_length=config.summarize_descriptions.max_length, + max_input_tokens=config.summarize_descriptions.max_input_tokens, + summarization_prompt=summarization_prompts.summarize_prompt, + summarization_num_threads=config.concurrent_requests, ) await write_table_to_storage(entities, "entities", context.output_storage) @@ -82,36 +96,41 @@ async def run_workflow( async def extract_graph( text_units: pd.DataFrame, callbacks: WorkflowCallbacks, - cache: PipelineCache, - extraction_strategy: dict[str, Any] | None = None, - extraction_num_threads: int = 4, - extraction_async_mode: AsyncType = AsyncType.AsyncIO, - entity_types: list[str] | None = None, - summarization_strategy: dict[str, Any] | None = None, - summarization_num_threads: int = 4, + extraction_model: "LLMCompletion", + extraction_prompt: str, + entity_types: list[str], + max_gleanings: int, + extraction_num_threads: int, + extraction_async_type: AsyncType, + summarization_model: "LLMCompletion", + max_summary_length: int, + max_input_tokens: int, + summarization_prompt: str, + summarization_num_threads: int, ) -> tuple[pd.DataFrame, pd.DataFrame, pd.DataFrame, pd.DataFrame]: """All the steps to create the base entity graph.""" # this returns a graph for each text unit, to be merged later extracted_entities, extracted_relationships = await extractor( text_units=text_units, callbacks=callbacks, - cache=cache, text_column="text", id_column="id", - strategy=extraction_strategy, - async_mode=extraction_async_mode, + model=extraction_model, + prompt=extraction_prompt, entity_types=entity_types, + max_gleanings=max_gleanings, num_threads=extraction_num_threads, + async_type=extraction_async_type, ) - if not _validate_data(extracted_entities): - error_msg = "Entity Extraction failed. No entities detected during extraction." + if len(extracted_entities) == 0: + error_msg = "Graph Extraction failed. No entities detected during extraction." logger.error(error_msg) raise ValueError(error_msg) - if not _validate_data(extracted_relationships): + if len(extracted_relationships) == 0: error_msg = ( - "Entity Extraction failed. No relationships detected during extraction." + "Graph Extraction failed. No relationships detected during extraction." ) logger.error(error_msg) raise ValueError(error_msg) @@ -124,9 +143,11 @@ async def extract_graph( extracted_entities=extracted_entities, extracted_relationships=extracted_relationships, callbacks=callbacks, - cache=cache, - summarization_strategy=summarization_strategy, - summarization_num_threads=summarization_num_threads, + model=summarization_model, + max_summary_length=max_summary_length, + max_input_tokens=max_input_tokens, + summarization_prompt=summarization_prompt, + num_threads=summarization_num_threads, ) return (entities, relationships, raw_entities, raw_relationships) @@ -136,18 +157,22 @@ async def get_summarized_entities_relationships( extracted_entities: pd.DataFrame, extracted_relationships: pd.DataFrame, callbacks: WorkflowCallbacks, - cache: PipelineCache, - summarization_strategy: dict[str, Any] | None = None, - summarization_num_threads: int = 4, + model: "LLMCompletion", + max_summary_length: int, + max_input_tokens: int, + summarization_prompt: str, + num_threads: int, ) -> tuple[pd.DataFrame, pd.DataFrame]: """Summarize the entities and relationships.""" entity_summaries, relationship_summaries = await summarize_descriptions( entities_df=extracted_entities, relationships_df=extracted_relationships, callbacks=callbacks, - cache=cache, - strategy=summarization_strategy, - num_threads=summarization_num_threads, + model=model, + max_summary_length=max_summary_length, + max_input_tokens=max_input_tokens, + prompt=summarization_prompt, + num_threads=num_threads, ) relationships = extracted_relationships.drop(columns=["description"]).merge( @@ -157,8 +182,3 @@ async def get_summarized_entities_relationships( extracted_entities.drop(columns=["description"], inplace=True) entities = extracted_entities.merge(entity_summaries, on="title", how="left") return entities, relationships - - -def _validate_data(df: pd.DataFrame) -> bool: - """Validate that the dataframe has data.""" - return len(df) > 0 diff --git a/graphrag/index/workflows/extract_graph_nlp.py b/packages/graphrag/graphrag/index/workflows/extract_graph_nlp.py similarity index 64% rename from graphrag/index/workflows/extract_graph_nlp.py rename to packages/graphrag/graphrag/index/workflows/extract_graph_nlp.py index 90afedf46c..38810e5de4 100644 --- a/graphrag/index/workflows/extract_graph_nlp.py +++ b/packages/graphrag/graphrag/index/workflows/extract_graph_nlp.py @@ -6,11 +6,14 @@ import logging import pandas as pd +from graphrag_cache import Cache -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.config.models.extract_graph_nlp_config import ExtractGraphNLPConfig +from graphrag.config.enums import AsyncType from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.operations.build_noun_graph.build_noun_graph import build_noun_graph +from graphrag.index.operations.build_noun_graph.np_extractors.base import ( + BaseNounPhraseExtractor, +) from graphrag.index.operations.build_noun_graph.np_extractors.factory import ( create_noun_phrase_extractor, ) @@ -29,10 +32,16 @@ async def run_workflow( logger.info("Workflow started: extract_graph_nlp") text_units = await load_table_from_storage("text_units", context.output_storage) + text_analyzer_config = config.extract_graph_nlp.text_analyzer + text_analyzer = create_noun_phrase_extractor(text_analyzer_config) + entities, relationships = await extract_graph_nlp( text_units, context.cache, - extraction_config=config.extract_graph_nlp, + text_analyzer=text_analyzer, + normalize_edge_weights=config.extract_graph_nlp.normalize_edge_weights, + num_threads=config.extract_graph_nlp.concurrent_requests, + async_type=config.extract_graph_nlp.async_mode, ) await write_table_to_storage(entities, "entities", context.output_storage) @@ -50,21 +59,35 @@ async def run_workflow( async def extract_graph_nlp( text_units: pd.DataFrame, - cache: PipelineCache, - extraction_config: ExtractGraphNLPConfig, + cache: Cache, + text_analyzer: BaseNounPhraseExtractor, + normalize_edge_weights: bool, + num_threads: int, + async_type: AsyncType, ) -> tuple[pd.DataFrame, pd.DataFrame]: """All the steps to create the base entity graph.""" - text_analyzer_config = extraction_config.text_analyzer - text_analyzer = create_noun_phrase_extractor(text_analyzer_config) extracted_nodes, extracted_edges = await build_noun_graph( text_units, text_analyzer=text_analyzer, - normalize_edge_weights=extraction_config.normalize_edge_weights, - num_threads=extraction_config.concurrent_requests, - async_mode=extraction_config.async_mode, + normalize_edge_weights=normalize_edge_weights, + num_threads=num_threads, + async_mode=async_type, cache=cache, ) + if len(extracted_nodes) == 0: + error_msg = ( + "NLP Graph Extraction failed. No entities detected during extraction." + ) + logger.error(error_msg) + raise ValueError(error_msg) + + if len(extracted_edges) == 0: + error_msg = ( + "NLP Graph Extraction failed. No relationships detected during extraction." + ) + logger.error(error_msg) + # add in any other columns required by downstream workflows extracted_nodes["type"] = "NOUN PHRASE" extracted_nodes["description"] = "" diff --git a/graphrag/index/workflows/factory.py b/packages/graphrag/graphrag/index/workflows/factory.py similarity index 100% rename from graphrag/index/workflows/factory.py rename to packages/graphrag/graphrag/index/workflows/factory.py diff --git a/graphrag/index/workflows/finalize_graph.py b/packages/graphrag/graphrag/index/workflows/finalize_graph.py similarity index 83% rename from graphrag/index/workflows/finalize_graph.py rename to packages/graphrag/graphrag/index/workflows/finalize_graph.py index 66827774f2..49529aea3a 100644 --- a/graphrag/index/workflows/finalize_graph.py +++ b/packages/graphrag/graphrag/index/workflows/finalize_graph.py @@ -7,7 +7,6 @@ import pandas as pd -from graphrag.config.models.embed_graph_config import EmbedGraphConfig from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.operations.create_graph import create_graph from graphrag.index.operations.finalize_entities import finalize_entities @@ -34,8 +33,6 @@ async def run_workflow( final_entities, final_relationships = finalize_graph( entities, relationships, - embed_config=config.embed_graph, - layout_enabled=config.umap.enabled, ) await write_table_to_storage(final_entities, "entities", context.output_storage) @@ -44,7 +41,6 @@ async def run_workflow( ) if config.snapshots.graphml: - # todo: extract graphs at each level, and add in meta like descriptions graph = create_graph(final_relationships, edge_attr=["weight"]) await snapshot_graphml( @@ -65,12 +61,8 @@ async def run_workflow( def finalize_graph( entities: pd.DataFrame, relationships: pd.DataFrame, - embed_config: EmbedGraphConfig | None = None, - layout_enabled: bool = False, ) -> tuple[pd.DataFrame, pd.DataFrame]: """All the steps to finalize the entity and relationship formats.""" - final_entities = finalize_entities( - entities, relationships, embed_config, layout_enabled - ) + final_entities = finalize_entities(entities, relationships) final_relationships = finalize_relationships(relationships) return (final_entities, final_relationships) diff --git a/graphrag/index/workflows/generate_text_embeddings.py b/packages/graphrag/graphrag/index/workflows/generate_text_embeddings.py similarity index 62% rename from graphrag/index/workflows/generate_text_embeddings.py rename to packages/graphrag/graphrag/index/workflows/generate_text_embeddings.py index 9e6dde6d34..16b726028e 100644 --- a/graphrag/index/workflows/generate_text_embeddings.py +++ b/packages/graphrag/graphrag/index/workflows/generate_text_embeddings.py @@ -4,22 +4,23 @@ """A module containing run_workflow method definition.""" import logging +from typing import TYPE_CHECKING import pandas as pd +from graphrag_llm.embedding import create_embedding +from graphrag_llm.tokenizer import Tokenizer +from graphrag_vectors import ( + VectorStoreConfig, + create_vector_store, +) -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag.cache.cache_key_creator import cache_key_creator from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.config.embeddings import ( community_full_content_embedding, - community_summary_embedding, - community_title_embedding, - document_text_embedding, entity_description_embedding, - entity_title_embedding, - relationship_description_embedding, text_unit_text_embedding, ) -from graphrag.config.get_embedding_settings import get_embedding_settings from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.operations.embed_text.embed_text import embed_text from graphrag.index.typing.context import PipelineRunContext @@ -29,6 +30,9 @@ write_table_to_storage, ) +if TYPE_CHECKING: + from graphrag_llm.embedding import LLMEmbedding + logger = logging.getLogger(__name__) @@ -40,44 +44,41 @@ async def run_workflow( logger.info("Workflow started: generate_text_embeddings") embedded_fields = config.embed_text.names logger.info("Embedding the following fields: %s", embedded_fields) - documents = None - relationships = None text_units = None entities = None community_reports = None - if document_text_embedding in embedded_fields: - documents = await load_table_from_storage("documents", context.output_storage) - if relationship_description_embedding in embedded_fields: - relationships = await load_table_from_storage( - "relationships", context.output_storage - ) if text_unit_text_embedding in embedded_fields: text_units = await load_table_from_storage("text_units", context.output_storage) - if ( - entity_title_embedding in embedded_fields - or entity_description_embedding in embedded_fields - ): + if entity_description_embedding in embedded_fields: entities = await load_table_from_storage("entities", context.output_storage) - if ( - community_title_embedding in embedded_fields - or community_summary_embedding in embedded_fields - or community_full_content_embedding in embedded_fields - ): + if community_full_content_embedding in embedded_fields: community_reports = await load_table_from_storage( "community_reports", context.output_storage ) - text_embed = get_embedding_settings(config) + model_config = config.get_embedding_model_config( + config.embed_text.embedding_model_id + ) + + model = create_embedding( + model_config, + cache=context.cache.child(config.embed_text.model_instance_name), + cache_key_creator=cache_key_creator, + ) + + tokenizer = model.tokenizer output = await generate_text_embeddings( - documents=documents, - relationships=relationships, text_units=text_units, entities=entities, community_reports=community_reports, callbacks=context.callbacks, - cache=context.cache, - text_embed_config=text_embed, + model=model, + tokenizer=tokenizer, + batch_size=config.embed_text.batch_size, + batch_max_tokens=config.embed_text.batch_max_tokens, + num_threads=config.concurrent_requests, + vector_store_config=config.vector_store, embedded_fields=embedded_fields, ) @@ -94,38 +95,26 @@ async def run_workflow( async def generate_text_embeddings( - documents: pd.DataFrame | None, - relationships: pd.DataFrame | None, text_units: pd.DataFrame | None, entities: pd.DataFrame | None, community_reports: pd.DataFrame | None, callbacks: WorkflowCallbacks, - cache: PipelineCache, - text_embed_config: dict, + model: "LLMEmbedding", + tokenizer: Tokenizer, + batch_size: int, + batch_max_tokens: int, + num_threads: int, + vector_store_config: VectorStoreConfig, embedded_fields: list[str], ) -> dict[str, pd.DataFrame]: """All the steps to generate all embeddings.""" embedding_param_map = { - document_text_embedding: { - "data": documents.loc[:, ["id", "text"]] if documents is not None else None, - "embed_column": "text", - }, - relationship_description_embedding: { - "data": relationships.loc[:, ["id", "description"]] - if relationships is not None - else None, - "embed_column": "description", - }, text_unit_text_embedding: { "data": text_units.loc[:, ["id", "text"]] if text_units is not None else None, "embed_column": "text", }, - entity_title_embedding: { - "data": entities.loc[:, ["id", "title"]] if entities is not None else None, - "embed_column": "title", - }, entity_description_embedding: { "data": entities.loc[:, ["id", "title", "description"]].assign( title_description=lambda df: df["title"] + ":" + df["description"] @@ -134,18 +123,6 @@ async def generate_text_embeddings( else None, "embed_column": "title_description", }, - community_title_embedding: { - "data": community_reports.loc[:, ["id", "title"]] - if community_reports is not None - else None, - "embed_column": "title", - }, - community_summary_embedding: { - "data": community_reports.loc[:, ["id", "summary"]] - if community_reports is not None - else None, - "embed_column": "summary", - }, community_full_content_embedding: { "data": community_reports.loc[:, ["id", "full_content"]] if community_reports is not None @@ -164,8 +141,12 @@ async def generate_text_embeddings( outputs[field] = await _run_embeddings( name=field, callbacks=callbacks, - cache=cache, - text_embed_config=text_embed_config, + model=model, + tokenizer=tokenizer, + vector_store_config=vector_store_config, + batch_size=batch_size, + batch_max_tokens=batch_max_tokens, + num_threads=num_threads, **embedding_param_map[field], ) return outputs @@ -176,17 +157,29 @@ async def _run_embeddings( data: pd.DataFrame, embed_column: str, callbacks: WorkflowCallbacks, - cache: PipelineCache, - text_embed_config: dict, + model: "LLMEmbedding", + tokenizer: Tokenizer, + batch_size: int, + batch_max_tokens: int, + num_threads: int, + vector_store_config: VectorStoreConfig, ) -> pd.DataFrame: """All the steps to generate single embedding.""" + vector_store = create_vector_store( + vector_store_config, vector_store_config.index_schema[name] + ) + vector_store.connect() + data["embedding"] = await embed_text( input=data, callbacks=callbacks, - cache=cache, + model=model, + tokenizer=tokenizer, embed_column=embed_column, - embedding_name=name, - strategy=text_embed_config["strategy"], + batch_size=batch_size, + batch_max_tokens=batch_max_tokens, + num_threads=num_threads, + vector_store=vector_store, ) return data.loc[:, ["id", "embedding"]] diff --git a/graphrag/index/workflows/load_input_documents.py b/packages/graphrag/graphrag/index/workflows/load_input_documents.py similarity index 67% rename from graphrag/index/workflows/load_input_documents.py rename to packages/graphrag/graphrag/index/workflows/load_input_documents.py index 33e14d0cb2..0a5aa65454 100644 --- a/graphrag/index/workflows/load_input_documents.py +++ b/packages/graphrag/graphrag/index/workflows/load_input_documents.py @@ -6,13 +6,11 @@ import logging import pandas as pd +from graphrag_input import InputReader, create_input_reader from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.config.models.input_config import InputConfig -from graphrag.index.input.factory import create_input from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.workflow import WorkflowFunctionOutput -from graphrag.storage.pipeline_storage import PipelineStorage from graphrag.utils.storage import write_table_to_storage logger = logging.getLogger(__name__) @@ -23,10 +21,14 @@ async def run_workflow( context: PipelineRunContext, ) -> WorkflowFunctionOutput: """Load and parse input documents into a standard format.""" - output = await load_input_documents( - config.input, - context.input_storage, - ) + input_reader = create_input_reader(config.input, context.input_storage) + + output = await load_input_documents(input_reader) + + if len(output) == 0: + msg = "Error reading documents, please see logs." + logger.error(msg) + raise ValueError(msg) logger.info("Final # of rows loaded: %s", len(output)) context.stats.num_documents = len(output) @@ -36,8 +38,6 @@ async def run_workflow( return WorkflowFunctionOutput(result=output) -async def load_input_documents( - config: InputConfig, storage: PipelineStorage -) -> pd.DataFrame: +async def load_input_documents(input_reader: InputReader) -> pd.DataFrame: """Load and parse input documents into a standard format.""" - return await create_input(config, storage) + return pd.DataFrame(await input_reader.read_files()) diff --git a/graphrag/index/workflows/load_update_documents.py b/packages/graphrag/graphrag/index/workflows/load_update_documents.py similarity index 79% rename from graphrag/index/workflows/load_update_documents.py rename to packages/graphrag/graphrag/index/workflows/load_update_documents.py index fbe48b6419..1cab6cabfe 100644 --- a/graphrag/index/workflows/load_update_documents.py +++ b/packages/graphrag/graphrag/index/workflows/load_update_documents.py @@ -6,14 +6,14 @@ import logging import pandas as pd +from graphrag_input.input_reader import InputReader +from graphrag_input.input_reader_factory import create_input_reader +from graphrag_storage import Storage from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.config.models.input_config import InputConfig -from graphrag.index.input.factory import create_input from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.workflow import WorkflowFunctionOutput from graphrag.index.update.incremental_index import get_delta_docs -from graphrag.storage.pipeline_storage import PipelineStorage from graphrag.utils.storage import write_table_to_storage logger = logging.getLogger(__name__) @@ -24,9 +24,9 @@ async def run_workflow( context: PipelineRunContext, ) -> WorkflowFunctionOutput: """Load and parse update-only input documents into a standard format.""" + input_reader = create_input_reader(config.input, context.input_storage) output = await load_update_documents( - config.input, - context.input_storage, + input_reader, context.previous_storage, ) @@ -43,12 +43,11 @@ async def run_workflow( async def load_update_documents( - config: InputConfig, - input_storage: PipelineStorage, - previous_storage: PipelineStorage, + input_reader: InputReader, + previous_storage: Storage, ) -> pd.DataFrame: """Load and parse update-only input documents into a standard format.""" - input_documents = await create_input(config, input_storage) + input_documents = pd.DataFrame(await input_reader.read_files()) # previous storage is the output of the previous run # we'll use this to diff the input from the prior delta_documents = await get_delta_docs(input_documents, previous_storage) diff --git a/graphrag/index/workflows/prune_graph.py b/packages/graphrag/graphrag/index/workflows/prune_graph.py similarity index 90% rename from graphrag/index/workflows/prune_graph.py rename to packages/graphrag/graphrag/index/workflows/prune_graph.py index 8bb48df7ee..5653eef49b 100644 --- a/graphrag/index/workflows/prune_graph.py +++ b/packages/graphrag/graphrag/index/workflows/prune_graph.py @@ -58,6 +58,7 @@ def prune_graph( """Prune a full graph based on graph statistics.""" # create a temporary graph to prune, then turn it back into dataframes graph = create_graph(relationships, edge_attr=["weight"], nodes=entities) + pruned = prune_graph_operation( graph, min_node_freq=pruning_config.min_node_freq, @@ -69,6 +70,16 @@ def prune_graph( lcc_only=pruning_config.lcc_only, ) + if len(pruned.nodes) == 0: + error_msg = "Graph Pruning failed. No entities remain." + logger.error(error_msg) + raise ValueError(error_msg) + + if len(pruned.edges) == 0: + error_msg = "Graph Pruning failed. No relationships remain." + logger.error(error_msg) + raise ValueError(error_msg) + pruned_nodes, pruned_edges = graph_to_dataframes( pruned, node_columns=["title"], edge_columns=["source", "target"] ) diff --git a/graphrag/index/workflows/update_clean_state.py b/packages/graphrag/graphrag/index/workflows/update_clean_state.py similarity index 100% rename from graphrag/index/workflows/update_clean_state.py rename to packages/graphrag/graphrag/index/workflows/update_clean_state.py diff --git a/graphrag/index/workflows/update_communities.py b/packages/graphrag/graphrag/index/workflows/update_communities.py similarity index 91% rename from graphrag/index/workflows/update_communities.py rename to packages/graphrag/graphrag/index/workflows/update_communities.py index b7e3e6a343..da4fdef147 100644 --- a/graphrag/index/workflows/update_communities.py +++ b/packages/graphrag/graphrag/index/workflows/update_communities.py @@ -5,12 +5,13 @@ import logging +from graphrag_storage import Storage + from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.run.utils import get_update_storages from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.workflow import WorkflowFunctionOutput from graphrag.index.update.communities import _update_and_merge_communities -from graphrag.storage.pipeline_storage import PipelineStorage from graphrag.utils.storage import load_table_from_storage, write_table_to_storage logger = logging.getLogger(__name__) @@ -37,9 +38,9 @@ async def run_workflow( async def _update_communities( - previous_storage: PipelineStorage, - delta_storage: PipelineStorage, - output_storage: PipelineStorage, + previous_storage: Storage, + delta_storage: Storage, + output_storage: Storage, ) -> dict: """Update the communities output.""" old_communities = await load_table_from_storage("communities", previous_storage) diff --git a/graphrag/index/workflows/update_community_reports.py b/packages/graphrag/graphrag/index/workflows/update_community_reports.py similarity index 92% rename from graphrag/index/workflows/update_community_reports.py rename to packages/graphrag/graphrag/index/workflows/update_community_reports.py index 42576aca27..790f9fc296 100644 --- a/graphrag/index/workflows/update_community_reports.py +++ b/packages/graphrag/graphrag/index/workflows/update_community_reports.py @@ -6,13 +6,13 @@ import logging import pandas as pd +from graphrag_storage import Storage from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.run.utils import get_update_storages from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.workflow import WorkflowFunctionOutput from graphrag.index.update.communities import _update_and_merge_community_reports -from graphrag.storage.pipeline_storage import PipelineStorage from graphrag.utils.storage import load_table_from_storage, write_table_to_storage logger = logging.getLogger(__name__) @@ -43,9 +43,9 @@ async def run_workflow( async def _update_community_reports( - previous_storage: PipelineStorage, - delta_storage: PipelineStorage, - output_storage: PipelineStorage, + previous_storage: Storage, + delta_storage: Storage, + output_storage: Storage, community_id_mapping: dict, ) -> pd.DataFrame: """Update the community reports output.""" diff --git a/graphrag/index/workflows/update_covariates.py b/packages/graphrag/graphrag/index/workflows/update_covariates.py similarity index 93% rename from graphrag/index/workflows/update_covariates.py rename to packages/graphrag/graphrag/index/workflows/update_covariates.py index f0bf29a6ae..09f8b4053d 100644 --- a/graphrag/index/workflows/update_covariates.py +++ b/packages/graphrag/graphrag/index/workflows/update_covariates.py @@ -7,12 +7,12 @@ import numpy as np import pandas as pd +from graphrag_storage import Storage from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.run.utils import get_update_storages from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.workflow import WorkflowFunctionOutput -from graphrag.storage.pipeline_storage import PipelineStorage from graphrag.utils.storage import ( load_table_from_storage, storage_has_table, @@ -43,9 +43,9 @@ async def run_workflow( async def _update_covariates( - previous_storage: PipelineStorage, - delta_storage: PipelineStorage, - output_storage: PipelineStorage, + previous_storage: Storage, + delta_storage: Storage, + output_storage: Storage, ) -> None: """Update the covariates output.""" old_covariates = await load_table_from_storage("covariates", previous_storage) diff --git a/graphrag/index/workflows/update_entities_relationships.py b/packages/graphrag/graphrag/index/workflows/update_entities_relationships.py similarity index 78% rename from graphrag/index/workflows/update_entities_relationships.py rename to packages/graphrag/graphrag/index/workflows/update_entities_relationships.py index cd8ad82553..225c12d9b9 100644 --- a/graphrag/index/workflows/update_entities_relationships.py +++ b/packages/graphrag/graphrag/index/workflows/update_entities_relationships.py @@ -6,8 +6,11 @@ import logging import pandas as pd +from graphrag_cache import Cache +from graphrag_llm.completion import create_completion +from graphrag_storage import Storage -from graphrag.cache.pipeline_cache import PipelineCache +from graphrag.cache.cache_key_creator import cache_key_creator from graphrag.callbacks.workflow_callbacks import WorkflowCallbacks from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.run.utils import get_update_storages @@ -16,7 +19,6 @@ from graphrag.index.update.entities import _group_and_resolve_entities from graphrag.index.update.relationships import _update_and_merge_relationships from graphrag.index.workflows.extract_graph import get_summarized_entities_relationships -from graphrag.storage.pipeline_storage import PipelineStorage from graphrag.utils.storage import load_table_from_storage, write_table_to_storage logger = logging.getLogger(__name__) @@ -54,11 +56,11 @@ async def run_workflow( async def _update_entities_and_relationships( - previous_storage: PipelineStorage, - delta_storage: PipelineStorage, - output_storage: PipelineStorage, + previous_storage: Storage, + delta_storage: Storage, + output_storage: Storage, config: GraphRagConfig, - cache: PipelineCache, + cache: Cache, callbacks: WorkflowCallbacks, ) -> tuple[pd.DataFrame, pd.DataFrame, dict]: """Update Final Entities and Relationships output.""" @@ -77,11 +79,14 @@ async def _update_entities_and_relationships( delta_relationships, ) - summarization_llm_settings = config.get_language_model_config( - config.summarize_descriptions.model_id + summarization_model_config = config.get_completion_model_config( + config.summarize_descriptions.completion_model_id ) - summarization_strategy = config.summarize_descriptions.resolved_strategy( - config.root_dir, summarization_llm_settings + prompts = config.summarize_descriptions.resolved_prompts() + model = create_completion( + summarization_model_config, + cache=cache.child("summarize_descriptions"), + cache_key_creator=cache_key_creator, ) ( @@ -91,9 +96,11 @@ async def _update_entities_and_relationships( extracted_entities=merged_entities_df, extracted_relationships=merged_relationships_df, callbacks=callbacks, - cache=cache, - summarization_strategy=summarization_strategy, - summarization_num_threads=summarization_llm_settings.concurrent_requests, + model=model, + max_summary_length=config.summarize_descriptions.max_length, + max_input_tokens=config.summarize_descriptions.max_input_tokens, + summarization_prompt=prompts.summarize_prompt, + num_threads=config.concurrent_requests, ) # Save the updated entities back to storage diff --git a/graphrag/index/workflows/update_final_documents.py b/packages/graphrag/graphrag/index/workflows/update_final_documents.py similarity index 100% rename from graphrag/index/workflows/update_final_documents.py rename to packages/graphrag/graphrag/index/workflows/update_final_documents.py diff --git a/graphrag/index/workflows/update_text_embeddings.py b/packages/graphrag/graphrag/index/workflows/update_text_embeddings.py similarity index 73% rename from graphrag/index/workflows/update_text_embeddings.py rename to packages/graphrag/graphrag/index/workflows/update_text_embeddings.py index 11bce16d3e..375bb69df4 100644 --- a/graphrag/index/workflows/update_text_embeddings.py +++ b/packages/graphrag/graphrag/index/workflows/update_text_embeddings.py @@ -5,7 +5,9 @@ import logging -from graphrag.config.get_embedding_settings import get_embedding_settings +from graphrag_llm.embedding import create_embedding + +from graphrag.cache.cache_key_creator import cache_key_creator from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.run.utils import get_update_storages from graphrag.index.typing.context import PipelineRunContext @@ -25,9 +27,6 @@ async def run_workflow( output_storage, _, _ = get_update_storages( config, context.state["update_timestamp"] ) - - final_documents_df = context.state["incremental_update_final_documents"] - merged_relationships_df = context.state["incremental_update_merged_relationships"] merged_text_units = context.state["incremental_update_merged_text_units"] merged_entities_df = context.state["incremental_update_merged_entities"] merged_community_reports = context.state[ @@ -35,16 +34,30 @@ async def run_workflow( ] embedded_fields = config.embed_text.names - text_embed = get_embedding_settings(config) + + model_config = config.get_embedding_model_config( + config.embed_text.embedding_model_id + ) + + model = create_embedding( + model_config, + cache=context.cache.child("text_embedding"), + cache_key_creator=cache_key_creator, + ) + + tokenizer = model.tokenizer + result = await generate_text_embeddings( - documents=final_documents_df, - relationships=merged_relationships_df, text_units=merged_text_units, entities=merged_entities_df, community_reports=merged_community_reports, callbacks=context.callbacks, - cache=context.cache, - text_embed_config=text_embed, + model=model, + tokenizer=tokenizer, + batch_size=config.embed_text.batch_size, + batch_max_tokens=config.embed_text.batch_max_tokens, + num_threads=config.concurrent_requests, + vector_store_config=config.vector_store, embedded_fields=embedded_fields, ) if config.snapshots.embeddings: diff --git a/graphrag/index/workflows/update_text_units.py b/packages/graphrag/graphrag/index/workflows/update_text_units.py similarity index 94% rename from graphrag/index/workflows/update_text_units.py rename to packages/graphrag/graphrag/index/workflows/update_text_units.py index 392533f16b..c97f89ce7a 100644 --- a/graphrag/index/workflows/update_text_units.py +++ b/packages/graphrag/graphrag/index/workflows/update_text_units.py @@ -7,12 +7,12 @@ import numpy as np import pandas as pd +from graphrag_storage import Storage from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.index.run.utils import get_update_storages from graphrag.index.typing.context import PipelineRunContext from graphrag.index.typing.workflow import WorkflowFunctionOutput -from graphrag.storage.pipeline_storage import PipelineStorage from graphrag.utils.storage import load_table_from_storage, write_table_to_storage logger = logging.getLogger(__name__) @@ -40,9 +40,9 @@ async def run_workflow( async def _update_text_units( - previous_storage: PipelineStorage, - delta_storage: PipelineStorage, - output_storage: PipelineStorage, + previous_storage: Storage, + delta_storage: Storage, + output_storage: Storage, entity_id_mapping: dict, ) -> pd.DataFrame: """Update the text units output.""" diff --git a/graphrag/logger/__init__.py b/packages/graphrag/graphrag/logger/__init__.py similarity index 100% rename from graphrag/logger/__init__.py rename to packages/graphrag/graphrag/logger/__init__.py diff --git a/graphrag/logger/blob_workflow_logger.py b/packages/graphrag/graphrag/logger/blob_workflow_logger.py similarity index 89% rename from graphrag/logger/blob_workflow_logger.py rename to packages/graphrag/graphrag/logger/blob_workflow_logger.py index ae4893c6e8..fd7ccac4fe 100644 --- a/graphrag/logger/blob_workflow_logger.py +++ b/packages/graphrag/graphrag/logger/blob_workflow_logger.py @@ -26,7 +26,7 @@ def __init__( container_name: str | None, blob_name: str = "", base_dir: str | None = None, - storage_account_blob_url: str | None = None, + account_url: str | None = None, level: int = logging.NOTSET, ): """Create a new instance of the BlobWorkflowLogger class.""" @@ -35,24 +35,24 @@ def __init__( if container_name is None: msg = "No container name provided for blob storage." raise ValueError(msg) - if connection_string is None and storage_account_blob_url is None: + if connection_string is None and account_url is None: msg = "No storage account blob url provided for blob storage." raise ValueError(msg) self._connection_string = connection_string - self._storage_account_blob_url = storage_account_blob_url + self.account_url = account_url if self._connection_string: self._blob_service_client = BlobServiceClient.from_connection_string( self._connection_string ) else: - if storage_account_blob_url is None: - msg = "Either connection_string or storage_account_blob_url must be provided." + if account_url is None: + msg = "Either connection_string or account_url must be provided." raise ValueError(msg) self._blob_service_client = BlobServiceClient( - storage_account_blob_url, + account_url, credential=DefaultAzureCredential(), ) @@ -107,7 +107,7 @@ def _write_log(self, log: dict[str, Any]): self.__init__( self._connection_string, self._container_name, - storage_account_blob_url=self._storage_account_blob_url, + account_url=self.account_url, ) blob_client = self._blob_service_client.get_blob_client( diff --git a/packages/graphrag/graphrag/logger/factory.py b/packages/graphrag/graphrag/logger/factory.py new file mode 100644 index 0000000000..7b5d28ef5e --- /dev/null +++ b/packages/graphrag/graphrag/logger/factory.py @@ -0,0 +1,64 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Factory functions for creating a logger.""" + +from __future__ import annotations + +import logging +from pathlib import Path + +from graphrag_common.factory import Factory + +from graphrag.config.enums import ReportingType + +LOG_FORMAT = "%(asctime)s.%(msecs)04d - %(levelname)s - %(name)s - %(message)s" +DATE_FORMAT = "%Y-%m-%d %H:%M:%S" + + +class LoggerFactory(Factory[logging.Handler]): + """A factory class for logger implementations. + + Includes a method for users to register a custom logger implementation. + + Configuration arguments are passed to each logger implementation as kwargs + for individual enforcement of required/optional arguments. + + Note that because we rely on the built-in Python logging architecture, this factory does not return an instance, + it merely configures the logger to your specified storage location. + """ + + +# --- register built-in logger implementations --- +def create_file_logger(**kwargs) -> logging.Handler: + """Create a file-based logger.""" + base_dir = kwargs["base_dir"] + filename = kwargs["filename"] + log_dir = Path(base_dir) + log_dir.mkdir(parents=True, exist_ok=True) + log_file_path = log_dir / filename + + handler = logging.FileHandler(str(log_file_path), mode="a") + + formatter = logging.Formatter(fmt=LOG_FORMAT, datefmt=DATE_FORMAT) + handler.setFormatter(formatter) + + return handler + + +def create_blob_logger(**kwargs) -> logging.Handler: + """Create a blob storage-based logger.""" + from graphrag.logger.blob_workflow_logger import BlobWorkflowLogger + + return BlobWorkflowLogger( + connection_string=kwargs["connection_string"], + container_name=kwargs["container_name"], + base_dir=kwargs["base_dir"], + account_url=kwargs["account_url"], + ) + + +# --- register built-in implementations --- +logger_factory = LoggerFactory() +logger_factory.register(ReportingType.file.value, create_file_logger) +logger_factory.register(ReportingType.blob.value, create_blob_logger) diff --git a/graphrag/logger/progress.py b/packages/graphrag/graphrag/logger/progress.py similarity index 100% rename from graphrag/logger/progress.py rename to packages/graphrag/graphrag/logger/progress.py diff --git a/graphrag/logger/standard_logging.py b/packages/graphrag/graphrag/logger/standard_logging.py similarity index 76% rename from graphrag/logger/standard_logging.py rename to packages/graphrag/graphrag/logger/standard_logging.py index fea504c02f..de62f5e031 100644 --- a/graphrag/logger/standard_logging.py +++ b/packages/graphrag/graphrag/logger/standard_logging.py @@ -67,17 +67,25 @@ def init_loggers( log_level = logging.DEBUG if verbose else logging.INFO logger.setLevel(log_level) - # clear any existing handlers to avoid duplicate logs - if logger.hasHandlers(): - # Close file handlers properly before removing them - for handler in logger.handlers: - if isinstance(handler, logging.FileHandler): - handler.close() - logger.handlers.clear() + llm_logger = logging.getLogger("graphrag_llm") + llm_logger.setLevel(log_level) + + def _clear_handlers(logger: logging.Logger) -> None: + # clear any existing handlers to avoid duplicate logs + if logger.hasHandlers(): + # Close file handlers properly before removing them + for handler in logger.handlers: + if isinstance(handler, logging.FileHandler): + handler.close() + logger.handlers.clear() + + _clear_handlers(logger) + _clear_handlers(llm_logger) reporting_config = config.reporting config_dict = reporting_config.model_dump() - args = {**config_dict, "root_dir": config.root_dir, "filename": filename} + args = {**config_dict, "filename": filename} - handler = LoggerFactory.create_logger(reporting_config.type, args) + handler = LoggerFactory().create(reporting_config.type, args) logger.addHandler(handler) + llm_logger.addHandler(handler) diff --git a/graphrag/prompt_tune/__init__.py b/packages/graphrag/graphrag/prompt_tune/__init__.py similarity index 100% rename from graphrag/prompt_tune/__init__.py rename to packages/graphrag/graphrag/prompt_tune/__init__.py diff --git a/graphrag/prompt_tune/defaults.py b/packages/graphrag/graphrag/prompt_tune/defaults.py similarity index 91% rename from graphrag/prompt_tune/defaults.py rename to packages/graphrag/graphrag/prompt_tune/defaults.py index 6fb84f170a..2095b5c8ac 100644 --- a/graphrag/prompt_tune/defaults.py +++ b/packages/graphrag/graphrag/prompt_tune/defaults.py @@ -17,4 +17,4 @@ MIN_CHUNK_SIZE = 200 N_SUBSET_MAX = 300 MIN_CHUNK_OVERLAP = 0 -PROMPT_TUNING_MODEL_ID = "default_chat_model" +PROMPT_TUNING_MODEL_ID = "default_completion_model" diff --git a/graphrag/prompt_tune/generator/__init__.py b/packages/graphrag/graphrag/prompt_tune/generator/__init__.py similarity index 100% rename from graphrag/prompt_tune/generator/__init__.py rename to packages/graphrag/graphrag/prompt_tune/generator/__init__.py diff --git a/graphrag/prompt_tune/generator/community_report_rating.py b/packages/graphrag/graphrag/prompt_tune/generator/community_report_rating.py similarity index 66% rename from graphrag/prompt_tune/generator/community_report_rating.py rename to packages/graphrag/graphrag/prompt_tune/generator/community_report_rating.py index 22cf73105f..a4cae4c75f 100644 --- a/graphrag/prompt_tune/generator/community_report_rating.py +++ b/packages/graphrag/graphrag/prompt_tune/generator/community_report_rating.py @@ -2,21 +2,25 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License +from typing import TYPE_CHECKING -from graphrag.language_model.protocol.base import ChatModel from graphrag.prompt_tune.prompt.community_report_rating import ( GENERATE_REPORT_RATING_PROMPT, ) +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + async def generate_community_report_rating( - model: ChatModel, domain: str, persona: str, docs: str | list[str] + model: "LLMCompletion", domain: str, persona: str, docs: str | list[str] ) -> str: """Generate an LLM persona to use for GraphRAG prompts. Parameters ---------- - - llm (CompletionLLM): The LLM to use for generation + - model (LLMCompletion): The LLM to use for generation - domain (str): The domain to generate a rating for - persona (str): The persona to generate a rating for for - docs (str | list[str]): Documents used to contextualize the rating @@ -30,6 +34,8 @@ async def generate_community_report_rating( domain=domain, persona=persona, input_text=docs_str ) - response = await model.achat(domain_prompt) + response: LLMCompletionResponse = await model.completion_async( + messages=domain_prompt + ) # type: ignore - return str(response.output.content).strip() + return response.content diff --git a/graphrag/prompt_tune/generator/community_report_summarization.py b/packages/graphrag/graphrag/prompt_tune/generator/community_report_summarization.py similarity index 100% rename from graphrag/prompt_tune/generator/community_report_summarization.py rename to packages/graphrag/graphrag/prompt_tune/generator/community_report_summarization.py diff --git a/graphrag/prompt_tune/generator/community_reporter_role.py b/packages/graphrag/graphrag/prompt_tune/generator/community_reporter_role.py similarity index 66% rename from graphrag/prompt_tune/generator/community_reporter_role.py rename to packages/graphrag/graphrag/prompt_tune/generator/community_reporter_role.py index d3c90d181e..b38d678b06 100644 --- a/graphrag/prompt_tune/generator/community_reporter_role.py +++ b/packages/graphrag/graphrag/prompt_tune/generator/community_reporter_role.py @@ -3,20 +3,25 @@ """Generate a community reporter role for community summarization.""" -from graphrag.language_model.protocol.base import ChatModel +from typing import TYPE_CHECKING + from graphrag.prompt_tune.prompt.community_reporter_role import ( GENERATE_COMMUNITY_REPORTER_ROLE_PROMPT, ) +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + async def generate_community_reporter_role( - model: ChatModel, domain: str, persona: str, docs: str | list[str] + model: "LLMCompletion", domain: str, persona: str, docs: str | list[str] ) -> str: """Generate an LLM persona to use for GraphRAG prompts. Parameters ---------- - - llm (CompletionLLM): The LLM to use for generation + - model (LLMCompletion): The LLM to use for generation - domain (str): The domain to generate a persona for - persona (str): The persona to generate a role for - docs (str | list[str]): The domain to generate a persona for @@ -30,6 +35,8 @@ async def generate_community_reporter_role( domain=domain, persona=persona, input_text=docs_str ) - response = await model.achat(domain_prompt) + response: LLMCompletionResponse = await model.completion_async( + messages=domain_prompt + ) # type: ignore - return str(response.output.content) + return response.content diff --git a/graphrag/prompt_tune/generator/domain.py b/packages/graphrag/graphrag/prompt_tune/generator/domain.py similarity index 55% rename from graphrag/prompt_tune/generator/domain.py rename to packages/graphrag/graphrag/prompt_tune/generator/domain.py index 7838594ccc..1135d67d9f 100644 --- a/graphrag/prompt_tune/generator/domain.py +++ b/packages/graphrag/graphrag/prompt_tune/generator/domain.py @@ -3,16 +3,21 @@ """Domain generation for GraphRAG prompts.""" -from graphrag.language_model.protocol.base import ChatModel +from typing import TYPE_CHECKING + from graphrag.prompt_tune.prompt.domain import GENERATE_DOMAIN_PROMPT +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + -async def generate_domain(model: ChatModel, docs: str | list[str]) -> str: +async def generate_domain(model: "LLMCompletion", docs: str | list[str]) -> str: """Generate an LLM persona to use for GraphRAG prompts. Parameters ---------- - - llm (CompletionLLM): The LLM to use for generation + - model (LLMCompletion): The LLM to use for generation - docs (str | list[str]): The domain to generate a persona for Returns @@ -22,6 +27,8 @@ async def generate_domain(model: ChatModel, docs: str | list[str]) -> str: docs_str = " ".join(docs) if isinstance(docs, list) else docs domain_prompt = GENERATE_DOMAIN_PROMPT.format(input_text=docs_str) - response = await model.achat(domain_prompt) + response: LLMCompletionResponse = await model.completion_async( + messages=domain_prompt + ) # type: ignore - return str(response.output.content) + return response.content diff --git a/graphrag/prompt_tune/generator/entity_relationship.py b/packages/graphrag/graphrag/prompt_tune/generator/entity_relationship.py similarity index 70% rename from graphrag/prompt_tune/generator/entity_relationship.py rename to packages/graphrag/graphrag/prompt_tune/generator/entity_relationship.py index 70225cbb02..9282366e45 100644 --- a/graphrag/prompt_tune/generator/entity_relationship.py +++ b/packages/graphrag/graphrag/prompt_tune/generator/entity_relationship.py @@ -4,19 +4,27 @@ """Entity relationship example generation module.""" import asyncio +from typing import TYPE_CHECKING + +from graphrag_llm.utils import ( + CompletionMessagesBuilder, +) -from graphrag.language_model.protocol.base import ChatModel from graphrag.prompt_tune.prompt.entity_relationship import ( ENTITY_RELATIONSHIPS_GENERATION_JSON_PROMPT, ENTITY_RELATIONSHIPS_GENERATION_PROMPT, UNTYPED_ENTITY_RELATIONSHIPS_GENERATION_PROMPT, ) +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + MAX_EXAMPLES = 5 async def generate_entity_relationship_examples( - model: ChatModel, + model: "LLMCompletion", persona: str, entity_types: str | list[str] | None, docs: str | list[str], @@ -29,7 +37,8 @@ async def generate_entity_relationship_examples( on the json_mode parameter. """ docs_list = [docs] if isinstance(docs, str) else docs - history = [{"content": persona, "role": "system"}] + + msg_builder = CompletionMessagesBuilder().add_system_message(persona) if entity_types: entity_types_str = ( @@ -57,9 +66,13 @@ async def generate_entity_relationship_examples( messages = messages[:MAX_EXAMPLES] tasks = [ - model.achat(message, history=history, json=json_mode) for message in messages + model.completion_async( + messages=msg_builder.add_user_message(message).build(), + response_format_json_object=json_mode, + ) + for message in messages ] - responses = await asyncio.gather(*tasks) + responses: list[LLMCompletionResponse] = await asyncio.gather(*tasks) # type: ignore - return [str(response.output.content) for response in responses] + return [response.content for response in responses] diff --git a/graphrag/prompt_tune/generator/entity_summarization_prompt.py b/packages/graphrag/graphrag/prompt_tune/generator/entity_summarization_prompt.py similarity index 100% rename from graphrag/prompt_tune/generator/entity_summarization_prompt.py rename to packages/graphrag/graphrag/prompt_tune/generator/entity_summarization_prompt.py diff --git a/graphrag/prompt_tune/generator/entity_types.py b/packages/graphrag/graphrag/prompt_tune/generator/entity_types.py similarity index 59% rename from graphrag/prompt_tune/generator/entity_types.py rename to packages/graphrag/graphrag/prompt_tune/generator/entity_types.py index d68ab52115..21c58086e7 100644 --- a/graphrag/prompt_tune/generator/entity_types.py +++ b/packages/graphrag/graphrag/prompt_tune/generator/entity_types.py @@ -3,15 +3,23 @@ """Entity type generation module for fine-tuning.""" +from typing import TYPE_CHECKING + +from graphrag_llm.utils import ( + CompletionMessagesBuilder, +) from pydantic import BaseModel -from graphrag.language_model.protocol.base import ChatModel from graphrag.prompt_tune.defaults import DEFAULT_TASK from graphrag.prompt_tune.prompt.entity_types import ( ENTITY_TYPE_GENERATION_JSON_PROMPT, ENTITY_TYPE_GENERATION_PROMPT, ) +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + class EntityTypesResponse(BaseModel): """Entity types response model.""" @@ -20,7 +28,7 @@ class EntityTypesResponse(BaseModel): async def generate_entity_types( - model: ChatModel, + model: "LLMCompletion", domain: str, persona: str, docs: str | list[str], @@ -43,17 +51,24 @@ async def generate_entity_types( else ENTITY_TYPE_GENERATION_PROMPT ).format(task=formatted_task, input_text=docs_str) - history = [{"role": "system", "content": persona}] + messages = ( + CompletionMessagesBuilder() + .add_system_message(persona) + .add_user_message(entity_types_prompt) + .build() + ) if json_mode: - response = await model.achat( - entity_types_prompt, - history=history, - json=json_mode, - json_model=EntityTypesResponse, - ) - parsed_model = response.parsed_response + response: LLMCompletionResponse[ + EntityTypesResponse + ] = await model.completion_async( + messages=messages, + response_format=EntityTypesResponse, + ) # type: ignore + parsed_model = response.formatted_response return parsed_model.entity_types if parsed_model else [] - response = await model.achat(entity_types_prompt, history=history, json=json_mode) - return str(response.output.content) + non_json_response: LLMCompletionResponse = await model.completion_async( + messages=messages + ) # type: ignore + return non_json_response.content diff --git a/graphrag/prompt_tune/generator/extract_graph_prompt.py b/packages/graphrag/graphrag/prompt_tune/generator/extract_graph_prompt.py similarity index 98% rename from graphrag/prompt_tune/generator/extract_graph_prompt.py rename to packages/graphrag/graphrag/prompt_tune/generator/extract_graph_prompt.py index db0f87cf97..46707c45bf 100644 --- a/graphrag/prompt_tune/generator/extract_graph_prompt.py +++ b/packages/graphrag/graphrag/prompt_tune/generator/extract_graph_prompt.py @@ -5,6 +5,8 @@ from pathlib import Path +from graphrag_llm.tokenizer import Tokenizer + from graphrag.prompt_tune.template.extract_graph import ( EXAMPLE_EXTRACTION_TEMPLATE, GRAPH_EXTRACTION_JSON_PROMPT, @@ -13,7 +15,6 @@ UNTYPED_GRAPH_EXTRACTION_PROMPT, ) from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer EXTRACT_GRAPH_FILENAME = "extract_graph.txt" diff --git a/graphrag/prompt_tune/generator/language.py b/packages/graphrag/graphrag/prompt_tune/generator/language.py similarity index 55% rename from graphrag/prompt_tune/generator/language.py rename to packages/graphrag/graphrag/prompt_tune/generator/language.py index 5c00fd6b5a..029f31180b 100644 --- a/graphrag/prompt_tune/generator/language.py +++ b/packages/graphrag/graphrag/prompt_tune/generator/language.py @@ -3,16 +3,21 @@ """Language detection for GraphRAG prompts.""" -from graphrag.language_model.protocol.base import ChatModel +from typing import TYPE_CHECKING + from graphrag.prompt_tune.prompt.language import DETECT_LANGUAGE_PROMPT +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + -async def detect_language(model: ChatModel, docs: str | list[str]) -> str: +async def detect_language(model: "LLMCompletion", docs: str | list[str]) -> str: """Detect input language to use for GraphRAG prompts. Parameters ---------- - - llm (CompletionLLM): The LLM to use for generation + - model (LLMCompletion): The LLM to use for generation - docs (str | list[str]): The docs to detect language from Returns @@ -22,6 +27,8 @@ async def detect_language(model: ChatModel, docs: str | list[str]) -> str: docs_str = " ".join(docs) if isinstance(docs, list) else docs language_prompt = DETECT_LANGUAGE_PROMPT.format(input_text=docs_str) - response = await model.achat(language_prompt) + response: LLMCompletionResponse = await model.completion_async( + messages=language_prompt + ) # type: ignore - return str(response.output.content) + return response.content diff --git a/graphrag/prompt_tune/generator/persona.py b/packages/graphrag/graphrag/prompt_tune/generator/persona.py similarity index 60% rename from graphrag/prompt_tune/generator/persona.py rename to packages/graphrag/graphrag/prompt_tune/generator/persona.py index b9bf485d8d..b6fdc18ff2 100644 --- a/graphrag/prompt_tune/generator/persona.py +++ b/packages/graphrag/graphrag/prompt_tune/generator/persona.py @@ -3,25 +3,32 @@ """Persona generating module for fine-tuning GraphRAG prompts.""" -from graphrag.language_model.protocol.base import ChatModel +from typing import TYPE_CHECKING + from graphrag.prompt_tune.defaults import DEFAULT_TASK from graphrag.prompt_tune.prompt.persona import GENERATE_PERSONA_PROMPT +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionResponse + async def generate_persona( - model: ChatModel, domain: str, task: str = DEFAULT_TASK + model: "LLMCompletion", domain: str, task: str = DEFAULT_TASK ) -> str: """Generate an LLM persona to use for GraphRAG prompts. Parameters ---------- - - llm (CompletionLLM): The LLM to use for generation + - model (LLMCompletion): The LLM to use for generation - domain (str): The domain to generate a persona for - task (str): The task to generate a persona for. Default is DEFAULT_TASK """ formatted_task = task.format(domain=domain) persona_prompt = GENERATE_PERSONA_PROMPT.format(sample_task=formatted_task) - response = await model.achat(persona_prompt) + response: LLMCompletionResponse = await model.completion_async( + messages=persona_prompt + ) # type: ignore - return str(response.output.content) + return response.content diff --git a/graphrag/prompt_tune/loader/__init__.py b/packages/graphrag/graphrag/prompt_tune/loader/__init__.py similarity index 100% rename from graphrag/prompt_tune/loader/__init__.py rename to packages/graphrag/graphrag/prompt_tune/loader/__init__.py diff --git a/graphrag/prompt_tune/loader/input.py b/packages/graphrag/graphrag/prompt_tune/loader/input.py similarity index 65% rename from graphrag/prompt_tune/loader/input.py rename to packages/graphrag/graphrag/prompt_tune/loader/input.py index 29010b05a8..0cfdb2299a 100644 --- a/graphrag/prompt_tune/loader/input.py +++ b/packages/graphrag/graphrag/prompt_tune/loader/input.py @@ -4,16 +4,19 @@ """Input loading module.""" import logging +from typing import Any import numpy as np import pandas as pd +from graphrag_chunking.chunker_factory import create_chunker +from graphrag_input import create_input_reader +from graphrag_llm.embedding import create_embedding +from graphrag_storage import create_storage -from graphrag.cache.noop_pipeline_cache import NoopPipelineCache from graphrag.callbacks.noop_workflow_callbacks import NoopWorkflowCallbacks from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.index.input.factory import create_input -from graphrag.index.operations.embed_text.strategies.openai import ( - run as run_embed_text, +from graphrag.index.operations.embed_text.run_embed_text import ( + run_embed_text, ) from graphrag.index.workflows.create_base_text_units import create_base_text_units from graphrag.prompt_tune.defaults import ( @@ -22,12 +25,11 @@ K, ) from graphrag.prompt_tune.types import DocSelectionType -from graphrag.utils.api import create_storage_from_config def _sample_chunks_from_embeddings( text_chunks: pd.DataFrame, - embeddings: np.ndarray[float, np.dtype[np.float_]], + embeddings: np.ndarray[Any, np.dtype[np.float64]], k: int = K, ) -> pd.DataFrame: """Sample text chunks from embeddings.""" @@ -43,28 +45,24 @@ async def load_docs_in_chunks( select_method: DocSelectionType, limit: int, logger: logging.Logger, - chunk_size: int, - overlap: int, n_subset_max: int = N_SUBSET_MAX, k: int = K, ) -> list[str]: """Load docs into chunks for generating prompts.""" - embeddings_llm_settings = config.get_language_model_config( - config.embed_text.model_id + embeddings_llm_settings = config.get_embedding_model_config( + config.embed_text.embedding_model_id ) - input_storage = create_storage_from_config(config.input.storage) - dataset = await create_input(config.input, input_storage) - chunk_config = config.chunks + model = create_embedding(embeddings_llm_settings) + tokenizer = model.tokenizer + chunker = create_chunker(config.chunking, tokenizer.encode, tokenizer.decode) + input_storage = create_storage(config.input_storage) + input_reader = create_input_reader(config.input, input_storage) + dataset = await input_reader.read_files() chunks_df = create_base_text_units( - documents=dataset, + documents=pd.DataFrame(dataset), callbacks=NoopWorkflowCallbacks(), - group_by_columns=chunk_config.group_by_columns, - size=chunk_size, - overlap=overlap, - encoding_model=chunk_config.encoding_model, - strategy=chunk_config.strategy, - prepend_metadata=chunk_config.prepend_metadata, - chunk_size_includes_metadata=chunk_config.chunk_size_includes_metadata, + tokenizer=tokenizer, + chunker=chunker, ) # Depending on the select method, build the dataset @@ -89,13 +87,11 @@ async def load_docs_in_chunks( embedding_results = await run_embed_text( sampled_text_chunks, callbacks=NoopWorkflowCallbacks(), - cache=NoopPipelineCache(), - args={ - "llm": embeddings_llm_settings.model_dump(), - "num_threads": embeddings_llm_settings.concurrent_requests, - "batch_size": config.embed_text.batch_size, - "batch_max_tokens": config.embed_text.batch_max_tokens, - }, + model=model, + tokenizer=tokenizer, + batch_size=config.embed_text.batch_size, + batch_max_tokens=config.embed_text.batch_max_tokens, + num_threads=config.concurrent_requests, ) embeddings = np.array(embedding_results.embeddings) chunks_df = _sample_chunks_from_embeddings(chunks_df, embeddings, k=k) diff --git a/graphrag/prompt_tune/prompt/__init__.py b/packages/graphrag/graphrag/prompt_tune/prompt/__init__.py similarity index 100% rename from graphrag/prompt_tune/prompt/__init__.py rename to packages/graphrag/graphrag/prompt_tune/prompt/__init__.py diff --git a/graphrag/prompt_tune/prompt/community_report_rating.py b/packages/graphrag/graphrag/prompt_tune/prompt/community_report_rating.py similarity index 100% rename from graphrag/prompt_tune/prompt/community_report_rating.py rename to packages/graphrag/graphrag/prompt_tune/prompt/community_report_rating.py diff --git a/graphrag/prompt_tune/prompt/community_reporter_role.py b/packages/graphrag/graphrag/prompt_tune/prompt/community_reporter_role.py similarity index 100% rename from graphrag/prompt_tune/prompt/community_reporter_role.py rename to packages/graphrag/graphrag/prompt_tune/prompt/community_reporter_role.py diff --git a/graphrag/prompt_tune/prompt/domain.py b/packages/graphrag/graphrag/prompt_tune/prompt/domain.py similarity index 100% rename from graphrag/prompt_tune/prompt/domain.py rename to packages/graphrag/graphrag/prompt_tune/prompt/domain.py diff --git a/graphrag/prompt_tune/prompt/entity_relationship.py b/packages/graphrag/graphrag/prompt_tune/prompt/entity_relationship.py similarity index 57% rename from graphrag/prompt_tune/prompt/entity_relationship.py rename to packages/graphrag/graphrag/prompt_tune/prompt/entity_relationship.py index 66eefa9947..ec7dca55a4 100644 --- a/graphrag/prompt_tune/prompt/entity_relationship.py +++ b/packages/graphrag/graphrag/prompt_tune/prompt/entity_relationship.py @@ -12,7 +12,7 @@ - entity_name: Name of the entity, capitalized - entity_type: One of the following types: [{entity_types}] - entity_description: Comprehensive description of the entity's attributes and activities -Format each entity as ("entity"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +Format each entity as ("entity"<|><|><|>) 2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. For each pair of related entities, extract the following information: @@ -20,13 +20,13 @@ - target_entity: name of the target entity, as identified in step 1 - relationship_description: explanation as to why you think the source entity and the target entity are related to each other - relationship_strength: an integer score between 1 to 10, indicating strength of the relationship between the source entity and target entity -Format each relationship as ("relationship"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +Format each relationship as ("relationship"<|><|><|><|>) -3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use {{record_delimiter}} as the list delimiter. +3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use ## as the list delimiter. 4. If you have to translate into {language}, just translate the descriptions, nothing else! -5. When finished, output {{completion_delimiter}}. +5. When finished, output <|COMPLETE|>. ###################### -Examples- @@ -37,14 +37,14 @@ The Verdantis's Central Institution is scheduled to meet on Monday and Thursday, with the institution planning to release its latest policy decision on Thursday at 1:30 p.m. PDT, followed by a press conference where Central Institution Chair Martin Smith will take questions. Investors expect the Market Strategy Committee to hold its benchmark interest rate steady in a range of 3.5%-3.75%. ###################### Output: -("entity"{{tuple_delimiter}}CENTRAL INSTITUTION{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}The Central Institution is the Federal Reserve of Verdantis, which is setting interest rates on Monday and Thursday) -{{record_delimiter}} -("entity"{{tuple_delimiter}}MARTIN SMITH{{tuple_delimiter}}PERSON{{tuple_delimiter}}Martin Smith is the chair of the Central Institution) -{{record_delimiter}} -("entity"{{tuple_delimiter}}MARKET STRATEGY COMMITTEE{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}The Central Institution committee makes key decisions about interest rates and the growth of Verdantis's money supply) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}MARTIN SMITH{{tuple_delimiter}}CENTRAL INSTITUTION{{tuple_delimiter}}Martin Smith is the Chair of the Central Institution and will answer questions at a press conference{{tuple_delimiter}}9) -{{completion_delimiter}} +("entity"<|>CENTRAL INSTITUTION<|>ORGANIZATION<|>The Central Institution is the Federal Reserve of Verdantis, which is setting interest rates on Monday and Thursday) +## +("entity"<|>MARTIN SMITH<|>PERSON<|>Martin Smith is the chair of the Central Institution) +## +("entity"<|>MARKET STRATEGY COMMITTEE<|>ORGANIZATION<|>The Central Institution committee makes key decisions about interest rates and the growth of Verdantis's money supply) +## +("relationship"<|>MARTIN SMITH<|>CENTRAL INSTITUTION<|>Martin Smith is the Chair of the Central Institution and will answer questions at a press conference<|>9) +<|COMPLETE|> ###################### Example 2: @@ -55,12 +55,12 @@ TechGlobal, a formerly public company, was taken private by Vision Holdings in 2014. The well-established chip designer says it powers 85% of premium smartphones. ###################### Output: -("entity"{{tuple_delimiter}}TECHGLOBAL{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}TechGlobal is a stock now listed on the Global Exchange which powers 85% of premium smartphones) -{{record_delimiter}} -("entity"{{tuple_delimiter}}VISION HOLDINGS{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}Vision Holdings is a firm that previously owned TechGlobal) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}TECHGLOBAL{{tuple_delimiter}}VISION HOLDINGS{{tuple_delimiter}}Vision Holdings formerly owned TechGlobal from 2014 until present{{tuple_delimiter}}5) -{{completion_delimiter}} +("entity"<|>TECHGLOBAL<|>ORGANIZATION<|>TechGlobal is a stock now listed on the Global Exchange which powers 85% of premium smartphones) +## +("entity"<|>VISION HOLDINGS<|>ORGANIZATION<|>Vision Holdings is a firm that previously owned TechGlobal) +## +("relationship"<|>TECHGLOBAL<|>VISION HOLDINGS<|>Vision Holdings formerly owned TechGlobal from 2014 until present<|>5) +<|COMPLETE|> ###################### Example 3: @@ -77,47 +77,47 @@ The Aurelians include 39-year-old businessman Samuel Namara, who has been held in Tiruzia's Alhamia Prison, as well as journalist Durke Bataglani, 59, and environmentalist Meggie Tazbah, 53, who also holds Bratinas nationality. ###################### Output: -("entity"{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}GEO{{tuple_delimiter}}Firuzabad held Aurelians as hostages) -{{record_delimiter}} -("entity"{{tuple_delimiter}}AURELIA{{tuple_delimiter}}GEO{{tuple_delimiter}}Country seeking to release hostages) -{{record_delimiter}} -("entity"{{tuple_delimiter}}QUINTARA{{tuple_delimiter}}GEO{{tuple_delimiter}}Country that negotiated a swap of money in exchange for hostages) -{{record_delimiter}} -{{record_delimiter}} -("entity"{{tuple_delimiter}}TIRUZIA{{tuple_delimiter}}GEO{{tuple_delimiter}}Capital of Firuzabad where the Aurelians were being held) -{{record_delimiter}} -("entity"{{tuple_delimiter}}KROHAARA{{tuple_delimiter}}GEO{{tuple_delimiter}}Capital city in Quintara) -{{record_delimiter}} -("entity"{{tuple_delimiter}}CASHION{{tuple_delimiter}}GEO{{tuple_delimiter}}Capital city in Aurelia) -{{record_delimiter}} -("entity"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}PERSON{{tuple_delimiter}}Aurelian who spent time in Tiruzia's Alhamia Prison) -{{record_delimiter}} -("entity"{{tuple_delimiter}}ALHAMIA PRISON{{tuple_delimiter}}GEO{{tuple_delimiter}}Prison in Tiruzia) -{{record_delimiter}} -("entity"{{tuple_delimiter}}DURKE BATAGLANI{{tuple_delimiter}}PERSON{{tuple_delimiter}}Aurelian journalist who was held hostage) -{{record_delimiter}} -("entity"{{tuple_delimiter}}MEGGIE TAZBAH{{tuple_delimiter}}PERSON{{tuple_delimiter}}Bratinas national and environmentalist who was held hostage) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}AURELIA{{tuple_delimiter}}Firuzabad negotiated a hostage exchange with Aurelia{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}QUINTARA{{tuple_delimiter}}AURELIA{{tuple_delimiter}}Quintara brokered the hostage exchange between Firuzabad and Aurelia{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}QUINTARA{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}Quintara brokered the hostage exchange between Firuzabad and Aurelia{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}ALHAMIA PRISON{{tuple_delimiter}}Samuel Namara was a prisoner at Alhamia prison{{tuple_delimiter}}8) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}MEGGIE TAZBAH{{tuple_delimiter}}Samuel Namara and Meggie Tazbah were exchanged in the same hostage release{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}DURKE BATAGLANI{{tuple_delimiter}}Samuel Namara and Durke Bataglani were exchanged in the same hostage release{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}MEGGIE TAZBAH{{tuple_delimiter}}DURKE BATAGLANI{{tuple_delimiter}}Meggie Tazbah and Durke Bataglani were exchanged in the same hostage release{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}Samuel Namara was a hostage in Firuzabad{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}MEGGIE TAZBAH{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}Meggie Tazbah was a hostage in Firuzabad{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}DURKE BATAGLANI{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}Durke Bataglani was a hostage in Firuzabad{{tuple_delimiter}}2) -{{completion_delimiter}} +("entity"<|>FIRUZABAD<|>GEO<|>Firuzabad held Aurelians as hostages) +## +("entity"<|>AURELIA<|>GEO<|>Country seeking to release hostages) +## +("entity"<|>QUINTARA<|>GEO<|>Country that negotiated a swap of money in exchange for hostages) +## +## +("entity"<|>TIRUZIA<|>GEO<|>Capital of Firuzabad where the Aurelians were being held) +## +("entity"<|>KROHAARA<|>GEO<|>Capital city in Quintara) +## +("entity"<|>CASHION<|>GEO<|>Capital city in Aurelia) +## +("entity"<|>SAMUEL NAMARA<|>PERSON<|>Aurelian who spent time in Tiruzia's Alhamia Prison) +## +("entity"<|>ALHAMIA PRISON<|>GEO<|>Prison in Tiruzia) +## +("entity"<|>DURKE BATAGLANI<|>PERSON<|>Aurelian journalist who was held hostage) +## +("entity"<|>MEGGIE TAZBAH<|>PERSON<|>Bratinas national and environmentalist who was held hostage) +## +("relationship"<|>FIRUZABAD<|>AURELIA<|>Firuzabad negotiated a hostage exchange with Aurelia<|>2) +## +("relationship"<|>QUINTARA<|>AURELIA<|>Quintara brokered the hostage exchange between Firuzabad and Aurelia<|>2) +## +("relationship"<|>QUINTARA<|>FIRUZABAD<|>Quintara brokered the hostage exchange between Firuzabad and Aurelia<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>ALHAMIA PRISON<|>Samuel Namara was a prisoner at Alhamia prison<|>8) +## +("relationship"<|>SAMUEL NAMARA<|>MEGGIE TAZBAH<|>Samuel Namara and Meggie Tazbah were exchanged in the same hostage release<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>DURKE BATAGLANI<|>Samuel Namara and Durke Bataglani were exchanged in the same hostage release<|>2) +## +("relationship"<|>MEGGIE TAZBAH<|>DURKE BATAGLANI<|>Meggie Tazbah and Durke Bataglani were exchanged in the same hostage release<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>FIRUZABAD<|>Samuel Namara was a hostage in Firuzabad<|>2) +## +("relationship"<|>MEGGIE TAZBAH<|>FIRUZABAD<|>Meggie Tazbah was a hostage in Firuzabad<|>2) +## +("relationship"<|>DURKE BATAGLANI<|>FIRUZABAD<|>Durke Bataglani was a hostage in Firuzabad<|>2) +<|COMPLETE|> -Real Data- ###################### @@ -242,7 +242,7 @@ - entity_name: Name of the entity, capitalized - entity_type: Suggest several labels or categories for the entity. The categories should not be specific, but should be as general as possible. - entity_description: Comprehensive description of the entity's attributes and activities -Format each entity as ("entity"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +Format each entity as ("entity"<|><|><|>) 2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. For each pair of related entities, extract the following information: @@ -250,13 +250,13 @@ - target_entity: name of the target entity, as identified in step 1 - relationship_description: explanation as to why you think the source entity and the target entity are related to each other - relationship_strength: a numeric score indicating strength of the relationship between the source entity and target entity -Format each relationship as ("relationship"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +Format each relationship as ("relationship"<|><|><|><|>) -3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use **{{record_delimiter}}** as the list delimiter. +3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use **##** as the list delimiter. 4. If you have to translate into {language}, just translate the descriptions, nothing else! -5. When finished, output {{completion_delimiter}}. +5. When finished, output <|COMPLETE|>. ###################### -Examples- @@ -266,14 +266,14 @@ The Verdantis's Central Institution is scheduled to meet on Monday and Thursday, with the institution planning to release its latest policy decision on Thursday at 1:30 p.m. PDT, followed by a press conference where Central Institution Chair Martin Smith will take questions. Investors expect the Market Strategy Committee to hold its benchmark interest rate steady in a range of 3.5%-3.75%. ###################### Output: -("entity"{{tuple_delimiter}}CENTRAL INSTITUTION{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}The Central Institution is the Federal Reserve of Verdantis, which is setting interest rates on Monday and Thursday) -{{record_delimiter}} -("entity"{{tuple_delimiter}}MARTIN SMITH{{tuple_delimiter}}PERSON{{tuple_delimiter}}Martin Smith is the chair of the Central Institution) -{{record_delimiter}} -("entity"{{tuple_delimiter}}MARKET STRATEGY COMMITTEE{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}The Central Institution committee makes key decisions about interest rates and the growth of Verdantis's money supply) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}MARTIN SMITH{{tuple_delimiter}}CENTRAL INSTITUTION{{tuple_delimiter}}Martin Smith is the Chair of the Central Institution and will answer questions at a press conference{{tuple_delimiter}}9) -{{completion_delimiter}} +("entity"<|>CENTRAL INSTITUTION<|>ORGANIZATION<|>The Central Institution is the Federal Reserve of Verdantis, which is setting interest rates on Monday and Thursday) +## +("entity"<|>MARTIN SMITH<|>PERSON<|>Martin Smith is the chair of the Central Institution) +## +("entity"<|>MARKET STRATEGY COMMITTEE<|>ORGANIZATION<|>The Central Institution committee makes key decisions about interest rates and the growth of Verdantis's money supply) +## +("relationship"<|>MARTIN SMITH<|>CENTRAL INSTITUTION<|>Martin Smith is the Chair of the Central Institution and will answer questions at a press conference<|>9) +<|COMPLETE|> ###################### Example 2: @@ -283,12 +283,12 @@ TechGlobal, a formerly public company, was taken private by Vision Holdings in 2014. The well-established chip designer says it powers 85% of premium smartphones. ###################### Output: -("entity"{{tuple_delimiter}}TECHGLOBAL{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}TechGlobal is a stock now listed on the Global Exchange which powers 85% of premium smartphones) -{{record_delimiter}} -("entity"{{tuple_delimiter}}VISION HOLDINGS{{tuple_delimiter}}ORGANIZATION{{tuple_delimiter}}Vision Holdings is a firm that previously owned TechGlobal) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}TECHGLOBAL{{tuple_delimiter}}VISION HOLDINGS{{tuple_delimiter}}Vision Holdings formerly owned TechGlobal from 2014 until present{{tuple_delimiter}}5) -{{completion_delimiter}} +("entity"<|>TECHGLOBAL<|>ORGANIZATION<|>TechGlobal is a stock now listed on the Global Exchange which powers 85% of premium smartphones) +## +("entity"<|>VISION HOLDINGS<|>ORGANIZATION<|>Vision Holdings is a firm that previously owned TechGlobal) +## +("relationship"<|>TECHGLOBAL<|>VISION HOLDINGS<|>Vision Holdings formerly owned TechGlobal from 2014 until present<|>5) +<|COMPLETE|> ###################### Example 3: @@ -304,47 +304,47 @@ The Aurelians include 39-year-old businessman Samuel Namara, who has been held in Tiruzia's Alhamia Prison, as well as journalist Durke Bataglani, 59, and environmentalist Meggie Tazbah, 53, who also holds Bratinas nationality. ###################### Output: -("entity"{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}GEO{{tuple_delimiter}}Firuzabad held Aurelians as hostages) -{{record_delimiter}} -("entity"{{tuple_delimiter}}AURELIA{{tuple_delimiter}}GEO{{tuple_delimiter}}Country seeking to release hostages) -{{record_delimiter}} -("entity"{{tuple_delimiter}}QUINTARA{{tuple_delimiter}}GEO{{tuple_delimiter}}Country that negotiated a swap of money in exchange for hostages) -{{record_delimiter}} -{{record_delimiter}} -("entity"{{tuple_delimiter}}TIRUZIA{{tuple_delimiter}}GEO{{tuple_delimiter}}Capital of Firuzabad where the Aurelians were being held) -{{record_delimiter}} -("entity"{{tuple_delimiter}}KROHAARA{{tuple_delimiter}}GEO{{tuple_delimiter}}Capital city in Quintara) -{{record_delimiter}} -("entity"{{tuple_delimiter}}CASHION{{tuple_delimiter}}GEO{{tuple_delimiter}}Capital city in Aurelia) -{{record_delimiter}} -("entity"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}PERSON{{tuple_delimiter}}Aurelian who spent time in Tiruzia's Alhamia Prison) -{{record_delimiter}} -("entity"{{tuple_delimiter}}ALHAMIA PRISON{{tuple_delimiter}}GEO{{tuple_delimiter}}Prison in Tiruzia) -{{record_delimiter}} -("entity"{{tuple_delimiter}}DURKE BATAGLANI{{tuple_delimiter}}PERSON{{tuple_delimiter}}Aurelian journalist who was held hostage) -{{record_delimiter}} -("entity"{{tuple_delimiter}}MEGGIE TAZBAH{{tuple_delimiter}}PERSON{{tuple_delimiter}}Bratinas national and environmentalist who was held hostage) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}AURELIA{{tuple_delimiter}}Firuzabad negotiated a hostage exchange with Aurelia{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}QUINTARA{{tuple_delimiter}}AURELIA{{tuple_delimiter}}Quintara brokered the hostage exchange between Firuzabad and Aurelia{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}QUINTARA{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}Quintara brokered the hostage exchange between Firuzabad and Aurelia{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}ALHAMIA PRISON{{tuple_delimiter}}Samuel Namara was a prisoner at Alhamia prison{{tuple_delimiter}}8) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}MEGGIE TAZBAH{{tuple_delimiter}}Samuel Namara and Meggie Tazbah were exchanged in the same hostage release{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}DURKE BATAGLANI{{tuple_delimiter}}Samuel Namara and Durke Bataglani were exchanged in the same hostage release{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}MEGGIE TAZBAH{{tuple_delimiter}}DURKE BATAGLANI{{tuple_delimiter}}Meggie Tazbah and Durke Bataglani were exchanged in the same hostage release{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}SAMUEL NAMARA{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}Samuel Namara was a hostage in Firuzabad{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}MEGGIE TAZBAH{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}Meggie Tazbah was a hostage in Firuzabad{{tuple_delimiter}}2) -{{record_delimiter}} -("relationship"{{tuple_delimiter}}DURKE BATAGLANI{{tuple_delimiter}}FIRUZABAD{{tuple_delimiter}}Durke Bataglani was a hostage in Firuzabad{{tuple_delimiter}}2) -{{completion_delimiter}} +("entity"<|>FIRUZABAD<|>GEO<|>Firuzabad held Aurelians as hostages) +## +("entity"<|>AURELIA<|>GEO<|>Country seeking to release hostages) +## +("entity"<|>QUINTARA<|>GEO<|>Country that negotiated a swap of money in exchange for hostages) +## +## +("entity"<|>TIRUZIA<|>GEO<|>Capital of Firuzabad where the Aurelians were being held) +## +("entity"<|>KROHAARA<|>GEO<|>Capital city in Quintara) +## +("entity"<|>CASHION<|>GEO<|>Capital city in Aurelia) +## +("entity"<|>SAMUEL NAMARA<|>PERSON<|>Aurelian who spent time in Tiruzia's Alhamia Prison) +## +("entity"<|>ALHAMIA PRISON<|>GEO<|>Prison in Tiruzia) +## +("entity"<|>DURKE BATAGLANI<|>PERSON<|>Aurelian journalist who was held hostage) +## +("entity"<|>MEGGIE TAZBAH<|>PERSON<|>Bratinas national and environmentalist who was held hostage) +## +("relationship"<|>FIRUZABAD<|>AURELIA<|>Firuzabad negotiated a hostage exchange with Aurelia<|>2) +## +("relationship"<|>QUINTARA<|>AURELIA<|>Quintara brokered the hostage exchange between Firuzabad and Aurelia<|>2) +## +("relationship"<|>QUINTARA<|>FIRUZABAD<|>Quintara brokered the hostage exchange between Firuzabad and Aurelia<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>ALHAMIA PRISON<|>Samuel Namara was a prisoner at Alhamia prison<|>8) +## +("relationship"<|>SAMUEL NAMARA<|>MEGGIE TAZBAH<|>Samuel Namara and Meggie Tazbah were exchanged in the same hostage release<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>DURKE BATAGLANI<|>Samuel Namara and Durke Bataglani were exchanged in the same hostage release<|>2) +## +("relationship"<|>MEGGIE TAZBAH<|>DURKE BATAGLANI<|>Meggie Tazbah and Durke Bataglani were exchanged in the same hostage release<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>FIRUZABAD<|>Samuel Namara was a hostage in Firuzabad<|>2) +## +("relationship"<|>MEGGIE TAZBAH<|>FIRUZABAD<|>Meggie Tazbah was a hostage in Firuzabad<|>2) +## +("relationship"<|>DURKE BATAGLANI<|>FIRUZABAD<|>Durke Bataglani was a hostage in Firuzabad<|>2) +<|COMPLETE|> ###################### -Real Data- diff --git a/graphrag/prompt_tune/prompt/entity_types.py b/packages/graphrag/graphrag/prompt_tune/prompt/entity_types.py similarity index 100% rename from graphrag/prompt_tune/prompt/entity_types.py rename to packages/graphrag/graphrag/prompt_tune/prompt/entity_types.py diff --git a/graphrag/prompt_tune/prompt/language.py b/packages/graphrag/graphrag/prompt_tune/prompt/language.py similarity index 100% rename from graphrag/prompt_tune/prompt/language.py rename to packages/graphrag/graphrag/prompt_tune/prompt/language.py diff --git a/graphrag/prompt_tune/prompt/persona.py b/packages/graphrag/graphrag/prompt_tune/prompt/persona.py similarity index 100% rename from graphrag/prompt_tune/prompt/persona.py rename to packages/graphrag/graphrag/prompt_tune/prompt/persona.py diff --git a/graphrag/prompt_tune/template/__init__.py b/packages/graphrag/graphrag/prompt_tune/template/__init__.py similarity index 100% rename from graphrag/prompt_tune/template/__init__.py rename to packages/graphrag/graphrag/prompt_tune/template/__init__.py diff --git a/graphrag/prompt_tune/template/community_report_summarization.py b/packages/graphrag/graphrag/prompt_tune/template/community_report_summarization.py similarity index 98% rename from graphrag/prompt_tune/template/community_report_summarization.py rename to packages/graphrag/graphrag/prompt_tune/template/community_report_summarization.py index b0d037ab6b..32888fb137 100644 --- a/graphrag/prompt_tune/template/community_report_summarization.py +++ b/packages/graphrag/graphrag/prompt_tune/template/community_report_summarization.py @@ -56,13 +56,13 @@ Entities -id,entity,description +human_readable_id,title,description 5,VERDANT OASIS PLAZA,Verdant Oasis Plaza is the location of the Unity March 6,HARMONY ASSEMBLY,Harmony Assembly is an organization that is holding a march at Verdant Oasis Plaza Relationships -id,source,target,description +human_readable_id,source,target,description 37,VERDANT OASIS PLAZA,UNITY MARCH,Verdant Oasis Plaza is the location of the Unity March 38,VERDANT OASIS PLAZA,HARMONY ASSEMBLY,Harmony Assembly is holding a march at Verdant Oasis Plaza 39,VERDANT OASIS PLAZA,UNITY MARCH,The Unity March is taking place at Verdant Oasis Plaza diff --git a/graphrag/prompt_tune/template/entity_summarization.py b/packages/graphrag/graphrag/prompt_tune/template/entity_summarization.py similarity index 100% rename from graphrag/prompt_tune/template/entity_summarization.py rename to packages/graphrag/graphrag/prompt_tune/template/entity_summarization.py diff --git a/graphrag/prompt_tune/template/extract_graph.py b/packages/graphrag/graphrag/prompt_tune/template/extract_graph.py similarity index 84% rename from graphrag/prompt_tune/template/extract_graph.py rename to packages/graphrag/graphrag/prompt_tune/template/extract_graph.py index 32d8756ec2..58a095cd0d 100644 --- a/graphrag/prompt_tune/template/extract_graph.py +++ b/packages/graphrag/graphrag/prompt_tune/template/extract_graph.py @@ -12,7 +12,7 @@ - entity_name: Name of the entity, capitalized - entity_type: One of the following types: [{entity_types}] - entity_description: Comprehensive description of the entity's attributes and activities -Format each entity as ("entity"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +Format each entity as ("entity"<|><|><|>) 2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. For each pair of related entities, extract the following information: @@ -20,13 +20,13 @@ - target_entity: name of the target entity, as identified in step 1 - relationship_description: explanation as to why you think the source entity and the target entity are related to each other - relationship_strength: an integer score between 1 to 10, indicating strength of the relationship between the source entity and target entity -Format each relationship as ("relationship"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +Format each relationship as ("relationship"<|><|><|><|>) -3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use **{{record_delimiter}}** as the list delimiter. +3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use **##** as the list delimiter. 4. If you have to translate into {language}, just translate the descriptions, nothing else! -5. When finished, output {{completion_delimiter}}. +5. When finished, output <|COMPLETE|>. -Examples- ###################### @@ -113,7 +113,7 @@ - entity_name: Name of the entity, capitalized - entity_type: Suggest several labels or categories for the entity. The categories should not be specific, but should be as general as possible. - entity_description: Comprehensive description of the entity's attributes and activities -Format each entity as ("entity"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +Format each entity as ("entity"<|><|><|>) 2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. For each pair of related entities, extract the following information: @@ -121,13 +121,13 @@ - target_entity: name of the target entity, as identified in step 1 - relationship_description: explanation as to why you think the source entity and the target entity are related to each other - relationship_strength: a numeric score indicating strength of the relationship between the source entity and target entity -Format each relationship as ("relationship"{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}{{tuple_delimiter}}) +Format each relationship as ("relationship"<|><|><|><|>) -3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use **{{record_delimiter}}** as the list delimiter. +3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use **##** as the list delimiter. 4. If you have to translate into {language}, just translate the descriptions, nothing else! -5. When finished, output {{completion_delimiter}}. +5. When finished, output <|COMPLETE|>. -Examples- ###################### diff --git a/graphrag/prompt_tune/types.py b/packages/graphrag/graphrag/prompt_tune/types.py similarity index 100% rename from graphrag/prompt_tune/types.py rename to packages/graphrag/graphrag/prompt_tune/types.py diff --git a/graphrag/prompts/__init__.py b/packages/graphrag/graphrag/prompts/__init__.py similarity index 100% rename from graphrag/prompts/__init__.py rename to packages/graphrag/graphrag/prompts/__init__.py diff --git a/graphrag/prompts/index/__init__.py b/packages/graphrag/graphrag/prompts/index/__init__.py similarity index 100% rename from graphrag/prompts/index/__init__.py rename to packages/graphrag/graphrag/prompts/index/__init__.py diff --git a/graphrag/prompts/index/community_report.py b/packages/graphrag/graphrag/prompts/index/community_report.py similarity index 99% rename from graphrag/prompts/index/community_report.py rename to packages/graphrag/graphrag/prompts/index/community_report.py index c3a7702ba0..b1f0f8abe2 100644 --- a/graphrag/prompts/index/community_report.py +++ b/packages/graphrag/graphrag/prompts/index/community_report.py @@ -59,13 +59,13 @@ Entities -id,entity,description +human_readable_id,title,description 5,VERDANT OASIS PLAZA,Verdant Oasis Plaza is the location of the Unity March 6,HARMONY ASSEMBLY,Harmony Assembly is an organization that is holding a march at Verdant Oasis Plaza Relationships -id,source,target,description +human_readable_id,source,target,description 37,VERDANT OASIS PLAZA,UNITY MARCH,Verdant Oasis Plaza is the location of the Unity March 38,VERDANT OASIS PLAZA,HARMONY ASSEMBLY,Harmony Assembly is holding a march at Verdant Oasis Plaza 39,VERDANT OASIS PLAZA,UNITY MARCH,The Unity March is taking place at Verdant Oasis Plaza diff --git a/graphrag/prompts/index/community_report_text_units.py b/packages/graphrag/graphrag/prompts/index/community_report_text_units.py similarity index 100% rename from graphrag/prompts/index/community_report_text_units.py rename to packages/graphrag/graphrag/prompts/index/community_report_text_units.py diff --git a/graphrag/prompts/index/extract_claims.py b/packages/graphrag/graphrag/prompts/index/extract_claims.py similarity index 64% rename from graphrag/prompts/index/extract_claims.py rename to packages/graphrag/graphrag/prompts/index/extract_claims.py index 5e0e5570c6..59b19c9061 100644 --- a/graphrag/prompts/index/extract_claims.py +++ b/packages/graphrag/graphrag/prompts/index/extract_claims.py @@ -22,11 +22,11 @@ - Claim Date: Period (start_date, end_date) when the claim was made. Both start_date and end_date should be in ISO-8601 format. If the claim was made on a single date rather than a date range, set the same date for both start_date and end_date. If date is unknown, return **NONE**. - Claim Source Text: List of **all** quotes from the original text that are relevant to the claim. -Format each claim as ({tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) +Format each claim as (<|><|><|><|><|><|><|>) -3. Return output in English as a single list of all the claims identified in steps 1 and 2. Use **{record_delimiter}** as the list delimiter. +3. Return output in English as a single list of all the claims identified in steps 1 and 2. Use **##** as the list delimiter. -4. When finished, output {completion_delimiter} +4. When finished, output <|COMPLETE|> -Examples- Example 1: @@ -35,8 +35,8 @@ Text: According to an article on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B. The company is owned by Person C who was suspected of engaging in corruption activities in 2015. Output: -(COMPANY A{tuple_delimiter}GOVERNMENT AGENCY B{tuple_delimiter}ANTI-COMPETITIVE PRACTICES{tuple_delimiter}TRUE{tuple_delimiter}2022-01-10T00:00:00{tuple_delimiter}2022-01-10T00:00:00{tuple_delimiter}Company A was found to engage in anti-competitive practices because it was fined for bid rigging in multiple public tenders published by Government Agency B according to an article published on 2022/01/10{tuple_delimiter}According to an article published on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B.) -{completion_delimiter} +(COMPANY A<|>GOVERNMENT AGENCY B<|>ANTI-COMPETITIVE PRACTICES<|>TRUE<|>2022-01-10T00:00:00<|>2022-01-10T00:00:00<|>Company A was found to engage in anti-competitive practices because it was fined for bid rigging in multiple public tenders published by Government Agency B according to an article published on 2022/01/10<|>According to an article published on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B.) +<|COMPLETE|> Example 2: Entity specification: Company A, Person C @@ -44,10 +44,10 @@ Text: According to an article on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B. The company is owned by Person C who was suspected of engaging in corruption activities in 2015. Output: -(COMPANY A{tuple_delimiter}GOVERNMENT AGENCY B{tuple_delimiter}ANTI-COMPETITIVE PRACTICES{tuple_delimiter}TRUE{tuple_delimiter}2022-01-10T00:00:00{tuple_delimiter}2022-01-10T00:00:00{tuple_delimiter}Company A was found to engage in anti-competitive practices because it was fined for bid rigging in multiple public tenders published by Government Agency B according to an article published on 2022/01/10{tuple_delimiter}According to an article published on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B.) -{record_delimiter} -(PERSON C{tuple_delimiter}NONE{tuple_delimiter}CORRUPTION{tuple_delimiter}SUSPECTED{tuple_delimiter}2015-01-01T00:00:00{tuple_delimiter}2015-12-30T00:00:00{tuple_delimiter}Person C was suspected of engaging in corruption activities in 2015{tuple_delimiter}The company is owned by Person C who was suspected of engaging in corruption activities in 2015) -{completion_delimiter} +(COMPANY A<|>GOVERNMENT AGENCY B<|>ANTI-COMPETITIVE PRACTICES<|>TRUE<|>2022-01-10T00:00:00<|>2022-01-10T00:00:00<|>Company A was found to engage in anti-competitive practices because it was fined for bid rigging in multiple public tenders published by Government Agency B according to an article published on 2022/01/10<|>According to an article published on 2022/01/10, Company A was fined for bid rigging while participating in multiple public tenders published by Government Agency B.) +## +(PERSON C<|>NONE<|>CORRUPTION<|>SUSPECTED<|>2015-01-01T00:00:00<|>2015-12-30T00:00:00<|>Person C was suspected of engaging in corruption activities in 2015<|>The company is owned by Person C who was suspected of engaging in corruption activities in 2015) +<|COMPLETE|> -Real Data- Use the following input for your answer. diff --git a/packages/graphrag/graphrag/prompts/index/extract_graph.py b/packages/graphrag/graphrag/prompts/index/extract_graph.py new file mode 100644 index 0000000000..91157937d4 --- /dev/null +++ b/packages/graphrag/graphrag/prompts/index/extract_graph.py @@ -0,0 +1,129 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""A file containing prompts definition.""" + +GRAPH_EXTRACTION_PROMPT = """ +-Goal- +Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, capitalized +- entity_type: One of the following types: [{entity_types}] +- entity_description: Comprehensive description of the entity's attributes and activities +Format each entity as ("entity"<|><|><|>) + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_description: explanation as to why you think the source entity and the target entity are related to each other +- relationship_strength: a numeric score indicating strength of the relationship between the source entity and target entity + Format each relationship as ("relationship"<|><|><|><|>) + +3. Return output in English as a single list of all the entities and relationships identified in steps 1 and 2. Use **##** as the list delimiter. + +4. When finished, output <|COMPLETE|> + +###################### +-Examples- +###################### +Example 1: +Entity_types: ORGANIZATION,PERSON +Text: +The Verdantis's Central Institution is scheduled to meet on Monday and Thursday, with the institution planning to release its latest policy decision on Thursday at 1:30 p.m. PDT, followed by a press conference where Central Institution Chair Martin Smith will take questions. Investors expect the Market Strategy Committee to hold its benchmark interest rate steady in a range of 3.5%-3.75%. +###################### +Output: +("entity"<|>CENTRAL INSTITUTION<|>ORGANIZATION<|>The Central Institution is the Federal Reserve of Verdantis, which is setting interest rates on Monday and Thursday) +## +("entity"<|>MARTIN SMITH<|>PERSON<|>Martin Smith is the chair of the Central Institution) +## +("entity"<|>MARKET STRATEGY COMMITTEE<|>ORGANIZATION<|>The Central Institution committee makes key decisions about interest rates and the growth of Verdantis's money supply) +## +("relationship"<|>MARTIN SMITH<|>CENTRAL INSTITUTION<|>Martin Smith is the Chair of the Central Institution and will answer questions at a press conference<|>9) +<|COMPLETE|> + +###################### +Example 2: +Entity_types: ORGANIZATION +Text: +TechGlobal's (TG) stock skyrocketed in its opening day on the Global Exchange Thursday. But IPO experts warn that the semiconductor corporation's debut on the public markets isn't indicative of how other newly listed companies may perform. + +TechGlobal, a formerly public company, was taken private by Vision Holdings in 2014. The well-established chip designer says it powers 85% of premium smartphones. +###################### +Output: +("entity"<|>TECHGLOBAL<|>ORGANIZATION<|>TechGlobal is a stock now listed on the Global Exchange which powers 85% of premium smartphones) +## +("entity"<|>VISION HOLDINGS<|>ORGANIZATION<|>Vision Holdings is a firm that previously owned TechGlobal) +## +("relationship"<|>TECHGLOBAL<|>VISION HOLDINGS<|>Vision Holdings formerly owned TechGlobal from 2014 until present<|>5) +<|COMPLETE|> + +###################### +Example 3: +Entity_types: ORGANIZATION,GEO,PERSON +Text: +Five Aurelians jailed for 8 years in Firuzabad and widely regarded as hostages are on their way home to Aurelia. + +The swap orchestrated by Quintara was finalized when $8bn of Firuzi funds were transferred to financial institutions in Krohaara, the capital of Quintara. + +The exchange initiated in Firuzabad's capital, Tiruzia, led to the four men and one woman, who are also Firuzi nationals, boarding a chartered flight to Krohaara. + +They were welcomed by senior Aurelian officials and are now on their way to Aurelia's capital, Cashion. + +The Aurelians include 39-year-old businessman Samuel Namara, who has been held in Tiruzia's Alhamia Prison, as well as journalist Durke Bataglani, 59, and environmentalist Meggie Tazbah, 53, who also holds Bratinas nationality. +###################### +Output: +("entity"<|>FIRUZABAD<|>GEO<|>Firuzabad held Aurelians as hostages) +## +("entity"<|>AURELIA<|>GEO<|>Country seeking to release hostages) +## +("entity"<|>QUINTARA<|>GEO<|>Country that negotiated a swap of money in exchange for hostages) +## +## +("entity"<|>TIRUZIA<|>GEO<|>Capital of Firuzabad where the Aurelians were being held) +## +("entity"<|>KROHAARA<|>GEO<|>Capital city in Quintara) +## +("entity"<|>CASHION<|>GEO<|>Capital city in Aurelia) +## +("entity"<|>SAMUEL NAMARA<|>PERSON<|>Aurelian who spent time in Tiruzia's Alhamia Prison) +## +("entity"<|>ALHAMIA PRISON<|>GEO<|>Prison in Tiruzia) +## +("entity"<|>DURKE BATAGLANI<|>PERSON<|>Aurelian journalist who was held hostage) +## +("entity"<|>MEGGIE TAZBAH<|>PERSON<|>Bratinas national and environmentalist who was held hostage) +## +("relationship"<|>FIRUZABAD<|>AURELIA<|>Firuzabad negotiated a hostage exchange with Aurelia<|>2) +## +("relationship"<|>QUINTARA<|>AURELIA<|>Quintara brokered the hostage exchange between Firuzabad and Aurelia<|>2) +## +("relationship"<|>QUINTARA<|>FIRUZABAD<|>Quintara brokered the hostage exchange between Firuzabad and Aurelia<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>ALHAMIA PRISON<|>Samuel Namara was a prisoner at Alhamia prison<|>8) +## +("relationship"<|>SAMUEL NAMARA<|>MEGGIE TAZBAH<|>Samuel Namara and Meggie Tazbah were exchanged in the same hostage release<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>DURKE BATAGLANI<|>Samuel Namara and Durke Bataglani were exchanged in the same hostage release<|>2) +## +("relationship"<|>MEGGIE TAZBAH<|>DURKE BATAGLANI<|>Meggie Tazbah and Durke Bataglani were exchanged in the same hostage release<|>2) +## +("relationship"<|>SAMUEL NAMARA<|>FIRUZABAD<|>Samuel Namara was a hostage in Firuzabad<|>2) +## +("relationship"<|>MEGGIE TAZBAH<|>FIRUZABAD<|>Meggie Tazbah was a hostage in Firuzabad<|>2) +## +("relationship"<|>DURKE BATAGLANI<|>FIRUZABAD<|>Durke Bataglani was a hostage in Firuzabad<|>2) +<|COMPLETE|> + +###################### +-Real Data- +###################### +Entity_types: {entity_types} +Text: {input_text} +###################### +Output:""" + +CONTINUE_PROMPT = "MANY entities and relationships were missed in the last extraction. Remember to ONLY emit entities that match any of the previously extracted types. Add them below using the same format:\n" +LOOP_PROMPT = "It appears some entities and relationships may have still been missed. Answer Y if there are still entities or relationships that need to be added, or N if there are none. Please answer with a single letter Y or N.\n" diff --git a/graphrag/prompts/index/summarize_descriptions.py b/packages/graphrag/graphrag/prompts/index/summarize_descriptions.py similarity index 100% rename from graphrag/prompts/index/summarize_descriptions.py rename to packages/graphrag/graphrag/prompts/index/summarize_descriptions.py diff --git a/graphrag/prompts/query/__init__.py b/packages/graphrag/graphrag/prompts/query/__init__.py similarity index 100% rename from graphrag/prompts/query/__init__.py rename to packages/graphrag/graphrag/prompts/query/__init__.py diff --git a/graphrag/prompts/query/basic_search_system_prompt.py b/packages/graphrag/graphrag/prompts/query/basic_search_system_prompt.py similarity index 96% rename from graphrag/prompts/query/basic_search_system_prompt.py rename to packages/graphrag/graphrag/prompts/query/basic_search_system_prompt.py index a20fb6ad10..bc37c70d98 100644 --- a/graphrag/prompts/query/basic_search_system_prompt.py +++ b/packages/graphrag/graphrag/prompts/query/basic_search_system_prompt.py @@ -27,7 +27,7 @@ "Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Sources (2, 7, 64, 46, 34, +more)]. He is also CEO of company X [Data: Sources (1, 3)]" -where 1, 2, 3, 7, 34, 46, and 64 represent the source id taken from the "source_id" column in the provided tables. +where 1, 2, 3, 7, 34, 46, and 64 represent the source id taken from the "id" column in the provided tables. Do not include information where the supporting evidence for it is not provided. @@ -60,7 +60,7 @@ "Person X is the owner of Company Y and subject to many allegations of wrongdoing [Data: Sources (2, 7, 64, 46, 34, +more)]. He is also CEO of company X [Data: Sources (1, 3)]" -where 1, 2, 3, 7, 34, 46, and 64 represent the source id taken from the "source_id" column in the provided tables. +where 1, 2, 3, 7, 34, 46, and 64 represent the source id taken from the "id" column in the provided tables. Do not include information where the supporting evidence for it is not provided. diff --git a/graphrag/prompts/query/drift_search_system_prompt.py b/packages/graphrag/graphrag/prompts/query/drift_search_system_prompt.py similarity index 94% rename from graphrag/prompts/query/drift_search_system_prompt.py rename to packages/graphrag/graphrag/prompts/query/drift_search_system_prompt.py index 3faae89a0e..4cb220f69d 100644 --- a/graphrag/prompts/query/drift_search_system_prompt.py +++ b/packages/graphrag/graphrag/prompts/query/drift_search_system_prompt.py @@ -65,7 +65,7 @@ Add sections and commentary to the response as appropriate for the length and format. -Additionally provide a score between 0 and 100 representing how well the response addresses the overall research question: {global_query}. Based on your response, suggest up to five follow-up questions that could be asked to further explore the topic as it relates to the overall research question. Do not include scores or follow up questions in the 'response' field of the JSON, add them to the respective 'score' and 'follow_up_queries' keys of the JSON output. Format your response in JSON with the following keys and values: +Additionally provide a score between 0 and 100 representing how well the response addresses the overall research question: {global_query}. Based on your response, suggest up to {followups} follow-up questions that could be asked to further explore the topic as it relates to the overall research question. Do not include scores or follow up questions in the 'response' field of the JSON, add them to the respective 'score' and 'follow_up_queries' keys of the JSON output. Format your response in JSON with the following keys and values: {{'response': str, Put your answer, formatted in markdown, here. Do not answer the global query in this section. 'score': int, diff --git a/graphrag/prompts/query/global_search_knowledge_system_prompt.py b/packages/graphrag/graphrag/prompts/query/global_search_knowledge_system_prompt.py similarity index 100% rename from graphrag/prompts/query/global_search_knowledge_system_prompt.py rename to packages/graphrag/graphrag/prompts/query/global_search_knowledge_system_prompt.py diff --git a/graphrag/prompts/query/global_search_map_system_prompt.py b/packages/graphrag/graphrag/prompts/query/global_search_map_system_prompt.py similarity index 100% rename from graphrag/prompts/query/global_search_map_system_prompt.py rename to packages/graphrag/graphrag/prompts/query/global_search_map_system_prompt.py diff --git a/graphrag/prompts/query/global_search_reduce_system_prompt.py b/packages/graphrag/graphrag/prompts/query/global_search_reduce_system_prompt.py similarity index 100% rename from graphrag/prompts/query/global_search_reduce_system_prompt.py rename to packages/graphrag/graphrag/prompts/query/global_search_reduce_system_prompt.py diff --git a/graphrag/prompts/query/local_search_system_prompt.py b/packages/graphrag/graphrag/prompts/query/local_search_system_prompt.py similarity index 100% rename from graphrag/prompts/query/local_search_system_prompt.py rename to packages/graphrag/graphrag/prompts/query/local_search_system_prompt.py diff --git a/graphrag/prompts/query/question_gen_system_prompt.py b/packages/graphrag/graphrag/prompts/query/question_gen_system_prompt.py similarity index 100% rename from graphrag/prompts/query/question_gen_system_prompt.py rename to packages/graphrag/graphrag/prompts/query/question_gen_system_prompt.py diff --git a/graphrag/py.typed b/packages/graphrag/graphrag/py.typed similarity index 100% rename from graphrag/py.typed rename to packages/graphrag/graphrag/py.typed diff --git a/graphrag/query/__init__.py b/packages/graphrag/graphrag/query/__init__.py similarity index 100% rename from graphrag/query/__init__.py rename to packages/graphrag/graphrag/query/__init__.py diff --git a/graphrag/query/context_builder/__init__.py b/packages/graphrag/graphrag/query/context_builder/__init__.py similarity index 100% rename from graphrag/query/context_builder/__init__.py rename to packages/graphrag/graphrag/query/context_builder/__init__.py diff --git a/graphrag/query/context_builder/builders.py b/packages/graphrag/graphrag/query/context_builder/builders.py similarity index 100% rename from graphrag/query/context_builder/builders.py rename to packages/graphrag/graphrag/query/context_builder/builders.py diff --git a/graphrag/query/context_builder/community_context.py b/packages/graphrag/graphrag/query/context_builder/community_context.py similarity index 99% rename from graphrag/query/context_builder/community_context.py rename to packages/graphrag/graphrag/query/context_builder/community_context.py index 4917be0186..2d3238b0d0 100644 --- a/graphrag/query/context_builder/community_context.py +++ b/packages/graphrag/graphrag/query/context_builder/community_context.py @@ -8,11 +8,11 @@ from typing import Any, cast import pandas as pd +from graphrag_llm.tokenizer import Tokenizer from graphrag.data_model.community_report import CommunityReport from graphrag.data_model.entity import Entity from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer logger = logging.getLogger(__name__) diff --git a/graphrag/query/context_builder/conversation_history.py b/packages/graphrag/graphrag/query/context_builder/conversation_history.py similarity index 99% rename from graphrag/query/context_builder/conversation_history.py rename to packages/graphrag/graphrag/query/context_builder/conversation_history.py index c20998121c..1170c7c0da 100644 --- a/graphrag/query/context_builder/conversation_history.py +++ b/packages/graphrag/graphrag/query/context_builder/conversation_history.py @@ -7,9 +7,9 @@ from enum import Enum import pandas as pd +from graphrag_llm.tokenizer import Tokenizer from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer """ Enum for conversation roles diff --git a/graphrag/query/context_builder/dynamic_community_selection.py b/packages/graphrag/graphrag/query/context_builder/dynamic_community_selection.py similarity index 94% rename from graphrag/query/context_builder/dynamic_community_selection.py rename to packages/graphrag/graphrag/query/context_builder/dynamic_community_selection.py index 904478f738..0ef22b9176 100644 --- a/graphrag/query/context_builder/dynamic_community_selection.py +++ b/packages/graphrag/graphrag/query/context_builder/dynamic_community_selection.py @@ -8,14 +8,17 @@ from collections import Counter from copy import deepcopy from time import time -from typing import Any +from typing import TYPE_CHECKING, Any + +from graphrag_llm.tokenizer import Tokenizer from graphrag.data_model.community import Community from graphrag.data_model.community_report import CommunityReport -from graphrag.language_model.protocol.base import ChatModel from graphrag.query.context_builder.rate_prompt import RATE_QUERY from graphrag.query.context_builder.rate_relevancy import rate_relevancy -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion logger = logging.getLogger(__name__) @@ -30,7 +33,7 @@ def __init__( self, community_reports: list[CommunityReport], communities: list[Community], - model: ChatModel, + model: "LLMCompletion", tokenizer: Tokenizer, rate_query: str = RATE_QUERY, use_summary: bool = False, @@ -123,8 +126,10 @@ async def select(self, query: str) -> tuple[list[CommunityReport], dict[str, Any # TODO check why some sub_communities are NOT in report_df if community in self.communities: for child in self.communities[community].children: - if child in self.reports: - communities_to_rate.append(child) + # Convert child to string to match self.reports key type + child_str = str(child) + if child_str in self.reports: + communities_to_rate.append(child_str) else: logger.debug( "dynamic community selection: cannot find community %s in reports", diff --git a/graphrag/query/context_builder/entity_extraction.py b/packages/graphrag/graphrag/query/context_builder/entity_extraction.py similarity index 92% rename from graphrag/query/context_builder/entity_extraction.py rename to packages/graphrag/graphrag/query/context_builder/entity_extraction.py index 0dd03ba281..6eab03b5cc 100644 --- a/graphrag/query/context_builder/entity_extraction.py +++ b/packages/graphrag/graphrag/query/context_builder/entity_extraction.py @@ -4,16 +4,20 @@ """Orchestration Context Builders.""" from enum import Enum +from typing import TYPE_CHECKING + +from graphrag_vectors import VectorStore from graphrag.data_model.entity import Entity from graphrag.data_model.relationship import Relationship -from graphrag.language_model.protocol.base import EmbeddingModel from graphrag.query.input.retrieval.entities import ( get_entity_by_id, get_entity_by_key, get_entity_by_name, ) -from graphrag.vector_stores.base import BaseVectorStore + +if TYPE_CHECKING: + from graphrag_llm.embedding import LLMEmbedding class EntityVectorStoreKey(str, Enum): @@ -36,8 +40,8 @@ def from_string(value: str) -> "EntityVectorStoreKey": def map_query_to_entities( query: str, - text_embedding_vectorstore: BaseVectorStore, - text_embedder: EmbeddingModel, + text_embedding_vectorstore: VectorStore, + text_embedder: "LLMEmbedding", all_entities_dict: dict[str, Entity], embedding_vectorstore_key: str = EntityVectorStoreKey.ID, include_entity_names: list[str] | None = None, @@ -57,7 +61,7 @@ def map_query_to_entities( # oversample to account for excluded entities search_results = text_embedding_vectorstore.similarity_search_by_text( text=query, - text_embedder=lambda t: text_embedder.embed(t), + text_embedder=lambda t: text_embedder.embedding(input=[t]).first_embedding, k=k * oversample_scaler, ) for result in search_results: diff --git a/graphrag/query/context_builder/local_context.py b/packages/graphrag/graphrag/query/context_builder/local_context.py similarity index 99% rename from graphrag/query/context_builder/local_context.py rename to packages/graphrag/graphrag/query/context_builder/local_context.py index a2d8a54533..b84566bde0 100644 --- a/graphrag/query/context_builder/local_context.py +++ b/packages/graphrag/graphrag/query/context_builder/local_context.py @@ -7,6 +7,7 @@ from typing import Any, cast import pandas as pd +from graphrag_llm.tokenizer import Tokenizer from graphrag.data_model.covariate import Covariate from graphrag.data_model.entity import Entity @@ -24,7 +25,6 @@ to_relationship_dataframe, ) from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer def build_entity_context( diff --git a/graphrag/query/context_builder/rate_prompt.py b/packages/graphrag/graphrag/query/context_builder/rate_prompt.py similarity index 100% rename from graphrag/query/context_builder/rate_prompt.py rename to packages/graphrag/graphrag/query/context_builder/rate_prompt.py diff --git a/graphrag/query/context_builder/rate_relevancy.py b/packages/graphrag/graphrag/query/context_builder/rate_relevancy.py similarity index 73% rename from graphrag/query/context_builder/rate_relevancy.py rename to packages/graphrag/graphrag/query/context_builder/rate_relevancy.py index 6fa128999f..16474369ac 100644 --- a/graphrag/query/context_builder/rate_relevancy.py +++ b/packages/graphrag/graphrag/query/context_builder/rate_relevancy.py @@ -6,14 +6,20 @@ import asyncio import logging from contextlib import nullcontext -from typing import Any +from typing import TYPE_CHECKING, Any import numpy as np +from graphrag_llm.tokenizer import Tokenizer +from graphrag_llm.utils import ( + CompletionMessagesBuilder, + gather_completion_response_async, +) -from graphrag.language_model.protocol.base import ChatModel from graphrag.query.context_builder.rate_prompt import RATE_QUERY from graphrag.query.llm.text_utils import try_parse_json_object -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion logger = logging.getLogger(__name__) @@ -21,7 +27,7 @@ async def rate_relevancy( query: str, description: str, - model: ChatModel, + model: "LLMCompletion", tokenizer: Tokenizer, rate_query: str = RATE_QUERY, num_repeats: int = 1, @@ -42,18 +48,21 @@ async def rate_relevancy( semaphore: asyncio.Semaphore to limit the number of concurrent LLM calls (default: None) """ llm_calls, prompt_tokens, output_tokens, ratings = 0, 0, 0, [] - messages = [ - { - "role": "system", - "content": rate_query.format(description=description, question=query), - }, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(rate_query.format(description=description, question=query)) + .add_user_message(query) + ) + for _ in range(num_repeats): async with semaphore if semaphore is not None else nullcontext(): - model_response = await model.achat( - prompt=query, history=messages, model_parameters=model_params, json=True + model_response = await model.completion_async( + messages=messages_builder.build(), + response_format_json_object=True, + **model_params, ) - response = model_response.output.content + response = await gather_completion_response_async(model_response) try: _, parsed_response = try_parse_json_object(response) ratings.append(parsed_response["rating"]) @@ -63,7 +72,7 @@ async def rate_relevancy( logger.warning("Error parsing json response, defaulting to rating 1") ratings.append(1) llm_calls += 1 - prompt_tokens += tokenizer.num_tokens(messages[0]["content"]) + prompt_tokens += tokenizer.num_prompt_tokens(messages_builder.build()) output_tokens += tokenizer.num_tokens(response) # select the decision with the most votes options, counts = np.unique(ratings, return_counts=True) diff --git a/graphrag/query/context_builder/source_context.py b/packages/graphrag/graphrag/query/context_builder/source_context.py similarity index 98% rename from graphrag/query/context_builder/source_context.py rename to packages/graphrag/graphrag/query/context_builder/source_context.py index eaf308f629..ff121b8cdd 100644 --- a/graphrag/query/context_builder/source_context.py +++ b/packages/graphrag/graphrag/query/context_builder/source_context.py @@ -7,11 +7,11 @@ from typing import Any, cast import pandas as pd +from graphrag_llm.tokenizer import Tokenizer from graphrag.data_model.relationship import Relationship from graphrag.data_model.text_unit import TextUnit from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer """ Contain util functions to build text unit context for the search's system prompt diff --git a/graphrag/query/factory.py b/packages/graphrag/graphrag/query/factory.py similarity index 74% rename from graphrag/query/factory.py rename to packages/graphrag/graphrag/query/factory.py index 10dfd3ba1f..5655074ed0 100644 --- a/graphrag/query/factory.py +++ b/packages/graphrag/graphrag/query/factory.py @@ -3,6 +3,10 @@ """Query Factory methods to support CLI.""" +from graphrag_llm.completion import create_completion +from graphrag_llm.embedding import create_embedding +from graphrag_vectors import VectorStore + from graphrag.callbacks.query_callbacks import QueryCallbacks from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.data_model.community import Community @@ -11,10 +15,6 @@ from graphrag.data_model.entity import Entity from graphrag.data_model.relationship import Relationship from graphrag.data_model.text_unit import TextUnit -from graphrag.language_model.manager import ModelManager -from graphrag.language_model.providers.fnllm.utils import ( - get_openai_model_parameters_from_config, -) from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey from graphrag.query.structured_search.basic_search.basic_context import ( BasicSearchContext, @@ -32,8 +32,6 @@ LocalSearchMixedContext, ) from graphrag.query.structured_search.local_search.search import LocalSearch -from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.vector_stores.base import BaseVectorStore def get_local_search_engine( @@ -44,34 +42,28 @@ def get_local_search_engine( relationships: list[Relationship], covariates: dict[str, list[Covariate]], response_type: str, - description_embedding_store: BaseVectorStore, + description_embedding_store: VectorStore, system_prompt: str | None = None, callbacks: list[QueryCallbacks] | None = None, ) -> LocalSearch: """Create a local search engine based on data + configuration.""" - model_settings = config.get_language_model_config(config.local_search.chat_model_id) - - chat_model = ModelManager().get_or_create_chat_model( - name="local_search_chat", - model_type=model_settings.type, - config=model_settings, + model_settings = config.get_completion_model_config( + config.local_search.completion_model_id ) - embedding_settings = config.get_language_model_config( + chat_model = create_completion(model_settings) + + embedding_settings = config.get_embedding_model_config( config.local_search.embedding_model_id ) - embedding_model = ModelManager().get_or_create_embedding_model( - name="local_search_embedding", - model_type=embedding_settings.type, - config=embedding_settings, - ) + embedding_model = create_embedding(embedding_settings) - tokenizer = get_tokenizer(model_config=model_settings) + tokenizer = chat_model.tokenizer ls_config = config.local_search - model_params = get_openai_model_parameters_from_config(model_settings) + model_params = model_settings.call_args return LocalSearch( model=chat_model, @@ -121,20 +113,16 @@ def get_global_search_engine( callbacks: list[QueryCallbacks] | None = None, ) -> GlobalSearch: """Create a global search engine based on data + configuration.""" - model_settings = config.get_language_model_config( - config.global_search.chat_model_id + model_settings = config.get_completion_model_config( + config.global_search.completion_model_id ) - model = ModelManager().get_or_create_chat_model( - name="global_search", - model_type=model_settings.type, - config=model_settings, - ) + model = create_completion(model_settings) - model_params = get_openai_model_parameters_from_config(model_settings) + model_params = model_settings.call_args # Here we get encoding based on specified encoding name - tokenizer = get_tokenizer(model_config=model_settings) + tokenizer = model.tokenizer gs_config = config.global_search dynamic_community_selection_kwargs = {} @@ -147,7 +135,7 @@ def get_global_search_engine( "keep_parent": gs_config.dynamic_search_keep_parent, "num_repeats": gs_config.dynamic_search_num_repeats, "use_summary": gs_config.dynamic_search_use_summary, - "concurrent_coroutines": model_settings.concurrent_requests, + "concurrent_coroutines": config.concurrent_requests, "threshold": gs_config.dynamic_search_threshold, "max_level": gs_config.dynamic_search_max_level, "model_params": {**model_params}, @@ -186,7 +174,7 @@ def get_global_search_engine( "max_context_tokens": gs_config.max_context_tokens, "context_name": "Reports", }, - concurrent_coroutines=model_settings.concurrent_requests, + concurrent_coroutines=config.concurrent_requests, response_type=response_type, callbacks=callbacks, ) @@ -198,34 +186,26 @@ def get_drift_search_engine( text_units: list[TextUnit], entities: list[Entity], relationships: list[Relationship], - description_embedding_store: BaseVectorStore, + description_embedding_store: VectorStore, response_type: str, local_system_prompt: str | None = None, reduce_system_prompt: str | None = None, callbacks: list[QueryCallbacks] | None = None, ) -> DRIFTSearch: """Create a local search engine based on data + configuration.""" - chat_model_settings = config.get_language_model_config( - config.drift_search.chat_model_id + chat_model_settings = config.get_completion_model_config( + config.drift_search.completion_model_id ) - chat_model = ModelManager().get_or_create_chat_model( - name="drift_search_chat", - model_type=chat_model_settings.type, - config=chat_model_settings, - ) + chat_model = create_completion(chat_model_settings) - embedding_model_settings = config.get_language_model_config( + embedding_model_settings = config.get_embedding_model_config( config.drift_search.embedding_model_id ) - embedding_model = ModelManager().get_or_create_embedding_model( - name="drift_search_embedding", - model_type=embedding_model_settings.type, - config=embedding_model_settings, - ) + embedding_model = create_embedding(embedding_model_settings) - tokenizer = get_tokenizer(model_config=chat_model_settings) + tokenizer = chat_model.tokenizer return DRIFTSearch( model=chat_model, @@ -249,38 +229,30 @@ def get_drift_search_engine( def get_basic_search_engine( text_units: list[TextUnit], - text_unit_embeddings: BaseVectorStore, + text_unit_embeddings: VectorStore, config: GraphRagConfig, + response_type: str, system_prompt: str | None = None, - response_type: str = "multiple paragraphs", callbacks: list[QueryCallbacks] | None = None, ) -> BasicSearch: """Create a basic search engine based on data + configuration.""" - chat_model_settings = config.get_language_model_config( - config.basic_search.chat_model_id + chat_model_settings = config.get_completion_model_config( + config.basic_search.completion_model_id ) - chat_model = ModelManager().get_or_create_chat_model( - name="basic_search_chat", - model_type=chat_model_settings.type, - config=chat_model_settings, - ) + chat_model = create_completion(chat_model_settings) - embedding_model_settings = config.get_language_model_config( + embedding_model_settings = config.get_embedding_model_config( config.basic_search.embedding_model_id ) - embedding_model = ModelManager().get_or_create_embedding_model( - name="basic_search_embedding", - model_type=embedding_model_settings.type, - config=embedding_model_settings, - ) + embedding_model = create_embedding(embedding_model_settings) - tokenizer = get_tokenizer(model_config=chat_model_settings) + tokenizer = chat_model.tokenizer bs_config = config.basic_search - model_params = get_openai_model_parameters_from_config(chat_model_settings) + model_params = chat_model_settings.call_args return BasicSearch( model=chat_model, diff --git a/graphrag/query/indexer_adapters.py b/packages/graphrag/graphrag/query/indexer_adapters.py similarity index 84% rename from graphrag/query/indexer_adapters.py rename to packages/graphrag/graphrag/query/indexer_adapters.py index 0c6e54a8af..c347fa11de 100644 --- a/graphrag/query/indexer_adapters.py +++ b/packages/graphrag/graphrag/query/indexer_adapters.py @@ -7,19 +7,17 @@ """ import logging -from typing import cast +from typing import TYPE_CHECKING, cast import pandas as pd +from graphrag_vectors import VectorStore -from graphrag.config.models.graph_rag_config import GraphRagConfig from graphrag.data_model.community import Community from graphrag.data_model.community_report import CommunityReport from graphrag.data_model.covariate import Covariate from graphrag.data_model.entity import Entity from graphrag.data_model.relationship import Relationship from graphrag.data_model.text_unit import TextUnit -from graphrag.language_model.manager import ModelManager -from graphrag.language_model.protocol.base import EmbeddingModel from graphrag.query.input.loaders.dfs import ( read_communities, read_community_reports, @@ -28,7 +26,9 @@ read_relationships, read_text_units, ) -from graphrag.vector_stores.base import BaseVectorStore + +if TYPE_CHECKING: + from graphrag_llm.embedding import LLMEmbedding logger = logging.getLogger(__name__) @@ -76,8 +76,6 @@ def read_indexer_reports( final_communities: pd.DataFrame, community_level: int | None, dynamic_community_selection: bool = False, - content_embedding_col: str = "full_content_embedding", - config: GraphRagConfig | None = None, ) -> list[CommunityReport]: """Read in the Community Reports from the raw indexing outputs. @@ -102,34 +100,12 @@ def read_indexer_reports( filtered_community_df, on="community", how="inner" ) - if config and ( - content_embedding_col not in reports_df.columns - or reports_df.loc[:, content_embedding_col].isna().any() - ): - # TODO: Find a way to retrieve the right embedding model id. - embedding_model_settings = config.get_language_model_config( - "default_embedding_model" - ) - embedder = ModelManager().get_or_create_embedding_model( - name="default_embedding", - model_type=embedding_model_settings.type, - config=embedding_model_settings, - ) - reports_df = embed_community_reports( - reports_df, embedder, embedding_col=content_embedding_col - ) - - return read_community_reports( - df=reports_df, - id_col="id", - short_id_col="community", - content_embedding_col=content_embedding_col, - ) + return read_community_reports(df=reports_df, id_col="id", short_id_col="community") def read_indexer_report_embeddings( community_reports: list[CommunityReport], - embeddings_store: BaseVectorStore, + embeddings_store: VectorStore, ): """Read in the Community Reports from the raw indexing outputs.""" for report in community_reports: @@ -218,7 +194,7 @@ def read_indexer_communities( def embed_community_reports( reports_df: pd.DataFrame, - embedder: EmbeddingModel, + embedder: "LLMEmbedding", source_col: str = "full_content", embedding_col: str = "full_content_embedding", ) -> pd.DataFrame: @@ -229,7 +205,7 @@ def embed_community_reports( if embedding_col not in reports_df.columns: reports_df[embedding_col] = reports_df.loc[:, source_col].apply( - lambda x: embedder.embed(x) + lambda x: embedder.embedding(input=[x]).first_embedding ) return reports_df diff --git a/graphrag/query/input/__init__.py b/packages/graphrag/graphrag/query/input/__init__.py similarity index 100% rename from graphrag/query/input/__init__.py rename to packages/graphrag/graphrag/query/input/__init__.py diff --git a/graphrag/query/input/loaders/__init__.py b/packages/graphrag/graphrag/query/input/loaders/__init__.py similarity index 100% rename from graphrag/query/input/loaders/__init__.py rename to packages/graphrag/graphrag/query/input/loaders/__init__.py diff --git a/graphrag/query/input/loaders/dfs.py b/packages/graphrag/graphrag/query/input/loaders/dfs.py similarity index 96% rename from graphrag/query/input/loaders/dfs.py rename to packages/graphrag/graphrag/query/input/loaders/dfs.py index 7182090cd2..a2b636f1dd 100644 --- a/graphrag/query/input/loaders/dfs.py +++ b/packages/graphrag/graphrag/query/input/loaders/dfs.py @@ -197,7 +197,6 @@ def read_community_reports( summary_col: str = "summary", content_col: str = "full_content", rank_col: str | None = "rank", - content_embedding_col: str | None = "full_content_embedding", attributes_cols: list[str] | None = None, ) -> list[CommunityReport]: """Read community reports from a dataframe using pre-converted records.""" @@ -213,9 +212,6 @@ def read_community_reports( summary=to_str(row, summary_col), full_content=to_str(row, content_col), rank=to_optional_float(row, rank_col), - full_content_embedding=to_optional_list( - row, content_embedding_col, item_type=float - ), attributes=( {col: row.get(col) for col in attributes_cols} if attributes_cols @@ -234,7 +230,7 @@ def read_text_units( relationships_col: str | None = "relationship_ids", covariates_col: str | None = "covariate_ids", tokens_col: str | None = "n_tokens", - document_ids_col: str | None = "document_ids", + document_id_col: str | None = "document_id", attributes_cols: list[str] | None = None, ) -> list[TextUnit]: """Read text units from a dataframe using pre-converted records.""" @@ -250,7 +246,7 @@ def read_text_units( row, covariates_col, key_type=str, value_type=str ), n_tokens=to_optional_int(row, tokens_col), - document_ids=to_optional_list(row, document_ids_col, item_type=str), + document_id=to_optional_str(row, document_id_col), attributes=( {col: row.get(col) for col in attributes_cols} if attributes_cols diff --git a/graphrag/query/input/loaders/utils.py b/packages/graphrag/graphrag/query/input/loaders/utils.py similarity index 100% rename from graphrag/query/input/loaders/utils.py rename to packages/graphrag/graphrag/query/input/loaders/utils.py diff --git a/graphrag/query/input/retrieval/__init__.py b/packages/graphrag/graphrag/query/input/retrieval/__init__.py similarity index 100% rename from graphrag/query/input/retrieval/__init__.py rename to packages/graphrag/graphrag/query/input/retrieval/__init__.py diff --git a/graphrag/query/input/retrieval/community_reports.py b/packages/graphrag/graphrag/query/input/retrieval/community_reports.py similarity index 100% rename from graphrag/query/input/retrieval/community_reports.py rename to packages/graphrag/graphrag/query/input/retrieval/community_reports.py diff --git a/graphrag/query/input/retrieval/covariates.py b/packages/graphrag/graphrag/query/input/retrieval/covariates.py similarity index 100% rename from graphrag/query/input/retrieval/covariates.py rename to packages/graphrag/graphrag/query/input/retrieval/covariates.py diff --git a/graphrag/query/input/retrieval/entities.py b/packages/graphrag/graphrag/query/input/retrieval/entities.py similarity index 100% rename from graphrag/query/input/retrieval/entities.py rename to packages/graphrag/graphrag/query/input/retrieval/entities.py diff --git a/graphrag/query/input/retrieval/relationships.py b/packages/graphrag/graphrag/query/input/retrieval/relationships.py similarity index 100% rename from graphrag/query/input/retrieval/relationships.py rename to packages/graphrag/graphrag/query/input/retrieval/relationships.py diff --git a/graphrag/query/input/retrieval/text_units.py b/packages/graphrag/graphrag/query/input/retrieval/text_units.py similarity index 100% rename from graphrag/query/input/retrieval/text_units.py rename to packages/graphrag/graphrag/query/input/retrieval/text_units.py diff --git a/graphrag/query/llm/__init__.py b/packages/graphrag/graphrag/query/llm/__init__.py similarity index 100% rename from graphrag/query/llm/__init__.py rename to packages/graphrag/graphrag/query/llm/__init__.py diff --git a/graphrag/query/llm/text_utils.py b/packages/graphrag/graphrag/query/llm/text_utils.py similarity index 93% rename from graphrag/query/llm/text_utils.py rename to packages/graphrag/graphrag/query/llm/text_utils.py index 5ff1983aa1..d36aaed70f 100644 --- a/graphrag/query/llm/text_utils.py +++ b/packages/graphrag/graphrag/query/llm/text_utils.py @@ -9,11 +9,10 @@ from collections.abc import Iterator from itertools import islice +from graphrag_llm.tokenizer import Tokenizer from json_repair import repair_json -import graphrag.config.defaults as defs from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer logger = logging.getLogger(__name__) @@ -36,7 +35,7 @@ def batched(iterable: Iterator, n: int): def chunk_text(text: str, max_tokens: int, tokenizer: Tokenizer | None = None): """Chunk text by token length.""" if tokenizer is None: - tokenizer = get_tokenizer(encoding_model=defs.ENCODING_MODEL) + tokenizer = get_tokenizer() tokens = tokenizer.encode(text) # type: ignore chunk_iterator = batched(iter(tokens), max_tokens) yield from (tokenizer.decode(list(chunk)) for chunk in chunk_iterator) @@ -63,7 +62,8 @@ def try_parse_json_object(input: str, verbose: bool = True) -> tuple[str, dict]: # Clean up json string. input = ( - input.replace("{{", "{") + input + .replace("{{", "{") .replace("}}", "}") .replace('"[{', "[{") .replace('}]"', "}]") diff --git a/graphrag/query/question_gen/__init__.py b/packages/graphrag/graphrag/query/question_gen/__init__.py similarity index 100% rename from graphrag/query/question_gen/__init__.py rename to packages/graphrag/graphrag/query/question_gen/__init__.py diff --git a/graphrag/query/question_gen/base.py b/packages/graphrag/graphrag/query/question_gen/base.py similarity index 84% rename from graphrag/query/question_gen/base.py rename to packages/graphrag/graphrag/query/question_gen/base.py index 2195aee52a..d45ec60317 100644 --- a/graphrag/query/question_gen/base.py +++ b/packages/graphrag/graphrag/query/question_gen/base.py @@ -5,15 +5,17 @@ from abc import ABC, abstractmethod from dataclasses import dataclass -from typing import Any +from typing import TYPE_CHECKING, Any + +from graphrag_llm.tokenizer import Tokenizer -from graphrag.language_model.protocol.base import ChatModel from graphrag.query.context_builder.builders import ( GlobalContextBuilder, LocalContextBuilder, ) -from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion @dataclass @@ -32,7 +34,7 @@ class BaseQuestionGen(ABC): def __init__( self, - model: ChatModel, + model: "LLMCompletion", context_builder: GlobalContextBuilder | LocalContextBuilder, tokenizer: Tokenizer | None = None, model_params: dict[str, Any] | None = None, @@ -40,7 +42,7 @@ def __init__( ): self.model = model self.context_builder = context_builder - self.tokenizer = tokenizer or get_tokenizer(model.config) + self.tokenizer = tokenizer or model.tokenizer self.model_params = model_params or {} self.context_builder_params = context_builder_params or {} diff --git a/graphrag/query/question_gen/local_gen.py b/packages/graphrag/graphrag/query/question_gen/local_gen.py similarity index 79% rename from graphrag/query/question_gen/local_gen.py rename to packages/graphrag/graphrag/query/question_gen/local_gen.py index 82795e9cf3..7e4fb3dadb 100644 --- a/graphrag/query/question_gen/local_gen.py +++ b/packages/graphrag/graphrag/query/question_gen/local_gen.py @@ -5,10 +5,12 @@ import logging import time -from typing import Any, cast +from typing import TYPE_CHECKING, Any, cast + +from graphrag_llm.tokenizer import Tokenizer +from graphrag_llm.utils import CompletionMessagesBuilder from graphrag.callbacks.llm_callbacks import BaseLLMCallback -from graphrag.language_model.protocol.base import ChatModel from graphrag.prompts.query.question_gen_system_prompt import QUESTION_SYSTEM_PROMPT from graphrag.query.context_builder.builders import ( ContextBuilderResult, @@ -18,7 +20,12 @@ ConversationHistory, ) from graphrag.query.question_gen.base import BaseQuestionGen, QuestionResult -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from collections.abc import AsyncIterator + + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionChunk logger = logging.getLogger(__name__) @@ -28,7 +35,7 @@ class LocalQuestionGen(BaseQuestionGen): def __init__( self, - model: ChatModel, + model: "LLMCompletion", context_builder: LocalContextBuilder, tokenizer: Tokenizer | None = None, system_prompt: str = QUESTION_SYSTEM_PROMPT, @@ -94,19 +101,28 @@ async def agenerate( system_prompt = self.system_prompt.format( context_data=context_data, question_count=question_count ) - question_messages = [ - {"role": "system", "content": system_prompt}, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(system_prompt) + .add_user_message(question_text) + ) response = "" - async for chunk in self.model.achat_stream( - prompt=question_text, - history=question_messages, - model_parameters=self.model_params, - ): - response += chunk + + response_stream: AsyncIterator[ + LLMCompletionChunk + ] = await self.model.completion_async( + messages=messages_builder.build(), + stream=True, + **self.model_params, + ) # type: ignore + + async for chunk in response_stream: + response_text = chunk.choices[0].delta.content or "" + response += response_text for callback in self.callbacks: - callback.on_llm_new_token(chunk) + callback.on_llm_new_token(response_text) return QuestionResult( response=response.split("\n"), @@ -176,20 +192,28 @@ async def generate( system_prompt = self.system_prompt.format( context_data=context_data, question_count=question_count ) - question_messages = [ - {"role": "system", "content": system_prompt}, - {"role": "user", "content": question_text}, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(system_prompt) + .add_user_message(question_text) + ) response = "" - async for chunk in self.model.achat_stream( - prompt=question_text, - history=question_messages, - model_parameters=self.model_params, - ): - response += chunk + + response_stream: AsyncIterator[ + LLMCompletionChunk + ] = await self.model.completion_async( + messages=messages_builder.build(), + stream=True, + **self.model_params, + ) # type: ignore + + async for chunk in response_stream: + response_text = chunk.choices[0].delta.content or "" + response += response_text for callback in self.callbacks: - callback.on_llm_new_token(chunk) + callback.on_llm_new_token(response_text) return QuestionResult( response=response.split("\n"), diff --git a/graphrag/query/structured_search/__init__.py b/packages/graphrag/graphrag/query/structured_search/__init__.py similarity index 100% rename from graphrag/query/structured_search/__init__.py rename to packages/graphrag/graphrag/query/structured_search/__init__.py diff --git a/graphrag/query/structured_search/base.py b/packages/graphrag/graphrag/query/structured_search/base.py similarity index 89% rename from graphrag/query/structured_search/base.py rename to packages/graphrag/graphrag/query/structured_search/base.py index 753b419f69..1b5d1ca4eb 100644 --- a/graphrag/query/structured_search/base.py +++ b/packages/graphrag/graphrag/query/structured_search/base.py @@ -6,11 +6,11 @@ from abc import ABC, abstractmethod from collections.abc import AsyncGenerator from dataclasses import dataclass -from typing import Any, Generic, TypeVar +from typing import TYPE_CHECKING, Any, Generic, TypeVar import pandas as pd +from graphrag_llm.tokenizer import Tokenizer -from graphrag.language_model.protocol.base import ChatModel from graphrag.query.context_builder.builders import ( BasicContextBuilder, DRIFTContextBuilder, @@ -20,8 +20,9 @@ from graphrag.query.context_builder.conversation_history import ( ConversationHistory, ) -from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion @dataclass @@ -57,7 +58,7 @@ class BaseSearch(ABC, Generic[T]): def __init__( self, - model: ChatModel, + model: "LLMCompletion", context_builder: T, tokenizer: Tokenizer | None = None, model_params: dict[str, Any] | None = None, @@ -65,7 +66,7 @@ def __init__( ): self.model = model self.context_builder = context_builder - self.tokenizer = tokenizer or get_tokenizer() + self.tokenizer = tokenizer or model.tokenizer self.model_params = model_params or {} self.context_builder_params = context_builder_params or {} diff --git a/graphrag/query/structured_search/basic_search/__init__.py b/packages/graphrag/graphrag/query/structured_search/basic_search/__init__.py similarity index 100% rename from graphrag/query/structured_search/basic_search/__init__.py rename to packages/graphrag/graphrag/query/structured_search/basic_search/__init__.py diff --git a/graphrag/query/structured_search/basic_search/basic_context.py b/packages/graphrag/graphrag/query/structured_search/basic_search/basic_context.py similarity index 73% rename from graphrag/query/structured_search/basic_search/basic_context.py rename to packages/graphrag/graphrag/query/structured_search/basic_search/basic_context.py index 8296de3c89..a6338cf1b0 100644 --- a/graphrag/query/structured_search/basic_search/basic_context.py +++ b/packages/graphrag/graphrag/query/structured_search/basic_search/basic_context.py @@ -4,20 +4,22 @@ """Basic Context Builder implementation.""" import logging -from typing import cast +from typing import TYPE_CHECKING, cast import pandas as pd +from graphrag_llm.tokenizer import Tokenizer +from graphrag_vectors import VectorStore from graphrag.data_model.text_unit import TextUnit -from graphrag.language_model.protocol.base import EmbeddingModel from graphrag.query.context_builder.builders import ( BasicContextBuilder, ContextBuilderResult, ) from graphrag.query.context_builder.conversation_history import ConversationHistory from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer -from graphrag.vector_stores.base import BaseVectorStore + +if TYPE_CHECKING: + from graphrag_llm.embedding import LLMEmbedding logger = logging.getLogger(__name__) @@ -27,8 +29,8 @@ class BasicSearchContext(BasicContextBuilder): def __init__( self, - text_embedder: EmbeddingModel, - text_unit_embeddings: BaseVectorStore, + text_embedder: "LLMEmbedding", + text_unit_embeddings: VectorStore, text_units: list[TextUnit] | None = None, tokenizer: Tokenizer | None = None, embedding_vectorstore_key: str = "id", @@ -38,7 +40,6 @@ def __init__( self.text_units = text_units self.text_unit_embeddings = text_unit_embeddings self.embedding_vectorstore_key = embedding_vectorstore_key - self.text_id_map = self._map_ids() def build_context( self, @@ -48,7 +49,7 @@ def build_context( max_context_tokens: int = 12_000, context_name: str = "Sources", column_delimiter: str = "|", - text_id_col: str = "source_id", + text_id_col: str = "id", text_col: str = "text", **kwargs, ) -> ContextBuilderResult: @@ -56,17 +57,20 @@ def build_context( if query != "": related_texts = self.text_unit_embeddings.similarity_search_by_text( text=query, - text_embedder=lambda t: self.text_embedder.embed(t), + text_embedder=lambda t: ( + self.text_embedder.embedding(input=[t]).first_embedding + ), k=k, ) - related_text_list = [ - { - text_id_col: self.text_id_map[f"{chunk.document.id}"], - text_col: chunk.document.text, - } - for chunk in related_texts + + text_unit_ids = {t.document.id for t in related_texts} + text_units_filtered = [] + text_units_filtered = [ + {text_id_col: t.short_id, text_col: t.text} + for t in self.text_units or [] + if t.id in text_unit_ids ] - related_text_df = pd.DataFrame(related_text_list) + related_text_df = pd.DataFrame(text_units_filtered) else: related_text_df = pd.DataFrame({ text_id_col: [], @@ -101,13 +105,5 @@ def build_context( return ContextBuilderResult( context_chunks=final_text, - context_records={context_name: final_text_df}, + context_records={context_name.lower(): final_text_df}, ) - - def _map_ids(self) -> dict[str, str]: - """Map id to short id in the text units.""" - id_map = {} - text_units = self.text_units or [] - for unit in text_units: - id_map[unit.id] = unit.short_id - return id_map diff --git a/graphrag/query/structured_search/basic_search/search.py b/packages/graphrag/graphrag/query/structured_search/basic_search/search.py similarity index 75% rename from graphrag/query/structured_search/basic_search/search.py rename to packages/graphrag/graphrag/query/structured_search/basic_search/search.py index ce5f656845..a8672fb4e8 100644 --- a/graphrag/query/structured_search/basic_search/search.py +++ b/packages/graphrag/graphrag/query/structured_search/basic_search/search.py @@ -5,18 +5,23 @@ import logging import time -from collections.abc import AsyncGenerator -from typing import Any +from collections.abc import AsyncGenerator, AsyncIterator +from typing import TYPE_CHECKING, Any + +from graphrag_llm.tokenizer import Tokenizer +from graphrag_llm.utils import CompletionMessagesBuilder from graphrag.callbacks.query_callbacks import QueryCallbacks -from graphrag.language_model.protocol.base import ChatModel from graphrag.prompts.query.basic_search_system_prompt import ( BASIC_SEARCH_SYSTEM_PROMPT, ) from graphrag.query.context_builder.builders import BasicContextBuilder from graphrag.query.context_builder.conversation_history import ConversationHistory from graphrag.query.structured_search.base import BaseSearch, SearchResult -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionChunk logger = logging.getLogger(__name__) """ @@ -29,7 +34,7 @@ class BasicSearch(BaseSearch[BasicContextBuilder]): def __init__( self, - model: ChatModel, + model: "LLMCompletion", context_builder: BasicContextBuilder, tokenizer: Tokenizer | None = None, system_prompt: str | None = None, @@ -77,19 +82,28 @@ async def search( context_data=context_result.context_chunks, response_type=self.response_type, ) - search_messages = [ - {"role": "system", "content": search_prompt}, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) response = "" - async for chunk in self.model.achat_stream( - prompt=query, - history=search_messages, - model_parameters=self.model_params, - ): + + response_stream: AsyncIterator[LLMCompletionChunk] = ( + self.model.completion_async( + messages=messages_builder.build(), + stream=True, + **self.model_params, + ) + ) # type: ignore + + async for chunk in response_stream: + response_text = chunk.choices[0].delta.content or "" for callback in self.callbacks: - callback.on_llm_new_token(chunk) - response += chunk + callback.on_llm_new_token(response_text) + response += response_text llm_calls["response"] = 1 prompt_tokens["response"] = len(self.tokenizer.encode(search_prompt)) @@ -143,18 +157,26 @@ async def stream_search( search_prompt = self.system_prompt.format( context_data=context_result.context_chunks, response_type=self.response_type ) - search_messages = [ - {"role": "system", "content": search_prompt}, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) for callback in self.callbacks: callback.on_context(context_result.context_records) - async for chunk_response in self.model.achat_stream( - prompt=query, - history=search_messages, - model_parameters=self.model_params, - ): + response_stream: AsyncIterator[ + LLMCompletionChunk + ] = await self.model.completion_async( + messages=messages_builder.build(), + stream=True, + **self.model_params, + ) # type: ignore + + async for chunk in response_stream: + response_text = chunk.choices[0].delta.content or "" for callback in self.callbacks: - callback.on_llm_new_token(chunk_response) - yield chunk_response + callback.on_llm_new_token(response_text) + yield response_text diff --git a/graphrag/query/structured_search/drift_search/__init__.py b/packages/graphrag/graphrag/query/structured_search/drift_search/__init__.py similarity index 100% rename from graphrag/query/structured_search/drift_search/__init__.py rename to packages/graphrag/graphrag/query/structured_search/drift_search/__init__.py diff --git a/graphrag/query/structured_search/drift_search/action.py b/packages/graphrag/graphrag/query/structured_search/drift_search/action.py similarity index 96% rename from graphrag/query/structured_search/drift_search/action.py rename to packages/graphrag/graphrag/query/structured_search/drift_search/action.py index 8f1da3d721..23cc811a39 100644 --- a/graphrag/query/structured_search/drift_search/action.py +++ b/packages/graphrag/graphrag/query/structured_search/drift_search/action.py @@ -50,7 +50,13 @@ def is_complete(self) -> bool: """Check if the action is complete (i.e., an answer is available).""" return self.answer is not None - async def search(self, search_engine: Any, global_query: str, scorer: Any = None): + async def search( + self, + search_engine: Any, + global_query: str, + k_followups: int, + scorer: Any = None, + ): """ Execute an asynchronous search using the search engine, and update the action with the results. @@ -71,7 +77,9 @@ async def search(self, search_engine: Any, global_query: str, scorer: Any = None return self search_result = await search_engine.search( - drift_query=global_query, query=self.query + query=self.query, + drift_query=global_query, + k_followups=k_followups, ) # Do not launch exception as it will roll up with other steps diff --git a/graphrag/query/structured_search/drift_search/drift_context.py b/packages/graphrag/graphrag/query/structured_search/drift_search/drift_context.py similarity index 93% rename from graphrag/query/structured_search/drift_search/drift_context.py rename to packages/graphrag/graphrag/query/structured_search/drift_search/drift_context.py index 4b4325ae2e..bacc39cf99 100644 --- a/graphrag/query/structured_search/drift_search/drift_context.py +++ b/packages/graphrag/graphrag/query/structured_search/drift_search/drift_context.py @@ -5,10 +5,12 @@ import logging from dataclasses import asdict -from typing import Any +from typing import TYPE_CHECKING, Any import numpy as np import pandas as pd +from graphrag_llm.tokenizer import Tokenizer +from graphrag_vectors import VectorStore from graphrag.config.models.drift_search_config import DRIFTSearchConfig from graphrag.data_model.community_report import CommunityReport @@ -16,7 +18,6 @@ from graphrag.data_model.entity import Entity from graphrag.data_model.relationship import Relationship from graphrag.data_model.text_unit import TextUnit -from graphrag.language_model.protocol.base import ChatModel, EmbeddingModel from graphrag.prompts.query.drift_search_system_prompt import ( DRIFT_LOCAL_SYSTEM_PROMPT, DRIFT_REDUCE_PROMPT, @@ -27,9 +28,10 @@ from graphrag.query.structured_search.local_search.mixed_context import ( LocalSearchMixedContext, ) -from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer -from graphrag.vector_stores.base import BaseVectorStore + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.embedding import LLMEmbedding logger = logging.getLogger(__name__) @@ -39,27 +41,27 @@ class DRIFTSearchContextBuilder(DRIFTContextBuilder): def __init__( self, - model: ChatModel, - text_embedder: EmbeddingModel, + model: "LLMCompletion", + config: DRIFTSearchConfig, + text_embedder: "LLMEmbedding", entities: list[Entity], - entity_text_embeddings: BaseVectorStore, + entity_text_embeddings: VectorStore, text_units: list[TextUnit] | None = None, reports: list[CommunityReport] | None = None, relationships: list[Relationship] | None = None, covariates: dict[str, list[Covariate]] | None = None, tokenizer: Tokenizer | None = None, embedding_vectorstore_key: str = EntityVectorStoreKey.ID, - config: DRIFTSearchConfig | None = None, local_system_prompt: str | None = None, local_mixed_context: LocalSearchMixedContext | None = None, reduce_system_prompt: str | None = None, response_type: str | None = None, ): """Initialize the DRIFT search context builder with necessary components.""" - self.config = config or DRIFTSearchConfig() + self.config = config self.model = model self.text_embedder = text_embedder - self.tokenizer = tokenizer or get_tokenizer() + self.tokenizer = tokenizer or model.tokenizer self.local_system_prompt = local_system_prompt or DRIFT_LOCAL_SYSTEM_PROMPT self.reduce_system_prompt = reduce_system_prompt or DRIFT_REDUCE_PROMPT diff --git a/graphrag/query/structured_search/drift_search/primer.py b/packages/graphrag/graphrag/query/structured_search/drift_search/primer.py similarity index 74% rename from graphrag/query/structured_search/drift_search/primer.py rename to packages/graphrag/graphrag/query/structured_search/drift_search/primer.py index 2a7f145711..36723064db 100644 --- a/graphrag/query/structured_search/drift_search/primer.py +++ b/packages/graphrag/graphrag/query/structured_search/drift_search/primer.py @@ -3,35 +3,53 @@ """Primer for DRIFT search.""" -import json import logging import secrets import time +from typing import TYPE_CHECKING import numpy as np import pandas as pd +from graphrag_llm.tokenizer import Tokenizer +from pydantic import BaseModel, Field from tqdm.asyncio import tqdm_asyncio from graphrag.config.models.drift_search_config import DRIFTSearchConfig from graphrag.data_model.community_report import CommunityReport -from graphrag.language_model.protocol.base import ChatModel, EmbeddingModel from graphrag.prompts.query.drift_search_system_prompt import ( DRIFT_PRIMER_PROMPT, ) from graphrag.query.structured_search.base import SearchResult -from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.embedding import LLMEmbedding + from graphrag_llm.types import LLMCompletionResponse logger = logging.getLogger(__name__) +class PrimerResponse(BaseModel): + """Response model for the primer.""" + + intermediate_answer: str = Field( + description="This answer should match the level of detail and length found in the community summaries. The intermediate answer should be exactly 2000 characters long. This must be formatted in markdown and must begin with a header that explains how the following text is related to the query.", + ) + score: int = Field( + description="A score on how well the intermediate answer addresses the query. A score of 0 indicates a poor, unfocused answer, while a score of 100 indicates a highly focused, relevant answer that addresses the query in its entirety." + ) + follow_up_queries: list[str] = Field( + description="A list of follow-up queries that could be asked to further explore the topic. These should be formatted as a list of strings. Generate at least five good follow-up queries." + ) + + class PrimerQueryProcessor: """Process the query by expanding it using community reports and generate follow-up actions.""" def __init__( self, - chat_model: ChatModel, - text_embedder: EmbeddingModel, + chat_model: "LLMCompletion", + text_embedder: "LLMEmbedding", reports: list[CommunityReport], tokenizer: Tokenizer | None = None, ): @@ -46,7 +64,7 @@ def __init__( """ self.chat_model = chat_model self.text_embedder = text_embedder - self.tokenizer = tokenizer or get_tokenizer() + self.tokenizer = tokenizer or chat_model.tokenizer self.reports = reports async def expand_query(self, query: str) -> tuple[str, dict[str, int]]: @@ -67,8 +85,10 @@ async def expand_query(self, query: str) -> tuple[str, dict[str, int]]: {template}\n" Ensure that the hypothetical answer does not reference new named entities that are not present in the original query.""" - model_response = await self.chat_model.achat(prompt) - text = model_response.output.content + model_response: LLMCompletionResponse = await self.chat_model.completion_async( + messages=prompt + ) # type: ignore + text = model_response.content prompt_tokens = len(self.tokenizer.encode(prompt)) output_tokens = len(self.tokenizer.encode(text)) @@ -95,7 +115,9 @@ async def __call__(self, query: str) -> tuple[list[float], dict[str, int]]: """ hyde_query, token_ct = await self.expand_query(query) logger.debug("Expanded query: %s", hyde_query) - return self.text_embedder.embed(hyde_query), token_ct + return self.text_embedder.embedding( + input=[hyde_query] + ).first_embedding, token_ct class DRIFTPrimer: @@ -104,7 +126,7 @@ class DRIFTPrimer: def __init__( self, config: DRIFTSearchConfig, - chat_model: ChatModel, + chat_model: "LLMCompletion", tokenizer: Tokenizer | None = None, ): """ @@ -117,7 +139,7 @@ def __init__( """ self.chat_model = chat_model self.config = config - self.tokenizer = tokenizer or get_tokenizer() + self.tokenizer = tokenizer or chat_model.tokenizer async def decompose_query( self, query: str, reports: pd.DataFrame @@ -137,15 +159,18 @@ async def decompose_query( prompt = DRIFT_PRIMER_PROMPT.format( query=query, community_reports=community_reports ) - model_response = await self.chat_model.achat(prompt, json=True) - response = model_response.output.content + model_response: LLMCompletionResponse[ + PrimerResponse + ] = await self.chat_model.completion_async( + messages=prompt, response_format=PrimerResponse + ) # type: ignore - parsed_response = json.loads(response) + parsed_response = model_response.formatted_response.model_dump() # type: ignore token_ct = { "llm_calls": 1, "prompt_tokens": len(self.tokenizer.encode(prompt)), - "output_tokens": len(self.tokenizer.encode(response)), + "output_tokens": len(self.tokenizer.encode(model_response.content)), } return parsed_response, token_ct diff --git a/graphrag/query/structured_search/drift_search/search.py b/packages/graphrag/graphrag/query/structured_search/drift_search/search.py similarity index 87% rename from graphrag/query/structured_search/drift_search/search.py rename to packages/graphrag/graphrag/query/structured_search/drift_search/search.py index ab1c85ccdb..070c5b5519 100644 --- a/graphrag/query/structured_search/drift_search/search.py +++ b/packages/graphrag/graphrag/query/structured_search/drift_search/search.py @@ -5,16 +5,17 @@ import logging import time -from collections.abc import AsyncGenerator -from typing import Any +from collections.abc import AsyncGenerator, AsyncIterator +from typing import TYPE_CHECKING, Any +from graphrag_llm.tokenizer import Tokenizer +from graphrag_llm.utils import ( + CompletionMessagesBuilder, + gather_completion_response_async, +) from tqdm.asyncio import tqdm_asyncio from graphrag.callbacks.query_callbacks import QueryCallbacks -from graphrag.language_model.protocol.base import ChatModel -from graphrag.language_model.providers.fnllm.utils import ( - get_openai_model_parameters_from_dict, -) from graphrag.query.context_builder.conversation_history import ConversationHistory from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey from graphrag.query.structured_search.base import BaseSearch, SearchResult @@ -25,8 +26,10 @@ from graphrag.query.structured_search.drift_search.primer import DRIFTPrimer from graphrag.query.structured_search.drift_search.state import QueryState from graphrag.query.structured_search.local_search.search import LocalSearch -from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionChunk logger = logging.getLogger(__name__) @@ -36,7 +39,7 @@ class DRIFTSearch(BaseSearch[DRIFTSearchContextBuilder]): def __init__( self, - model: ChatModel, + model: "LLMCompletion", context_builder: DRIFTSearchContextBuilder, tokenizer: Tokenizer | None = None, query_state: QueryState | None = None, @@ -55,7 +58,7 @@ def __init__( super().__init__(model, context_builder, tokenizer) self.context_builder = context_builder - self.tokenizer = tokenizer or get_tokenizer() + self.tokenizer = tokenizer or model.tokenizer self.query_state = query_state or QueryState() self.primer = DRIFTPrimer( config=self.context_builder.config, @@ -86,15 +89,13 @@ def init_local_search(self) -> LocalSearch: "max_context_tokens": self.context_builder.config.local_search_max_data_tokens, } - model_params = get_openai_model_parameters_from_dict({ - "model": self.model.config.model, - "max_tokens": self.context_builder.config.local_search_llm_max_gen_tokens, + model_params = { "temperature": self.context_builder.config.local_search_temperature, "n": self.context_builder.config.local_search_n, "top_p": self.context_builder.config.local_search_top_p, "max_completion_tokens": self.context_builder.config.local_search_llm_max_gen_completion_tokens, - "response_format": {"type": "json_object"}, - }) + "response_format_json_object": True, + } return LocalSearch( model=self.model, @@ -156,7 +157,11 @@ def _process_primer_results( raise ValueError(error_msg) async def _search_step( - self, global_query: str, search_engine: LocalSearch, actions: list[DriftAction] + self, + global_query: str, + k_followups: int, + search_engine: LocalSearch, + actions: list[DriftAction], ) -> list[DriftAction]: """ Perform an asynchronous search step by executing each DriftAction asynchronously. @@ -171,7 +176,11 @@ async def _search_step( list[DriftAction]: The results from executing the search actions asynchronously. """ tasks = [ - action.search(search_engine=search_engine, global_query=global_query) + action.search( + search_engine=search_engine, + global_query=global_query, + k_followups=k_followups, + ) for action in actions ] return await tqdm_asyncio.gather(*tasks, leave=False) @@ -241,7 +250,10 @@ async def search( ) # Process actions results = await self._search_step( - global_query=query, search_engine=self.local_search, actions=actions + global_query=query, + k_followups=self.context_builder.config.drift_k_followups, + search_engine=self.local_search, + actions=actions, ) # Update query state @@ -269,12 +281,10 @@ async def search( for callback in self.callbacks: callback.on_reduce_response_start(response_state) - model_params = get_openai_model_parameters_from_dict({ - "model": self.model.config.model, - "max_tokens": self.context_builder.config.reduce_max_tokens, + model_params = { "temperature": self.context_builder.config.reduce_temperature, "max_completion_tokens": self.context_builder.config.reduce_max_completion_tokens, - }) + } reduced_response = await self._reduce_response( responses=response_state, @@ -320,12 +330,10 @@ async def stream_search( for callback in self.callbacks: callback.on_reduce_response_start(result.response) - model_params = get_openai_model_parameters_from_dict({ - "model": self.model.config.model, - "max_tokens": self.context_builder.config.reduce_max_tokens, + model_params = { "temperature": self.context_builder.config.reduce_temperature, "max_completion_tokens": self.context_builder.config.reduce_max_completion_tokens, - }) + } full_response = "" async for resp in self._reduce_response_streaming( @@ -379,17 +387,19 @@ async def _reduce_response( context_data=reduce_responses, response_type=self.context_builder.response_type, ) - search_messages = [ - {"role": "system", "content": search_prompt}, - ] - model_response = await self.model.achat( - prompt=query, - history=search_messages, - model_parameters=llm_kwargs.get("model_params", {}), + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) + + model_response = await self.model.completion_async( + messages=messages_builder.build(), + **llm_kwargs.get("model_params", {}), ) - reduced_response = model_response.output.content + reduced_response = await gather_completion_response_async(model_response) llm_calls["reduce"] = 1 prompt_tokens["reduce"] = len(self.tokenizer.encode(search_prompt)) + len( @@ -434,15 +444,21 @@ async def _reduce_response_streaming( context_data=reduce_responses, response_type=self.context_builder.response_type, ) - search_messages = [ - {"role": "system", "content": search_prompt}, - ] - async for response in self.model.achat_stream( - prompt=query, - history=search_messages, - model_parameters=model_params, - ): + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) + + response_search: AsyncIterator[ + LLMCompletionChunk + ] = await self.model.completion_async( + messages=messages_builder.build(), stream=True, **model_params + ) # type: ignore + + async for chunk in response_search: + response_text = chunk.choices[0].delta.content or "" for callback in self.callbacks: - callback.on_llm_new_token(response) - yield response + callback.on_llm_new_token(response_text) + yield response_text diff --git a/graphrag/query/structured_search/drift_search/state.py b/packages/graphrag/graphrag/query/structured_search/drift_search/state.py similarity index 100% rename from graphrag/query/structured_search/drift_search/state.py rename to packages/graphrag/graphrag/query/structured_search/drift_search/state.py diff --git a/graphrag/query/structured_search/global_search/__init__.py b/packages/graphrag/graphrag/query/structured_search/global_search/__init__.py similarity index 100% rename from graphrag/query/structured_search/global_search/__init__.py rename to packages/graphrag/graphrag/query/structured_search/global_search/__init__.py diff --git a/graphrag/query/structured_search/global_search/community_context.py b/packages/graphrag/graphrag/query/structured_search/global_search/community_context.py similarity index 99% rename from graphrag/query/structured_search/global_search/community_context.py rename to packages/graphrag/graphrag/query/structured_search/global_search/community_context.py index 1709aab1a8..eb63073095 100644 --- a/graphrag/query/structured_search/global_search/community_context.py +++ b/packages/graphrag/graphrag/query/structured_search/global_search/community_context.py @@ -5,6 +5,8 @@ from typing import Any +from graphrag_llm.tokenizer import Tokenizer + from graphrag.data_model.community import Community from graphrag.data_model.community_report import CommunityReport from graphrag.data_model.entity import Entity @@ -20,7 +22,6 @@ ) from graphrag.query.structured_search.base import GlobalContextBuilder from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer class GlobalCommunityContext(GlobalContextBuilder): diff --git a/graphrag/query/structured_search/global_search/search.py b/packages/graphrag/graphrag/query/structured_search/global_search/search.py similarity index 88% rename from graphrag/query/structured_search/global_search/search.py rename to packages/graphrag/graphrag/query/structured_search/global_search/search.py index 86b95d0088..b84043dbde 100644 --- a/graphrag/query/structured_search/global_search/search.py +++ b/packages/graphrag/graphrag/query/structured_search/global_search/search.py @@ -7,14 +7,18 @@ import json import logging import time -from collections.abc import AsyncGenerator +from collections.abc import AsyncGenerator, AsyncIterator from dataclasses import dataclass -from typing import Any +from typing import TYPE_CHECKING, Any import pandas as pd +from graphrag_llm.tokenizer import Tokenizer +from graphrag_llm.utils import ( + CompletionMessagesBuilder, + gather_completion_response_async, +) from graphrag.callbacks.query_callbacks import QueryCallbacks -from graphrag.language_model.protocol.base import ChatModel from graphrag.prompts.query.global_search_knowledge_system_prompt import ( GENERAL_KNOWLEDGE_INSTRUCTION, ) @@ -31,7 +35,10 @@ ) from graphrag.query.llm.text_utils import try_parse_json_object from graphrag.query.structured_search.base import BaseSearch, SearchResult -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionChunk logger = logging.getLogger(__name__) @@ -50,7 +57,7 @@ class GlobalSearch(BaseSearch[GlobalContextBuilder]): def __init__( self, - model: ChatModel, + model: "LLMCompletion", context_builder: GlobalContextBuilder, tokenizer: Tokenizer | None = None, map_system_prompt: str | None = None, @@ -87,7 +94,7 @@ def __init__( self.map_llm_params = map_llm_params if map_llm_params else {} self.reduce_llm_params = reduce_llm_params if reduce_llm_params else {} if json_mode: - self.map_llm_params["response_format"] = {"type": "json_object"} + self.map_llm_params["response_format_json_object"] = True else: # remove response_format key if json_mode is False self.map_llm_params.pop("response_format", None) @@ -220,17 +227,20 @@ async def _map_response_single_batch( search_prompt = self.map_system_prompt.format( context_data=context_data, max_length=max_length ) - search_messages = [ - {"role": "system", "content": search_prompt}, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) + async with self.semaphore: - model_response = await self.model.achat( - prompt=query, - history=search_messages, - model_parameters=llm_kwargs, - json=True, + model_response = await self.model.completion_async( + messages=messages_builder.build(), + response_format_json_object=True, + **llm_kwargs, ) - search_response = model_response.output.content + search_response = await gather_completion_response_async(model_response) logger.debug("Map response: %s", search_response) try: # parse search response json @@ -376,20 +386,28 @@ async def _reduce_response( ) if self.allow_general_knowledge: search_prompt += "\n" + self.general_knowledge_inclusion_prompt - search_messages = [ - {"role": "system", "content": search_prompt}, - {"role": "user", "content": query}, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) search_response = "" - async for chunk_response in self.model.achat_stream( - prompt=query, - history=search_messages, - model_parameters=llm_kwargs, - ): - search_response += chunk_response + + response_search: AsyncIterator[ + LLMCompletionChunk + ] = await self.model.completion_async( + messages=messages_builder.build(), + stream=True, + **llm_kwargs, + ) # type: ignore + + async for chunk in response_search: + response_text = chunk.choices[0].delta.content or "" + search_response += response_text for callback in self.callbacks: - callback.on_llm_new_token(chunk_response) + callback.on_llm_new_token(response_text) return SearchResult( response=search_response, @@ -481,15 +499,23 @@ async def _stream_reduce_response( ) if self.allow_general_knowledge: search_prompt += "\n" + self.general_knowledge_inclusion_prompt - search_messages = [ - {"role": "system", "content": search_prompt}, - ] - async for chunk_response in self.model.achat_stream( - prompt=query, - history=search_messages, - **llm_kwargs, - ): + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) + + response_search: AsyncIterator[ + LLMCompletionChunk + ] = await self.model.completion_async( + messages=messages_builder.build(), + stream=True, + **llm_kwargs.get("model_parameters", {}), + ) # type: ignore + + async for chunk in response_search: + response_text = chunk.choices[0].delta.content or "" for callback in self.callbacks: - callback.on_llm_new_token(chunk_response) - yield chunk_response + callback.on_llm_new_token(response_text) + yield response_text diff --git a/graphrag/query/structured_search/local_search/__init__.py b/packages/graphrag/graphrag/query/structured_search/local_search/__init__.py similarity index 100% rename from graphrag/query/structured_search/local_search/__init__.py rename to packages/graphrag/graphrag/query/structured_search/local_search/__init__.py diff --git a/graphrag/query/structured_search/local_search/mixed_context.py b/packages/graphrag/graphrag/query/structured_search/local_search/mixed_context.py similarity index 97% rename from graphrag/query/structured_search/local_search/mixed_context.py rename to packages/graphrag/graphrag/query/structured_search/local_search/mixed_context.py index 1ee8973fc4..34d8cf7d93 100644 --- a/graphrag/query/structured_search/local_search/mixed_context.py +++ b/packages/graphrag/graphrag/query/structured_search/local_search/mixed_context.py @@ -4,16 +4,17 @@ import logging from copy import deepcopy -from typing import Any +from typing import TYPE_CHECKING, Any import pandas as pd +from graphrag_llm.tokenizer import Tokenizer +from graphrag_vectors import VectorStore from graphrag.data_model.community_report import CommunityReport from graphrag.data_model.covariate import Covariate from graphrag.data_model.entity import Entity from graphrag.data_model.relationship import Relationship from graphrag.data_model.text_unit import TextUnit -from graphrag.language_model.protocol.base import EmbeddingModel from graphrag.query.context_builder.builders import ContextBuilderResult from graphrag.query.context_builder.community_context import ( build_community_context, @@ -41,8 +42,9 @@ from graphrag.query.input.retrieval.text_units import get_candidate_text_units from graphrag.query.structured_search.base import LocalContextBuilder from graphrag.tokenizer.get_tokenizer import get_tokenizer -from graphrag.tokenizer.tokenizer import Tokenizer -from graphrag.vector_stores.base import BaseVectorStore + +if TYPE_CHECKING: + from graphrag_llm.embedding import LLMEmbedding logger = logging.getLogger(__name__) @@ -53,8 +55,8 @@ class LocalSearchMixedContext(LocalContextBuilder): def __init__( self, entities: list[Entity], - entity_text_embeddings: BaseVectorStore, - text_embedder: EmbeddingModel, + entity_text_embeddings: VectorStore, + text_embedder: "LLMEmbedding", text_units: list[TextUnit] | None = None, community_reports: list[CommunityReport] | None = None, relationships: list[Relationship] | None = None, @@ -84,10 +86,6 @@ def __init__( self.tokenizer = tokenizer or get_tokenizer() self.embedding_vectorstore_key = embedding_vectorstore_key - def filter_by_entity_keys(self, entity_keys: list[int] | list[str]): - """Filter entity text embeddings by entity keys.""" - self.entity_text_embeddings.filter_by_id(entity_keys) - def build_context( self, query: str, diff --git a/graphrag/query/structured_search/local_search/search.py b/packages/graphrag/graphrag/query/structured_search/local_search/search.py similarity index 75% rename from graphrag/query/structured_search/local_search/search.py rename to packages/graphrag/graphrag/query/structured_search/local_search/search.py index fdd72949da..728bbcc246 100644 --- a/graphrag/query/structured_search/local_search/search.py +++ b/packages/graphrag/graphrag/query/structured_search/local_search/search.py @@ -5,11 +5,13 @@ import logging import time -from collections.abc import AsyncGenerator -from typing import Any +from collections.abc import AsyncGenerator, AsyncIterator +from typing import TYPE_CHECKING, Any + +from graphrag_llm.tokenizer import Tokenizer +from graphrag_llm.utils import CompletionMessagesBuilder from graphrag.callbacks.query_callbacks import QueryCallbacks -from graphrag.language_model.protocol.base import ChatModel from graphrag.prompts.query.local_search_system_prompt import ( LOCAL_SEARCH_SYSTEM_PROMPT, ) @@ -18,7 +20,10 @@ ConversationHistory, ) from graphrag.query.structured_search.base import BaseSearch, SearchResult -from graphrag.tokenizer.tokenizer import Tokenizer + +if TYPE_CHECKING: + from graphrag_llm.completion import LLMCompletion + from graphrag_llm.types import LLMCompletionChunk logger = logging.getLogger(__name__) @@ -28,7 +33,7 @@ class LocalSearch(BaseSearch[LocalContextBuilder]): def __init__( self, - model: ChatModel, + model: "LLMCompletion", context_builder: LocalContextBuilder, tokenizer: Tokenizer | None = None, system_prompt: str | None = None, @@ -76,26 +81,35 @@ async def search( context_data=context_result.context_chunks, response_type=self.response_type, global_query=drift_query, + followups=kwargs.get("k_followups", 0), ) else: search_prompt = self.system_prompt.format( context_data=context_result.context_chunks, response_type=self.response_type, ) - history_messages = [ - {"role": "system", "content": search_prompt}, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) full_response = "" - async for response in self.model.achat_stream( - prompt=query, - history=history_messages, - model_parameters=self.model_params, - ): - full_response += response + response: AsyncIterator[ + LLMCompletionChunk + ] = await self.model.completion_async( + messages=messages_builder.build(), + stream=True, + **self.model_params, + ) # type: ignore + + async for chunk in response: + response_text = chunk.choices[0].delta.content or "" + full_response += response_text for callback in self.callbacks: - callback.on_llm_new_token(response) + callback.on_llm_new_token(response_text) llm_calls["response"] = 1 prompt_tokens["response"] = len(self.tokenizer.encode(search_prompt)) @@ -146,18 +160,24 @@ async def stream_search( search_prompt = self.system_prompt.format( context_data=context_result.context_chunks, response_type=self.response_type ) - history_messages = [ - {"role": "system", "content": search_prompt}, - ] + + messages_builder = ( + CompletionMessagesBuilder() + .add_system_message(search_prompt) + .add_user_message(query) + ) for callback in self.callbacks: callback.on_context(context_result.context_records) - async for response in self.model.achat_stream( - prompt=query, - history=history_messages, - model_parameters=self.model_params, - ): + response: AsyncIterator[LLMCompletionChunk] = await self.model.completion_async( + messages=messages_builder.build(), + stream=True, + **self.model_params, + ) # type: ignore + + async for chunk in response: + response_text = chunk.choices[0].delta.content or "" for callback in self.callbacks: - callback.on_llm_new_token(response) - yield response + callback.on_llm_new_token(response_text) + yield response_text diff --git a/graphrag/tokenizer/__init__.py b/packages/graphrag/graphrag/tokenizer/__init__.py similarity index 100% rename from graphrag/tokenizer/__init__.py rename to packages/graphrag/graphrag/tokenizer/__init__.py diff --git a/graphrag/tokenizer/get_tokenizer.py b/packages/graphrag/graphrag/tokenizer/get_tokenizer.py similarity index 56% rename from graphrag/tokenizer/get_tokenizer.py rename to packages/graphrag/graphrag/tokenizer/get_tokenizer.py index 5d1ef40f0c..ed1ffec99c 100644 --- a/graphrag/tokenizer/get_tokenizer.py +++ b/packages/graphrag/graphrag/tokenizer/get_tokenizer.py @@ -3,16 +3,15 @@ """Get Tokenizer.""" +from graphrag_llm.config import ModelConfig, TokenizerConfig, TokenizerType +from graphrag_llm.tokenizer import Tokenizer, create_tokenizer + from graphrag.config.defaults import ENCODING_MODEL -from graphrag.config.models.language_model_config import LanguageModelConfig -from graphrag.tokenizer.litellm_tokenizer import LitellmTokenizer -from graphrag.tokenizer.tiktoken_tokenizer import TiktokenTokenizer -from graphrag.tokenizer.tokenizer import Tokenizer def get_tokenizer( - model_config: LanguageModelConfig | None = None, - encoding_model: str = ENCODING_MODEL, + model_config: "ModelConfig | None" = None, + encoding_model: str | None = None, ) -> Tokenizer: """ Get the tokenizer for the given model configuration or fallback to a tiktoken based tokenizer. @@ -32,10 +31,18 @@ def get_tokenizer( An instance of a Tokenizer. """ if model_config is not None: - if model_config.encoding_model.strip() != "": - # User has manually specified a tiktoken encoding model to use for the provided model configuration. - return TiktokenTokenizer(encoding_name=model_config.encoding_model) - - return LitellmTokenizer(model_name=model_config.model) - - return TiktokenTokenizer(encoding_name=encoding_model) + return create_tokenizer( + TokenizerConfig( + type=TokenizerType.LiteLLM, + model_id=f"{model_config.model_provider}/{model_config.model}", + ) + ) + + if encoding_model is None: + encoding_model = ENCODING_MODEL + return create_tokenizer( + TokenizerConfig( + type=TokenizerType.Tiktoken, + encoding_name=encoding_model, + ) + ) diff --git a/graphrag/utils/__init__.py b/packages/graphrag/graphrag/utils/__init__.py similarity index 100% rename from graphrag/utils/__init__.py rename to packages/graphrag/graphrag/utils/__init__.py diff --git a/packages/graphrag/graphrag/utils/api.py b/packages/graphrag/graphrag/utils/api.py new file mode 100644 index 0000000000..980997db06 --- /dev/null +++ b/packages/graphrag/graphrag/utils/api.py @@ -0,0 +1,75 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""API functions for the GraphRAG module.""" + +from pathlib import Path + +from graphrag_vectors import ( + VectorStore, + VectorStoreConfig, + create_vector_store, +) + + +def get_embedding_store( + config: VectorStoreConfig, + embedding_name: str, +) -> VectorStore: + """Get the embedding store.""" + embedding_store = create_vector_store(config, config.index_schema[embedding_name]) + embedding_store.connect() + + return embedding_store + + +def reformat_context_data(context_data: dict) -> dict: + """ + Reformats context_data for all query responses. + + Reformats a dictionary of dataframes into a dictionary of lists. + One list entry for each record. Records are grouped by original + dictionary keys. + + Note: depending on which query algorithm is used, the context_data may not + contain the same information (keys). In this case, the default behavior will be to + set these keys as empty lists to preserve a standard output format. + """ + final_format = { + "reports": [], + "entities": [], + "relationships": [], + "claims": [], + "sources": [], + } + for key in context_data: + records = ( + context_data[key].to_dict(orient="records") + if context_data[key] is not None and not isinstance(context_data[key], dict) + else context_data[key] + ) + if len(records) < 1: + continue + final_format[key] = records + return final_format + + +def load_search_prompt(prompt_config: str | None) -> str | None: + """ + Load the search prompt from disk if configured. + + If not, leave it empty - the search functions will load their defaults. + + """ + if prompt_config: + prompt_file = Path(prompt_config).resolve() + if prompt_file.exists(): + return prompt_file.read_bytes().decode(encoding="utf-8") + return None + + +def truncate(text: str, max_length: int) -> str: + """Truncate a string to a maximum length.""" + if len(text) <= max_length: + return text + return text[:max_length] + "...[truncated]" diff --git a/graphrag/utils/cli.py b/packages/graphrag/graphrag/utils/cli.py similarity index 100% rename from graphrag/utils/cli.py rename to packages/graphrag/graphrag/utils/cli.py diff --git a/graphrag/utils/storage.py b/packages/graphrag/graphrag/utils/storage.py similarity index 73% rename from graphrag/utils/storage.py rename to packages/graphrag/graphrag/utils/storage.py index 8534330a15..852d066091 100644 --- a/graphrag/utils/storage.py +++ b/packages/graphrag/graphrag/utils/storage.py @@ -7,13 +7,12 @@ from io import BytesIO import pandas as pd - -from graphrag.storage.pipeline_storage import PipelineStorage +from graphrag_storage import Storage logger = logging.getLogger(__name__) -async def load_table_from_storage(name: str, storage: PipelineStorage) -> pd.DataFrame: +async def load_table_from_storage(name: str, storage: Storage) -> pd.DataFrame: """Load a parquet from the storage instance.""" filename = f"{name}.parquet" if not await storage.has(filename): @@ -28,17 +27,17 @@ async def load_table_from_storage(name: str, storage: PipelineStorage) -> pd.Dat async def write_table_to_storage( - table: pd.DataFrame, name: str, storage: PipelineStorage + table: pd.DataFrame, name: str, storage: Storage ) -> None: """Write a table to storage.""" await storage.set(f"{name}.parquet", table.to_parquet()) -async def delete_table_from_storage(name: str, storage: PipelineStorage) -> None: +async def delete_table_from_storage(name: str, storage: Storage) -> None: """Delete a table to storage.""" await storage.delete(f"{name}.parquet") -async def storage_has_table(name: str, storage: PipelineStorage) -> bool: +async def storage_has_table(name: str, storage: Storage) -> bool: """Check if a table exists in storage.""" return await storage.has(f"{name}.parquet") diff --git a/packages/graphrag/pyproject.toml b/packages/graphrag/pyproject.toml new file mode 100644 index 0000000000..efa1a3fd39 --- /dev/null +++ b/packages/graphrag/pyproject.toml @@ -0,0 +1,70 @@ +[project] +name = "graphrag" +# Maintainers: do not change the version here manually +version = "2.7.1" +description = "GraphRAG: A graph-based retrieval-augmented generation (RAG) system." +authors = [ + {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, + {name = "Andrés Morales Esquivel", email = "andresmor@microsoft.com"}, + {name = "Chris Trevino", email = "chtrevin@microsoft.com"}, + {name = "David Tittsworth", email = "datittsw@microsoft.com"}, + {name = "Dayenne de Souza", email = "ddesouza@microsoft.com"}, + {name = "Derek Worthen", email = "deworthe@microsoft.com"}, + {name = "Gaudy Blanco Meneses", email = "gaudyb@microsoft.com"}, + {name = "Ha Trinh", email = "trinhha@microsoft.com"}, + {name = "Jonathan Larson", email = "jolarso@microsoft.com"}, + {name = "Josh Bradley", email = "joshbradley@microsoft.com"}, + {name = "Kate Lytvynets", email = "kalytv@microsoft.com"}, + {name = "Kenny Zhang", email = "zhangken@microsoft.com"}, + {name = "Mónica Carvajal"}, + {name = "Nathan Evans", email = "naevans@microsoft.com"}, + {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, + {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, +] +license = {text = "MIT"} +readme = "README.md" +requires-python = ">=3.11,<3.14" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", +] + +dependencies = [ + "azure-identity~=1.19", + "azure-search-documents~=11.5", + "azure-storage-blob~=12.24", + "devtools~=0.12", + "graphrag-cache==2.7.1", + "graphrag-common==2.7.1", + "graphrag-input==2.7.1", + "graphrag-llm==2.7.1", + "graphrag-storage==2.7.1", + "graphrag-vectors==2.7.1", + "graspologic-native~=1.2", + "json-repair~=0.30", + "networkx~=3.4", + "nltk==3.9.1", + "numpy~=2.1", + "pandas~=2.3", + "pyarrow~=22.0", + "pydantic~=2.10", + "spacy~=3.8", + "blis~=1.0", + "textblob~=0.18", + "tqdm~=4.67", + "typing-extensions~=4.12", + "typer~=0.16", +] + +[project.scripts] +graphrag = "graphrag.cli.main:app" + +[project.urls] +Source = "https://github.com/microsoft/graphrag" + +[build-system] +requires = ["hatchling>=1.27.0,<2.0.0"] +build-backend = "hatchling.build" + diff --git a/pyproject.toml b/pyproject.toml index 890b047fec..cf3a9aebb3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] -name = "graphrag" -# Maintainers: do not change the version here manually, use ./scripts/release.sh -version = "2.7.1" +name = "graphrag-monorepo" +classifiers = ["Private :: Do Not Upload"] +version = "0.0.0" description = "GraphRAG: A graph-based retrieval-augmented generation (RAG) system." authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, @@ -21,90 +21,46 @@ authors = [ {name = "Rodrigo Racanicci", email = "rracanicci@microsoft.com"}, {name = "Sarah Smith", email = "smithsarah@microsoft.com"}, ] -license = "MIT" -readme = "README.md" -requires-python = ">=3.10,<3.13" -classifiers = [ - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", -] - -dependencies = [ - "environs>=11.0.0", - # Vector Stores - "azure-search-documents>=11.5.2", - "lancedb>=0.17.0", - # Async IO - "aiofiles>=24.1.0", - # LLM - "fnllm[azure,openai]>=0.4.1", - "json-repair>=0.30.3", - "openai>=1.68.0", - "nltk==3.9.1", - "tiktoken>=0.11.0", - # Data-Science - "numpy>=1.25.2", - "graspologic>=3.4.1", - "networkx>=3.4.2", - "pandas>=2.2.3,<3", - "pyarrow>=17.0.0", - "umap-learn>=0.5.6", - # Configuration - "pyyaml>=6.0.2", - "python-dotenv>=1.0.1", - "pydantic>=2.10.3", - "devtools>=0.12.2", - "typing-extensions>=4.12.2", - # Azure - "azure-cosmos>=4.9.0", - "azure-identity>=1.19.0", - "azure-storage-blob>=12.24.0", - "future>=1.0.0", # Needed until graspologic fixes their dependency - "typer>=0.16.0", - "tqdm>=4.67.1", - "textblob>=0.18.0.post0", - "spacy>=3.8.4", - "litellm>=1.77.1", -] +requires-python = ">=3.11,<3.14" [dependency-groups] dev = [ - "coverage>=7.6.9", - "ipykernel>=6.29.5", - "jupyter>=1.1.1", - "nbconvert>=7.16.4", - "poethepoet>=0.31.1", - "pandas-stubs>=2.3.0.250703", - "pyright>=1.1.390", - "pytest>=8.3.4", - "pytest-asyncio>=0.24.0", - "pytest-timeout>=2.3.1", - "ruff>=0.8.2", - "semversioner>=2.0.5", - "update-toml>=0.2.1", - "deptry>=0.21.1", - "mkdocs-material>=9.5.48", - "mkdocs-jupyter>=0.25.1", - "mkdocs-exclude-search>=0.6.6", - "pytest-dotenv>=0.5.2", - "mkdocs-typer>=0.0.3", + "coverage~=7.6", + "deptry~=0.21", + "ipykernel~=6.29", + "jupyter~=1.1", + "mkdocs-material~=9.5", + "mkdocs-jupyter~=0.25", + "mkdocs-exclude-search~=0.6", + "mkdocs-typer~=0.0.3", + "nbconvert~=7.16", + "pandas-stubs~=2.3", + "poethepoet~=0.31", + "pyright~=1.1", + "pytest~=8.3", + "pytest-asyncio~=0.24", + "pytest-dotenv~=0.5", + "pytest-timeout~=2.3", + "ruff~=0.8", + "semversioner~=2.0", + "update-toml~=0.2", + "pytest-xdist[psutil]~=3.8.0", ] -[project.scripts] -graphrag = "graphrag.cli.main:app" +[tool.uv] +package = false -[project.urls] -Source = "https://github.com/microsoft/graphrag" +[tool.uv.workspace] +members = ["packages/*"] -[build-system] -requires = ["setuptools>=64", "wheel"] -build-backend = "setuptools.build_meta" - -[tool.setuptools.packages.find] -include = ["graphrag*"] -exclude = ["examples_notebooks*", "tests*"] +[tool.uv.sources] +graphrag-chunking = { workspace = true } +graphrag-common = { workspace = true } +graphrag-input = { workspace = true } +graphrag-storage = { workspace = true } +graphrag-cache = { workspace = true } +graphrag-vectors = { workspace = true } +graphrag-llm = { workspace = true } # Keep poethepoet for task management to minimize changes [tool.poe.tasks] @@ -114,9 +70,19 @@ _ruff_check = 'ruff check .' _pyright = "pyright" _convert_local_search_nb = 'jupyter nbconvert --output-dir=docsite/posts/query/notebooks/ --output="{notebook_name}_nb" --template=docsite/nbdocsite_template --to markdown examples_notebooks/local_search.ipynb' _convert_global_search_nb = 'jupyter nbconvert --output-dir=docsite/posts/query/notebooks/ --output="{notebook_name}_nb" --template=docsite/nbdocsite_template --to markdown examples_notebooks/global_search.ipynb' +_copy_build_assets = "python -m scripts.copy_build_assets" _semversioner_release = "semversioner release" _semversioner_changelog = "semversioner changelog > CHANGELOG.md" -_semversioner_update_toml_version = "update-toml update --path project.version --value $(uv run semversioner current-version)" +# Add more update toml tasks as packages are added +_semversioner_update_graphrag_toml_version = "update-toml update --file packages/graphrag/pyproject.toml --path project.version --value $(uv run semversioner current-version)" +_semversioner_update_graphrag_chunking_toml_version = "update-toml update --file packages/graphrag-chunking/pyproject.toml --path project.version --value $(uv run semversioner current-version)" +_semversioner_update_graphrag_common_toml_version = "update-toml update --file packages/graphrag-common/pyproject.toml --path project.version --value $(uv run semversioner current-version)" +_semversioner_update_graphrag_storage_toml_version = "update-toml update --file packages/graphrag-storage/pyproject.toml --path project.version --value $(uv run semversioner current-version)" +_semversioner_update_graphrag_cache_toml_version = "update-toml update --file packages/graphrag-cache/pyproject.toml --path project.version --value $(uv run semversioner current-version)" +_semversioner_update_graphrag_input_toml_version = "update-toml update --file packages/graphrag-input/pyproject.toml --path project.version --value $(uv run semversioner current-version)" +_semversioner_update_graphrag_vectors_toml_version = "update-toml update --file packages/graphrag-vectors/pyproject.toml --path project.version --value $(uv run semversioner current-version)" +_semversioner_update_graphrag_llm_toml_version = "update-toml update --file packages/graphrag-llm/pyproject.toml --path project.version --value $(uv run semversioner current-version)" +_semversioner_update_workspace_dependency_versions = "python -m scripts.update_workspace_dependency_versions" semversioner_add = "semversioner add-change" coverage_report = 'coverage report --omit "**/tests/**" --show-missing' check_format = 'ruff format . --check' @@ -126,7 +92,7 @@ _test_all = "coverage run -m pytest ./tests" test_unit = "pytest ./tests/unit" test_integration = "pytest ./tests/integration" test_smoke = "pytest ./tests/smoke" -test_notebook = "pytest ./tests/notebook" +test_notebook = "pytest -n auto ./tests/notebook" test_verbs = "pytest ./tests/verbs" index = "python -m graphrag index" update = "python -m graphrag update" @@ -137,12 +103,27 @@ prompt_tune = "python -m graphrag prompt-tune" test_only = "pytest -s -k" serve_docs = "mkdocs serve" build_docs = "mkdocs build" +_build_packages = "uv build --all-packages" +_sync = "uv sync" + +[[tool.poe.tasks.build]] +sequence = ['_copy_build_assets', '_build_packages'] [[tool.poe.tasks.release]] sequence = [ '_semversioner_release', '_semversioner_changelog', - '_semversioner_update_toml_version', + # Add more update toml tasks as packages are added + '_semversioner_update_graphrag_toml_version', + '_semversioner_update_graphrag_common_toml_version', + '_semversioner_update_graphrag_chunking_toml_version', + '_semversioner_update_graphrag_input_toml_version', + '_semversioner_update_graphrag_storage_toml_version', + '_semversioner_update_graphrag_cache_toml_version', + "_semversioner_update_graphrag_vectors_toml_version", + '_semversioner_update_graphrag_llm_toml_version', + '_semversioner_update_workspace_dependency_versions', + '_sync', ] ignore_fail = 'return_non_zero' @@ -255,7 +236,14 @@ convention = "numpy" # https://github.com/microsoft/pyright/blob/9f81564a4685ff5c55edd3959f9b39030f590b2f/docs/configuration.md#sample-pyprojecttoml-file [tool.pyright] -include = ["graphrag", "tests", "examples_notebooks"] +include = [ + "packages/graphrag/graphrag", + "packages/graphrag-common/graphrag_common", + "packages/graphrag-storage/graphrag_storage", + "packages/graphrag-cache/graphrag_cache", + "packages/graphrag-llm/graphrag_llm", + "tests" +] exclude = ["**/node_modules", "**/__pycache__"] [tool.pytest.ini_options] diff --git a/graphrag/language_model/providers/fnllm/__init__.py b/scripts/__init__.py similarity index 70% rename from graphrag/language_model/providers/fnllm/__init__.py rename to scripts/__init__.py index 8132a1b5ab..4adce34aa7 100644 --- a/graphrag/language_model/providers/fnllm/__init__.py +++ b/scripts/__init__.py @@ -1,4 +1,5 @@ # Copyright (c) 2025 Microsoft Corporation. # Licensed under the MIT License -"""FNLLM provider module.""" + +"""GraphRAG Scripts module.""" diff --git a/scripts/copy_build_assets.py b/scripts/copy_build_assets.py new file mode 100644 index 0000000000..d1ac1d90e1 --- /dev/null +++ b/scripts/copy_build_assets.py @@ -0,0 +1,25 @@ +# Copyright (c) 2025 Microsoft Corporation. +# Licensed under the MIT License + +"""Copy root build assets to package directories.""" + +import shutil +from pathlib import Path + + +def copy_build_assets(): + """Copy root build assets to package build directories so files are included in pypi distributions.""" + root_dir = Path(__file__).parent.parent + build_assets = ["LICENSE"] + + for package_dir in root_dir.glob("packages/*"): + if package_dir.is_dir(): + for asset in build_assets: + src = root_dir / asset + dest = package_dir / asset + if src.exists(): + shutil.copy(src, dest) + + +if __name__ == "__main__": + copy_build_assets() diff --git a/scripts/update_workspace_dependency_versions.py b/scripts/update_workspace_dependency_versions.py new file mode 100644 index 0000000000..199cf01173 --- /dev/null +++ b/scripts/update_workspace_dependency_versions.py @@ -0,0 +1,58 @@ +# Copyright (c) 2025 Microsoft Corporation. +# Licensed under the MIT License + +"""Update workspace dependency versions.""" + +import os +import re +import subprocess # noqa: S404 +from pathlib import Path + + +def _get_version() -> str: + command = ["uv", "run", "semversioner", "current-version"] + completion = subprocess.run(command, env=os.environ, capture_output=True, text=True) # noqa: S603 + if completion.returncode != 0: + msg = f"Failed to get current version with return code: {completion.returncode}" + raise RuntimeError(msg) + return completion.stdout.strip() + + +def _get_package_paths() -> list[Path]: + root_dir = Path(__file__).parent.parent + return [p.resolve() for p in root_dir.glob("packages/*") if p.is_dir()] + + +def update_workspace_dependency_versions(): + """Update dependency versions across workspace packages. + + Iterate through all the workspace packages and update cross-package + dependency versions to match the current version of the workspace. + """ + version = _get_version() + package_paths = _get_package_paths() + for package_path in package_paths: + current_package_name = package_path.name + toml_path = package_path / "pyproject.toml" + if not toml_path.exists() or not toml_path.is_file(): + continue + toml_contents = toml_path.read_text(encoding="utf-8") + + for other_package_path in package_paths: + other_package_name = other_package_path.name + if other_package_name == current_package_name: + continue + dep_pattern = rf"{other_package_name}\s*==\s*\d+\.\d+\.\d+" + + if re.search(dep_pattern, toml_contents): + toml_contents = re.sub( + dep_pattern, + f"{other_package_name}=={version}", + toml_contents, + ) + + toml_path.write_text(toml_contents, encoding="utf-8", newline="\n") + + +if __name__ == "__main__": + update_workspace_dependency_versions() diff --git a/tests/__init__.py b/tests/__init__.py index cbb9376b53..2d6d270212 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -3,13 +3,3 @@ """Tests for the GraphRAG LLM module.""" - -# Register MOCK providers -from graphrag.config.enums import ModelType -from graphrag.language_model.factory import ModelFactory -from tests.mock_provider import MockChatLLM, MockEmbeddingLLM - -ModelFactory.register_chat(ModelType.MockChat, lambda **kwargs: MockChatLLM(**kwargs)) -ModelFactory.register_embedding( - ModelType.MockEmbedding, lambda **kwargs: MockEmbeddingLLM(**kwargs) -) diff --git a/tests/fixtures/azure/config.json b/tests/fixtures/azure/config.json index 8adced2c08..774228d0ad 100644 --- a/tests/fixtures/azure/config.json +++ b/tests/fixtures/azure/config.json @@ -1,6 +1,7 @@ { "input_path": "./tests/fixtures/azure", - "input_file_type": "text", + "input_type": "text", + "index_method": "standard", "workflow_config": { "skip_assert": true, "azure": { diff --git a/tests/fixtures/azure/settings.yml b/tests/fixtures/azure/settings.yml index 80ba02e56b..961037cffa 100644 --- a/tests/fixtures/azure/settings.yml +++ b/tests/fixtures/azure/settings.yml @@ -2,11 +2,10 @@ extract_claims: enabled: true vector_store: - default_vector_store: - type: "azure_ai_search" - url: ${AZURE_AI_SEARCH_URL_ENDPOINT} - api_key: ${AZURE_AI_SEARCH_API_KEY} - container_name: "azure_ci" + type: "azure_ai_search" + url: ${AZURE_AI_SEARCH_URL_ENDPOINT} + api_key: ${AZURE_AI_SEARCH_API_KEY} + container_name: "azure_ci" input: storage: @@ -14,7 +13,7 @@ input: connection_string: ${LOCAL_BLOB_STORAGE_CONNECTION_STRING} container_name: azurefixture base_dir: input - file_type: text + type: text cache: diff --git a/tests/fixtures/min-csv/config.json b/tests/fixtures/min-csv/config.json index 7b1b4d61e6..99291c05cb 100644 --- a/tests/fixtures/min-csv/config.json +++ b/tests/fixtures/min-csv/config.json @@ -1,6 +1,7 @@ { "input_path": "./tests/fixtures/min-csv", - "input_file_type": "text", + "input_type": "text", + "index_method": "standard", "workflow_config": { "load_input_documents": { "max_runtime": 30 @@ -20,10 +21,6 @@ 100, 750 ], - "nan_allowed_columns": [ - "x", - "y" - ], "max_runtime": 30, "expected_artifacts": [ "entities.parquet", @@ -54,7 +51,7 @@ "period", "size" ], - "max_runtime": 300, + "max_runtime": 2000, "expected_artifacts": ["community_reports.parquet"] }, "create_final_text_units": { @@ -76,7 +73,7 @@ 15 ], "nan_allowed_columns": [ - "metadata" + "raw_data" ], "max_runtime": 30, "expected_artifacts": ["documents.parquet"] @@ -88,9 +85,9 @@ ], "max_runtime": 150, "expected_artifacts": [ - "embeddings.text_unit.text.parquet", - "embeddings.entity.description.parquet", - "embeddings.community.full_content.parquet" + "embeddings.text_unit_text.parquet", + "embeddings.entity_description.parquet", + "embeddings.community_full_content.parquet" ] } }, @@ -101,7 +98,7 @@ }, { "query": "What is the major conflict in this story and who are the protagonist and antagonist?", - "method": "global" + "method": "drift" } ], "slow": false diff --git a/tests/fixtures/min-csv/settings.yml b/tests/fixtures/min-csv/settings.yml index ee3ddd03f9..5692deb019 100644 --- a/tests/fixtures/min-csv/settings.yml +++ b/tests/fixtures/min-csv/settings.yml @@ -1,43 +1,37 @@ -models: - default_chat_model: - azure_auth_type: api_key - type: chat +completion_models: + default_completion_model: model_provider: azure api_key: ${GRAPHRAG_API_KEY} api_base: ${GRAPHRAG_API_BASE} api_version: "2025-04-01-preview" - deployment_name: gpt-4.1 model: gpt-4.1 - retry_strategy: exponential_backoff - tokens_per_minute: null - requests_per_minute: null - model_supports_json: true - concurrent_requests: 25 - async_mode: threaded + azure_deployment_name: gpt-4.1 + rate_limit: + type: sliding_window + tokens_per_period: 250_000 + requests_per_period: 250 +embedding_models: default_embedding_model: - azure_auth_type: api_key - type: embedding model_provider: azure api_key: ${GRAPHRAG_API_KEY} api_base: ${GRAPHRAG_API_BASE} api_version: "2025-04-01-preview" - deployment_name: text-embedding-ada-002 - model: text-embedding-ada-002 - retry_strategy: exponential_backoff - tokens_per_minute: null - requests_per_minute: null - concurrent_requests: 25 - async_mode: threaded + model: text-embedding-3-large + azure_deployment_name: text-embedding-3-large + rate_limit: + type: sliding_window + tokens_per_period: 250_000 + requests_per_period: 250 vector_store: - default_vector_store: - type: "lancedb" - db_uri: "./tests/fixtures/min-csv/lancedb" - container_name: "lancedb_ci" - overwrite: True + type: "lancedb" + db_uri: "./tests/fixtures/min-csv/lancedb" + overwrite: True + container_name: "lancedb_ci" input: - file_type: csv + type: csv + encoding: utf-8-sig snapshots: embeddings: true \ No newline at end of file diff --git a/tests/fixtures/text/config.json b/tests/fixtures/text/config.json index 5b5738b1c1..cc69e523ec 100644 --- a/tests/fixtures/text/config.json +++ b/tests/fixtures/text/config.json @@ -1,6 +1,7 @@ { "input_path": "./tests/fixtures/text", - "input_file_type": "text", + "input_type": "text", + "index_method": "fast", "workflow_config": { "load_input_documents": { "max_runtime": 30 @@ -8,17 +9,16 @@ "create_base_text_units": { "max_runtime": 30 }, - "extract_graph": { - "max_runtime": 500 + "extract_graph_nlp": { + "max_runtime": 30 + }, + "prune_graph": { + "max_runtime": 30 }, "finalize_graph": { "row_range": [ 10, - 200 - ], - "nan_allowed_columns": [ - "x", - "y" + 300 ], "max_runtime": 30, "expected_artifacts": [ @@ -26,23 +26,6 @@ "relationships.parquet" ] }, - "extract_covariates": { - "row_range": [ - 10, - 100 - ], - "nan_allowed_columns": [ - "type", - "description", - "object_id", - "status", - "start_date", - "end_date", - "source_text" - ], - "max_runtime": 300, - "expected_artifacts": ["covariates.parquet"] - }, "create_communities": { "row_range": [ 1, @@ -51,7 +34,7 @@ "max_runtime": 30, "expected_artifacts": ["communities.parquet"] }, - "create_community_reports": { + "create_community_reports_text": { "row_range": [ 1, 30 @@ -67,7 +50,7 @@ "period", "size" ], - "max_runtime": 300, + "max_runtime": 2000, "expected_artifacts": ["community_reports.parquet"] }, "create_final_text_units": { @@ -89,7 +72,7 @@ 1 ], "nan_allowed_columns": [ - "metadata" + "raw_data" ], "max_runtime": 30, "expected_artifacts": ["documents.parquet"] @@ -101,9 +84,9 @@ ], "max_runtime": 150, "expected_artifacts": [ - "embeddings.text_unit.text.parquet", - "embeddings.entity.description.parquet", - "embeddings.community.full_content.parquet" + "embeddings.text_unit_text.parquet", + "embeddings.entity_description.parquet", + "embeddings.community_full_content.parquet" ] } }, diff --git a/tests/fixtures/text/prompts/community_report.txt b/tests/fixtures/text/prompts/community_report.txt index f939001c5b..4d78837774 100644 --- a/tests/fixtures/text/prompts/community_report.txt +++ b/tests/fixtures/text/prompts/community_report.txt @@ -35,12 +35,12 @@ Text: Entities -id,entity,description +human_readable_id,title,description 5,ABILA CITY PARK,Abila City Park is the location of the POK rally Relationships -id,source,target,description +human_readable_id,source,target,description 37,ABILA CITY PARK,POK RALLY,Abila City Park is the location of the POK rally 38,ABILA CITY PARK,POK,POK is holding a rally in Abila City Park 39,ABILA CITY PARK,POKRALLY,The POKRally is taking place at Abila City Park diff --git a/tests/fixtures/text/settings.yml b/tests/fixtures/text/settings.yml index 163f92ccc4..6cf6f9074d 100644 --- a/tests/fixtures/text/settings.yml +++ b/tests/fixtures/text/settings.yml @@ -1,43 +1,33 @@ -models: - default_chat_model: - azure_auth_type: api_key - type: chat +completion_models: + default_completion_model: model_provider: azure api_key: ${GRAPHRAG_API_KEY} api_base: ${GRAPHRAG_API_BASE} api_version: "2025-04-01-preview" - deployment_name: gpt-4.1 model: gpt-4.1 - retry_strategy: exponential_backoff - tokens_per_minute: null - requests_per_minute: null - model_supports_json: true - concurrent_requests: 25 - async_mode: threaded + azure_deployment_name: gpt-4.1 + rate_limit: + type: sliding_window + tokens_per_period: 250_000 + requests_per_period: 250 +embedding_models: default_embedding_model: - azure_auth_type: api_key - type: embedding model_provider: azure api_key: ${GRAPHRAG_API_KEY} api_base: ${GRAPHRAG_API_BASE} api_version: "2025-04-01-preview" - deployment_name: text-embedding-ada-002 - model: text-embedding-ada-002 - retry_strategy: exponential_backoff - tokens_per_minute: null - requests_per_minute: null - concurrent_requests: 25 - async_mode: threaded + model: text-embedding-3-large + azure_deployment_name: text-embedding-3-large + rate_limit: + type: sliding_window + tokens_per_period: 250_000 + requests_per_period: 250 vector_store: - default_vector_store: - type: "azure_ai_search" - url: ${AZURE_AI_SEARCH_URL_ENDPOINT} - api_key: ${AZURE_AI_SEARCH_API_KEY} - container_name: "simple_text_ci" - -extract_claims: - enabled: true + type: "azure_ai_search" + url: ${AZURE_AI_SEARCH_URL_ENDPOINT} + api_key: ${AZURE_AI_SEARCH_API_KEY} + container_name: "simple_text_ci" community_reports: prompt: "prompts/community_report.txt" diff --git a/tests/integration/cache/test_factory.py b/tests/integration/cache/test_factory.py index 5dde4e2635..ef01a0a315 100644 --- a/tests/integration/cache/test_factory.py +++ b/tests/integration/cache/test_factory.py @@ -2,19 +2,18 @@ # Licensed under the MIT License """CacheFactory Tests. -These tests will test the CacheFactory class and the creation of each cache type that is natively supported. +These tests will test the CacheFactory() class and the creation of each cache type that is natively supported. """ import sys import pytest - -from graphrag.cache.factory import CacheFactory -from graphrag.cache.json_pipeline_cache import JsonPipelineCache -from graphrag.cache.memory_pipeline_cache import InMemoryCache -from graphrag.cache.noop_pipeline_cache import NoopPipelineCache -from graphrag.cache.pipeline_cache import PipelineCache -from graphrag.config.enums import CacheType +from graphrag_cache import Cache, CacheConfig, CacheType, create_cache, register_cache +from graphrag_cache.cache_factory import cache_factory +from graphrag_cache.json_cache import JsonCache +from graphrag_cache.memory_cache import MemoryCache +from graphrag_cache.noop_cache import NoopCache +from graphrag_storage import StorageConfig, StorageType, create_storage # cspell:disable-next-line well-known-key WELL_KNOWN_BLOB_STORAGE_KEY = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;" @@ -23,31 +22,55 @@ def test_create_noop_cache(): - kwargs = {} - cache = CacheFactory.create_cache(CacheType.none.value, kwargs) - assert isinstance(cache, NoopPipelineCache) + cache = create_cache( + CacheConfig( + type=CacheType.Noop, + ) + ) + assert isinstance(cache, NoopCache) def test_create_memory_cache(): - kwargs = {} - cache = CacheFactory.create_cache(CacheType.memory.value, kwargs) - assert isinstance(cache, InMemoryCache) + cache = create_cache( + CacheConfig( + type=CacheType.Memory, + ) + ) + assert isinstance(cache, MemoryCache) def test_create_file_cache(): - kwargs = {"root_dir": "/tmp", "base_dir": "testcache"} - cache = CacheFactory.create_cache(CacheType.file.value, kwargs) - assert isinstance(cache, JsonPipelineCache) + storage = create_storage( + StorageConfig( + type=StorageType.Memory, + ) + ) + cache = create_cache( + CacheConfig( + type=CacheType.Json, + ), + storage=storage, + ) + assert isinstance(cache, JsonCache) def test_create_blob_cache(): - kwargs = { - "connection_string": WELL_KNOWN_BLOB_STORAGE_KEY, - "container_name": "testcontainer", - "base_dir": "testcache", - } - cache = CacheFactory.create_cache(CacheType.blob.value, kwargs) - assert isinstance(cache, JsonPipelineCache) + storage = create_storage( + StorageConfig( + type=StorageType.AzureBlob, + connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, + container_name="testcontainer", + base_dir="testcache", + ) + ) + cache = create_cache( + CacheConfig( + type=CacheType.Json, + ), + storage=storage, + ) + + assert isinstance(cache, JsonCache) @pytest.mark.skipif( @@ -55,13 +78,21 @@ def test_create_blob_cache(): reason="cosmosdb emulator is only available on windows runners at this time", ) def test_create_cosmosdb_cache(): - kwargs = { - "connection_string": WELL_KNOWN_COSMOS_CONNECTION_STRING, - "base_dir": "testdatabase", - "container_name": "testcontainer", - } - cache = CacheFactory.create_cache(CacheType.cosmosdb.value, kwargs) - assert isinstance(cache, JsonPipelineCache) + storage = create_storage( + StorageConfig( + type=StorageType.AzureCosmos, + connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, + database_name="testdatabase", + container_name="testcontainer", + ) + ) + cache = create_cache( + CacheConfig( + type=CacheType.Json, + ), + storage=storage, + ) + assert isinstance(cache, JsonCache) def test_register_and_create_custom_cache(): @@ -69,14 +100,14 @@ def test_register_and_create_custom_cache(): from unittest.mock import MagicMock # Create a mock that satisfies the PipelineCache interface - custom_cache_class = MagicMock(spec=PipelineCache) + custom_cache_class = MagicMock(spec=Cache) # Make the mock return a mock instance when instantiated instance = MagicMock() instance.initialized = True custom_cache_class.return_value = instance - CacheFactory.register("custom", lambda **kwargs: custom_cache_class(**kwargs)) - cache = CacheFactory.create_cache("custom", {}) + register_cache("custom", lambda **kwargs: custom_cache_class(**kwargs)) + cache = create_cache(CacheConfig(type="custom")) assert custom_cache_class.called assert cache is instance @@ -84,58 +115,21 @@ def test_register_and_create_custom_cache(): assert cache.initialized is True # type: ignore # Attribute only exists on our mock # Check if it's in the list of registered cache types - assert "custom" in CacheFactory.get_cache_types() - assert CacheFactory.is_supported_type("custom") - - -def test_get_cache_types(): - cache_types = CacheFactory.get_cache_types() - # Check that built-in types are registered - assert CacheType.none.value in cache_types - assert CacheType.memory.value in cache_types - assert CacheType.file.value in cache_types - assert CacheType.blob.value in cache_types - assert CacheType.cosmosdb.value in cache_types + assert "custom" in cache_factory def test_create_unknown_cache(): - with pytest.raises(ValueError, match="Unknown cache type: unknown"): - CacheFactory.create_cache("unknown", {}) - - -def test_is_supported_type(): - # Test built-in types - assert CacheFactory.is_supported_type(CacheType.none.value) - assert CacheFactory.is_supported_type(CacheType.memory.value) - assert CacheFactory.is_supported_type(CacheType.file.value) - assert CacheFactory.is_supported_type(CacheType.blob.value) - assert CacheFactory.is_supported_type(CacheType.cosmosdb.value) - - # Test unknown type - assert not CacheFactory.is_supported_type("unknown") - - -def test_enum_and_string_compatibility(): - """Test that both enum and string types work for cache creation.""" - kwargs = {} - - # Test with enum - cache_enum = CacheFactory.create_cache(CacheType.memory, kwargs) - assert isinstance(cache_enum, InMemoryCache) - - # Test with string - cache_str = CacheFactory.create_cache("memory", kwargs) - assert isinstance(cache_str, InMemoryCache) - - # Both should create the same type - assert type(cache_enum) is type(cache_str) + with pytest.raises( + ValueError, + match="CacheConfig\\.type 'unknown' is not registered in the CacheFactory\\.", + ): + create_cache(CacheConfig(type="unknown")) def test_register_class_directly_works(): - """Test that registering a class directly works (CacheFactory allows this).""" - from graphrag.cache.pipeline_cache import PipelineCache + """Test that registering a class directly works (CacheFactory() allows this).""" - class CustomCache(PipelineCache): + class CustomCache(Cache): def __init__(self, **kwargs): pass @@ -157,13 +151,12 @@ async def clear(self): def child(self, name: str): return self - # CacheFactory allows registering classes directly (no TypeError) - CacheFactory.register("custom_class", CustomCache) + # CacheFactory() allows registering classes directly (no TypeError) + register_cache("custom_class", CustomCache) # Verify it was registered - assert "custom_class" in CacheFactory.get_cache_types() - assert CacheFactory.is_supported_type("custom_class") + assert "custom_class" in cache_factory # Test creating an instance - cache = CacheFactory.create_cache("custom_class", {}) + cache = create_cache(CacheConfig(type="custom_class")) assert isinstance(cache, CustomCache) diff --git a/tests/integration/language_model/test_factory.py b/tests/integration/language_model/test_factory.py index af503265d6..526cb3e8dd 100644 --- a/tests/integration/language_model/test_factory.py +++ b/tests/integration/language_model/test_factory.py @@ -6,92 +6,99 @@ These tests will test the LLMFactory class and the creation of custom and provided LLMs. """ -from collections.abc import AsyncGenerator, Generator -from typing import Any - -from graphrag.language_model.factory import ModelFactory -from graphrag.language_model.manager import ModelManager -from graphrag.language_model.response.base import ( - BaseModelOutput, - BaseModelResponse, - ModelResponse, -) - +from typing import TYPE_CHECKING, Any, Unpack -async def test_create_custom_chat_model(): - class CustomChatModel: +from graphrag_llm.completion import ( + LLMCompletion, + create_completion, + register_completion, +) +from graphrag_llm.config import ModelConfig +from graphrag_llm.embedding import LLMEmbedding, create_embedding, register_embedding + +if TYPE_CHECKING: + from collections.abc import AsyncIterator, Iterator + + from graphrag_llm.metrics import MetricsStore + from graphrag_llm.tokenizer import Tokenizer + from graphrag_llm.types import ( + LLMCompletionArgs, + LLMCompletionChunk, + LLMCompletionResponse, + LLMEmbeddingArgs, + LLMEmbeddingResponse, + ResponseFormat, + ) + + +def test_create_custom_chat_model(): + class CustomChatModel(LLMCompletion): config: Any def __init__(self, **kwargs): pass - async def achat( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> ModelResponse: - return BaseModelResponse(output=BaseModelOutput(content="content")) - - def chat( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> ModelResponse: - return BaseModelResponse( - output=BaseModelOutput( - content="content", full_response={"key": "value"} - ) - ) - - async def achat_stream( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> AsyncGenerator[str, None]: - yield "" - - def chat_stream( - self, prompt: str, history: list | None = None, **kwargs: Any - ) -> Generator[str, None]: ... - - ModelFactory.register_chat("custom_chat", CustomChatModel) - model = ModelManager().get_or_create_chat_model("custom", "custom_chat") + def supports_structured_response(self) -> bool: + return True + + def completion( + self, + /, + **kwargs: Unpack["LLMCompletionArgs[ResponseFormat]"], + ) -> "LLMCompletionResponse[ResponseFormat] | Iterator[LLMCompletionChunk]": ... + + async def completion_async( + self, + /, + **kwargs: Unpack["LLMCompletionArgs[ResponseFormat]"], + ) -> ( + "LLMCompletionResponse[ResponseFormat] | AsyncIterator[LLMCompletionChunk]" + ): ... + + @property + def metrics_store(self) -> "MetricsStore": ... + + @property + def tokenizer(self) -> "Tokenizer": ... + + register_completion("custom_chat", CustomChatModel) + + model = create_completion( + ModelConfig( + type="custom_chat", + model_provider="custom_provider", + model="custom_chat_model", + ) + ) assert isinstance(model, CustomChatModel) - response = await model.achat("prompt") - assert response.output.content == "content" - assert response.output.full_response is None - - response = model.chat("prompt") - assert response.output.content == "content" - assert response.output.full_response == {"key": "value"} - -async def test_create_custom_embedding_llm(): - class CustomEmbeddingModel: - config: Any - - def __init__(self, **kwargs): - pass - async def aembed(self, text: str, **kwargs) -> list[float]: - return [1.0] +def test_create_custom_embedding_llm(): + class CustomEmbeddingModel(LLMEmbedding): + def __init__(self, **kwargs): ... - def embed(self, text: str, **kwargs) -> list[float]: - return [1.0] + def embedding( + self, /, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> "LLMEmbeddingResponse": ... - async def aembed_batch( - self, text_list: list[str], **kwargs - ) -> list[list[float]]: - return [[1.0]] + async def embedding_async( + self, /, **kwargs: Unpack["LLMEmbeddingArgs"] + ) -> "LLMEmbeddingResponse": ... - def embed_batch(self, text_list: list[str], **kwargs) -> list[list[float]]: - return [[1.0]] + @property + def metrics_store(self) -> "MetricsStore": ... - ModelFactory.register_embedding("custom_embedding", CustomEmbeddingModel) - llm = ModelManager().get_or_create_embedding_model("custom", "custom_embedding") - assert isinstance(llm, CustomEmbeddingModel) - response = await llm.aembed("text") - assert response == [1.0] + @property + def tokenizer(self) -> "Tokenizer": ... - response = llm.embed("text") - assert response == [1.0] + register_embedding("custom_embedding", CustomEmbeddingModel) - response = await llm.aembed_batch(["text"]) - assert response == [[1.0]] + model = create_embedding( + ModelConfig( + type="custom_embedding", + model_provider="custom_provider", + model="custom_embedding_model", + ) + ) - response = llm.embed_batch(["text"]) - assert response == [[1.0]] + assert isinstance(model, CustomEmbeddingModel) diff --git a/tests/unit/litellm_services/test_rate_limiter.py b/tests/integration/language_model/test_rate_limiter.py similarity index 77% rename from tests/unit/litellm_services/test_rate_limiter.py rename to tests/integration/language_model/test_rate_limiter.py index ffe144212d..1bc541b16a 100644 --- a/tests/unit/litellm_services/test_rate_limiter.py +++ b/tests/integration/language_model/test_rate_limiter.py @@ -8,22 +8,15 @@ from math import ceil from queue import Queue -import pytest +from graphrag_llm.config import RateLimitConfig, RateLimitType +from graphrag_llm.rate_limit import RateLimiter, create_rate_limiter -from graphrag.language_model.providers.litellm.services.rate_limiter.rate_limiter import ( - RateLimiter, -) -from graphrag.language_model.providers.litellm.services.rate_limiter.rate_limiter_factory import ( - RateLimiterFactory, -) -from tests.unit.litellm_services.utils import ( +from tests.integration.language_model.utils import ( assert_max_num_values_per_period, assert_stagger, bin_time_intervals, ) -rate_limiter_factory = RateLimiterFactory() - _period_in_seconds = 1 _rpm = 4 _tpm = 75 @@ -46,54 +39,14 @@ def test_binning(): ] -def test_rate_limiter_validation(): - """Test that the rate limiter can be created with valid parameters.""" - - # Valid parameters - rate_limiter = rate_limiter_factory.create( - strategy="static", rpm=60, tpm=10000, period_in_seconds=60 - ) - assert rate_limiter is not None - - # Invalid strategy - with pytest.raises( - ValueError, - match=r"Strategy 'invalid_strategy' is not registered.", - ): - rate_limiter_factory.create(strategy="invalid_strategy", rpm=60, tpm=10000) - - # Both rpm and tpm are None - with pytest.raises( - ValueError, - match=r"Both TPM and RPM cannot be None \(disabled\), one or both must be set to a positive integer.", - ): - rate_limiter_factory.create(strategy="static") - - # Invalid rpm - with pytest.raises( - ValueError, - match=r"RPM and TPM must be either None \(disabled\) or positive integers.", - ): - rate_limiter_factory.create(strategy="static", rpm=-10) - - # Invalid tpm - with pytest.raises( - ValueError, - match=r"RPM and TPM must be either None \(disabled\) or positive integers.", - ): - rate_limiter_factory.create(strategy="static", tpm=-10) - - # Invalid period_in_seconds - with pytest.raises( - ValueError, match=r"Period in seconds must be a positive integer." - ): - rate_limiter_factory.create(strategy="static", rpm=10, period_in_seconds=-10) - - def test_rpm(): """Test that the rate limiter enforces RPM limits.""" - rate_limiter = rate_limiter_factory.create( - strategy="static", rpm=_rpm, period_in_seconds=_period_in_seconds + rate_limiter = create_rate_limiter( + RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=_period_in_seconds, + requests_per_period=_rpm, + ) ) time_values: list[float] = [] @@ -120,8 +73,12 @@ def test_rpm(): def test_tpm(): """Test that the rate limiter enforces TPM limits.""" - rate_limiter = rate_limiter_factory.create( - strategy="static", tpm=_tpm, period_in_seconds=_period_in_seconds + rate_limiter = create_rate_limiter( + RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=_period_in_seconds, + tokens_per_period=_tpm, + ) ) time_values: list[float] = [] @@ -153,8 +110,12 @@ def test_token_in_request_exceeds_tpm(): greater than the tpm limit but still below the context window limit of the underlying model. In this case, the request should still be allowed to proceed but may take up its own rate limit bin. """ - rate_limiter = rate_limiter_factory.create( - strategy="static", tpm=_tpm, period_in_seconds=_period_in_seconds + rate_limiter = create_rate_limiter( + RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=_period_in_seconds, + tokens_per_period=_tpm, + ) ) time_values: list[float] = [] @@ -177,8 +138,13 @@ def test_token_in_request_exceeds_tpm(): def test_rpm_and_tpm_with_rpm_as_limiting_factor(): """Test that the rate limiter enforces RPM and TPM limits.""" - rate_limiter = rate_limiter_factory.create( - strategy="static", rpm=_rpm, tpm=_tpm, period_in_seconds=_period_in_seconds + rate_limiter = create_rate_limiter( + RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=_period_in_seconds, + requests_per_period=_rpm, + tokens_per_period=_tpm, + ) ) time_values: list[float] = [] @@ -206,8 +172,13 @@ def test_rpm_and_tpm_with_rpm_as_limiting_factor(): def test_rpm_and_tpm_with_tpm_as_limiting_factor(): """Test that the rate limiter enforces TPM limits.""" - rate_limiter = rate_limiter_factory.create( - strategy="static", rpm=_rpm, tpm=_tpm, period_in_seconds=_period_in_seconds + rate_limiter = create_rate_limiter( + RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=_period_in_seconds, + requests_per_period=_rpm, + tokens_per_period=_tpm, + ) ) time_values: list[float] = [] @@ -250,8 +221,13 @@ def _run_rate_limiter( def test_rpm_threaded(): """Test that the rate limiter enforces RPM limits in a threaded environment.""" - rate_limiter = rate_limiter_factory.create( - strategy="static", rpm=_rpm, tpm=_tpm, period_in_seconds=_period_in_seconds + rate_limiter = create_rate_limiter( + RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=_period_in_seconds, + requests_per_period=_rpm, + tokens_per_period=_tpm, + ) ) input_queue: Queue[int | None] = Queue() @@ -310,8 +286,13 @@ def test_rpm_threaded(): def test_tpm_threaded(): """Test that the rate limiter enforces TPM limits in a threaded environment.""" - rate_limiter = rate_limiter_factory.create( - strategy="static", rpm=_rpm, tpm=_tpm, period_in_seconds=_period_in_seconds + rate_limiter = create_rate_limiter( + RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=_period_in_seconds, + requests_per_period=_rpm, + tokens_per_period=_tpm, + ) ) input_queue: Queue[int | None] = Queue() diff --git a/tests/integration/language_model/test_retries.py b/tests/integration/language_model/test_retries.py new file mode 100644 index 0000000000..98e25b209e --- /dev/null +++ b/tests/integration/language_model/test_retries.py @@ -0,0 +1,243 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Test LiteLLM Retries.""" + +import time +from typing import Any + +import httpx +import litellm.exceptions as exceptions +import pytest +from graphrag_llm.config import RetryConfig, RetryType +from graphrag_llm.retry import create_retry + + +@pytest.mark.parametrize( + ("config", "max_retries", "expected_time"), + [ + ( + RetryConfig( + type=RetryType.ExponentialBackoff, + max_retries=3, + base_delay=2.0, + jitter=False, + ), + 3, + 2 + 4 + 8, # No jitter, so exact times + ), + ( + RetryConfig( + type=RetryType.Immediate, + max_retries=3, + ), + 3, + 0, # Immediate retry, so no delay + ), + ], +) +def test_retries(config: RetryConfig, max_retries: int, expected_time: float) -> None: + """ + Test various retry strategies with various configurations. + """ + retry_service = create_retry(config) + + # start at -1 because the first call is not a retry + retries = -1 + + def mock_func(): + nonlocal retries + retries += 1 + msg = "Mock error for testing retries" + raise ValueError(msg) + + start_time = time.time() + with pytest.raises(ValueError, match="Mock error for testing retries"): + retry_service.retry(func=mock_func, input_args={}) + elapsed_time = time.time() - start_time + + assert retries == max_retries, f"Expected {max_retries} retries, got {retries}" + assert elapsed_time >= expected_time, ( + f"Expected elapsed time >= {expected_time}, got {elapsed_time}" + ) + + +@pytest.mark.parametrize( + ("config", "max_retries", "expected_time"), + [ + ( + RetryConfig( + type=RetryType.ExponentialBackoff, + max_retries=3, + base_delay=2.0, + jitter=False, + ), + 3, + 2 + 4 + 8, # No jitter, so exact times + ), + ( + RetryConfig( + type=RetryType.Immediate, + max_retries=3, + ), + 3, + 0, # Immediate retry, so no delay + ), + ], +) +async def test_retries_async( + config: RetryConfig, max_retries: int, expected_time: float +) -> None: + """ + Test various retry strategies with various configurations. + """ + retry_service = create_retry(config) + + # start at -1 because the first call is not a retry + retries = -1 + + def mock_func(): + nonlocal retries + retries += 1 + msg = "Mock error for testing retries" + raise ValueError(msg) + + start_time = time.time() + with pytest.raises(ValueError, match="Mock error for testing retries"): + await retry_service.retry_async(func=mock_func, input_args={}) + elapsed_time = time.time() - start_time + + assert retries == max_retries, f"Expected {max_retries} retries, got {retries}" + assert elapsed_time >= expected_time, ( + f"Expected elapsed time >= {expected_time}, got {elapsed_time}" + ) + + +@pytest.mark.parametrize( + "config", + [ + ( + RetryConfig( + type=RetryType.ExponentialBackoff, + max_retries=3, + base_delay=2.0, + jitter=False, + ) + ), + ( + RetryConfig( + type=RetryType.Immediate, + max_retries=3, + ) + ), + ], +) +@pytest.mark.parametrize( + ("exception", "exception_args"), + [ + ( + "BadRequestError", + ["Oh no!", "", ""], + ), + ( + "UnsupportedParamsError", + ["Oh no!", "", ""], + ), + ( + "ContextWindowExceededError", + ["Oh no!", "", ""], + ), + ( + "ContentPolicyViolationError", + ["Oh no!", "", ""], + ), + ( + "ImageFetchError", + ["Oh no!", "", ""], + ), + ( + "InvalidRequestError", + ["Oh no!", "", ""], + ), + ( + "AuthenticationError", + ["Oh no!", "", ""], + ), + ( + "PermissionDeniedError", + [ + "Oh no!", + "", + "", + httpx.Response( + status_code=403, + request=httpx.Request( + method="GET", url="https://litellm.ai" + ), # mock request object + ), + ], + ), + ( + "NotFoundError", + ["Oh no!", "", ""], + ), + ( + "UnprocessableEntityError", + [ + "Oh no!", + "", + "", + httpx.Response( + status_code=403, + request=httpx.Request( + method="GET", url="https://litellm.ai" + ), # mock request object + ), + ], + ), + ( + "APIConnectionError", + ["Oh no!", "", ""], + ), + ( + "APIError", + [500, "Oh no!", "", ""], + ), + ( + "ServiceUnavailableError", + ["Oh no!", "", ""], + ), + ( + "APIResponseValidationError", + ["Oh no!", "", ""], + ), + ( + "BudgetExceededError", + ["Oh no!", "", ""], + ), + ], +) +def test_exponential_backoff_skipping_exceptions( + config: RetryConfig, exception: str, exception_args: list[Any] +) -> None: + """ + Test skipping retries for exceptions that should not cause a retry. + """ + retry_service = create_retry(config) + + # start at -1 because the first call is not a retry + retries = -1 + exception_cls = exceptions.__dict__[exception] + + def mock_func(): + nonlocal retries + retries += 1 + raise exception_cls(*exception_args) + + with pytest.raises(exception_cls, match="Oh no!"): + retry_service.retry(func=mock_func, input_args={}) + + # subtract 1 from retries because the first call is not a retry + assert retries == 0, ( + f"Expected not to retry for '{exception}' exception. Got {retries} retries." + ) diff --git a/tests/unit/litellm_services/utils.py b/tests/integration/language_model/utils.py similarity index 100% rename from tests/unit/litellm_services/utils.py rename to tests/integration/language_model/utils.py diff --git a/tests/integration/logging/test_factory.py b/tests/integration/logging/test_factory.py index bacb4f0712..3da8f7965b 100644 --- a/tests/integration/logging/test_factory.py +++ b/tests/integration/logging/test_factory.py @@ -8,7 +8,6 @@ import logging import pytest - from graphrag.config.enums import ReportingType from graphrag.logger.blob_workflow_logger import BlobWorkflowLogger from graphrag.logger.factory import LoggerFactory @@ -27,7 +26,7 @@ def test_create_blob_logger(): "base_dir": "testbasedir", "container_name": "testcontainer", } - logger = LoggerFactory.create_logger(ReportingType.blob.value, kwargs) + logger = LoggerFactory().create(ReportingType.blob.value, kwargs) assert isinstance(logger, BlobWorkflowLogger) @@ -40,8 +39,8 @@ def test_register_and_create_custom_logger(): instance.initialized = True custom_logger_class.return_value = instance - LoggerFactory.register("custom", lambda **kwargs: custom_logger_class(**kwargs)) - logger = LoggerFactory.create_logger("custom", {}) + LoggerFactory().register("custom", lambda **kwargs: custom_logger_class(**kwargs)) + logger = LoggerFactory().create("custom") assert custom_logger_class.called assert logger is instance @@ -49,17 +48,15 @@ def test_register_and_create_custom_logger(): assert logger.initialized is True # type: ignore # Attribute only exists on our mock # Check if it's in the list of registered logger types - assert "custom" in LoggerFactory.get_logger_types() - assert LoggerFactory.is_supported_type("custom") + assert "custom" in LoggerFactory() def test_get_logger_types(): - logger_types = LoggerFactory.get_logger_types() # Check that built-in types are registered - assert ReportingType.file.value in logger_types - assert ReportingType.blob.value in logger_types + assert ReportingType.file.value in LoggerFactory() + assert ReportingType.blob.value in LoggerFactory() def test_create_unknown_logger(): - with pytest.raises(ValueError, match="Unknown reporting type: unknown"): - LoggerFactory.create_logger("unknown", {}) + with pytest.raises(ValueError, match="Strategy 'unknown' is not registered\\."): + LoggerFactory().create("unknown") diff --git a/tests/integration/logging/test_standard_logging.py b/tests/integration/logging/test_standard_logging.py index c0b485b5f2..6bb28a7343 100644 --- a/tests/integration/logging/test_standard_logging.py +++ b/tests/integration/logging/test_standard_logging.py @@ -4,10 +4,12 @@ """Tests for standard logging functionality.""" import logging +import os import tempfile from pathlib import Path from graphrag.logger.standard_logging import DEFAULT_LOG_FILENAME, init_loggers + from tests.unit.config.utils import get_default_graphrag_config @@ -37,7 +39,11 @@ def test_logger_hierarchy(): def test_init_loggers_file_config(): """Test that init_loggers works with file configuration.""" with tempfile.TemporaryDirectory() as temp_dir: - config = get_default_graphrag_config(root_dir=temp_dir) + # Need to manually change cwd since we are not using load_config + # to create graphrag config. + cwd = Path.cwd() + os.chdir(temp_dir) + config = get_default_graphrag_config() # call init_loggers with file config init_loggers(config=config) @@ -67,12 +73,17 @@ def test_init_loggers_file_config(): if isinstance(handler, logging.FileHandler): handler.close() logger.handlers.clear() + os.chdir(cwd) def test_init_loggers_file_verbose(): """Test that init_loggers works with verbose flag.""" with tempfile.TemporaryDirectory() as temp_dir: - config = get_default_graphrag_config(root_dir=temp_dir) + # Need to manually change cwd since we are not using load_config + # to create graphrag config. + cwd = Path.cwd() + os.chdir(temp_dir) + config = get_default_graphrag_config() # call init_loggers with file config init_loggers(config=config, verbose=True) @@ -95,12 +106,17 @@ def test_init_loggers_file_verbose(): if isinstance(handler, logging.FileHandler): handler.close() logger.handlers.clear() + os.chdir(cwd) def test_init_loggers_custom_filename(): """Test that init_loggers works with custom filename.""" with tempfile.TemporaryDirectory() as temp_dir: - config = get_default_graphrag_config(root_dir=temp_dir) + # Need to manually change cwd since we are not using load_config + # to create graphrag config. + cwd = Path.cwd() + os.chdir(temp_dir) + config = get_default_graphrag_config() # call init_loggers with file config init_loggers(config=config, filename="custom-log.log") @@ -116,3 +132,4 @@ def test_init_loggers_custom_filename(): if isinstance(handler, logging.FileHandler): handler.close() logger.handlers.clear() + os.chdir(cwd) diff --git a/tests/integration/storage/test_blob_pipeline_storage.py b/tests/integration/storage/test_blob_storage.py similarity index 70% rename from tests/integration/storage/test_blob_pipeline_storage.py rename to tests/integration/storage/test_blob_storage.py index 24e380d20e..ec996e91a2 100644 --- a/tests/integration/storage/test_blob_pipeline_storage.py +++ b/tests/integration/storage/test_blob_storage.py @@ -5,37 +5,30 @@ import re from datetime import datetime -from graphrag.storage.blob_pipeline_storage import BlobPipelineStorage +from graphrag_storage.azure_blob_storage import AzureBlobStorage # cspell:disable-next-line well-known-key WELL_KNOWN_BLOB_STORAGE_KEY = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;" async def test_find(): - storage = BlobPipelineStorage( + storage = AzureBlobStorage( connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, container_name="testfind", ) try: try: - items = list( - storage.find(base_dir="input", file_pattern=re.compile(r".*\.txt$")) - ) - items = [item[0] for item in items] + items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) assert items == [] await storage.set( "input/christmas.txt", "Merry Christmas!", encoding="utf-8" ) - items = list( - storage.find(base_dir="input", file_pattern=re.compile(r".*\.txt$")) - ) - items = [item[0] for item in items] + items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) assert items == ["input/christmas.txt"] await storage.set("test.txt", "Hello, World!", encoding="utf-8") items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) - items = [item[0] for item in items] assert items == ["input/christmas.txt", "test.txt"] output = await storage.get("test.txt") @@ -48,26 +41,10 @@ async def test_find(): storage._delete_container() # noqa: SLF001 -async def test_dotprefix(): - storage = BlobPipelineStorage( - connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, - container_name="testfind", - path_prefix=".", - ) - try: - await storage.set("input/christmas.txt", "Merry Christmas!", encoding="utf-8") - items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) - items = [item[0] for item in items] - assert items == ["input/christmas.txt"] - finally: - storage._delete_container() # noqa: SLF001 - - async def test_get_creation_date(): - storage = BlobPipelineStorage( + storage = AzureBlobStorage( connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, container_name="testfind", - path_prefix=".", ) try: await storage.set("input/christmas.txt", "Merry Christmas!", encoding="utf-8") @@ -82,7 +59,7 @@ async def test_get_creation_date(): async def test_child(): - parent = BlobPipelineStorage( + parent = AzureBlobStorage( connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, container_name="testchild", ) @@ -91,12 +68,10 @@ async def test_child(): storage = parent.child("input") await storage.set("christmas.txt", "Merry Christmas!", encoding="utf-8") items = list(storage.find(re.compile(r".*\.txt$"))) - items = [item[0] for item in items] assert items == ["christmas.txt"] await storage.set("test.txt", "Hello, World!", encoding="utf-8") items = list(storage.find(re.compile(r".*\.txt$"))) - items = [item[0] for item in items] print("FOUND", items) assert items == ["christmas.txt", "test.txt"] @@ -104,7 +79,6 @@ async def test_child(): assert output == "Hello, World!" items = list(parent.find(re.compile(r".*\.txt$"))) - items = [item[0] for item in items] print("FOUND ITEMS", items) assert items == ["input/christmas.txt", "input/test.txt"] finally: diff --git a/tests/integration/storage/test_cosmosdb_storage.py b/tests/integration/storage/test_cosmosdb_storage.py index 529be52256..a044cc754f 100644 --- a/tests/integration/storage/test_cosmosdb_storage.py +++ b/tests/integration/storage/test_cosmosdb_storage.py @@ -8,8 +8,7 @@ from datetime import datetime import pytest - -from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage +from graphrag_storage.azure_cosmos_storage import AzureCosmosStorage # cspell:disable-next-line well-known-key WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" @@ -22,15 +21,14 @@ async def test_find(): - storage = CosmosDBPipelineStorage( + storage = AzureCosmosStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, - base_dir="testfind", + database_name="testfind", container_name="testfindcontainer", ) try: try: items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) - items = [item[0] for item in items] assert items == [] json_content = { @@ -40,7 +38,6 @@ async def test_find(): "christmas.json", json.dumps(json_content), encoding="utf-8" ) items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) - items = [item[0] for item in items] assert items == ["christmas.json"] json_content = { @@ -48,7 +45,6 @@ async def test_find(): } await storage.set("test.json", json.dumps(json_content), encoding="utf-8") items = list(storage.find(file_pattern=re.compile(r".*\.json$"))) - items = [item[0] for item in items] assert items == ["christmas.json", "test.json"] output = await storage.get("test.json") @@ -68,22 +64,22 @@ async def test_find(): async def test_child(): - storage = CosmosDBPipelineStorage( + storage = AzureCosmosStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, - base_dir="testchild", + database_name="testchild", container_name="testchildcontainer", ) try: child_storage = storage.child("child") - assert type(child_storage) is CosmosDBPipelineStorage + assert type(child_storage) is AzureCosmosStorage finally: await storage.clear() async def test_clear(): - storage = CosmosDBPipelineStorage( + storage = AzureCosmosStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, - base_dir="testclear", + database_name="testclear", container_name="testclearcontainer", ) try: @@ -111,9 +107,9 @@ async def test_clear(): async def test_get_creation_date(): - storage = CosmosDBPipelineStorage( + storage = AzureCosmosStorage( connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, - base_dir="testclear", + database_name="testclear", container_name="testclearcontainer", ) try: diff --git a/tests/integration/storage/test_factory.py b/tests/integration/storage/test_factory.py index 3d21e50e9f..f4d3092e78 100644 --- a/tests/integration/storage/test_factory.py +++ b/tests/integration/storage/test_factory.py @@ -8,14 +8,17 @@ import sys import pytest - -from graphrag.config.enums import StorageType -from graphrag.storage.blob_pipeline_storage import BlobPipelineStorage -from graphrag.storage.cosmosdb_pipeline_storage import CosmosDBPipelineStorage -from graphrag.storage.factory import StorageFactory -from graphrag.storage.file_pipeline_storage import FilePipelineStorage -from graphrag.storage.memory_pipeline_storage import MemoryPipelineStorage -from graphrag.storage.pipeline_storage import PipelineStorage +from graphrag_storage import ( + Storage, + StorageConfig, + StorageType, + create_storage, + register_storage, +) +from graphrag_storage.azure_blob_storage import AzureBlobStorage +from graphrag_storage.azure_cosmos_storage import AzureCosmosStorage +from graphrag_storage.file_storage import FileStorage +from graphrag_storage.memory_storage import MemoryStorage # cspell:disable-next-line well-known-key WELL_KNOWN_BLOB_STORAGE_KEY = "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;" @@ -25,14 +28,14 @@ @pytest.mark.skip(reason="Blob storage emulator is not available in this environment") def test_create_blob_storage(): - kwargs = { - "type": "blob", - "connection_string": WELL_KNOWN_BLOB_STORAGE_KEY, - "base_dir": "testbasedir", - "container_name": "testcontainer", - } - storage = StorageFactory.create_storage(StorageType.blob.value, kwargs) - assert isinstance(storage, BlobPipelineStorage) + config = StorageConfig( + type=StorageType.AzureBlob, + connection_string=WELL_KNOWN_BLOB_STORAGE_KEY, + base_dir="testbasedir", + container_name="testcontainer", + ) + storage = create_storage(config) + assert isinstance(storage, AzureBlobStorage) @pytest.mark.skipif( @@ -40,65 +43,61 @@ def test_create_blob_storage(): reason="cosmosdb emulator is only available on windows runners at this time", ) def test_create_cosmosdb_storage(): - kwargs = { - "type": "cosmosdb", - "connection_string": WELL_KNOWN_COSMOS_CONNECTION_STRING, - "base_dir": "testdatabase", - "container_name": "testcontainer", - } - storage = StorageFactory.create_storage(StorageType.cosmosdb.value, kwargs) - assert isinstance(storage, CosmosDBPipelineStorage) + config = StorageConfig( + type=StorageType.AzureCosmos, + connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, + database_name="testdatabase", + container_name="testcontainer", + ) + storage = create_storage(config) + assert isinstance(storage, AzureCosmosStorage) -def test_create_file_storage(): - kwargs = {"type": "file", "base_dir": "/tmp/teststorage"} - storage = StorageFactory.create_storage(StorageType.file.value, kwargs) - assert isinstance(storage, FilePipelineStorage) +def test_create_file(): + config = StorageConfig( + type=StorageType.File, + base_dir="/tmp/teststorage", + ) + storage = create_storage(config) + assert isinstance(storage, FileStorage) def test_create_memory_storage(): - kwargs = {} # MemoryPipelineStorage doesn't accept any constructor parameters - storage = StorageFactory.create_storage(StorageType.memory.value, kwargs) - assert isinstance(storage, MemoryPipelineStorage) + config = StorageConfig( + base_dir="", + type=StorageType.Memory, + ) + storage = create_storage(config) + assert isinstance(storage, MemoryStorage) def test_register_and_create_custom_storage(): """Test registering and creating a custom storage type.""" from unittest.mock import MagicMock - # Create a mock that satisfies the PipelineStorage interface - custom_storage_class = MagicMock(spec=PipelineStorage) + # Create a mock that satisfies the Storage interface + custom_storage_class = MagicMock(spec=Storage) # Make the mock return a mock instance when instantiated instance = MagicMock() - # We can set attributes on the mock instance, even if they don't exist on PipelineStorage + # We can set attributes on the mock instance, even if they don't exist on Storage instance.initialized = True custom_storage_class.return_value = instance - StorageFactory.register("custom", lambda **kwargs: custom_storage_class(**kwargs)) - storage = StorageFactory.create_storage("custom", {}) + register_storage("custom", lambda **kwargs: custom_storage_class(**kwargs)) + storage = create_storage(StorageConfig(type="custom")) assert custom_storage_class.called assert storage is instance # Access the attribute we set on our mock assert storage.initialized is True # type: ignore # Attribute only exists on our mock - # Check if it's in the list of registered storage types - assert "custom" in StorageFactory.get_storage_types() - assert StorageFactory.is_supported_type("custom") - - -def test_get_storage_types(): - storage_types = StorageFactory.get_storage_types() - # Check that built-in types are registered - assert StorageType.file.value in storage_types - assert StorageType.memory.value in storage_types - assert StorageType.blob.value in storage_types - assert StorageType.cosmosdb.value in storage_types - def test_create_unknown_storage(): - with pytest.raises(ValueError, match="Unknown storage type: unknown"): - StorageFactory.create_storage("unknown", {}) + with pytest.raises( + ValueError, + match="StorageConfig\\.type 'unknown' is not registered in the StorageFactory\\.", + ): + create_storage(StorageConfig(type="unknown")) def test_register_class_directly_works(): @@ -107,19 +106,14 @@ def test_register_class_directly_works(): from collections.abc import Iterator from typing import Any - from graphrag.storage.pipeline_storage import PipelineStorage - - class CustomStorage(PipelineStorage): + class CustomStorage(Storage): def __init__(self, **kwargs): pass def find( self, file_pattern: re.Pattern[str], - base_dir: str | None = None, - file_filter: dict[str, Any] | None = None, - max_count=-1, - ) -> Iterator[tuple[str, dict[str, Any]]]: + ) -> Iterator[str]: return iter([]) async def get( @@ -139,7 +133,7 @@ async def has(self, key: str) -> bool: async def clear(self) -> None: pass - def child(self, name: str | None) -> "PipelineStorage": + def child(self, name: str | None) -> "Storage": return self def keys(self) -> list[str]: @@ -149,12 +143,8 @@ async def get_creation_date(self, key: str) -> str: return "2024-01-01 00:00:00 +0000" # StorageFactory allows registering classes directly (no TypeError) - StorageFactory.register("custom_class", CustomStorage) - - # Verify it was registered - assert "custom_class" in StorageFactory.get_storage_types() - assert StorageFactory.is_supported_type("custom_class") + register_storage("custom_class", CustomStorage) # Test creating an instance - storage = StorageFactory.create_storage("custom_class", {}) + storage = create_storage(StorageConfig(type="custom_class")) assert isinstance(storage, CustomStorage) diff --git a/tests/integration/storage/test_file_pipeline_storage.py b/tests/integration/storage/test_file_storage.py similarity index 65% rename from tests/integration/storage/test_file_pipeline_storage.py rename to tests/integration/storage/test_file_storage.py index be58476480..0852cd99fb 100644 --- a/tests/integration/storage/test_file_pipeline_storage.py +++ b/tests/integration/storage/test_file_storage.py @@ -7,24 +7,18 @@ from datetime import datetime from pathlib import Path -from graphrag.storage.file_pipeline_storage import ( - FilePipelineStorage, +from graphrag_storage.file_storage import ( + FileStorage, ) __dirname__ = os.path.dirname(__file__) async def test_find(): - storage = FilePipelineStorage() - items = list( - storage.find( - base_dir="tests/fixtures/text/input", - file_pattern=re.compile(r".*\.txt$"), - file_filter=None, - ) - ) - assert items == [(str(Path("tests/fixtures/text/input/dulce.txt")), {})] - output = await storage.get("tests/fixtures/text/input/dulce.txt") + storage = FileStorage(base_dir="tests/fixtures/text/input") + items = list(storage.find(file_pattern=re.compile(r".*\.txt$"))) + assert items == [str(Path("dulce.txt"))] + output = await storage.get("dulce.txt") assert len(output) > 0 await storage.set("test.txt", "Hello, World!", encoding="utf-8") @@ -36,12 +30,12 @@ async def test_find(): async def test_get_creation_date(): - storage = FilePipelineStorage() - - creation_date = await storage.get_creation_date( - "tests/fixtures/text/input/dulce.txt" + storage = FileStorage( + base_dir="tests/fixtures/text/input", ) + creation_date = await storage.get_creation_date("dulce.txt") + datetime_format = "%Y-%m-%d %H:%M:%S %z" parsed_datetime = datetime.strptime(creation_date, datetime_format).astimezone() @@ -49,10 +43,10 @@ async def test_get_creation_date(): async def test_child(): - storage = FilePipelineStorage() + storage = FileStorage(base_dir="") storage = storage.child("tests/fixtures/text/input") items = list(storage.find(re.compile(r".*\.txt$"))) - assert items == [(str(Path("dulce.txt")), {})] + assert items == [str(Path("dulce.txt"))] output = await storage.get("dulce.txt") assert len(output) > 0 diff --git a/tests/integration/vector_stores/test_azure_ai_search.py b/tests/integration/vector_stores/test_azure_ai_search.py index 2ff3347444..ffd445508c 100644 --- a/tests/integration/vector_stores/test_azure_ai_search.py +++ b/tests/integration/vector_stores/test_azure_ai_search.py @@ -7,10 +7,10 @@ from unittest.mock import MagicMock, patch import pytest - -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.vector_stores.azure_ai_search import AzureAISearchVectorStore -from graphrag.vector_stores.base import VectorStoreDocument +from graphrag_vectors import ( + VectorStoreDocument, +) +from graphrag_vectors.azure_ai_search import AzureAISearchVectorStore TEST_AZURE_AI_SEARCH_URL = os.environ.get( "TEST_AZURE_AI_SEARCH_URL", "https://test-url.search.windows.net" @@ -24,60 +24,49 @@ class TestAzureAISearchVectorStore: @pytest.fixture def mock_search_client(self): """Create a mock Azure AI Search client.""" - with patch( - "graphrag.vector_stores.azure_ai_search.SearchClient" - ) as mock_client: + with patch("graphrag_vectors.azure_ai_search.SearchClient") as mock_client: yield mock_client.return_value @pytest.fixture def mock_index_client(self): """Create a mock Azure AI Search index client.""" - with patch( - "graphrag.vector_stores.azure_ai_search.SearchIndexClient" - ) as mock_client: + with patch("graphrag_vectors.azure_ai_search.SearchIndexClient") as mock_client: yield mock_client.return_value @pytest.fixture def vector_store(self, mock_search_client, mock_index_client): """Create an Azure AI Search vector store instance.""" vector_store = AzureAISearchVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="test_vectors", vector_size=5 - ), + url=TEST_AZURE_AI_SEARCH_URL, + api_key=TEST_AZURE_AI_SEARCH_KEY, + index_name="test_vectors", + vector_size=5, ) # Create the necessary mocks first vector_store.db_connection = mock_search_client vector_store.index_client = mock_index_client - vector_store.connect( - url=TEST_AZURE_AI_SEARCH_URL, - api_key=TEST_AZURE_AI_SEARCH_KEY, - ) + vector_store.connect() return vector_store @pytest.fixture def vector_store_custom(self, mock_search_client, mock_index_client): """Create an Azure AI Search vector store instance.""" vector_store = AzureAISearchVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="test_vectors", - id_field="id_custom", - text_field="text_custom", - attributes_field="attributes_custom", - vector_field="vector_custom", - vector_size=5, - ), + url=TEST_AZURE_AI_SEARCH_URL, + api_key=TEST_AZURE_AI_SEARCH_KEY, + index_name="test_vectors", + id_field="id_custom", + vector_field="vector_custom", + vector_size=5, ) # Create the necessary mocks first vector_store.db_connection = mock_search_client vector_store.index_client = mock_index_client - vector_store.connect( - url=TEST_AZURE_AI_SEARCH_URL, - api_key=TEST_AZURE_AI_SEARCH_KEY, - ) + vector_store.connect() return vector_store @pytest.fixture @@ -86,15 +75,11 @@ def sample_documents(self): return [ VectorStoreDocument( id="doc1", - text="This is document 1", vector=[0.1, 0.2, 0.3, 0.4, 0.5], - attributes={"title": "Doc 1", "category": "test"}, ), VectorStoreDocument( id="doc2", - text="This is document 2", vector=[0.2, 0.3, 0.4, 0.5, 0.6], - attributes={"title": "Doc 2", "category": "test"}, ), ] @@ -110,16 +95,12 @@ async def test_vector_store_operations( search_results = [ { "id": "doc1", - "text": "This is document 1", "vector": [0.1, 0.2, 0.3, 0.4, 0.5], - "attributes": '{"title": "Doc 1", "category": "test"}', "@search.score": 0.9, }, { "id": "doc2", - "text": "This is document 2", "vector": [0.2, 0.3, 0.4, 0.5, 0.6], - "attributes": '{"title": "Doc 2", "category": "test"}', "@search.score": 0.8, }, ] @@ -127,18 +108,14 @@ async def test_vector_store_operations( mock_search_client.get_document.return_value = { "id": "doc1", - "text": "This is document 1", "vector": [0.1, 0.2, 0.3, 0.4, 0.5], - "attributes": '{"title": "Doc 1", "category": "test"}', } + vector_store.create_index() vector_store.load_documents(sample_documents) assert mock_index_client.create_or_update_index.called assert mock_search_client.upload_documents.called - filter_query = vector_store.filter_by_id(["doc1", "doc2"]) - assert filter_query == "search.in(id, 'doc1,doc2', ',')" - vector_results = vector_store.similarity_search_by_vector( [0.1, 0.2, 0.3, 0.4, 0.5], k=2 ) @@ -157,8 +134,6 @@ def mock_embedder(text: str) -> list[float]: doc = vector_store.search_by_id("doc1") assert doc.id == "doc1" - assert doc.text == "This is document 1" - assert doc.attributes["title"] == "Doc 1" async def test_empty_embedding(self, vector_store, mock_search_client): """Test similarity search by text with empty embedding.""" @@ -189,16 +164,12 @@ async def test_vector_store_customization( search_results = [ { vector_store_custom.id_field: "doc1", - vector_store_custom.text_field: "This is document 1", vector_store_custom.vector_field: [0.1, 0.2, 0.3, 0.4, 0.5], - vector_store_custom.attributes_field: '{"title": "Doc 1", "category": "test"}', "@search.score": 0.9, }, { vector_store_custom.id_field: "doc2", - vector_store_custom.text_field: "This is document 2", vector_store_custom.vector_field: [0.2, 0.3, 0.4, 0.5, 0.6], - vector_store_custom.attributes_field: '{"title": "Doc 2", "category": "test"}', "@search.score": 0.8, }, ] @@ -206,21 +177,14 @@ async def test_vector_store_customization( mock_search_client.get_document.return_value = { vector_store_custom.id_field: "doc1", - vector_store_custom.text_field: "This is document 1", vector_store_custom.vector_field: [0.1, 0.2, 0.3, 0.4, 0.5], - vector_store_custom.attributes_field: '{"title": "Doc 1", "category": "test"}', } + vector_store_custom.create_index() vector_store_custom.load_documents(sample_documents) assert mock_index_client.create_or_update_index.called assert mock_search_client.upload_documents.called - filter_query = vector_store_custom.filter_by_id(["doc1", "doc2"]) - assert ( - filter_query - == f"search.in({vector_store_custom.id_field}, 'doc1,doc2', ',')" - ) - vector_results = vector_store_custom.similarity_search_by_vector( [0.1, 0.2, 0.3, 0.4, 0.5], k=2 ) @@ -239,5 +203,3 @@ def mock_embedder(text: str) -> list[float]: doc = vector_store_custom.search_by_id("doc1") assert doc.id == "doc1" - assert doc.text == "This is document 1" - assert doc.attributes["title"] == "Doc 1" diff --git a/tests/integration/vector_stores/test_cosmosdb.py b/tests/integration/vector_stores/test_cosmosdb.py index 768858d578..de30bb6c50 100644 --- a/tests/integration/vector_stores/test_cosmosdb.py +++ b/tests/integration/vector_stores/test_cosmosdb.py @@ -7,10 +7,10 @@ import numpy as np import pytest - -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.vector_stores.base import VectorStoreDocument -from graphrag.vector_stores.cosmosdb import CosmosDBVectorStore +from graphrag_vectors import ( + VectorStoreDocument, +) +from graphrag_vectors.cosmosdb import CosmosDBVectorStore # cspell:disable-next-line well-known-key WELL_KNOWN_COSMOS_CONNECTION_STRING = "AccountEndpoint=https://127.0.0.1:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==" @@ -25,39 +25,32 @@ def test_vector_store_operations(): """Test basic vector store operations with CosmosDB.""" vector_store = CosmosDBVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig(index_name="testvector"), + connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, + database_name="test_db", + index_name="testvector", ) try: - vector_store.connect( - connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, - database_name="test_db", - ) + vector_store.connect() docs = [ VectorStoreDocument( id="doc1", - text="This is document 1", vector=[0.1, 0.2, 0.3, 0.4, 0.5], - attributes={"title": "Doc 1", "category": "test"}, ), VectorStoreDocument( id="doc2", - text="This is document 2", vector=[0.2, 0.3, 0.4, 0.5, 0.6], - attributes={"title": "Doc 2", "category": "test"}, ), ] - vector_store.load_documents(docs) - vector_store.filter_by_id(["doc1"]) + vector_store.create_index() + vector_store.load_documents(docs) doc = vector_store.search_by_id("doc1") assert doc.id == "doc1" - assert doc.text == "This is document 1" assert doc.vector is not None assert np.allclose(doc.vector, [0.1, 0.2, 0.3, 0.4, 0.5]) - assert doc.attributes["title"] == "Doc 1" # Define a simple text embedder function for testing def mock_embedder(text: str) -> list[float]: @@ -79,21 +72,19 @@ def mock_embedder(text: str) -> list[float]: def test_clear(): """Test clearing the vector store.""" vector_store = CosmosDBVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig(index_name="testclear"), + connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, + database_name="testclear", + index_name="testclear", ) try: - vector_store.connect( - connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, - database_name="testclear", - ) + vector_store.connect() doc = VectorStoreDocument( id="test", - text="Test document", vector=[0.1, 0.2, 0.3, 0.4, 0.5], - attributes={"title": "Test Doc"}, ) + vector_store.create_index() vector_store.load_documents([doc]) result = vector_store.search_by_id("test") assert result.id == "test" @@ -108,46 +99,35 @@ def test_clear(): def test_vector_store_customization(): """Test vector store customization with CosmosDB.""" vector_store = CosmosDBVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="text-embeddings", - id_field="id", - text_field="text_custom", - vector_field="vector_custom", - attributes_field="attributes_custom", - vector_size=5, - ), + connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, + database_name="test_db", + index_name="text-embeddings", + id_field="id", + vector_field="vector_custom", + vector_size=5, ) try: - vector_store.connect( - connection_string=WELL_KNOWN_COSMOS_CONNECTION_STRING, - database_name="test_db", - ) + vector_store.connect() docs = [ VectorStoreDocument( id="doc1", - text="This is document 1", vector=[0.1, 0.2, 0.3, 0.4, 0.5], - attributes={"title": "Doc 1", "category": "test"}, ), VectorStoreDocument( id="doc2", - text="This is document 2", vector=[0.2, 0.3, 0.4, 0.5, 0.6], - attributes={"title": "Doc 2", "category": "test"}, ), ] - vector_store.load_documents(docs) - vector_store.filter_by_id(["doc1"]) + vector_store.create_index() + vector_store.load_documents(docs) doc = vector_store.search_by_id("doc1") assert doc.id == "doc1" - assert doc.text == "This is document 1" assert doc.vector is not None assert np.allclose(doc.vector, [0.1, 0.2, 0.3, 0.4, 0.5]) - assert doc.attributes["title"] == "Doc 1" # Define a simple text embedder function for testing def mock_embedder(text: str) -> list[float]: diff --git a/tests/integration/vector_stores/test_factory.py b/tests/integration/vector_stores/test_factory.py index 724c1f8e2d..ceb2a84c84 100644 --- a/tests/integration/vector_stores/test_factory.py +++ b/tests/integration/vector_stores/test_factory.py @@ -6,29 +6,28 @@ """ import pytest +from graphrag_vectors import ( + VectorStore, + VectorStoreFactory, + VectorStoreType, +) +from graphrag_vectors.azure_ai_search import AzureAISearchVectorStore +from graphrag_vectors.cosmosdb import CosmosDBVectorStore +from graphrag_vectors.lancedb import LanceDBVectorStore -from graphrag.config.enums import VectorStoreType -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.vector_stores.azure_ai_search import AzureAISearchVectorStore -from graphrag.vector_stores.base import BaseVectorStore -from graphrag.vector_stores.cosmosdb import CosmosDBVectorStore -from graphrag.vector_stores.factory import VectorStoreFactory -from graphrag.vector_stores.lancedb import LanceDBVectorStore +# register the defaults, since they are lazily registered +VectorStoreFactory().register(VectorStoreType.LanceDB, LanceDBVectorStore) +VectorStoreFactory().register(VectorStoreType.AzureAISearch, AzureAISearchVectorStore) +VectorStoreFactory().register(VectorStoreType.CosmosDB, CosmosDBVectorStore) def test_create_lancedb_vector_store(): kwargs = { "db_uri": "/tmp/lancedb", } - vector_store = VectorStoreFactory.create_vector_store( - vector_store_type=VectorStoreType.LanceDB.value, - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="test_collection" - ), - kwargs=kwargs, - ) + vector_store = VectorStoreFactory().create(VectorStoreType.LanceDB, kwargs) assert isinstance(vector_store, LanceDBVectorStore) - assert vector_store.index_name == "test_collection" + assert vector_store.index_name == "vector_index" @pytest.mark.skip(reason="Azure AI Search requires credentials and setup") @@ -36,13 +35,11 @@ def test_create_azure_ai_search_vector_store(): kwargs = { "url": "https://test.search.windows.net", "api_key": "test_key", + "index_name": "test_collection", } - vector_store = VectorStoreFactory.create_vector_store( - vector_store_type=VectorStoreType.AzureAISearch.value, - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="test_collection" - ), - kwargs=kwargs, + vector_store = VectorStoreFactory().create( + VectorStoreType.AzureAISearch, + kwargs, ) assert isinstance(vector_store, AzureAISearchVectorStore) @@ -52,14 +49,12 @@ def test_create_cosmosdb_vector_store(): kwargs = { "connection_string": "AccountEndpoint=https://test.documents.azure.com:443/;AccountKey=test_key==", "database_name": "test_db", + "index_name": "test_collection", } - vector_store = VectorStoreFactory.create_vector_store( - vector_store_type=VectorStoreType.CosmosDB.value, - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="test_collection" - ), - kwargs=kwargs, + vector_store = VectorStoreFactory().create( + VectorStoreType.CosmosDB, + kwargs, ) assert isinstance(vector_store, CosmosDBVectorStore) @@ -69,20 +64,18 @@ def test_register_and_create_custom_vector_store(): """Test registering and creating a custom vector store type.""" from unittest.mock import MagicMock - # Create a mock that satisfies the BaseVectorStore interface - custom_vector_store_class = MagicMock(spec=BaseVectorStore) + # Create a mock that satisfies the VectorStore interface + custom_vector_store_class = MagicMock(spec=VectorStore) # Make the mock return a mock instance when instantiated instance = MagicMock() instance.initialized = True custom_vector_store_class.return_value = instance - VectorStoreFactory.register( + VectorStoreFactory().register( "custom", lambda **kwargs: custom_vector_store_class(**kwargs) ) - vector_store = VectorStoreFactory.create_vector_store( - vector_store_type="custom", vector_store_schema_config=VectorStoreSchemaConfig() - ) + vector_store = VectorStoreFactory().create("custom", {}) assert custom_vector_store_class.called assert vector_store is instance @@ -90,48 +83,39 @@ def test_register_and_create_custom_vector_store(): assert vector_store.initialized is True # type: ignore # Attribute only exists on our mock # Check if it's in the list of registered vector store types - assert "custom" in VectorStoreFactory.get_vector_store_types() - assert VectorStoreFactory.is_supported_type("custom") - - -def test_get_vector_store_types(): - vector_store_types = VectorStoreFactory.get_vector_store_types() - # Check that built-in types are registered - assert VectorStoreType.LanceDB.value in vector_store_types - assert VectorStoreType.AzureAISearch.value in vector_store_types - assert VectorStoreType.CosmosDB.value in vector_store_types + assert "custom" in VectorStoreFactory() def test_create_unknown_vector_store(): - with pytest.raises(ValueError, match="Unknown vector store type: unknown"): - VectorStoreFactory.create_vector_store( - vector_store_type="unknown", - vector_store_schema_config=VectorStoreSchemaConfig(), - ) + with pytest.raises(ValueError, match="Strategy 'unknown' is not registered\\."): + VectorStoreFactory().create("unknown") def test_is_supported_type(): # Test built-in types - assert VectorStoreFactory.is_supported_type(VectorStoreType.LanceDB.value) - assert VectorStoreFactory.is_supported_type(VectorStoreType.AzureAISearch.value) - assert VectorStoreFactory.is_supported_type(VectorStoreType.CosmosDB.value) + assert VectorStoreType.LanceDB in VectorStoreFactory() + assert VectorStoreType.AzureAISearch in VectorStoreFactory() + assert VectorStoreType.CosmosDB in VectorStoreFactory() # Test unknown type - assert not VectorStoreFactory.is_supported_type("unknown") + assert "unknown" not in VectorStoreFactory() def test_register_class_directly_works(): - """Test that registering a class directly works (VectorStoreFactory allows this).""" - from graphrag.vector_stores.base import BaseVectorStore + """Test that registering a class directly works.""" + from graphrag_vectors import VectorStore - class CustomVectorStore(BaseVectorStore): + class CustomVectorStore(VectorStore): def __init__(self, **kwargs): super().__init__(**kwargs) def connect(self, **kwargs): pass - def load_documents(self, documents, overwrite=True): + def create_index(self, **kwargs): + pass + + def load_documents(self, documents): pass def similarity_search_by_vector(self, query_embedding, k=10, **kwargs): @@ -140,25 +124,21 @@ def similarity_search_by_vector(self, query_embedding, k=10, **kwargs): def similarity_search_by_text(self, text, text_embedder, k=10, **kwargs): return [] - def filter_by_id(self, include_ids): - return {} - def search_by_id(self, id): - from graphrag.vector_stores.base import VectorStoreDocument + from graphrag_vectors import VectorStoreDocument - return VectorStoreDocument(id=id, text="test", vector=None) + return VectorStoreDocument(id=id, vector=None) - # VectorStoreFactory allows registering classes directly (no TypeError) - VectorStoreFactory.register("custom_class", CustomVectorStore) + # VectorStoreFactory() allows registering classes directly (no TypeError) + VectorStoreFactory().register("custom_class", CustomVectorStore) # Verify it was registered - assert "custom_class" in VectorStoreFactory.get_vector_store_types() - assert VectorStoreFactory.is_supported_type("custom_class") + assert "custom_class" in VectorStoreFactory() # Test creating an instance - vector_store = VectorStoreFactory.create_vector_store( - vector_store_type="custom_class", - vector_store_schema_config=VectorStoreSchemaConfig(), + vector_store = VectorStoreFactory().create( + "custom_class", + {}, ) assert isinstance(vector_store, CustomVectorStore) diff --git a/tests/integration/vector_stores/test_lancedb.py b/tests/integration/vector_stores/test_lancedb.py index a3fe4e3a70..dbd1198556 100644 --- a/tests/integration/vector_stores/test_lancedb.py +++ b/tests/integration/vector_stores/test_lancedb.py @@ -8,10 +8,10 @@ import numpy as np import pytest - -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig -from graphrag.vector_stores.base import VectorStoreDocument -from graphrag.vector_stores.lancedb import LanceDBVectorStore +from graphrag_vectors import ( + VectorStoreDocument, +) +from graphrag_vectors.lancedb import LanceDBVectorStore class TestLanceDBVectorStore: @@ -23,21 +23,15 @@ def sample_documents(self): return [ VectorStoreDocument( id="1", - text="This is document 1", vector=[0.1, 0.2, 0.3, 0.4, 0.5], - attributes={"title": "Doc 1", "category": "test"}, ), VectorStoreDocument( id="2", - text="This is document 2", vector=[0.2, 0.3, 0.4, 0.5, 0.6], - attributes={"title": "Doc 2", "category": "test"}, ), VectorStoreDocument( id="3", - text="This is document 3", vector=[0.3, 0.4, 0.5, 0.6, 0.7], - attributes={"title": "Doc 3", "category": "test"}, ), ] @@ -47,21 +41,15 @@ def sample_documents_categories(self): return [ VectorStoreDocument( id="1", - text="Document about cats", vector=[0.1, 0.2, 0.3, 0.4, 0.5], - attributes={"category": "animals"}, ), VectorStoreDocument( id="2", - text="Document about dogs", vector=[0.2, 0.3, 0.4, 0.5, 0.6], - attributes={"category": "animals"}, ), VectorStoreDocument( id="3", - text="Document about cars", vector=[0.3, 0.4, 0.5, 0.6, 0.7], - attributes={"category": "vehicles"}, ), ] @@ -71,11 +59,10 @@ def test_vector_store_operations(self, sample_documents): temp_dir = tempfile.mkdtemp() try: vector_store = LanceDBVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="test_collection", vector_size=5 - ) + db_uri=temp_dir, index_name="test_collection", vector_size=5 ) - vector_store.connect(db_uri=temp_dir) + vector_store.connect() + vector_store.create_index() vector_store.load_documents(sample_documents[:2]) if vector_store.index_name: @@ -85,14 +72,8 @@ def test_vector_store_operations(self, sample_documents): doc = vector_store.search_by_id("1") assert doc.id == "1" - assert doc.text == "This is document 1" - assert doc.vector is not None assert np.allclose(doc.vector, [0.1, 0.2, 0.3, 0.4, 0.5]) - assert doc.attributes["title"] == "Doc 1" - - filter_query = vector_store.filter_by_id(["1"]) - assert filter_query == "id in ('1')" results = vector_store.similarity_search_by_vector( [0.1, 0.2, 0.3, 0.4, 0.5], k=2 @@ -101,10 +82,10 @@ def test_vector_store_operations(self, sample_documents): assert isinstance(results[0].score, float) # Test append mode - vector_store.load_documents([sample_documents[2]], overwrite=False) + vector_store.create_index() + vector_store.load_documents([sample_documents[2]]) result = vector_store.search_by_id("3") assert result.id == "3" - assert result.text == "This is document 3" # Define a simple text embedder function for testing def mock_embedder(text: str) -> list[float]: @@ -119,7 +100,6 @@ def mock_embedder(text: str) -> list[float]: # Test non-existent document non_existent = vector_store.search_by_id("nonexistent") assert non_existent.id == "nonexistent" - assert non_existent.text is None assert non_existent.vector is None finally: shutil.rmtree(temp_dir) @@ -130,19 +110,16 @@ def test_empty_collection(self): temp_dir = tempfile.mkdtemp() try: vector_store = LanceDBVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="empty_collection", vector_size=5 - ) + db_uri=temp_dir, index_name="empty_collection", vector_size=5 ) - vector_store.connect(db_uri=temp_dir) + vector_store.connect() # Load the vector store with a document, then delete it sample_doc = VectorStoreDocument( id="tmp", - text="Temporary document to create schema", vector=[0.1, 0.2, 0.3, 0.4, 0.5], - attributes={"title": "Tmp"}, ) + vector_store.create_index() vector_store.load_documents([sample_doc]) vector_store.db_connection.open_table( vector_store.index_name if vector_store.index_name else "" @@ -157,15 +134,13 @@ def test_empty_collection(self): # Add a document after creating an empty collection doc = VectorStoreDocument( id="1", - text="This is document 1", vector=[0.1, 0.2, 0.3, 0.4, 0.5], - attributes={"title": "Doc 1"}, ) - vector_store.load_documents([doc], overwrite=False) + vector_store.create_index() + vector_store.load_documents([doc]) result = vector_store.search_by_id("1") assert result.id == "1" - assert result.text == "This is document 1" finally: # Clean up - remove the temporary directory shutil.rmtree(temp_dir) @@ -176,26 +151,22 @@ def test_filter_search(self, sample_documents_categories): temp_dir = tempfile.mkdtemp() try: vector_store = LanceDBVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="filter_collection", vector_size=5 - ) + db_uri=temp_dir, index_name="filter_collection", vector_size=5 ) - vector_store.connect(db_uri=temp_dir) - + vector_store.connect() + vector_store.create_index() vector_store.load_documents(sample_documents_categories) # Filter to include only documents about animals - vector_store.filter_by_id(["1", "2"]) results = vector_store.similarity_search_by_vector( [0.1, 0.2, 0.3, 0.4, 0.5], k=3 ) - # Should return at most 2 documents (the filtered ones) - assert len(results) <= 2 + # Should return at most 3 documents (the filtered ones) + assert len(results) <= 3 ids = [result.document.id for result in results] - assert "3" not in ids - assert set(ids).issubset({"1", "2"}) + assert set(ids).issubset({"1", "2", "3"}) finally: shutil.rmtree(temp_dir) @@ -205,16 +176,14 @@ def test_vector_store_customization(self, sample_documents): temp_dir = tempfile.mkdtemp() try: vector_store = LanceDBVectorStore( - vector_store_schema_config=VectorStoreSchemaConfig( - index_name="text-embeddings", - id_field="id_custom", - text_field="text_custom", - vector_field="vector_custom", - attributes_field="attributes_custom", - vector_size=5, - ), + db_uri=temp_dir, + index_name="text-embeddings", + id_field="id_custom", + vector_field="vector_custom", + vector_size=5, ) - vector_store.connect(db_uri=temp_dir) + vector_store.connect() + vector_store.create_index() vector_store.load_documents(sample_documents[:2]) if vector_store.index_name: @@ -224,14 +193,8 @@ def test_vector_store_customization(self, sample_documents): doc = vector_store.search_by_id("1") assert doc.id == "1" - assert doc.text == "This is document 1" - assert doc.vector is not None assert np.allclose(doc.vector, [0.1, 0.2, 0.3, 0.4, 0.5]) - assert doc.attributes["title"] == "Doc 1" - - filter_query = vector_store.filter_by_id(["1"]) - assert filter_query == f"{vector_store.id_field} in ('1')" results = vector_store.similarity_search_by_vector( [0.1, 0.2, 0.3, 0.4, 0.5], k=2 @@ -240,10 +203,10 @@ def test_vector_store_customization(self, sample_documents): assert isinstance(results[0].score, float) # Test append mode - vector_store.load_documents([sample_documents[2]], overwrite=False) + vector_store.create_index() + vector_store.load_documents([sample_documents[2]]) result = vector_store.search_by_id("3") assert result.id == "3" - assert result.text == "This is document 3" # Define a simple text embedder function for testing def mock_embedder(text: str) -> list[float]: @@ -258,7 +221,6 @@ def mock_embedder(text: str) -> list[float]: # Test non-existent document non_existent = vector_store.search_by_id("nonexistent") assert non_existent.id == "nonexistent" - assert non_existent.text is None assert non_existent.vector is None finally: shutil.rmtree(temp_dir) diff --git a/tests/mock_provider.py b/tests/mock_provider.py deleted file mode 100644 index d68fd762df..0000000000 --- a/tests/mock_provider.py +++ /dev/null @@ -1,125 +0,0 @@ -# Copyright (c) 2025 Microsoft Corporation. -# Licensed under the MIT License - -"""A module containing mock model provider definitions.""" - -from collections.abc import AsyncGenerator, Generator -from typing import Any - -from pydantic import BaseModel - -from graphrag.config.enums import ModelType -from graphrag.config.models.language_model_config import LanguageModelConfig -from graphrag.language_model.response.base import ( - BaseModelOutput, - BaseModelResponse, - ModelResponse, -) - - -class MockChatLLM: - """A mock chat LLM provider.""" - - def __init__( - self, - responses: list[str | BaseModel] | None = None, - config: LanguageModelConfig | None = None, - json: bool = False, - **kwargs: Any, - ): - self.responses = config.responses if config and config.responses else responses - self.response_index = 0 - self.config = config or LanguageModelConfig( - type=ModelType.MockChat, model="gpt-4o", api_key="mock" - ) - - async def achat( - self, - prompt: str, - history: list | None = None, - **kwargs, - ) -> ModelResponse: - """Return the next response in the list.""" - return self.chat(prompt, history, **kwargs) - - async def achat_stream( - self, - prompt: str, - history: list | None = None, - **kwargs, - ) -> AsyncGenerator[str, None]: - """Return the next response in the list.""" - if not self.responses: - return - - for response in self.responses: - response = ( - response.model_dump_json() - if isinstance(response, BaseModel) - else response - ) - - yield response - - def chat( - self, - prompt: str, - history: list | None = None, - **kwargs, - ) -> ModelResponse: - """Return the next response in the list.""" - if not self.responses: - return BaseModelResponse(output=BaseModelOutput(content="")) - - response = self.responses[self.response_index % len(self.responses)] - self.response_index += 1 - - parsed_json = response if isinstance(response, BaseModel) else None - response = ( - response.model_dump_json() if isinstance(response, BaseModel) else response - ) - - return BaseModelResponse( - output=BaseModelOutput(content=response), - parsed_response=parsed_json, - ) - - def chat_stream( - self, - prompt: str, - history: list | None = None, - **kwargs, - ) -> Generator[str, None]: - """Return the next response in the list.""" - raise NotImplementedError - - -class MockEmbeddingLLM: - """A mock embedding LLM provider.""" - - def __init__(self, **kwargs: Any): - self.config = LanguageModelConfig( - type=ModelType.MockEmbedding, model="text-embedding-ada-002", api_key="mock" - ) - - def embed_batch(self, text_list: list[str], **kwargs: Any) -> list[list[float]]: - """Generate an embedding for the input text.""" - if isinstance(text_list, str): - return [[1.0, 1.0, 1.0]] - return [[1.0, 1.0, 1.0] for _ in text_list] - - def embed(self, text: str, **kwargs: Any) -> list[float]: - """Generate an embedding for the input text.""" - return [1.0, 1.0, 1.0] - - async def aembed(self, text: str, **kwargs: Any) -> list[float]: - """Generate an embedding for the input text.""" - return [1.0, 1.0, 1.0] - - async def aembed_batch( - self, text_list: list[str], **kwargs: Any - ) -> list[list[float]]: - """Generate an embedding for the input text.""" - if isinstance(text_list, str): - return [[1.0, 1.0, 1.0]] - return [[1.0, 1.0, 1.0] for _ in text_list] diff --git a/tests/notebook/test_notebooks.py b/tests/notebook/test_notebooks.py index 9f9d9b1222..47d759fcea 100644 --- a/tests/notebook/test_notebooks.py +++ b/tests/notebook/test_notebooks.py @@ -1,18 +1,36 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License import subprocess +from dataclasses import dataclass from pathlib import Path import nbformat import pytest -NOTEBOOKS_PATH = Path("examples_notebooks") -EXCLUDED_PATH = NOTEBOOKS_PATH / "community_contrib" + +@dataclass +class NotebookDetails: + dir: Path + excluded_filenames: list[str] + + +NOTEBOOKS: list[NotebookDetails] = [ + NotebookDetails( + dir=Path("packages/graphrag-llm/notebooks"), + excluded_filenames=[], + ), + # Was in previous test but not actually pointing at a notebooks location + # NotebookDetails( + # dir=Path("examples_notebooks"), # noqa: ERA001 + # excluded_filenames=["community_contrib"], # noqa: ERA001 + # ), +] notebooks_list = [ - notebook - for notebook in NOTEBOOKS_PATH.rglob("*.ipynb") - if EXCLUDED_PATH not in notebook.parents + nb + for details in NOTEBOOKS + for nb in details.dir.rglob("*.ipynb") + if nb.stem not in details.excluded_filenames ] @@ -21,6 +39,8 @@ def _notebook_run(filepath: Path): :returns execution errors """ args = [ + "uv", + "run", "jupyter", "nbconvert", "--to", @@ -29,7 +49,7 @@ def _notebook_run(filepath: Path): "-y", "--no-prompt", "--stdout", - str(filepath.absolute().resolve()), + str(filepath.resolve()), ] notebook = subprocess.check_output(args) nb = nbformat.reads(notebook, nbformat.current_nbformat) @@ -43,6 +63,18 @@ def _notebook_run(filepath: Path): ] +def clear_cache(): + cache_dir = Path("packages/graphrag-llm/notebooks/cache") + if cache_dir.exists(): + for file in cache_dir.iterdir(): + if file.is_file(): + file.unlink() + cache_dir.rmdir() + + +clear_cache() + + @pytest.mark.parametrize("notebook_path", notebooks_list) def test_notebook(notebook_path: Path): assert _notebook_run(notebook_path) == [] diff --git a/tests/smoke/test_fixtures.py b/tests/smoke/test_fixtures.py index 7a81bf2d16..7d43b0140a 100644 --- a/tests/smoke/test_fixtures.py +++ b/tests/smoke/test_fixtures.py @@ -14,11 +14,10 @@ import pandas as pd import pytest - from graphrag.query.context_builder.community_context import ( NO_COMMUNITY_RECORDS_WARNING, ) -from graphrag.storage.blob_pipeline_storage import BlobPipelineStorage +from graphrag_storage.azure_blob_storage import AzureBlobStorage logger = logging.getLogger(__name__) @@ -95,7 +94,7 @@ async def prepare_azurite_data(input_path: str, azure: dict) -> Callable[[], Non input_base_dir = azure.get("input_base_dir") root = Path(input_path) - input_storage = BlobPipelineStorage( + input_storage = AzureBlobStorage( connection_string=WELL_KNOWN_AZURITE_CONNECTION_STRING, container_name=input_container, ) @@ -127,7 +126,8 @@ class TestIndexer: def __run_indexer( self, root: Path, - input_file_type: str, + input_type: str, + index_method: str, ): command = [ "uv", @@ -138,7 +138,7 @@ def __run_indexer( "--root", root.resolve().as_posix(), "--method", - "standard", + index_method, ] command = [arg for arg in command if arg] logger.info("running command ", " ".join(command)) @@ -204,14 +204,13 @@ def __run_query(self, root: Path, query_config: dict[str, str]): "run", "poe", "query", + query_config["query"], "--root", root.resolve().as_posix(), "--method", query_config["method"], "--community-level", str(query_config.get("community_level", 2)), - "--query", - query_config["query"], ] logger.info("running command ", " ".join(command)) @@ -233,7 +232,8 @@ def __run_query(self, root: Path, query_config: dict[str, str]): def test_fixture( self, input_path: str, - input_file_type: str, + input_type: str, + index_method: str, workflow_config: dict[str, dict[str, Any]], query_config: list[dict[str, str]], ): @@ -248,7 +248,7 @@ def test_fixture( dispose = asyncio.run(prepare_azurite_data(input_path, azure)) print("running indexer") - self.__run_indexer(root, input_file_type) + self.__run_indexer(root, input_type, index_method) print("indexer complete") if dispose is not None: diff --git a/tests/unit/indexing/operations/__init__.py b/tests/unit/chunking/__init__.py similarity index 100% rename from tests/unit/indexing/operations/__init__.py rename to tests/unit/chunking/__init__.py diff --git a/tests/unit/chunking/test_chunker.py b/tests/unit/chunking/test_chunker.py new file mode 100644 index 0000000000..5addee34d2 --- /dev/null +++ b/tests/unit/chunking/test_chunker.py @@ -0,0 +1,190 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +from typing import Any +from unittest.mock import Mock, patch + +from graphrag.tokenizer.get_tokenizer import get_tokenizer +from graphrag_chunking.bootstrap_nltk import bootstrap +from graphrag_chunking.chunk_strategy_type import ChunkerType +from graphrag_chunking.chunker_factory import create_chunker +from graphrag_chunking.chunking_config import ChunkingConfig +from graphrag_chunking.token_chunker import ( + split_text_on_tokens, +) +from graphrag_llm.tokenizer import Tokenizer + + +class MockTokenizer(Tokenizer): + def __init__(self, **kwargs: Any) -> None: + """Initialize the LiteLLM Tokenizer.""" + + def encode(self, text) -> list[int]: + return [ord(char) for char in text] + + def decode(self, tokens) -> str: + return "".join(chr(id) for id in tokens) + + +class TestRunSentences: + def setup_method(self, method): + bootstrap() + + def test_basic_functionality(self): + """Test basic sentence splitting""" + input = "This is a test. Another sentence. And a third one!" + chunker = create_chunker(ChunkingConfig(type=ChunkerType.Sentence)) + chunks = chunker.chunk(input) + + assert len(chunks) == 3 + assert chunks[0].text == "This is a test." + assert chunks[0].index == 0 + assert chunks[0].start_char == 0 + assert chunks[0].end_char == 14 + + assert chunks[1].text == "Another sentence." + assert chunks[1].index == 1 + assert chunks[1].start_char == 16 + assert chunks[1].end_char == 32 + + assert chunks[2].text == "And a third one!" + assert chunks[2].index == 2 + assert chunks[2].start_char == 34 + assert chunks[2].end_char == 49 + + def test_mixed_whitespace_handling(self): + """Test input with irregular whitespace""" + input = " Sentence with spaces. Another one! " + chunker = create_chunker(ChunkingConfig(type=ChunkerType.Sentence)) + chunks = chunker.chunk(input) + + assert len(chunks) == 2 + assert chunks[0].text == "Sentence with spaces." + assert chunks[0].index == 0 + assert chunks[0].start_char == 3 + assert chunks[0].end_char == 23 + + assert chunks[1].text == "Another one!" + assert chunks[1].index == 1 + assert chunks[1].start_char == 25 + assert chunks[1].end_char == 36 + + +class TestRunTokens: + @patch("tiktoken.get_encoding") + def test_basic_functionality(self, mock_get_encoding): + mock_encoder = Mock() + mock_encoder.encode.side_effect = lambda x: list(x.encode()) + mock_encoder.decode.side_effect = lambda x: bytes(x).decode() + mock_get_encoding.return_value = mock_encoder + + input = "Marley was dead: to begin with. There is no doubt whatever about that. The register of his burial was signed by the clergyman, the clerk, the undertaker, and the chief mourner. Scrooge signed it. And Scrooge's name was good upon 'Change, for anything he chose to put his hand to." + + config = ChunkingConfig( + size=5, + overlap=1, + encoding_model="fake-encoding", + type=ChunkerType.Tokens, + ) + + chunker = create_chunker(config, mock_encoder.encode, mock_encoder.decode) + chunks = chunker.chunk(input) + + assert len(chunks) > 0 + + +def test_split_text_str_empty(): + tokenizer = get_tokenizer() + result = split_text_on_tokens( + "", + chunk_size=5, + chunk_overlap=2, + encode=tokenizer.encode, + decode=tokenizer.decode, + ) + assert result == [] + + +def test_split_text_on_tokens(): + text = "This is a test text, meaning to be taken seriously by this test only." + mocked_tokenizer = MockTokenizer() + expected_splits = [ + "This is a ", + "is a test ", + "test text,", + "text, mean", + " meaning t", + "ing to be ", + "o be taken", + "taken seri", # cspell:disable-line + " seriously", + "ously by t", # cspell:disable-line + " by this t", + "his test o", + "est only.", + ] + + result = split_text_on_tokens( + text=text, + chunk_overlap=5, + chunk_size=10, + decode=mocked_tokenizer.decode, + encode=lambda text: mocked_tokenizer.encode(text), + ) + assert result == expected_splits + + +def test_split_text_on_tokens_one_overlap(): + text = "This is a test text, meaning to be taken seriously by this test only." + tokenizer = get_tokenizer(encoding_model="o200k_base") + + expected_splits = [ + "This is", + " is a", + " a test", + " test text", + " text,", + ", meaning", + " meaning to", + " to be", + " be taken", + " taken seriously", + " seriously by", + " by this", + " this test", + " test only", + " only.", + ] + + result = split_text_on_tokens( + text=text, + chunk_size=2, + chunk_overlap=1, + decode=tokenizer.decode, + encode=tokenizer.encode, + ) + assert result == expected_splits + + +def test_split_text_on_tokens_no_overlap(): + text = "This is a test text, meaning to be taken seriously by this test only." + tokenizer = get_tokenizer(encoding_model="o200k_base") + + expected_splits = [ + "This is a", + " test text,", + " meaning to be", + " taken seriously by", + " this test only", + ".", + ] + + result = split_text_on_tokens( + text=text, + chunk_size=3, + chunk_overlap=0, + decode=tokenizer.decode, + encode=tokenizer.encode, + ) + + assert result == expected_splits diff --git a/tests/unit/chunking/test_prepend_metadata.py b/tests/unit/chunking/test_prepend_metadata.py new file mode 100644 index 0000000000..74f5a698e5 --- /dev/null +++ b/tests/unit/chunking/test_prepend_metadata.py @@ -0,0 +1,44 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +from graphrag_chunking.transformers import add_metadata + + +def test_add_metadata_one_row(): + """Test prepending metadata to chunks""" + chunks = ["This is a test.", "Another sentence."] + metadata = {"message": "hello"} + transformer = add_metadata(metadata) + results = [transformer(chunk) for chunk in chunks] + assert results[0] == "message: hello\nThis is a test." + assert results[1] == "message: hello\nAnother sentence." + + +def test_add_metadata_one_row_append(): + """Test prepending metadata to chunks""" + chunks = ["This is a test.", "Another sentence."] + metadata = {"message": "hello"} + transformer = add_metadata(metadata, append=True) + results = [transformer(chunk) for chunk in chunks] + assert results[0] == "This is a test.message: hello\n" + assert results[1] == "Another sentence.message: hello\n" + + +def test_add_metadata_multiple_rows(): + """Test prepending metadata to chunks""" + chunks = ["This is a test.", "Another sentence."] + metadata = {"message": "hello", "tag": "first"} + transformer = add_metadata(metadata) + results = [transformer(chunk) for chunk in chunks] + assert results[0] == "message: hello\ntag: first\nThis is a test." + assert results[1] == "message: hello\ntag: first\nAnother sentence." + + +def test_add_metadata_custom_delimiters(): + """Test prepending metadata to chunks""" + chunks = ["This is a test.", "Another sentence."] + metadata = {"message": "hello", "tag": "first"} + transformer = add_metadata(metadata, delimiter="-", line_delimiter="_") + results = [transformer(chunk) for chunk in chunks] + assert results[0] == "message-hello_tag-first_This is a test." + assert results[1] == "message-hello_tag-first_Another sentence." diff --git a/tests/unit/config/fixtures/minimal_config/settings.yaml b/tests/unit/config/fixtures/minimal_config/settings.yaml index 82183a4552..049c2fa131 100644 --- a/tests/unit/config/fixtures/minimal_config/settings.yaml +++ b/tests/unit/config/fixtures/minimal_config/settings.yaml @@ -1,11 +1,11 @@ -models: - default_chat_model: +completion_models: + default_completion_model: api_key: ${CUSTOM_API_KEY} - type: chat model_provider: openai - model: gpt-4-turbo-preview + model: gpt-4.1 + +embedding_models: default_embedding_model: api_key: ${CUSTOM_API_KEY} - type: embedding model_provider: openai - model: text-embedding-3-small \ No newline at end of file + model: text-embedding-3-large diff --git a/tests/unit/config/fixtures/minimal_config_missing_env_var/settings.yaml b/tests/unit/config/fixtures/minimal_config_missing_env_var/settings.yaml index 651b997a5c..ab370e4ab6 100644 --- a/tests/unit/config/fixtures/minimal_config_missing_env_var/settings.yaml +++ b/tests/unit/config/fixtures/minimal_config_missing_env_var/settings.yaml @@ -1,11 +1,11 @@ -models: - default_chat_model: +completion_models: + default_completion_model: api_key: ${SOME_NON_EXISTENT_ENV_VAR} - type: chat model_provider: openai - model: gpt-4-turbo-preview + model: gpt-4.1 + +embedding_models: default_embedding_model: api_key: ${SOME_NON_EXISTENT_ENV_VAR} - type: embedding model_provider: openai - model: text-embedding-3-small \ No newline at end of file + model: text-embedding-3-large diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index a741de7c40..75a472f023 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -5,166 +5,56 @@ from pathlib import Path from unittest import mock -import pytest -from pydantic import ValidationError - -import graphrag.config.defaults as defs -from graphrag.config.create_graphrag_config import create_graphrag_config -from graphrag.config.enums import AuthType, ModelType from graphrag.config.load_config import load_config +from graphrag.config.models.graph_rag_config import GraphRagConfig + from tests.unit.config.utils import ( - DEFAULT_EMBEDDING_MODEL_CONFIG, - DEFAULT_MODEL_CONFIG, + DEFAULT_COMPLETION_MODELS, + DEFAULT_EMBEDDING_MODELS, FAKE_API_KEY, assert_graphrag_configs, get_default_graphrag_config, ) -def test_missing_openai_required_api_key() -> None: - model_config_missing_api_key = { - defs.DEFAULT_CHAT_MODEL_ID: { - "type": ModelType.OpenAIChat, - "model": defs.DEFAULT_CHAT_MODEL, - }, - defs.DEFAULT_EMBEDDING_MODEL_ID: DEFAULT_EMBEDDING_MODEL_CONFIG, - } - - # API Key required for OpenAIChat - with pytest.raises(ValidationError): - create_graphrag_config({"models": model_config_missing_api_key}) - - # API Key required for OpenAIEmbedding - model_config_missing_api_key[defs.DEFAULT_CHAT_MODEL_ID]["type"] = ( - ModelType.OpenAIEmbedding - ) - with pytest.raises(ValidationError): - create_graphrag_config({"models": model_config_missing_api_key}) - - -def test_missing_azure_api_key() -> None: - model_config_missing_api_key = { - defs.DEFAULT_CHAT_MODEL_ID: { - "type": ModelType.AzureOpenAIChat, - "auth_type": AuthType.APIKey, - "model": defs.DEFAULT_CHAT_MODEL, - "api_base": "some_api_base", - "api_version": "some_api_version", - "deployment_name": "some_deployment_name", - }, - defs.DEFAULT_EMBEDDING_MODEL_ID: DEFAULT_EMBEDDING_MODEL_CONFIG, - } - - with pytest.raises(ValidationError): - create_graphrag_config({"models": model_config_missing_api_key}) - - # API Key not required for managed identity - model_config_missing_api_key[defs.DEFAULT_CHAT_MODEL_ID]["auth_type"] = ( - AuthType.AzureManagedIdentity - ) - create_graphrag_config({"models": model_config_missing_api_key}) - - -def test_conflicting_auth_type() -> None: - model_config_invalid_auth_type = { - defs.DEFAULT_CHAT_MODEL_ID: { - "auth_type": AuthType.AzureManagedIdentity, - "type": ModelType.OpenAIChat, - "model": defs.DEFAULT_CHAT_MODEL, - }, - defs.DEFAULT_EMBEDDING_MODEL_ID: DEFAULT_EMBEDDING_MODEL_CONFIG, - } - - with pytest.raises(ValidationError): - create_graphrag_config({"models": model_config_invalid_auth_type}) - - -def test_conflicting_azure_api_key() -> None: - model_config_conflicting_api_key = { - defs.DEFAULT_CHAT_MODEL_ID: { - "type": ModelType.AzureOpenAIChat, - "auth_type": AuthType.AzureManagedIdentity, - "model": defs.DEFAULT_CHAT_MODEL, - "api_base": "some_api_base", - "api_version": "some_api_version", - "deployment_name": "some_deployment_name", - "api_key": "THIS_SHOULD_NOT_BE_SET_WHEN_USING_MANAGED_IDENTITY", - }, - defs.DEFAULT_EMBEDDING_MODEL_ID: DEFAULT_EMBEDDING_MODEL_CONFIG, - } - - with pytest.raises(ValidationError): - create_graphrag_config({"models": model_config_conflicting_api_key}) - - -base_azure_model_config = { - "type": ModelType.AzureOpenAIChat, - "auth_type": AuthType.AzureManagedIdentity, - "model": defs.DEFAULT_CHAT_MODEL, - "api_base": "some_api_base", - "api_version": "some_api_version", - "deployment_name": "some_deployment_name", -} - - -def test_missing_azure_api_base() -> None: - missing_api_base_config = base_azure_model_config.copy() - del missing_api_base_config["api_base"] - - with pytest.raises(ValidationError): - create_graphrag_config({ - "models": { - defs.DEFAULT_CHAT_MODEL_ID: missing_api_base_config, - defs.DEFAULT_EMBEDDING_MODEL_ID: DEFAULT_EMBEDDING_MODEL_CONFIG, - } - }) - - -def test_missing_azure_api_version() -> None: - missing_api_version_config = base_azure_model_config.copy() - del missing_api_version_config["api_version"] - - with pytest.raises(ValidationError): - create_graphrag_config({ - "models": { - defs.DEFAULT_CHAT_MODEL_ID: missing_api_version_config, - defs.DEFAULT_EMBEDDING_MODEL_ID: DEFAULT_EMBEDDING_MODEL_CONFIG, - } - }) - - def test_default_config() -> None: expected = get_default_graphrag_config() - actual = create_graphrag_config({"models": DEFAULT_MODEL_CONFIG}) + actual = GraphRagConfig( + completion_models=DEFAULT_COMPLETION_MODELS, # type: ignore + embedding_models=DEFAULT_EMBEDDING_MODELS, # type: ignore + ) assert_graphrag_configs(actual, expected) @mock.patch.dict(os.environ, {"CUSTOM_API_KEY": FAKE_API_KEY}, clear=True) def test_load_minimal_config() -> None: - cwd = Path(__file__).parent - root_dir = (cwd / "fixtures" / "minimal_config").resolve() - expected = get_default_graphrag_config(str(root_dir)) - actual = load_config(root_dir=root_dir) + cwd = Path.cwd() + root_dir = (Path(__file__).parent / "fixtures" / "minimal_config").resolve() + os.chdir(root_dir) + expected = get_default_graphrag_config() + + actual = load_config( + root_dir=root_dir, + ) assert_graphrag_configs(actual, expected) + # Need to reset cwd after test + os.chdir(cwd) @mock.patch.dict(os.environ, {"CUSTOM_API_KEY": FAKE_API_KEY}, clear=True) def test_load_config_with_cli_overrides() -> None: - cwd = Path(__file__).parent - root_dir = (cwd / "fixtures" / "minimal_config").resolve() + cwd = Path.cwd() + root_dir = (Path(__file__).parent / "fixtures" / "minimal_config").resolve() + os.chdir(root_dir) output_dir = "some_output_dir" expected_output_base_dir = root_dir / output_dir - expected = get_default_graphrag_config(str(root_dir)) - expected.output.base_dir = str(expected_output_base_dir) + expected = get_default_graphrag_config() + expected.output_storage.base_dir = str(expected_output_base_dir) + actual = load_config( root_dir=root_dir, - cli_overrides={"output.base_dir": output_dir}, + cli_overrides={"output_storage": {"base_dir": output_dir}}, ) assert_graphrag_configs(actual, expected) - - -def test_load_config_missing_env_vars() -> None: - cwd = Path(__file__).parent - root_dir = (cwd / "fixtures" / "minimal_config_missing_env_var").resolve() - with pytest.raises(KeyError): - load_config(root_dir=root_dir) + # Need to reset cwd after test + os.chdir(cwd) diff --git a/tests/unit/config/test_metrics_config.py b/tests/unit/config/test_metrics_config.py new file mode 100644 index 0000000000..967389c252 --- /dev/null +++ b/tests/unit/config/test_metrics_config.py @@ -0,0 +1,29 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Test metrics configuration loading.""" + +import pytest +from graphrag_llm.config import ( + MetricsConfig, + MetricsWriterType, +) + + +def test_file_metrics_writer_validation() -> None: + """Test that missing required parameters raise validation errors.""" + + with pytest.raises( + ValueError, + match="base_dir must be specified for file-based metrics writer\\.", + ): + _ = MetricsConfig( + writer=MetricsWriterType.File, + base_dir=" ", + ) + + # passes validation + _ = MetricsConfig( + writer=MetricsWriterType.File, + base_dir="./metrics", + ) diff --git a/tests/unit/config/test_model_config.py b/tests/unit/config/test_model_config.py new file mode 100644 index 0000000000..f2e7aec8e4 --- /dev/null +++ b/tests/unit/config/test_model_config.py @@ -0,0 +1,110 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Test model configuration loading.""" + +import pytest +from graphrag_llm.config import AuthMethod, LLMProviderType, ModelConfig +from pydantic import ValidationError + + +def test_litellm_provider_validation() -> None: + """Test that missing required parameters raise validation errors.""" + + with pytest.raises(ValidationError): + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="openai", + model="", + ) + + with pytest.raises(ValidationError): + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="", + model="gpt-4o", + ) + + with pytest.raises( + ValueError, + match="api_key must be set when auth_method=api_key\\.", + ): + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="openai", + model="gpt-4o", + ) + + with pytest.raises( + ValueError, + match="azure_deployment_name should not be specified for non-Azure model providers\\.", + ): + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="openai", + model="gpt-4o", + azure_deployment_name="some-deployment", + ) + + with pytest.raises( + ValueError, + match="api_base must be specified with the 'azure' model provider\\.", + ): + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="azure", + model="gpt-4o", + ) + + with pytest.raises( + ValueError, + match="api_key should not be set when using Azure Managed Identity\\.", + ): + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="azure", + model="gpt-4o", + azure_deployment_name="gpt-4o", + api_base="https://my-azure-endpoint/", + api_version="2024-06-01", + auth_method=AuthMethod.AzureManagedIdentity, + api_key="some-api-key", + ) + + with pytest.raises( + ValueError, + match="api_key must be set when auth_method=api_key\\.", + ): + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="azure", + azure_deployment_name="gpt-4o", + api_base="https://my-azure-endpoint/", + api_version="2024-06-01", + model="gpt-4o", + ) + + # pass validation + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="openai", + model="gpt-4o", + api_key="NOT_A_REAL_API_KEY", + ) + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="azure", + model="gpt-4o", + azure_deployment_name="gpt-4o", + api_base="https://my-azure-endpoint/", + api_key="NOT_A_REAL_API_KEY", + ) + _ = ModelConfig( + type=LLMProviderType.LiteLLM, + model_provider="azure", + model="gpt-4o", + azure_deployment_name="gpt-4o", + api_base="https://my-azure-endpoint/", + api_version="2024-06-01", + auth_method=AuthMethod.AzureManagedIdentity, + ) diff --git a/tests/unit/config/test_rate_limit_config.py b/tests/unit/config/test_rate_limit_config.py new file mode 100644 index 0000000000..938e1d4d4a --- /dev/null +++ b/tests/unit/config/test_rate_limit_config.py @@ -0,0 +1,66 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Test rate limit configuration loading.""" + +import pytest +from graphrag_llm.config import RateLimitConfig, RateLimitType + + +def test_sliding_window_validation() -> None: + """Test that missing required parameters raise validation errors.""" + + with pytest.raises( + ValueError, + match="period_in_seconds must be a positive integer for Sliding Window rate limit\\.", + ): + _ = RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=0, + requests_per_period=100, + tokens_per_period=1000, + ) + + with pytest.raises( + ValueError, + match="At least one of requests_per_period or tokens_per_period must be specified for Sliding Window rate limit\\.", + ): + _ = RateLimitConfig( + type=RateLimitType.SlidingWindow, + ) + + with pytest.raises( + ValueError, + match="requests_per_period must be a positive integer for Sliding Window rate limit\\.", + ): + _ = RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=60, + requests_per_period=-10, + ) + + with pytest.raises( + ValueError, + match="tokens_per_period must be a positive integer for Sliding Window rate limit\\.", + ): + _ = RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=60, + tokens_per_period=-10, + ) + + # passes validation + _ = RateLimitConfig( + type=RateLimitType.SlidingWindow, + requests_per_period=100, + ) + _ = RateLimitConfig( + type=RateLimitType.SlidingWindow, + tokens_per_period=1000, + ) + _ = RateLimitConfig( + type=RateLimitType.SlidingWindow, + period_in_seconds=60, + requests_per_period=100, + tokens_per_period=1000, + ) diff --git a/tests/unit/config/test_retry_config.py b/tests/unit/config/test_retry_config.py new file mode 100644 index 0000000000..2c3aff8375 --- /dev/null +++ b/tests/unit/config/test_retry_config.py @@ -0,0 +1,67 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Test retry configuration loading.""" + +import pytest +from graphrag_llm.config import RetryConfig, RetryType + + +def test_exponential_backoff_validation() -> None: + """Test that missing required parameters raise validation errors.""" + + with pytest.raises( + ValueError, + match="max_retries must be greater than 1 for Exponential Backoff retry\\.", + ): + _ = RetryConfig( + type=RetryType.ExponentialBackoff, + max_retries=0, + ) + + with pytest.raises( + ValueError, + match="base_delay must be greater than 1\\.0 for Exponential Backoff retry\\.", + ): + _ = RetryConfig( + type=RetryType.ExponentialBackoff, + base_delay=0.5, + ) + + with pytest.raises( + ValueError, + match="max_delay must be greater than 1 for Exponential Backoff retry\\.", + ): + _ = RetryConfig( + type=RetryType.ExponentialBackoff, + max_delay=0.5, + ) + + # passes validation + _ = RetryConfig(type=RetryType.ExponentialBackoff) + _ = RetryConfig( + type=RetryType.ExponentialBackoff, + max_retries=5, + base_delay=2.0, + max_delay=30, + ) + + +def test_immediate_validation() -> None: + """Test that missing required parameters raise validation errors.""" + + with pytest.raises( + ValueError, + match="max_retries must be greater than 1 for Immediate retry\\.", + ): + _ = RetryConfig( + type=RetryType.Immediate, + max_retries=0, + ) + + # passes validation + _ = RetryConfig(type=RetryType.Immediate) + _ = RetryConfig( + type=RetryType.Immediate, + max_retries=3, + ) diff --git a/tests/unit/config/test_template_engine_config.py b/tests/unit/config/test_template_engine_config.py new file mode 100644 index 0000000000..26aa01b895 --- /dev/null +++ b/tests/unit/config/test_template_engine_config.py @@ -0,0 +1,44 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Test metrics configuration loading.""" + +import pytest +from graphrag_llm.config import ( + TemplateEngineConfig, + TemplateEngineType, + TemplateManagerType, +) + + +def test_template_engine_config_validation() -> None: + """Test that missing required parameters raise validation errors.""" + + with pytest.raises( + ValueError, + match="base_dir must be specified for file-based template managers\\.", + ): + _ = TemplateEngineConfig( + type=TemplateEngineType.Jinja, + template_manager=TemplateManagerType.File, + base_dir=" ", + ) + + with pytest.raises( + ValueError, + match="template_extension cannot be an empty string for file-based template managers\\.", + ): + _ = TemplateEngineConfig( + type=TemplateEngineType.Jinja, + template_manager=TemplateManagerType.File, + base_dir="./templates", + template_extension=" ", + ) + + # passes validation + _ = TemplateEngineConfig( + type=TemplateEngineType.Jinja, + template_manager=TemplateManagerType.File, + base_dir="./templates", + template_extension=".jinja", + ) diff --git a/tests/unit/config/test_tokenizer_config.py b/tests/unit/config/test_tokenizer_config.py new file mode 100644 index 0000000000..62b7f6ebf6 --- /dev/null +++ b/tests/unit/config/test_tokenizer_config.py @@ -0,0 +1,39 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Test tokenizer configuration loading.""" + +import pytest +from graphrag_llm.config import TokenizerConfig, TokenizerType + + +def test_litellm_tokenizer_validation() -> None: + """Test that missing required parameters raise validation errors.""" + + with pytest.raises( + ValueError, + match="model_id must be specified for LiteLLM tokenizer\\.", + ): + _ = TokenizerConfig( + type=TokenizerType.LiteLLM, + model_id="", + ) + + with pytest.raises( + ValueError, + match="encoding_name must be specified for TikToken tokenizer\\.", + ): + _ = TokenizerConfig( + type=TokenizerType.Tiktoken, + encoding_name="", + ) + + # passes validation + _ = TokenizerConfig( + type=TokenizerType.LiteLLM, + model_id="openai/gpt-4o", + ) + _ = TokenizerConfig( + type=TokenizerType.Tiktoken, + encoding_name="o200k-base", + ) diff --git a/tests/unit/config/utils.py b/tests/unit/config/utils.py index ab988a50ae..ae898d4568 100644 --- a/tests/unit/config/utils.py +++ b/tests/unit/config/utils.py @@ -3,17 +3,13 @@ from dataclasses import asdict -from pydantic import BaseModel - import graphrag.config.defaults as defs from graphrag.config.models.basic_search_config import BasicSearchConfig -from graphrag.config.models.cache_config import CacheConfig -from graphrag.config.models.chunking_config import ChunkingConfig from graphrag.config.models.cluster_graph_config import ClusterGraphConfig from graphrag.config.models.community_reports_config import CommunityReportsConfig from graphrag.config.models.drift_search_config import DRIFTSearchConfig -from graphrag.config.models.embed_graph_config import EmbedGraphConfig -from graphrag.config.models.extract_claims_config import ClaimExtractionConfig +from graphrag.config.models.embed_text_config import EmbedTextConfig +from graphrag.config.models.extract_claims_config import ExtractClaimsConfig from graphrag.config.models.extract_graph_config import ExtractGraphConfig from graphrag.config.models.extract_graph_nlp_config import ( ExtractGraphNLPConfig, @@ -21,109 +17,112 @@ ) from graphrag.config.models.global_search_config import GlobalSearchConfig from graphrag.config.models.graph_rag_config import GraphRagConfig -from graphrag.config.models.input_config import InputConfig -from graphrag.config.models.language_model_config import LanguageModelConfig from graphrag.config.models.local_search_config import LocalSearchConfig from graphrag.config.models.prune_graph_config import PruneGraphConfig from graphrag.config.models.reporting_config import ReportingConfig from graphrag.config.models.snapshots_config import SnapshotsConfig -from graphrag.config.models.storage_config import StorageConfig from graphrag.config.models.summarize_descriptions_config import ( SummarizeDescriptionsConfig, ) -from graphrag.config.models.text_embedding_config import TextEmbeddingConfig -from graphrag.config.models.umap_config import UmapConfig -from graphrag.config.models.vector_store_config import VectorStoreConfig +from graphrag_cache import CacheConfig +from graphrag_chunking.chunking_config import ChunkingConfig +from graphrag_input import InputConfig +from graphrag_llm.config import MetricsConfig, ModelConfig, RateLimitConfig, RetryConfig +from graphrag_storage import StorageConfig +from graphrag_vectors import VectorStoreConfig FAKE_API_KEY = "NOT_AN_API_KEY" -DEFAULT_CHAT_MODEL_CONFIG = { +DEFAULT_COMPLETION_MODEL_CONFIG = { "api_key": FAKE_API_KEY, - "type": defs.DEFAULT_CHAT_MODEL_TYPE.value, - "model": defs.DEFAULT_CHAT_MODEL, + "model": defs.DEFAULT_COMPLETION_MODEL, "model_provider": defs.DEFAULT_MODEL_PROVIDER, } DEFAULT_EMBEDDING_MODEL_CONFIG = { "api_key": FAKE_API_KEY, - "type": defs.DEFAULT_EMBEDDING_MODEL_TYPE.value, "model": defs.DEFAULT_EMBEDDING_MODEL, "model_provider": defs.DEFAULT_MODEL_PROVIDER, } -DEFAULT_MODEL_CONFIG = { - defs.DEFAULT_CHAT_MODEL_ID: DEFAULT_CHAT_MODEL_CONFIG, +DEFAULT_COMPLETION_MODELS = { + defs.DEFAULT_COMPLETION_MODEL_ID: DEFAULT_COMPLETION_MODEL_CONFIG, +} + +DEFAULT_EMBEDDING_MODELS = { defs.DEFAULT_EMBEDDING_MODEL_ID: DEFAULT_EMBEDDING_MODEL_CONFIG, } -def get_default_graphrag_config(root_dir: str | None = None) -> GraphRagConfig: +def get_default_graphrag_config() -> GraphRagConfig: return GraphRagConfig(**{ **asdict(defs.graphrag_config_defaults), - "models": DEFAULT_MODEL_CONFIG, - **({"root_dir": root_dir} if root_dir else {}), + "completion_models": DEFAULT_COMPLETION_MODELS, + "embedding_models": DEFAULT_EMBEDDING_MODELS, }) -def assert_language_model_configs( - actual: LanguageModelConfig, expected: LanguageModelConfig +def assert_retry_configs(actual: RetryConfig, expected: RetryConfig) -> None: + assert actual.type == expected.type + assert actual.max_retries == expected.max_retries + assert actual.base_delay == expected.base_delay + assert actual.jitter == expected.jitter + assert actual.max_delay == expected.max_delay + + +def assert_rate_limit_configs( + actual: RateLimitConfig, expected: RateLimitConfig ) -> None: - assert actual.api_key == expected.api_key - assert actual.auth_type == expected.auth_type assert actual.type == expected.type + assert actual.period_in_seconds == expected.period_in_seconds + assert actual.requests_per_period == expected.requests_per_period + assert actual.tokens_per_period == expected.tokens_per_period + + +def assert_metrics_configs(actual: MetricsConfig, expected: MetricsConfig) -> None: + assert actual.type == expected.type + assert actual.store == expected.store + assert actual.writer == expected.writer + assert actual.log_level == expected.log_level + assert actual.base_dir == expected.base_dir + + +def assert_model_configs(actual: ModelConfig, expected: ModelConfig) -> None: + assert actual.type == expected.type + assert actual.model_provider == expected.model_provider assert actual.model == expected.model - assert actual.encoding_model == expected.encoding_model - assert actual.max_tokens == expected.max_tokens - assert actual.temperature == expected.temperature - assert actual.max_completion_tokens == expected.max_completion_tokens - assert actual.top_p == expected.top_p - assert actual.n == expected.n - assert actual.frequency_penalty == expected.frequency_penalty - assert actual.presence_penalty == expected.presence_penalty - assert actual.request_timeout == expected.request_timeout + assert actual.call_args == expected.call_args assert actual.api_base == expected.api_base assert actual.api_version == expected.api_version - assert actual.deployment_name == expected.deployment_name - assert actual.organization == expected.organization - assert actual.proxy == expected.proxy - assert actual.audience == expected.audience - assert actual.model_supports_json == expected.model_supports_json - assert actual.tokens_per_minute == expected.tokens_per_minute - assert actual.requests_per_minute == expected.requests_per_minute - assert actual.retry_strategy == expected.retry_strategy - assert actual.max_retries == expected.max_retries - assert actual.max_retry_wait == expected.max_retry_wait - assert actual.concurrent_requests == expected.concurrent_requests - assert actual.async_mode == expected.async_mode - if actual.responses is not None: - assert expected.responses is not None - assert len(actual.responses) == len(expected.responses) - for e, a in zip(actual.responses, expected.responses, strict=True): - assert isinstance(e, BaseModel) - assert isinstance(a, BaseModel) - assert e.model_dump() == a.model_dump() + assert actual.api_key == expected.api_key + assert actual.auth_method == expected.auth_method + assert actual.azure_deployment_name == expected.azure_deployment_name + if actual.retry and expected.retry: + assert_retry_configs(actual.retry, expected.retry) else: - assert expected.responses is None + assert actual.retry == expected.retry + if actual.rate_limit and expected.rate_limit: + assert_rate_limit_configs(actual.rate_limit, expected.rate_limit) + else: + assert actual.rate_limit == expected.rate_limit + if actual.metrics and expected.metrics: + assert_metrics_configs(actual.metrics, expected.metrics) + else: + assert actual.metrics == expected.metrics + assert actual.mock_responses == expected.mock_responses def assert_vector_store_configs( - actual: dict[str, VectorStoreConfig], - expected: dict[str, VectorStoreConfig], + actual: VectorStoreConfig, + expected: VectorStoreConfig, ): assert type(actual) is type(expected) - assert len(actual) == len(expected) - for (index_a, store_a), (index_e, store_e) in zip( - actual.items(), expected.items(), strict=True - ): - assert index_a == index_e - assert store_a.type == store_e.type - assert store_a.db_uri == store_e.db_uri - assert store_a.url == store_e.url - assert store_a.api_key == store_e.api_key - assert store_a.audience == store_e.audience - assert store_a.container_name == store_e.container_name - assert store_a.overwrite == store_e.overwrite - assert store_a.database_name == store_e.database_name + assert actual.type == expected.type + assert actual.db_uri == expected.db_uri + assert actual.url == expected.url + assert actual.api_key == expected.api_key + assert actual.audience == expected.audience + assert actual.database_name == expected.database_name def assert_reporting_configs( @@ -133,88 +132,48 @@ def assert_reporting_configs( assert actual.base_dir == expected.base_dir assert actual.connection_string == expected.connection_string assert actual.container_name == expected.container_name - assert actual.storage_account_blob_url == expected.storage_account_blob_url - + assert actual.account_url == expected.account_url -def assert_output_configs(actual: StorageConfig, expected: StorageConfig) -> None: - assert expected.type == actual.type - assert expected.base_dir == actual.base_dir - assert expected.connection_string == actual.connection_string - assert expected.container_name == actual.container_name - assert expected.storage_account_blob_url == actual.storage_account_blob_url - assert expected.cosmosdb_account_url == actual.cosmosdb_account_url - -def assert_update_output_configs( - actual: StorageConfig, expected: StorageConfig -) -> None: +def assert_storage_config(actual: StorageConfig, expected: StorageConfig) -> None: assert expected.type == actual.type assert expected.base_dir == actual.base_dir assert expected.connection_string == actual.connection_string assert expected.container_name == actual.container_name - assert expected.storage_account_blob_url == actual.storage_account_blob_url - assert expected.cosmosdb_account_url == actual.cosmosdb_account_url + assert expected.account_url == actual.account_url + assert expected.encoding == actual.encoding + assert expected.database_name == actual.database_name def assert_cache_configs(actual: CacheConfig, expected: CacheConfig) -> None: assert actual.type == expected.type - assert actual.base_dir == expected.base_dir - assert actual.connection_string == expected.connection_string - assert actual.container_name == expected.container_name - assert actual.storage_account_blob_url == expected.storage_account_blob_url - assert actual.cosmosdb_account_url == expected.cosmosdb_account_url + if actual.storage and expected.storage: + assert_storage_config(actual.storage, expected.storage) def assert_input_configs(actual: InputConfig, expected: InputConfig) -> None: - assert actual.storage.type == expected.storage.type - assert actual.file_type == expected.file_type - assert actual.storage.base_dir == expected.storage.base_dir - assert actual.storage.connection_string == expected.storage.connection_string - assert ( - actual.storage.storage_account_blob_url - == expected.storage.storage_account_blob_url - ) - assert actual.storage.container_name == expected.storage.container_name + assert actual.type == expected.type assert actual.encoding == expected.encoding assert actual.file_pattern == expected.file_pattern - assert actual.file_filter == expected.file_filter assert actual.text_column == expected.text_column assert actual.title_column == expected.title_column - assert actual.metadata == expected.metadata - - -def assert_embed_graph_configs( - actual: EmbedGraphConfig, expected: EmbedGraphConfig -) -> None: - assert actual.enabled == expected.enabled - assert actual.dimensions == expected.dimensions - assert actual.num_walks == expected.num_walks - assert actual.walk_length == expected.walk_length - assert actual.window_size == expected.window_size - assert actual.iterations == expected.iterations - assert actual.random_seed == expected.random_seed - assert actual.use_lcc == expected.use_lcc def assert_text_embedding_configs( - actual: TextEmbeddingConfig, expected: TextEmbeddingConfig + actual: EmbedTextConfig, expected: EmbedTextConfig ) -> None: assert actual.batch_size == expected.batch_size assert actual.batch_max_tokens == expected.batch_max_tokens assert actual.names == expected.names - assert actual.strategy == expected.strategy - assert actual.model_id == expected.model_id - assert actual.vector_store_id == expected.vector_store_id + assert actual.embedding_model_id == expected.embedding_model_id def assert_chunking_configs(actual: ChunkingConfig, expected: ChunkingConfig) -> None: assert actual.size == expected.size assert actual.overlap == expected.overlap - assert actual.group_by_columns == expected.group_by_columns - assert actual.strategy == expected.strategy + assert actual.type == expected.type assert actual.encoding_model == expected.encoding_model assert actual.prepend_metadata == expected.prepend_metadata - assert actual.chunk_size_includes_metadata == expected.chunk_size_includes_metadata def assert_snapshots_configs( @@ -230,8 +189,7 @@ def assert_extract_graph_configs( assert actual.prompt == expected.prompt assert actual.entity_types == expected.entity_types assert actual.max_gleanings == expected.max_gleanings - assert actual.strategy == expected.strategy - assert actual.model_id == expected.model_id + assert actual.completion_model_id == expected.completion_model_id def assert_text_analyzer_configs( @@ -274,8 +232,7 @@ def assert_summarize_descriptions_configs( ) -> None: assert actual.prompt == expected.prompt assert actual.max_length == expected.max_length - assert actual.strategy == expected.strategy - assert actual.model_id == expected.model_id + assert actual.completion_model_id == expected.completion_model_id def assert_community_reports_configs( @@ -285,19 +242,17 @@ def assert_community_reports_configs( assert actual.text_prompt == expected.text_prompt assert actual.max_length == expected.max_length assert actual.max_input_length == expected.max_input_length - assert actual.strategy == expected.strategy - assert actual.model_id == expected.model_id + assert actual.completion_model_id == expected.completion_model_id def assert_extract_claims_configs( - actual: ClaimExtractionConfig, expected: ClaimExtractionConfig + actual: ExtractClaimsConfig, expected: ExtractClaimsConfig ) -> None: assert actual.enabled == expected.enabled assert actual.prompt == expected.prompt assert actual.description == expected.description assert actual.max_gleanings == expected.max_gleanings - assert actual.strategy == expected.strategy - assert actual.model_id == expected.model_id + assert actual.completion_model_id == expected.completion_model_id def assert_cluster_graph_configs( @@ -308,10 +263,6 @@ def assert_cluster_graph_configs( assert actual.seed == expected.seed -def assert_umap_configs(actual: UmapConfig, expected: UmapConfig) -> None: - assert actual.enabled == expected.enabled - - def assert_local_search_configs( actual: LocalSearchConfig, expected: LocalSearchConfig ) -> None: @@ -384,36 +335,30 @@ def assert_basic_search_configs( def assert_graphrag_configs(actual: GraphRagConfig, expected: GraphRagConfig) -> None: - assert actual.root_dir == expected.root_dir + completion_keys = sorted(actual.completion_models.keys()) + expected_completion_keys = sorted(expected.completion_models.keys()) + assert len(completion_keys) == len(expected_completion_keys) + for a, e in zip(completion_keys, expected_completion_keys, strict=False): + assert a == e + assert_model_configs(actual.completion_models[a], expected.completion_models[e]) - a_keys = sorted(actual.models.keys()) - e_keys = sorted(expected.models.keys()) - assert len(a_keys) == len(e_keys) - for a, e in zip(a_keys, e_keys, strict=False): + embedding_keys = sorted(actual.embedding_models.keys()) + expected_embedding_keys = sorted(expected.embedding_models.keys()) + assert len(embedding_keys) == len(expected_embedding_keys) + for a, e in zip(embedding_keys, expected_embedding_keys, strict=False): assert a == e - assert_language_model_configs(actual.models[a], expected.models[e]) + assert_model_configs(actual.embedding_models[a], expected.embedding_models[e]) assert_vector_store_configs(actual.vector_store, expected.vector_store) assert_reporting_configs(actual.reporting, expected.reporting) - assert_output_configs(actual.output, expected.output) - - if expected.outputs is not None: - assert actual.outputs is not None - assert len(actual.outputs) == len(expected.outputs) - for a, e in zip(actual.outputs.keys(), expected.outputs.keys(), strict=True): - assert_output_configs(actual.outputs[a], expected.outputs[e]) - else: - assert actual.outputs is None - - assert_update_output_configs( - actual.update_index_output, expected.update_index_output - ) + assert_storage_config(actual.output_storage, expected.output_storage) + assert_storage_config(actual.input_storage, expected.input_storage) + assert_storage_config(actual.update_output_storage, expected.update_output_storage) assert_cache_configs(actual.cache, expected.cache) assert_input_configs(actual.input, expected.input) - assert_embed_graph_configs(actual.embed_graph, expected.embed_graph) assert_text_embedding_configs(actual.embed_text, expected.embed_text) - assert_chunking_configs(actual.chunks, expected.chunks) + assert_chunking_configs(actual.chunking, expected.chunking) assert_snapshots_configs(actual.snapshots, expected.snapshots) assert_extract_graph_configs(actual.extract_graph, expected.extract_graph) assert_extract_graph_nlp_configs( @@ -428,7 +373,6 @@ def assert_graphrag_configs(actual: GraphRagConfig, expected: GraphRagConfig) -> assert_extract_claims_configs(actual.extract_claims, expected.extract_claims) assert_prune_graph_configs(actual.prune_graph, expected.prune_graph) assert_cluster_graph_configs(actual.cluster_graph, expected.cluster_graph) - assert_umap_configs(actual.umap, expected.umap) assert_local_search_configs(actual.local_search, expected.local_search) assert_global_search_configs(actual.global_search, expected.global_search) assert_drift_search_configs(actual.drift_search, expected.drift_search) diff --git a/tests/unit/indexing/operations/chunk_text/__init__.py b/tests/unit/graphrag_factory/__init__.py similarity index 100% rename from tests/unit/indexing/operations/chunk_text/__init__.py rename to tests/unit/graphrag_factory/__init__.py diff --git a/tests/unit/graphrag_factory/test_factory.py b/tests/unit/graphrag_factory/test_factory.py new file mode 100644 index 0000000000..94e59b9c02 --- /dev/null +++ b/tests/unit/graphrag_factory/test_factory.py @@ -0,0 +1,66 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Unit tests for graphrag_factory package.""" + +from abc import ABC, abstractmethod + +from graphrag_common.factory import Factory + + +class TestABC(ABC): + """Test abstract base class.""" + + @abstractmethod + def get_value(self) -> str: + """ + Get a string value. + + Returns + ------- + str: A string value. + """ + msg = "Subclasses must implement the get_value method." + raise NotImplementedError(msg) + + +class ConcreteTestClass(TestABC): + """Concrete implementation of TestABC.""" + + def __init__(self, value: str): + """Initialize with a string value.""" + self._value = value + + def get_value(self) -> str: + """Get a string value. + + Returns + ------- + str: A string value. + """ + return self._value + + +def test_factory() -> None: + """Test the factory behavior.""" + + class TestFactory(Factory[TestABC]): + """Test factory for TestABC implementations.""" + + factory = TestFactory() + factory.register("transient_strategy", ConcreteTestClass) + factory.register("singleton_strategy", ConcreteTestClass, scope="singleton") + + trans1 = factory.create("transient_strategy", {"value": "test1"}) + trans2 = factory.create("transient_strategy", {"value": "test2"}) + + assert trans1 is not trans2 + assert trans1.get_value() == "test1" + assert trans2.get_value() == "test2" + + single1 = factory.create("singleton_strategy", {"value": "singleton"}) + single2 = factory.create("singleton_strategy", {"value": "singleton"}) + + assert single1 is single2 + assert single1.get_value() == "singleton" + assert single2.get_value() == "singleton" diff --git a/tests/unit/indexing/text_splitting/__init__.py b/tests/unit/hasher/__init__.py similarity index 100% rename from tests/unit/indexing/text_splitting/__init__.py rename to tests/unit/hasher/__init__.py diff --git a/tests/unit/hasher/test_hasher.py b/tests/unit/hasher/test_hasher.py new file mode 100644 index 0000000000..4b13d0dd18 --- /dev/null +++ b/tests/unit/hasher/test_hasher.py @@ -0,0 +1,104 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Test hasher""" + +from graphrag_common.hasher import hash_data + + +def test_hash_data() -> None: + """Test hash data function.""" + # Test different types of data + + class TestClass: # noqa: B903 + """Test hasher class.""" + + def __init__(self, value: str) -> None: + self.value = value + + def _test_func(): + pass + + # All should work and not raise exceptions + _ = hash_data("test string") + _ = hash_data(12345) + _ = hash_data(12.345) + _ = hash_data([1, 2, 3, 4, 5]) + _ = hash_data({"key": "value", "number": 42}) + _ = hash_data((1, "two", 3.0)) + _ = hash_data({1, 2, 3, 4, 5}) + _ = hash_data(None) + _ = hash_data(True) + _ = hash_data(b"bytes data") + _ = hash_data({"nested": {"list": [1, 2, 3], "dict": {"a": "b"}}}) + _ = hash_data(range(10)) + _ = hash_data(frozenset([1, 2, 3])) + _ = hash_data(complex(1, 2)) + _ = hash_data(bytearray(b"byte array data")) + _ = hash_data(memoryview(b"memory view data")) + _ = hash_data(Exception("test exception")) + _ = hash_data(TestClass) + _ = hash_data(TestClass("instance value")) + _ = hash_data(lambda x: x * 2) + _ = hash_data(_test_func) + + # Test that equivalent data structures produce the same hash + data1 = { + "bool": True, + "int": 42, + "float": 3.14, + "str": "hello, world", + "list": [1, 2, 3], + "dict": {"key": "value"}, + "nested": { + "list_of_dicts": [{"a": 1}, {"b": 2}], + "dict_of_lists": {"numbers": [1, 2, 3]}, + }, + "tuple": (1, 2, 3), + "set": {1, 2, 3}, + "class": TestClass, + "function": _test_func, + "instance": TestClass("instance value"), + } + # Same data but different order + data2 = { + "bool": True, + "list": [1, 2, 3], + "float": 3.14, + "str": "hello, world", + "int": 42, + "nested": { + "dict_of_lists": {"numbers": [1, 2, 3]}, + "list_of_dicts": [{"a": 1}, {"b": 2}], + }, + "dict": {"key": "value"}, + "tuple": (1, 2, 3), + "class": TestClass, + "set": {1, 3, 2}, + "instance": TestClass("instance value"), + "function": _test_func, + } + + hash1 = hash_data(data1) + hash2 = hash_data(data2) + + assert hash1 == hash2, "Hashes should be the same for equivalent data structures" + + data3 = {"key1": "value1", "key2": 124, "key3": [1, 2, 3]} # Different value + hash3 = hash_data(data3) + + assert hash1 != hash3, "Hashes should be different for different data structures" + + # Test classes + instance1 = TestClass("value1") + instance2 = TestClass("value1") + instance3 = TestClass("value2") + hash_instance1 = hash_data(instance1) + hash_instance2 = hash_data(instance2) + hash_instance3 = hash_data(instance3) + assert hash_instance1 == hash_instance2, ( + "Hashes should be the same for equivalent class instances" + ) + assert hash_instance1 != hash_instance3, ( + "Hashes should be different for different class instances" + ) diff --git a/tests/unit/indexing/cache/test_file_pipeline_cache.py b/tests/unit/indexing/cache/test_file_pipeline_cache.py index c392b4e08e..ae38e5be4e 100644 --- a/tests/unit/indexing/cache/test_file_pipeline_cache.py +++ b/tests/unit/indexing/cache/test_file_pipeline_cache.py @@ -4,17 +4,23 @@ import os import unittest -from graphrag.cache.json_pipeline_cache import JsonPipelineCache -from graphrag.storage.file_pipeline_storage import ( - FilePipelineStorage, -) +from graphrag_cache import CacheConfig, CacheType +from graphrag_cache import create_cache as cc +from graphrag_storage import StorageConfig, StorageType TEMP_DIR = "./.tmp" def create_cache(): - storage = FilePipelineStorage(base_dir=os.path.join(os.getcwd(), ".tmp")) - return JsonPipelineCache(storage) + return cc( + CacheConfig( + type=CacheType.Json, + storage=StorageConfig( + type=StorageType.File, + base_dir=os.path.join(os.getcwd(), ".tmp"), + ), + ), + ) class TestFilePipelineCache(unittest.IsolatedAsyncioTestCase): diff --git a/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py b/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py index c6b07f8cbd..2b2fd4d12a 100644 --- a/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py +++ b/tests/unit/indexing/graph/extractors/community_reports/test_sort_context.py @@ -208,8 +208,8 @@ def test_sort_context(): ctx = sort_context(context, tokenizer=tokenizer) assert ctx is not None, "Context is none" num = tokenizer.num_tokens(ctx) - assert num == 828 if platform.system() == "Windows" else 826, ( - f"num_tokens is not matched for platform (win = 827, else 826): {num}" + assert num == 825 if platform.system() == "Windows" else 826, ( + f"num_tokens is not matched for platform (win = 825, else 826): {num}" ) diff --git a/tests/unit/indexing/graph/utils/test_stable_lcc.py b/tests/unit/indexing/graph/utils/test_stable_lcc.py index 244f3b905d..c4e17e54ee 100644 --- a/tests/unit/indexing/graph/utils/test_stable_lcc.py +++ b/tests/unit/indexing/graph/utils/test_stable_lcc.py @@ -3,7 +3,6 @@ import unittest import networkx as nx - from graphrag.index.utils.stable_lcc import stable_largest_connected_component @@ -20,32 +19,6 @@ def test_undirected_graph_run_twice_produces_same_graph(self): nx.generate_graphml(graph_out_2) ) - def test_directed_graph_keeps_source_target_intact(self): - # create the test graph as a directed graph - graph_in = self._create_strongly_connected_graph_with_edges_flipped( - digraph=True - ) - graph_out = stable_largest_connected_component(graph_in.copy()) - - # Make sure edges are the same and the direction is preserved - edges_1 = [f"{edge[0]} -> {edge[1]}" for edge in graph_in.edges(data=True)] - edges_2 = [f"{edge[0]} -> {edge[1]}" for edge in graph_out.edges(data=True)] - - assert edges_1 == edges_2 - - def test_directed_graph_run_twice_produces_same_graph(self): - # create the test graph as a directed graph - graph_in = self._create_strongly_connected_graph_with_edges_flipped( - digraph=True - ) - graph_out_1 = stable_largest_connected_component(graph_in.copy()) - graph_out_2 = stable_largest_connected_component(graph_in.copy()) - - # Make sure the output is identical when run multiple times - assert "".join(nx.generate_graphml(graph_out_1)) == "".join( - nx.generate_graphml(graph_out_2) - ) - def _create_strongly_connected_graph(self, digraph=False): graph = nx.Graph() if not digraph else nx.DiGraph() graph.add_node("1", node_name=1) diff --git a/tests/unit/indexing/input/data/one-html/input.html b/tests/unit/indexing/input/data/one-html/input.html new file mode 100644 index 0000000000..dbf8badc70 --- /dev/null +++ b/tests/unit/indexing/input/data/one-html/input.html @@ -0,0 +1,8 @@ + + +Test + + +Hi how are you today? + + \ No newline at end of file diff --git a/tests/unit/indexing/input/data/one-jsonl/input.jsonl b/tests/unit/indexing/input/data/one-jsonl/input.jsonl new file mode 100644 index 0000000000..2866aed408 --- /dev/null +++ b/tests/unit/indexing/input/data/one-jsonl/input.jsonl @@ -0,0 +1,3 @@ +{ "title": "Hello", "text": "Hi how are you today?"} +{ "title": "Goodbye", "text": "I'm outta here"} +{ "title": "Adios", "text": "See you later"} \ No newline at end of file diff --git a/tests/unit/indexing/input/test_csv_loader.py b/tests/unit/indexing/input/test_csv_loader.py index 965f836676..1a84d82676 100644 --- a/tests/unit/indexing/input/test_csv_loader.py +++ b/tests/unit/indexing/input/test_csv_loader.py @@ -1,66 +1,56 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -from graphrag.config.enums import InputFileType -from graphrag.config.models.input_config import InputConfig -from graphrag.config.models.storage_config import StorageConfig -from graphrag.index.input.factory import create_input -from graphrag.utils.api import create_storage_from_config +from graphrag_input import InputConfig, InputType, create_input_reader +from graphrag_storage import StorageConfig, create_storage async def test_csv_loader_one_file(): config = InputConfig( - storage=StorageConfig( - base_dir="tests/unit/indexing/input/data/one-csv", - ), - file_type=InputFileType.csv, + type=InputType.Csv, file_pattern=".*\\.csv$", ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (2, 4) - assert documents["title"].iloc[0] == "input.csv" + storage = create_storage( + StorageConfig( + base_dir="tests/unit/indexing/input/data/one-csv", + ) + ) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 2 + assert documents[0].title == "input.csv (0)" + assert documents[0].raw_data == { + "title": "Hello", + "text": "Hi how are you today?", + } + assert documents[1].title == "input.csv (1)" async def test_csv_loader_one_file_with_title(): config = InputConfig( - storage=StorageConfig( - base_dir="tests/unit/indexing/input/data/one-csv", - ), - file_type=InputFileType.csv, - file_pattern=".*\\.csv$", + type=InputType.Csv, title_column="title", ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (2, 4) - assert documents["title"].iloc[0] == "Hello" - - -async def test_csv_loader_one_file_with_metadata(): - config = InputConfig( - storage=StorageConfig( + storage = create_storage( + StorageConfig( base_dir="tests/unit/indexing/input/data/one-csv", - ), - file_type=InputFileType.csv, - file_pattern=".*\\.csv$", - title_column="title", - metadata=["title"], + ) ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (2, 5) - assert documents["metadata"][0] == {"title": "Hello"} + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 2 + assert documents[0].title == "Hello" async def test_csv_loader_multiple_files(): config = InputConfig( - storage=StorageConfig( + type=InputType.Csv, + ) + storage = create_storage( + StorageConfig( base_dir="tests/unit/indexing/input/data/multiple-csvs", - ), - file_type=InputFileType.csv, - file_pattern=".*\\.csv$", + ) ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (4, 4) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 4 diff --git a/tests/unit/indexing/input/test_json_loader.py b/tests/unit/indexing/input/test_json_loader.py index c97d38d4a0..d20d64ad2d 100644 --- a/tests/unit/indexing/input/test_json_loader.py +++ b/tests/unit/indexing/input/test_json_loader.py @@ -1,81 +1,71 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -from graphrag.config.enums import InputFileType -from graphrag.config.models.input_config import InputConfig -from graphrag.config.models.storage_config import StorageConfig -from graphrag.index.input.factory import create_input -from graphrag.utils.api import create_storage_from_config +from graphrag_input import InputConfig, InputType, create_input_reader +from graphrag_storage import StorageConfig, create_storage async def test_json_loader_one_file_one_object(): config = InputConfig( - storage=StorageConfig( - base_dir="tests/unit/indexing/input/data/one-json-one-object", - ), - file_type=InputFileType.json, + type=InputType.Json, file_pattern=".*\\.json$", ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (1, 4) - assert documents["title"].iloc[0] == "input.json" + storage = create_storage( + StorageConfig( + base_dir="tests/unit/indexing/input/data/one-json-one-object", + ) + ) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 1 + assert documents[0].title == "input.json" + assert documents[0].raw_data == { + "title": "Hello", + "text": "Hi how are you today?", + } async def test_json_loader_one_file_multiple_objects(): config = InputConfig( - storage=StorageConfig( + type=InputType.Json, + ) + storage = create_storage( + StorageConfig( base_dir="tests/unit/indexing/input/data/one-json-multiple-objects", - ), - file_type=InputFileType.json, - file_pattern=".*\\.json$", + ) ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - print(documents) - assert documents.shape == (3, 4) - assert documents["title"].iloc[0] == "input.json" + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 3 + assert documents[0].title == "input.json (0)" + assert documents[1].title == "input.json (1)" async def test_json_loader_one_file_with_title(): config = InputConfig( - storage=StorageConfig( - base_dir="tests/unit/indexing/input/data/one-json-one-object", - ), - file_type=InputFileType.json, - file_pattern=".*\\.json$", + type=InputType.Json, title_column="title", ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (1, 4) - assert documents["title"].iloc[0] == "Hello" - - -async def test_json_loader_one_file_with_metadata(): - config = InputConfig( - storage=StorageConfig( + storage = create_storage( + StorageConfig( base_dir="tests/unit/indexing/input/data/one-json-one-object", - ), - file_type=InputFileType.json, - file_pattern=".*\\.json$", - title_column="title", - metadata=["title"], + ) ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (1, 5) - assert documents["metadata"][0] == {"title": "Hello"} + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 1 + assert documents[0].title == "Hello" async def test_json_loader_multiple_files(): config = InputConfig( - storage=StorageConfig( + type=InputType.Json, + ) + storage = create_storage( + StorageConfig( base_dir="tests/unit/indexing/input/data/multiple-jsons", - ), - file_type=InputFileType.json, - file_pattern=".*\\.json$", + ) ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (4, 4) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 4 diff --git a/tests/unit/indexing/input/test_jsonl_loader.py b/tests/unit/indexing/input/test_jsonl_loader.py new file mode 100644 index 0000000000..dd56094290 --- /dev/null +++ b/tests/unit/indexing/input/test_jsonl_loader.py @@ -0,0 +1,42 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +from graphrag_input import InputConfig, InputType, create_input_reader +from graphrag_storage import StorageConfig, create_storage + + +async def test_jsonl_loader_one_file_multiple_objects(): + config = InputConfig( + type=InputType.JsonLines, + file_pattern=".*\\.jsonl$", + ) + storage = create_storage( + StorageConfig( + base_dir="tests/unit/indexing/input/data/one-jsonl", + ) + ) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 3 + assert documents[0].title == "input.jsonl (0)" + assert documents[0].raw_data == { + "title": "Hello", + "text": "Hi how are you today?", + } + assert documents[1].title == "input.jsonl (1)" + + +async def test_jsonl_loader_one_file_with_title(): + config = InputConfig( + type=InputType.JsonLines, + title_column="title", + ) + storage = create_storage( + StorageConfig( + base_dir="tests/unit/indexing/input/data/one-jsonl", + ) + ) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 3 + assert documents[0].title == "Hello" diff --git a/tests/unit/indexing/input/test_markitdown_loader.py b/tests/unit/indexing/input/test_markitdown_loader.py new file mode 100644 index 0000000000..c32e36dbb7 --- /dev/null +++ b/tests/unit/indexing/input/test_markitdown_loader.py @@ -0,0 +1,26 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +from graphrag_input import InputConfig, InputType, create_input_reader +from graphrag_storage import StorageConfig, create_storage + + +# these tests just confirm we can load files with MarkItDown, +# and use html specifically because it requires no additional dependency installation +async def test_markitdown_loader_one_file(): + config = InputConfig( + type=InputType.MarkItDown, + file_pattern=".*\\.html$", + ) + storage = create_storage( + StorageConfig( + base_dir="tests/unit/indexing/input/data/one-html", + ) + ) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 1 + # markitdown will extract the title and body from the HTML if present and clean them + assert documents[0].title == "Test" + assert documents[0].text == "Hi how are you today?" + assert documents[0].raw_data is None diff --git a/tests/unit/indexing/input/test_text_document.py b/tests/unit/indexing/input/test_text_document.py new file mode 100644 index 0000000000..d71c515bf5 --- /dev/null +++ b/tests/unit/indexing/input/test_text_document.py @@ -0,0 +1,76 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +import pytest +from graphrag_input import get_property + + +def test_get_property_single_level(): + data = {"foo": "bar"} + assert get_property(data, "foo") == "bar" + + +def test_get_property_two_levels(): + data = {"foo": {"bar": "baz"}} + assert get_property(data, "foo.bar") == "baz" + + +def test_get_property_three_levels(): + data = {"a": {"b": {"c": "value"}}} + assert get_property(data, "a.b.c") == "value" + + +def test_get_property_returns_dict(): + data = {"foo": {"bar": {"baz": "qux"}}} + result = get_property(data, "foo.bar") + assert result == {"baz": "qux"} + + +def test_get_property_missing_key_raises(): + data = {"foo": "bar"} + with pytest.raises(KeyError): + get_property(data, "missing") + + +def test_get_property_missing_nested_key_raises(): + data = {"foo": {"bar": "baz"}} + with pytest.raises(KeyError): + get_property(data, "foo.missing") + + +def test_get_property_non_dict_intermediate_raises(): + data = {"foo": "bar"} + with pytest.raises(KeyError): + get_property(data, "foo.bar") + + +def test_get_property_empty_dict_raises(): + data = {} + with pytest.raises(KeyError): + get_property(data, "foo") + + +def test_get_property_with_none_value(): + data = {"foo": None} + assert get_property(data, "foo") is None + + +def test_get_property_with_list_value(): + data = {"foo": [1, 2, 3]} + assert get_property(data, "foo") == [1, 2, 3] + + +def test_get_property_list_intermediate_raises(): + data = {"foo": [{"bar": "baz"}]} + with pytest.raises(KeyError): + get_property(data, "foo.bar") + + +def test_get_property_numeric_value(): + data = {"count": 42} + assert get_property(data, "count") == 42 + + +def test_get_property_boolean_value(): + data = {"enabled": True} + assert get_property(data, "enabled") is True diff --git a/tests/unit/indexing/input/test_text_loader.py b/tests/unit/indexing/input/test_text_loader.py new file mode 100644 index 0000000000..482593a270 --- /dev/null +++ b/tests/unit/indexing/input/test_text_loader.py @@ -0,0 +1,36 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +from graphrag_input import InputConfig, InputType, create_input_reader +from graphrag_storage import StorageConfig, create_storage + + +async def test_text_loader_one_file(): + config = InputConfig( + type=InputType.Text, + file_pattern=".*\\.txt$", + ) + storage = create_storage( + StorageConfig( + base_dir="tests/unit/indexing/input/data/one-txt", + ) + ) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 1 + assert documents[0].title == "input.txt" + assert documents[0].raw_data is None + + +async def test_text_loader_multiple_files(): + config = InputConfig( + type=InputType.Text, + ) + storage = create_storage( + StorageConfig( + base_dir="tests/unit/indexing/input/data/multiple-txts", + ) + ) + reader = create_input_reader(config, storage) + documents = await reader.read_files() + assert len(documents) == 2 diff --git a/tests/unit/indexing/input/test_txt_loader.py b/tests/unit/indexing/input/test_txt_loader.py deleted file mode 100644 index 6b82a408fb..0000000000 --- a/tests/unit/indexing/input/test_txt_loader.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -from graphrag.config.enums import InputFileType -from graphrag.config.models.input_config import InputConfig -from graphrag.config.models.storage_config import StorageConfig -from graphrag.index.input.factory import create_input -from graphrag.utils.api import create_storage_from_config - - -async def test_txt_loader_one_file(): - config = InputConfig( - storage=StorageConfig( - base_dir="tests/unit/indexing/input/data/one-txt", - ), - file_type=InputFileType.text, - file_pattern=".*\\.txt$", - ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (1, 4) - assert documents["title"].iloc[0] == "input.txt" - - -async def test_txt_loader_one_file_with_metadata(): - config = InputConfig( - storage=StorageConfig( - base_dir="tests/unit/indexing/input/data/one-txt", - ), - file_type=InputFileType.text, - file_pattern=".*\\.txt$", - metadata=["title"], - ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (1, 5) - # unlike csv, we cannot set the title to anything other than the filename - assert documents["metadata"][0] == {"title": "input.txt"} - - -async def test_txt_loader_multiple_files(): - config = InputConfig( - storage=StorageConfig( - base_dir="tests/unit/indexing/input/data/multiple-txts", - ), - file_type=InputFileType.text, - file_pattern=".*\\.txt$", - ) - storage = create_storage_from_config(config.storage) - documents = await create_input(config=config, storage=storage) - assert documents.shape == (2, 4) diff --git a/tests/unit/indexing/operations/chunk_text/test_chunk_text.py b/tests/unit/indexing/operations/chunk_text/test_chunk_text.py deleted file mode 100644 index 7b6c54923f..0000000000 --- a/tests/unit/indexing/operations/chunk_text/test_chunk_text.py +++ /dev/null @@ -1,181 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - - -from unittest import mock -from unittest.mock import ANY, Mock - -import pandas as pd -import pytest - -from graphrag.config.enums import ChunkStrategyType -from graphrag.index.operations.chunk_text.chunk_text import ( - _get_num_total, - chunk_text, - load_strategy, - run_strategy, -) -from graphrag.index.operations.chunk_text.typing import ( - TextChunk, -) - - -def test_get_num_total_default(): - output = pd.DataFrame({"column": ["a", "b", "c"]}) - - total = _get_num_total(output, "column") - assert total == 3 - - -def test_get_num_total_array(): - output = pd.DataFrame({"column": [["a", "b", "c"], ["x", "y"]]}) - - total = _get_num_total(output, "column") - assert total == 5 - - -def test_load_strategy_tokens(): - strategy_type = ChunkStrategyType.tokens - - strategy_loaded = load_strategy(strategy_type) - - assert strategy_loaded.__name__ == "run_tokens" - - -def test_load_strategy_sentence(): - strategy_type = ChunkStrategyType.sentence - - strategy_loaded = load_strategy(strategy_type) - - assert strategy_loaded.__name__ == "run_sentences" - - -def test_load_strategy_none(): - strategy_type = ChunkStrategyType - - with pytest.raises( - ValueError, match="Unknown strategy: " - ): - load_strategy(strategy_type) # type: ignore - - -def test_run_strategy_str(): - input = "text test for run strategy" - config = Mock() - tick = Mock() - strategy_mocked = Mock() - - strategy_mocked.return_value = [ - TextChunk( - text_chunk="text test for run strategy", - source_doc_indices=[0], - ) - ] - - runned = run_strategy(strategy_mocked, input, config, tick) - assert runned == ["text test for run strategy"] - - -def test_run_strategy_arr_str(): - input = ["text test for run strategy", "use for strategy"] - config = Mock() - tick = Mock() - strategy_mocked = Mock() - - strategy_mocked.return_value = [ - TextChunk( - text_chunk="text test for run strategy", source_doc_indices=[0], n_tokens=5 - ), - TextChunk(text_chunk="use for strategy", source_doc_indices=[1], n_tokens=3), - ] - - expected = [ - "text test for run strategy", - "use for strategy", - ] - - runned = run_strategy(strategy_mocked, input, config, tick) - assert runned == expected - - -def test_run_strategy_arr_tuple(): - input = [("text test for run strategy", "3"), ("use for strategy", "5")] - config = Mock() - tick = Mock() - strategy_mocked = Mock() - - strategy_mocked.return_value = [ - TextChunk( - text_chunk="text test for run strategy", source_doc_indices=[0], n_tokens=5 - ), - TextChunk(text_chunk="use for strategy", source_doc_indices=[1], n_tokens=3), - ] - - expected = [ - ( - ["text test for run strategy"], - "text test for run strategy", - 5, - ), - ( - ["use for strategy"], - "use for strategy", - 3, - ), - ] - - runned = run_strategy(strategy_mocked, input, config, tick) - assert runned == expected - - -def test_run_strategy_arr_tuple_same_doc(): - input = [("text test for run strategy", "3"), ("use for strategy", "5")] - config = Mock() - tick = Mock() - strategy_mocked = Mock() - - strategy_mocked.return_value = [ - TextChunk( - text_chunk="text test for run strategy", source_doc_indices=[0], n_tokens=5 - ), - TextChunk(text_chunk="use for strategy", source_doc_indices=[0], n_tokens=3), - ] - - expected = [ - ( - ["text test for run strategy"], - "text test for run strategy", - 5, - ), - ( - ["text test for run strategy"], - "use for strategy", - 3, - ), - ] - - runned = run_strategy(strategy_mocked, input, config, tick) - assert runned == expected - - -@mock.patch("graphrag.index.operations.chunk_text.chunk_text.load_strategy") -@mock.patch("graphrag.index.operations.chunk_text.chunk_text.run_strategy") -@mock.patch("graphrag.index.operations.chunk_text.chunk_text.progress_ticker") -def test_chunk_text(mock_progress_ticker, mock_run_strategy, mock_load_strategy): - input_data = pd.DataFrame({"name": ["The Shining"]}) - column = "name" - size = 10 - overlap = 2 - encoding_model = "model" - strategy = ChunkStrategyType.sentence - callbacks = Mock() - callbacks.progress = Mock() - - mock_load_strategy.return_value = Mock() - mock_progress_ticker.return_value = Mock() - - chunk_text(input_data, column, size, overlap, encoding_model, strategy, callbacks) - - mock_run_strategy.assert_called_with( - mock_load_strategy(), "The Shining", ANY, mock_progress_ticker.return_value - ) diff --git a/tests/unit/indexing/operations/chunk_text/test_strategies.py b/tests/unit/indexing/operations/chunk_text/test_strategies.py deleted file mode 100644 index ecc95da0c0..0000000000 --- a/tests/unit/indexing/operations/chunk_text/test_strategies.py +++ /dev/null @@ -1,127 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -from unittest.mock import Mock, patch - -from graphrag.config.models.chunking_config import ChunkingConfig -from graphrag.index.operations.chunk_text.bootstrap import bootstrap -from graphrag.index.operations.chunk_text.strategies import ( - get_encoding_fn, - run_sentences, - run_tokens, -) -from graphrag.index.operations.chunk_text.typing import TextChunk - - -class TestRunSentences: - def setup_method(self, method): - bootstrap() - - def test_basic_functionality(self): - """Test basic sentence splitting without metadata""" - input = ["This is a test. Another sentence."] - tick = Mock() - chunks = list(run_sentences(input, ChunkingConfig(), tick)) - - assert len(chunks) == 2 - assert chunks[0].text_chunk == "This is a test." - assert chunks[1].text_chunk == "Another sentence." - assert all(c.source_doc_indices == [0] for c in chunks) - tick.assert_called_once_with(1) - - def test_multiple_documents(self): - """Test processing multiple input documents""" - input = ["First. Document.", "Second. Doc."] - tick = Mock() - chunks = list(run_sentences(input, ChunkingConfig(), tick)) - - assert len(chunks) == 4 - assert chunks[0].source_doc_indices == [0] - assert chunks[2].source_doc_indices == [1] - assert tick.call_count == 2 - - def test_mixed_whitespace_handling(self): - """Test input with irregular whitespace""" - input = [" Sentence with spaces. Another one! "] - chunks = list(run_sentences(input, ChunkingConfig(), Mock())) - assert chunks[0].text_chunk == " Sentence with spaces." - assert chunks[1].text_chunk == "Another one!" - - -class TestRunTokens: - @patch("tiktoken.get_encoding") - def test_basic_functionality(self, mock_get_encoding): - mock_encoder = Mock() - mock_encoder.encode.side_effect = lambda x: list(x.encode()) - mock_encoder.decode.side_effect = lambda x: bytes(x).decode() - mock_get_encoding.return_value = mock_encoder - - # Input and config - input = [ - "Marley was dead: to begin with. There is no doubt whatever about that. The register of his burial was signed by the clergyman, the clerk, the undertaker, and the chief mourner. Scrooge signed it. And Scrooge's name was good upon 'Change, for anything he chose to put his hand to." - ] - config = ChunkingConfig(size=5, overlap=1, encoding_model="fake-encoding") - tick = Mock() - - # Run the function - chunks = list(run_tokens(input, config, tick)) - - # Verify output - assert len(chunks) > 0 - assert all(isinstance(chunk, TextChunk) for chunk in chunks) - tick.assert_called_once_with(1) - - @patch("tiktoken.get_encoding") - def test_non_string_input(self, mock_get_encoding): - """Test handling of non-string input (e.g., numbers).""" - mock_encoder = Mock() - mock_encoder.encode.side_effect = lambda x: list(str(x).encode()) - mock_encoder.decode.side_effect = lambda x: bytes(x).decode() - mock_get_encoding.return_value = mock_encoder - - input = [123] # Non-string input - config = ChunkingConfig(size=5, overlap=1, encoding_model="fake-encoding") - tick = Mock() - - chunks = list(run_tokens(input, config, tick)) # type: ignore - - # Verify non-string input is handled - assert len(chunks) > 0 - assert "123" in chunks[0].text_chunk - - -@patch("tiktoken.get_encoding") -def test_get_encoding_fn_encode(mock_get_encoding): - # Create a mock encoding object with encode and decode methods - mock_encoding = Mock() - mock_encoding.encode = Mock(return_value=[1, 2, 3]) - mock_encoding.decode = Mock(return_value="decoded text") - - # Configure the mock_get_encoding to return the mock encoding object - mock_get_encoding.return_value = mock_encoding - - # Call the function to get encode and decode functions - encode, _ = get_encoding_fn("mock_encoding") - - # Test the encode function - encoded_text = encode("test text") - assert encoded_text == [1, 2, 3] - mock_encoding.encode.assert_called_once_with("test text") - - -@patch("tiktoken.get_encoding") -def test_get_encoding_fn_decode(mock_get_encoding): - # Create a mock encoding object with encode and decode methods - mock_encoding = Mock() - mock_encoding.encode = Mock(return_value=[1, 2, 3]) - mock_encoding.decode = Mock(return_value="decoded text") - - # Configure the mock_get_encoding to return the mock encoding object - mock_get_encoding.return_value = mock_encoding - - # Call the function to get encode and decode functions - _, decode = get_encoding_fn("mock_encoding") - - decoded_text = decode([1, 2, 3]) - assert decoded_text == "decoded text" - mock_encoding.decode.assert_called_once_with([1, 2, 3]) diff --git a/tests/unit/indexing/test_init_content.py b/tests/unit/indexing/test_init_content.py index 58791a905c..61f2d11fa6 100644 --- a/tests/unit/indexing/test_init_content.py +++ b/tests/unit/indexing/test_init_content.py @@ -5,15 +5,13 @@ from typing import Any, cast import yaml - -from graphrag.config.create_graphrag_config import create_graphrag_config from graphrag.config.init_content import INIT_YAML from graphrag.config.models.graph_rag_config import GraphRagConfig def test_init_yaml(): data = yaml.load(INIT_YAML, Loader=yaml.FullLoader) - config = create_graphrag_config(data) + config = GraphRagConfig(**data) GraphRagConfig.model_validate(config, strict=True) @@ -27,5 +25,5 @@ def uncomment_line(line: str) -> str: content = "\n".join([uncomment_line(line) for line in lines]) data = yaml.load(content, Loader=yaml.FullLoader) - config = create_graphrag_config(data) + config = GraphRagConfig(**data) GraphRagConfig.model_validate(config, strict=True) diff --git a/tests/unit/indexing/text_splitting/test_text_splitting.py b/tests/unit/indexing/text_splitting/test_text_splitting.py deleted file mode 100644 index 4ea8b25e5d..0000000000 --- a/tests/unit/indexing/text_splitting/test_text_splitting.py +++ /dev/null @@ -1,170 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -from unittest import mock -from unittest.mock import MagicMock - -import pytest -import tiktoken - -from graphrag.index.text_splitting.text_splitting import ( - NoopTextSplitter, - TokenChunkerOptions, - TokenTextSplitter, - split_multiple_texts_on_tokens, - split_single_text_on_tokens, -) - - -def test_noop_text_splitter() -> None: - splitter = NoopTextSplitter() - - assert list(splitter.split_text("some text")) == ["some text"] - assert list(splitter.split_text(["some", "text"])) == ["some", "text"] - - -class MockTokenizer: - def encode(self, text): - return [ord(char) for char in text] - - def decode(self, token_ids): - return "".join(chr(id) for id in token_ids) - - -def test_split_text_str_empty(): - splitter = TokenTextSplitter(chunk_size=5, chunk_overlap=2) - result = splitter.split_text("") - - assert result == [] - - -def test_split_text_str_bool(): - splitter = TokenTextSplitter(chunk_size=5, chunk_overlap=2) - result = splitter.split_text(None) # type: ignore - - assert result == [] - - -def test_split_text_str_int(): - splitter = TokenTextSplitter(chunk_size=5, chunk_overlap=2) - with pytest.raises(TypeError): - splitter.split_text(123) # type: ignore - - -@mock.patch("graphrag.index.text_splitting.text_splitting.split_single_text_on_tokens") -def test_split_text_large_input(mock_split): - large_text = "a" * 10_000 - mock_split.return_value = ["chunk"] * 2_000 - splitter = TokenTextSplitter(chunk_size=5, chunk_overlap=2) - - result = splitter.split_text(large_text) - - assert len(result) == 2_000, "Large input was not split correctly" - mock_split.assert_called_once() - - -@mock.patch("graphrag.index.text_splitting.text_splitting.split_single_text_on_tokens") -@mock.patch("graphrag.index.text_splitting.text_splitting.TokenChunkerOptions") -def test_token_text_splitter(mock_tokenizer, mock_split_text): - text = "chunk1 chunk2 chunk3" - expected_chunks = ["chunk1", "chunk2", "chunk3"] - - mocked_tokenizer = MagicMock() - mock_tokenizer.return_value = mocked_tokenizer - mock_split_text.return_value = expected_chunks - - splitter = TokenTextSplitter() - - splitter.split_text(["chunk1", "chunk2", "chunk3"]) - - mock_split_text.assert_called_once_with(text=text, tokenizer=mocked_tokenizer) - - -def test_split_single_text_on_tokens(): - text = "This is a test text, meaning to be taken seriously by this test only." - mocked_tokenizer = MockTokenizer() - tokenizer = TokenChunkerOptions( - chunk_overlap=5, - tokens_per_chunk=10, - decode=mocked_tokenizer.decode, - encode=lambda text: mocked_tokenizer.encode(text), - ) - - expected_splits = [ - "This is a ", - "is a test ", - "test text,", - "text, mean", - " meaning t", - "ing to be ", - "o be taken", - "taken seri", # cspell:disable-line - " seriously", - "ously by t", # cspell:disable-line - " by this t", - "his test o", - "est only.", - ] - - result = split_single_text_on_tokens(text=text, tokenizer=tokenizer) - assert result == expected_splits - - -def test_split_multiple_texts_on_tokens(): - texts = [ - "This is a test text, meaning to be taken seriously by this test only.", - "This is th second text, meaning to be taken seriously by this test only.", - ] - - mocked_tokenizer = MockTokenizer() - mock_tick = MagicMock() - tokenizer = TokenChunkerOptions( - chunk_overlap=5, - tokens_per_chunk=10, - decode=mocked_tokenizer.decode, - encode=lambda text: mocked_tokenizer.encode(text), - ) - - split_multiple_texts_on_tokens(texts, tokenizer, tick=mock_tick) - mock_tick.assert_called() - - -def test_split_single_text_on_tokens_no_overlap(): - text = "This is a test text, meaning to be taken seriously by this test only." - enc = tiktoken.get_encoding("cl100k_base") - - def encode(text: str) -> list[int]: - if not isinstance(text, str): - text = f"{text}" - return enc.encode(text) - - def decode(tokens: list[int]) -> str: - return enc.decode(tokens) - - tokenizer = TokenChunkerOptions( - chunk_overlap=1, - tokens_per_chunk=2, - decode=decode, - encode=lambda text: encode(text), - ) - - expected_splits = [ - "This is", - " is a", - " a test", - " test text", - " text,", - ", meaning", - " meaning to", - " to be", - " be taken", # cspell:disable-line - " taken seriously", # cspell:disable-line - " seriously by", - " by this", # cspell:disable-line - " this test", - " test only", - " only.", - ] - - result = split_single_text_on_tokens(text=text, tokenizer=tokenizer) - assert result == expected_splits diff --git a/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/test_gi_entity_extraction.py b/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/test_gi_entity_extraction.py index 13e676e9fb..486bf5fcdf 100644 --- a/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/test_gi_entity_extraction.py +++ b/tests/unit/indexing/verbs/entities/extraction/strategies/graph_intelligence/test_gi_entity_extraction.py @@ -2,217 +2,78 @@ # Licensed under the MIT License import unittest -from graphrag.index.operations.extract_graph.graph_intelligence_strategy import ( - run_extract_graph, +from graphrag.index.operations.extract_graph.extract_graph import _run_extract_graph +from graphrag.prompts.index.extract_graph import GRAPH_EXTRACTION_PROMPT +from graphrag_llm.completion import create_completion +from graphrag_llm.config import LLMProviderType, ModelConfig + +SIMPLE_EXTRACTION_RESPONSE = """ +("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) +## +("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) +## +("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) +## +("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) +## +("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) +""".strip() + + +model = create_completion( + ModelConfig( + type=LLMProviderType.MockLLM, + model_provider="openai", + model="gpt-4o", + mock_responses=[SIMPLE_EXTRACTION_RESPONSE], + ) ) -from graphrag.index.operations.extract_graph.typing import ( - Document, -) -from tests.unit.indexing.verbs.helpers.mock_llm import create_mock_llm class TestRunChain(unittest.IsolatedAsyncioTestCase): async def test_run_extract_graph_single_document_correct_entities_returned(self): - results = await run_extract_graph( - docs=[Document("test_text", "1")], - entity_types=["person"], - args={ - "max_gleanings": 0, - "summarize_descriptions": False, - }, - model=create_mock_llm( - responses=[ - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) - ## - ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) - """.strip() - ], - name="test_run_extract_graph_single_document_correct_entities_returned", - ), - ) - - # self.assertItemsEqual isn't available yet, or I am just silly - # so we sort the lists and compare them - assert sorted(["TEST_ENTITY_1", "TEST_ENTITY_2", "TEST_ENTITY_3"]) == sorted([ - entity["title"] for entity in results.entities - ]) - - async def test_run_extract_graph_multiple_documents_correct_entities_returned( - self, - ): - results = await run_extract_graph( - docs=[Document("text_1", "1"), Document("text_2", "2")], + entities_df, _ = await _run_extract_graph( + text="test_text", + source_id="1", entity_types=["person"], - args={ - "max_gleanings": 0, - "summarize_descriptions": False, - }, - model=create_mock_llm( - responses=[ - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) - ## - """.strip(), - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) - """.strip(), - ], - name="test_run_extract_graph_multiple_documents_correct_entities_returned", - ), + max_gleanings=0, + model=model, + prompt=GRAPH_EXTRACTION_PROMPT, ) - # self.assertItemsEqual isn't available yet, or I am just silly - # so we sort the lists and compare them - assert sorted(["TEST_ENTITY_1", "TEST_ENTITY_2", "TEST_ENTITY_3"]) == sorted([ - entity["title"] for entity in results.entities - ]) - - async def test_run_extract_graph_multiple_documents_correct_edges_returned(self): - results = await run_extract_graph( - docs=[Document("text_1", "1"), Document("text_2", "2")], - entity_types=["person"], - args={ - "max_gleanings": 0, - "summarize_descriptions": False, - }, - model=create_mock_llm( - responses=[ - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) - ## - """.strip(), - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) - """.strip(), - ], - name="test_run_extract_graph_multiple_documents_correct_edges_returned", - ), + assert sorted(["TEST_ENTITY_1", "TEST_ENTITY_2", "TEST_ENTITY_3"]) == sorted( + entities_df["title"].tolist() ) - # self.assertItemsEqual isn't available yet, or I am just silly - # so we sort the lists and compare them - graph = results.graph - assert graph is not None, "No graph returned!" - - # convert to strings for more visual comparison - edges_str = sorted([f"{edge[0]} -> {edge[1]}" for edge in graph.edges]) - assert edges_str == sorted([ - "TEST_ENTITY_1 -> TEST_ENTITY_2", - "TEST_ENTITY_1 -> TEST_ENTITY_3", - ]) - - async def test_run_extract_graph_multiple_documents_correct_entity_source_ids_mapped( - self, - ): - results = await run_extract_graph( - docs=[Document("text_1", "1"), Document("text_2", "2")], + async def test_run_extract_graph_single_document_correct_edges_returned(self): + _, relationships_df = await _run_extract_graph( + text="test_text", + source_id="1", entity_types=["person"], - args={ - "max_gleanings": 0, - "summarize_descriptions": False, - }, - model=create_mock_llm( - responses=[ - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) - ## - """.strip(), - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) - """.strip(), - ], - name="test_run_extract_graph_multiple_documents_correct_entity_source_ids_mapped", - ), + max_gleanings=0, + model=model, + prompt=GRAPH_EXTRACTION_PROMPT, ) - graph = results.graph - assert graph is not None, "No graph returned!" + edges = relationships_df.to_dict("records") + assert len(edges) == 2 - # TODO: The edges might come back in any order, but we're assuming they're coming - # back in the order that we passed in the docs, that might not be true - assert ( - graph.nodes["TEST_ENTITY_3"].get("source_id") == "2" - ) # TEST_ENTITY_3 should be in just 2 - assert ( - graph.nodes["TEST_ENTITY_2"].get("source_id") == "1" - ) # TEST_ENTITY_2 should be in just 1 - ids_str = graph.nodes["TEST_ENTITY_1"].get("source_id") or "" - assert sorted(ids_str.split(",")) == sorted([ - "1", - "2", - ]) # TEST_ENTITY_1 should be 1 and 2 + relationship_pairs = {(edge["source"], edge["target"]) for edge in edges} + assert relationship_pairs == { + ("TEST_ENTITY_1", "TEST_ENTITY_2"), + ("TEST_ENTITY_1", "TEST_ENTITY_3"), + } - async def test_run_extract_graph_multiple_documents_correct_edge_source_ids_mapped( - self, - ): - results = await run_extract_graph( - docs=[Document("text_1", "1"), Document("text_2", "2")], + async def test_run_extract_graph_single_document_source_ids_mapped(self): + entities_df, relationships_df = await _run_extract_graph( + text="test_text", + source_id="1", entity_types=["person"], - args={ - "max_gleanings": 0, - "summarize_descriptions": False, - }, - model=create_mock_llm( - responses=[ - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_2<|>COMPANY<|>TEST_ENTITY_2 owns TEST_ENTITY_1 and also shares an address with TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_2<|>TEST_ENTITY_1 and TEST_ENTITY_2 are related because TEST_ENTITY_1 is 100% owned by TEST_ENTITY_2 and the two companies also share the same address)<|>2) - ## - """.strip(), - """ - ("entity"<|>TEST_ENTITY_1<|>COMPANY<|>TEST_ENTITY_1 is a test company) - ## - ("entity"<|>TEST_ENTITY_3<|>PERSON<|>TEST_ENTITY_3 is director of TEST_ENTITY_1) - ## - ("relationship"<|>TEST_ENTITY_1<|>TEST_ENTITY_3<|>TEST_ENTITY_1 and TEST_ENTITY_3 are related because TEST_ENTITY_3 is director of TEST_ENTITY_1<|>1)) - """.strip(), - ], - name="test_run_extract_graph_multiple_documents_correct_edge_source_ids_mapped", - ), + max_gleanings=0, + model=model, + prompt=GRAPH_EXTRACTION_PROMPT, ) - graph = results.graph - assert graph is not None, "No graph returned!" - edges = list(graph.edges(data=True)) - - # should only have 2 edges - assert len(edges) == 2 + assert all(source_id == "1" for source_id in entities_df["source_id"]) - # Sort by source_id for consistent ordering - edge_source_ids = sorted([edge[2].get("source_id", "") for edge in edges]) - assert edge_source_ids[0].split(",") == ["1"] - assert edge_source_ids[1].split(",") == ["2"] + assert all(source_id == "1" for source_id in relationships_df["source_id"]) diff --git a/tests/unit/indexing/verbs/helpers/mock_llm.py b/tests/unit/indexing/verbs/helpers/mock_llm.py deleted file mode 100644 index 161d5d56df..0000000000 --- a/tests/unit/indexing/verbs/helpers/mock_llm.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License -from pydantic import BaseModel - -from graphrag.language_model.manager import ModelManager -from graphrag.language_model.protocol.base import ChatModel - - -def create_mock_llm(responses: list[str | BaseModel], name: str = "mock") -> ChatModel: - """Creates a mock LLM that returns the given responses.""" - return ModelManager().get_or_create_chat_model( - name, "mock_chat", responses=responses - ) diff --git a/tests/unit/litellm_services/test_retries.py b/tests/unit/litellm_services/test_retries.py deleted file mode 100644 index 3db2a39027..0000000000 --- a/tests/unit/litellm_services/test_retries.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Test LiteLLM Retries.""" - -import time - -import pytest - -from graphrag.language_model.providers.litellm.services.retry.retry_factory import ( - RetryFactory, -) - -retry_factory = RetryFactory() - - -@pytest.mark.parametrize( - ("strategy", "max_retries", "max_retry_wait", "expected_time"), - [ - ( - "native", - 3, # 3 retries - 0, # native retry does not adhere to max_retry_wait - 0, # immediate retry, expect 0 seconds elapsed time - ), - ( - "exponential_backoff", - 3, # 3 retries - 0, # exponential retry does not adhere to max_retry_wait - 14, # (2^1 + jitter) + (2^2 + jitter) + (2^3 + jitter) = 2 + 4 + 8 + 3*jitter = 14 seconds min total runtime - ), - ( - "random_wait", - 3, # 3 retries - 2, # random wait [0, 2] seconds - 0, # unpredictable, don't know what the total runtime will be - ), - ( - "incremental_wait", - 3, # 3 retries - 3, # wait for a max of 3 seconds on a single retry. - 6, # Wait 3/3 * 1 on first retry, 3/3 * 2 on second, 3/3 * 3 on third, 1 + 2 + 3 = 6 seconds total runtime. - ), - ], -) -def test_retries( - strategy: str, max_retries: int, max_retry_wait: int, expected_time: float -) -> None: - """ - Test various retry strategies with various configurations. - - Args - ---- - strategy: The retry strategy to use. - max_retries: The maximum number of retry attempts. - max_retry_wait: The maximum wait time between retries. - """ - retry_service = retry_factory.create( - strategy=strategy, - max_retries=max_retries, - max_retry_wait=max_retry_wait, - ) - - retries = 0 - - def mock_func(): - nonlocal retries - retries += 1 - msg = "Mock error for testing retries" - raise ValueError(msg) - - start_time = time.time() - with pytest.raises(ValueError, match="Mock error for testing retries"): - retry_service.retry(func=mock_func) - elapsed_time = time.time() - start_time - - # subtract 1 from retries because the first call is not a retry - assert retries - 1 == max_retries, f"Expected {max_retries} retries, got {retries}" - assert elapsed_time >= expected_time, ( - f"Expected elapsed time >= {expected_time}, got {elapsed_time}" - ) - - -@pytest.mark.parametrize( - ("strategy", "max_retries", "max_retry_wait", "expected_time"), - [ - ( - "native", - 3, # 3 retries - 0, # native retry does not adhere to max_retry_wait - 0, # immediate retry, expect 0 seconds elapsed time - ), - ( - "exponential_backoff", - 3, # 3 retries - 0, # exponential retry does not adhere to max_retry_wait - 14, # (2^1 + jitter) + (2^2 + jitter) + (2^3 + jitter) = 2 + 4 + 8 + 3*jitter = 14 seconds min total runtime - ), - ( - "random_wait", - 3, # 3 retries - 2, # random wait [0, 2] seconds - 0, # unpredictable, don't know what the total runtime will be - ), - ( - "incremental_wait", - 3, # 3 retries - 3, # wait for a max of 3 seconds on a single retry. - 6, # Wait 3/3 * 1 on first retry, 3/3 * 2 on second, 3/3 * 3 on third, 1 + 2 + 3 = 6 seconds total runtime. - ), - ], -) -async def test_retries_async( - strategy: str, max_retries: int, max_retry_wait: int, expected_time: float -) -> None: - """ - Test various retry strategies with various configurations. - - Args - ---- - strategy: The retry strategy to use. - max_retries: The maximum number of retry attempts. - max_retry_wait: The maximum wait time between retries. - """ - retry_service = retry_factory.create( - strategy=strategy, - max_retries=max_retries, - max_retry_wait=max_retry_wait, - ) - - retries = 0 - - async def mock_func(): # noqa: RUF029 - nonlocal retries - retries += 1 - msg = "Mock error for testing retries" - raise ValueError(msg) - - start_time = time.time() - with pytest.raises(ValueError, match="Mock error for testing retries"): - await retry_service.aretry(func=mock_func) - elapsed_time = time.time() - start_time - - # subtract 1 from retries because the first call is not a retry - assert retries - 1 == max_retries, f"Expected {max_retries} retries, got {retries}" - assert elapsed_time >= expected_time, ( - f"Expected elapsed time >= {expected_time}, got {elapsed_time}" - ) diff --git a/tests/unit/indexing/verbs/helpers/__init__.py b/tests/unit/load_config/__init__.py similarity index 100% rename from tests/unit/indexing/verbs/helpers/__init__.py rename to tests/unit/load_config/__init__.py diff --git a/tests/unit/load_config/config.py b/tests/unit/load_config/config.py new file mode 100644 index 0000000000..f3b77feb65 --- /dev/null +++ b/tests/unit/load_config/config.py @@ -0,0 +1,27 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Config models for load_config unit tests.""" + +from pydantic import BaseModel, ConfigDict, Field + + +class TestNestedModel(BaseModel): + """Test nested model.""" + + model_config = ConfigDict(extra="forbid") + + nested_str: str = Field(description="A nested field.") + nested_int: int = Field(description="Another nested field.") + + +class TestConfigModel(BaseModel): + """Test configuration model.""" + + model_config = ConfigDict(extra="forbid") + __test__ = False # type: ignore + + name: str = Field(description="Name field.") + value: int = Field(description="Value field.") + nested: TestNestedModel = Field(description="Nested model field.") + nested_list: list[TestNestedModel] = Field(description="List of nested models.") diff --git a/tests/unit/load_config/fixtures/config.yaml b/tests/unit/load_config/fixtures/config.yaml new file mode 100644 index 0000000000..a54919d1eb --- /dev/null +++ b/tests/unit/load_config/fixtures/config.yaml @@ -0,0 +1,10 @@ +name: test_name +value: 100 +nested: + nested_str: nested_value + nested_int: 42 +nested_list: + - nested_str: list_value_1 + nested_int: 7 + - nested_str: list_value_2 + nested_int: 8 \ No newline at end of file diff --git a/tests/unit/load_config/fixtures/config_with_env.yaml b/tests/unit/load_config/fixtures/config_with_env.yaml new file mode 100644 index 0000000000..ecefbbc457 --- /dev/null +++ b/tests/unit/load_config/fixtures/config_with_env.yaml @@ -0,0 +1,10 @@ +name: ${LOAD_CONFIG_NAME} +value: 100 +nested: + nested_str: nested_value + nested_int: 42 +nested_list: + - nested_str: list_value_1 + nested_int: 7 + - nested_str: list_value_2 + nested_int: 8 \ No newline at end of file diff --git a/tests/unit/load_config/fixtures/invalid_config.yaml b/tests/unit/load_config/fixtures/invalid_config.yaml new file mode 100644 index 0000000000..d2da11d0eb --- /dev/null +++ b/tests/unit/load_config/fixtures/invalid_config.yaml @@ -0,0 +1 @@ +name: test_name \ No newline at end of file diff --git a/tests/unit/load_config/fixtures/invalid_config_format.yaml b/tests/unit/load_config/fixtures/invalid_config_format.yaml new file mode 100644 index 0000000000..b851bf08c7 --- /dev/null +++ b/tests/unit/load_config/fixtures/invalid_config_format.yaml @@ -0,0 +1,8 @@ +{ + "key": "value", + "invalid_yaml": true +} +{ + "key": "value", + "invalid_yaml": true +} \ No newline at end of file diff --git a/tests/unit/load_config/fixtures/settings.yaml b/tests/unit/load_config/fixtures/settings.yaml new file mode 100644 index 0000000000..a54919d1eb --- /dev/null +++ b/tests/unit/load_config/fixtures/settings.yaml @@ -0,0 +1,10 @@ +name: test_name +value: 100 +nested: + nested_str: nested_value + nested_int: 42 +nested_list: + - nested_str: list_value_1 + nested_int: 7 + - nested_str: list_value_2 + nested_int: 8 \ No newline at end of file diff --git a/tests/unit/load_config/fixtures/test.env b/tests/unit/load_config/fixtures/test.env new file mode 100644 index 0000000000..0ca30592c0 --- /dev/null +++ b/tests/unit/load_config/fixtures/test.env @@ -0,0 +1 @@ +LOAD_CONFIG_NAME=env_name \ No newline at end of file diff --git a/tests/unit/load_config/test_load_config.py b/tests/unit/load_config/test_load_config.py new file mode 100644 index 0000000000..0945cf214f --- /dev/null +++ b/tests/unit/load_config/test_load_config.py @@ -0,0 +1,157 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Unit tests for graphrag-config.load_config.""" + +import os +from pathlib import Path + +import pytest +from graphrag_common.config import ConfigParsingError, load_config +from pydantic import ValidationError + +from .config import TestConfigModel + + +def test_load_config_validation(): + """Test loading config validation.""" + + with pytest.raises( + FileNotFoundError, + ): + _ = load_config(TestConfigModel, "non_existent_config.yaml") + + config_directory = Path(__file__).parent / "fixtures" + invalid_config_formatting_path = config_directory / "invalid_config_format.yaml" + + with pytest.raises( + FileNotFoundError, + ): + _ = load_config( + config_initializer=TestConfigModel, + config_path=invalid_config_formatting_path, + dot_env_path="non_existent.env", + ) + + # Using yaml to parse invalid json formatting + with pytest.raises( + ConfigParsingError, + ): + _ = load_config(TestConfigModel, invalid_config_formatting_path) + + invalid_config_path = config_directory / "invalid_config.yaml" + + # Test validation error from config model + with pytest.raises( + ValidationError, + ): + _ = load_config( + config_initializer=TestConfigModel, + config_path=invalid_config_path, + set_cwd=False, + ) + + +def test_load_config(): + """Test loading configuration.""" + + config_directory = Path(__file__).parent / "fixtures" + config_path = config_directory / "settings.yaml" + + # Load from dir + config = load_config( + config_initializer=TestConfigModel, config_path=config_directory, set_cwd=False + ) + + assert config.name == "test_name" + assert config.value == 100 + assert config.nested.nested_str == "nested_value" + assert config.nested.nested_int == 42 + assert len(config.nested_list) == 2 + assert config.nested_list[0].nested_str == "list_value_1" + assert config.nested_list[0].nested_int == 7 + assert config.nested_list[1].nested_str == "list_value_2" + assert config.nested_list[1].nested_int == 8 + + # Should not have changed directories + root_repo_dir = Path(__file__).parent.parent.parent.parent.resolve() + assert Path.cwd().resolve() == root_repo_dir + + config = load_config( + config_initializer=TestConfigModel, + config_path=config_path, + set_cwd=False, + ) + + assert config.name == "test_name" + assert config.value == 100 + assert config.nested.nested_str == "nested_value" + assert config.nested.nested_int == 42 + assert len(config.nested_list) == 2 + assert config.nested_list[0].nested_str == "list_value_1" + assert config.nested_list[0].nested_int == 7 + assert config.nested_list[1].nested_str == "list_value_2" + assert config.nested_list[1].nested_int == 8 + + overrides = { + "value": 65537, + "nested": {"nested_int": 84}, + "nested_list": [ + {"nested_str": "overridden_list_value_1", "nested_int": 23}, + ], + } + + cwd = Path.cwd() + config_with_overrides = load_config( + config_initializer=TestConfigModel, + config_path=config_path, + overrides=overrides, + ) + + # Should have changed directories to the config file location + assert Path.cwd() == config_directory + assert ( + Path("some/new/path").resolve() + == (config_directory / "some/new/path").resolve() + ) + # Reset cwd + os.chdir(cwd) + + assert config_with_overrides.name == "test_name" + assert config_with_overrides.value == 65537 + assert config_with_overrides.nested.nested_str == "nested_value" + assert config_with_overrides.nested.nested_int == 84 + assert len(config_with_overrides.nested_list) == 1 + assert config_with_overrides.nested_list[0].nested_str == "overridden_list_value_1" + assert config_with_overrides.nested_list[0].nested_int == 23 + + config_with_env_vars_path = config_directory / "config_with_env.yaml" + + # Config contains env vars that do not exist + # and no .env file is provided + with pytest.raises( + ConfigParsingError, + ): + _ = load_config( + config_initializer=TestConfigModel, + config_path=config_with_env_vars_path, + load_dot_env_file=False, + set_cwd=False, + ) + + env_path = config_directory / "test.env" + config_with_env_vars = load_config( + config_initializer=TestConfigModel, + config_path=config_with_env_vars_path, + dot_env_path=env_path, + ) + + assert config_with_env_vars.name == "env_name" + assert config_with_env_vars.value == 100 + assert config_with_env_vars.nested.nested_str == "nested_value" + assert config_with_env_vars.nested.nested_int == 42 + assert len(config_with_env_vars.nested_list) == 2 + assert config_with_env_vars.nested_list[0].nested_str == "list_value_1" + assert config_with_env_vars.nested_list[0].nested_int == 7 + assert config_with_env_vars.nested_list[1].nested_str == "list_value_2" + assert config_with_env_vars.nested_list[1].nested_int == 8 diff --git a/tests/unit/query/context_builder/dynamic_community_selection.py b/tests/unit/query/context_builder/dynamic_community_selection.py new file mode 100644 index 0000000000..ba63f0c774 --- /dev/null +++ b/tests/unit/query/context_builder/dynamic_community_selection.py @@ -0,0 +1,205 @@ +# Copyright (c) 2024 Microsoft Corporation. +# Licensed under the MIT License + +"""Tests for dynamic community selection with type handling.""" + +from unittest.mock import MagicMock + +from graphrag.data_model.community import Community +from graphrag.data_model.community_report import CommunityReport +from graphrag.query.context_builder.dynamic_community_selection import ( + DynamicCommunitySelection, +) + + +def create_mock_tokenizer() -> MagicMock: + """Create a mock tokenizer.""" + tokenizer = MagicMock() + tokenizer.encode.return_value = [1, 2, 3] + return tokenizer + + +def create_mock_model() -> MagicMock: + """Create a mock chat model.""" + return MagicMock() + + +def test_dynamic_community_selection_handles_int_children(): + """Test that DynamicCommunitySelection correctly handles children IDs as integers. + + This tests the fix for issue #2004 where children IDs could be integers + while self.reports keys are strings, causing child communities to be skipped. + """ + # Create communities with integer children (simulating the bug scenario) + # Note: Even though the type annotation says list[str], actual data may have ints + communities = [ + Community( + id="comm-0", + short_id="0", + title="Root Community", + level="0", + parent="", + children=[1, 2], # type: ignore[list-item] # Integer children - testing bug fix + ), + Community( + id="comm-1", + short_id="1", + title="Child Community 1", + level="1", + parent="0", + children=[], + ), + Community( + id="comm-2", + short_id="2", + title="Child Community 2", + level="1", + parent="0", + children=[], + ), + ] + + # Create community reports with string community_id + reports = [ + CommunityReport( + id="report-0", + short_id="0", + title="Report 0", + community_id="0", + summary="Root community summary", + full_content="Root community full content", + rank=1.0, + ), + CommunityReport( + id="report-1", + short_id="1", + title="Report 1", + community_id="1", + summary="Child 1 summary", + full_content="Child 1 full content", + rank=1.0, + ), + CommunityReport( + id="report-2", + short_id="2", + title="Report 2", + community_id="2", + summary="Child 2 summary", + full_content="Child 2 full content", + rank=1.0, + ), + ] + + model = create_mock_model() + tokenizer = create_mock_tokenizer() + + selector = DynamicCommunitySelection( + community_reports=reports, + communities=communities, + model=model, + tokenizer=tokenizer, + threshold=1, + keep_parent=False, + max_level=2, + ) + + # Verify that reports are keyed by string + assert "0" in selector.reports + assert "1" in selector.reports + assert "2" in selector.reports + + # Verify that communities are keyed by string short_id + assert "0" in selector.communities + assert "1" in selector.communities + assert "2" in selector.communities + + # Verify that the children are properly accessible + # Before the fix, int children would fail the `in self.reports` check + root_community = selector.communities["0"] + for child in root_community.children: + child_id = str(child) + # This should now work with the fix + assert child_id in selector.reports, ( + f"Child {child} (as '{child_id}') should be found in reports" + ) + + +def test_dynamic_community_selection_handles_str_children(): + """Test that DynamicCommunitySelection works correctly with string children IDs.""" + communities = [ + Community( + id="comm-0", + short_id="0", + title="Root Community", + level="0", + parent="", + children=["1", "2"], # String children - expected type + ), + Community( + id="comm-1", + short_id="1", + title="Child Community 1", + level="1", + parent="0", + children=[], + ), + Community( + id="comm-2", + short_id="2", + title="Child Community 2", + level="1", + parent="0", + children=[], + ), + ] + + reports = [ + CommunityReport( + id="report-0", + short_id="0", + title="Report 0", + community_id="0", + summary="Root community summary", + full_content="Root community full content", + rank=1.0, + ), + CommunityReport( + id="report-1", + short_id="1", + title="Report 1", + community_id="1", + summary="Child 1 summary", + full_content="Child 1 full content", + rank=1.0, + ), + CommunityReport( + id="report-2", + short_id="2", + title="Report 2", + community_id="2", + summary="Child 2 summary", + full_content="Child 2 full content", + rank=1.0, + ), + ] + + model = create_mock_model() + tokenizer = create_mock_tokenizer() + + selector = DynamicCommunitySelection( + community_reports=reports, + communities=communities, + model=model, + tokenizer=tokenizer, + threshold=1, + keep_parent=False, + max_level=2, + ) + + # Verify that children can be found in reports + root_community = selector.communities["0"] + for child in root_community.children: + child_id = str(child) + assert child_id in selector.reports, ( + f"Child {child} (as '{child_id}') should be found in reports" + ) diff --git a/tests/unit/query/context_builder/test_entity_extraction.py b/tests/unit/query/context_builder/test_entity_extraction.py index 8a15e8e929..c20c34c395 100644 --- a/tests/unit/query/context_builder/test_entity_extraction.py +++ b/tests/unit/query/context_builder/test_entity_extraction.py @@ -3,34 +3,42 @@ from typing import Any -from graphrag.config.models.vector_store_schema_config import VectorStoreSchemaConfig from graphrag.data_model.entity import Entity -from graphrag.data_model.types import TextEmbedder -from graphrag.language_model.manager import ModelManager from graphrag.query.context_builder.entity_extraction import ( EntityVectorStoreKey, map_query_to_entities, ) -from graphrag.vector_stores.base import ( - BaseVectorStore, +from graphrag_llm.config import LLMProviderType, ModelConfig +from graphrag_llm.embedding import create_embedding +from graphrag_vectors import ( + TextEmbedder, + VectorStore, VectorStoreDocument, VectorStoreSearchResult, ) +embedding_model = create_embedding( + ModelConfig( + type=LLMProviderType.MockLLM, + model_provider="openai", + model="text-embedding-3-small", + mock_responses=[1.0, 1.0, 1.0], + ) +) + -class MockBaseVectorStore(BaseVectorStore): +class MockVectorStore(VectorStore): def __init__(self, documents: list[VectorStoreDocument]) -> None: - super().__init__( - vector_store_schema_config=VectorStoreSchemaConfig(index_name="mock") - ) + super().__init__(index_name="mock") self.documents = documents def connect(self, **kwargs: Any) -> None: raise NotImplementedError - def load_documents( - self, documents: list[VectorStoreDocument], overwrite: bool = True - ) -> None: + def create_index(self) -> None: + raise NotImplementedError + + def load_documents(self, documents: list[VectorStoreDocument]) -> None: raise NotImplementedError def similarity_search_by_vector( @@ -47,16 +55,14 @@ def similarity_search_by_text( return sorted( [ VectorStoreSearchResult( - document=document, score=abs(len(text) - len(document.text or "")) + document=document, + score=abs(len(text) - len(str(document.id) or "")), ) for document in self.documents ], key=lambda x: x.score, )[:k] - def filter_by_id(self, include_ids: list[str] | list[int]) -> Any: - return [document for document in self.documents if document.id in include_ids] - def search_by_id(self, id: str) -> VectorStoreDocument: result = self.documents[0] result.id = id @@ -93,35 +99,10 @@ def test_map_query_to_entities(): assert map_query_to_entities( query="t22", - text_embedding_vectorstore=MockBaseVectorStore([ - VectorStoreDocument(id=entity.id, text=entity.title, vector=None) - for entity in entities + text_embedding_vectorstore=MockVectorStore([ + VectorStoreDocument(id=entity.title, vector=None) for entity in entities ]), - text_embedder=ModelManager().get_or_create_embedding_model( - model_type="mock_embedding", name="mock" - ), - all_entities_dict={entity.id: entity for entity in entities}, - embedding_vectorstore_key=EntityVectorStoreKey.ID, - k=1, - oversample_scaler=1, - ) == [ - Entity( - id="c4f93564-4507-4ee4-b102-98add401a965", - short_id="sid2", - title="t22", - rank=4, - ) - ] - - assert map_query_to_entities( - query="t22", - text_embedding_vectorstore=MockBaseVectorStore([ - VectorStoreDocument(id=entity.title, text=entity.title, vector=None) - for entity in entities - ]), - text_embedder=ModelManager().get_or_create_embedding_model( - model_type="mock_embedding", name="mock" - ), + text_embedder=embedding_model, all_entities_dict={entity.id: entity for entity in entities}, embedding_vectorstore_key=EntityVectorStoreKey.TITLE, k=1, @@ -137,40 +118,10 @@ def test_map_query_to_entities(): assert map_query_to_entities( query="", - text_embedding_vectorstore=MockBaseVectorStore([ - VectorStoreDocument(id=entity.id, text=entity.title, vector=None) - for entity in entities + text_embedding_vectorstore=MockVectorStore([ + VectorStoreDocument(id=entity.id, vector=None) for entity in entities ]), - text_embedder=ModelManager().get_or_create_embedding_model( - model_type="mock_embedding", name="mock" - ), - all_entities_dict={entity.id: entity for entity in entities}, - embedding_vectorstore_key=EntityVectorStoreKey.ID, - k=2, - ) == [ - Entity( - id="c4f93564-4507-4ee4-b102-98add401a965", - short_id="sid2", - title="t22", - rank=4, - ), - Entity( - id="8fd6d72a-8e9d-4183-8a97-c38bcc971c83", - short_id="sid4", - title="t4444", - rank=3, - ), - ] - - assert map_query_to_entities( - query="", - text_embedding_vectorstore=MockBaseVectorStore([ - VectorStoreDocument(id=entity.id, text=entity.title, vector=None) - for entity in entities - ]), - text_embedder=ModelManager().get_or_create_embedding_model( - model_type="mock_embedding", name="mock" - ), + text_embedder=embedding_model, all_entities_dict={entity.id: entity for entity in entities}, embedding_vectorstore_key=EntityVectorStoreKey.TITLE, k=2, diff --git a/tests/unit/utils/test_embeddings.py b/tests/unit/utils/test_embeddings.py deleted file mode 100644 index 9349f0c813..0000000000 --- a/tests/unit/utils/test_embeddings.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -import pytest - -from graphrag.config.embeddings import create_index_name - - -def test_create_index_name(): - collection = create_index_name("default", "entity.title") - assert collection == "default-entity-title" - - -def test_create_index_name_invalid_embedding_throws(): - with pytest.raises(KeyError): - create_index_name("default", "invalid.name") - - -def test_create_index_name_invalid_embedding_does_not_throw(): - collection = create_index_name("default", "invalid.name", validate=False) - assert collection == "default-invalid-name" diff --git a/tests/unit/utils/test_encoding.py b/tests/unit/utils/test_encoding.py index aca5575b2e..7ad83b5d7f 100644 --- a/tests/unit/utils/test_encoding.py +++ b/tests/unit/utils/test_encoding.py @@ -8,7 +8,9 @@ def test_encode_basic(): tokenizer = get_tokenizer() result = tokenizer.encode("abc def") - assert result == [13997, 711], "Encoding failed to return expected tokens" + assert result == [26682, 1056], ( + f"Encoding failed to return expected tokens, sent {result}" + ) def test_num_tokens_empty_input(): diff --git a/tests/verbs/data/communities.parquet b/tests/verbs/data/communities.parquet index d8a5c82dec9fa9191502542c57c62779f72d3c33..76f255886c8ec541491574439fab82de91355ef4 100644 GIT binary patch literal 71503 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�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 literal 25391 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ξ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

    ?}|5 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

    9L;lr+gUKL%)rPW>k0S z1gj5b@ZoC61!z4~S_s^3{<6x9Zd#)%i%{tmY8soR=3>&FebI$zbZ_BlQmb|IDQG?+ zEiLsq2Sa^elCNwR%qZmY6?+Q%ifM^E^?e|~mp1yMdo6qQBOE~wBKEnHeVa_jCcwK$ z&3BGE3GU|mto_+i<8AzgZi;3f^Jq3y1Y^QdxZHZ`)?7rk5 zn%qw8QHO#;_T{-sN6Lk`W2{@M)4?wl;C3)H_G1m*VC^vca9xJlC>JqTl`JecF;7cDyXs=N%@ipnp-=iRgEA&JS?w=nt#9w3 zhKr+n)^UrT-7<&Dge$q^V{17^gP1>-uuqjquQ^>tnm8JEC2^6fI>I?bT#I0qH^gMa z>;-ez>O6Uak7wP}mi3VC6yHNqDSm4{JS(UwyOZ`M4iI++88_xs!bt|X3usz2_$)x$ z#^&YZ=jIdcezeM>8>DI#COO@S_`LJom$zKNl%tYLqywTm)-eV9a;K)5{p~^DWSXZ- zbRpT%tE}IR*zE&Lf+4kovtLs*D3tVS3^E`}6iX~^nCE$9O3d-WchUJMSNOaE#4tD7 z)0jm<{-N7O$POTf;-mfpuC6KsdP~rE)1SiyLUA6wFq!@>Z_18d-&i;Iwkdz0Y)tif z(}pxscXR;lbP?Df_g*s^l9jWMv(a9}35$@+cnVBirFoUC-DkEos5fJu)tnq^zGozd z*_CWsp{MgS*o3AJuG|L|!|4edW2e+XiS7BWr9F!wf+!mpyf_B;gt2?m6 zMexgjXHNLXyXm0Nv>E=67YZWTyY94l98LCz;fYqmo6RheT^b|w z4aNhpIY8DEeMM$U*`N$$T3-E%S^W!}>GU+-6%NzKwydTBTbw?+o9X7&M4Tvg>e{qy zrFl(BvH@Z;WZ%$W&&D#GYyED+p6}rFBIwk|blFpwI-E>b+_mnK;t12tGwIBD%^z?# z4M7IXrgI&WI`iqQP`GS%7AivNwg9de4K+OE@M>JV_azwnK|j-Wt)@ao$tA^E$; zn0V%u@NXFn7)bV^3IosNl~zlpUOKAP+C0m``K{^Xl)+VGtz3uiWx_uDPlFvRkZ{u} zwXq%Rb{HProH5tjC%AwF?V&iUvJ=t^6PNU_ArJd|)1P1@uVz^|$P11R*SC&oRy z4PTXmRA4hM$QwlQ>+lFIv;zf|exyXw*2dv&05jW}O-vMTv%Qy~m@So7o=Ppx^V z#8Is}M$*m3Hty-Peyd?Y9Qq^IEskH%HqBq-j4qR9LDwwP^K-Hjt3<_q`h!}$0$z*2 zyjkjU!ZcsBgrh4SHh$7%ro+|ovC7;9hJ|X^u|_H@O*Jykl0J85@(e7BGn&x<4auKf z(q_L(Wo4GH={>p zninJ@9l42C^yQySRZET2gK_k^ub546JzjS73OAUZ*R%U#ta~S-)0%To@9MI<)@Y<> zXM$bq%P#dag}G-&v`xq9>Ss4v4t3I+$; z@IWYp;?vge_u9@nQn;phe{s!@cdX`5ly_sNI2;8Jt0zhMuQZ!&A{(fuIv4)?pBDfwd~NZH8}y zyDS(;-Zdd7BAiXlprb-!ulAyOz}@VTC|Z)tDw#Zasx6G%X&$vken)41Gv2pbYOOMV zqbJFcpQ)Pr%TqM$+?}e{I{H{NotCbwCIig(XUcz1avsccd>Z-Bv74^7VN%x&QYfD> z=9~+ohZC(iI@g}b-Y*>SC(cu8NY6sfzvs@v_!A6WubF5h;+F2ryFfxOoJ;1?8TS=; zOAb;k62s@RapP5E8rXqd^i>@~v5`aEzYy?4NXkspH@HcT;Yv0rcvn7gc0XmDGPmo5ASF9obs*(1!(i28qr?p`g z-6J87l}RGMp5~g7br{@DSKIS8dwmUqmdPxorQR&WA@7 zg@qMW$KcLUC@V)PHL{{y^D8>`*boo>#CI22JTG%7Z@({!p3u`*TM-@p^^15+#(bz8 zU;(Xlk%&)zWo``Pg0FcDiv6+jC#O+Brw>?IM29PO|^J z-KRy@f=(MD7wP4#uN1wFR6JCHUyECIbC>Eqc3o(ok2zS+eO7dP1|}}qO}bo0k#6kA zn+kp=u4hQDozj=}q^|rS8R6$Y+Idkb7U?&BYs}ny&b@*wD$~+)CuqP%Cm-ydLdT7> z&d_#NNMGvA_lqtf(RW6$d#cTMYI6q)hZ~)0$(|oYb@znkYadjTTj8$ynHCQtfnI(Rx4-5NsVdhr$odL(eauPvB-etl-1xA% z0tf-Yc$?m}J4oMDXq45wBogUyrYEd_1&#@J`>QZ=mGmoJ?sXQN3ojYJ zAMeKLyW-x3y>Jvl9FY+5pkDgHAT_8nPG`7M&$Cze;%$z7s=K&T39i>29lA_cn0C1|I zSs-^GF6u}r_=%X0_g&xXJ4nxANlVeyME>Nl8cX)^?oumTDC>rZpYp3p-X}$uqgCl1 zdc413Fgmz-bg^Ak<;&QHBzznNjE`uma1BrnO2_hnq$O8!{$Mm;2o|$d7TW(A?~^@6 z)}!y{*P6#i7JNcf6J~esrAO*$YXiP}*CR@Tw0LA?rrR zneK0J*Y)xGNf~?eUb>i(qu6%l?qs}Lo*G>^v-4AF^lJ75vKDrgK8s5<@DJY+E-B}Q zoMY1!6`AR~%eiNeeUXkoqZ^xZjm#Vs#&$3o^$a$&U?!ckfV~w%j81=2&f}zPiF0TY z8RETzrQemhRVm(hyg;KW+NNQHu5w+MzjXZ>W=@h_st6Pwd4p7{Doeq_FxvF0#O^Kq zA}1bWko+r?G|^qJNqH-C($xUqHlcQbzc;#a$QERS?q?RG{ zhjU!LcTvaRyp3z{+(Z7^N4);dqjQ{pi|%*AgXl54*eZj3Avt7YVV@h~M*c4ie%S2P zmvTmh7St0vG1q(Mv!3;IcY^a+4LD+c_MnN%f~ zX8CbM@V_*0W!gxj(dSt50l;XvO~p)0 z$@ni9(?<%1Ao@83#>_~C_n;46Yx3j(;3|<D1JzE!<=0esZcewkV?=X1GUO3 z*g43}n9z9)cZ3{AmZhKU%=irH_4Sped)EGM1UV8)Tbuphl~h^&n{W+GPM~Hs+Vitp zn)$gYjeytumwD)GZnRY<;>P?B+=M*A)#jyyd3hr^E}&j3hsYod=VDI{)3!7;)GElX zx&4gr7gKJ_1HLAt*|k}L`i0KI04{fRUXZ!&v$n+_KyOm|+wIWTJ;Lc7j(S*go`tT9f_3RG}_=dG@ z%99}kW);~V%42E>(QJY1#zhQZLSE?wA{AG9cK$=@u>OMk0NW`-NSgwIZAg0ro(uHX z$mH0wLs!o@8_3{Sy3@jS_mY`LMC0Ru&mS>8l%ffF(vJt;hrd7DkBc-I&tiTD>K^ZX zap3dZ<}ZkiNsUO=ygj83WU7A>=>}yK&q;l&awm4b)e)e;L6UB$YbI-9_MVzQX2}jQ zyKb@V7wDfrQ*I2w{6Yxd7W|J~7w@)!8w(C4_?^l%BRbdq`q|1>{tn*&;tU|uqPxgjQ@miStXwkEqqeux^wU(x^9FU0Q^BvZbSCZ#Sd{ws|81tZApwJ6v^G( zV*3krkrv;iA^61>VC1SE*?TP^&M?1Y-Lp7*wYCJj&xj*+zb7`=-ClZUTl~RCxHj9I z6s%{hA!INDtmm~Vub~ylKbnq@z7=b4%w%-LvZ#A6>p=vEyt^ z64np=Dz;4J_z*B&aGCHfgQN)*_MGnz1(cgDyi|1#ppM4yYG?UnA!$ zjSk63b-%{pFJK|7Zz-Z-ad>f&T$h~=4K*grc-vkKUQP%tc$RGWHxFrs{oOvoZ&M+C zJjk`&C`g^v`9{yET!F{MscvW{*FsZrO96yw?iwA!h*bIc@mMQwlV$P1`3Idl=9p5~ za$^#b3z{)q?MlCmM6JTRjDeB*D%+XcaTq-hBj2ss_vOY0jJ6YJ;dQY*F2pDR7ob^O zX#j||sg87^-Q;UYLO3a4EEZ7jTK)d(*WNH-?QCt{G$Ap>g~h50Otbf8z8Kz)npPSR zP>bfLUp|MJJS+vi#^zSveRWH=#|3`!Zt(YdP2Ly4G`!8anvGb2SG+kr$0q$oN{DIz zmakb@zKWZgUFExiZyWK_H~HEedr58fEVA@ubquxv^uwFTa$?W&4o4n1yM>; zFNwYOtIB0@pC$s9zwV8woeMuJJb?1}k~(;TtJ(C1xCm=od8M+H<){m?0i7sH7J@^Q zvQo0(b5C(YO#O1*2=iJo^(ub%+jMK2Lm208p}Cs>3zBdQsB18S#ErLK*^hBF%&b=` ztFdX6O;Sc0uuo&mu^!@0GK%kdWi5SZH?3O0D7tw1GUNtvAc%`kn z&PA38$OdjJC(G!)T5X6l+j#^2M{x$%W=|Hu#;~7L`|8R4o-JyZPDk>3O5plx|JsOw z7d-4pp3hUXLV9|3!3b4M*6p~eBgx-zEj`6T!2n(fE!V}Y%m zG$fpx-`*1PMe`&1U!cf+s^MmPACSgV@=$v(VV(M7Id!30i@DVEOUqTERw?<8# z7q2Jc#v*#XHo3x2?(l|>&*;iCc3g@!AlIJ>S%`A*K}^a;#H(KE~p`tF@?}a23p|_7TSv0gqqu z2+r?ZB}grLoAIb>|G(6$7LXU`Gk{g=c*fZ5s|HJY`$lD!*`U^j=&U3%rn&`>`a(aQ zC%|3%mq-%D(^`D*s$gd*x4Q5Zx{OLoL;*9qx}bDKqq0=d(|YRH8&N`mgMM;bS8Yyz zwQ1&Un5a2hM6#Ly=$*`YWg$ zLR2mKTBNIqk|n064Y%p^{ml zzZ}eYkjH}Nx+Bc`fG+kk7)+!d_5O2c4zH*9h!)T02y)2H!YL8WpX!w-POq1oYGq9Q zxBTU}En`VBJ*uIdI+9Ivj-#{&0Y**oRY6I@>(+XgG+Iv&YNQWz^AbTa`Ak#=s^oD7 zGReC&Hy{dll)Ar=R)mmXOFowN2t8*})-)e}le}PEpd+Q|Hrtt%i-bh;+W%k(lO(Rv zeA6VS>kO!2urmH7b(jn&QfK?~!^XeOPi+wetin>8sC@{Vpxc5-^(_%Gje+@Sn$^nh zP_mainqv-guQ2%|h|Pd!rM|)2lbqB$gO{zZN%$lbUm@x(U9ZJ5)#m?&U6+c|ROS&n zB>D}g!G079LvLzJBHL)ZV8M=#>K=hk7q3_m&|N7zb;j2E1wM?yPZs}Y+Ij#pU}?n_ zR_W}5ru4hu7{{}!K=b%n;%W<@2t3SMJwkHPhlH8MQYBSW^eG>JjvQ#TBg>|({el6d zZfz@_&m6pKNRu2C?Q1M|HRTqQwLn{;=qbVKW#-QGuDtP2r2=naGI!@^gI zHPln<$ycT+sbnT1eI0wGN`}=13%4(SCP~1k^GFlDK@GDpO`9AX#rXn+faXv?zoB-% zTq;@HbXXhb(p-UMi6It@8q!onYjf{2x4C^r1J@FKhP@sem`#ewRRJf;qi^mR6`bg+ z#V7BRS%wj6%W}wLO%}|m_66h_J~Uawx$5}N9RdnQZ#Q;k-;a((#LfBob$G`Th4@gC zfX?kb$Tg?-r&P^WBg49;5>R(h9^=5`l+6G8J0TzX+`s8u_N?vSijgW?q0;N1z=NO>`I zEn+jNLoTh#sn=|LJA}q0PjmCTJ|%bL^y3R{&ILNGvImXWu)t<<8>G9`N>%4l{tD!} zrT|-FND7^${8&6^qr97Upr?bbHVG)`x@Q4lkAGKp_y(OMIJKH%C+uZZn1G?s6*4B7 zn*$P6N8ZBv5!~yuV6-AZ=8v4d%Ug}xSC1GzjE98B;k+|-Qy*!KeC$zL5*t{@9??!U!=TJlx8rtDsJOJF6oBst)+1qd4HUoASyXrU3+MMXwgY}1D`KdYTP$8 z1=(R8-394ktDlR(V~7h9;Z4J*S#Sa>PtN#x|MQ`E{{{7(qseBj+&jr+hbnh1#>^OJ z>3ou_If{<8PPQ=T0^@;Sj}=<;)$XSvY&T=DIo&3d?T^lxrINp-VDjWAcl0>={+CY@ zDBXUUKCbbd3i7GDb6yR19%j}yL0%*VK3zX)i?QHL1f3t7Uk-JZy<)Py5S5!o5br%w z)AMzVKg0xUXtGGO~332gFPF=W5?6Z+KaPLw37h)VKK7<6}DC&SMePM`?WY^ax(S_}YuV!F1E zsj&9sC4A_*a#dw5jW>xMq%Z_h#kfv_g(Q+l(i<97J^;o{D?QK;_HPLx*bR_7=_iQ& zLb2ZcGbVvoYI+uv!QwA@zs9+j8G~W+XkGVHd2tb{^z@=<fCuJwm84l zua--r92r)%v3q{c7$gRkXsw&o{6+}_EfLXFv~)y-p1nF1k9U-eUOn3TgXt`LRam#y zzDK7k(?SiaY@du5eV|0ATF3^}#?{guGyK9n`kNV68ZiMeL`k&7#5ER&0$A9L7!q$? zr-{MuSqoXH;1W*mY^r*EgbE)3aU5!CpNyn3Utcjd2CXd+S6k^C z3#MvZs!$CvKn-MJ*Fdg~_pe)QZ0;YD8|g)>Z>F{x3Y+qfTnvbwvG*&Dh^10+n&R_I9DcH`_A4KjD4Onr;tPcgoEm3^ANP6Y}(T>3xxyXx( z!_rJQhxo@mkMtBXkCw(pd4HhKi>VW-j~N>*&9#9l=@D3sY<-`E|zbBZD37ZtR?eEn9x;~3y*_dbcVGG9$^mvyqn94?-`Wn0@Z$f={Kk%y`6m!fd> z@FNpNz}BFp`I@O=$h* zc#g>f!SK*}Nng}-yo3XU_oL8!vpO_~yDw4;>2smF@(!=&H012d~)=D*pv%$!>eD`vq$wf%)sTdoSu(2K(C$c%buFEOdrgV zpVXsaL1*@--NT)E!ba@;LY#S39Qp&3quGmkML?(# zaN2a>fWktRrC!c3bO#tQDF)rL_KkQ{kPxSHpk_d&?nC-{ZIv@8Vd?|11*jd}MN313 zAC-m6EnlgWV?+aZwh#(&L`?S-oVTlE`6psOhLPu8gS=BC={1yNm`UoLrp3NiMUO=K zK19V2N0qLWz8O_`xwtwJLP&KBv^u09Ad{xXHjZ3X{_@SmcwW8+x)gLdNDQ!`0uL=n zx|da$S}Ql%^%811`hKiqzV$(S`$B{n@N1Dr`w{)FFUFb^Y#lolHI5NA$(6tqHM{aI^-B08@%Ks7eJ!O{%90b*mFALCoi5NT*`R5vDB%f7U))|3nh zqxTrO)B+~NWTd5H8H|;W>hZ$83`SY<`YrC4QJ%=r10Cu7F87-%(wk#KHh<4cxKW!F z`b4s{l*T}c#d)A^Q-9QpkOJ#BSwd(oa0vtXtCuRab7pH!6rxQRf@B01d-7bYk~z;? z)^~~z6(4hd&Cx$iT>X|i?5{Hn@Ue2nRd(+nOZ>Nx>e(g~79sSFRyqski+6Gs^Brbu zv7XFBlUvh&Tb zv+#c3*EuSJeJ>Ln8hM#qw&V)n1IjC$zb7daE&Mj)+RBrqKf%akNk-0B@K%I$K#5&| z=~G%}M@5p)A5G1TFqB`Dl4AYCbNU#JEm)CjEE$f%W2CX8jb=zJ1CjU!KU4urVg0-x z;I)O`O4ouIj)*JD*p@`^zbE(4gz0dBpq#aL2+Jo3^hpE%BmSq;FC@9DbYl}<9Gtgmqo5E5?m`3uNY}WG$1Ku2qI^W*8iIh~RI#hh z8P1-m^n6t3S>teHZ_YZrgV zr3EQ`wUO+_^5NVa?Hv`I)6*Sd3ReYuR59}sZ5sp*0Kb{oLfk1uT5auqPM9C4VsE7w z>QRr@C}-deqqa~e>nAb!g?XQcJ9;Y4hGQOuy&sM548I~-hSTZ#=$`#x{PC|!;|I_^ z8CI>9COf4*c6oOU#N!b@H0glm++)H~!=pOSZ;H7=@$-U(MrShxrIrN-xV$0fs%Cq?ZcFr zof&kGo3@0a`lsv2isU2SsQ`SnHM5`7=?FFSnbVWl^K$2Jp`3)Sw48C_`7Id zjL5L1LiajDpa$S{dO&UdFkR`$=_Fo65}21c_-6}WW+x1Gx2;1(SEO6xH0V+zAx@_a z1?;?*WPrFAsAVIP><8VYiH;K>d6_+q_ENL%>TpTtwp1i-VMEPkDI$K=~iB`wjLDgcN!zp(By)veM1jl3=twXa6YE)`USH zs*$QFd9-*to>6=UfB(XzOt1K+Ltbg5H}*cSq4%P*WQ~;?6k`Qe%BJ>}$0$;$k1< zV__>+K5l!|6R)QK>Y1p?4=`UsOeOltwQbE?l9OeeR&razBDbE@_~-E7(sZ@-kIj6& zKS|!cL3hb)7K%m#h8(Sly$g1?S{BI8my_3JUvOJA>tRi0`$YHh z{_FQ0{t#m;rB^ncU)`44zhf3HGtu)p&%U_sRfkj1*^>{(cix8)@47%0t+AT#GCM@~ zlX~)QMyhQNtycH`hb>c9Ps)#CR}#gobQ=oBwvu?4t6t6?y!zgv#IT~Fk*drLdeh8Z z$r;?&tJv>PWewmp}@0Ndz6}v)er|g86^!*P%uA? zJdV;yWHLY4x7QZypC&D|iLr95N7YzMC&xnmsxx8IyMxkE ziKLfQK02~*`+PiOp06XELn4#^&e<_6CNmQOx|trH55}s_z}%hc&D!*FuQiKZkj z9K7R!vC=Yg-fQu;;dF!Gw}SAl6QuF6@?pVdYJ1LSEw12)pnnmi1E=W~srTa1SLi~? zY#Lm)xTq)HGa#I$A$o0KTRK1juO&)bFz;fLI{VW#%$wbPP}&{ii?`Rt9DYL4h_B=v z3}4UqOVUl9+-xH6vZH`ZK+?_H+bim1@5Z+qd|@t;vIy; zgfu#qY;#uurqJNN6=r=!jki2+iq`d|7SGpnV$W7!J&PqeuPOhZlCwX5PxFjih7(3e+QYp}mo%<1`xWsnA?tBwLKO}qVmRmrp(!N?L zZ2*6kX@<}_{g{2=Z3HnLVp91VdtRqoGkDv^WHu&JS(H;u^6GIKzt+muD-=V&_{11X z#>65h3mb_068x6)@2|r@NQ0x;+K~bZfX>U(!$Y|`Wr){twy)?^g<2%sn1GsIlC`w~e>MMp@L%29 zTx)pV_i$}wWfX+TDui-{CvoVp8`IHbcfBslI&*J|d_<35IPYUs=M3{KJ#a*ik*=8Rz1DMwhpx)D2_OPU59+e}vTZ4ab&@)n zIx}6*3CexB*AV29qh{>X5cd(D&up^>_t7x-lBZD??w_M-_R$|kt{Y0PnW zYuCNdRWY^$@!jB@?7Ud@B1;ZLez#5sP7(bfQ!UmRg@zLRj^9mJ80K@ zQjqbi{X-A`J_Z(++ww=m-fKP+m3I_C^^&7us;n&NzdMQ#ZhV^aDaiT5=}j9MR}1r1 zs9Wg$Seabrhl6!ktP#xv7{9F(hO=KJ&+Y{8hr!)!iYSfNNRa@`#*>R;8N?X-gHC$d zi1~EtE`)d|y<7y>eb+YUa|vV}FhR8)&xD}nKkE@5gL=zR!7>fx09i_s=uc?I)Exef zE`a!%oIO0$-bdJ#*yy}JrcmXu(k4uS8R^^oX)lvM9YOmTtsfYr7emuvLz37HCfP04 ze-h~1$@15()9+)>X2QI(sL!XvRQsAvR6#OXhvd_H#Ff zCRc(@TH2qVD?OYg@9Gzn@^*xkyc8C~8C*@{vgk)PE~ntSQTJKyT!Y;1rQaB>0S)cd z0CVk)fwmu@uVix#Ga}d@Ci*TC?i=KfV#Jx92Wd*Yd6a=pNie@Y+B%cbcfCZWyV<(0 z`RnsnYor~MCRPf`(*nOldjG@A>RJDcK#)!eZR;*v`bs^ zLqtIq9u%7E37Od!8H`yWFH06{Pvr_%Um4m*x6O3i7U|FA8o^$dUo=S{#k$Y&EQpD# zj2gPtAXP<4o5k$mpq884h2VpB1BC$Mn`?jF;QBF~9vekBB%-YwsH^w4(Vw%}7h|n% z7u%IZN`z71Jp4PzeI&eNF;{85G*ow>)Ig_uFdK1r6Oyg>Cd0fR224^0nIx@FrVnb^ z5z1~3A~E(H151nY4k6LT)+V%=DhqR@K4QLu&X02pb1JcXD*J}9)h1iM;wEDX>ea*v zq0c?QR}!Go4ecvGq$K}~osc~g@9>DLY6|K^LRYfyXA2M_>ga*p59GE&E8snhB1`5?6*mW zPrFi7>UH9Yi_OZ$$1XcZ=A%7N+pWFExYWZLBJ47o(?F%fPis-zX1jxdo>qPoR z!;M=#3~f((Dw+0b&7W(`nSG&oB1eW?ajnP9wtQ+dk}_$%OalWbC}KILzcB?pRV6J` zawcMi_{59$!9wrdp4}y(nkfR8gx(y;F6Tl0rD#nI@%ZM-eSp`CqH^N;Hu9>=6HXIj z_dg~s6#u2)o26c*(3SHuM_);@Usr3Z8Y){UGBR$e@sqiDS0Ud$oK6*46cphqvQqig zaV9@?(`%AL&z=w@HbH9iP&t_e^d$+Zf?SjLcX_wn9-HDlQa4BZPPv$u5QevPe+l8a zbdiTIcjpkOO%UIOtgJLTVA#=n;2q8#LAe>l6Z0cu+AJl7qwbjKy2-pfv^S4_t#)lB zbg~)uwJVe64q;cR{E^!GDElbmXhLGKuc_AG2L4_1Q78WwJ1*80`hPJ%FRDj$%tY^} zAzIZs56ggd*23=4NWba-%bnp{=<69$(HOp*n?uFEDu0`_UQ53yL6IUo*$<6)9Nghn zYqXCSJ#&!1DoSVK=toSRqjLr|v}`Cnsz<;_?6ck(N=*Hw9DV~olU|QM`jFym-BGx= z{D$>Vj`$ND7;nF~pKA#xT8^D!PSKYqJu(=qy8Kr1O^6)4bdbDi5*Il7FSTgsKP zkk&y0XPNyR?~*fROT_o+s`0eOh#CSF*ifjELTW~4!Ak~}JDpxl;)Y9ClRV*J^eH|4 z&ZrGEHMe;7aC|LuOZg*8C(`HpNjuFX3&O#pqv-c)5~7F1jY2rVfoS%y$uSj2`bP!+ zpaCuhzfamSuzR2NXFENRefUe@@8DmowaW=)k`{7eJ$qBvvsIW468H)XYYYuF3w`vJ zA!yyc$d?@+2|!LS@y=r>2N_}MYYJ3%3^Dki#@16$R`G6DG%z(1Dw8x#>Rrl11*w;; z8La;ZuDbho`V3Z{DeR0%i^hjvYEGnO2Ku~>K5HaEHCxrJcRd;%(PC$Vu8lk?|AUG9 ze%?=Lexm$_Udh7Uax85BicBEu%DQZ0A>>vDy51ooz01n>gKaEd9uPZ+Z64-(fJ>$a zGR%Kllza#bE$~dm2*6OeC#vvm3Z{mj#|{H`S-ub*HyLJ$L8`*L2R}KXp68{VxD6!v7q+7qV6ZCU>vjLHFuNj23q18X9FP zoKt2g?uUgguUC~kj;l3)Q_L2m0}<}0yUJj}Ye5Oy$gUSFU_guP5VfAr%OB*G{+$0g zjmVR~F%dt_o1paJuOB{gY-GlM_xl1lX22P`2BcM^{eYT8yQ2xlGUt!r%bkV{I$P^; znQ!w7Pw11)$>T9RaBHfxC^GN82vuro(ac0uYKC%!i#ztH=VTxATXBcG032^5MNbJ8 zsbS8q;^u6d?ADWO&s#5M*`nKD2n>?$zf*XDohdNzFB5c2$M2KOTjJb@ zxct>}zR>YFSLrszguYT>N?fg_269HrZ1PO+m%WMFYAm=V(NoLI$q%{zCi<+Nzrv-5 zr;wP83k73Ug+pf|R`vX3Ly@ntp(6P>7E5|)Bwncg&DKL%tRaT|WC)CtwXt1o%3kHK z$jp^{`_M}hp^uen?eA&LoInqZgo#oiT$L-}gB@*+h=0Wv32c?j=0%&MrpdlYZc)!U zrKx8uO`k@e9gfHNE1Q(0Log7tkAv1wR~(NQm?G<{m=16$r&I_tcv_%Vo%eZue9vog zfkyhGuUj347t%aeXuluEQJ6g|L7F}?ZS{NZQDOV-A=_qWJe}z(UK31~zMO%AamkvY z1C&;B$vY?p7R|=l$STZG0w08`*lE!{R^7PJ@5r?BAenq*NUjP&NP)|I6zme#l#e~` zyp5lhR~iaW9}^aniiaXK3n!D{YN{!UNzFnvk(%ATPn8%Z*`_n2K*dC^zT4O_JoPdY z^;^c$ToY}c5Lby2yX1<7h13@#V4#6rm6NJqOPt%BWU2L6)i8asw#x6X>bxF|5n7v? zNmBcn;-~y?cHIg3ME5e^AR{IYt8n7FkOs;3a1=eC2~%s~7;mT>Ovx}hQLS}Zyj4=s zFy9I9<22MzlgHX~Z^ZyJQKc-9hiFMLd_IHq01Yl;?+oIaFbx0-jVH>0hF?A8ISt>> z^>YmVo0lAHO+3jjcLs~QE95t4;mw;CD6j0UvX%(+bR;WIVP^)}Qu79e#igd9-b_vN5WYyQD|UMaV3#)PxL)}<#4dP< zq<*6P{1}YdK$<^kQJk){8IH5aDPae6Qkj(`xQmHv7~u-rr;-G!i|5+tcuCGmGF`WQ zNB-gayUM7P5#!iLr$oWi5>eTIl1W%`>%; zm9A+~@Ni$i(i&0cgj zl38NBx#CXxdkR-ibnLZVsBVyd zD4kRYn;SnqYIyc|s?So6F(|6vqt`f)t0tR*1 z86XM5O75g+LKl5JZOcVEDwDgvZVLuQ7Pin;Mggs)&I#H8PL!T8g7mf^)#f3%gziY+ z(m@*yrHvtRKrIx8nHO0A8KIrgMmX8fOp>ZK2rUO3X7U8g+V}iUmOz8WBGNUPYw-@T z#g@Kw5#wPkdChPO#?ia0lrGc5EJ`rKAn9KipivX)>RhhAqu=e)Sc8SG`SM%V_d(N< z=y@Mn6Lck18tl9MtY5{E2i(u9f)lM1)OkhWA$-LLV^p40dNqbSAf5G~q*jJ>G&nDq z3@AMUb-Mqk`q!~HBjc(p3(ys-YbzU~O6qT&9hLfsClEzWhH|u%Xkv}3vW-4gslxd5 zP$rd%bdEuQ1q}N@@&hm!`sC$fTxm{ms}>-~$@Nb-hBN4Vq(-(#9~pwD=_7M+-Z;*1V3b}P6`Wm6Cse$STbM*n8`zyhER8Mv-zbFu>jyirF z){eUet579J-+6Hc-Iylt#0S#FDa2)Sq7NYtG*TZ%4xRiXQiIWZQu+N@Bdt~AXFeW9 z^Ideu3|A|qx1#WOW=rh?DJ$ zS>p%f5^2eT zjO*8!CM{i}KRh00s`lyjPEBx{bQZprDw{x4Ow2ivrWHv5-S1@(i~fRnc>Fsumq{O- zOn)1IgZ(?QF+ByFQab&+93zS2@;QmljETW;T&=&QK|BQWBb~u$iPL$=M90+(@M=f-e-)p^JVnz8vCoE!RZx-XVH4e-=}Tit1F*kwF6&jOYmz%VjE0Ye zT5KE0f9-l4)DCtqlMQU}J{DX;ABkfBQQJQjN?gT8cLvHccgcauQb)+K_?7&+Xg*{e zU!g-Waw{Ah*4_+%H{3yWRERNRfUMTH$a*1`-X*e6L>d!EC)KgHlMfG7W@4GHl~Myj zOIsu0G<29gXGu)kDKPlp25*t#M=6upO4<6fko`f9c-q7GO8eGHpA4gPoc&XzpjlJTfItPOk zSVcz+*zzZxXxaYvU!`<35Hro{FxR#a_y_K9iqhq1aJ5#!v-_Gm~e zSzg#slE!O&6|MF17fyUj&tMzPNeDhCW!cH7{n@hMC#!PS5c58nq$DSisYGvUQsS}B zv+sw~MMV&uzi*&htn{mXR6A83zQ8q%cfTEG|1GlQ04e&0_6|l!DIFQ>x)5&ej~K|n zaqK#YdwNVE0iCOw69zS(=Z z)ajfV=P60NHj4geWD7O)2TCtw#Gt*{hI;kHFEEwghh?qmdQlsdJ6}gv>{hKq2!>;N`;(Q%15O5;0sj7m! zs)riRLf=DPK6b3#VjD>;|?=KdOSz$)DkvbSRy zczcn%bK&I=yiR7&pT4rIw5y}2lrPz4!-BR)z)9L0a~O`G4D?=FlY?&EGxnV+$**mH z+xl{UcFQ828QLq7q4IINBh@_5fnl8L?jNMtGn@y?eS1m9KU?Y0R7M&}f7U-z*}zY- z{+nYyQd)RUZX1mq<>4~lBo-4zhs>r;{gZ2SS8{k8d)UY)IQK8+Tg)db{`q`+usfYi z^U?<+$ve_mg`SH;>IHU=w>5$9bjvCp3KJirJCd%Q<|=Jh&1;*iXM_&B*N%~L(x0pE zJ){&2-3Zxwi?(>!{(;3a&{}56PCCYjyLs*owA`PYLJI6#b)9!}t*mUWytlzInVhgs z80h&+SJV;KbJ!4xO{_3CITAhkHzqJ8j%}r?ng+jLRo@^@FUgtCv2+c>%zUye%q9Bz zSNaI!;NyJ6LL26)ux@>lh@Geg`Jmm^B&3tl*zvT9(N2bz95qZ()%w`sD3VyPaxjQr z@V6k$e}AlEDt)!>>WL%tVy5}AWUO@PVti_*569)6ilG0-2Di~dyL5jE{l*krO2Myx zL;A!}wS`}G^Eox+cQfjl4_n0o;Hq`r?dwy*0TT}V*()$p{ zYRxyR%s7oyvu_s_yfB2lkt?+t>?zuUZy}_n6cty8^1r@};cm)^dmh)vy-n?i6`w5A z*t2bP)G}^?^*>tc;}#$@Q~G&v(lKe9S{4L+uhvPDNlmSBT=iiYM+w%?;|Qlu!bVx` zn5w&1dUv!e=|hS5!|tXFeZ>QO`wJEm^HU;ONOw(imqeCYorBHf4Qu(h6P3ZU#M^10 zQ~UOmk;ml}bubkR8FFPS4GWhyZ~~lE|5Xd3rX+e9i=C<2x<<}4y;AM$5Q%S5KpX;_1T3rq47d>+MXvMd2 zob;?Dk0`XIoNSRs+4v4;j24opXS0d~%}i~-sJ`_NkCeKVU~Du==lc{2%DrYNP$*RiKPVvj&Hbowu-GX%Emk0rzytNP~nVQPPeSI<#vsh^d7(i zrQ$oTRdsGxBK=KVEvXBU3QxIYq%oIj>8yAB&XL{^;r_<}t@YVz>2jp^1DX`+{m@o+xeveA^-37&DwrOYb2Xe) z+p|-B5y=6X7BXyg>O=X|spH2nI7svEqUG)MVFSIHC{@J-dsU4M%#hn}GneF5(-nQG z#=u^Pb@xP**Vx5q-2-s1HMDlWWyB~3#xCfiwaNjKEn&k=aXg7<$=M}%P(9ukCtVWB zAWRmQzAx_-GGgdw!`XYZ<8}6MU*eVrsmZ%^g9hig6#`3+B4(B-3IShJW0oqbZ-o5o;u|-64zFfhuL*^$*t5-kueYK;UYg;xboh6JK+tbQFD{8x|8aaQO-tz zW?7M{MeFYMrOPQgMyln^xDYl_wkA6UlbM?yAoEf!N=mU}y+@~7FuQv&v6FS)YR>09 z$s{J-yMR<;(iyY!Ep*BNGG`KI7tTaUAEsaI8<+`gr570v*<}(Nfcr{oEaoDHFX0M{ zO1|K1t|99JXENSX_OVg1^ucJl>OQ$v%)Lsy_fel!(&+O(Cs5cuv?jLbxE(cnWhzmLYad1*^eUtHNcn7a z_8xkEma4%=!!7cmeCt5F{Oc6=*a-GjKdyQIXJn!~->$s7{atgG^V&wKR#1MTUqKC_ z_ZDzfoyU-sP?*Zq4Wg-i<)!o4POWq45GuvEPUS3ll)Tq@sp~N|y&3JnDY>HHmP^{o`SCQd5POc$W$V2P~J{Qck6k* z+uTPvW8Z{kBs(TwS#jF#9v4{ z>_;_yJd!0y?7%|rF7v26?7wRmtZEI7*4Qyl4YK&7s-$H!pWhT#%ShA5W(@86JNC%+XJh=D=r(ympKt`flFe8E4 z5|uFWsF%3DbwHx6t)(ZUSJ%Vbu+iz8lrxx@@=Wcsqz7XQ-5yuivB&7Ap|lHoydM}%+FVi^U)%={H7p%$G8G^ zre4&NbTcBbwL_nDkL4f7S1PK*bfItudg$jKP_~gW`#n03HDlKV_NFFhnKSoO-JV9J zo9)Xqrxdo1QZhrU*K9r4);Sc+6*f8DHp_i&McEfcYQAV*T}&!w^|IVPkyhGWeE<3Vkq;}DGv}Q9zOUtVy`IzZgg)X05l!``GR-$D z9n%7{tLBnQ_;jYXeel1`diHb52}lLb>psNz0`*wO*rLU$O-C9Ut($k}S=K1`Q1gMGH}YS+}(@F4}l`sgAI7= z!UmFQ6^9GCxt}TDOncR9<8Ot*x_1h1ip|-lV$#L-oEIYKah91bF6JK6uxkt$A;>4;z%l31qOmTd$II8dHNk1M zHn}XfIuHodF%u!8f=S|kEOj3ZvbUtRFS7a(9NIv$ybN`mEmhFez}2Bk#MvC*lrR zp1_o7XPGZNWF6Vh+iabowLI?swsjn=sKL4S&uO|AP2$_)0{yTG%zxe=#YZR2=5l4P zO;}(aA5ITacC$K=LQJ%u27ZlY@9N-20vfrxc%E5^3GJtk(lcu^hKO3{GVepHeY3hyQ9|2)%=S?hee8Y1% zJ>u1~r;~&c*=uEziQ4et*vDCyAWKgL zAn#+S>I5GLx?FhN1@#l!%5g|3)vL2U+yE6;dPiaTi;TzYygH%xAu zigf=JY<>PA>_p^SS@#_BChSNPuCXZ(0UyV@M!-T9e=XKk7Re7XaD!AiKVj)63oC&6 zQMd`@$GcKA(i6RBea0^ToBu}xXnwd)pl_~(GK~7h!OuoG>qTKbw~q=ewn#D`Q*b{T z#5MWb_#l%G{VcuJ?jiAP{VF~+nIGr!ZFIfcM|dkMB}~@rrPa^y3#G<>SvoASI9t?o z$V_hW9JCnY@&t^js#%t(-Ft}GYJDe~yP_?qnx^dG-*cYY!7Vguf4w>_^SVKc#>Qv} zu)-?_38UP%6!vYp+(fF@vU8@&`?1R=M!uY*MWs^Sm{?{2O-hGho1AxpL5qVw^K`z_ zN^g~IAr|=ABZ%vPoEgP&fvJG8*yB;UhL*~vD*BSKvza}T%>BC3^=gRZ`BVx|xC3&&FxLKZG`mD9 z8pWLT8SUTcJCe(^hs7R!CxYbH6ZuhgR1lOlXAGAGByMjL=%Kl+rP5qKURQ%TW1{WT1|4 zcMAinV=Poyfsdy}LbWLjh~y-d+Lhi|PbvPMO;Z@J?+@sw<93$*?I2eAYba#qE2?oS z=-k8j@&)2xa)K~O5;s@0v72HX3t({-Bw7Q}^vEb-1%J}aDV1q$mLkhFCjN3RIg3A2 z_7I+A&RMdiM(diP1be;JkQ|OMQSBvYh|d1u8TOtLW+O7L9wtTh{>b$SgIqOrrgEe& z9bl%}p~4mzY*T)p{YnUvmiN5@%WJz7j3vLLn6cWPVLuq`IW2T#%?aWzM}ubdWeyG$ zF}~dAo!`j|-Vd_n;rZU9@kDv|Fs6({MU7CVL2Y*KaAeLGJu6QU6_W#=br2ST?iwUb zSC6I^N*}f#OXku24_RxTrRN{9`-TxyYZF$VA(R}~nQDDCwT@o;nnrHa z?t?fb`^Sx`8bH)z{b+y#%zsu173^rDzcbCmGZFjzHI zG+CdI3&dJaCg2XKM+T#E0v?`q%W%~^HVQne@L&4pG4;M@xqGwo(=%uF_t=<(e4BAG z#9BCZH~gE*&3zO$Jqq8>gCJgpz3;XW(#sVaich#6_AW$UWfkZ9etuDqEzY$*$a{;< zOZO~;#Sy?Ya>EQ*jWc)7BNdF-dOC-)5%8snK9&hXmobQGAY?ZDhGRnkJ*peh@TuJ%mv>81TqHx%>6Z%SH5`k)yMix>ZU3w2M_z^3xa$=xy79wyh=alE zaLhiYhxC#gTk%$o9@-gvb&Uc=1-q2|7mv`H)8O#|F!5pfd~IOj zq|Cw&*xl}Z3y$r^>c@#3e%*otkI_OTCu2w*DwI%xqSU**+J0VpAS9yM@0)AFh%bK$ z+-ZU_!}+umsg!|%?xo%BEmB~jB8MuQA>w7Ber+O(e{AiYWin(K_xnClAt3_u{ z?JI^|T}vAAl`CQ2S}ecp>}1+`#>2f8&6vsvR#Dp>{CAsr-|9R<+an?m!7i0po2`>U zkb;K${7=zMW;QEQ`;Gb4RUHemb~E@X$3a+jQH$s>pNWOyc;P-%t{*9W-{HAA6kUSc zF17W1Dx7Rw$blk9O!ch8TIJ94lfTDZ>s521fweuxmTLXf|K0U6?wpRM+D;WlplZGr zCrjZ>MZN(_({L$+Cl_TGU!kWb-Gh$U{pk+9_2?7cl-7Q5NCQTCgdbb*aY{dVAb%rM)2WZx4~8gOCL)2j3;@=~l z;5n({P*O(XtrPXx2OdxzG-_Fz3w9e$HOWHGJL;AX8#{PIRyf9Ogcw;HHtbPNQFD(|^pun`8(3T9$Bx@yf@*mPB^B=zKQ_ zcI7~PJCo$AcWgJ0P|$6C3tQlb(itoRJu8(We+KQ?++V2rHLl-ID38O!r14w z#QCOlG>A&>uXtJ$i6y-idU~_SY}R^H*cH+2EF(?jaWILr3enss9uDL}@K#&~m2ury zV302R8V)KZ=UwEaLB-Do@N1ONPf2+-nU0@qcOfi_0nD|3nGcJ!v?{`3^X+C2Mm6na zQ(tA@3fIOP_ji7TD6*3ZjC@^NiSKhb8qLDUJQtreJchf>LwyuGCP(}SHb=nM+RmQ# z1;So(g}xsvtMalBx8R+iQ4hkkWa9zhKFL@mx55= zg8}N3_~FvgS}?8sWBgD*p>q%pd0gBBZ>ZprF+wW(ZYK=2<|4uxHa;ih3Hme@eKL_A zqI4pVA$(W3Zyx-tvD~K%PzhX*T4&Mk-URqI{vGBH6-00k*weB$pp@WxN zCKKb>WRmqhMf4YUisfF6hC(+s>R+=6FIZzVkTD7NjypBg|EBV0-cNCoRZ7ihjJKfwJIi zr|f`p4RH&>OlHh{vKa@TXsd(XRgn3TZ=C-KyGbeEW5$Z02@zf7_@%1V10cLFQx#}w z%glNyDDW5OR$A7P%Ispc^ZVSS3I7n`63KKW2jMMiR%U!}znBOqZPU(*HC46sz6um0U87_tnaVD;)rAMtj?FnQ z%9s@Pjgc^}1~aI`*#&{1q%;?LPYoD=rIZ2bayjfXFykjb3HJ}cQEXpoPJJZ2$ku7( zYe}f%2m~|=91qWU6;If!Mq5k%0%%h};xZWX3SFYozR@~;{b2H=e~h~(NI1{_tiXi6 zwnnf+iGmN(z=ukwTO%Ld{t7#BF065bW*~eNkHX>1Jt6euXm)8-kI8jN!Oc~6lyJ8U zmOpIk$Ryzd964$p2(#R9D;7@eGe3d*tDc#Yd0qw&Ioz5^LOULY+x_9k-O@>upG|!7 zaQ;J`CB4Y5%T zWs#-%lW1rt{NBL*fkVJ-y_)`kcUi5!PX7q?_L0;CgQXd`gW>e=rEOQULPHQE;cqOQ zeQ6|YM6Heayk0Q7^J3YD9;cB*=@W^bI#ib&S98%ZSx?E>+DMtVnC_e{zQkRF0 z?g&DXS)QwpYeo#_s>P)b2WIPXknH&f;@TbZQBNC6V5=GNv3eC zbt?T$1Jz4t$tdNY{85#;&oOrWMx2BNHj@6TY`>nAWRmQ{O%wfqSnjn+*>yBcvmc@i_16OkNe%XwXf zEtWslqFQ~81BXZ8UI9$Dc7Ng?N0giJnK;)l^kXd>UWwAuY5}D$O7?9HxA|dnqC&q9 zo#$y+A-kn7(UI3cfs;}r`2(y=B+7++-xdT^MbzW1mMqOM;vPB~r)pD2`EJlByJYqC zv@!--`kTKgVz)dm75Kd!6D)Hf%7PX=jTLN%*ZpiTSx3Jv^Xf1|Iv&FcE16<`POR-y zey!R5lZj-~(kmqd@j+(V9z9>c-EfwpVrK?I3wyO_847A2#My z#}2w=N#-y)%E^zYoKu3#^ZJR|&=N-JQfZp24De;U2Jl=N>iC~Fw0>@XbTeIB1a%Si zORsd6=l(%okN2sm0c+fFDGFBVI)-*;2q)d15JH7*OpATtU|X)RgX*1-qr&8IA3EUq zuvG=AR-E`_+c=sZHsQI*z)^^h?8tZZfz_jXLLpemZaK>Zd*H=rMGKnwuAB}ZxHzsa z<8AqY`!i30g%?;5o}cOPp##*>K3G1;y9K)@$-W}4&3#U_!_zJpxRiXXo#30xKca%4 zd8WdAqx0}}m@^K^a?mrFBH#XtSL{m8^dwylJCt zyT}BnTaCR?6bgItovZA06plp>22UQ_Z1e|-71BAha0Vs|K{J^WPt*DcnE53AXuEKM zl)Bf46s!$~g_bFzoJqPhggIHYWpE$+cSpo&(!_3RsL;6bhamRN8c5bbpg(y(;}Gl( z6?*uDNPAhK@|v%We2gwz&A#d;I;_Z<2##lItde&nKm^)Tx&3P*ut4Lhtf`gff{wB= z>%BX1U;Z&EC%unogSrFIuDrAr*W=p~C+eRK-cBw>(WanJJxXg-uCj1`lA3(QKC9vU zO6Z&b0}pZUo}pKx$bM3H)mV0d;3A%|JJ{Ms$-M12V|{I%`)r@FzF;gFX6z8J(^+=g zxXfBDudrKo_G-D`&vrGY4dLeVR8;Ww4(FjGZ4^GSoVv-Bh^fB262$l1R#<-m<_~43 zqJd%*w>^~Wi4}7BHgvS$FFr4S7DKY$V11Z4Adtp1AGihBHvc{pj`l?dXypv~Ama)C zL#6)X>tgn^YV(L`v~LxiJ0>?Mt^e4L;Nt5FW}oAtvE6No$Im)D8pG8;x8snZ^`ug) zMsh0GX~nMDYby7Kc-j+b z8^sld!$k%Aq8&|TqI=LZ%lxqd-my^~zi(V_1RIgUE;8VNaSNSymNuICb+POdVdexY z$3_-?4ZK$T&@)&Xa+~}VG)}?UuE8Q%$KOiIIs`ZnW|~b0m9RE78yyDMwOM^syG~?H z$m1?4d9PNx9zW)Z&4Xu?c6XIc`)x)#2I-U3@NPDBDZ7kSec2Uj$h3w2!}HQY3Kj>! zmk$@nHcQ)VC+JIa_z!V-HZMum)N859eYQ=>G-Ekj{sr8#$=|d50Hch~FN(RVZNe+= z)?k>acYZyKofyX!zAcIHS5H--!79zF@a;w$`iJCo-gS80eE1ndD z0wRc0iPO>M`J?scz!2Fnlk1))>`prbjiCjf1-Z0I!YsO`Z}(gu@4IeJRdI0|Ig8ba ziS%KPT(T^OpN69g2ok9SKVho5E=#xz{~GC!P4I0q{4;=l@&w-8ajwjbb0aGwKN8A? zFV>!G7qRF6!uxcBojO$JZG*Whx-`Eg$>j6H=!o6|jn`D(L{}_CmD>RkXNto!lEksF zVik;fS>D5ze~>*x;aVg&_aBt}b?!{Mc#1_VSVVkpc1*yU)@3FCtR7ayB7&jGvWPoU ze{Q{HEo_Zt)8fS^=&Df1h5~uwjOS%=avs{DGXG|Mpy+vu+g&VcsDi;Wg{AyQqd>cB zc9sJ}qUbl_)dZwmvYR5{Zyn1zI@kA(Y#Zp$lh3F+-u8y@anotbD!9K-9OcS(@RKas ze>~4pZzfK}hs*~}Um1=i>|22g`=J3ipX-;$L31M9E@vwo-079d-8~$>BnewkJc_4! z^mKWE)lFma>^-m?An63ert31O~ZK5~#>*lAcA7_J@(YdV5gcG!{y)!Mu^8(tDw0)L$oMb-|(p$$L z3&VB3E0XqC3;($P4O9NywejB6w0_*3&G7n6nBB>}Jl_2GKpe;HzHN;q?2{@I|u0RE8brYQAoA;19-Bc+Y?c7p(NVl0v+% z^WzmH+Oi*BPa%(3YI=_$^!P7V`zGIafqHhovi(gz64PN^IX6m+1Akrj)1a_FIrjtc$f69A9k*D!s3|O7c49p+rC>3T>s)A<4jjwFO=@9LW zG|~ZYeS+%P1qsWXDI^t8%eu!JV_gRAU=!eqSS>CS5BcpF)k+gBo3l zSE{&AMSR?@Bi7G0&@c3Y$=Jz1b=j61&}Fuiwzux`n=gmCepSMIII;$gMewSXd*v#; zr|3Mu>DB(H;G@;F=WuHRX-nG$b+JyZx_xElPs!7VG0yy9&TM9V51R{2t@4n3@`MAy zc|!+O{R9pL5BeFdAlupYE1S=HOdStjE%ASt^CbtPJb3i4P|%4Z;K>Vc1Iy1G`xRT& zNH1&U8>`OHpTp#jWd^j={u2965o@IFZS2S>O*L|jR~NXnLAmApz*Y2en6Lx$nxiT9 zf^coX7mx=$*U$xUY9(@LgIBeVgeh@!l+vC$0w~(7%{@FSV=nhEcHy8s3d1Bk24{%dZ57u(^wAyxb^E;lAd<7mnfaeHDz2 z>D{73@=U`V_7^8+FKhdwaB`U|K8S4F`{atN^LNWiYhYj0*lz&j)0pJuhZM}A z?Bj%cB%VH`q3@WmX$svbpp0ZsJ}#Ni)NPYLPPA3qrN6f?vfog`hJK3b^2%GB96h$U zt)pBMgN1LqtLaQVq<$?=G*lv$2Bj8;+74UmXu#Ru^9>M)vP|N~XLNknZSQ>*URHxA z11}yOb*Fb>uZIWhf)R-K;LuS$9hA)t)SR1(BMNlQAa=n(i~iKVVj^rz<+HW7u6XZ| zb^}^-B0dU!Qjopm4VsY$$tvLxAFRK==fefTjOW%tUZ-d>b>8x1t~S9+CE2JcNAg{p zo~cI51KTu+iv(va*+lxHT_4x}RA9H9(gQ>3Z6z7Olscbc*~GY;d*HsR=lqFnayiC$ z&iL`%*}=Vk(EAf`YL{+X!2Qg^*Y$Atv@0(a6PP{GkWsqg8pJ)=Jc194yb!{{#YOn&>ph~J z{hZ@@^XJcT{6hPUzDx#Qw&+AkMK4vz86fz1lY zcs_Z1-QR4E=Tu+ro#;S1j=%@%ODLF~q1=LR@Xi7jTn=?iZFLURzR=Fq_x%B-Ud@d?8hzK*BVUn6=?`JAY) zNQvz&Vkf9kkn6-w`lTQ!1&E1r9Snk()NDTD)rBtZQ>l3`Uu9jY^J6RHv1BiCvvLD*@OMu237Yt?UY-_d?rh#fv`z<Wd`oBT!R3~5(|3z*W9c_F zG&iE-vS(cZB{L?Yx}5g`V17GJDZFi7r7GK`bvWs^sGKWN>=6YSX-m!zvBp{~`Czih z{Bz*80Y;vOeY@#oC40uI9ZaWV713N+n0;Rhp;_F8hqRSgjeKt*Y?|%NlhLC(vD&NV z+UJ>vQ|@R?awk+3@<(;{)p|2pqLisTCG>8h_2)z!TH-$+L4VK1Wa<8Br%g8H4zc{e z52@aDfvt!w?C0AlKH33XHm^LvRMKs!+?#A`657XOio&k@9Ji-$V{HdW9+0SvB2c47 zfPNA=|0A?u6TfVmcz6wearv?Qu}{kBitJn8n01PL9tU-%u)5nIY4%}hRAa^`h1)p*JWi8vPBntu`z+DBq+TI%Od|E|5vwx#9 z|De>arcbLq`muXB2#SzZCb1jT=4aHdZJPW#IKa_Jt#hW@8pZwHBbF~5ZCM}>IG#pz z)iWE{FJ`0DFhnk$&2=cbpCZUVu5)^}Mu}dGJ(-}$q7%EcKOZ}28RGT^U2l+YNPeYm zA9hho)e2LBD|uh`&4y!#m=U*LH^h%aJV|W;m2B{Q7eIn=!2JC{Rw3-_e+t`&D%d@P zjoh#{5B7Zv%f_-5;ZQh;n^}s%s*BT@hG9KA_ax$%xSJ+;CLJmYL91>39Nq%Bkj;MF zFJUM`%#utZdP^n2Cj%7q-Wu32mk&As(($FM!^@sA2KK0uvyri2w49kaNzx^oi&XGNd!+xM#-e^=G!&g!`V-$`rD{S={-RHx>$sY-DoJTADd zX>OFzdlBR^iKD-VN%Ji@YkaqjDR&-e6}}4aT{kDEqjz^@1iD|q{V|}Ph&t~K*f<@O zPl5k{EZGh46pGGdPce1*qXvJ%hq8hf(wo`6sV-YNEmYs!WSa@fljtRMeu2x7S2VuJ z*45Erq3?0n>c^XZy?;bWy|=8fq3T=#mVTGoP~~=OKYh9angORMY1A0@@i6TqdH?*^ z;8`_vCov5L%|UV-xt6^!NZ5dZe>l*|YUgh#Uo49}Ykqqmgz&ID6b?6|$;xT{6u8XN z8VUaVcC7i0;a07Rj3G-b9(YD0=0YTeJe{DzRFO_W@C=Ef^>etzg6~52816eQb_D2c zGnDK2Yf-{1;%i-x7d+*-tv_mPVZVvJ?ex}R1oY~fK+f2SLD-~CrdMVL*2|JzSc*&= zhocMgefTeV6O&gq1w~)LLOe1&D>5e9j&eWFwH}(+iV%1${k@uf?<15}42bt{a(2oY z=Y-n?dSdhD#-bHMKea5shW6;WlOrwZT-ppef%UFMa4$PJQ`pV;vIYia>@}F?qTH*7 zUA9_S2w3E9Vwb%Jn{sH(Gw}OB>U@}A?m$fut@Th*%ZwBb>BeEuQ3Z4CjF=rNhYffv zm%`3VSPAvdvs~xqjF9h!h%9o5aqb(y-U_=+b+umUoJ$)hdN6rwoynh79G(HEBB;6^ z?iHhH2P#sF>&4c-NZl%}nOj|kpqO#CeTxSNk>3;zs1YBL4a*|wgbC2&wl`zkN0Zd2 zl5xiFnXU=K58@X1j9+bqm-WI*_TWKo;NXsv>|+PGx02YV%)fC=5q5m*&Fk7-a23yn z;_V*<5ohr*IV}1iu--XL?h26$#``awdI=p%%%Kfb(1JCJy}FI`t8S5-r}@br$WX`g zdF2T3>9`LE2n&d3Z7~X%cpO@);o}oJFVnr0`$--6l^eom9guh3gzr@}#sCBUvZ@}3 zQIyss-l(vCI&!aa=Q5}2uxo&p6$iA!Toex!O>EFg%6El-TrM1);!|Y~CW_Uh@Xu5hqn`V?KD3>#Zl}!toWxmq@Xy2XMVR%(9{`R z1ii&E`$pkjzO1p~7A^z!h2-SH(?@VMH+!~=Yn+^-BMmkwQ5fu2$^vfzj#yurki6Br zAQ{_1Xp$kpOYtQ7sSZhY|B+24m{loSl1N5SxWm>UBo+PY80p-a^0*3A7bjz<662jG)6(MW(mDo+gPDbPDP-L#Aa3IU-Iqz6ZYbf?RaH(G*L?id5(--%_!f2TwhvV;G3N+7Pr#+1sN{&!5si^n79&Qywa zBqfa!i>pS0kfIA?vh{yQpRipcfiK7>rWR!EJ%C~gStuGKqfPioacCSFvBGG~gpgb! z^a`V+@pdD467`;wGQs9zDsAcMZu15;{|QT6mLi5Ytz0Txxmu{}D!W*}f)x z6o~0UjH7X=q2U4HHGl3fy!mC4;|4x)yd8+;^XluM3YY3_^PRV_Jf zRC>wpI((e|5|WnoUiJx+fQ@ZDjqndQ+Sf42_z#X~L`(jfcX6|wd`C8-#!DH$_y5bH*HJ`y}l6*$3CZz6?5 zQ2d0>@%Zp?mhA!1M|gy(@n>V8tY3vMSp$X>sB9(Gx>EG0OcG8orMbc&tdP|>&|?7& zaqz?V$}Cs$4(lIg;)R_$MCf`e9c~3yfaFisA{!2wmw5V0nAVm`L}*D!;VQ{b{q48^{3e|0svf=6l0$NgucsWW;Y;!;ND zqnL~G*s5CcrMS(JO^P(gZmIJA)3?-wtS(?VjzZMkZ=`U(Y#-;?Ly2fqTSFy zppne%il}SG@4)~62YT1ml*(uSzh=<7yqz*8EoY}pk)AR@{91>Qt@Kp!Cz(4{>?H=q zEe{p{oiqT41^y4VRfg}zc-%WMiWACEa7y-AWQ>=*furH| zvgbf?*W!pI#Mz<8y?0GV04ED2moA}Lv?obGVaf9cxkn|fb296Kg%@$?Br*=az7`Q? zrOG_z*1$rh!F^7))@+d65O8dhc4~9`8Q*tYh(=$o3S@ScrB#>D?!+un32I;;x8k)-kOey+LLJy z*G=e;&jX39I6R5Z)Ytnj8V=>Y?dk|-yxpeWsg7IsmJ~dVlA)ZZ(Ksqi!u81VXB%6| z=u8qs-VoRCLi0ItqkE3?6@m@Z0Lpv^dUMeQw4p;SsIkYw-EvhmpsTBX9iP*4evN*rvntrMO1y zmoqO|RFLr2zasG7NHDEi8hj&5@$;4-3z<>i%Y}wrH}=!R%IR5nyBqxoENYaaN7~>$ zxR*5hOS(SGo#uax)O!wSaP?Jpm1}Czfe(Luv@%IKhUg;jh$ux&g+A7mOWJp2F6^^< zounsG<|`5;fUK|4QHod-p;10bfl2uyjEtE#R|~Nk35O+Y>z*V3HyV#V{MG(S ziw(Dc&SOlyxF4S=u32P7R|sY@%TS7&Jj(KKD{#@09H#i(+CjB7xB=j6P>&0?%3JM> zStR5ekWD?;>t{Eq*wYGRJ(CTRVA;RPp&w_gK1;*zp#+y{p#HA=bKYOyVxN}i;?pd5EKu|G^Rv8*AaBr;W zsE+s_p*rS*Iaw)5|0>Uwk(ZGj*$9Ue&MS(wF9}7YujflvtxA&cn`k_bINqjG%Wean zSh$zVzsL`=7OEAg?g2SQS#)};#0PzooLg)gXU*+TvnjzyPy z8yq+!QM>C;-Gf74x&P)dh*w%_xMEFf0@|vr?(_Gb`0C^CE1524y`l2O;G*E|O5rtU z7J4Z>un5G%r1u-$11AU}CGwQ@A)Mz`*gk<$g|1$DJZYT*f?i263DvjA9Z;me`9Bz> zKy+Iphh4p0YIczVJ5+(0WDw>fJy=h~5#s(Y{S z6G8AkAUky4yfs}e>Y9;xQiD#Eg^K%cRC$^C-Ou|H@g1*k6o0`AihsWO6^-@@$s%K{ zT7H7MRF2=KeaSo}KpDjiXGZd=itf?ExHou>Fy2h5NDrn&`9AcU5N5C;gl7X|(t2Lk^u+lfr6Nl)DMnIK578TSPEYs+`g>DEm zx~8TPe^GU#I0xifyiA|cTY;xB`>jGEa94MAdEYbsEq>Ac0g7GomJ?a6m!jG01LE}R z?c@+jqFMqg&~u6XjpE*tJ5*cj3JqcW==$q3qT-)we3Ap{3w>R?LeG^GBwTRQEe=GSpXs|@fY2F-^E4%Wh$#9_KT?8T|bGyUx zZW3=EV&nWURSlhb^o66%6cu_MRWv~(Ofeum6fvU4A8|HNrIhcIRW~C3L3oaC2JOoc z$cRLX_WH>!j<+!}vW_wcW;|4yaFRj~+coS*Y6Y5r-U~-?<}ej}W59`^aZ3Mcvax8C zx5@mq%A75^l$X(iAWlbL=hk}SE=(k=x?eLtu3P(r`^ae5Jtk+l%Kxy~=G@8%Ghhw$OwG*Ep!1@H zx_+KZMV2v^d~6DG3SHnzsNCRKj;baUwKZ04Uwu0{MBe00vnkkAV}ut&`i7lXxuQsBa7%zN9PMQvR!8HUkO>itKIQDd zD$E91Id0TQAHzx5Jq8UTfc+54vhxkxm-@{cnUVv^u8qX;wDpQwk(`oTur%1anAz=k z!6^^YG$1cSOmP$2P% zX}4g8Ap+@5QV$@fk~yarUPH;ZP|Y1wITuT_&*IaWcCGU#(ZAKcWmxTl>&-R~*-%6?ae zcQkW!pZk8eqhrQlug(0aLiYezMvq4Z+;ETMJ0CzRzeM(~3C~0_F8O`*5l;@&Az}?J zxFg`Sx*HjM97!g-aNkDGz5gj$sYw!?zW{_=8+mXC@s43OA|6Ji$F@kqUA1kQJb8JVh_4V)N-wu*>c3>Z(Hf$z|H22{}+BsrG~JAH}x9ALGo<4MRs zZ~4Z$_1rFe$%HM`tYsfndv|0eD$U7SxQF}$7={(iC|b@%VCGTbMb_N6VZxh}fjk0N zBPEYQ(jgC^n*7H5m}*Ld+y=ibFOY!Uh3!#{$*Gaw)04>=m$A#6JcNr-;KUNKm`zys zsq!pDYKUZnaYZMbqo=hQS4gfrjbET@osoGKcZiC5_%McVg577nkIVHfYDlU4Xfm22tFL5AyH^c=BE>>t_-ul{NAnW zhifo}PqK{HE+i>n*9NxX>(h)Ux?j&)qA4GCZkm3J<0bB(-sv*JB&Czp7lJql3e@xi zE%M3WLxp`%gmO7tjv6!@yTd_nwvqcB^HN_}9^g5wMM@-d~dFvhZuq+G{=8_us zR{3B8d!*5jv=ZK~V;U?+6qt#edV!4R*JwAy%1KJj*Cem74}#tbx@02+=YQE)<>2YpRprfB`P@2CRZ1!a$6|Gf9$(#)5PBWUG)8?H@I77|DXy#%$1nY9%48MHoRHMw4V7_RE$-tI#`MJUt z?RMa!*|&kQ$-~J$r#S?_fKcN}l9>}6%-C`(^fNHONz=hD6z+v8yx3XNvEoD8CaIN8 za#8cx_B-S%&wVZxP2bWb;eW+Uvb+-Gk_O>a&Kl(|E-Owp`Pw ztDK_gK zAj>(?lcNf%D1TG?0oYOr21C*a8ZUERN74pwL}*uyDF zJdds^BZgL>`l7K)D8Ofw^`km%5u7mOu7uGFI4><$tr47hvhHw(4tcKVeEm}lUPqh_ zWk@q6o^ZWa< zV-!?N0kQ9mHOIolIt+X2Ol`wloUC;jlvxwgU#jDrMe^=Kc7&#o z6JHVf^Jn97Qi5^7;JruNPYDld}&$X$$YB>WPNDM!U-Wj9<(RI%q{h-(4aRHep30qz zHU249;B8ET?lAcfTB)Kp0Bi<&G~PK3tVy)@C#L~bCe_{@+-xP2L>{^PLT;k*vnf}j z?8`#)*PinT!B9;3S{2@g{9~4>!brOM!JggT?GFHqqDP;3oJQz}`An@c_f_vGvUC@+i*r7g%QBKYt7R$aIUy>zz#3A~ zj68jSvM;ZWXF4E4$X!;-SLYRyG`*H=n5Krbc;|K`OovdKPL2L|-o@tG2CondUY zk8E3U(XTh(PC(f(HSu1RfKGz8QJ`22FZ1Z&#Ur@k9*g4Ny9H(^9Sa2};_ zQKb2a(!RnVZ8?p!8^{bi2w_W7>rJ$xXAi`pmyK|rH*$u#4@mWLCq9WIp>QTlF%s=3 zKEzo}@etF{o}T}aywV*kn-T^U3c+MP ztYVy9CixKO&obvgnK-BIp0K9%=Qg@Z+a?>{mlo$F}sHfW38`wW)W7I)6EAdO^CBd%xCiNbTP180`| zF{x7`6xb@)nIqh8d?o|ZCZAM*2&?G3ar~0F-fr%?)nDYEP6{K0b|gpS zCPa+#&P_5ERYQ)lxQ3wd9|$gV9;tvMaota!I*Irvqzar*hL;So(grh0aD2!vSFQet z_dAiE?p()UpP;7N*MZb%D^nt`uuN9W#xb*co?RE^+tra~zNV6(UME@jT#;Mn-RIrh zdkrRO4Y(&`?LBa+w^5D`$uLXR_F2)B=6CgYZeoqQwF?cxzDf2bb4!!7vycadCrDir zXIEOrv%xgCiIhs_kL#i_(v;`X9sQ?Uyp4xjluyXSk{de>W3Ub3_X>W2U6|**WrQil zdw=TJcK<01Wk06WU?LUhsW+F-Qy@E~me})Isnp1xNXo8~dv^BTlHT&xn!Mc=>@awaoV z)5!@hFlAP^M#?cNYg&A0d&^oRANhkRSf~}2LW_;`a}{Z2^5AU(%4sftwhe5gDwpe$2&*$#fFaqNz8cW%J*Y&wz8>2{!;gc2%Lhu{i3n|;m4Sv zfnTe&FEq(dh?Y#E6=yRI&L6a-uh?Zl(X)RHyq?PcVrTr^7aF`du$41Ui>xzq8zXdh zhGOV3If3p|!{_nbUFl4GDGk;|GR<_A+VN`cbOk!BvfpamLva5#yR_mMNYQpn1nTMU zIgH$-@YZRlZ?ACfBkNCR2PBkMc}zm;0PLF#z>_O=K;E!Ot4pg%cc&(?9xZY6>yc;F zmDC$e|K!;>(%9c^R;yCDlKClTeAaVtZLIs6%(V;{FW-U#l=L$ zY6JK1W~Qbx1MG8<_L_Z9hW@`FW%%yW_bBwyaDSwTi(4*Bj<#H9hA)Yo$7--=;iD@k z9yPSkq^K-)SiXYafNAh9;ci28Q#DrhyvXYdjo%e~Y7nQ66Lsh_VTvD(CAWB?n84aa zv{Xs|aS93C-Y{K5Q}Jxyxu>PwvZSd&JSi8twsPr_$nO?oXj{MbpQYjuoJ*o*q1dg) zw`hn-K9_ZBIj`26*8Q>ap74t6ES55F9M)lLwxR0A*DyV@sz)@suK#~beQ8`&WgGW7 zFaxt*3^y}3aKHoSzzod5j4;5kDCnSrf`Wj8E9w9Pf-K6WxTL7KhPj)$Br4^;Tbi0- zk(rvBOIfK=S^2o7rsb2`d(HE{AKowg`e4e;xzBxF*Z=x2KJ9PAq!3AH3BBaM@fi|j z)+-?>*k<>{tqJybpK^FZ-cf=~4SoIpmu(5}8Tnf>chX`BMsk1`ftLg)^C7x4f3J$~ z@QMDU6taL%k`5sgLo@y((Yg)K<6^i19|<18%@HlPf)lJ*wc_IAAe_7^W=5t|duZI6 z1B?s_!~DoebZQVu)+3tk9R#+RiWq*MSf7TVRCflBk$`Zm?#t&jB@X(-B~2UUpT?)*d$!Tb(E@# zYilP;`y##+hE<@vrt7-%8fywhs2G{J74^_4hmdH@3S|4+PeFsPG~L~tIxFl`V4PY^ zBBlo#!(U0#3ffO|XIR~9Y3C=Tx5{(@xIL6qDq5@3w@S%WUw)jNelIt2@FRsyN;=NZ z_q6;kdP+fm32LsvNU<$C$oGfyn0#HQ|C;-*H-yNs>-{K}-ihXPke=&}K}9WlS}rj$ zS;Zc$pG#~>Olr%-n|RR#Bp!WyXI)+Ey#aw_$!_&V*W z#Bxh5c;KbmNGF7)ZpAOryhVSLEb=2C%G#{xs0Nc7t*^?mNV+4-%wB2_w^3Oe%}l+kd9g2-bZcA6N2CgGhmyoxv?`B8FpUvZb; zjWwi;w*GW?SDMb-&{u^m=bO+k7FI?2=4IX2>g`-Hk^XA?fVE!qCAodb-_Z{)-+5n} zPVF*j1@dXR+u_+~)2ltWExz69_9h5WMpCeK@p?ABa~(`kXXcBG0^z zeDOJ)X;cDwcG&}=0!g&SXceMg(PV_SWq0gHjST5Qfz1-uLrUXeV#q?+l9RwJz z-MQNE8Sfa(RB{W#RLJ=#h0{v&4_#$Ugbgq525x333NRae+=8?sfGcU;E2IeqP75EU zn+BnODjX9DpO*5SmpDR2F7!Q+(bXrXjyG;5wg6<`l1Q`AkC~)z&?mv)QN+6^WUEP0 zDEl4tm&K;1*LdXg?uDzCDe3$;Ju@^`OWPFAwK7D@NRk|n9!P z)_^<;#jh9sHsf*MsArmm$IeuETcth+9g)&lHURBCSUo{UvH}h3&wUN>cLbvJ-B&ZG zmUVc-`yrjyMMJSQ3MG*-v8*^fkh*~WoQ8>fFcgH@P#B_q07vCVOu|arKN!u>51$qE z(h*Ss7tOQ~*|GBLWA~w093%hm$JKO+)t2=@iDL*>$9R|)7Z8t(pCU`%ink@{`#8yz zTJtoj?t6A~aD7T>ZWXpmLM|c$b;iGha$KA=kP+db^(D^YVtnEjTO>m++7Otf|M5 zTM*t;P|%-t`(Ot$B{ox`vFg8C+oU^e8X5TzX_>Goy!{z!p|kP;zq;Z7`|5tz$>L*d z_E9jRg8Uw5S>xNe*ml9IeUz}VZjvXg34{e|A<{WG>nkrwdUNr5ua+kKs6C9J zwym2yXN?yM2s75%D@EH~&l4gd?rCoP3V@Gs_;m9<-fGB$|Q(+ir zMEWxKD$c5pg5j!Ge*<0|S5@s>{%5NCcS2gaeB>kPWJ8{uZNPm8XfjkhRk<^{p*qAm#Sh0i zL$a@PBx>QE!`n zcCX=T>!L-JXWaFN%c<=2qR1N_hHDU?uWo?dp>E^T9^r<82)5QW zx`-*M^ReZcH|$oCcft)1FosRW?iQZ#p9ClTH}+>!k{+Ie?W4g*gmNr5l?yMiaWmvnYbC8$p^{AsS#9%+7UZ$=;&!# zR~@yda=9|Thy21fGK@b$8*KcxZZwifDmZC^alE4n)^Luo&byX>{KR1@ckAqG(qA(( zXc@5M!9oJtwPI zB=4(HAw1oF5WHo~Kjw=Ge?eVun5*L7^|73lQm=Tj!-o`r;d_~QK7*bMbW-*c+dPky zmB9}dKRd%jKaNHRjWVdy8Ok-ryOsG8HeTqECUu8!m7x&luW@0pii^qX+#ly=|mT9$m(Qs^Z`a!}oaRcO!JqA0&-3QavSsA?f-upR@{iObJ0 zFNAHfb$VNu0@;c82=`p!W{9{-8@XSDQ4i%LJB-o*OpC}I#3!5DZEcGnCb@GxQ%Z8w z+|`~iCmL6WxCwa~C#y$D-bD4&)d}2J392erSwp8zxWzk+TI3ucWu+WH2{#XcCU|P&pGjSmOp)M2OKxhjhA<)@KZ^Uq7Ac|ACZT{x|oXU*9OfOu| zh*#sBBN7P*3DCE5f)n?q!EZpPk*ETs1NEoQvx(h7O#r;*e(?UBpTT1^fM z40jBcKvBP);~g9 zHhSQCEGyXu?|;m*L23BPcxE&VqEr#8LSjW3gsBjrNcq^(=A~MxAD|t)=wnj z0x3rw>sG06v8z(P9FlM_m2mb9_Ec9dNni>9J6VLD(JIWBseucL=y24n{-2mTt0k}E7WzLUO`#rEh{82ZXbDo6 zNu(eDks;+HPaIBZfSDO;O3AJGxyK?{Tj1P+4dT^cIG4)Q+S=4NP|O~|d%Pd30vCi=)N{$sg)5xaE$Qfayp?Mq^^+QJuAFqPTJU_i%ysh@r( zzA1U%wag&b!`d$y{b4^x5WW3hiU)UGX4OliFQmV6i80R3>KOQs58Tx-Q%HL-Sr&s6 zectGbJAo#g=q5y)JER>%qNlI5WkKG;6tqe=to79*%@!d)T1f>*%6QM}LUdMZqU<53 z*0i=4{36TfCqbY5)46=9Njm14fc8Umb=~9}>hfWG&>R)?O+e071!ROs z%Ie6xp3pC2tjW9ky55gpC{KvsqXk+dhZE||Bes`HSe!zGv)cZP0W2H{fDqhkyYc71wGxT{(vv@oR@&CvAPi=2{a|bE}rx7OJC->uEM>C z!jx6>KI6qb6Y+Mcr*Fu)e`QG7<%KfKd2AC_X@iHr5}a zNT&^s1d#EZEz;Xw&^FFsOO>yEri3LR?vSyu{JZfaM@C-e(L9c9PU9~3p1Jhyo7Pzb ztqi*Jpe`&=k+##1)GJkc5I#114gv@1eq47-#boxa=HAZHkX;1F)NHiwQ>!nM6|A|I zwq!E52VZ9Zg94ju2oHsu26|R&@YET@IsBs=Mpn8@d__4~%W<6;s#ns!9^y1ibNb^* z`Bpbash_qxGpB7hKReho)XaVkN`rin>1QAIxYfqmcUk(zh`BnrZ-(v=do(-5vQ%x+ zvP^Y$d;4XQ7y_5&6*~QVi05nf_OO=Cr?~H+P zmXpQD#X(3cSrcViYha9qIZ8B2mPc`)_uesN$0^J-^JeXzr+gZ2*+9tMFtA`|ueFbd z=~sUZZdMW4uHlVq;Fa1^9ffi*KO0Rmt1z;0BzMnOl2dE-_XN9<{u|R$WZ_w^R|Iai zn`_9$B)Sqz)f$zn4A*#T1Mwc`e#7$W+qW}B=qTE3e4}LpS~l`S`XcPUuK>i+-P<@% zi!_N#(^_I=5+u2$N8vRo&h^i%Hdg7UkntKA7+|;m%|6Bt31q9; zhos12yX&$16T`RKoSS{@Mr|?@+H7&A+hYP=qS^s#pIDwHUBU09mUUHz zRS&zG7>LecdWsoJZkk+rV5X6sXFV&uQ6m1O!vkG;(^HaO)sCVrr(P*Dr#Hf%8uqX@ zqqeRL@1wJND$kJMv-Fl@$MruWfo@+k9<2-_uSD{5|JAwJNMpH})SFH#5^mdVrcHkK zq07HA{MfU#)B2&W^bg}N(zWDAWtYp=5W3?F2#p})iUfbQq`ITxH5rRTHH=mSV|Q4M zE8-F;7$8G+2WCt5OL8aJz&efTNW6&(>=0Vx&-Sq`@NyT?nkwNQLlJIBEQl`-zy;_lnH0d5A@YA zC7ipIm=>k749Zw-WETrg^M2G@S7bU@2;-n-fO8{a;c0?v%}npiI=H52_k@2#$pEWx zpG`xhehEg|pUz<`GI$oW3c5intY#O9Ul6*woOK{7Gij1=g^tms`>E4AF_Q<&GZUB7 zR!%q>QZ_Igo;#+Z9}7|xCV3#i-^p3A4QND^;-~wbi9UAGwH3cQ ziF0$zBB%0H30td?xY!{H@Wp zF)UMTTR$F?D{9KZ&qjFlP>KlZhxNm>`9L9uvR$@M3WGVHExBQ(gpwWLSU z4jE=-?mK(R9-FdCQq+dCTt=)1evn2Upm)wGrQxt#)r9wFaZ(Bv#zleL1S8CFTFO1? z_Mvz&-W=+94r^r^RBAXU!XHX*|0wo1a16pSu{en~#<0&*JH*UzoZ--J?(ir_FGG}F z$XZjuQ9<5vo5%UE5Np?FNONFoFxp@gV zUYM0FHSfAMr$ne``oUR?fv;YY%Og2La=|PQJwh# zrRHLk;!Ql;kZHtzVbv(;^k;|T_W)Ch#m^?X{2iyrvphtPN*bX<2cM6GMm^@sw+AEE zj1L1o;MuJiqrI^e3=hIS4iykJ?$y&|c@Zr0A+^O)t+-Xi3fLJYjFSH322>1bh?=Hz zW{q@9%M4S%=;|YoQPhz}#w)34!H!7GKm_sMV0IjmkPr67xRvw(%lGoLCm~qFJt{JP z!Fv?pDNX4s6}+xxrFBHL^^qPVUIH@#E)=Af$R)8!StpR}mk95;7?Q2h9U-oXwO_|?VmIy^Fo{MB1zIg?EifDxgA`+<$xglSmpNIw$kLnD>jk$5 zFgM$V{%+2Cc_jCRUA`6_H>N;|8h1f;-PAG1?PETnwUc#b?vj3hQ;!o|S@0goddT7t zKri-WQ1rncVgk}`B(cd^59;vrp0VPO9VPg~q5j_w{HnUo@i&Yr_wHSK88)Yrg+U$5 zNR^ztjj|FDbIHE!jjJpJJ>^GI(j+*Lz>Fdq*Izh_4smt*hn>f;7<@feXk7EaqdAz{ zrRAGw0Is?koD*Gifl6;D1qL|li^u+p@%GvDC&4sIMq_yVdz|mXJqLU;v7m)59*J4W z;uLqo&*aEWzhPvS!tDki;ga%b{dAOXRJ*FsUG2dnbeNkq zmPaFi@BCXRY^!m`5ZEL6O*M0 zWfHqrNFK9>R5i@ikYVvwPYy_eAO_CRH}en1*r!^?j(F#y^w>Ej+I1f{x?MuBu%ja& zeVX055%#0uz~n~0J%~&S5QjD+lztT0G2+DD0J!u1U5pJZFxf z;c9!zwQlK}j!+Pl)=!JM|0?emq#t80OoR7iFiT|^hrqj7>eA2+x>{+*J+iHgsfH{>Z9uJgT?M^TH;VbQLH3);a!8Mezbm z5O!Q-nypV+_Rh1tP(o1_TLI;f+;X4H#j(kF9}EZk+{bUGgt2#XoIA)0xp7B-23O}LhN90YMDlqkFkBt5g~Yn8qOdIOo}58G6@ z@2+B3TFnW@A;SG*zBucPO`#n`j0_=6f~A^0CS#YPzJW$2F!dcT`JrL-Zy8%k?Fup~ znWzI>W5_0p7~+SJot0Czq^j#OCQ9+vyW^cNljB?(`#=wDVa`hFicU}G=U`V({#-M_ zRZ~&X5hOp)eH(49OG9og8P=B!G-)y9Z6Zz+)35<9$1dN;&uv~_J(XMl^mKAAwckbY z2B}G)9S)f9&?mJlf)avQN(rP7w%k?-%|Zga)FOznw*W;<+c5uv-lxLU@S!MvbJiem zG@$*FEVOYFRF0A%QymT}aSXr{*P>ue!W;ZVw{g;=X1j&R6c5&Lu4%XxbZ$f2t9KLz zKg8xtcdOc{KF0D!zQv%%#eNx7jl(U%yN$NJ0pe zIlM>K(7t%LJsphc)lf~DAWo}J>A{kG%9PPJWlm1qfg;YbHg77@IhhqI{F}E|dIJvY+3#A;vqNM}=mtB;L4^|5!s!OY z+VuXDrHV-u0ocJ<0bCUzlkHas^Kr549+&po?ek4EM)r_ z=IRVf!m{Fgvi5~$hVVa4)iv7#@wgF9PKXC>lTF@*0O&Q-Y#s-o>;CYalKWO^YxHna zP+WD~I4zwB_!yok?ye<_&P~V%Ce!|RTPppHq95?VX;ADVX?EQ?+C2!&MjV#VJ@mDn z%nN}(Z8DTB!QoW(oW^m+HNL-Dc6*A8jcha$l@L`|GG*4UStwUiV!;umnS@V9GiCO- zMc0G{4x6N53ayyXIi2TbvF+AGDe9yOiqYv{eJpltn}ZE+$n0kDvJ%GkfR2mR!G>P! zVXU?vhPNbtN&; z377BwWSit6-UT5 zFRq^}CI{K>wczV;Yakx%-#Dhu6f%%&7^9a3{%9Q%0fj0^ZKgwceI_Z8%jyt5v8BTr zIh`uHRX7cOE_|?jVIGrqMR_(@cozIV_Lc)sSGr?=^CRJ`~+=3D| z$Tr?nSdYKQju>_ty8wz3AYvHRDD)NZOx|6?)V`W2%^`sb!_7dxD9GAVD(p>n3_ea z*|+QtNpk~NHtIoDdZ{N&motYryV^EDN>jpw9DT*KPbKiK2D#lw6?a0B+EO>Awqie> z=En|r@q#V|X?vFwu9~GTi0zMhg(@@a;D3~Hs}RQ~5?6KgacG=MS2o%nVl2HLdU9<2 zs{v_Gz3CM>an9i}B7>X5ZdBKDVe^U6$uy+RTi|r?!{rc>L26uWZRAQ#OO;OSd`<&v z>CK_8D$^HD+)lLy%a5~JZhXB@GCWLzw~$O%KLJw>t{e#Io+Lvy6TLhHk7T9V@xT>fmfOxw z#Aj&wOXX^7_dtAp)C}&$WpSI^1G|>Pgx)IoR6|P@EUO_#>gC6>F!JK1LKTmMBlvO%OzsWOop=v8^o$2*QZxPFKPBu}D0mmhpt!DQ)_0Ox z?vpY(tPi5M?PR<^D1-jOpPi_0veqi|`jh#2ObPW2$)FxtUGeyt&uVeH@lwAsV zxn|L(@XVjsP0kh)CU0p&V2wLG#CN`=9)slti>$o48or5Q z%0jb=cCn_;66$c$l-c~A(fp1=2*#}UnvHx)1#3CkQ{Tflx$`3#Zg+$+!rJQWv)3;q zxvsiy!+WzxR2jTIQm6oJ1zj73t#9(rj{QcRXv>FR{m5W{u6bai(J;&($KifH)!rCO zf|o&C589t=f6Z+)w=5IceXXn;$by;!1Q3QevqW987nOEzOk&QyoW`dTOL8S^L#)6 z=m*9wI#Ok43)g$MpCkSK7Oh0>WNiti;Q6$W+y?B+7f0dAQhwzcCfeOtk;MA15KIq6@1u~uPab}Hv%VVr6g z`zd23KB3qOoyt>x#gwx76;z(Nd<-z5hWA53H&aquk7PscsGkg-fCwAdwTJy${;m*U z__R0M<|YWEBJy{$^Iu&2h9(R#jXMSEE_)N`|>8{EP$)EsO z@3Y!q>8a4*nN5f$>VmOBUip0#48tYMI{azynvG9vzsTL+zS~|YP<7)4$K-3mTlX8r-=ec%VRZ~zZFi&ho2CG>{@hQQ&V zm60MncV#B=Rp^oI>0Y?aXiTJ3i>2}FVJ_X-q048soF~zvCf~q{x89hQq}vi9)1Jk` zQs{(X`8a&j=SpS>yyw^9!LH-C44hmdKLF2Uu{)UP3UB(mA1&!eii4mL_5E71EBNwG z=+ZjTZ-gJA3!KqD*mN87>rA)e+{!9Y|qR{*cGCw47HK&oXRH-51E6aF6``32Y) zXlk&-*A!>YA6M(N`mIm5fw82E$`2jV3{qJf)V&zAd**4Kn8u`*E?K zAB8}DCg0mk_w`^ViLqlVo*7>BK-}_vc!tUg4d0#=yBn7z1Jlj@DJOGv?L({wBtp-Q z_beZ?I7a_&PLqDce?t;D$A0}FTx2IM0Bt?#-3PjOwm;-Iz$Xgu8w^<{aoSW>sk6bk zr%js9$%Axb^jYdRq!T&{5}x3cx+or5Z$#-Gwh3IH^b0yIzF&tJG&1j zsH+iTi66P|!~Vssmt7bJ9ZKIrEt8J z<+z?Q{l83^cp+FUkR|+>_QV&;*SJR@OrvNw-*K+64z9ERikUw2X}tQQf(@!BoJ28S znJCj!NVM(?9Cy;8F(Tnz{Yv98K>km;`?@yHL&I14s3%nlNLy)^(md|Y|V=7GJ15D2bNlyt&`LFvLdIjp9R<9?e zS(pu1mv1pllt zWd`3#E{qFytja5Ks+{-44O(Uzou`8D=5p!5Yzr5m1dmzlz0SMB67p@o)p6oho#mXT zw1z!}id9pV76qDRwG~y}x`KhyXx$RVLZjy$(bBlpv@uM$PL00FTacTqTMwP%iNPxL zP0I;y=>of?bBy0O)kTYAOPTt!F9ScSR*^^_rVcwX zv44s1NSwrx^)fO8?3Xa4V0>>_YlWOQOjiPvR|_{E&leta?zUPy-M0&R)E=%(s1*9A zisp;>zN)6+kYYB*z-yT!3Z@3YUtu^-?ClTr5!Gqw8%U#%tjMyk?Oj7k5c_L^Oxj}X z2X74F{0Cz2A9qLW2sS5SitTH~>P%;cWu8pYY|G6WT z6pS7jmhcuAhHljGn&Z|-mesL2EfOaBLKNczP5lF$)ul*C9R{-_oLik`O#NM#D~%3( zmtbf7(o7C0Wa+iVhP&ls77P2sSN@^C5-n z*)z1bkAANtvxc7fgWbg%_;@^XhlZju+X}kKnz|Q-gq6EhDE@h237^0Giakmw8#u)1&4xP^F7g!Wmb z`JZGHsS%w#6b`Y>34kbIYV181-IW&L`)BY4RWSH$hSdiB9Z^4*Z5G#6>i;3J32CeS zZ7bw#g{H3BZFhCnjWKV|fj|9{_j8Tf$C=h_CB5Zqcu!`Dmzp%$Ou2X^K!1we0mBA# zT*R@?wH(=PP+b8hGoUI!i{e^jNW-zTfY3=uAw$6Qj}+WS-z>!NKV7;41FRFXE_g9X zBuc@&Ykq*V{$imUqH?L<^4J0J+c>o880*7X6bW0n8lUPPu-=4j%%nf`ghL^XAr;@_ z(y#>Xqt^-a^l$kXgHOqpYWAb{PhgmgH?M+*5KHa`-glC5Hf;7GiE@0#ZW@O>8Cr-T z!)*E$jEnsSE(MvwG}dSSLUqfk%*eKAY$kD{%%a%1y9QfZ3FgA_oIm=NP!znyagZE@ zak*rM^3MAvLEd;IXDgev->+gB^R;1m40!2Ge!bw_(3UF@u`+dm)hd-Wp>NLKw68o{ zu+uk03veVIuGaIb0uv?`ZGopPxDJK6GE^&FNzVS4{oA=h`UgAGEY-Kdj0n`aTl2Vn zfpnWL6H-=s8ioYY&4ZYF@p@TuFB+NwC*65TXZy8adWE2%y$iBdv(n`#6VJ74Fl=a2 zEj?=Mo?t*k>LFJA0XSf!T@tYCoCGsExM~qJqnck&o^1XZh7IJ_li2Q*ZE7Y7vt*3d zRU7dRwd_ENN$}kYdM{??VCiXLpxcK$cO%g%?#kI$1UdD)Ml8C4wl^>M#y1>N+ii)| z(isg~e0B`3{yCxM0WKZ6A!6r}?ld}K0e+qP7LglD8exT37}b(3_(=Clof#|3E^HCr zHgsylT|GLEI>+l;QMMG^gZ;xA$ih~R`UnEj6(Myin0J6rC{2Hhb>U!T4DVi=&Pm6r zyxopLxA$f;ZFc{t)#A=_L`s5>M6a4ylO+;{A_PBNzTvc z&qVfkPMq@#FL2f(om`se9sd1Y+I$?Bgb~xK3;b3N>1-wlk2Y|L(ygnAIUw1DUHdLAed6AF_ zlE#uwJw&IWlY*;6d}F+Ax@Xq+GE@#ZGw{dlY56zU$+J+D6dNb}%sd(OGh3G@MNvm6 zpO{6j`;*T#XsLxXsCw{L(>p<2g3qy3jJJNol=1mH=@+_cwQUAx?3-P}e@De!F(J*h zSA1(|jDf(fzsMjrq;k_*dJP9uzIf^#C-5&=!<-2wy9 zcB`s^98|HQm~ZQBuI`P{zO#&8N`*p;)GQ6vI792Jo&54%@JU|?Sckq~XgNe;wE=i9 zV2Jl5aze#ttqSa-wX@hdra?R~8VN?|enR~A!qqXLPL)(y#5Y?pV3xfEJy7ox{i1_^ zF90c{t5-4R%mD_c3peCT(450bM{Nn5OC9!1Jh$B98XUhZ2l^rR>S_u_($us*2vtm^ zJyd!J0j2#6I|U1)rPS_m>KhUn8~Mzo-JZC8!hY~&GY$j>5#gf zcv1vTO{-OA)ZswSOc~l|wx6HB(gXQK?`?%A@x-adVB>-yat;TU8uQbZku9%~hjZYc z1G>f?+~+3RbCY$iXL6lkUxR&G<`%YyJxz-cRx7hcDqz2oonsA3047au)}o-mIWe01 zwvTW;url@_e62)|tZuOH{6(SaC9q+PcxV^*A0PG?Lr`C$kK@P4#Um-)iDEViN+b6q zkw4_>Xv5br>^-P#<@y>}AB@h16~o}X5}~ekqzt<%mKZL{F;nx6Y4QWM%`ALVXxg|p z<(7KSLsc0*9(zC7i1{%gq%#&YNp$Ay9Z%V}ELl?WsUI;AVGTW_Vg{3Ki!%<$a<;96 zpuTwj_$5L}Uri#acM{>h5zLhfH`8A*;>vQm1k=$Q$TSVl49Ka+vu4Z|Ua%)@0W7j4 z_7`BhGWciJNc!bE;! zkhGTpOn2AgMppMBeMgu5Lz-M=s1WUQ9owFr!&TuUn^T!N8X86D9Zi1G<3aE}iK0&= zg}UHNUHV#uyN3N}lqA_;-B?HrNJ&!Ba;3$Y209sz9`jbPPsjkRn+v6#ZmWobmtpn> z_W0`Y>D#&NAK+~T`ntnV>2PV2{e<}KK>orK+NR^u=aX;fjeb&_Vcq~_Hr?=&7FtTY z#N#>q^&qHHxe&;#d$0noDZ3P;!9<4jgm-|w^gy7Uk*sgaOJTNsrL-#LQ%_r1*~P37J{h%PE__m$<-(@(I@rTG(fL0V7dUiIpfexBgL@o!@uUTDWOh+oE( z^9yI9dlv4vHcX}KLY*DryIS_@jxol5ixjQwO+AZP+vBUeg0E}M+wghIF% zZRzK0kA^c^dQhHnKw=*$_RupWFtQ)*vEW&fP**gR_}R#eks?CZ->7By>$FF+Ic#j~ zVfOtz1^GtCnJh>tt%g7aCK4C>8lnzoOUNcUD*Q>xG1qoxg6T#|`=_?k@AJRPbaTY< ztpUs*h4r|vCCHnsk_pR&DH-4a(LL#GS<@-GkepND zwWI#pQo9pN(;_hZ62XrMbSv1;sL90P^c{g6D%j`=Ofgo7KP_yzg-fICcP(=z!dnm* zXJ{&;WP;1p2vsKAHK&v#7*Mv> zkDiPca>##EFsihmTz5I)d+aMnUDmfOUjFGlGhzbC2Xbb)^*qb_`@n%d6nwG03C>3g z0!s)Bg_VZ1ZR|&44}aP@n={Pn%z@928+{_{LjPaLXL)q%I_ML__D1^FvmUl(Uc!o^ zzxgVoFbBtt3xBtMEIiOHg`0lJbU3^X8{MNC@<9@&ZheeNOkDjc%heFJH@jjvH}fHR zr&L%bnNSPEiecnI-g{n(PJ^tb#~PELI%BeD{t%_R@J=|A%OjQLkQ3%)GsWW4ptNzG za5#Z1aWJmO_rNc1$9*)VDyLftpi@mR4`;3XQEa7d?AN=9eKy<+qBH!no>h{~!{sAk z-57MR=8neb)11S&i8~;T(xN3?A+?WXSMcLUh|7`*g?t9-_%3+16}`NZ$6U_S&S#yw_c+3q+th%XC~I933`$%gGxPY$+M5g3w>N2N%S!pec_2O zQOIqI-PCzH zb|AbOs4^pGoxHu8)fx8caZe4m*WzoFHj}(-V5bn{Kw(hcufi61*u$RTybd%4-1kX=a+7}*SRGzsebL`MkyNUncK%xY31 z=T{Ho^-5t9_jEZFFU0$(Z7kEMp58GLKk6!7Fm9#M(|01ixGTCpbnJ$FjWsM8A*8gG z$jTYHko&;jd>aCztP3TuKZM+xtB)5}gQk{LOaQK$_2awp}O<#{?W^teU7zN`d{1P+)~O8lo)XG7bOvcr_E3dG$>iST+d6xg;2@IqBm$hufGM?AWo{pZOESLk zy|h8fG}|1TYXI@wC07Jf5De1l4vk}sijAW+vf*X z&&Zrb7ppQ(M?lX&@K`K5qU9A%lXYuk%Vm7!Qg^wB^N4JC%OQ!5FnkEYPN5XXi^iF@ z)zE$2@=7i5pwm(_W=fGd$u5?}C1zdj%h)m(+gHJ{D2XirRABmgB>V;>HUwtww@qxJ zb%(7lr;1U-d0heQvI>RhAzf;kp)lN$Wt=WyACqO{K$!;#1B~a*nb3Q(cql{+v@lJ! zi$}VjxM#;a1s6XA{g{gWt+uOc*RGS=rAB6i&m_LMk5=wThN$jqT0Ih!ST$35uF479dN*tG}Nb@ypMO8@%MYV|XOc4$-3%eA_m;`kj6 zhsUcXRWvx^`xrJ$Rqm{dxoJ!`Z#LLd(#dz)O7LxQiWxM4sZc5+7S-C`&;LY{$ZT03S55PW- zn~5W>i4*eDYds8?!XP*tR5GMY+|8olqFW&4Z+&+|PLhWTmk)6OLGEY#G>oxXzV&k7 zpcky&ss|3}?I+BT-bR8~%l+_1Je3%9k6k`lko7<6!=+XRLkMI<*F++M3~_oKQqHG3P1oH}|zT9x)wgRf7ncEFtR-wOjG56IQ zS#g+7oRIZHm?SP4JmxSrxgP3-B+%v}m++{O9u8*PV1>-^rtDfb6Y(Gs0cht=C_D>$ z{LFDqtZSmi$#%GDPPjMh&V*6QbvIC>>@0*|2>jL4`3HF+hfNCj8xQ3|7;psLJWEJl zADpKe>pGsmp}n@>kDy7ZsMQ}7qb0m_Q;G5S%DX_R?h6m^wFCUV6$k5H(rT-RiVx) z_*bl8>a)68q~zwTP!k3@;(K0`WI6dsZTTaL+bnmEAZrz{*XjOO(A>uDQQQ6+h03i; zc$Ewif@Gn3dT=={3xkzGaI6m#fi|J;kZ@HrT#ScB`RwWTKQB+Rdypea=Xqjs+67eh zrDmD>eJrn|6LYbyTvc$XO8N(3ZKyMD4?sO|3Sbi}DwQCKhq=`xK2q!oY8ANc^uTkz zRSlo}RiB0=ojww@mFj!MngMGF24}s&|3^(aR#_D`=xizsEC@ zSRty7veM?miWKV-#-{OyvX60DQi{^%#YRc9llyZNDAgjP=3O)BpGuN^uyMUGw=nWF zjN6YGiX@Q#VQ9NIQc)V16+CUheiCYZ%zFglJdcn==Bt@+ypiE87mK3Giq}$I{Ce$X@imG@K@OGaXn8 zf1VR%pE`RxJz(@SdRQi_tZfD~5H3TuWzwD<{IFgaw)k8wX!xfhR2t!~-8qz8_IJh` z=21bSo-NLerfohDE9b}cZ?A_YBYD@?b+U1a;ZvQd|0uT5FrY`qJsA_5li$e1k}xGR zV~?Kc*MhF3W!Wb>J;2vrK7;-pU`-Ba`xc`5Nh->?B`W%=iaacXzx9>_0(s#_8Yg5v z5p=kEuOshoXRS7!S$wFf)U9@#*-obU;AE4l75+x0uu075f zq*OYey$<_iuv#H*3Tib-bCb8UpIr1a`-)98Eb}+Kg-1$YzvIfrp&1=lhk3{f_N8!u zHg94Fayu5Xk6kOtumPEEhH|qlPpA7?Zi8{tU6Ko4ro$8(0$3NjEW4Afpo@DOP+u6U zLx>eV9fxKaTh(rybt`3ZvS+t`fNk)tGb6{Ye%5(|D2uqa5m{?{mfZszCc{Sq;9nX0 zKE|Rg+lc!j*g<8kDbCFPlG;g~ZRCd$$zLLPIR|;{gg2+mKA3PWxr6=3)G(IxAS8Yy zj4KNK*cr@@M#k{%mhUrshXq=6_t~*_-Q$TV8$6S1Y~9`vsY$uNPkg4aVQ5;>$#ryl zxILQ_yIA`9SV*AHKXgt=VS;!ga zL0)c#jgk1-9tGf5%CrMdL`o8K8Tnfhtg2&=AVJ`|7?(kuN`qc-gz0x;uoj4M z?((tAO@-Vhhd1_u<%BicAHr2F9(#^RCy>w5+L5RcmOa?MR6P#r^>DMH`#o+?H0&_r z(rHXD?5*d|b(RSM$%nc+s~blSmH(Jt;K4pfiS^)csT=Lz`IGuY-Z?q4nZ4vjX$ zB-dET-42EQ@WSf~6z^3E47W{ASNLntqSj@$G+ol*Q0At}8#!P#j8Y$YxGtSd;_~E<7nYw&^*)xxa`C0#oxbE3 z|MW?o>Z43V^8|FVtDOpu5=m$I$f3UfqK(dNxvgB1MLhBvpefv42;{7usb+nsckYoF zC^_VQ_>3He?$4wZ8~ebGaToxFsE*NP1 zfLr9xZw<6q-#GGx^Izw3ZgZ#u7i@Pn>OXC~+Ggp@lD}CrzU4K2Zvfasxpxm?#vM&0 zPObGmLuSN^!`j)Q2764#Sx=BmFFfmc=MN_1!5=Aic`~|*ZCZ4l|Egrv1yAZwWTEF~ z1)uVr5$v}!=EX1iBl`pA>pdD)f zx5VzJQIp~KV7MZeWmMD|Zu&@uO#tILs>Z81G?KVTd$vIxgf43J4MrpeD43y8&WYc@ zxwse8G0-=S84OS6?b%*48AEUk%MUWfil^)cj6>cm$!s83<}#C{zghIThIRd5!#eAO zAi)B^DJ_Rscxr%6QP4|6&&-1o8I>Hjbx8OhhLBf-j9L1T=9|J9p&s6efcuIpIIluu z%Q$EZaQoWBWWvN{Q8me)tqYeJi`YXrR4TV)J-B9s_{wZQayo>LIpr8FU2-}+MW%2R1&dB{u?P0dOx%dG4m-r23Gm6es9 z{Jt)`zu(92@%a65qqpV`*L8h9pZDSQemyfPX2wydFTJ#l-W)9Eea5WGj?*^Bi2YlB zQ?HKMhE}380SW89Bf~S5r>OsUy4o zyx1D;=_sx|du4)`3)jPM_|Gitj1zQ}dC-~Wd!nMATT&PONd+51+Zv7Zt!0pi8ahtE zyY04Ofv=`!3v0NOc#Zh#a&Oootbb29DZtX)(Qg=f98cU#kK9TJ*0VJ;g>XiBj1~vc zq!}}!`WNR@GluB-$2`Bq;}5MR3Iz#V=zLj3T#GF!0z@)WLR-fWg;5xO4>KE82_?>*?z! zEjLH$P^#zD1mT#T>k?c86-mZsCC!NQxl z!t5M&q1U+>4htBp6yF?DT(WChX)`;K>-9Zu+oUV`i!bXh9PKMyRoNE5!#zW_Whjg# z>@!EKBQehe%bl>8>!g!Y>Ee@oX^s!Tvd(tv1en*d1>fp3Z9i$1Ifx9{Xf@U7*=DUc zV3p*T8#Bu11BDue$7Wni181_fT5@KQzlPSngsAe9Bz|Po5vA>e4VJT7{WG+3_)$~z zHgUzb-rLVb@1!k#`LFR`ZJAB!0f>`ruiV7LI`2$ySY_1lSuri#6?jTPqm3&c6bJoR zI5dQ%q*zvVi&?3xMxcjFgDJvA;yN}(m`C=_n{A;3Zmz!Q+Gxt2!OBbJ0iyK=I&P#x zZc&#KoZehfxg#`M1yYn)Y@!RrY{WFj((dwm*uq?P|Bc(fgS<-IsGt0*__8jTqu)V+ z7VG}>aN?b-BjKE0A*g0CtjA(#y`ufVD} z&c+w(tm9E`S^BKiItl=|7T~hz-Py3Q>Qv6;s|aH;97>qfcQBgl;S!cw3iHHuYFcEn z^*$~ZhdZC9n@9R5$Tsd3OY~eZ`{o_CSc~kiL3y$I!Lk8dd+bE>>;7T!l0tY@w7qaQ z|9WMr4n(**+Sb?G^MGZdMqCd&2v#ESx6!~%;Z2u*v7pylKJoCmlPzqg0lVF`O0LDS zsXx8bi797xYAgEF3xs?6DgErjBw_Lh;afFdLH;p9fw}i#c;e&Z#zeYZH#5Ngwy5dZsg{yimIv~yuPk~afzPIB z_Jr3HE|2rS5GR|WY_ngwS9(Tr`{L-AR(4|(*RBjppY|@LtxeGots3F83V#?-A?m!* ztL9z3#$dDkVl*PSlPizLF2fn~{BB51*BA3Q_^zG(fMtB|tSZ|p8YKR~$=hk6I+|7W zfuisw%cXIoo5{*6=_{;^DV5nCT_Rhq;)7g0yO1ah(r$fSyGJ)`w7JP@Y9TXMDdMvvoHRkV}dek?YejWu$)0UIxDws`O}s74o{k%_NW zCPFmZD*KT9)9ge3o{Nd?0`bMeuJA4}Dbch~oWB4sJywoyN%UQkW4dQuC z{y&o=u3}WS=N~&E%q-> zIPsgMG!=b@@jpq0MK>o%eI2Plr}g+DNl$G4h&;6oYds5?4Ky4_NwF5HbtiWlwtT*uWS+YiYKPoDUV zF)*6v#&&PlfraR!0T*P&SAZ7vJ-Z^!nlpaXSYN>Di3+(~$t%puVh3~(a+YN1cw!6tdBkd1+9yl|vdVXdUHyUf^g z+SsNnT1VINBN<<^P8rVi^^3>C7M%_tR2?g&;MEDrQs&F6g| zQ(t1Zp>@&QE&rT{;^0=IW^kF<4x2p5`qhGgJRFPsX%(G7RO!UNZ(Y5IvOZz5xFRAcwwyc#Nb56DG(+EeNnn5af9*3xsS=TC?=2mG(c zs|t$q=)xfizDF;aO@;Y`TY5Gl=-n_dGKfWC+|L#5f zXn6}il7?Dt+paqX&2Wep6RRyv5*&gSy4l@TTt{_T*aOQ)hz>UDr!S^cK)i;m<#api z+09L$chx4)W=6ofe7#GylI`9$q^!Kknp0HZF7kT8h0AyPeudDMtQjJoqAH&-F($DB zbgbYGsuk9#rngEnX_P+r82>z17rTT}t%Nrx*OiT-2cN_}{dttQbEx;)Y*l@zj&{GH zbTX|Qk=MOa*|V-+)5{mwF15%nS^Xw_*rK0P;wZ8Vu=Uf6z9-UODQbvk>sD7TD0@T| zTxhke7#CDn9O-3O#XE={_<~JTmHi~&E2*F7sDh?CDEBBWutq;*vzEDjTPQsn8cLt$ zIP&`{|E48}sWFk=aU1HpW)0UM4qwkL=>3{&k$B}3Ok;7|;Tr~DD|VlO5ZV7dBedK0 z(~O>%!ZTE@HBIcrHT0)@)`hsTUJgt`bmBR0MZ|!MKC~7;s#+Drg}w{ElhwyD0Q`tX zF}a1k`80y~Z#?3H0+wiy6qfr2tqdrVd zakUn|!d22iSD=tHg#2jWh)*WdYmHpp+3C%H2wO4SpMSuk2USoA}h%!FHvXjfvw&HrdR)89#JbHsq5=o!w}pXQI}>W3<&q5Smn z*J!RuxMw{V>G{K#&8K%ImhV!YEql&3Z4!osY1SR0qJ<3p(nDk5=YR<8^C=EsIA3iB&;%W+9U)=f9kM^)8L+`w3ADP-_>sCzkT znWnO0u<)}2u^@xraDBqeG6rU|bi9;)HsY9^pDH~on;Y2$-{k4zP}Zy*C>5}u(t&Pc zK{w=_(bM8b=W&^;_S0R-#%q=d_X$s_`A67W>*?}Cj57%{RYe>6xLz|zbGbJCH>_j{ z&ejqGs<((xrlj+g^qGd==y*v5S?iS4a}MbAeEfKae-M2v{I2LQ|bD&>fjXm2N#qMj)VY(4Gx35 zyJ%nGhQb=xf2T&@zx-c6QrALy;uu1eswWdXB}dE~ut-N@&&w0IHcP)W;k&68zrlS< znl2SgKSbe9I;1A0A9k6UiuqyoNrvN}yfG7U0n%dX^}K4o#z zDK>N_*Fq=fsvtpP9~DTAW;hDNaSPV$*%s3n)F14{;;^I-FBVO=NnS;ylOFriw&y=n zUV~g@>ulazT$hH70Y||6(2r-^WjLV>GI`c2vpOL3xel1cgebVDcul+*5V+037NC~o7sWfk;yWy( zh7s0vG{V#lXgt7Zupvai>uhg@yD|-izaI@BG1A#4L(F8R z=Kl`}TqwKk7kaT7V|)G=4Xix<80G=mkhd2Xp%GgA|3#601&y8jeFCjAWKz;9tYQA` zA4lMguM<(>)FOWhguQd{$^Kv1+hB#MDxBG5(Cq&Ju0W;!`$cgLTCaZSxopkHxFu zUbRE#gMU$r>x}CoO_~N^S4)Q#;wO&aviU$y2f&UvUSV!Q(U5^$T zVcCTVdpv8wi1KwEu1JSOL%=_WB)lDTRus5_DhSph2(m{!^Wvc!1a#V-?4CKitq~Au z8UNgduPW1qfy)3HS}NkJVba&6EHhyw8s5_O_mn$>>3p02Ha_*+dFNDkHk*e*x7uKZ z(UUY2uk87h_iZd2qmzRu{&8ugWS4%z)vgE2_KB#&`hT&(A>{+A_PPjwo%o`i(hWNK zdG6d7&Bs|_e=i5G+a3aC21Zx>9sbw2EUYSdNG@30rMwpahibQ95r+-BOpzrA7hYUo zY)Dt)%>@u<6<u=fGpA`J$A#A^S5WX>6#fEAetO1enV|bWjthvOSO~2VDWcwh zE|6!Q5;~OWwN`wCU>zEzAwFve7+Nyf>JEzRa&kZW3Z2$vM@mhGXB%U0;0Mee)u zNx;2A%2vC1-AOaV!ysyh`S+3S*Wsyah#Dpr*xl+ISNG>~w>XL}^3!|GV1dcgHK8jd zgW^qqP;}OI^xWyc#;=G+#UcvXW`#nqnzWm}VI>JWn|3YEL(!Z?c)_SP4?&cxu&*G87dxL;+?ECM>^1sXs?T&^AC$d$f`e# z(nRcYv-P@%Uyz?-mbX0!Jz{WI01oChUz!RWvCd^OIw%qyjcA?!5NhOZt9ofJBc`-I{OwY{gKL$+oB*k$bq3dY}h#56395O8u$l2_tWukig> zyvc=DzsxnQNKM1;3JG{qS4CE{8EM2X`#!*`i zLS3tHTBXA6@4fVYPbIU;bp2GSP4@&WoN_qMCjK*bVHR8g+#Rj%I`k}>)Usz=vppOt z2j{C+lK8#=v|J~=JD1x}L>toPhQMB^16+L1a6sjoVI?1wUG8O1lf(6BAD3`R9G{{&*<)5;OaiNO7Q=xL$a&|Aj%oMCe zcHJ^36TR_)Jr-`zEEcCL!m?v#jU`E=Xo;`LQt;35f8#sC8z)BtbgLEK<(idNF05XM z1}7b%H?G{_}S!C!)zKr+xB&D8Jg-)Y!ScG+=#;rw7>r$sI8GMWP4rBXoOEc!W!Ub zGrxGTxegC(s5#vHbxgbNP92W?W|pnR`tHs25AUO}hJxF;+TM3;FJn};vxztGUt^Ha ze?=?9k%UxDaaK%&*rY56Ia;bp^4pRCj6<+MJ=#Gy4cZV2091r+si`Y)ibv1=0ifeR z<=w0XYJDMUPj%p@H?`LI3Mf??B^C-+PZCAMRGg!FyE21p}`>V%Uq8#8|dc#lQftU|5AMQ)9OV z4G7TlmTt3uF)yEzZ~0aR`tZ_muH*bMbOJ(D0h468P!Ag-Gwr2)^*9EW=10ZHv$HKM1d4SLM$2iO{9?FZnd_!q4 z-oIB)%L{w$+yGu_!i_G>8(1+>8$N78t-iQmK-YdQTvd=DpAIs}f?iQ^O}#&&e&%>r z8~jSw0%zx*W=I{3vVW;5kd82F-!~SYMIg`)CxmGjy;Y zHz4$B>MEN~dD`Z~IFEY|uusUfKy9z24jtUFtmM_DHGvGbAOZ>c;z8F1`f~JK69MGC zhObqZ^ejS^Xsk}IlJb)=(HK3z*C^ogvQJ|#GC?&5WgzuWWM8QQ|L~SSDE0$_10kKs zjF6zU_kalpBaSg)kOoFO^TWL}`HjlGM9T)MeEejV_fi3#3Xz5H-)O&<7qd^6OV9~D5`3X@9mEXtTzo@ z(ck?IC0M6ZY_DqV=Klu_dIuB^Upw7say*uVT_u#LbU{E7p)Yjmzu041e~SV}^l+tU zxilnZmf{ttDF38E%@a+|))wE7;`ikHs0@r+D$!s>tAJ~Z?JWOMo@Q^Yr~T^S{rDEE zj+(I{$|7SP^&yh|R>lNc#&W_?nx_T11@t#GTZc-@N ztQ?mGVrv+ICLH2?XMi8zZ_TX$(7wa!2e4pn7~=GGuVAs~UGgaqFvg(a`bmDyM)N+2S@PdBcx9}ydq5T4VmBiIc&r1DJaNlQyV@yNpuh{bGRh@FI zq;Z_oZ@Dk_C2E=zJn?icDQLuV9?SH`w2$EIP#dhGIl~Xg1ec z(UK6_#h%fdX#1V5*yh0H|;Kll@;4*3}NDQmp_xCndJgQdV@>iUTv&_(2 zUc=zIc-|ZsukhclbA5nG`_)HT=i)*I8Q>!|OBE=LPSRTvv=9n*IF{+@ z4$x$l&ecmyoT=y9zuc~Cfew-SC$G$t&O0jfG&B))OMBom!rlY4$}kZTjC1GTuM7HA z$~K_^KukmfZIdx{6KKBJ0BSnVf3)&O#|YKINjMXWx;XDcscE$cmJrliDF6>#ex;;x z{!Z;$F=#}(+YTFqo>c5_ANNh`uwJiW)*Z=Iz8O>C(M8=HEG?&@n z;s}bdjM|l!S?nrMtAcI8eZH?s%zdyI*aoUQn@y-U1zOvqf0^@ViMLMYQMvJhqt!)?lL=@Z8q_1TZYPnK1&XEkSA3S`ncB49+Kc)39rJ0qPBI@&#*)6r{Zc4u6MRl zv6gE}eRt(TGY-p8Q)^qZmrz&4StbAI_UePOeu)DQFLZ+uWj;`qn;p7HPifgIPB=g6y>)nNbugZ!p(y7d{ z7u~n_K2uzWPv^DiB{w{dg3S?sv#vCe$`44Jgx~d(51||Zh2lHT?>x0U?9yE^F;=Dk z1>#nf&*{LZNUr#7vTc`%tFzq&nlU(x>1=|L_QNLe?*M2;GPMyD(7yaR5OX_2b(fp) zE7G-j@$7|+p^GUKm57mOsn)-TF*(L+SElY%F<+ z{5UpGH(_ZC#^;*?3*%U?RfyMPrTV9&D1PQE-WG9GUm`A8{KSesUDb(~^z4!q=x+Y9 z&Wdto^Lhgclda9l|6Em2qFNVfx7G+frs7{HO|JkD&jB) zg3z}J7RNedBc7viwnCHgjWpyzb*Np`(tjD|Kla&ttDzTF*2~_|E!G zjT8#i**{DF+FPXwyobR=F0^Uo%4vwLjA`towm3;{d6WrsAjNh-1G3q?M9j9I$>hfZ zjbOQ)g0`2OmC=VO>JmDe%thQcDk7eMPHvS~tw}a`;oGbe6XY=6VX~(oFY8zk3bj;x z%=z}FzV18;^-7C8~0;k zgN=(s4;bXqMTci0KY6PDcXo5OwBg_*c&S{ZZAjFba(Y{pootis$Q0yY7xk7ZyYeF% zNl^ndRV@^?W1@`~>yO-n@4*kZ+{uJc-^!xNdx4qI1wbvJ`8FD} zj(^1v$9*N9%d*%s?3bkQ=fUS@{$pQWe4$#WlMz1dY^t|JpYYC&Cpbnob-{p@j;Hub zLR~V#ml}+mZ>Z~}keObkc{L3Y^aYBXQGyZ*N$t7iQFc#{3 zJNqCNj5n0bz)hqfvUd95ho05(=!AZ%_IL8HoZ$_}P<;0H4)i_vz{h;mX9OeO=5TKC zqu#FA?G8?(3UxHH7g#i}d@E{!QJ#Lw23u){Cja%$3aBaV6||BFz-!4UK7xCxtaoH3 z9(kNyBLfOw9gRY+CN`4!T(Sr8ZCZSWv8k(WrKfeaTo!cnPVQ-!lobuU_a}Zuj!(_R zY%C2iSyk~n&l1w9PSdTm?A6D<+04BuxF?>0iBaoHt<0;>Mj_ z!oM^9p;^zyuY3~^+BT}y+t(XV#SFP)IMJJx0U=B69b%IT!jz9a<*DwoaDY{-=>R%8(L^T zMCzvAyV)d@aNbUSgW6!XRvc0IAEWwv6S&7O-J2%^t1)ceVFj={Op|gp#aT?*v>|ay zMHab}bSNl?gg4ws6S2L3bAu>3z~Dzgr=;McsCPzC$t>F>u2CuKgF>pFYwLZ_(q>kc z(2guRZ3RNZ3eSw>wW$46Qme}NBFj$93%4Wj1>px&A8U@~Zeg?^T6T0Ka;@WGMckf? zf6|p+#NVqMg^8@>B+e-?oxo`jWK#;bf{{%YoqKLeSg0^U_d;`0?E6%BNiY|^x@NR> zY_ID$G;H9?&}b@O!a*dYuy#;`me1juSYv-mb_yLvxNm_a)@#iF z16|6I?nBsPARQWE#KPsHbhDY?oG+K=K^CvGU-exz`h0`KD`EpZ^W!kv_p;7*RO;5s zH*C!{Y(q4~sAy{wHs-M>)m&5QxHzY2=r&9fLU>5iY=*X0^mht(a`oK{DF*pNlJF#I zX}Ozz_juz`YbnQ3WjoDcx5>gT*E+lM8@rpu41tw#ia`T?E79p))0YDc9Va$W2`liU z;#oIWz~I zw>^?I$n&$y*6~fDDC-m+S9>ZsRj{s(iVY+bIX@qoZD>asyGs-Yu;bY*!(>meq-)MAJ>SM* z|J?pY{`TaFN4lhEV($h{Bb4@iy{Rd1hcPxwQBde=wQx^utu5kJC^QD1io+$k&x(ie zuQXwPB7Hf4YjV8MH`vPCs5Y&8KpxVQxuJFxvcQpTlRjY=^O31+O6JF*FV{LZRJY<9 zpNikMAtIs*z3`_&Rnr=_Mf!KSw-j~Hl=U>}OuhKwt;(^5c`{eKMZ6-qpMtHt?F+TN zijP7rg0N73>S_u;$ON+k&qYMFD_^<7dx@JdDxvzUx=pl_ zI9Ha0a++mv&WUvp@bJz}ohXTYp>+g}c>Zy+cG4U}YzJ!l%258#_^W$#a9P%-_$F^% zwrTN^8{OZTTEO*dZIPO#ilYiH82t`MMJRIFgIkQRB7CO~JRN5mgu=YHxZ+8fovbcI z$uB?FF!LGibKf)R->bh>ZpQgh%MRF3nur`srDKw-SZhBf&ea$%O*c=kJ`!^tP8H7X zmTt4J;zB)-s@lS#@Mb;EdiDY-V8{z*Bo$E0-o>*arO1Ttq8=KqDa#97|5hT5PL2pY_{wl6g zf%4f=d6f&f>}gVpy)l=oPdxxL z+yvV?JKyeE!{eCc8g2Vj2+^%rkWZ4VJt)Xwo*@;xynq(aL9-71*ba75!)9A?z;<*pi;)~UZo zI^c>?6)S(+ULk`aDak^6RS*B7gKD7V>>c)VibyNF$*e-p=TahFHqqTBw2$=|mbBoK zZB|*A0Y{@L)!qA z%rW7abc49-F=JzIZ*Z?TSp(!%A^#3dFBR7()6FGE_Mq(>3BLDX|1S@hy==KbK0v*o zR7jH3?OLew_ESZ3+*3SNX;KnGlt3}wtlfotS-N^+qx3q8VD+f1Dzn5n#r#-y8ZR5z z76*rVgNhqivDc|XD?AtTr}AWJajaI>ZPmNRsJG`s-T1WEc05;yvnCk4*wbBgKpTC< zvM1lQfUa9D1hZTc3McJ*nuqR`YUTPXczE>95MPMhNu;w2=Q9g0Iy7ouJZ|-aPAop- zf^f3%R9e~n)K?S^7ehI1HUXIAexCv|Zan={|oYobalbe5h*hb+?R6%7XLmQ7*e4E|AZs)9mqpi+}HNG8sB_Mu|ydCthM;&0X0 z@J+kK_vZ)?%FjK{r<76Y2bx7=z@9&KbPF>e5=< z5R#%$=xa6oJ7-@SuctB{mgQ-yBUc3@e&ZSc3C4|P0hL_LZsp%Y$gbRMyykKZN|f{ zH}CCTyV?G1-e){VAHgG$Ov8kG(}mqS<6aK<2A~Cl7#Z&&XEDz81;P1(y4b!gw$i(u zubjb!CTQXm$kfE)bfrjz29~cM7pmT@Y+~hB$})#~l@<6r1uj~ZQjr5jYKaPQ8zpK@ z-a#lfdg=KhSTSth?Z3e>B8t;`ifEanTR7lLwsYT47NZYKEkF9!N(Lg zN?TTUt)d$>1TmTfMa&1#sG|WphY}cHn%Pup-R8X~**}U0^a`oc+>rBo3zsGhgM|wk&f7(-$r5{<3K!n@4WG)- zO>69o)If2S%PO^L=+9Z_Ah=_DlIZSq+9y9rMn4l&oWJrtMI=ajwDdrx&}Hofg7(3&Nrm9&ZcK=XQ-S)?$Q+ph$mWECswAn;UY#)M88myO38B{9zE0a-; z%vUqDQ3qzPo0j*(2eVJ-2OQkaUzElm881D>q&VAt#^=Qzq}`+Jo3Q8JrlI@P%5k2D z7@q-|3A(!AuGUFs`E3+0!#i&^i8HcTc3I~*bq4!K3&-&b`q*XLMZIqvIe`7nrhrcL zB{t9P{v7eKYil|`jDH^KV2kjQn?Jw`)7g??oJTyU!4$xGXU{IdrPUL9#GaC{D$IEh41&MF5HY!6H zbI{*!+&ul7*rH`;1RlEAdk3l5jwH0X*kO(DMpmssRuF9JiU?nt#pgB3kBk0EC>yLa z%Zmn~)~TUz)m%(PpU3rV!uMR8WS%H1@wy_8fojijwX%G>33CyX9I-@U7o+k~h-%j6 zakcJ+mgz~Hr>KLoolF-vv+o8xYc24?{aB4?tCg?we8QPf#BFO`Agmrs-mIt-2YBGo zILjxh*oK;Cl@ue(L6zlsm0=bxS|y3(iA&{|Z+Xg47lhh~{hTfoTkWe9Z5S~htb!nc z!1MS+1r-pj*3hbfT)R|kNkFG!05{*)z>@X!UzNdA?dFdRTahV`s2&1cW%?^i#j@I5H^5-e6HMR%Mlh^1Xu*4O!jipbR zol1U>3VF4#W+eF>vID8Q_c?yM@_t@lc~Xoel^2)vrQSEF7UzDD`Wdn5#n5B4ik*p7 z{o|=vg?8~HM2jkMlwL{*98f1OccmnPoQOGx+9IsImOAeZJge4GiMn^36p~iaCKr9_ zlVZF{{johB`k3~02YgY#Ldn!B*}Z!}e#L4RDP$y@E8Wd`qrb}`&UCt4pZq&59foe0 zwPQi+t^`*Kq#~iN0ql>lTn#&}lJi^oN~>rH(Rkv&(OvKQ1^Wv9^AQEiEaKlkJ4$## zbAEXDCw#l(V~wyuP>!O*SpswSY!W&|z`B()9Jy)vyLGL#fV!OP-+fy70Mud76b2(g zYl(i4*jH0jmddP-(l|-K$2fbk=)BL{lPS8a!c{XD^6WH-Ul>Y4yzd9|b&fYil4~TI zR5q)!zq)11$I=awd*)4d^(I>u8!am}6(w=eC#hRsH8_FQ=vO_atHOh_>FFbb9RVA< z-x%D*J`ijb#PmJgIGk=tK`ib1mWsA3dwL{;>4(%466>-^#Z9 ztb2WIf<+uEnfYhz_7#&T*4Git8MB>dD=~2do>3p$obS?)kprR*qcZ% zC00-1A}j9%=hgm=m~VHUL9*?0iL4oFjyrQiORa6djP(?nZQmbXoXE zMPI8as3~zKNww^z0{lB8V?|p2S7EEe^IFR4=fq&5_>oq****bw*c-xNDOO%aYzJGNS*=Rz2LeYAKvc{Rpiu$vYqZP=Lp3g!TusIZ>`$ciK!M2n5FD$3i z!P06%bc7w@jYQ=h*Y}02U$WR`NFJ=-BMIrtaR%;oQ&F?T_?+>+fO3VD``w$#QY^>*JZUA+S$B&;fIB(U$3F1#$YEAe2 zL)=|+7Q}hBxt#Bnu1fYj;96;tQf((O78UHJY#p7n2spjx+dMX{tVU~}>+vRW!dFuf z_K9}<9Y0FaQ`|@u^pUjE?YTpP4NCZ}kSe^iGCx|+zD)@|>erEShVj}^ARCe%N|UEsUW+Ugot|GGJ0(sY?mGhS1R`l zk5=<}i{3_)&`xvh)I4Sa27<)&vU@$<#2xqDEA~n84dUwlp3cAMeUR8)fH4J+3inyX zkh65Z#yJ^KTAGw%fLJ`-4Ch?`c*m8=cIrI&o&dS_Xv|pE&Yt0_j z3JoVK$s05ox~noMr@O4>tU?7T9Vzmc{JGTe%e8<0dqB9!Q-tD*_9#R9Y} zR%W>8a@oFQ`o5Zr%sCd1`YD*hPgOzSGw)^6CzESnQLjKl(s=vXuQ9mF&$o>y^~Z3a z5c|4&7o7bM9ZMGun#-0NpY#Sb?rD~eR7q5!Y)%DC+KTE^W3H=BCH$&$%~R3I0!3@H zWgSU3(345z&O%f(Jk!;82GQmsuK7&0rq5X7K*nIwp`X; z`i(~D`O%Jn)}ZLxBLtJ^IeSP7UJ*WlA`&Wy7bbI7eyw9eTJMVQ8m46#DvQIuA{4HEC|BBpp6dc*>kBNp6y4G#rF}v)ALiD z=bE8&FI?y=H%|T{Fizf}9#5?tSFwR`F(fySmYX0dYzM!x{aG7!L_kV z7?DU*89h85ExA^K9MWUzW9Y3bor;!_Mf6H)%ivOaKaH|A!kVGU+gE(-`H`bM9fVLc z1GAyQX*fKG=-7eWvzw&5D(?v$=-p9x7oRSDQq}^As$*cW@JEs~d!`Rnk@orF`Qm7& zv_L(O(xxjyO=7x9x)6N@r*h8*8?>XrCbnxNUuaySh-4RCP2g}Arn0AUqg#B*Qetq> zkw0j*p{xe&19XAfs9mSrcWFW874h9MG(lgqvp=?aN*If9@Q;evX4>KKA5cSGUt#Hw zFaLql{&QK}s!`k-aqz&;rm!1jFCW|UGtIDjuEUUmkia}w?6!J6ImQr|iI3u#4UaG7 z7gAoV?@>FwG=QcM0+t#*z&)>O*qoxug-VbijG<8=M-&C;#*$lr;Z26&MK`3-w#~mt1j>`==gj3 z!6EtIax2~6(l7RzYo)cJBjk692@WCXLRCuAwLuQMYl-rx_&mmFm^aON#Nw}%PI2L2n7?Vo5t6bV9uRn#$3m@m zC8!uU&?T9;i|$pl%qR@5ShMlqm%cjN>jojEh+XlUtx!q8(Q}=y!pJMv$%U0m365EI zcPh&_7Y4e=>iabd^l>8Xwur}qF@0}=ELX(jNQk!j#iu7KmtGyTsU3rRO%y2$di4`F z)o+=8B*kM>t~jjx03K?&zNDB9>BnDbTUJ7D0t}GyKd$Zis$fESzN=g!=xfgC{SCZy zf(DJHCnk|k)AOY?O}(S)3m!VVpB*|VwF;)xB`6AWH`TD$)bpa;PWO*Y)a%frYVMr{ zPwYRY(wkYh6n|uL!RkceYBEHnm=EyO#)lCc)d#6ltyu5D4Jpqoj76tS)RE%WD>qcqqbJOTP;2zgu9^d?tRIT<`GC^ zdtdGIN_&c)*6Ogfg48tF?@Um5i|M9uRToBD+OFGZ-bNmPzHH+SX}H=gp|-{l`w{pt z&mUf#O27A`)?$g#8|v6BQwKt@U<>=i2Ehu9u+~_5O~K!VCVS_7AbTIMkdP>h^g^C` zqU2A7G>zKT!fzEky5%f7(36+Ye0w1X#6*t|XF(_XvW9(Wu+*yAXhS7Da#{pk5`RoC z&TpGese0j8*!c+V0$;~LKX5GkgIvg+vFj|GV4&2g-N~G_Xe@7e+~~-H|8(Geo@?`t zFbEp>0+6P_^3M$`Ta>R+r_KWsx5Mm7;%vG8qI)>^r~D5UZM-x?P!BcNbwQ9FuC1u( zBR)S=$VsnWz>mLlu;{EBBmZ*pAL^$VSnRuld${P1IR0Mo?|$?Sl(`XasuoQOekt{z zj5w77rCf_`(n#CMWLoPI?lk%;)YpmA zUk&{Xa|XXXJ`43?_?R_?>KfR$P(#&w?unD$$0g2YH&i?@b ztXE-lJkEfDCe+K<%tb8F;{Be(+3fv*gATukSDllnN77^=2`wEq}3Rt4!|0Q_b8O*!filCWqD)tb5J-Q9OHo4nMQElm0T4 znaMntj?Jk~^|hiXTFr!V7nNI)xc48#ezTKj3e|vxYNa)35YWhBWQ4CNrcdc;kpKh$-F9lD|Ok}VoTB7Oiy~8aCAyVX+n)Djtf+p zypP7`kKfa&yx03)Tedd%O zMyM_NK4D*IVIpa4s`!APU{dls=mkC9?P2>hThflM=Yy*-)y@{Ft0TQWZoVaLEdR{V z)wXX{zD#;V2xicOs@T`4kt8(ZL97z!p>Zpou0F@#=N^xy7zUO8@ehvcp2Ri}oHboR z3v+vZ-K7Zu-uWkO6?E{2& z8Mf$YA+F)bY^v3;PX#B+uPUw!<`aX4mE0^u1;~<;H$~&3<(5A(71kWb9U;qdy{%)U zW%I?h1)8|v9%We2S%C=lp}Ch0lElP0oqqdrT4JIB z16`L?Z0h9b)52y=cqAl(4?E~d9eW6#!R`KU6wd#`aDjc3TzYdV|4s60&l=HwIRAt+ zJ}^EG4q6j4&4u0~>?rw_A#Ng@JBc==p(iT*FoO&B{0+AlRy9XFZxEi)uxE3)h-Ypg zt}&mi!e}CUDN%j4bafp6DSt@aL~0mrw$o#C*&a>#N20@M+3Edk;P$Kh9Cn-?Eb2W- zGX~H_^~yAyLq`jh?@$4;<_YRNONF+yUgLkiPvCh>S@U~K5)-+FtYNxs^YGxehE7cM z)*p2G>Z6%7(oT=m(Vs~^k1bd{VT^{acV-pdZ(LGxA)ewj?AK%wdGYBXY_e8(I)k=O zU@C#^CMb_b(LHA21bLecfkLp^s|w>x1zvpR+{(h5yqdXIOn%V5QzTTr|^i9syWnnUO9xS2b=A&G5sQK%7>mgf|w(eq{Ojj01s%#q=n;eP1#%Q zw61Wrz1eetw`5v{43+Im)j^EhEu=S6W2;obmbqe&qoTHta+0k^=Tex&FH5A4(4I*y ze~tfDy4_Jzf{I%sLlk~7kxwnz9&h)J!83s zk@>Jw7%B)KO>Y+XT=8|?^k&bN_#*|rzwjEcbvZv;d`49^#(jb-tM<{uDsp;Mm`0r< zDvE!wl#CMBYs}eI<)cPV%BJ~AWj~6WwL~-MgCQl0mHflLT2XQfKbtRKkVWB@X8k9I z%3wR1-CyOf$>zeCY+QVIWRt>#s^>%FgVb*3#;cbKS2f&p`YXrK3ZIMSd3(5)p1pjH z^o|AQQcqyT2gTTaoZ8ZqzmsB9%fjr3zU&gwj$)dUVSJU&wF#b~%BL&`+~usXCcjis*eWzg*lm&$XC%2cDRl&FVu%dzI{cW8qlGc2oD2o|~%= zdbTH77TbFd2;N0}J?{}lswKVah0&FX^ye_ge5-#e+O%UjLpXqsdfR2fXCV;?8c#Hl(A^)&_ExL{)oP!V zW04NGW(z;W-5nZfCV&5Yn1_?6mL_8KkyvqU8m6 zrb<>EMug*TWs8&OuNjc#woGILlA*7UG`eeGF!^+f3eyA35z*CQhMNvoQcDWsooEq< z>cq<7Ixv1Be6D4jHdf7FG(#H!HE~2A0dT4Nvoc`Bgg!U84_G=!2p0-`PjqK-UEKqM zztayY>`7Dn^uQ?LM5frSDP?gh8)&%fq}idOcZPcwC1IzC)l7a&Rw~dgjSr!`t!L=a zpXRlhFdi8Sw)@gcfA6G}Qi^5Tx?DK8-*pK)hDuu6WT0G3Q`WY3QJqT#Nhx7x?vKgK zNZ9sk9_FL=Ty{O{;kRSco#gFZkUvlu;*un?Se(nmrD`!<)KnDPxXCX_Wu0-`Tb+Jys2#0^*TIH zkNZO&+an&D5R6XPv~OkUW%j99dDyIkfs^5AkP0D*E^bj5yg8<2HX@(7l-i0C}Oaird(w?8tPTdKsB~)iN%4{PXIL;IdyH{;pz#I}r?u3per=l4 zYeba{DpG{FTG@b7QDi$@4`5+V*2Km9|F3wbn6E&TNFy#VT+E!@CLxd4E5XCM?AH?LhB^&3O#6`8a z^i((y&a)aL*1h9#hq?mDq`UR#uv(k0-f1dMdCUkUa_j-8%i#HV&lvT67!oa9>c!3{ z<@P+R_B!id@U!hW7y=zr;b|z01Vy=Jv{Jt-P(7ZBQm^CoC{l04&+F*gcuJqG<>x5% z`xWqsMm_^8EhmQAr#wZ;H5$<|F#FJ8>TnC;MfCSQFAcTk(&FeJKjufO8&p&K76m5xf5<>&^L zr>t54abuw&0DTxi)34*0`9~i-NB^9|50<7xlV>#6*$0y|4MSU3<8fYl6BCll+0cf* zGtjy~7){ACob70Og?&>PHw5B+VQZ@O4{vxAjiB+2cncL3ux}962gA=Juf;T^q%A3w z^{}N)(&}unaTq}CCX5wXty3oiUf!DqBj&J1jx8o< z$yHfykt0Y|AWh1~+AYhyX{nFnC(FAm4G!efG;sZO_eVJJ-rCZ5&hkoUO9u1g8JbIT zPZgQvnFhX1j@FWow&F3hzSUkr|LTL5P4KUSf6v^pLcK!hP;d{VA_sr6!r58;osV_E zSQQRQH(kI>+y`C83+UED%U&i^l`^z56Pxih!GNeKOw))XgPDp9?-X+wh50_la=jGr9#55zYWgKL;fru+Kg&k&}x-Z?BcI{X-!f_r(nkFM<=l^+IFqh;<_YAY9M8Kk{xJf>nsFqMwIbjgv_u`?wlztM(bqm&Cwx)(6KcXlPdGb`g zlGJGOOA88W5+Aa*g@l^*U@B^yPmhP1MzhD{#iga(c;76XD5axjky`R~>W8?oa;KKk z{@79oLJ>LjTL}X|KdhISX^zKPN&Zp{cTr7#gpVncn?(J=GQIB=@c2Ph2<#KN1EbT| zvcIL?Wj}5!NSP+fNc4v}Z(%f%fQQOT9QNYQN*ms)QdRuFXXD334KYXT=K4q9c zv{li#1pXIPaQZOQ+ahoQe<8=wH9DHIh&3nxGJxKm2=hX~KT!O^h)qg)PsJT*&_Y$1 z)#2rAhVl^FuZrI_l(=1lgc&Th_86YT+`=>!eh#&_|7+x{p5a%0TNHefF$`&Ze>N`6fSG1QvGQ}js;BqdsIk3(;I z?x9cZbWHL66lhikm9woWy`A$hz8e#mvP=pa5>osJU>QGVqU6kbXoP>SczlMA^wnes zyrbZHE7B+9q-1f~K#Rj$4SXZ)trFHN z+3Ui)C~Gl@?#rT{%p}WUt-P-#ae^v;oR|5;N;1UuF9FY71hTkXsZ%mpF3q1UXsx5?WAGL#4$$w%;ms1ub8j9w%ohhPzn6k07IC2W z$I?q$uL-FPNl%rHaYBt9CibxROuV)dZf3&D6^_2GPXXcjwoEagH43x5+QIAJ71S!> zJAr(wpA$-JIo>=Tr#0Obc8_?#L91zYYyUN>~I{Cpy9 z9ggpGUM7au{(5^K=Q(Bye5=Ls;y*m+oR4*z=z)yMcsz*cv;KklAe4)h!<1|&46s$o zh*?Y$FCic*w-Uz)+N(V4+Rv#f%B#xg#vy_bniTGht!9ii=k`PMEm@h1kMMQO?yx$} za}Sqd0t^1yIW1XdGJL(#YBiFe;OThTeF8@cz&)Of$K&N^J&U+CVESjx!#Xmb_oldl zs>AsY!uUC1+zKCl7wW#Gk*nt4cxMcE&tRC(CzOERK;2ytiqJOsbhEWchJMUVhr}H9 zB(aK9g^&;M@we3)TqFqE?Vj&AJVO!iR>WQ~9^%Y>G{xzsg9$Q$ZA>)eEG4fR2SoE< zgzz~b>`Vk76oA=oKLoNM>Lu^!rjMGy4$t5_nLGT*XJop5RFN@~!^V8w+rnfuFAU?n z{ZRavahpJ|po|%2T-NdZq_1i4XKIT74)`F;0bi*EUkjb6Q&l1z%Cpq5mjBe(a4=P7 znakQG$KjR~bQ&Ec!rILBW12P|7j(@>WW;LRl+OOH8-HNKj$iDjjjqD zwAcTV@A-=)Yx12q*#ST05d62Bv~+rx%*nzSMY5xlEWRhy@{lpEJp+CXO`nXTlp`i| z;`=B8{T6o1i8Xx&gofeBxBO?q@QYt3>s&&sj_a}%YNplRF*RGPULAkYvvVnpI=?73 z*f4Y2(3A>tzVQ4jm<~QjVy2t>zmDP=brl!kkDeptnS9d;R1GtEX`iw1Im#iOurLv$ zz%l*!@b0t=x?8w&D?vXR9{X||N5IbEE(3%rt=E~VC5<)0{xL9quB6yZMWQI2iOnC|Nmy?; zFX(9lUqiNN$22hC&9|w@b*?&)AFm^y+07QK3_4Vp5u_w>4K8Ld-1nE^D(lNzZn9=k zhY8NL`i{E0ciGYH5$5tV6RK#s@}0x#7L$ERQQo-LOy)_!J+3FERzO7sz$UJvyPjl4popY4mM z*6cw0Xs&ED6J@S8TprrKl^6p?6#o9w=mwiGg1@m=FeP9XG-S&r}v; zseJ~>adayWt_0(NDxW5YElRT2wdk-n?4AS-#W-{Ky9+7}_DdiWT(`VQ6e1;bIH=5i_~^x)2RYcB^v5V4j`FxbVVO796{D^ii_$Wa&kp-yHpN?W6q4N{;BP> zf1FTaq>~1s{C8LIu4S+xS>~#S^gOy5eQ~&>0sN;b&{?1+Q2VWMh`;`36gL@TIl8(F zuA{CR&hAv@6gg)$Zf+Z)zZpUMkLMnCt^1z63*#x~sO5>cQz6rjJEKq^w0zoG|JxXN zo`N{!S*b^Fn-c$~{CLC=1=44N=(HUfnR;& z{hAAKkb3iQZYEei($#9@Wq7I1n1i3QHA#*z$!Qk8FV9pQ{+Zo)KxQA*x}0BE2V;BT zv}8pk0$1Ks!q(oL*VL-sP^C?53_RaxjxfZ^^p!cn^)ArGoH7-qk@2W{>JgK6b4pWp zqyj=pT+}tpmeNtxfCfsX?U6EfHD`ia0!EE_d3mydz|u*AkgB~ct449i3zkTM{Ls<`=+@%+sAU>1+X*V zoDM2xQ>!}B&r8e^a?z6^y(do3p3K5fGY=KybYaKSba9j%x zN8prOAAfGw2IH$5Q%`wbxzl-+$!#g+^1I=#UOrWvOR^whq$K&$g_EoUed!~Oy&T*6 z?tJbSEqj?5DOcM1501*-bHas*sb$V1p8KP}QP}$V>uVIYY%lE5HIBv~Wg0F12}_MI zcryt=iE8~yeT*{WAxZP%P+7URglVw$$iz(ZA0JbXM3)l2=inR4BRgP;wFx^)I5G$! zJ~w+pp%MM9;V-cxU%R!fJ5eJ$Essu$(jVSQW*>OU&kf^_Eag`E(*C6w+9d`69(OaR zpgPKiMXxY@@pL*Ap)6GF3QTPAJY=urRnVbIo11XULut=$@ExbM*cT)R%cV#3mYKC8`j|C0}rfu zgpoBqhKX|2#f+`4K2U(Zq!aRz)CThn6}-09TrM}g0>`5gwd~#jg3+gD|K1FA91*c^ zRRxtxEdzX{RY_0uNL=m>)jd5q=FUBm-%?0!cCVXcak22VPO}xa#DGT!;iQ%+@3@Gb z<&!Fl!?`s1Xur;NtJuZ-6*)O!&jr=y#0N6{8>;4^^-t4Ach;{|={IriKQAL{kv=Pc zg3ZPW^UNy&#!Irg$e~m>qu!H|q<{w|=ptf6px$^v?ntwo>m2`r#KW`}rsi@uaz=)Y zC3f;+&9Bfkk?h2JLd$keE>GD`Mx2pz?Q$lNzowQCFGXB%JhZq>Xe^1-Taio|$z_pm z6pj+ja&Q!J>$>7_!?V$}+0z5K)n&~?JFyCbMFjv-nagly=xIyBca*EHlt)mRi$5KQBQnWP zwa(uWCiV=@`dWL;rQt2W%wqe|q%>|0r@bvpE^Q97oX}hF78$b0{H9V8kCcY0*K?21 z?ZcnjFamPSRByp=`qu_X32=ndHxzR=ICqKBQZg`BuRj=+H7Sk5SrS{?Pd-5j5(Fxt z2WUf>==2c$*J0%t3wowGx#9^3ns!nq%=RFc>cZf?ETo3C4u#247)kMovfL^cvt|SL zn?NqKj1$$d!YA(Poz~Uvz{Q+T{^4g=nGVAC-Y{(wEewIjN%#m`{mJLNZLBaO znl0}2ZuAGK<D^14mAu2P5z6O9>hqR8q53y-`ATr*Ew&B*;1v#T?W55k=aCRIYD3q zdTZIZ<;1r`nz1a}R*K*p)G|eBC(A@WaG%xm# zL2Pqov?0}YmC>ho;Kd4Ndb*ErF9rs#g{#p}xx~0}L3B2sV6mQ((HBN&$wxea5enbq zxJ()xNB_oA4M2_cRK2w~!WD<7AV4U%+U+fUT1=eXk|5G-W z$x5K4Wlaz@Tj+iY8OtG3OPyJy!2Do%(?ybquUUU}tmqG3zS`Ngg*H2v+Rt(x?F3-s z47wpATV@^Zot4wHfR^{Gx&c?ixQ5k+k*@dLt%ztXhCNy5BiXg$4}AA=;!1W0^xIBf zQztS+Z)?^dls0!NbdzLpH~Mi4B9n#^c251!+n?%ln_FgbgT=!Yp0z1Ad~K03aWGS) zpSKB4%;*KenxP}IJ4rGKe2?Z}8Ls8pat!mnh-#gP$K=XNNJ)oJ6fh?)wIAf+^++Rk z82Yg@>~gv=9Xon?bWcCau|5u~fpz+sJkihL4Gv74sTWgH_q*XF?Uha~pNby)CZ?)w zmLm0Z4P6k=hMAAaO{Xmn!W-g~juWTb(#_j^NJ(~}$SPBd^+Ww8bXJap#}WMa!|)r5 zXSuR{(5^=3l^}#xS4>B}>cwDq|8?wcHAdP;(f&cuwPwWjp2EL9WmP%cSDa!lVAm8kJHT~3%-WtDdW93rQC8=UV9&Y*TDG|?Qb?L zfGzLx6%OI`0aB~$+8gR8sb8ak!#4lg9kR;lP$KZ->fLv*wb~CEzeD?p49LMxYx>t@pWSir$_%$~}=b!JyL_0T= z8dnXV{IapNa{WOcflEBU8orp`>}9FB(5faLp6tsW)3Ej=11W;**SCr^gvb znGARI>9xYEDCWjZHSN6m4yn_>JIc_z{D3SQ6eS7ZcvEvo9o80!a;a}rpq zYYNIKx~rm5mYw{*!~Q#XBDsVfYmVwe<>Ddud$$VlfyLYh^_<$z{wtjl3Mb#CS`+N+ zX81`p-B~oXxp&*^#!+gEd7`HlzNYYdA?l_FDruwE@a5%`@sx>j1frjKsIG1sQ$wv9 zrmVF)7Z#>Z?v4e#4yLrR4a@cXgc$b$nwt&bMzKzgguh+_`5McE_8;gDrROZSrJK#C zGi3NAt4bONFr~yn7Y&DS&*i+SzBsh?5;x;*{J-(j0p|lwOmu#tzL+|hMre}H zf%Mfrm@0j>)qR+wK%>O2=7I%eowd!2j862iG!@eyCtD(XXq4RfUg~4Z18>(>#<@H+ z@v)a-96V51M|ss7507D-wm;Q%^`6+2XKHbU?N_A`XRr+RwggPPdkPDb$p5}g+TNne z&3M!8b$~t|=_uT58~J6L_-7WmpD0%^AXhj)|EeA2e(fe0=u59!n9}yZ#2Xe{ggkL4 zxW9n%4fKnUzN?HjA5XD$3n91RAM7X6_4}sv>6n-l#%Apz1MLR=yK$t{-GTwqar^R= z?l|JOhvw-?>WELgNwye)hL`i+H=YX;=ZQ9}*2{QGt$1H}s+v~f`kQ{>#&X!4g`{uN zCSuRRxJVtmX5v8uf zZJWe(VAM&Y60uA9nmYcuJZlVnZ};+@_V2UL(Cfb9o-8BEVz{*4^nENEms>wz$!7sr z_TtzPU=0WBFn*1lDYjlKH57~El9ips^HVVR@(;wwo%U;oUI|Qr@qRY{PVnefHIr+< z1mR79_gU`}+JAM!wA!H^diXk=J5Dp-GJdglLeQ?2DM!4)9NoB(>3w$zMxfl?H~w>jL)=6Mw}CND>?^LL?MmQ~ z%LvD3Qtei>eLUMt@5CwQK}D!N0)iL7rXo-kpxL{y=}lCyk==Cw{9dl0O9z7@6WT>h z72RNPe<%&c+9rZOv(@bQ=%4g0(b`S1D_kx7!(H^@5ZDw+w}$JlzQPWc(l)x&M)66U z7I%=fC=`ID0(q4n{VK+J+ju&jaV5`}Ako7zp+ryO&l~Av-wdbB?C{BadTk+fEawLv z$8eN;qNKh(X+#ij4NJEewSYq+M>~U|6qz_HKEd%rjTXZfyE$K#*y7W~(rL=O`^AOi z-=tD>HOvx%x8TahAQrsE)1KPwGGf}b#X znZ*+#kuStY+f@})U1jLo$RB$Z_V~hee-5c=onUzn7d0ys{A5JwSx0rIGpxp-iFI3o zbVvd%!lv#Qcu;cR^Q6VvXJBLTE{eLEHA`z}a^KWD-@t6LP-A{2!wSOM$3e z)9usw52L^kA{;#C*-j^JW$)5f1!gH*V$tfHJ5|cK-Tt`$yd#A9QDN1!4>+8R9(Rb$ zQe1#piSUKOvx}|;xHAru5s21+<2{=Ch9LHlqg)JrUSez5#~!p_85^n^5kyFd;x)?_ z#(czw*w(A)5Vf^?JM{F+u9HSH4;xWdU+pm^`^yl+@pDgnsRx6EzH(t?iS198RFj2C z-w@cV;sXve=8`TMzq7DZjngoYJ_-dv#?EJVJ=^=()W`CHmvMy;+DkR*nxDag02#7< zs*{DMV+_MigM=9>suC|)hw~k+nDg8$rrA8{=DI44=EW{C9BaB_{{i#GzoxQRE>|m> ztXsS-d5WYigk3Q@n4kf-&{H$5mC0|S=@)Er7Ki3TN}*Il?HC-MNrP1>f0DFSp-uk? zb9%t3l~`Ap@*}Akn%qLTiWGBU9DJsBF2#B0`*NEvi*hj35BB!s-ali?u<7*9fAkx} zv4fuk5mI{p!!VfN|C;YzIhiG1f}Z15h{DMg@>X)E&WekYHWNBN;99=*UHQvOkF&&# zMfe+jw%WngBrm*yXr;mOn-5vdl$wWrMPK+ptUvc&H~T5F4snI2<84#qDc=*g>X-2& zx%o@SPs~|9K(z}w&<2_hmQopdp>kQ8mMM@GX8i0caBArB?#W@Dft`TI#aN$E$-cD& zo6+!t8@BYJ6?Q@Xk#!d>!+(Dl87@m~EZd$+E;7P^{X= z2%q%S|9#N%hYC~m+OEr=nGdZ!yifm%U_7G8*}*bv_`j600fq2(h^hwZyv|sDz;JG! zU-Cgk@@*x&KME7&KAa|=4-O$|Lg`rHN}PSQ@lp@^Bm@pCpw&Wm4dC91u}Vg zqDB=zNo84TGlw{g1Fh;eEbHSG8=*i$2W6n+{Uy0=R$sEh(@c*92zx5HKYPN}-ZDH9 zFN{H}f=f7iShDN$UUrBOt>+@t3q{`=KR9XUzUd?S!9BUYIjwkiT9nB=X*_I`5C-)) zTw0*78RGsM-c7*r)`B3Sl}&eZeRD|=`NOcQ(JXok2VdcIM_l{N6XR;<)a-$oN}e5N zoD)^tCft!5e^QvMli-9VmQ5bj35ir0<5aXGlJQGl&kO>7o7hk6CiK?Gkw^>aBk8_i za+4`^ya$iVvQC=rX=h?k@=h7fpLXH`kJ7crnH=uzKp0ie6{P}ZR6pQ=O%OOs@B%)2 zR+|O|(}Y12$V$N)2bsVQl9g9->ui~QpVSf^jYM@MSTVfRG8tW5GQS>n#Y_nL}nl%T#x6Ru^+JWPh%I5u0dMINnSD z-WXxvTw-l^*rL+@g}et`DA64M&mj7Zh*JnI8EIQ1#0laI*`y+VVS3JqNO8kYNY%m@Vxao$zG4S?YE9+%hs08y{$U3f_Vz3D%8k@q~T!0dqq`+6$JmHz9 zb~K^EE5t9+7M5G45+d32WGo#Lh;|eTedVFL9cil=)W1m|FdW)rG zc+*$fqsDG>`m`(dP;F6i&*J#e#FccSo4DNe%NzF0#N#Z?N#J)cCl|#A$|-5384miq zKsaR(a5?&~{Mj8(KB@D${WZWv8W2EiiI-WNuys|_nj9`qGw0iDj;vd(i@bf{XF4*J z+t8dIYTWFDAfz~mnmghzR*w9_=4bK{ZzlN}D-Iw9$)vw?c}=C|?K%ahY3oP(ekku=NJ#4CU6Yy2A)M$s z?Unjb|Wb|SokR-d%Tcj7{6(%KnaYqO8Roh08F+e}ZbLC!ki6&~`AzKZhOjp8k= zdjCb~o=~(0&Fn%@jF7b|rIR;mB+i-O+8K;(#xL_vkPN^QpnMtDW{3}Dd+@iLE((tR zvNUh*>QCIi36L40cc^T|69NJQKC$eV8xKdAhw|1FM7Z;Ex|yFF&0CeJ52aZ9?l7@) zY@)LVs`xDT2uwM**9Ux87-zcaumP|p&N${39G94$@fsWbC6;}Jb5Yed(Ay)D&eOmv zvuXAM7$z{oVd6M>X|bv8d$<)TWM^beG75srY`m-DmMLN8AXv1I{4M@MFMuP9?9ZHo zVS(MuPdCztY4pRBBoe;rji(L$S}R8c9?Tz(A$lpdBED?~j&)eA+`)KL3wL+ECC~>( ztUvq+jQ^*Y2A>P#o8Y^);WnDX>_FgKxz@L*i&pnR<&M*fVY(a?`EXile;ij^cdF^Yp7!3P z4Lj$^!@2numVi8}P7R{f!uxElJ%8CHdOg8N;K zu?52HaQNvkf7S=58pbCHPOX$>k@fKP7`q6A4+8p}FGz+i<=MCNi=2S9wZbCtdU}Yx zA2&cDb)=(*`71fdM{|Gp=wBE4k9-9!#`6*luarBmA>{%(QbEhIj1SUK zpq`f{>zM%4!x^l0YK#U2SOJ=an~$v3EZNG&Z1(Nje7qRh8S*Rq;MtH@G3pWb9XEqJkM%( ztzbVQD{nqY&oL%y^a)DGK+{dh+e~<{*xna=qs0#Lj2*;>O#%I2E=5v`W__VwqoQpo z_LGUqK>FuE_7~d-qQ89rLN<_040x*2W7$|pmeXg!Y%NMpX1vV%X=PumyE9Q3?7lI; zazmEbf-JUVI!pxjVE#{g)BUiu5Tk9rvi_>}iQbXi7A7)P2a{`Fws(Do!Gt>Oo_`%U z;<*f4e{XINLeEl!hFM{;UDm}*|MfEVFN;>2x>$TwSPR(d&vC-$kByD{z~5K@W~A|& zzcUZ-;Uj+hSKZi@%j0PIIgCAq4uA)%gxuZ$Rdm1`ps6I;aNClZ>5>?wjn@&`&*goH zP54`Sy6qwtc?m}Jq1M4nfpZ7sjIyhq^>OfXAI2r34gm}?jej`mB(O$j9^rl6uJN(=WrbC6LZzO_ zc7wE`h>u?!nw;PTZ#i(sz2D8hCzhUZNqvmcg2b*~mIq$V9^+wUG?u75D*Ayucs3Ko z^?6(Pq7V6aQ*fMk(qc#utMD%QJq6G61tK4YLp-*ND*fyIs%)4)Z1k1FZ2EIBOesLs zd>Ox9(b|tw4ile9H2!k<>V3y-QmlX2Px#tMYH80=PK6L@jemOkh9yg;U%l2mJ|?DA zmsaZ1r6b%ELB;U#5w7BG>S(4pO<0J|9cJzl#=UPuNFnV;$u~@q=L`IziGz2!`R_%V zC}*1?A%>r9gxzvFQL8WK@c6Hz{2L0(hfG?7>=FOuO;O+m`E=xRJ8SjPr5PLFg|pvd z7bWAdFARM{mS6)zUq+i)?Pab~=r4vddBFwHvz~sVgSPpGkL*s_aA)%FDkg=$Q3<<8 zIltq+tP=mkjAC~sJokaq;f|x^>ctPp$fR5a5qX2$(jT0AN%yu|{m7n@NqWZ;`*he9 zN(X<5H&srxe%fd_@-esu0uI8vIafIz4({LTqDdLDL~#19i!X{&3mn(!cS?4e`aBn| zie5$H=q!cj2wBA)QrUy}SS>%l@%C@9IEGv0&wkp3CuKY)1;AQ_)5G{b&)HuiS=V+0 zF8!T->D`bCj^tNmc&0qhWa4UTGae;dy?yx|k2E8Y5M4mO987BH85KWu3_o;i`Fn>v zJH)#Po3)*n;ZP-70Ok1M1@cIP&wL_}cqv+4i4#U<>=G82at|s=oh6fjL_OsO!$u7a zn2urL!AMx~A;zbF2jKs_;+9P2(7N8ADQStv!GKl`tXYD#mhk3K-mOq{;IP4dUy>qz zf0Ccc=KI@1SJ~EbRU03e2QQVZmHK-}rha%5uyX##YOKZ zLwpJ&%Z1{#DM?63&cJ%a*lA3s^rS35vVtbYXa8cI4xS95Q()s6;;{yKLA!tLDfeq+ zIQxJbrLEdUugaZ_XEPn5)qgs*&7XoV_ETKkvBlhzWVF+MGu9X_(B0Iofx|ih9mL+Q zn}w_F&;`19m~h|9XZi&E4sV4DhNLu;jJEaEe>9T58%T#M8s~5$yGCyjI;M~%uPG2* zh%#>Hrwo=c=lQLI^)#UmP3fhW!Sf}r*=HgjbWtZ-*pELr*KnP``@%C0VcsEN|3RLM z+WU`95MLi!QG>JFMWv{p2CyT3c4`T2?KQFL8d} zCHY+7LH~aQRYY98G^<1FPt*zr?ZJ8;x+tNo<^ODZ(E}K@&j@ToiC_f+swA`2m(IWV zhbmZ2QKcJa6H$kThM&2GI{ZzEZ~4+%72&6S;v}C`$;lTzYLTx*oWt=SLtjwIous0x zPBOwp1J@E#)+Y*0Ty+TA$A1X@v0N3}tr7n@155q^h@HpZ&n0PO9h>Bj4#ntl%Z^bM zN&n=2{40`&E1C(B*gcp#{QsSRW8TSTEt*R%7|-*@Pk>0~iBIN5<3M9h{u?dV~PhSQD@#lZnB8IOn#C6)0B zlIO40PF{($#-Q5L`cio{8|QFF;ip6}JUh-`nv^RoA;-}A1|j&aJnh_32o`iBs|)?O za4G(O4qb{5hG)2@>#|YdDA});BgtHcmaNn5U!!^jQwA{>4IL|M*lVH4>z9CCMdD@r zX4=tWF}mZCsX%%?F;sFi zz~xy^v?O2W!mT2iR&H}tP9Z@e$Figm6%XQuj{U1rN zT=A=aJ~}O+!OU!bd=I#7#Cdb#|MOB1x8kMC)@u+ghd*cp(!Dm4n4XfreJ?(xF-Q(i zkF>o(n5e#m_971I>K5>h6c&-&N6b}UVzpT&T`4MqMSS;TJ8I(p{8QXPVeE^ z7RJ?zN##ou7_>~l^g8h$SxHswI?!z(%ke>DV>-%FDOna&*4TZ?YLUkpcu@^` zswt|%K@86dQ)v)BTom8A#B8R548XelQ!Jsf?oi1mMDp--#3Gwhmt%iK!Zc;B(z2q~ zcij0bY6(kfj|SmsisXHl>mz9tbU-AkKhq-mEq7h`kgjMTgEmUj%#K4|}<;S?Uf$RS2&q$=^a z-4Q*WaiuH8e-Vp_=Uc9rqTYg#<&wO*0C{m$rTvr&58<-b<8o(lsonT!fAsZ~r`|yl zR!B($5%E$r3z<{|i6&J-A)bNvf9C5+ndUnscg}HkcNvBnx&JtH^Rp%dY=$+63Fm&P|`; znt8|Wfint8B8Pl}Pt8qJ!aplD@8Nuo74L zZp#NU+6U)C=sX2Z<-aNS@Qq{mmGWKVTK{GTif1izWr-!Smq6>Wy-Dr>sGf?{M=gh1qcxJ{TZQ^O9)SEhA31t*qB;T{E2IhEV&@YK=&GV(f}mvzDF)Q<3%1U^rgYuO2(`-I{id1*P) zgodq%m=zF@H>2Yg^;5I6(r+Z6Au3yZlumy|@*H&DkeBC{*8U;kHCHPd$B5;&Ux@jh zyuCeZL+T5rBKXkW&&cx}9eO_8ZD7j8Tb^_cYBtbSwvU>76)^)YocCZV^jYXxd-*yk zzI=;`>h+OgUGe--ysPnoM5QXaDK5c!=lO{eA0Pb@P#yM`9O)|sxc?y&O|EL#7x)Re zRF$ZHw9qhC3|Ze9&A}jCY53APTfawv;PL4=a8%en$uo&5&k~FMs9qi2m>9u^_L546 zHdF68Z^R#vb@t-?RT>nwS5%Tp#-ZJTk1cwn@Qd7E@^Qh$-=tLKVGQ6|h*cdN_pVVZ zTX)EDQbwGrnjw+q`>{XiKT|b!!J0#}Z=+BBKF^yd(k)|WckCBV%jpQDkCZ+tXKGwI z!Sk?h)?&jjbO0tJ+$2P7<>0s+Q$zYlnEMK}5b<>K$AAFA$nojqO?=TX%okoLVXjJp z%if)b`J1N%+mpCkAWmVs$;dHWgA>Y&_E0qPa!FR`*p$G~q5VayK__{mR~6;yibNjc ze>t9FTrU-h??@93_aV~|FjWA9eQs{R226Wmpc3c1^5JbYHTpVVz$KL(;SKPYQjtmi zGBn^>*tbVeMGfA3#b`NwpdmEY7K3~E9|AozjN7xF8Oa?|G9x>B!wIy`sDL$yAuSib zqDHW&y^KA4xqs!J2@nlBgt}rEqYy_E78?%HsiQ5u= zz%e9nmNBl@RZNld5X>Qcs<1^LkMkFPP~`&W-HaO+=oVLaK}t(E5R9; zHR`M&yUl*pb_krqY;9hazr9hvmE5t*`2_?hxd2MHDm&y{AGIZw)U6jgn+{pm$RJSh zvV(e5j)&fgp)#^Q`iHc?J0Zdxp&`oX&E$%3R@v)k_X_(d4Muc%PUnXbqY`lfMK}x9 z+-2G&XAcZ0s&XsuT5;o{x04%XfNc+)(YRBCBhx?r&n5AtILw7vfLKVn&>Q}^!YgY3 zCL3y>JMW5LH8eWc2k)_@lhH+;f~>I;7tNTSs_*5)bnTeIZ}KOTQ+=$3UgGhVNBEwQ z?u(U*(zX!H-MP)^%8}yxhvf$%36CP z+rj!f)(2Y8ntxNlBY&8#RPRSKcBf{-N2u=4ERrsAXZ#HWsTAB6gFi4GKL6%eC$W9+ zMR~y0Ju$$zQe_|BG!UI|UEETR{-ed&3zw!Tee@nYevQYu#3|mHg?HoaOB|u?Z^?2? zVXTkm6-BBFZKO-6Dsb9Be0pMidVqCYCk+P0Hl$?xJIu`ATxS&=)8ajbJ#Qf?0PQK9 z?qd6|Oc8ml@lWK^i|^tf%ShjVrN~#QpmWuU$CWad+wk}3y)v9xnfQ?m$~62YUw&sG z^gtSf(|K!xlI+A=?vYlGG-#wbI=s$5GK7hhYkoxS>RmbN+hRjIpfJzye+dcJ>fVahh!jhLNA{)fM2A+tEM(Eeu+l1y(k$y zMqd7$sA@3-<4K?nBb6K%I<%BFsnL3(3`aH=%6SNkM5A{M_G)y9S8*sEZ<7m1Q^nk% zq~iy&0;{gKePOfQ84-!Q8!rk3$_0GIO9G?qxL_>{JGL0L~8x`DeZ9VzXdXe8GMzgra^D`=mp zduenA`-6fopO&nRxpZpiM0sE2kdhnf_vC0o3Qd8s{Bm)*ssL4uuBVY$Vw0TQqp?&5 z3vd;4-dgKY-^`-EXKFXn=W>IOeXI1ETy#qSf(FkhqHi-rwRbQmM&OS;-{s^g{n^v4 zo#@93XjW>s$(;GHnR7BUDhLM95p@Vj%Xkf^Vh}?I(IL!&)4Q2LVkHV;6SeZ;=x;hc z!1#Kg9DP|D+v<%~qpZ(;?BOVbKp0_k08=R@8rp*oU=?jc0M6*RwvnSjQxN%E;;JEY z4SD{q8O~x;UUR5u|Ha`wC{i74BjbGN9)*{yxU-h!Mpj z{ofEWCCFLe%ELc^6;QJ_m~L09B*XdEEE?=bzm>B+6QrVQd5vTktSiFwucK#d4e#*N zZwkarO#G6mNVSr4QJ5?ixiO+e5}E6EYP8bOjLLO%C()v$TjZVba)do`Z~AE@A6j?E zVs1~E8>2&9AZQXzV}i&zCP!!v7DMoUGL1Jx!BB-9?+3aSFz&@SQ+e|qzAH?Q3b+# z|63j1-yhFO>>Igc+915|{3zZ>3xOULxuyV}>v})zsP>1Gq`8s3KzIC(r`G3W^ z7?u=--7e8ol^2(~xn+S!1|=nEmnHbozG^vc#o8CAkMLDW)F}hX5wo}tIlDaZBhIq1 zGiIjFk5!lpR)8nK?oXcR)5GoiAK7uRdbwcg-!i#T)q1a2uPk-(s%bOH`1nld7f4wu zyd{wL^lNpDtFNKu*P9dCe!^#Y*C6cDrzOa+V>(2^SP7ev;C1>G;+cQpMk}$3ZTV8p zy`pf2;o}Zl{>M&n9+Khozv$^WioulegsGES!o^_h|zVRm*c5e=&3L!D)igs zvH$43yBOZ!Cxr8<3jJO=s=Sb9vNW8eqjTLupH>T(s}S#J=g~3&wLU|GTK;0HoCfK> zdK?U;3b-DU$rqF+Lvh+LuOio3M(tW|L7?`rZJ5##i%a=%ka34LalAUa z+EdoJnA@os`=-wb#w*Pt^N*FRoo*WL-26lc^R=!d2R_EjO#5ig5vHOkhx->@Px}rN zC)k4V%0QN`v)W0|iuQ3;zi|z|FyEKNle>;@@KVmJ;#UL{|Jd%_d|$+~QHL6qMZh5? zK1ajN;t={(@Jk9KatSfA&?QC6{j0E&Q=AVsbZ|c09|M%i!U}$hFWM88!AA+>lp!vb^2z>zU*n^e)9dfJ4A~B?dUI>8OIy8)|sBqKVAe1@BrZ72{pGEt8 zb}Nr$&(hI%$;4AEmB}Z6jyZQ49~+gAnQ`GYn1 z>4qQ3ICdVAJ<$Ld#VA&_YiQJPY1S3(UUBBtX$Ya;gkS_VRjj7VL&yxzzf3_xdDd%D zcnnKsH03%wLbQ^!Oo?SDqbjV*sQ{kmj~nn%(uQGLad`v1q#~i@JAEAH9_Gn`Bp6fZ z(y8ovf>Y95xgO7R%+;&8d*M!_90OXuOwM05NL-w}D(+{WF$KhY7AA)z&Im!? zxav!MFgbz5HOY{O#g&*4IyP91sw%qFx5Uef+Ztr|D5A(&_9`>IuRxm(a56+w$_(k|0h;yGD?iSmmw2 z+qL%3$b8901?#i@&%HQsOW>c=Fd#k+?lq$(sGIH4hy!n4MiTEQ%{y&<&J+7(xjsJXb!)a(*IusNX6ciM%4H<}XlZ%S?rKpsb@UCe_MM+*#%S`>6kzrAqnp$d^ zVqvLiYFb)Zzi0h^zkhrcmcrTjJfG)zKko}Xj>PsG*Murotww{@Lh5-5Don~~7qB;q7lLtl@e@qvt+JR#$yb1N*a;Y?-M*G#ErA<1m^#W!e@ z2hqd`j>YC^?r8CxWD^^lCx_O7BaQMPa1eQfl9zozC?XBV7XYo{& zLQnwvP;GgGFs{=Bt*wl38kHo@=MG-Oi_bUGxd};ns&xDlS{spFgI%V|0?E8J3hz$w z?_e?lQk3YA=-e%F)yj9_Y?>1<%f(4A0>Q7qgR}XKq4@5hEUu1w0jqBX2jPfIPPznr z;-ED~8LOMw$W94i#bEAlW5?={(-^8&9ee8l`rZiJgzIn^mA%!%P!Lp1Bez4tp9#?a z!_@a=!5~fBBm^QdG}5vkeDUUOoCNR67-z>0>sSU)#_14zD}Ujs&Yy13W>v}18>?(& z9~j~F+4)(7z+iYI#D23g2|XXN`_eMg@`8N3C)#B_cHwc^Y$^Xmq|9AC4HRnd*8&mv zrVxGy&fM<&*p{2HiL$))VvY5fLHM55C%{ZC1P98u>djTp$jhkt*%AN^jbPtrfJ zy&D~J76L+XvU6YzC9hb>unS_)$&q}Y`kw&km zTisV;iKf0`w%h>rGb7Ld_#$+FJr(@|-HuG+x+^KI5jG3OWQnsu+k{(<#(Lo#F0psU zC~HcvU_7znw;D^K+>)b=FIzwsv@&!hdrk{!C?-H3dPzks+s7OB zP6McSxvlxK`7$$xrX;)ObVZU>mazPTeoQrg-e0GFis- zQw2$qjfKc(41nA5bTIk_k_2*|nFZVZ$V|@ehv!#%qjNhP$Gb6Wo0PFqk5P+ebWD~@ zdM)!jdnX{<0+9-KRx)~8&x=I^Wjfd@WUys=Jhf0EhqqPGH;9?4e_3BD%*QR8tCS8^ zo1<`QEP?r){%yl-HJ#%n_e5xE8aF9{jOKgdI-iJ5(W+5s)fN=b?Z?Cu*rC7>18FTj z?(=c%!o*cyL3|9IXcFQ*BN4`Fq_PC~6^AmTFB3htl}HkdhSPG4j;Mkj1>~Ub2R7!F zv_*|mN(H8SDDlWcp!Fq!t;u$tsc@#T%L0f1EA$D&;H*WTP3-#IJ>%$AgA6BcxEYsq z3IEI#*bvP}n=QvB;;;~Dt{_o8>M~uf48w_{!+)Js_$68!jRn=5GmE=X|Nl8@+J!z||m(HU{`WXsR zmAZa5qajLu_lhOY;(2V5C3o&@i(T+cpoY^}@udscvk3{^jwMQoH4!^r<_Nb~ne0z4 z^9xe&2eI7oX+?ZkBmadB3B)@1q909Hi6j8#g}{UGtfoFWA4@gw>hF@%&dr!mj#FpT z;jdNSE4tE7Pw3 zkf}F*h+yzU6{;9^MZpFYme4ga>{033XjmoBc{K`YlQtzBjARvZ>#0cE8VSQ9)2UqO zckYyP2mMWEtl#k1@VZ=I0_cv8ZYYtkr9T>%yc%UjBOigwFPBZ#xiIyGEwz(6YYpKK zhZiR12Cqs%cw>BD#oe3o_i;BdP;qiL`M+V0pQt>uVXy^OMpCt$?BAaUzsRU8mIQL+ zye#*eIwjuV$}(Jaw4FFtDNVY#_4Fz+NFn~oI=^>4B5BU|u!c?b!b){|VT`f_TiVQz z>1w&xnyx9uk{fsTf>)2()Vt^Kdw3%p*5DuNcn`R{<4pL1ogH9>00W++U5Wf~sOphnQBZxUxhrD6c{%;Jf5&pUn@q@ye+MgqROt+4 zf7LS;jzL=Kl8(h7Q&EK45VY{1=LbJB*7}W)_ z%Bp;lk&Grj2qF96RuV)hO+P!N7ioY;w>9<3%@iBrEoI+A;rm9p@vmV2Kg z)0wH`wzNR}#!C*t-Jd;xp~)1bf3Yv+Gkd9Btxf29>Ro*bjDW zAk9J(UN?7R?yi$BLD)3faMGZkP5$6Mvg31<_M@>5%c%_E71bx=rBLo}lIJpvRblLC zr}DI1e~qj$1Pblz@Ih~gV*kb_f;Q^A=fVsJf=*448^e@U`CuUU-JhHxE)Uzl2 zxrP*vzdbQ)fUKS4V>OngeJy(=!YIc&A8Wn_3z#Jd;~8Uh=)uZVblT3<+rQgWZ%S8_ zS1c6-cC+FGg>e?tMli9C=@Qs9h}|C|4vxhe=|K>(?rZf!5%#UA_z`9q;P;f=5yBiC z;-ZqBXm*bzlq&OF&Z-e|&{Q1dde4J=b26-4U{FZjWGF8id#%I-j#BI;&-3~h1uP#eFHvlC{u~k2z+?%O$YIuoE2*vdw z+Vb*W$LRaxc*+je5FNVO8u|qp_q#uWou>US;pJ2dALzjBMORw4%5=EHJY?abqS=Ku zL9jdw5?^5dbFG?&gHtvAMMK-e^#$fv(>r{{ks(S~sjHU#*O;5j{nWqb-&Q5*dVEpZ zLzc6P5hp0K-j$hF#uA%#secCX z1gDACSPC`#LSTEQgYuaTUrEt20@OuEzgvV zHO`c+O|&D}nFL^G-e-UHH%IEP=dN(1_;`K>szQ(FX#=?KOoK3l`~ee#$jh1e;vUVh zzU*~$IRF@=h6N&6SfLK?h4MGlY%6Cf?WfvoXf-3KlNKCS?nXOXTp7|`fkL9N(Yh}l zrLT+q$g9Nzkbm4AMGs>Fh5c8ALc`+uYk}q{tR05X?xS6&?}l08h&UnCFhJ#r#GAHj zfa+xO2M}ta4^yEw0dvVDDam;q8d#Ldyk5sAUDXpjm#2WLZ?4uubvu4eFBA# zg?UPxwklCTKz|spKgBbW^e_G=YlRYN+mwL+nmk`Ij@k%pJ$geEeQD-evo?} zCBJDo;gk0!$qUglNv`L>e>m(9YN-`=(Cf+EjsL8j3PQ0!_eml@TelF;41vrXO$61w z@tcSsO;1y`ZGfnZ4!L@IDbxdk6CztRtxTC?1hcy{tc zCbqCgjU1zCHFQ~o^Lp0qK2M{q**@gkjx5G)SUQ+|$he&cF*~j|rSVg<9ih8DJ1kZ5c@S^42#3*(wJrtiGk>9;dO;WUp7fG@$wO_V@GG zb{@iua7&cqTVnmBZ}#d*@sKLVQGG?M5ZpYO{t^L&0WOL2BzraVbbsuuQ~g~*A%B>^ zG89pK*CA9K-)raGNOU&oo+h6_UBaV{?WW+K+n{ibOkC1Nq0@R~kzVX<65O znE0Go>8R!QAKfq2j>W`gLjgn#JPr2}#b2N*rFXGAn(hrEud-tUyVmtsg#LHCgu^&` zaAH1R5$@3}z(qX!LxQr>RZ_#Abg0f_Us$94Z#jM+aaZSqkomAmTAwH38oQjk2J+cpwWqiWO-&5ndo2@sS;U(Q53_n%W)0S#+uT$u2+_#$f> z9>H(5JKqsT8Se=T;fjL&*xz^@R8+VMr{Y{0j_86P|n{vOY9GE&UnbakE;0<#wS#HZR~b#@fnc&RS- zoX7UC1S_Iv2?Nd?HxW zBuf0YE84R7%QBAi!=a)35xY2;yKQy+=!2FLhn!8YLdj<<;SgpLSJO(FbPnSxzR2|i zIZ5`=PD`7a{~!{Z+{I`u5brw9Z?*Q$h5PcVDCnz!UKLK|WGPeMR>b|~O+d)`o-uqa zb1!B0qiG%OH$3ycq@;1rIp+=4L*aev>Veij{mDlzKj{(t1P#U5+36F=h0cv=cc$uK zxxLyPU!R;kDf&ASdpt^OV^w$yk42Ojxn%W%8%KxztZ7;{%*^zLSmL_8K79vak5c|v z0KN=m$d@=fgvyodi*cHhNd2s-vrP>l->Gpxt)Ipw1i(ZkB1UY6nuH_CBx;l6=6pYhO~LN^DJN~*CS>R~0t zSb1(MV9a>#bcmscr-ziVvOhKy$n#@w#A5=xzk<#Iehq~I#)Jv*aiVLq^QDVFb5(Ll zb$tScYY+F5NUVvO>D)P1dW@t$P!lgg_<`22DIG0lR*okI*gZj*FKcM5h5$Zei?1Zn zo`b*IZ18$9-)51%)pLZNP4l|-Pk@>Ts%FLalC(NksrT~RV`Y<+_6b#AaOf6U<|n~` z^}_*Bs1b|&xz{+O%sL`TNMOh1@ZWLWeXvI!GqxzqAJ&5UTR;9u0$3Rppuowm^>LX)a?IgtpY>uuX+=>I-vSYv6c4Sta5f3(f4W zQKYeH7yFzhZ!^07rRD@uNva+4)y$9FLmb24{CIq@x*_zP5lpl&sOP=R_28>v_Z6zk zD{GMJGj<}s+<_!l`o|z8lDX?$KRfm0G{$DyV3VD^u6fk+jw8?yi2`89U3}(t8M0dv zCetS}{S*YG>g!$N&WX-ckOfHUD@+BUq&6ds7@C3YvI}p~8GhbOW;7Er#j~Gi$$J){*95_eM# z<)g0B4be>RDf-e;ycV=0cHg3mkSr$R$KCwo;(tqw;3O1wPjUbCia<{ z%bWxWBbhqOMtSBVEW0mK?C6KZI5tQO%S1XxQI$`Yf=b?zLlaZ*7WC*zpr98DG6S$C zmLao?KkJ|1PTt8r94mA{d@y&UANTKQx>6xchO|`lCPsNACoaiC0I!7$yCMB@Z#K zdbYdHh`O{KF^n#i=Pj1A^W^Yik@_;ia0Pj58Fr)&cmV>2FjZZU@imk63n3eoC3UX3 z@b8eGC5GjGRhOiq8d)Ue74U5a>@=bQWx40y#{tQoviC#Ug7r%Z#+j^3hMfogo>Y_rcrB8kd*bSCWtbCsKL~m@e?x z+0Q0coHKnCg06<_)=4eTEO~xC1CdLQo`;K6FxUb6qticEw*7(3O~zgJu~IlFMAK_w z=|A-0cA-+6Kd#LDNm#_r2(|BM@p4?@svm4AIb9>XX|>|AJm({RW{O8JJk^oSv_R{W zvEO1CQzYE;gLYNINlfb|8{kKcvr}2^Zmi4HvTGs}PHrfsiGKXeLT|P8c#=G7?y5n4 z20VT_=Sj}bgO~)0zkI+grg*0IhBDF8w;|E5C6@0{?SD)*ijzvM44)2+bqB*nnG1t`bs4HFO+@0 z9|UGoUM9SSv$S@+#N9w=0_v#9Ed37EJ@Ks4&_=mV%FYS{Wuf4Mlk3wA;~n@{ZXFe3 z@)5~>cBjx>;d-m;3FOE+v*3Ld4Yi_37Du9k&+`5jNR#78-^>8+MSlZ3UdSxGK;9HK zJImN#Y_L<&GP~m!64w)Dx@K05hU+?)wtJ!e9)H9_lD!Zdm*B9J=j!h|72dVmBSCsZ z^;CMG`*sdGWLQ&k@_iW_+W%^8cCRHM42wm@e~RIpKTH@4cY-qx6LOQSppfQ=hkYG) z_l|IYyQ7AQc=7qm5CfwL=%K|)D3T5Jdo)E5r{N3y**8bP+(5KoRIBOxe&~8nWya1N z>@vz+61{shCZ=}JG(0Vq_;(D7W4_5pBJsH#9`*5o+&dz!154i<3c!J_{t!0@Vq ze2gF9_Tik->g2e0fP6V~cTc2qiF}FaW&nLKjBu)KoRQiSkT*o%)pf3vRh7758V}P# z^BT(AKhX?)#<1UUJ!iNmw|-*oT$nycx|SVHA=qrV6~ccyAt%5`ofMCa#pGZgZ(CNl z>O)*npsW0uFxN=^ZRoGVG|%Hj#!_#d$Re^^%$IX9GHDuZj^&PpNRX)72NQAJbhHe$ zVd+Zk9ji(A1;my;TH zPzClAV=4Ph0Gu2rDW3+thSMAQM1>X;|VEhJ-;zoM=97Sv}7-1$IZIazO( z(hNUKNw8-M`Ip}}Bn6Ou?Lm>oU-B`XCuHUBO3VC=DbBy`r63cgwYI9U|rfgKRB>aWfkYnPbI2rn!D$ zuTwTA484=HglNl|(9>VjANm_s7?>f3-}R;$IJIK*6q`R*3yGY&<~nrf~^)#I;hz&BRtgZ#8Q zI@-w8c#e`1xe*5I=xqi2!O+&Psy35lxGLhpIOOPDiREwiBiTGcjGvjv&;8K;sd`4N zt_=4B+*eWfINW&rCMTk}0twO8Fn17a%V@vk&0d-cQv{~m`j@QjCN_tUV{OmdJFlu< zLrr8wsK^?NJwk)&Oh4nLz~AA^bjF?eRB9yMNb-7s(V|s!a1J+Nx|B~l46~AGm;OOk zr_QFFVRo3mEBZhov8F&;lq5AiYn`Y}vZlrY-U0Z6FXo0)WGQ0WTM2ispS9b1F$fAr zVJnm_hSM{$DitjC^P+1rD(c{QblV$meOF@mVPyAMG71;i-}i?bF&4)#;W^S^6>~|o zeF-;1Lk#)jS+rLBJvk;Sc|ugsci?HT=F6y3%U{`i0S-Br1f`AT?2hH2)KY8S)?KuDmc z$ny()s(^2Wt|$DR0QQX_Aw1vf$>wT8x=u9|488Rbi+pSaGmHFTd2O=g>I_tuxy#t2 zNzjt4tVPt@xkG{ql1Q*#^CL5~1@2OFmJ2#VltYm_2hD>pW0!@k#VvI7z{!YcAQOR zKVF#5o`^*{$up&AD|c9x*^E_gLp)iyDinu*SGf~&6sy{z5j>nVhHjD5)-h0p-q27N zz+Pq9&HmEcEQ8GB*^ZPxNJnA!ac$ZSGiUuWHZ0NZwVk&oWA2|c8gIL~krG=fge#Ri zj#2dU5pvvnK5i4L>EuG=+i0qoJqB)>GNT28 zM$haJH{NG73?^DlUuQW-@juD=`Jqm`%*%v(X#_3PIwj)H$(-09z5;%i*3?l=YGk$8 zGhH9zX{9p^{PeLTY-VR>71Ic(c=WgN8GuGv9gpopQ5y&kUHUalt#L&sm@XM+Ud{6# zH9guVQw+O?-RO7wPoGSQYc#oDbt>9sP~iHK3r#rbjf}SA4Fh`VhxZ5Y=xRylj#?_Z{1k0@o&XvfTVTqW!t3{1*4C^E0t z_h_j`Mv;Kyu%nHy(e&hZS?DuWc=@u-Cu0zx9P!9^=!# z8Io)$$R_>7JvS`AeucOJ?wBdXdKc;?J#LdriwvL2oj=)L zmpI0P!I2Far3t(B-Hh82uHd*7@`?Go+*6L_Q8Sk~1L=dvDos_C*o*1Vbs{dK>n&NV z4^E^nnzXi5l(Gios-=s_2g-WfZ_{#}D+o6AhobpZuEOR@73iJkYmiSr(8hh{@70G@ zI_Nh|>|%eVYbstm;W}F0pX4P3I2#~pg#JaQx}D24>-T1cOB1+5a&way<8P>mW?VD7 zY2nD`Q{2*kf>{JMA$7t!Y8ouoIaaDkHO#<_d+zG|v{TZ$_g(tS0KC;*BErBS3F0yj8}y z^@VPM-{=QxL+LA?;*oIE$V|Ps*E{*SS6cQ@H|Ua)_U_djgbu{P$Z&1C6D>KZdoHY2QvEO(u0#*Jee=&1!zA@x zAMRjK`Zyn8vM3iJem;~EC8&aJ4d}Y;Q-aBYTeu{xP2p3uuWNhfzzhQDkqeU2SjQN` zqCHc;Fm|jNB`9gCj9!Tn1)$ZixQOjFCbUcnZIlWQZkj)SIs^UGC~0q~>^TTiqrIq_PXI?WLmXRsWIQY(wEgK|rm-erU zr=x*R;l*XF=r$(!aSgHUKMM2Oj|)e!MgJ8y?b36uY&5xn{_>W$($l2mi4C16dl^fe zQXn>rI_XD|_22Pa>o#beOp*iN%d0`_GOE<(ctYA2GRMu|%>9tKhViu#q%N%s@>r-H z2@Zu|X&cY^2cVId;fb2xCMSbhJ|u!Ilt4@)_|L#1-=(pvlOn^LPL+!r_0j>*ZNc_` z2r}SRf*dJ3*uP=qF3k%-cab_0O20ykjOJB}e@=3^rYdVtiIbZ{EgD?knib#(fqN0c z5z&MpZ~X5K%^tc&hM%d$3eQc3wLEr9&Ok1tSpF(5gyvMZU1ieamL7+3F~1+r^50LZQt*{M3O#qCW(0LI~#T0+peZH+Pe{!UE@bm@| z(XwPsv2X>D1aU+4hv{bpeWd}vd^yH4N`gSJrR_S3Pw1PeAYa~j(DszIBt^GpQmqV< z!{AvsE%uXt^IyzPf^+)03m})@x(Mkim||tBx#db+j<(Nc6)Hc4Lu)hVy@g0W@TkWU*=rr_|W%TY4DJeEOC@IpDsT zskV&KyR@Rs`x|tQ0mj#Q+VCJRSc&;7;|(l&O2@IY!;uPu7=2~W0-|(|Ko8wU7+fV+ zS0~uXY=kgB%@v&RtqO)Wz&);WGvMX(jvGW_zo{`gC_L1IlX3^7Pn_(0!$G*5tCK{y7OtBQ^b!bBlO|A2|@y-l?% zAh4AFG>Qy@JIlnIqu@fkX`VOdoR#^(DxQu^FzMKYL+V;o4!K}Lg=B~u_i~aFw=)bc znl}K)dPyCG;$Kh?t=imF`qU5pD&YJQy4<9nVO97j zr@1Q25Ho@PQ(*20VLVI@$Ms=7Osdt^=)638)nLBdEFWuY7>|3a!+kVo^Ebiwfm=pH zK!hVzvgJy`JXt+PZ4Pbz5?V(?;7a^~MjLLaA>L0ch~mC0L`q7Bk=DV?XWm8k?1=n^ zgJVdpJFjgAQ_8MuDSQoLWwa>Ra2utr#XpcYD?SjCxaT8#Dj751J(@f3?wJjb=75jR zI>h&&PUb3UG|dmq@8IUB;1{(aStWj=)Fa!a?Y#60OD`eKrVE1DQvwq-e4(I8W?3yH zD6r|jSd4WnFpgUs;QXrjy_~f^aH%%$kJ>%xmKLq9z~_>6aj|9&_9IsOEmtP^d4uYq zxEWlFgjY)fCC2eEKLcZl>6_?jq2mvx^Eb7w-}2|%Hu_}TB$;83W@42`_6|fl_}i&j zrwFbPdd4STNINM#1w+;{=Jpp6o3i^e(a5@tHMis9MOvf(mW?y$Uk2aR;8~1&FJkBc z<8Lj4XjQ48GP*J^vli%zc8*9mGc%Yq#FM`<<$Kc9;>XUT^y(7Rp^(hm3D1+lgtEpL zV^jSQzVDsJzJS~wbAK?jB0@%gbi;)~yy6A8WrJB5XB$Fi#hF@NjH$_&Da_G3WeM%nXR!0=xVSpCi4U4ol;GlU1iSm^+_Z zFZq~mtRk;xE)vsCMfWA3k6|a)z#%`EFX_(e^pWPb%rG74Z#W(f=V>~I?bNQ}h794} zl*{U|Nzy-e@kMNl*O+WYKBOhN!1%zm${fu^Pui)u3lHTiZ-)7PIApIc0jmOTZp4YW z9QKAl)nsZ!&n}hpEqYOj9OHU;VHRfV$X@-Do~(>7Oj?%ryXaxYe{HpNy$}QW^=e5O@SaUsHe^3ou+(O9N5g#`?rf3ME}IOhf@e@_aZL z)HTkt8!nEZSnwP8R~61awr$9e^JecPY@@>k*Gl)_a6zG(AggPbP3KKDzRO<13}sl9 z4i^gXO(fm?KjSmT`24B!=Qk-~o07h%WNd~ce`Z?l`h+LluUez+86Qa4VA``7CaVzz z9D>VZ_U#dT!Dgn^&XB8(gUCPWXB5I>>!z)l2gGOK97eUcuB9(204?e(>0h{arGsR} zlhbvv{D^tbu4!G(zcZSKg^(e+REfTBwU9iRex!vwEqxM$jZE0fG>Ss2ciS925=`SE zcpLCJ)VfyqG5tO-P7&o_dbW|z_oPXi9vkTj0k$acRf;h5svLnzl7%oKC}Y`mE9m_Z zsMxNqr>`ieTX8z1rJdq*nBw(8yjOzfEy!wmt`*jEOoQ`-tYtnDd+h4hG@P%3RrnXz zd%?)^+)7ML-;kott}esSqY(k<3|L=Nr_Z$J_N6y4zLI`1tuu;oVV*kO7f63df}?V} zEv;n&N(WIOv~~$RvKhAK3B~we(ND;2uB#|TkY$xjh=!jm@PxuUA)bZlz1phXPSe3G z@96kN6`Y<6mt_2nU@mni+HS8i!vEy#@5_k;Sr)T(+`*S_{X`!pW&bJq`3tuoE*Q4N z!Zh0gv$Wl7di~irs120ps^MG?qz31D;7X{Zv5sEL@!Z1e`&7(-IcWFF=ywWkV+QtF z;tFOqyUFGqcYTo$&}8|AtvXHyBg9)J?_!<9pcHxiU9a))waJg;hk6wGVKu@oSlb^z zrwt}loSI8HpLL>-$j)&kn& zSr!lRvFgKk&x~Myj+PFsDlD4oLobC!q5nX+85NV}4Cq=9e2_JpL(@+7ajFnB({dMA zd~ROQKpHAy>R{|P{{0}s_wf>xIE~xp6=(bv4m#{ks!3mG7;GK}SL^VWQw?!_BWbFo zGc_U~(lx}=%9G{vdp`&hvo~>b!|+4=t`+r372I2ia8o8WBsj-9)$}K=a1)lGYPe%2 z6l|vJQZVmODYSX>f}G#OsW!N^0`zj^u;a3%N;o8`tf80IXZQ7Nq7Kjuar}b>yFzHl z_DVY1=W;*D#Uh!l%O<87(l3SU=DWvegH){UDY*-Zq7xY=$<>I$mYp}!x(wk|2 zyK38rE5qKG?X60OxA>HZErgjv<#Q|rRnlD8GnKpE1hq9VNC_QsZe$Dug)((p(#XQQ z*Wp7AqU+74+pCe9{Yz}m!mRJWvScWYi*VirhnbD%&_%e3{Wl+duF{D4wAJxIo|%igQ2yD-UUb2D zP2}Y0v8o({&@&9uc_pN1Aw&HYq<>%~M$cFjs=1jQe3B|IRFKl18(6P=--3QzPPU3@ zo7;PJFde8o(9z!~eWje(+8m%xgX}?$GC$#WXpt8fm9nJxL>Qb}a^06bPOw~y0bg*r+^aFlJII+P2^%lxEZ}%=9 z;4S>#hvn-3_M-96<{^*rsFO59yY+MjvL1&o5C<$^nwnqiIRxJ>Nk}!N6-!5NpSh}> zj2D~z*y$>!wrw4}q3HU9MRu=eB*>zXK-eA#u?pe&|B_4tQ=uMgKlJH3B^xWt z>GFklBbazt%}H7b`)fkcc3*2sA5xeRq-1|mNyD5g;Z7uXA-wlzlc?Hr9mhphE4|+~ zmz*lZQ^9WZ7%TukD`}fbKOF`PbPk5h1rTR9Ts7IRkT>`;v*T!nbvA*(@e-6z8s36U zG1T{M;|oj)y&Sd&*Gyx=*T5tS#y}@VE6o6H2q@CTUyLx~P53Dt4#Z#^(T^u8E!($Zo~8d{3%oS!AyUT&d|M2 z0K*#;rOMUt_gIn!yVqm#@OMH z))*JDSEK2PQ6Ni_=qh2RoH0{oG6J_Ivk~dx=m>esu+`#S-!4}}ZkIBh z*&CsaMe2kRO&8%2hb`wqHF}n?AIa3Hxv!Yo5-(3MEl~>!z8r9C2pD{|O5yCGZ&~q? zrVbQ#s4HD)Ne87ecD(|fOOSULVPl5K>m<4|=`z^vbj5NTEpk1AD1}z;N+h>sG?~kk zId|d6vN4s8nNHABr4E(^!RP?E8O4lYL$c|D7({e5%SnIf#foUMo9l{4Rma@?enRqp zl+{WZ6c)R#@!^`ljLvZqcO{%ykMMQN3rzjYLpVb9=Fma!lIM``uKHRzrlz(Qo)w(q zNhEhfB`a~&Kd9yx8HKOODm*sQTK>gVU*Qm>bL9OYIaos0wrqF22E4zMW^>NVtz-4E^uvL< z(XJ=$bIFHFGzxXI@4ZS|;4go}{iM#%=&7*GTg}hJ;-Jhu$+zHAF85?NyrrY{0c|<_ zbbuPQ<iIw&xvTOSmwzC|Tp0CC!1V-Rv`wPK;w6FQYMBV@c=pn$a-X#nkB?>;xq;XlbC8 zHVpL|k5NeT>m63CXcN3(R1+F}mBqvSPeF%OY<%8zo5CYC8ZB01hPUh)*=n;TnU&=fhzirj3B`1x z^glYv!X=xwwgD+9_54Q(E;sgE{r&NMkY_u6s2~&Wo1&7DF+54fzHP#a7|*(1!!pw& z(7AH+7+3^wQs=(rGQ*$G?=L6 zRo9nIj_CaY>H{v`=9*=XR}0SzjG%J=Xl}^9$G8`~A-u%}ZDW-(>OzwpH@z`PS^?RJ zU66lpB~)2a0zIqo#cEKHBDP!KZsm^1@TXlIK}#}(Px+y;{jZYEuAOBH9){}ayZ-Et zfw%r-%K6o0SsxSB*L*xil9-(1=UvKAQ%G#_5StCx*TVZ57A#2L%V}&qQ=iiZm(FU> zJ-MfPo{Y`Vk-x|l%M~9}kIo$cc8VL0V?lJ-o80IM>q9p40~FIwXD^2smW5ORy|cP~ zF4|_Calp6$R2&8!%#G@PWc=Q0Si>IBiVk^3iQIY&Ss7IeuEQ+O`K{2&xa`MQO=z9Y zlo);z=;<}=5^&EiD3M;Nku$r&Y!EY!E2}HqQ`>9M*V^oVu*vj-+%Qg__9yx+RdDu6 z-hef?+m(tF`EyIL{|M9bgGR9&T28uPpANq;z~7{qLYIHw68YcFP$7efdKNRw-F4+O z;3a2hg@?XM3<9!sX)U^T1ExVVv3`m5=lpT-r+_&0KzQ zvl&{WJ3n!*@9_v3X>V3kID2}V_dnYI9XCdfSwgmr64Oz?w(q%BYTom{bS|Sas^oR( zm{kw+0FDnqeMNaAd+IsZlZsX~XVHhD4&nRs)nSlJoepO)cPo^<4R0l~O|_mk$T`(h zdRZf#kI#2ru;HZqSfGB5?JueH8q>rNQc9-^jo3oC*1<+K{Vc=r@@T`gfpj4?quM3s zB1VqcVJYM+%Vv_{)okyhXwPJ{T$;v<;T{e!G{BbIfm7i?0A%WfKbvOT&j}NZOX$bZ zlDaB*JCdfn55fJ}T~T`Lt!=P_w)nKRuwM?IKF0^-{@hVuuYc0~*u3f(r(Z`Od?Ie{ zU!jAQJ7{+j92fv4a*{@UaEsT{(=o;}K+1ix5Kc#0ZmOWih41Qyh45-H&VqkI>w9#5 z7|f=m3|6q9*U+;Q=tna9px#sPIEnfg=}peLM0&y)2TKO=U**D?b{y{?t>MpB(Lg1; zUzM9R^QFx3hZkfVR(MbEaC1wwY>f}Y9aRYN!W<~dh4bhvGOIPEAl1i}82(#!V$UDV ztWf^V3RAJn7${5zx$Hl=K=*PwG>8uMR~gyKeh`c~>^1Cee~G!CcFm{5u;9}V zR|=z;D(=0xdi$3CoK6i#hQb$$whn|VC&-=W^d6~Icn;o0D=_=hw{0gSxmD~o4NN%N z{u^Y5(%(`g6_w4#Zg*R1)*>GWcVLd1Az}Jg;<*wQlQc$;7;*^Rf z~7wu55h2L!HpZf4KaZ#9_x!N>WhDK@(n)oQ3 z+nqli)bUfYDh~5{1=lI}BuNwXYpFTn?lB3HLgFmv4nvFqJn1l31*lMKB*q!dT;bm#7iE1)rtb)j>*uDxErqGK7fSkblN`ec6K z=e^Hk*muj5>?=>_pvi!kC(9Vu4>nAJ2Sb>;+`l{@)7@d>DuW}!Co5l)$&}?wxB@>N zel%YpO=^@2-i>U&4Kq=UJI#5qAm7({ADe4cC@qc`UoF0T$MgoCH12L>TXWVrf9{5w z4i4y!hAn=m$3P0>=aca*rgJow^4-npFjkPvnF{$YL#Iq%)wxD`)G$@;nF5V|89P(S zI79%sJ%*lD@*(ULnI`~_hxJ@#U*s&?{S6P5d+v)xYB&|hBKhVQ4|HtBBoKNdT=ID<_rqLq!M4RNaX*Yfkr>|5A3{jVCEJY;Knq=o9@ zU!rb>_@Mm1N!#sc-GhYA`wmb(llW572@R>QB!QbtH^D2Jy0LyS6vX{>) z6SCSm;b|=fk%skr-n$s;RjfIT1mQLwmIfPp&Hk>pEgufDNP`e)spEVjGN+*D4)Vs{ zwhrGUKKl{N=n&E@6Wok}gkR&w~ zR*TGbi1IS4Okp^0;vKoa5?=Oahvbkg0+)6ZS15n!^f{hSxaMFsFp^`Hu1DM-YGFYz zat5a1`~!O;n5iMV+t)(&wk_k>CX)kI{|hB0mEfEhg&LRWdUFYOd-^J&2%OPvbG#Vt zFNaC2y0)^hs+P0MOrJ;MMX=NY%s8gLYp3e7QlD5Z2L`%xK9kgiFR)obv6R{CY!iB{7YVH};WyLg415s(f0%j~xG2i@ z|9@`S(b?0@?#=GN4lwMj?#iz03JWX;1zluOP*6}jpB7kPNP!*Wq)0-ge6q>E|eR z!lU3A3AXyE17~m97iA{eED_!?Ph)^2MH}Zg56T-0Jo7> zG-nFuewFqe!b@hR{}|Bv5*~*632L-WQ3(F*q<0(Nt`zJr26n;?W~pj1{1rqeJL+h` zzWz-21hzrVy;_>x9Y8=iGIL_q5&S%ilw6ck_{mkxj*oC|wO3HiwMdj&q^$U2 z0{%AI@W^hV0P4M;;=neDJjMX+j~gL$$nEYVMR`?qk+B$>5U=Lircl5yTKh8lvDC4E zfSW>`|zJcMLPVil!isp%)=6V?nz0U153gwNA99xaF!5H z*Pxt{EnBfw=@=nbewRCgDE%Bi3Iu08hb-;Bu5$J|%iRKx40&sT<%TTlS#mjpoU!L^ zCl`XCQpR*<_`!($5AZ|ocAS#C;ET6^<8 z6x(ayQ%IZHF7Tt9Myxu#Dwh4?3?32({xH>qXfUhfrw@aXzO7Ga9fhq83(Ly5C%q0h@r<|V) zRgFFE&&3FqCdp&(;Y+ntkuwagbNBHaBW~wmw~BnE$o>sc4)?Wf0fVA{5)~YtMT@*m z-ctNt2)=E=<7aYQ!BI;r7poFpWv#IQ?X%Jb`A9rFHlYMhjU!;`6%G4VhLK9cOba%Q z$EbL;q}Pf{+vR@3t;b{!=j^5{+cu^iUo1`nr? zlRXZ$QHNE@`~)9Wl`@egY8`FoHw=S!^@)b88-}YbY*Z}R4&zfwf}{I0|}>b`)1_~ ze2-`E%Y~FIme6%*IQ~%IHkka(3QR{g-aZ<472>nC+-FuiEjInUSVrzvg4}9Y6C{y? zrR375P)&i@p-ra#7Y1YOvc-TOn;EBk!uU9DW#}jPty8ilW`&sTgd;v!BApg7K%| z&=Hi?xfv-_o)6fvRAdl1RH$VNewq_hIW|%>)c=g3Q3YRCS}K|N!@yiTGMt^0Z5=}{ zR!YC3ntF$}0|>eq6pbJk&hgaMEsZuCxpGCvEOJpB9+cgIF^v6yF!H za=J!eEG&d^*nHK{^JMyJPZ#?S}eM`ra2?1LjM(h zg#vA`L`NBt&y!~Xq0nd;|E_gZ!|rS@0PmV90Rrr-p7h!|h^OLQX1L}dgpzXEO2ds2 zXgzErY{M-YoF8M&rhl|A2~26q<|c=erA+KkW-m;0NkI~x8bx1ejTa(j(#}_eL8dZA zdl6y}EP`aliANL8k~Ej4qily1Y@Y%hZ;z)c4MDnNf4Q&Yd?}jGz6u~#{NvorBkGcu zqUR2A8ps_2F(_Nk@Qp#vRS%BgcOjQQhkpUN2R}nc_Kj(Xg*4>@2e&1WsIq!0Nl&n0 zp;j0#q&Q9`!iRzjxHnxA7mu5zJ=Ii{r9f)a4l<^LuNJv89|i@v>n+FEcmGO_M4NGN zwPE8pQaHixt4SlN-W&Lxa4Z##3UTX2zCHuL5W}j1+TJvFI=+@jYHGMNDNZN>y~5mA zdq3&>lPwE|9^d;BY%n7{-ipE9E29B+PE%$s=Ya+r_$9Af1#9Z3WbDRC{+OJz_|wRZ zW^bZ%8hX~AA4q?gwN-kjw#{0S84D{ffaZmpm&p_Nt)A0%4d`373>cf4_DcO z5O%VL$dK1M_U6WnAzPWOXucx?zx*U52bF22+s|>}kdcD#@HY8;a>-{tk9H(~1_tuJ z3Lv*}Lr$RZaSZ{Z(UF^5NwG=WbFt+%Sa`_PBPV2E1tu z*s3{xZ>IE8Cr+p=Xu_1*_#H}EKg@K;#^wgIl8{t|?U)3YheqVVR>^!7NHmm=I`k#qCR6Un5EgW19(%|u}RL^eS2MfHV+|DGU>XkoSbT^F4rc>UJH==TsRG;t;^oimlxpPvIE^Xh- z-VWm|SM@@$KA#z?tUKg* zFoqe0J)Qkn=V+oVO-uY=q76B&f^uL3Q*|@1GB6Usb8@pUAqWbK%#t`eu85&-TQAxE zqOl~zG_J?-JXJdqpIZQN!{Gr^`$*AdLcQPJn7r0{$UZJ&#qB`jQ8s)Y-WVk*uB`0F z8Cm@1U9C%8b5(^PiYey~h6!V{@`Wh;oDSzNN?)h5Z<(cg3m4}Z+BTpGo^#F>xCm>H zyTkEjJN_;k|C!6~V))2vss`-UOAf#d27J8wGJH>K{+7R=DVW46hHq(ft!Lws=|&HQ zlY>qA`0Vd#jF;!%LioPHe2-VYpLPM+H@`)>E!E*vMdumQO-0xF^m(Wu#C|pskIFTi zpGbeh{yNfGMKWI?zFF+=a_ocBY4^dI*SJ+OVX0v}WAyiJFb#?3QuVE?THaze&4R79 z^yHH;#On{u9%_JSb&Y8bw# za|R%dD>MHv%G^9S^#iKJyB`M(7hYjc=H@NL9nG-O^>VMLg&o<)EzANVfy{f^WEh~D z=klSRO z)qjSYd&^pjFU#1?QeMSfhHy#>4r@2!SxWZbwV08j3($gh59Rh)sA&HAV7ws{kalGLgw_10CG z_d=TT>IfL+f|lbbLt5XZb0yWyQhncRG*L9Uo6W|>BxXPN)a7^)-U<7}B6bgOmHYoo zsuKZ{71hlmg%cLpMV&{pzTWHc0rV7rmn9%L1Ly*jv`D?sr-ucxVv(}?kah_uGq5p+ zKqB%E;SXth(nDzK|M6MtkugIrTK_ly|GB5gJyahB^i9~mh=p}saX*?$gnyC{9V7bi z*<(adr>DYAPmG7x_35MH?C_W4?En4C8gPP&i;IDu0BA)_JahtpG3wF7=By8O#_Pe{ zy0E&wOr%7Xl+fEmU=Ntmi~sR+s$SbM2K?fH%=KUTAK2ad=z~%JWvkgd%#;IY#lH1cbegs{14~|9wbs&7^tG3w7pJg z08I*vT4R|8h;SgArVTYEAbkajIecW1M+=iLy-4f?Kqzp&Dzy!8xVY(X^quj$gds^| z%j&>uzY^Z03wVN)=K;(zE_XkoVq#y^13v+JY~YYCYyzBCqbFjq{=aNlPchw$+W!wO z2)&$YdL4?7hI`|`ydqCs*21Cx!*1EEt`s4$Ih~Bh<8vCq!C0+c zM1DHwpjO8tD7vb;UN15(;a!(G&t@saX|C6d063i$7xVuCiU1NTScPj~X5_B&p{Svv zKJ+0!uL^x>9e4z?hI;AMPuQZncNf1o+;8n3*>rdyWKhh~)wPQu_#re{483dWVCl zuP3jafsZdNw!Z!lz?t<1RcO2*Db|}`q}(lcU`NI5`q~rMIg!?OMs(!u%}rS(0p=~( zf>pr7o;4rF9bgAv(cq-T!P^b%Mi6su3>PV>)nJL_{5l*SmO_!?Yfh$WgcI(`8NkW_ z$pi?kVS~dKFSbBBzeTwRPDF#h7XTmX%HgK3YmZS>gV~mUwcnPOFQKA^wV1_Wvr+k?aH_sDpgQqkT?N zTIXF1R(1MW-_Z20;dLHxiUJ_0G+7~{Ze3q#3c)L~s?;r!e%%+{atMU~EuA;gTub5W zcpAc;9&||1S?k#Vjz^%qUJ0*}d;(@z3DNZ8jZcD(6F`nadD~gEP?&975=qX{X8D{G2lo7w)gsCcfA`ufZr(sp-SBq?oFC{k-_He^M*pS0Wzu^>lyI@ z6B%T_{NjMt;owVM)X5>RP)f{ z+~b%n(L5xz`Ow>dMF7Egao;Z>!z=1s7hmW3Ka3jiwYgRXMeBahfDvO|eUW>Vq|}%D zC@c!&uaXNm+b?Cb)Q%G4L%?MbBbUOlId>A{(}}?WZ;o^adZw~x~70U zq7+QRJ?0l+j%Ym5kq88X-C{fEPj_+G9m>5MWTAC#ufD%mqypf53@CA6q_1i>)cy+? zWbk)``DDA!J|OM;EgW7`1m1eG%K8tAv>;$aRzX;6^bU-H>$a?iZWw;!xo`+HKGDM6 ze*`p4LJnCXQ|6)e=>LF_ArLgwH?WIkFf=Wyue`A_o`HLw8!V$8$NWGG&7U3MoaW@Y zbh#x}o_$v0nrMp)aE)vIneqzT`m?bCiaMB-lzW=}zcWCstG%K93+`qoST|O9$pSgL z0KN#N)h*e4zLc@02C}a))D%z%h5BIs8fZM-zd^GES1>RQFX{UQoKJ)r_Z7uBpt^OR zp-SdX2?h2UoXnHWIo{8inVx!N4+Y?j2Y$GFe<;8NAhcE>ws;EARe=!=-@$*eXVH3* zcc=$d#P2d_NmuImTM7l}SL$0{0{sdMi0Py55K)vKF4tEBcl;sRZQy0xB}2c0P#kPT z;LvKSFUuN7@Ap4wmZ5zl9#U!bT5Y57h`7Y+OeX!%OF&hU${Iq+=$EK!ccB8Je-)dg z{13#89R~%P0ytrHecRx+^tGOXje?TplsQrSR(wEGpD$Fftc*SZ5vZ=A6nNwvb^T8$ zAo-{l9Kz;@6m@b$3BkUh-V!gPN49?}YT7ty;geMA8{BGTD8#TbcS99@1Hc3*m0pCN zA6f#}vkshy8|wO%)?>nVRFQufwDo&_p_L4vL!680kwPd}h3Ti^0ry|hzyk>IO=A}W zOgBHMG(3Vl6oQ|(zM|RjvTW`^X@yKN5`wC7mU|7X z+17Y*0|uZe1XgFDrXG&vdOdoH@%U0mDAN@I5U3jGFpU?;QVmr?62BfB_v4oo;N4hV zfplOf2iPHlO`(A3Q->0qSC}GqU6tC=0k)i0x1Y7(8NhT_6m8(Lac0hH`| zcBMk_NE<{?JmD^-XD7>r8E8!HBX9@yeJ6a=aRm-LPb(D-3%KEEoY--%!k2)tQAJ0A z9hDn+kMI{rh+F~LVkP|^u2M)E+$2ISav4P|T}e>)TB8<@Eq6al=Zns+Mfi9SRHAfM z+MPgXH57Z?uR(I3$M}a)o;BaK0K_@v0cAT9h@JvYt&e?5iVFe8jDN&5q%_q&*T?){ zisn4^S;$pNJeir$g6sQ-vD=d}Cj>BY39+sT;#8;>k5ftNY{~Z@`nkq|$OPnyA1m-S zJO<>5kc&m@MX0(}bhH(AGH@ab^QCV&KNpYoKzNyEVF6VV+ou8*wATl81gZv@%nA{& zXM9a45q2KXh899{1GyM^BM9Cdj3ss{)@QMWYCadcckw+^@oxBL+VTKxva34>{&l6#lDoX@KlG}3OD{=qA zSKXD&K;CJ18=zT8=sTbpk-EQ%Ns{`+ucJUAA|%Ba-2$UN0xY7t?FK5dvXxk z44L&8;4xJSb}jVtXfG6J;NC;q69eeZX{Q2G6B#ILgj_1xT^8C@1({u`hrFi@hd25V ziD{Nem*VwOF}H?uywVrl_LGRETQ3V2Cp2)73}bIHq6rl|u?ZsX%3JkFgRjSoD$(0; zN_vW27BM0CCsPdr{AApuppvqc0X-jzwxz!YOGX8-|47~W!kiO+YFJymy6T}dGCrY# znO%v?WIL;An}|2b=odke@DyNvmG>^MCf{idFUYjhfO89(FgX)Ur&`arN5GAeHB`FM z9c8|Z?ve2_+=0;+g=e9+-Z;1w+_3vi&XwLbTu-!)W0wN+0`g;jx&I;vmpU&<&-acH zxuC{{xJI454TnCQFo3?dRmN!*cRw+F3&S=QULj-OQY(t!*~8hezlv9iF1L0CO$~Fq zZ)nk%=z{Piv4XJPlf|Za`N)`v9@RkWE!_k8LZ@|;h zb0%FPEyn3U5J?sq_DRLyY}gnQ3WmUyKK(FnH+VT-f{^-*oQWQ$$2Tx{ zI0)XwDG@B|Ysh3}ZF<*im!As*$FXWKf>QaQ6sj=jWS9#EPO~Uug46(~iiQr1*1X<* z5@r}|gbXc)QwYyiQFUj=CyXZzau|0H$mqRjvp)}_Mm@M`;H$6|1D9ZUDEw@Jirj|1 ziz-si25Btf`g18SvWtAp zx}0xpQxHyo*TZ9V=)SR$0o=QL0R&Yjyz4U+0rOPyPzYUpph>b%k(s_x+V4^zP8$&d z_j+X7cQhQb--5bt=tFh?_l#)w=~m`nks>|Vk^l{_xf|3U{>;8*mRj8!MA}rsANU72 zniJOdox^4|T(rE2wT~_TLTP-)F;r%%XHYp<)m6jhfEs@(<@U<-5VN7yg=C`rYrIH` zBFK+0MN{$b%jo%38Th-HKTc~O#4f?;Px$HtAHc`F;drK61GzaooC8PM-5dkCLgqJM zwP(j4hv5!c{sm;|kcEE@;UT-)6V0aSB;{4zzlg_ouAI`-A^5Ny0($?mp-_l?&50jk?tGJ zcQ7JABnO;}yWs^y+TYYJe!goIbV2{)&$5nn9AuAC$IC=;qP${)@JFsckq6)_mL?tvORT z({c}<8vMSB9vu!p7NV&;!@@k@MBkoCdMbg zZCc4aV9Y!45`1G7tS5=4C|VsX1MR`|BYpt~zzU9#fsTYiUkH4vi}6Ys122fkfBbaX zkE)=a^?AJg!n<5aq=@3FkeXBS#huA1cv%=;rZu#YoDgXf)Jp&=*5ki|z$(O-HHou@ z_mo2cS8Oe6Abx%*UKIEqS%9%3ghFAC1vCGI&9GpDK$4c9B1TsI`y)ub3`)t(AxFp7s8&D)pt5C2u@<%8^> zG9kjTBQWbL`WAEriptTpjySwT>73erohfzK(YGBNsRrND46aK>zKMjSX1^4{1kw}2 z4gsX%L)0*z9)j`?99>fi4^Tm+=&j<#8Z~2ug|-q|dL3vfv#$m@>of^*@D=kpwfQ^M zf>U@?`>As++>=mudB?y^<~bI&i-k97OL8)7<2xDHLB$8P<_%#N5@LYhgPViI<;6?|n&%9VRC@6?si@L*MX{AyW3BDI0Az+4 zc7(cTA)X=UJlfb)|6Res<^@54*v@r4otKajJ4BNp(&z`c$?_y{BZeksg}%^T3Q4{% zE5K>cKw(%0WYc#dU~9U8dz6K{4A9TU=rj{T+f%nKJ)1Hni0r`VEo8U9foh-QrUr$J zC^iV6S$LI-yB{Q?+~Eqvhy#PCY zb*NFFsSND#($m|#4eZ>Ju~SZHcb8@{5C(`|DVD}fW!|E)nSb>iRe1mv>e)N#!Taba zyDTjIJ4x~*><0`xCvqtClA%&8s`gc?pQQ@BF0$aJRMJ0MVx|Wsu4Q@jo3$49koNkN~FRUzy6I7w!3@h6y*!Gw3JTOOeixxU-Sy8b4A> zW`|&2mVKWFg-JNn8lxoXPa_6tTCE5 z0J02@ks?sN0vzkWhr%l7-*7xZs_r2(LxBUJ_mI~G6dutJCpoay1Q=v;USke24qlo} ze`Z@3X-)#5FP!;dI+V{AaE3o+Y05!NV?zZ_jN~p2$sr8}p$Q!Vt8{mSdzCW;+tu)- ze=BQugu(*>ZcJt9Gg2Dj|KW%wfcoiJy2YZ02$Y=|(D(SjrS-jio%S*b<+Zg1;w4eF zL+Gzk(xt|X%zR1OcuBr75S~_s0i-rG9RcbICyxVzLjw6-2GIAQ-h~Opf!Ml#RpX! zt7Hq6D0(f&@Ees!e?ipm)?dQM*17B9Ag?#<2(f7uGp2f>X*Jbb2|Wi7q+-$f9EcHR zZs}_+TVO-bYQP^uUg~+z@=7G?DG0?^jbyt8Qot|Fu^BuY2GFu13@YESU_}G;gSg8< z?v19oa2i)PvxAv|cR_901AKRaoeJm*6}4#GF$^pjd6tOLx+ok+n)w%vXd29ZS#`>r zTxbPU2I3O?yHUuhfk)g6kcbROBDmF&;!@&H47|E58oQ;r~|w!wQeF z+4vhWL6|ko9*Tw|jdhR3tebWpalI^kk4y|@CossG+{%41oID$4-iM#pkX^$`qtZH; z^n#s>vyFbj6vV=vK?*{sMZ|9)&oiQ==dv*z1~X6x6*Z&%a2i(@EUbkNA5Zym|3KO8 zDzQ-6qN0w){sB)CejKbcG>`&y2R0PrnTjW7Xnp{gZ;FpvOy z1P|6pox^P(1-h3ezs!z_DTrb3tLcSU8$r3r1`AiErT>Ng-ChXsD->(OY-bUP4HnMj zJ*I$qwUFF0^ga^`$AxGWloo=o zE+j(>Fuk4+9cGr8KlSdWuQ32x##E4qXK{m^K>YkLHiM3g59i3)U6HU0$b~|+LG&7^ zT+qLaugT3<6UyDbI8+a9Cb8{D;|+kKZNPozo*&#NfItCbv5E~=w{f*vHirnPOh zQt3H)`6)EqNkGjmv{Lo%u?!4sbeF`0Bfv!3IN_uA9{j-A)@}6Q!I8G_Sb$fw7fBjD zwmku@zo}p9zhlUV6?@X&8n1CI+~uA$7^%m{_6@_+LiqrT;LUmSKv8IMa}|sni^yUH zI;RllX*s=E8EM*JgAesaRKpST57MvMjf^v-W9ey7LMneXB&g60$HV}!lE2e^7(yxjnZ-ZrAd=LxBnnl4`CcKr zD@0Qd%|}Q*KbH#cA)mcNNsZ?=nP6)PV;$U)_{a!+&)EKk3TmXfX8(G|-Q*^&P`o^n z2FD+KkQeD4c~YvlZzagm8)Qfh?F#s#Crt211I`!yv!Fq_`x!I|Usj;51R9cwf~c%# z9Dh-^S7Q?9qDPPmn?)?^HP-eE%Uxh0m+*MFM=b!Zgm-mF4j<<3yT%a1$D!JMzJ$eT zV23>%e;xvGoSt>;zdH7oE+^c?CQ9OCvj?=$^`9K3NsNb~QzD)p7M>Un-O9xHIGD7G z3+#V6ROg^V&ET^*!)H?WQ)2H7LlKh^MpX%GV3y+byT4DW5iuFy)Do>PhA*$UeJcN2 z40M_CC%|{bMI1>{vTL>UMTiEA?a;{cmElmS0-CtRIA8>RR95-EkY`>_6}uv-8vik; zi*CmgLYRtrH+x+P21H<;oX__lg@|3@%1tbQN}(7AgAM2%LmP{#YX6&C$Dl%fltBVL z%6TFu*&qc2(7o(7PPE7lh!B1jrx@gy5cC`#8Noj@l!NCBw9p&UmjzKi=Lh_!A<6w* zhdgf_$R2$T%GbRqbF^UF3Nrm_93ngaP4)v(=QG42NwoJ}p?)|PMish;n5S`B32+eT z)#wsjLhcP68iLfqerP|I;C^y?}EFgBob?)6eSSW@#m3Tu!$dl zmRM^)I;p5BYxa>*VU|T2-lkEXKa(a%@u6Vc6r%tjdojCHgXe>~(I6W_7AkOI7}p=$ z-(-uE7#oclmkVS6Hl$)99HGy3u5cn~!NvG|NbQ3<{w*f7Mp ztaCox=x+<0HHICe!$_5Vi7z~%`pr*!+r)JK&U(FrzLMb@*( z$E$<7?|5pEHezSXPh5;L3;4tjjzSx?0e=$Z7H=H-z}z{cSx2gc2VWp3AgkMRGQ$yM zN(Q-Wfi#@TaNp>7S_S=MeFOPs*l8`8j~Zg-^ghpRZnvCt>L_oI%~ff99F9Kp8&%($ zZ{%U)-jW-%w*>WYH3Wd$>_-Z86zD259mcfv>0lZS08`Q?!#8565<^}jN=Yq&8WA?p z_wGyiN(%QSoB&sfn=PTTw~z@GyJT`-azB(G4H(=C>b2Uz7$o^fPW_?JCoLYLGH%0 zSVNkn1&x`pLpnCWB4<>1ZE4QK$3XPHwW9q4xS_^` z^>gH~Qe^9L4MLu{-aTkEu29B)h(475XdMQA^}-cwbiy4Q&TyqN7S!x>Wv$QPCk3+{RUSr2tCBW^@3q;|PL%GQ3A=sFAUPv{&i=V9P6H z4Rh>K@P9K%Ls0HKHo#CR&l=PRDrqG-8P$Fl{~^asGB8Zw!0bf}-@^9chNpRmvDX!KKtWV+QM5Bv9Ud92@5k6e6B9FT0jmGWVOq;Ddfc$OlJ4sc|D^9%3 z;#gu(#pAOaJq=%p$0^C&^Q`b{{;pvubHcdLgp{`f&@1lGvqpmrqmZAg4}gm-jRcE# zW-K&*4GxGE|AeB^Kv8wiacu&(?yR0IhRt!(o9yLqC@uJ>LJafM@#!RdT|s&KfF`8E0a_sQJeR( zI}g7c2})-I?22LSbE%rXHuEZ46MM+9QsG^vtVCgup0G`6=r`d9=SS!f=~F@sL|~l) z|10NLCXydvSm$ef1Y`?<^25)JM?`4o_y~T6Jek6!WBiyL-pTt(WKf*Vu0g8-0?rQ8 zY;?0o!5v`mze?z-SznO=A>l$Wv2Z=lfeLviK0Pc=D#`pfquOV)L%1+SmDs=?Cb_LE1RdxYBgS zB;3Dz9Nx*LQLy00&I0$FrtaBLqj$gBbD-m@FazE&J{=`2Folwcv`1PoI{khADYnm_{K}G>I!&-)-Eli}{ING}yuODt0Clen!KAWL@WHme( zIx>U>!-Ww#=N9%iSctFSp5ZIUkzYgMfzl<@acEgL&-zpG2b{8ArT0|$Jko=eG4u&s zC*$sqL@Vggefzj4h6@F*g=}90da8Zm8aoQ->x_4wPWM7SlKb7zPM!+v;vN5LO$wRN zPerR=rz$$eR;G6Tli7|8!4sWF{GS1dTm*?#nF1B)Td>meH^A#pQj>Gz=o8vr$e^G= z<}OCVnPF1M({Bi-#!<7Cuj zC|2eLrqu`8rb}_I4!@MtZ=~L@tN|}>$QU!^*cFNj4(&+WF6+I|mX5a8V|Eh%=Qxrb zjC9BTHWsuG5tgyv%hz1vXN1s)K}%MT#|CjP$E1xKM7euM;O{0(eS{@T~hLaV8nf(oLe1_ zzGX+m;~n4*pYXcnWGLC5(Y=?7f8^94UXb^mp}uo}s)s;6Woo|5HI+BW;V4K4RPT)- zQZSbLF;@ufHW`u(Bwk^FCExg5JUWO?#cLMwkMgdOI7{9?ojsk&<_}G|BxBO63r+Dx z(aLEDhc~Ak`#}%W+A2>?nWxG4md9w4Pg)+ium`#4LUh^!p~Icec%a( zckBIkB_(ch$)*6clNZk)C1zwep6N+vjq$kCz-7tV+Ht0*<%ZD6?h8C4Z^hhmL+CyD zVl3#BKrjgdg&JZ`7Ctjos~lgou0GjH+E&+s6vFf-yXHVDLgC_c@S{(4seWYDXwf6BB!Isc(Nt)Eez zmQ(&O*oC~ZW^O0+;}@|X2JyRPEo+5P(+gugFQca%3L0gmpb!rm}^PhB}ar7!?j=i$zY4EPgR_A|EGcDzT*S1~OiJ@Yl7 zw}ug8D`$y}BF!QGCEQL;URR#<)(rsEfgn$SRks;ZZTx^0ZNvJzj(RzNGZmU}vTO}4j`9&b>D&~XfOtl4)bHqT?9*A=*pW$8}^WR8N7 zVI00N3C}j=8XfFP2G`14IqD=At+d4jH6{->X@c-IjNOE)w=o5en;Gp1n8r;fmDo7W z^~DNw1$61bj+I*%Yv7rI`(&2JbUe7@7l&Gdr9;TS35IOo+^`Ls zATnd^6!KamJ{=DhV-s8RxTtyH{_B*aMGne6j4to-ypee?WL{^WWTJ?)#YJYaH&$9p zmEhh8w@L%EA5ow)Q_4+F7nTasLGy$;Jscp<=0TtHbR^ppOq#7!1)5BMQMmx0QjzmP zGoQd^I?>XP>l(q04(Z-x|3u+=9cM*36KbCp+of((+kL^_H@{zsl>8Hn{R3_Ho`@?p zFElh5!>tUwA(3Al6}x)xr-me{^8Kt7kQ7~uVlPT<{y`B}xwTP-5)SUT5o20PxDhhj zEhJ#}febE3ZrdCX7`?rKN+2(%YIeiZ?rP)=^9*qzg6L9)$4-RXgEOHso3OYZ6j5SDQ{J!lp&a|U2d?enzn>+|%&q~R8BWKZ|Y>+&adaGcm zC}w8Jt z(O)+JF0AjGZa(NhOzwLq_f9VCV=UV}kJV02@F;&a7V^K?ZEsU>WscdHj}(Ma@_7?OLH9Dfyr53BeGb85$> z{GnY6rpwmH&0loX8a^`N0;LATW@X;O?srx2`@NNYm4@f%z||ygXyEdv!t!)ID?KF? zRDR|^gB8W?x=`phfl|Jh`~nsL735<g;GW6d-lmFwp!}AJ`xCazH+IH0sSi82aPw@lAm{nY*C@H z*-u<@n5%eI~X;S#(t(`dc@Cfz=hYHlAI`>WwECgo-ThIOeGv(kWHws{^tCB^6TYsT5G%0Tk#d;)I? z0exHp{wtCjhq)|q06@2r(ZTR|SCDV#;DaH+OEmk*+EIYH#S!Dc3AGWvrs;{CIan0A z6#)fHng0~Z{d+KMv&VpiU^MPlY9@GLqUOPuhLXRtEj!G78_Py0K-XN2O%te6Zk-AZ zxK8%{$#`nq>>`M5M$g6>iehh76`riIRi~u1%cgCTWP**-gB098q;DISVK5{@tH^no zpXhc9AZfu)HN6Yv@mx@6HeRNrO6~uOIk+5cypLbEknuqvy9NDmc`AL^d3UeUy`623 zTK@&z)Oy$D<$erjo0X0n1i?wSBqddb7sdCz&R(5@-K?Rw6!dPUuaom~x|egj4E?d& z4OE(J0NUDf^H^YLIt6@fx(Y!KHks`inRS#MtAL#1)5+|1IolZ_l;LH7r0u*uGk~gr zg%@WLeE}}QpFxIKao2}1vNMblu)y?xkd?jhAhFjAih+Dnp**0I`tsl7~4$~;c z{1@TJLYM3Bi6lVHz9LAEp>{l60fNggDc2@teZkyKRw$5;&4%K$;a(pq^)}f-yaT`v1Lz4VL z=G$~`MvNo@7So4P&kY2j)$T_LJ4y5kx@qMrweU^BcF0&r;u8EOWH(xLe;}jjQJwas zv|qGTl__G1c{?{j#tn^c4FPV;zpUC#x_SIu3SG=j0sWgPLY7Vx=to@6bIW;mHd#tq zCN|#(-(c^Rwn1R~`Z$mG#!x<+hNMLg#u)`&cTpktk*sz{<_oZ~ligK8C3rSd-{U4N zemyF`9=Sd@?PDMUPKc-K*eXu&XPt(B8&X26@=nb%suMQZzY26O;VvcdhoD60oPu*1 zZgN7_?}n4!l*_|SJ2R8tAr6c>cE8n-!6k;HaOrL`SZn+a3~@+iF@9tu{@2C^=u#`t z8xE-gS4XpsO1nhDZRC}O>t930mWY&-$#`oiem(?$Io7b%IIuP;3#@&3@aiKtGbKqncVDcFPn5P??RPl}iRC5mMZ>el8l49Mz}s(L zI>gJd!(r?Qla2l`ex?$a2C<)1QNFzQ(5cv;*-4D>10G0(fu3t?+KU8f#$a`uFFez$-0d=JksT0-C#|=-(OpKBT+@d|-GhY}7S`lK1 zFlbnGIrdaS7yf=4&Zq-qaA^f-no%K{rFI7LkB3054XDvoy4+V#_ML|h;2SpT(YBxS zKa!?CiWYUPCWkOQ^*86^WznANN;3|z+AI|M!)}bj+q6=+_+(8uQYWuV4X|#-GFi$1 z&2^ZCzbQ}V%Y)FXj@x7G7Y0FFG;uX$&YXrvrZ}gNNlH_P(4KCsX4$a2wNUm#xQk_a9y@jrE`it&?S6*5IMXPwj}p$@ z$h{yXzX6+5X01Fba!ZDeIg!VcT#GPEeCPzXF7 z!96Os?He3B*t6R9G}H0}8L1Pl^nGEtQX{Or{0ILN#+#M+RswlUQ?So5Kr?e~xA9$= zG1LM%68}3!QsZ+@#odkk`cS%_y~Cu=0Z~}ayJ#Vw6npta5XF#}lAu1QsK{FY(m{%I zO(I8BlFufYj5CY6JNv}8gt-71x&_)r4rgY z|G;IO27zA+X6`M?_}e@}#R%}c5p5%`3dIlVq_7PRYC?EiJ@cR;X9kQK87{Y7j_Q8V zda30P^P|R_+>z;AU$tc*njAH{^$IVnVBw_+e1KAzEA7X(Wo!vkX>$}VtW8S)dawxX z0pxN#X%44G;rGqBo-wYGSc|YfT-Xh(5U~8zPzfx7@v4R@7*><&;iP#uJb2H{!Ut2l zxAEW!W@B@tbc*q3luZ@d76jne!1{X(`W{7?-oer<_^Q@&O6iV<-9sNlk^4#Q&ycem zxM-hVlylB8O#ux~?pl7A!?hZ|BJ#Lsu%-~mB#u+6odOG9hB^ixm=BgZ8*9h2#RTB5 zVBnII`(|FH|v^l_UeFy-~B z^gHewT}!yX7a3N_o#|rH^nJQvx$K5f#GLKP!Y^yH#{^`%N<>ih^knLnu3AtPT!(DC z%)Jj(NE-Gx8TpPoRzms+{D+<6z?YZ2&an<9+Ka!*0@*s2EOD3v{vT8C0vAQu#{JL0 zj?A7ec5jveMi`luUD*{@SYbJ+=&rH~0*Z=?=K&U6<$M%P6AcxQc}gu$q*!ElHqEqL z6-&!Z%R}WMR4gk?Gb=6az1E)h|9?N9+NWqA+?~1SK3v!D_xlQiM#Bo=R)&acr8<7D z3Tq058oquc%uB&-b@NzilxQmXt)m<2*~??Fjh(+a9F{x3JExZ`yIkGn_UTbIttBPM@a&Kk#?@<<5onuBJCzw%R_TJs-*!G%rL|JhFQ9Zz+X=#6C2<4E=$n z=-13g*F5$KhMVEOMuyanwNtPUk96EXXi1P>_k0KMch`=-e+C`~*c`Ovgd==sA1dGc zuKLLZc+Y@mwaR==IC?5v0QcuWMikFf{6msP{zDoq0KuBGLaSE2!+dJ^f zj0)w}q~acMgag0SzCd`81D%Of*+h3kfmu*nUS-qk<&<@~ho&w@dp5ncEbLf0_c99s z;TYbD6X==}_>&hqg#&V=4~(14cw3!#BJUFh8FKq^%54Os)nGhDTL|tKCppMBinLJ7 z6WSCY1R15XPbc1x@(aRwp<6rkIp#kE+jGj{z)B5$GA#78&X5 zhE3YGNNz?EOhN@u4Rl)Z_E=2G-*wTiN9!X7X*7I^5EuQ+L)*+U)RrmIiL;0J8rNM-F4 z;D%0!*GWF&D6+&x6^9gIu?F2-u0n$rzMjmz7KA0ojT-S){c5{G>Bcl>XdCKTLY1w3 z-QqA{k=ne0rIVmoZe{~XYc!-}LETVhBAIVPk;qFGc%ue{3tJ}Iv&{i~$tHcSX4x4k zl`OAy45iU}7a;wCGw+cs;_2Ej5Qo&UA(YGBtU=X}OXA}+I$pFwK?w{A+!67FMAvERpRD` zB>tjW{;ufZW@}OR#eW`ds|}_PnATf|%N;9m`GqBM7&4K5T#e<4;}w({<<`aY!nCDc zHQM&6^y*EY>7QZs+ihw6jVeMi(T}k(zbn5i5DqAH=-8-n7lWS__E^y*@>gn&co5H< zrO-Z2h0@&V9rvkf_d-Mu!;~S2(8H%T^$V0ZV+#Nc3~+r8O6s8qkN7jlaG>fs4y4?e z40OcG5OP2XM(kMPovclR8(~x$s6#vFb{_Hu0>CQ5%}YmWWEm)?lS-4GtIb{kKdbT3 zz-Qo6&P=7ISL_!y@p|7t?q_v0x;ce~bF6RELXwL9s^2U+gFXeVFX7@eOhpF7pBVs! zqA|QeRe+vly9@65^EN`wj5T;>U~70&jW=w@uLn}tb4Sk}k!A6LH)m!Y7%huWfKlTp zd8TDtjW5035glOves-PR3`R5?4e?^le;LDV4W*B%>d~Ipa*}dwSWd?hp%`wcD;ARO z#V{e19JDdL#q@@&D6qroJ@>v@d>Kx$aHNjTqm9NqZ$so+BkYlLFNF)+BjDVS;KFdJ z2793GtI1;GnQ1B0M*my#N$cB4`;wu!WSPPe?`IDeoN6wqFO4Sx1$>Hr8vb^*tgsAq zk((@OJ8%p%$8#O&bV+iUh9p*jX(29UjYGv^#H*uu)HMwH=Cm0h?Ira-M)U?V@6F*g z0##i9Px=5^ULP6tCqGf){k+yFi&zjgQlzBM>|tC|n1FrZ=m5Ahh>}Dt_ecc~%48+= zFe0e+ht!~yEq+uU=OWBF3>xJxYsud%Rhsr!lQHE$xa%>0CLnApc`1uN;CjyFq)hM^ zcKd_>0`f4BdmJE6Go_K|J<>PR)4um*D)BMQknqa%SLls`*b@f#UG`V!KJLS1+#J^N zmy8PoVSU4R`x9$y3ilP?Lf*cp0obVNVk}BDN*>c6t?udH_~(- z)N1D|0fFBegodfoMEa8>k+>=^{!Di*NePV#?Rl4^2 zW|*g-1Nx=X8odpskVnq0ZiW?YO;URJ!O-H07}%Z-78btc9@g4Ere}WZYv`No(VAap zL$QQb>n?H^+b@v!(PjX9O6418|4kAVF3`7Fvkv*fvv{g^*2S>SgVcHwJ&vs^Ms8`zw? zOA}U+5M4J25+*j`Ow&~u9VDEb$ocz=`;!VAb_fH4sRGX*s2HAxch9O54hQi8tjFE5 z!crN4u^NTwi6&!}Dpzqy6_GN;{wNnOn;uusML65t}L!8K8cj8)J>Tv#Jh4JA4bLRj$&4B2>EV3dT?Vqnn zfnt@=uCNa?&u8gn5EINts+>0Om`V4QH+@3|F8@YWlg%Agn#NiS{h+}rNcqe5Q?A^P z^$9#|!9X~zVKZC_B&SR0KaKwwMHe@#U*n<|v6;71uK&QqSZp+0Sql1r@MOKJ0A1*? zdMM8Y2!3j#Gcu{(I3bG}!M)KhZS%wR{AVo84Ir5Y=5WerAJ{dQd^{NDRCPW!j~hZ& zS^Q*;5&VUWw9n9j!0qXmb-oMi3xml1a4SfM=1W(2ab`a5xW6kQv3x3r85rDRvvq4Q z-zj&b%0~G6SpVu0ipun0oD`hg=(Y7nsi=up`PFh{ceC!IQrNAubYBDqdKt!~egPR{ zpyzP37@U;z@1*g^^I-9E%ud^^Ar+eX*`}rPn-CMWVRf2p*`Sj5arj9hX3!LuV+*Vr z_(1M=mA*f+3E+HE|}BPU}dkn_N{0-2=I3cDY^etsJ;RO&@9=8<**@qoD(7Y+vs}ab%NyTr z4kP{hz^HDbLa!cHh-CMp?cX$5~smyIo}GZp4`P)^-aAp zm`OGU1evbnu14t>)=!X_CWqrJu_^J~NV#$*i4TRS0I0QK5x;0lLrZ%p*Dc64g2uLk z@Q$iML4U~msH6xLM#WgTKg)!aZuV8e+)eZ%JhzkSa+uuP+{9kk*Ko*Oud(NtE4zau z7*+VqeaL#bW07oCvX5nl+I#130Gp-%`!#-7*Jy?>aPseJ4E^cmhc;`1KfROtpg)|e zHP-i{gY|=00kJOkn(7mhNBKwM(v*rh4X&B4O5s?X=|C0 zUekFr*I~oi8O@eLaYI7L9sH_p^7G8ECqYfnz3NLp!6S`z#AJjb$@jvFFvKyt;BmQU zI7fzoL&LXb&<`Ndz*goenwxaT>Ve`Mawt+h+h$X05`QA{nC&3fmPOa z57voibrZkGmT(oE4>ZO?%V6wR9z2Z`*GNb&ORl9L#a6Nx;&WB*ykb;I!|8f&z6<%c z0nz72!hoO3bz9g_X_V!fAF7&bz@Z|cI?lq9i*g;BmfXcP!ugS=EA+h$j5p(@IThUq zvE2I5>56>i65FElJd z&~U6Eyjj5(NHs)C*P%%~yT%1G9YC!|Nmw2(h-_(*3-S}NpltCL-b1-T_Pk1Is)Q~Q z2kI`TN;79l{64cdin7C|DR{Fpa}ie1H(C9fdo+Zq;nSgfYgig>*iC-W!R&;CQ|k+% z;tdj)XRl2@MZ<~sV0=cW)f5!jXEbO9zZGW+=rt*8e7RHOV6~3_WQtAc;HHHc-hhW% zIIG9)+2>Z%ej#at=L~sI)%w2SO&DUq-NNvf+iS>R7HeD~H}Gf;KUEs%4McQ<5iCV4 zxzwNJPJ&jYxbpGS=I=;DJY=c3OPkV9GcsFLt49_a+gwh?+FM}Lczh0g+-$7X+I%T} zx}(L@dK5M2iSW)wS*)%3ZJ8~$`84JwTu@M-WPU=w(vb&ofwOxV{4L{yF*;$yYA$|& zDiVdeG&+GnHy--ysAxIJifg0?Y77N1!)rCmx=*i?lcLnf?D*HNFy(MgKCctHbI|?T%SAORRdM)>dqvKmF>_i%wM(@M&=Td&K z820Lgm%_u#%P_|SRbe2-kjxO=0+4%w?d`%%7TQt~W9pWeG3Ki*q=cydf{0>xMcvNO z|I+FBkkMyg%`6amvS?q``_30CP_!;p)3JK{R143TvATRc`7n$6Mz7avOe>X#YbT)X!Ighzk^M0)8|#Q!aCMF zqtDL#taLWx`Zevoe!DuE$e5eh(?Ed?x_mAnv1nO3DL0=xK>|(2W_iEW2$k77eOlur z@pJC8wcg`iIu?5J;Pv?!GmUx8FlRdiOr$DPKcLOnR5+WtA=PqLiT1kKMZ{m8#6sx6 zrp|^&*jWHK9rS3|cbJp%Eoy<%n7^gl=|9P=cNBC4(uf`k?t|QX7wmt7+dY99W_eea zT1u6JY@X#eKkHZ@RSEiw0uj`n3aMk6-AUg_iLQCAhb$<3FXWOcVVmZ{Af}0aP&u&6 zr2RfHK#3zO-M_zCuS9LmtgZyF_<~eYlw$kaZy7Ch*oKK%y%g75uc-~qP^~~L5H~C2 zT(u@2HRzRGf?T|-&xzoxF`Fbi)KpAngr%OMpYtcj!R6QCs2Vy=Fh~xkCqnFNvhY0q zVjJgG=s1{U~mi5>e0OfXQz-9{hs zn(5DPKnaco$2cZ-Btk+@?v*#8iiqcE)5?1|iNmBUSn#T^ly4Vz%1i6h-O2S#+|=~NxFyz-8rP!U4z4-XjvU#6oA4o^Kr z!|0yRziNTz{cHf~-x6mSOf$34;lh+@UN8jS@0e zTW8AXHyb++{(xCw#xNrE(weTBYPM2M={%$l?Yk_rNr1nW!^}h^<-)-o4cUFr_Fd~n8d*lhf@CkYnePZwH* zUG^h_A_?;Xb4OXXhV~1VBi_vg@4QP@MR(YbYVtAfb-MNF6u7R{UnruSt}Fe;JPX6L@iF`@8;C4EPLZ#4bfcrVPdTBWL*?kb1PUD333 z!Deg=q6g56v3QTxq;eJb5qbcjRWQT<>p5JX zUKjR2o{qQ->d&kb{4j1>&v`4JFHJPoYapUrR$Z00Qmgd;qIv<%au33dL)uavG4$<{FPM7VPtkQSb_%qQL`W?BTSQ#%7!qO+ zlW%SGb{xTEe*mqlSzOxOi#&!U~Uu<4UVB*&;;*n90fQ1(J&kpo`hS= zL^vJD+L98D8v)r_XA9u@==v1gP=9qqSeGMTVkuz2 zI2yyN>C5pE(DQY=3Z8GXU%@|3r4zEl^s~%-RltT=DoUTtnVg`I^UwBKehb9j9&!O; zhZ%lR@iK3MQOfP?w0~f7fvc;0Y~T|p$Rd(FwV~ZjNhs;LvexiC-DEfy>Xm1{R1d%R zgFjip=NOj}!hJ8-hgUG^aE>)T%EKGa_v#^ECQWlp_C>c%NQg99lNgI>iDZKbP(io& z2qoj~`!9TQVH7b7!Y`mc%B*Z1p7sS9Y8Ll%>r~?B(vZMSu&7lCjY>0t8G+zEoWqe_ zl8T%*A`HWsThFa0TX|DHcu-jHy3OyZmN$_wLUQM~cHvZVdVzk35_|95wO9H1%A{W@ zONg_*o2xH*rx_|Wt^>x_NPb=^IWn9KR3JD9E2RsTYrlYW7Op6%GTT!nX#KIAls|)u z3xdP&{_BPu)Q`cfgl3CpWP5-ZLuBK)H5xA%OL#Y{WJI!j5OmJtW^CrCgfkOHXngsh z0r7+IH(VWHzhwH{egSvG*HjQ7;<}dpTJr$)5A+*|>;0XaO*2gZMkge0fj~T$=_M6e zs%-Ct4{}i@IKa)KI|@fnM8`E#E)36u=cD1v-CC~6>5%zCft89)FY4mS zhc`H#EfKfmHkch%!O9YR^&cIzJ!Np4@Tb=Hw?@eIpR_)o9BMSp{<_J$r{GLzbS9L= zllLn4(L=!4Rb*Nx(@zhI2i5ivVYkT=-$k@TAdo-}e(rW7s&3-@aiMbkt7>sb(=|&y z!uGhATR0c3l^^l%S6CP%~BG=ai@2Ie-w-wLPvz$Ik)M;I4G^A zoKSr%M33|RhZ}L>Yw1qD9}G*>xZWUHdK)%}Q{Uj1N6{5D7rU4!d)Yrw4# zHs;Yd=>GIcPaJ*FxI_(`gE?&JABMwqa6th9N=u9%s2aRtt`+>dBhat#DgTtkFn&wV z_FdvNCRDh`S{5+Qp1v@q8(i~8|3-8-DlV&dC>#zUYvi&-R9ei{*zkOs2=;Cj*eLRa z8=I&+y`NmaiiP8Wa8(6CUHQmv_ET6!5B2Ah`8I4E?xMdUNds{oK?ds0le{a-AU-wD z{ttY51aT=Cbe?2h(ML4lqE>*P8B5)4CKVO9fz0)XPa+z=tDnMRo|^GmjIhXvw!7Ig z=v7R8QXV@Hg={-sV@H+M@%vO3n@k>?z0^9>3el&?yS?eRFuV+WMkCM|F%iY_W?M}2 z3X9qU!uz8z`vAWs+lIuvVvo7S2nPvTiyDVq+iIZU%Cib=FkR`L=|`J3fHntn?#4b_?f=05d+s74i%= z_QrYIPm#J#EFl*#+_2E>+-y%Jxwj0-ACezfq6wjEh=+AutGie|u8uacwHNpEv1XI?ThyCPhYCG(hFQ0f zh8#XANNVBE2J?ZY3l?*M!hz`lhsz+Gm&L_ES3S1{2VkAm zG!8!2z&2y+TGMDXGQiyvFx$nVTa-UIY2@Cj?=CaLN$3XXTo;hVOZGhbF0 z@L;y21?b1CX+*)IgM1idYbjUC&ocdTjw-cCUAVa@F%}$c!tAb)F%iafBO5tdM4Vq0 zd2C}m@M@mxRoE~F>M`Lp>_tLsO1rKQ1B3GF1`{O?T{|#FWO)a4wFD`U?km3JO`=%a4Uekl;6P8)l68d z%lb7dPUNj2j$eH6*yPY>U0}!*ee=2OYZSx#`v(@FsN)A^Qog6I^Mu~Lf|+IX=OI)p z`~k*i5%dviIE)>w%aH1#!gFBZ5b_~QfQGshkl7^_LK=eWTZd*fsQnox<^%svB==7AfFVs zucoJQBY-R%#_Z%qsP$^Ox_j>UgPEJ2h;Q)5erM|COUd~;RJnl!_dwr_H$5TUg6m7; z$FO0rsz*4+sg7~*pLXp$A`XV13h+!m-IaZA4s2cuYr8|_Hs(U>bNf>AX(D%0PO=)r z>2^Qi;y`5ljnE3#Uh4iD%p|I);rD86qkZ`HNIH@#%a%Fs`@pvVA4J2HK2&V;OEB%oB*mwU-VJa+nE~UkE+go z+!rtLhyn7^it?I5$5~%XmJ&>6{TySmpC4JLgQiNdJY??*NCYzBt%eV9YcN~g@vB`W zZxeqZyCP&L1M;y#j?g&DD-P>qF_V$p2%vXZ?)eEa7FI^WAD=mr6O4zux-*D92rG)* zKc(c&2vQP+{r8#%pOU}0z9G`DT(XL;1*O^?KBnVtN)8y;3(U1+<2lqk{mkjRCtvSk z`$~z03A&zqsA-HMZyrqg#B`JHt{)#jhRW$EntPT_x^m)d;kRIJhz17%c{rBYlVjqa zeC|BNK+%a%-28gWrSa*ONOD;RhX8A+OO#|ASQCPSzwkxXKZeoi7l#k7!GKMqD-<e7>(VG++bOqP|$Eu)zgM9#9Es0-xf zLgO!}Db65(0jQf2aIuPMVRmze-}T%CU3MsTmBTUr+Xd4<=VFeL^Mkk{1%{M+XZW`@ z+~8pDtuuh|tL-$&=*_)vgGg0;-x4P???sZ-pE2-$J7>ZK#r4?eN*{xtdr&a|ak+Mkh3#^r=b%TVr>fP5KRHsH01Qihi7-`p zBa7kW2E#BiWd|$@Bc&5U@sM3mhcFiLAGqI}DlrcYa8B@nX`A71HPj1^XKFH!<%vI( zSm2$mcqlNwIvIYxNQ%N7BYffN7VHfm#(wr1(7wsWC0X&w$1=DIi{tUI@FYGGxS7q5 zWqZd)ozdaHu_`M5On2-}@3BM7a;%ywsHF5q_|5U41mjisOcme@3Vo9x(S$EWu}Ai?|=e`l^;x{sOuaJGu*(m=yzUMJCZ zu@Xjw!^Z7RjAIFw+jXd`e)G&SBWsY+<6Py988PlQ<>!zWyu3mHwZ){f!9yB@GRtBB(qh_faRBI;giXoKX6+UVCHD> zv5Ci!BYQ^G6pReZGhJPsuxkYR&k4uk1l)8ZC6`VelroHF3o*-fkV5A3SP&ITOz&#l#z9!l}}%Cw_(zRQ2fdec-0nwHlX}^gNP< z0ixmj;mggpFO{5m367k>jZ@G?NXY{hBpM+uu^h#Dm6$Of;D34irj85XGft1E%%t&M`8b(al(15 z8}s8MqS7Vgq=Y*#xOlpo8yHIe=#@YfkZ&iDs~keZ#!aEeG(2_ommy(UWSn&@KT9hc zJ{SgSvFA1w-U+WC4x6t)-4tCN!WFBl;q+MVQS!F{p|~#;XwYdHeJOPtcaW7rYo_Do zfAqtjxi@S?9Y@B8lnk`p^%0(h;=a-OIb~YTje~frD}@haMVT;UzSJ8t!qIkCCh@Q9 z$RRl~sYo{KK8)ulcwOgpSnrE~Dy_8HoYKVmCu?)`^@`*cA9`Nkb?#EQ;6FayVV-{P4o)z%Kn=E_Aie#Ab`bsa9z%v}hma8zdzoxi(m1uFi>J6Ofv8Vlx zX{U1)MU8@hGu}RJ27gM?Hu_v|7=JVRnX?}S>rg9^{Lu;VbFZbfiz>AMH=Z5;NLN+P zn&RU0L6o+RK28mWEPoXSs*WOcpLhd7bKs+|vFY$^0p|+_x@jS=(QqiO{5u3LB5{)# z650zOIbcyPm~EaF^X zY}cmi?gFMsZ|{j9`kd0n8kEal`Ub51aAx@KE!LGkoqUc)OYtkJN;tT`sY}BeFn0$* zGJNQ{r9(OlqNU(zIP6aCe5M~jO4{%Jh*^Sl@P~iA;vr-E-VYEbw^#*LVVGBdC$`ph zJV86=hh|m!c3Q{?B?n5J-{WICmC%v#xSK34F?|U>Ikf3M?YU1Pl*Z?Z_WShUiab@j zS88GQ#X$Ek*}$oAClWu<{Bupyg?BX81>WWpS&(DjMt+Ruc1~zd0-YTAFlVPvyRW@&d=@j4DdQTkiRi{K`7=PCya--epA z3hhScUApw1THFtRDfs0|gtt1~m`wl+Mcc1_BuQuNFDGUF=rUW23@mbJP*VlSh^U64 zT8!Q4yb!xk_-Cx;UD~jQ3+vz>YMJ%CUd#I`+{4W2YHsfkB4D}GE#HTEk%Lci&y)1? z)j6-wKOkTt4=5g<%=1Q9e&irxpzTaK_oFjwjhb$R`TODxnFah1Eset3d9}WB=DOHd z%uAo3)_2!p#%_r}VM|gs({a%~9G|mXe-*4zakErelb7PG8=~Q!D<$9Bh` z0nOi#9)&omJ?jPGwvu_)bzOARYS7+W00&$!w#dVprV`Js_&XqRD4}Y2kJj_I1IUF_ z@T(f5thisw&P{8oeVjyDI=+O+2=i~pZLd(I=Ose-P4DUlGu>2CI_Jy0N!CRMPFvZ~ z@dbCe8#WXwxxoRjU1z5(CT+{Hj(mQ00DYrr8!8pKul!R2Kew;FKhsoc7*etB^>6(- zlYsP#w0V{lS{-gDrq<*!@8jHW-A$8+>6|f({GlZ?X2XFo_Nl@%-8q+Whl(4>#((4a zDl18KPnI6dJo%jj_zV9+>IXRIrT1j+Jt6T|LJtD4q))vs8X1nU5DieIVts?N%&9B7_m0K<9~2?oa;-TlK^<$BU%xnVM?251c_M z*yC|}`FbcdgM8bKq@01{Jz&bG;0a<8#so`lOBpDS@906k^q2POPX$`a7>s-tvO=ip z`xOmLV=NZFWd2lX$kmQD+_!peF`xE!`YXzcCbNMfj$3KRnP1zI&q>zbY4K~gR!d$f zq&G`l_-;e_y>e!z{l}6J&dlQAiT`|gKTg0kJD&eu>l_LsfK9yyR|Dbqz?PkRcTn3$ zAeeATAF7}^7anDk_G@HT1qL^j!~H3gtNk{{a<=8Q)uujAc53OX@(X~`ER{j#e~?`R zydK65#3^~xr)d1SS7QuTpxkuCSKQ}lo?9lqAIRNQ!H_|g&9wbQ^yaiWOR?JUxln5D z$cD4Obox##g+o0cRZEVm?XwyWVg8WmKG`;bDi>z5@WWyGU5r}Y!=`l?6G)eAEQ-O$ z5oBvmIy<%(ITi|Q08utBge#LNmb|+tdXv-RN}6ee@p9NnZZMZ9i8K8+0c~wU*VWUF)QT=x|cCb|G3z*au3_~siTNT=U+k7C6wZ82`Irwih$*)D) zQ|Uj1A~hxrk4_J@Cwn6+&w*v*dTd`fZ)nFf{sxB^Va$Co)E{GUH*EXk6y<>LTT$;2 zWxi+>r;y%yS(PbmEq9gh&&&`t(wNW_&&flMlL5WpNGUYL;o!PBl&nCyy1(!;>R=Q3 zEkBcIQHa|-mKEJ8FVm0f#ytqL`f2%7ef2uQg<@)Go-X#FkAT7;d|LvWdPAC#iybBZ z*lZiB$E>UUh<;xOT1z9rdPOFXC@sfhO-m`W| zxGRsihhfG!=^+=d^LtngMxr1SAmy#+m95)RUUyc8lMHd8QoN+S! zpsQd$yTF{E(4jKUBBAZu4vVfTKc&W%V{KTo22<(4_?h^kBzy zU(9EbIG0-%*ISwlCjwmV`WdqW9AkW?Y*xj9AQYd7@_=^v6bHX9xTpZ-40$Ie3}8970ck z3EjyLy|52OZo3dLVW=co5paJnTQt?u&^2`-d?1pACOVmvEhZ}mv=1drFnkAaYG6Yy zT~FUd8>x_IZ+$P*0@wPXa8F7ig_HFE7*P1pjMY#5oe1oYteiykfKv`~u~41DtQ2m= zA>D>F&kkv`oHxp6(98GUPkuf*cYDV={#xHsnc&-xS+$nhy!?=ymB1l*b9* z&cJ@b;h*hl?R3WD-X#uuSWb7h+@{FFXf!<5kF}k-Yx&9#2flb*+GUkQi)RHsW~Y0)yEyv!dQbZao(6Z4=Y0DXD#7!5`*vxPE4#goilv9+F)?x! zn;6sEm>^Icj6A!d;)8U@mUBKVh!dA__OHzUL zbD_Vs!)cy8{bA*-R9o^R`d%eCwXVg+ zOLEwqAS{(bVGynHraOVjlUB{6PkK$6t`alaDr-B6aZ?WWCP2m_@_YxGGy|h6FrFy@ zEz)qIihB|c?>da1W-?nKtOVU@cuH&N+pvqOv`kQN4+_n$aj-K1F39;QVA^P2*&p{0 zvYzL@z*FV)ZqA{;Ha?2pBSdPTu)pakRU()bPL(e?EKlAqw;#rE5SIe*OZh`&G}8A$r@EELm)hfq}-_&;bwz0LmI$s#~|;$ z*zkgX8kjh;=6m>ZC=^CQw*?&~Xy;t9mv=_0Po++Sp`jQ^;kERzkVLFC3W~!`TZA!7w)lV!P3vhCHgU^Q`=8 z=Mwo;2%BtP6KDC-9#iDS=awN4t3E1RdN2v6FE7KlZYsX~537hj!E7f?cK0%2Q33rT z_#N3{C~NXEkTFu<_5UJ{z5HZk9D9*})cvMhbs7KZv(Xxdc+)CWyP5IB#^V37EHImkDHD+jSXxAn96|Yn{1EKDYsij9+#nLG=~&ft49s9Yj{N`d z#8r~mOrlqXYe|e@#8A9YFW6w>V)_-swg~)F+!*LqgV@gX_OVmK^O3;x!W~goir)$0uq8F# ztQm`SA)OrIlZcn#KMs!<+U+haQBmb$p)Ri;0Xx<7kD{4=C+iuFwCn%ynN`d;Rv8^! z{sQqB?il2Yz9AfYIM%E*`RkC)ZK<>2W)Nl_&a($QSTz z+>c|Jxcx*N4*1dnFDV)4HmTC8qC@|~(Ug|h|FZJ~kXc<{l801|d~fNHbROle*! z-V64zc$SIwLhB0LVtoXT0*rY_nQk!?jI>YO6Coy-sS<6t_p7Rs(mqmQqLzy>NaIxD z2z8}RUZxL{hSPr2cqy;>u6|;B-2YFr9wgOUY!hkS|M25gEP|=E&sAPRw#!Ntq8|~q z{y#ize6XvK*@ciSEUtJ#XNV0&SS&sY68=Bx!_e4YWnUSLf26y#s+?BlJVJ|jc$vsh zRZ>7~P3lAWNGjj8l>WnuR?7n5nY+?2nyIc5SC!;6jgERTi6E5FRgzap ze-_f{#aCC=;967asxc&^y~!}g@<GAnUY+p=Zc z>!?b%7qM}Pak&N5>CA!}3h&W>==Ug>S>widC#ktWHr!>8v!@UEkI{nP5*hDaplH4{ z8Iz2qEm9^WiDOz?sH)U_7U|@4vNerihG3Sx9aLU?k0{t%DT}<2y4CyuA)W35Lq+3e zs=9G7JtxT%jLvv3n_T<@7evGQ0fiDyN@b-l2*<;5P*kOIR9)(aRF(QLGf{;u?8=5W zWce=p8+Mm?#mjO=SEq}aD;`mKLDZi3mB*Pr_R;dMqiV{%VPakYh`YFP37XFXsOXlD zbvVMOl}&F*dck`QyQ2G#JwXv*xNa-948QS}xUEv4&VoyPH(>;p1rScOBrie4-$cgOA) zFKWEl`XYOU`sJ{R_?xTT#i{d|o%F0={Jq#&tfW;`$(eQ*$BS!c^y(U=^PmrlQ!&PG z23x%odu+V@FqE^Xjm_TZ7=somJp6){^?LbOT$3lWvfehW1&L)Ck(rd=Yp*~Vqa)Tx$RFv8)*y5c1b ziPuU_Q&FkMbpNHo)<2Jr3q~ZbB|NjzcB+fqLhnT}P*oK@N>~3PZPN4=I!Ew|;SyF= z<>uC~!3Z$L(d43!TOLs2Y3zaLH=m@c9o)=q&Cm zE30#h_v626HR%w5f$j3fC$x*cg5j~a@v%=}2s)grJ0HMqHf=4Q#FDhSk>zeg4!b7d zuGe$#+&k1v`ng5MFqh%19M6?q*kJ5zd7&MyzRY4Q$RzKe>!aumOo}(asnpf54~w{S zXnyTKY1Vi=lvFwf`_aAF^0I32H*BOb7jwD@ugTjdu!X2cKTXHrI~wP+(Rr@sZcZyp z{FPMi=J$gWarWzNjggf4F07*q?nsk*M{$FcY4?`;o_I5)V-7%%{zT7rSY1nN&>C?Hnro^i^F^^#BTMcJ%>q&<+oS})A z49Q%Iz@-aezep@}^AXC&CsJ#@_}n6?G!!2`JZ)gm|LVY1%)dH(>Wf|VX@|uWs?z$0 zsxg2L`cEl}F$1|{?eCU+9qz=o1I}{TJebaE!tsf$AsRFkGkxv{pz5@&sf0;-fwU8g zFsZc!%H&K7a0+WzUrntWcSKFiNHUnAT>Ai1L`&psYOO2zYd@R}m{}NAP*%c};iOVP ztL}X#3{d0BhKrfkE<4j6!Q3T>Rd~X6wDeWs(pW%m7i+MBQii(iHkm<6-k>BmRQi2t z(Tl(#&sm5TxR&=<*_Xpnxe%^m=16TVTc|SmPhM||Js02Z zM3~k*pkk%jc*I``p|Q9vvZ2=mnw7c)+$SYkX*Fflr^p=}eP!`h&n0PHxXo)FO0>m9 z$%oPDj6?dKveAJs9UGw1Pqdp#ke(s}1??({bXahb*D@4~-BFy9$u&9lu@W^_+-zAp zdf_(9D8t`x3`CPrgCjUG9)F&gw6>pWqNUUqGx6#}H7_LnnV%WD>AX1a>L|kpj8aTB zZdS^MOQm5HSFCggi1q1q%FFc@AL<6a;Cj1Whq)>~kF^+lLjT9|wm3FYvT!%4^(Q0z zv1Tgm!gK00e>kPagKMdMrFt-Zgx2funW=JBv^2EbvF{1?^1KnR(()%l1#vv#wSDLEW^5xFwAUZ`8#q@Blftd6^^rgMs=)rWP z2E*TR@>!vv&*07p_ekX(mde@m4g_#zeu9;-v^agjj6 zc@#)m+#6Q88|CIlDt0QG@E>CAAh(OnMaN+YysLrRN_w^TNdJf8{(_aC>Tp|*av~^I z!YDQ6e%uc;0WkY`*-Q*u9D@t`5oAO;#`{UN!LeRQP^?YL)Zknm8waThX&uhmuM-rE z=qriiGv5ZKw9~c2HHxxICHVK(s)XJ#QSO7Tx3Iz##Z{_d*hpVsEP) z-ccbF-iyJ0tYT5{M6RpEgSIwV=>K>}RW?r1yvlI5Z8Od){T{EN+%H%nd0ZDND#?;I zfKFM)*>{+q%Vps%NWhp9#4y`)4Sz-8E~lid3X{Mq4Id*_OQXS*FceA;)uc^g)X1SL zibjYMSt8H8TVpaD(Ep;s>JutXk_la4KL^(X@S!2KAS-pDHPSuqVV%G!BtJSP#+&DZ z1vmuqRAWHUO%@x~ehQ?5f1yy-dutj33R)P-{AhaFlB1F&Wog z4qvJvS0_VyZmkyA9yA{MXvBIi?6X<|IWQN*Nhu3uNL@`1&=k9CT?Ndy2ygP-fb&Y2 z#d53E$llJ!)S-`AXX_`kF?*veAXu75PR>B3Cv^J)~mZBu`5nA(OEXVXso zYdWzXe@=;N#gb3OWtPDdNeYCffDIYWslJreQ%A*inDH*-iX9j4Is4e@>h2btE?=9G zYX7%Wjkmfhhc9aI3fa$|(v zghuQOwliztPb8pKWu_xq2x*3BkLFqiQ}q{WwJxs*_Z1}!SJ*Lk$jzm2h5+Lg!c4NA zWUvnQLaB07C6=IH`gNUfQGxdhLuSjA?Je}iWk@8~731EatTg$WEGHi=a;LDGd1f$5 zAkPG`ZtOMlo!6w8;kq$ZDkmG?=oTn@_ z&gMPqA~&SJV%k@lV4U5PaHb`XZE(s+Wwh zI#@Fm7p_Y2u2{b|KGhk2AH(0PQ(agaGlV$TQ;4puEV3Ub2SeHpAz_trrOqX#0hcUv zkp_20sDBay+Ty(k!Dw#^xcNRDei*s~ddX3j5EBB{VA!FB zMVk7-xNJI0`r(tCU&j5W;gD=y=!G9cX$W^oORx9N+hwJ=*oPTpbdY6*kNG1x6RN@; zbqO5A^ic@Vk#%y~YLqaR!L=VHsoQWOPv@D>dGs{jA-b6`i$ z8QYWX#r6UYaM&4au)!t_7=nTh0c8pbii-CEM?Tvxo5Pdhte(GhCS&7zBTaD(q~$-HX^XOp%{YXGPejbJ8DSv^&UL5~}i> z2+%4m8{wLW3-jL)u7LYgy^P(17M5U*B6=0f!;md@u=@Jx_vO)^h1X-Zy8Lzs1u8lu zyaRO_MenHcj=OsNax7Cg?gaCxS<{Bays+N>A8UETexB&C+i9ruBATzl#<1D=owC0g zH;&#P@g$i?#tHcWfqsX+$9dQHOseY-_#?==I2eKPg12(+25^y431Ab*o?syf&!rQ1 zWhWUw)TbqBaJYb*{~bWV0zQ!UA~6Q7qW47zi^9jy`EwA0LdfUDhI>xmfP*`+L&s;V z8n?dMaFip8?}qtvp*un_!v(R5T5+IY^T*}pT;z+-qv!rN9Jv`>kSA}?UV%zt1c(f+ z@QA^-!8=BUbcQ-}g?`lnJf^u{;C(-zSw2Jy0kwxs6(=`X=kXo?=EMZzz@rw%sn|+9 z_gN*$4zh0-yCc%>GVyRql-^g|b{K@0^?tAJ>_Lt4Tb|UivG%J z!PcCU0b~o|WG=yegclrmesrPAojzvlMk<@Pv6XJt75A}M%dVM&gTnB1!;kNA4W!3} zjUS;2ceBUWj|^E09+B)XP=$e#4O_qVPl(8G7`R)5){{b3QWc^n7~WlhXxc(A%;q6p zGS1U?$Fr;PUfArgCc?kADJJvzxFhH%QB8ySuCee6?m+Am_dj|uE6jsJOC{gX<^{Eo zvs+JoRYsL4{9%R!C3>H5pfs|VQ6u%5kvCvApCSk_IBRH>pUehVlqmDcWH=pmCfFuGof;&+%ePk7$a__-h!galB9HT@pLFjEPz+8aRPU-XqcNBd3Yv0u;FMJFOkoH{ zQ#=lMWsi!(K-1!_sPT0Rek%%L55y>Ynw+NajuJZ8Z#N^xSmQ&m%dPcc!Y8Q@!>Q3Y zJs#zR=!CyvkrpJstj4Ed>UJgjtuwHsf&Y)6ejEx)0*aRn*@#H{!eZM_~2)m*{Dx_ad$z^aD|74lu`FLtGo- zfF6eXSDW2PU6an9dI1aZERK|l_2kVG5Dbyc83>5~_9_{%=QiZc;MXy@>rK%1)oJ9xZx8a693}H4* zhQ)D;B(@m4YT|SIlo~WTwF+F!NexrRBGVDBV(@J<%f;VGT4QTPwyI*=- z)jm?5Vf-ixLW6MDP|*Zm#%K^2!VKV4o;$9nY4C(9>;~?4CT^lO9_eAHLsBbH!B}T# zYiRXVBV-5-v|rW!J>-S>Qvfx>|I4t&I7r#t70ER8ZB`+a+(dVTWdEfw6MgokpzuHX zTzPAcol!K`g3%1kI=VN`lE?n~fANd#6@(xwa1{T1s2rsI8XEj2tk5OOYuTqUa3YDe zLVhx*a5(Z&mE~}t7Tj8#fZy=sPBIrD-{4Z=^DjJ%`o#J$oEiDk7&~{?9*jhj0_42m z%8C^nr2^WZ)-`n8VR!QgF3S%QhHB7Yt1{94r%8M#$ao*Tht#V&*YSpi@;poov`w~W zgvdiMC=jE+t8sJoHnk6=gX3X$43dMZym*#Z3NtCA?2@(L;fK+m>@O$7L@XtIm38D9 zvs@?6GE1k4_^}|pgmQ2AT?IB3jWM!!%igV@>3KN$6R=rKb!aVlDcB!U-ee36QeQ&? zKYmP~7na0gCndUaV4UB?;F_#xsU`2ni!V|5A_P~~wCK{Iw1~Itc5dWzLc+<`NQ_%f z&X4zdC)P$rrVLKU%k(x&(<1#d^FLy6czi7cMuuv?Fe!K(|B~BU+oR6t(C+Il72T+n z7h4W7iLg@%;c;>XZf*7Okd{Fjfcyq~5Bore5vxnWgpy9H{Z2f5q(VD_Z6fK4VLS(Z zCf{gXR{Lv#s(P&1=skaza`tW56=7RK9@le=7_a_z;d;4~8jzFMK8l@kpaiF=%Y$rx z((idcQEdN%nrh9SnAeQRnw!56?~(tebP0g>ja6A`~ZtPgh?%VoiiYaHaHD$+E=zu!hgWSoLFpYPGvsN z^q#PFv)@ZIZMECFekSjVIJWyl7E7W$b2HsavO@)T!ky!lvYYYV|Jt#Pkw^6XPEMf3 zh4%}lt#~N?P0;<1Eij*Zwcw5}(a_l1T*GeAzOKP7u*utBNoJeb&0Q|WaQgvS7GiG? z^o+tqKQf5E7XoUukU&={Y#_0tARFlP4*DQif!WcQ!_lZL&fwYQ`qMIjJ?*?7mi>-Y zei|)ACzf;auZOD?yIApvaA_TUZ#0)A;1*rAeL#E3s)u?p!3ZX)VGyBjMV(*g(YFgY zGHUI0=Dmy_#quIBD#1=HMiZGP}TZaM3*s|LaY74B1P7`NTM);c9@V1Een zO8w&{#k_i4_P6|+&oB}fp`LAM^iE8Ewp{ytq5DRb`F-B_w?M9lVnDmZTENGEmmTqFx?<*X}<0y}8cCa&f+-XUZ9_}QsaT~WO zw;uP~{rt}iutYJ?J(RnyNUX;L!;Q$F-7uyWVy&p^LIU&hSiTY8qSVYT)it)3Bhb+G z4fj=V2)&cUYET-M;fpllAHM6ba7yUlex*|lyT58B5KrZp!I0n_v$!>nWrx{YTxX!ISX0IDYVis}> zw_ArLCKgZds0pE!@C5&7Y@r!xqz7}ZkSC1&DSV4wzH~HVTFr&%g_PW@lD~izf*7mT z;N-EgT8@wXzo@U8+6vP;;Z2MhGmz=2@?ajDLRdqD^W2%77Y4%S6vQlHquo6xp#McC zy?=KYE?o`Y8Rs_)`9wwj07359WLlw2Q4Gp)xHG4mcvmh+Z*m=+?~w*(-aqTJr92Cu3{n%VRKSP)>%&$Xfv?0^VHb{KLOgy(b#yL7&Xjc3C`Ed(WG=8 zIF$Jj0d5jd5R5$CR0K|$ODEH?bzc{uK!+M}khoK1&*trfNWfPAn>6YR#(f&kKYT<` zqZ5i0SmY$m164W+HOX%EXLulF4i3YO7nQ`7#39gOab&tIj*Jx}oYoQe)D?XcUA*2n zMxFPTyaNwpoY5fIO>82v!I$Veoe&b%x5`FvE8`^Q?5qiHZaeFCE~;^GA*v}<)Y_V zt1lCI`p%ye}<(fxG^KZZqA1df?2$>_|sS5-v#$0-TsI#Vd47aE?^Sv*6DN zq@Lbz`qWB#T#%>VLPNYh4N5*mv$D3Dd>_Z-Eh7&{imZ^aHuF-z=?9v6&uq*`dQ;$W z9tVd7+yI9pKu|o_Be&s|xbOF>xF2QNVL9RWOoc8n^b0Nh!mR$8ec#!^OW*Ud#*g9o zx-;>X=JMv?DEf}@Kjj?xHXex)m}?rDTU#*)53;!a3CtX>k}cx)7nUOU|8y*yX!HuW z1aFVdc|H(Ig#2xR*N6Hynhx{?HpWq@l=mzqWqQXI=4uQ*q-Dx?)zN98WUbNulHJI} zSwBjY?d-?SHwUmEvh>(Ebkdg}fvGVFh!GS`HrvBe*u++xy@|K*{?Qi`$?@)4GS z%t6{l8XL>jpiuMoc=Y;t#fX*Nj83)rA1yo2JDHn^#XOk?mLp}W#ShWK%)By&916O= zn?|UTw`R5m(xW^hiCGS2M7xiK^5iom`!F3CWnQ0XJfqYvMkv!@r>~{@cLWc~8murh zNjHagwZN2N*9F#yqOlMa22ie6!rOpXz6BP=`FWRc6Qt5uR5y^{(#6e!qM`-5vgI}G zdhCxXTJt(qJx}bIF^r;o)7jrZ8$w&-^S-6kY2=Fxl-5d#L)oz~evsUKJsa!psXBHA z#?K*Y^YI|8qL_K)zaj8bv~1<(o8vW7aXJ=4iX?QZFHsMpRIt7i+%zKyGDFSv+2B%k z%p_xikmXZ>p5hJ7_3S-%MkZ ztP$iuCcB5dL}Ft6I{k%mle`8|9eof)C$c^EZ=Hodvgz0~jE*V7IIeZ*{+s5<-cPEb zIRUZ3R=?=$@ibo$LHBQVdGJk|caW{V^qzBMR61F^^-N z5G!k%JZ;`ec}tjIG>+5`Fc?TkCakuJ&qwuc!ca%)dZM&W2hNC&HLfz!Wi~Gj&Iyj~ za3W~#0W8y-Ipe$fffJE2?oKCHp5MUyYDgU^!NYn5R}#g=qsm??8Vy`opkV^d5n_Fie`RZF2C# zSd%?~z^mAKV9~0ptuoZL`sf%tJQ}B{twh@4*AiB2TL$6f^M#Ui!!oZayp8?^+W?G~ zS!f)hb$A1fh^tn&d;Q72P1ZQo$zvd5dS#P$SVv^OA`W($kTO(`4$)p1omJ3}9r;r7a*uJ^kl=XSAQbQ%4{N=%IBr=H8YI!`%%b~(r85r^igyuNA= zIFTyu!+;^_S`uq!FZL|Q60)hewRX*`*I#Gx(IPQXn3B@fA>P%9OM|t3>ORgr$h7n@ zzX4TaZDaceWH?l_4|&hPei6TcIVKP1Fw$p{Y_xhm**c8-5?2}hAO^OYv5NaB2W#$` zgVDL^>hs-^CKb+4tI=Yy_gk#mE~vAL+Z_-C$X>06T^d0YXABAf=e_YgjkYC~Fc)gy{xVw!^;@ac@zmpxyE*87{ENjynUmx9xx1U6x23sdm)wR=AHQbp6|P7t#1L@R=Knfj!9zhZ7DAfo((ZPhEC=If04fZU{U^5c*LJ z{{LSNqEwzdn+m-#_%|Ez4-h#Nm*mbNic|*~K$vuA!T`X<7Xl?p5J`6v$&5-KoiU6+e$wxKTOr4kKISon4*qUs61>CUFhaA!=C((E@1_dIPy(s)lkD$yj3v zDF7X&x2Ch{>@;ynGM@W>@_PV)A`B6uPE|<;1D{f^09}x@;)-x()$U9MQG22_BwWtTygZ7Y;?(JGiptIa}0pWim8oo3|&EK?3fe zd}`8Qw|M|ifpPY_8K(vdII1dyDlB)|IT!4Mjo>j zUbkQE+&}AymVxq7Bw*b%KQ@N0SF2x4n^3f1U~&wUTl|R;U#1`md243J4yMv^7(GsW zv?XJg+VpP0mFs_knHRqdxitkx_MQ;)fh@U?uWG<9EsQ0`7ZS6aj_v>;il|%Y((u zc5A8*b2l5wCW|m1K2Ip?!AJQG6TBSN)g(@eW*!OR zLi8}2F(~^q4Je|tBeQ`O1c*swOLA;pZC$r^>)=O^9 zW^5nF!4o>Bf=;)Y>x0{CaG$i}$Lh^Q71b;|ohX`iuSwRl82rI_e`m@EY=ZHuvNI(^ z@NO&!FA&s~Ykp-s-4pRxX=w7%m1)*@lz9O>4*lR*%>Gp!@i>^lsT7z(4hNgw5!>|U z5T$3^`{tAI`tq|HH$&-!V!BG-e% z$?VDz_}C7U$X7`?*{nv8k#`)@;3lzXSVkQA*2w)fcY*5~CZc$b*`<-irDsX_AhV7y zdNz}6cf(5XjFjHjLVxoAqN3_i8Atc!vdhH(5G$4LA@99A!rNzmJ=AuS9ZwhQ;F5{x zLvl_8^dIrdk$Owf#O%gEatoajNHh;Y>9@X99KtOPto2Hg5M0*n9;ZfD*fM;G~LcA^7pxeDZCvbdf^7i_MbBvG?=#UCkvwMe~08a1oCd9ECUY zM$@BeZlSo{Mpzwr$8RJ(-e&@C2y1d*MBb2xoJr%NAuoYjE6!EYK%H3;q8~NoU!|0) z$&M9mXJ*)y@UBun)hH_QOnXa7{?(W#6t$I7lZ*Xg;$g(EyvgTUvpG9FQ4Fu9!+T13 z=naPc7-ql5xgKF>%IBFTJ``ayhp8hLyPtX z(A{d78%911F?T6ppR)K}X1Ca-^bUn@LLp`%7NKN72#*wd*p{#GwZIp#n3Z9^to18- zzfO^E>dKBQ;xKbEnnz?@zNV_HL@S|4$_}#ThccciZ|G&0__NNa4QnendqsLgfDnL# zys%gGC(dMEI^Ba**d*HiBX-a`*LH#Q6c&c=KXwFeg zckh}`7EnB#r(#E+|M`_2F6L>rfvx=LZH4JNtq zJgbGvi6k%u($Kr08FKW-_s7F#I~Llz_4uSTBj*zK2Kx<0P?EjdWjwE!UY%lGnF5)U zaZ6F#$fst+f6J4{!?k$Qr@~*b8(>MUs=}rRA}@*bf*JYban0sA5saNagXOCa8l$fs#$b?YWNJwcHJPSmU$_0&Uxu?ydNsRX zoJjQc;lL(|TuPpSJb`ukBuG!adI^m@TvNl(Ik!Y;AHc-~SP`1{v%*jb&uUIKh!f+5 zqvjDRpd$Ln?F)y$WB3XjJ)8}v^EDY8a68;0;Jz>c@K75)$Xt^Qt&u#EIpI#`T*k4A zfwbxQn=n2hB|lM(0eU@ z&m%Bz64QVl7oQI<^+>$i^#WAox}Ft(7?VMnmd@YcZXtRgm;T58EAJ^-OAi;D8rjwO z=%nh*E9H)%IKNmI3wx$B)%f`f9x|t@1k<=Wn6M0S({R9O>nYYo` z!!U%BN*m&DC((Dp@W7eYJDZ(b=E{g7qf%f;Fh8%g4s79ggKwmpzv4R=$yFrR-S4ta z31TYjKMX3{C8w_12Q3<=dfUE9D3gPR3Fw4YZtn0vM3#t(yD7nGKZ_eG$ZpBIRSJCu3@?U9VmORNZhsp4>{MHSb*r%xdUHwlnpYwH~ zysFFT_h0!vglWq8L74dV0Cx2OJ(tT8xG2GYk<;C5Xw=Ubo=4t}D9b1DVeXVD{4(wl zCMMnV1Kzb!Cgwx&Uvq7v$m`o~YUf*~5Q-5|-sSZ}VHk*gGqJ=Tn}?m7_g~Ixe6**mtE)C58mYZ@Y(6bNY=0A?b%CO2-+0^Qr17j=6kRd8R>mJ@7BApm? zy_U8{>f4Y?PW~`KV_Mo;Tx7)${M-6~>6xnn6t#6kBBo|wa%s4fS430!!aaEVGStWr zTZ@qZZM_5ioTWizdNjHnV}A>K(V`T79p1kl4(h-}$mG!e-9(CG+bpvY=aeh4b{W8v ztxED;RKXB((~d<;nm~sa;y+zu#K*>4K7naL<^w9>H}YFj-uvS7aa|?Im8qjm$vN?? zYX-aO;Lo@_!f%7{IGH&fl@tw4?C|~zWDn`mK!!Q*SV>o)J8*FA7Uqm|DJS*vXqhG# z!J-M$mxO()>?QQPnkVXG=6*i+qy1K-eLN()p3zm+HZ`}@XwTEGoQYblyTcOVSwwP` zUSxJ!^Rlyl@W;fW)7ux(@)_gb&ih8=cBOuq@ku?M9n4;?8OekG~b3{uzZ-Jsu?2UnQA1qyduh9 z`NjUHgURD5Y^q6y!D060@erQGNhGc)=VwN~2ydr>H-p?jV`;W)&6utd%Ww9u)UuVv zU^)3~v1xSKKz4J^MU1iS+{V4ev>}_ot(Nd?sE?mg%Nl=Hs@}xI0kUHh?grCjwqDXq zHU6ZuEQfz0I|sr7Q~O)+ySXzR`RWabA9x{iT%j8F1tYY^PB+4nFw#kWb)H$3daU6owJ{;{@a z64MA5lkhlN6{2eK);IejXbXn--a>yQZ2g4U__=-^NscA6RMs1R&t)21U0jH?I-)c< z=kpoXaXh@?08=hT&r*%jG(WQ>8?UpxL4KFCM4HpXM4L|jn5NBi?WMm36_(Q((PX?5 z#sy`!#IeVXeSYJlS7vnfaYu2%6qX^8slFUR*Jm>dBOFa^zNo-<7!$IR-9r=b=$Jni zU$h|zL__*etc#!0yE0U{wRPq2ri)#Lr21ALnH@qZgYnz^haNksRTtTx%Fe-KLE_i7 zVIG|0;vn8+DcFF=Vbko#uI7ws{x+RKpd@UZD~gB=p5c0&6`5u z&p3+)4n&dLQFtvZ6^drN`ZEYYu%fA8b9*WLoX;a~i!_9xGoRTRN`6+d|2URZSzjow z-60<#T3&iQ+S(S4q+*Dj3GxszJDWbo6iIG^<6Xk75OGO5TH z#98M~!`i?DzF~}yJ&7B{PZiV>m7kq#ot~I;f%pqiHr)tz725mFBgd!7m1%__WMRre zL=_z!>beQmP`IVc@nVd;+Zlx=PT&yc#>qvlSQ@4D{6-xvq$-}l2Ij@+Ofi6bqsG}r zSutkCSrqfyii_A6Ad{k97bhX)NWU%-!W7;r5?xp@S%=MYBl5fxhrsRvxK)oSQ8#>Y z3EZ!3pHAlU?3%2p*s9l9x$!V|v}GHL9DI;Hrf>-Pa0))E#4)(zuIbY)qxmi$kuI5iAN69&O&S@z%S@K(O1#mM@7*>=!6j`3i%k!NQVPhlz~ zt+99~1`^=h# z`Y1j*rjP8Il@M$~lrUx_7m4~}%Qo1NpNO7{h}t8~Y<5Gf__EqDkA+L%ncx2?To?L{ z&e?qDEO^sTEH92}Z$@Kw_5w-K$$isDE_%MNu*^WV;GnFg_Z)p82B%Rd@4?dp!h$$= zYYG#WdECZU*ZOmAt=ALS(41cf$amm`Deo<|7Z3L!^VuK7m*V3>oa!l<_uwE|0A1WOs zuJzH)1l})0ixi;LI>yn}+R#^_hru*LhEFQ27HpU_5Xm_m78*O3%~- z?;|7Te!P8A$bmPkM-YZw&{zkfgh5s|0UqgagAfry?2=<=DSK1?kCOEHKI5NN876) zQiRMX7^;LZN?NKC3za9qxTR72H2mq#f*+CMn!QB;y#?iNO?3^eO^NMsU~cqNI1yXw z3NpUof*Kz7PJpe&C_F&25*!YL{n38&c`m|uU+3bnD1ML$>*BC3-j|E@%SE2v5cY>| zO){Od*GFKS3#5|HAWgFujmqG$35e&Il)|07AoF{IJxiVWrpT^wd>V)=w8YeUe3wGy zsX*7xkAtLF(-d=C*`wm8KKUBWGq^&@X!q?uu_=s1XA`T@n75COv`u59;k!y063?CK zc)@Cn6`jKMSa3#n>Fd{HBxGD(`*oh3fyO44a8NRLCs8@L_Ti!f8l7L!NVHfEUNPE;%omZM94=UsPIGE4gwhTdAo; zg5w=aP+TH#4Z)FWhLy1=z}9CV>;cGr2}&GxEbf3mnVdye+cHHl26I6|=B0#6g$ zqM3t(c^?E3=}Hh{vjYX#WjM zRHy@jby_K`SbmvcijxQaNK#cGYZ1Y;yf0t_m`{fw6WVxb94_wg5L(lQXSCmmrj?w~ zSf7mPxSr|ctrLgZMskbTDyG34r?YZ}tmvE?&AtmQ5!QFZfZ7nU!MVb46iQ$}gt;bT z2g`-r4QLNW7EFzooC5Y^@p)6uo2oEJ3KEGO7$iIko_yGE(e{#vPs97J$P~W{BE^}^ za*&(N=nD;Ef3dvOxjK^cs0h)+^9AsO3^|eP^XzHMT=T}Exb^E(*c=4$)x;O5EuuISeIkO$rWEq& z!>&^-#x~4@spU+a9W!cf6-u4W+*JEl?#|ymqwL$2*<)CC4Ld`)YabNNWx{3)v|FTs zW%4?9kd$YWYV1X}0N7EEW%dmvUW|P;ij;Kt!T{5Ut41IJ2)>uu8nQB?{p+g}O{eIo zA-Ijr7vUK+&dz*~)D|&Cmc%+@?t6N3h8>+vWjiDENTCdW(}hY zf{ot{Vt3X*(`TSFweWLk!EoVwx*%Lrj}st_sCszgb1-P}$&s!v@bHwLYqn(KZ`_tn z56tSko!5W$IG&hLrz*NUgh?fbFu&D(O0!DY&Y6B;4vVM2`?)hsWjv%}e>6W9)*ITX zmt#sp;i49nmWne6Bk1a#K#KM3a5>(-H9H%_Z2vSqVlzG_KzT7y4ub0%&_)(KTRV!C zEEm|ho~Nl|l4skRa12r2VR?p`e{3i^!FGOd?7aLAmbX`?VujTZjPtb`51IBbTW;Jq z7K@{Wv|$+gIk_W|esqneuY|G*WLAiag>`D|I6RA85&7p!g&gCeQukR7tvFNMe~CRG zf_b68AT}^sLaWR_Ace{N9`7oFb;05jaCLi5b2JKun#{B3K?si}hnZ&#R*{#w(kze3 zxe!t0S0s^Wjg*HDcm;5BIL4U4hsh8#mZ>v7K2$WSNrf%*VG3nl`6~W=p^qRc?QutP z;_JM8o(w8&AKYILK4rmBb|cKtSYHz`bkk(Ri4J@pWPK3c)`=@SZ#%qI2z!^}_9w-R zV_lFV^0f%J-cgcs!`NlmbJjtgPWz1YRTcZ}`D%26MbNQfiJ$NWDVp{fWe3UUF=!(D zACRK3W2<^gh3l(DObN{mehZ_ruXVpb`CKKu3hy`_HWodR=hR! z{--db4(1rd-wak=`02%L{;jmRby&{W49qB3w9eOp%-~u$mdR9Hy-lA965mdDEM#3p z`6+^WJ9!_-@H(g*_PRT3dfan@u{T#1Pm=dW@kBicbNPJ*_%V< zBKl3T)Hf5Du)?>yrh_{fP8!VWnC`D~_N8PYJl6Rl{=QRFdtQg#%8qlcD0VXq5t4yk zC_%vQHKJ!cxuj%wmHp{{PYH!-IGF9$8NUiH+$>9TXJwv>&pybIY@R$E zarH3SrsRe@1_#oeMNsPJ-wj_zw>f(;6kZIQh&%j($leXyQ0!|sUV)mt)zhQ}KHLQs z(2WtyJfj?L%rtoZJNav2Bl}^;ZTJ%3j8-Pjr3DG_Yz+>2iXK-yF;>ZJv9;N6Db3qL zr84#P%jU9~>_+yJrxT4gA{cK~u%JGx{jH$8@2$L-%=guK`?Zy1lhXR0vbdw`KjV*T z&o1>WE~%qIIx4`6Vk8PUY*nqk3O1YcW$jPH{dhX>XN!dK#&f(;mBu}KED+*T*hk5Z z28=$wz;-2Hf`%cY%|)7RFlQRrGe9VEm+8b%0EcEG!J}1)!}VEi<^$XIoJRt)GPL*U z%20AV7c(u}vZkMaJtAyS!kR)7HZRWuUlw80a4W^M`qoqk<>3zlPFO3bnP}O$WYh?z z)jJFhjEC>%T@97LY0sBt8;wKr!N~!ECf+uZ=`ZSBqP!C7a zc%zcQFX`w6P45{pKVUK^3hV^-VTlm4inm@UWKA?1eFJ7!aPxA2GOsOq&gV>Hb7N4 z_a^L0GoA+ND)GZH=aMj~PY#hzN8%jCK!1*9TVQZFsa%dezF6wf(N19%<8|?3NE5Y( z=3fcOT$(AIGhZ#kBVqaz?N?c&G%*f&Mz%?CxmkmrK+SRW|IqWH8ec1de6H!VG^VVO zeLZtmC0L)-pw|Rq(!o_^zffFAhGZK@C7WjB+R!5~P1Z#UvjGQZcFFV{ea5FKZ*`qy zZ1jn6zw`)aQUB@8MrGR!^x=S~%+`;hEEYI!5SLqE_+)?;;#{4p!gzTM%Gl~@xa^Ks zU?jA^^-6KJlfg6H6T zX^`)>m-6##tH8EG0=WJj3KiIn9yLsm%yc*#p0ye;Tzij2D;^NiWUQKRtSX%k8%xU0 z_4SgSsn$(}W*^VBcC-VRC}s+`UKQUE974e9Y6bQu6*I6UTdQ>@hBz<`?{OU{yyD%* zbDl+z4Rpy&O3~v91ts`oXT&h~PBv!VU`bR^+Ce-)jWWs_;ZRLyhGqBll-dB(N<=^# zg6ZsW@~W&+@{{2{nXvM_3>JZ%{_En4Ijv*pGn9-O0hy1vHhMNt-vs&y$v(?+P3RD| zp$zwBPD`Uu|73rZ?fo1M2spvY+)dUBUq!nW6izorhwJ#y6a`Zi-TgGDt z0ZWW{b3<3bWH(-ik_yL>Ty{bE6CCXy=9$XW8=vE0K4z2PNk>14g~(wvbPBRg3c|_J zd?;Fn$nTp&*jf6W&@_ngnO8h@>=mo*R@BrIn#tW&)VIM94IGP*SF&ic&cxj>lcieT z@tvYD3F6i4I_TvKda(G7h~vgd2b)>-#6Z?H)4EiNb*8ybXK!X8*Mf(w z=H%?+S$uP=4~`aq9cQ9+F~N9^aJoi${T&$V%s#hW$sZMumEPr@6oK`oE|CV89+*AP65))Gu$KnN9q0D}_Ghqu$%VS6nzojjdeRpp-q+@1mzV0kLHV@wRO?%D#xYOH(d?utzX!+( zY&28ZQA`h#LZ@&MLr{#b3#-(uU3&3}E*lvateW=Vs|!CM)1Xq41bD9m zkGAp6FfZurcvxOS77uF=gKwANM*i&rR}q-_8!S_CD?<|VVOA4@6gUPjv0oK$Ds#h( zAmdMnu3GP@$dzG*X0Kp87$nDD>L9UJ)IfA?hC$}u?+b<)zt=q-yx&BvL^KYw8(2p@ zpJqeuD4a=j9diH8LZBKezk&9xl=)3;<+Tr@4$GI?UMg<&l)&TRXv7CMOyW{r3Jj71 zNMnpJ9{vmK3x=%~5Q*ADU$wXm%QtCfIGZYN57Pc%I*jcyrf)q6J9Y*B4B}GeUVwRP zXg6|Mofik9df|k?B5WE?__c64 zN_rY`zER5Z-aGfRxnZ4SP12mVq=ZM*a>Rz4L#?T<74mwMr>IhCJSS z@;Q1u1UueSPcSx#p#;@awJ^ps4}H0kX*J40|YP+-2U4@ z`|li1SkAwLRVLlr09N`G z)jnFOcBO)dIbw8ICYuM}+iAxH^T!2DTWJZRv@MUp!Ab7tS;SW-;_Dhi*w@HCb|ItW z&1Ent2wskb(nhk_;5jEPQsYco{F}lnvL8R9gNDOVf^Tu|3Hc@K13aTWbl@_J7o$S2 zeno0|E5AhgP>Y7~_06O=3|@#2L*tEF#0$keS`4;qsGIw_BR=rP)6x))HFvZ~HN6@# zaS6637hA|H!qxdW$#^IeNeo?Y$(W~M#pB}45PW%AiRzORN_nXUHMKZbyg9@9s-^$3 zcL`~O*1aHALHLwD1KdX_q3cy7J6E+<=S-icXz@CWQY>THd05*f74+Lq&ObY==rW6K z7oF|y8tA``+tM_f@VghnJKLjHkRHJs=U&Hh%cU->eRuAY&$I3O$Qy-uX3tH@s29`K z1scCs=yPQ08qPzBI@CPxvJ0e;CFJq&6I%IdwlO zDjLZ8(d}o%=LVh7@yU!d3X)M0PJBD~40gBDn?6 zaq;r-tIa%4Q`;}mXD8DIm3&=oz4ZO!95;smZ)qC&47nv$hjGXq26+Pc!;Aq@rnlrD z$V+1&2YWI2#!e%B@SVQ zgZw4?r1+eLenU$}g?VE8al%I7>@@ZlHmfWJD>@$-i`gUiPOI%~D%q6)du{Mp5*to$ zE8+L;QtcZ0iJm&b@f)Ux5O)+!3WX;!a5S)YV$owxxF}GK#?KH4G=r;C`u8F3N&F&X zx8vyQh|#|=AJ@{M(dRkpic|Z%ki6HV!$zpE zkX;#YHb?9U2}6YqQl^Kn&%n11l7)^RXcFa{M?P5V(ec=|z!zJvzPXZSlB`Em2%bRw zNO@#tet@ipgM+vS?IzO{^5rC^O8X3q6vQQ~@$s!|tssvV=}+P&Oi!wfKc>_5p0Av13AmwUm5%x+NyKng5hZa=BFq;KIgHC zc%5|Mcu9sUDs(F_J>vMWRDmO{6D?$NcY!r84W`tg2V`9xeUOMU=J%sqQRqTIY7Fvx zY}4jx;m?_5r4g1FVflj>tS1r?*y5cTUaMF7Wl;DBiIpnhfS5-3OX*6 z6bsf{O8?m1>+O1usUxN}7)Wc!;sb@}^*#`z{Z>Xa?Kw>&IuSHr#yrH!u-$-#-4~?& z5RwPcBmr(t>#C%c5z^QgI-r%0k=)=+Z z`IE?wP!gFcZ?bm=PXEI>M}i#|6tF|kF4|Q|Y$2ZIWT%?zhYa5G&ar{=%h0IgJaU-# z1F<`d9!|%O`JGhrlZDbpLG+7Q<98Y}lFwJf(r?1s!gKx$@E2{-@rtyJt`9vT-h?Ts zx-?{c8`8+YMa+2!(<5P`5k}g`+B6JZuM^+u?EKqvto?m4co@tWS2`T)&YiL5Y8}!t zZYK90kz-KtJg=R}I+*8$iz+PfNph$#Zq)-e<=^U#qsYH&hW^1`kju!>VWMds$r{Gy zcra%II?y8=_AT=VO;lMGZ3gkB#~~+MV=Hg1s%meAz7)3F^Cga{lKm+gcI#GC7e8)tuhB_JpJmDCK7@6g{ z$bRmcZ7T3w=XOA$j*jwf+zl7iWU;dT3vSGsx2GIF}8_Rj@7} zwyWfWOhZQl{UFw}#2l@nxg`Hne~8?t2ILnC>3H!!nudSeS&nxD_Dq9;o%mOKH{na< z^Nf=i)0x*@m&o-n^4~m|th7B=kbGk*xu8Z~&e#bgdISX?M{$-f?c=?LIn5W6a%T zdU(w^xyHrapSp28rWEAS%+UelbR|2)H5~3)(3t0-L3~0+H1D_NKHmU19u9}9C_hJT z6Rs7j?U@SakF^K-&7b5KBtvhQSrg5^O@5D|-?T!%8IRG#?%ww>+88UK{)D{8V2zvn zG*i}R927quWlA?sv(le6_HQ`=GnuS{$aLJIVrGeaD0?#hZ~$b@)TN}Nd?W?(gOL2> zenBKp`6;b?C*ez-*MHsSjA8b}#$0eKxwZ9U^MCJbZ$|PPm0;~KyziD&_9x&P5iT7T z6o$&Yd1%W=hH1K1d%Wyl*%w%@+A-LHS=KA{P>rkFp=4n&;aycNm^6y}OWu2P?d>%% zM@^dtiI+n3dBzTJ?cV=e>C@Riaa?I++^B~6 ziH1ovFnM-Y1T(4YUsyQ_as+N_!A15-rcwMe*`r5SmRj}>ms)(yRRf!X+xx_l2w1R% zEa(v53gb!&P)?^ZCy%7xwUZ0Y(sye0z3fk7u|6zbAT3_$pQV48gRsQz7L@^YdFC*m zY_1Kk9}bZRcb;JHvmjoLmbL}u?+bt{G2-tjxYy>H-B+p+TEZu6+!TB%cS;j@Ka*@} zPraFq5ibbSUxKG7JoKWf+*@5spVbkAKp&`KeO`n^7VlBoILVtxZItQ{wk|zM(0Jfr&vtHJ6 zv+XTGTy=3QT5RG1e#U>fiA_b`ixh96zl`2EMoY{%f z>4!>WxQIW^Fpmq8Z)X3)8H<$Kad1A~bqc13iQg=P=^@w>!O#rjx8b-Ym8LQkBH7H& zz@FrOtn*6j$w=u)6uD`^odB8Lk1S++@O(*7V?#XL^w#Z?Gk>mN4w834&70$$o zXVu~fwFXB!&Lq%NW_01BIhfVZP<87ccwo0jqsJ3+=xT|lV`Cw_Z)a=}@hUu9!L)Wy z6%lbk-+=S&b`X{H?NItiaPK87z^P8{*9=5pI>Gl!RI~3oPiD`~KCF>SO$D5gmC69I|ko`zi>zh~Y+ZT-`o-DFQ9tl)uF5k~D! zONS-P$?#myAr%f5E66utE0ST(LwvO}CdFda`pnySDFyMtkiz*(IK zS;!9eHkB_E;NOv+M>jt2N-;jCF&l_6G@~s0Yn#5=7i_Qx6QvyUTLoHi>yy7Y=X6n6< z`$Nq!Aof%k{HWb^o338t{Zq_s6vtrxTrGSt1@p=IdJoQUP4xFj&e|?HsA}#gO=UxC zd5gGxB((ya94!8oh-wl){D^AcBisGnDCHi{zw{QY8H%orFu9#J#Fso3D3(gX5mP(P zR$s}Yi`T>C9dL3BSsJAtjtSIl(yC<3r^XN+Yr3}yc`*M~BBXzGCna1PSMTJ+B%2U14Wb>4W$Q86vvHEae+ zZ)G2Iq61Hb2kltl-0O;3Z_jPvC8oOjIn#Lvk7c}U4AgAWwU=9jLF-5(sq5N%^#%9{&B@{Y4EYysI@7duXI}6B$JU$2 zMOFUo`r@Kh^ky!b+!dlb)b)wo^zZb0ebVZlD=Y-faXOuR@bTW&3NkJCTSJHJ8*3y9C zh$YWsWZ98H{C8W(G*a96sqUwAHmL{KrjkI*A~y|b3xc#?18IC-tC>uaAeK6^$UyAo zm04fG%M!sah+U1Xji~FpZsNSpV@W!+fm7)O&2}sHn2> zai{561sAvqs3F`3F6uDRFUcG?QP1nCg41+<4gDaLsR+1idl%ww(7CMmtq^p2V21nejpk) z-1-2Gs2BO^%IS6Km;4!<{brPIrLjAG;T4U3IPS^GI+Qsj^O86^T_N#SarSsymRONs z6qY|yvR4##W1TAj6>vodt(Arc{n^3YF=&6zqm5kr87bgY(|~l_vonV=>kaeQNb4jLR3o2#&@RiJ!Ra~c3sE-|$qw1bp_cvf_%sFkMsh}i zf}(jp1`$-tQ0g1hYa`^UDjW{W>VoMvOlbbDNN?@Y_$GZx5p}jFho%!qi_~eK8Y2zA z1nS5!nv~4e%jNeC%Gc_m5va%P6&7VnlmF7tiWDwcVfig0<2@O5)nPbCy~XudZ9N4^ zq@3>s5{YqoV;hsu^arPAS=x=6llv{F5aprWYL@-?X2esx-ONK}ookmEN^awxem5X^nsOuZDaTTb>I)U1qXr zZJKp&ln)O)M`03rOV2U(wo$Z(&06Ini9eJSc;I{8(%h7~E|T_+{4 z$qlf_^+%wT(nR~!)gR+kinMzE>xo<^wKYpViStwN1CtSMj|xI>vGA&?M;;CD!YZKK zTjeRLphrfMHj>H8BbtiS)jlMi-TV@}znCv`NjIw|H|0xe9rSDqX#sa~a;$QLNAqrvYp4{w@a9UJ2l^;T$9XO*W<~!l>5iWwg%} z(@ss)9U0r-AKEop4`{EL0613e3fAQ221O>o{d#Wi|H1B!7WUYdTtfmRd8Wltj(bb<{5NVGQ67* z9IcB7>b>=D$=w(+S<^2kE*T9Xz?n)aJ3)0d%jIj5D+cwe6(|F4Ma~^2=?K>`9~t_&iSs zkam*Ctx=$5=$SI7Ql4`=RFV)+#}A?26?BO{`D22xvyQIv<32KQ)qYeRJ!CSgWhIjx zx-$`mx{xu|hQZsUyDUE_3_FVvl1~pdWco`ZfxY~8#GJ!T>%u?eQ5i90P}^B0G#^Xo zG+yGF=-jM(x`>;tNV+DxMGZ$FwQ1*;E;U{Afz;C-FaZK+6Jov>0#7`&@QAswxNP-40 zZ5X_g{PsY09sv~lb{J>$r$;rMZ9&ut1v;D9KZDry#ne~e-na9y)4(-#agSo6MvZO{ z(cLeSR93VfkdJ2{!8*#w@6nMN!biQ&D)_YVhQ9lgeWUpMitHTIhsU{6=5Uh17A6C*h!ihCv;D zIhwAZj^EMkc-1b%-Q7S|nlurZh6RDN(=__5FFQ{qHIO)oy@)#+jr`J5n;bu1DzVJX zeFbO6a5H#!{VV7ve)KPZOn%&Gf0~q!4c72S5TrgChtMYG5J4)a@)?KZcBksh`f0Rp zIGIl7n^uo*QOn)fI_~p@?Vw=MA5O3rBU%o!>xyyAetm{3N#$M%Lq4&Vrx)DN(TOqr ztkV=hIBTMVMsySOq&HK0^ z8!S=EeAprAA~bw}zYL0K^!#Wxep3dO;u*Iek*+}XjegQKU?iIB(v+-qwe_6zJayI6 zXR+25)^4khv7@tiRXho^ZdLa8fDbfkJ9yi@-|WFYNzmnw!(&|BOy;APrSWO~E&BFM zdRJ+9Zz(H7Jg4Sf>uQ`!*X1%*rZEc)p{e#4fwvXCVW>?Y9Zd*w@(lknFd)RVqFS{^XX_&bcf1znL}LhaSR? zgd(2Nlw)KVnb)S^|;|kv~})^ zmIb>>R`PX;A^9TCos30dTc;=-e4%O2D>;=?zPuaG>FYssY%QId!Cs6v90kn3#7xlo zWUppVs$5yJq8fBl#HO$DOEz>eHNrC0@v`|Viw~juj)6RcNgR2U_V^Uwauxg9xE-g+ z5_$|Y@Fp9I?A%o|yP_+9bT)){9S*Na8`OJ*tan(k(4Q*gD}1O+p0mk^o*6{*c_d-* zMN7<|IOEahSga+7+kZ$t-#MphA%D4|e(8hjOy#f%8X*Z^*A&93L%H|U`9H0$@;skT z&ADthl^#+QmOCigWzsKa3Jyym{I0c=QEXs0#F_u(+zRfO6jhn=6FAqEDZo}n`;~1b zS!e7;V+RSt4ZqF9)w0q4m}Fn=CkGcys9z1VHlJS3=1V}8qPLN3lv`hyRe0@uvrz`s z20EmOO;oUO5}rVNO}4L=PB5tyt}6{!vd;RMF0wUOqAm&x>^U(de+)nh1REYzvZM)@yp%CCMC3(V2WEZ!wfP24`&09&d zarIO)8kPkP%MxG$!+55NH$|FM$65?b2Fq0=zWH84?{tA6hgnY{>sk%7<`KQ10RMw_0P3;R_ypLArT~x@lMO$^qZ8b71NHJv}p%9vRQd z{M&uWIMXKr0AXD$Et$n8d{5T0hqUp2dj30p>>mM^*%I=-WUz;hX|yNN*}>GgJM=={ zsF(Qnf>w%;O?;jzW&k%qA$5}F;N2Lr*tu%1x*#n>ZJ%tP z=wM%rGi{VLerBqYnZ6Ix7BoFV=<^})ajovF6Bb{hgiTOrZn~tOgAF^4*khm9QOm88 zv)|>>qzD-}4D_WyE>1@?`U#8q+uyP~{OH!cbogWp>iQR8MMjM z@w{}wI1;_$nXaFi_ASzNS6g?+XDR7`F1o!x>c;925RcXwHDaRZ@(_;uG(|ZX_A?O3 z<#r=RG}`It>GB8MghC9f2WU;rJG3~HPT0bE;9Or!y764H`M;8K*?2c9kLFA4*a6(T zN%VAZ!#Ul%um$o`hLh+cxvWvjbbW$ZXB$f$@$}7;v~Qk>m`!-K3MT&vmv%}}ZdlNCEFY3wk#$5e6K+F4nh^(wz6hD|^h+koV7pNu?6mmo@;$7N>; z4iTF0&83f(G+axorC7bk!T|bwv?<(xAFQ!wrL;r6gEtovy zXw8b;r)>>9tfvZynMr~$ig1u*(Rw3yx-ZRtgW7M=9}lpPy!?apv4z@2Wl~%X>MYTeqX}O*Q1GYnYS_Z{v`MRkOOA)n9BI2{ zFG=%dkGR;mg}2^K%A}Lk{4X3m(S_Z^vEgC#NCoCbkB``6<^1Ic>nrIQKDjB>#M3{y zJeFrta_aQvN6hiKM{(y=3u7L$%0XycM6I#5Yup&d9pHTwjb>=}@H{#$jC*OIZI{~V zazQ$){;1=$VYVEys=jTU^d@^nHS&?aJpP0}3h(;Fnn z-j7RI4@nr&n>?ml)Hc(V-PUSQpwqa&lUTE|!H2GTjYjfklD3RA{zi%(EqaiT6?ml| zP1TUg#K3uz*o1+THqjJ0OS&xn$F-fY@uiR;k3`x0V$S_A^XIzj>2!>q8>?ojxa+&? z=Mb-MiJZ3u!b^%Dq|mNpcXcN}kNkx0><)F))xAi6_KbtOi#|@>KRLQjdh2!sF(sDp z{(O*5S?Y9Dn4uWxq%fY=Q}1kgqfp|tvrTK_)^hpF&>)|(Jbtb}yVcC8YFpowc= zQE-uCqQw3(4W7%bPtxdX+@m(I1bn0C?F#!|mNVsl;E@nhwCjVI!9o2<==JH^+7M;b#1Gm_Q_Csag(}v%ChyN!h<5qBVV!89iy31WAj^N~OMU|**hjl~gK&)Q5Hn1+5=GIE z1G+bA3_+vGA@kGRDb!+$Yj9OS@4SNdj89g>i3zoOt<8ngs-+3-?O~6n{f#%TTl%B)o@kaI%oPd zlt5mR)nCVTkF+$e3!c~Ti2TeYa>NofL&23skT5|?Z5eqvvI+4LM!p~(p!fQ9K*5ga z>5Esk{3-lMPMT7?ZOJxGJj_v%$d{sP3YP{zdxNQxeoGJd(d$zHgpN_L%<%o`LjT|g z@iJoH`pssck$`&Bg}q_Gz8mCEdySwE1G&y>5?G%kG}6zP(+dva1=?vH@mQuv_SCQV zFyL<}yX%I&L99`IP3T%hnSDVwxTteQQPwxWT1@Q4cYm1OU~O;Dj?VermjPD@qo7uf!rjXGLmqAh&9z4P=M;Rxjdqeenx zJ}l!S-ysHj(b59Cm7`aKh1s?wvM%Nu_MD%Tk9YfUHs}k!#Ldd##~!99W0Urq4isBk zlH02Gtd#zSMxgqQxqVUEePMJjjc)gA{6P&pq@!O&$`C(9B__`Jl1O0Bc&yOQas56@ z5AwC#&dQo5Sut2J&<1~6(JtMYO&qjO)QQPn8AT(aS*N(Ry2Y_2W*LAPON zly!h^Ofa7+GY7Uf<2T4J6tXM3ww1UJ3%`+m+!{IkF^Rpy>dYoKHHLCS0Q{YOpZ=}q zE9R))goY0Bv)q(5Eq9(FBZZ0d4Lu2uvt|`Y&Rh{~OK7Dvw=bv2Wv6I(K><3{qwvQ4 zTv-6Ov8UyNjJmV=x%&WJ>7pZrLB<<2`~W@E)e*)GfvDAJs#kNqspP}98m_q}X>Za* zV`4@P`b6S#4pK={0`1$E4lp5vo)PljKlX-;5%pjlBPhEg9b-pDaDGuM7VKEKXD6>x zaXY(G#ZTOfF68InP1YHx?0?p$K1Bu-GycsUL!!u`rq8i!RVvU|-CB~J@=dGYYj`h+ z4B-#@volt4QRd#`eQ9ABE!NUr1Eb!`v2Tz6T`uYkj~kW!l5`A-kiTLda%Jn%VRUer zt{{f1nG@fh8TChisbWLYch<$x@Hn-gR^~48Oa>paAIpsln2j?fKN(55y~M*=*Ch8L z+#4^Zr+ch}g>GzXkda!pbQKaUlU6R4ka&JaNbaGW9G^b%$^Vau_I>ysL?$Id+EDHBkAs_dMfEJ03fEyK5KcJN4l#c5U=W5aT#epyW z*F$*~PgUsq8t_ih&?G%ZCVVE!#EKS8rJ_|G8m0bYDd>Q; zi0I@hG79ScV|^|T3rYFc$yM5@?=V)xhZPeysb4-6V^ko@zKd?%aNiYa38J_1WIaS? zYLWWG7#eN_0c#_myn!Yq*m^riFER!OuQ0kM&%o|44R|(7Y$^r=>HnIjC&VX!yA_Yl z@o3R%7n<2G=<^XLFaQxNZJ68E5GI*OMKAQEB++`sil*kZ!srnwjJ2fwS+1 z9k}Qz{=ZD2MQ?E!-@<_fX1H*hsBz<^^!*+9`7MI;{HVnA#>?*_nH;0sqj>-(8I*iVJDTs7+6)<9Co&GOYKgxNkM16A(~*8j(OT(oJ$6=U?OEoX_KQFmC65BU<(;L<)| z8OT3o%1Hf~uM)wm!7PQ~MH%L)SK2-O9frIvU9NFdiKg#ln-bHe+IBfo>~j|#6=5K( zeJq0$GC|}T7cNg=+}UgN|M7;m`2=*2SssnKt@W-Rmp zkt`FwOMGqy4&!-P@99ek7m0@i=fn^fruan>j(GuuWe?|03qKG@17@6ebQV3n?Csx@yHBH0kR6;-6QBoo37`O0)d4W@4 zss;OWwfyr*%V7(mFKvyjnJj8C!H~uA4G(iw(VWIxSBDVR{IWAQBdU|JYmBq8zc6d* zCo%}<8illT3#5gc&EFq57X&Bo$qt8Gx>Y_7T=1krCufKJw;g%QQ=$uUx++EE&6vfa zQ%=iRrq~JPBw;wrf8e}sGcxv(bK&GxfmR&rdeS<*N6u2;{Oi)@3+i`qC$=q4yFeC( zV466vFdXfRPJJpZIdkdM?KG*_Uk{8LtDstH*7jQc-j=)t{~UNISRweRx4sqRfvGp_ z^W+g(%OumEE?5>)>ny5*oOtwsnM{c}g`i6*{e{jD?Lo9%LMp+@xh|w{fx%=mVu9LQ zLW@gNRRh_r3SsJ`Od+^_xb#{G%(tAdCbT=o5^VBAa>$602@5(kCz6;6ZeJ!X&+Xfk z(sMg5{NK|9<|6KrEe{x%CBqkW9V9QRKQ$eP$YjT$=&~AYdsycXwQ&*j21^?YTO#3G zEE;p@s~rxuyS&+?_S&5l`ly96vM&f%4Hg*rg3uWn{o}pOa!stB)-x2=)N*Q!WxJm^zZ6`r@uZqMsZeK-igb za+AI(3;Ne^QF@!as)XE}TUtllnht}8YT>?g7}2M_=V}9@x@F66Im3P7fsnJ4u=#$H zZwMDH*F&US-{CQA9hf@29G9pcZilx>vB&PUPKaOJ36_G8|1PF|KM7Y{?K!+#OthKgLcTV{Dx4G`|qhj?fKjkCwy`XO+jTueO)c_aQV5 za{w+B#7nD2>7I!8#DG-H0eE4T!Q}yZtz~7|aXXeE=A!HTVoMxu9JQkVZ&5|v{$X~T z&|UNshFx(@OQEesSqZZw!zx)cHfea_!8RDY`ubnm;^^xNoM?K{by4rB?-lbvdJH6( z`gEv`*o#o9YQH4i32f1xt3u^diI1<|atY3Qj*>dj^O|IbU|r*etDSrW;A8n>bR@u; ztnq}{F8r4tT>l`gjj{1TKISuO%r|FoV*&P@5+`;Y`THHljWGRnWq|K?4y3o>;gQ(+ zu{P@T@K2;yl#vo3l=-8xe;>WFC31WjD(B6B^Nc>rYJ21 zzK9oV$W#rS#<34kAEhlV1kni|GD@3otK!wR}T;BEk(lDlNc z;GlnfhffX?&C}~|H7!O#ieKf&cm-0kH)(77XG%?cY^r(8p_uoRyy@e7P(Gv;es*>I zcpuw4LP+-51Jtrtu0%xSV$aDfcAvbvK6C^{|8nc_cth_(##0Wliu@%(ErZJk5HNlltf^c53b5?wXIPPJ$m z>u{~$`pLON3V~ZatbQ6gsO!UPX6xQk(9aZ1IVoY>@nI4OY?q)|ejtu<-et(hl|{to}q1N$w|z!L_Aeb`*P!FKe(|(2ZnWMYhPlV(RP( zZC^tMb9z^Gm9u(cHOWB_mG)Y!$dyCf24D#4Af*98> z9&Ar$9834*&am!AQ^YrE89BbNFRG#i>Xy$J6kr@7^o(-3XR>r&(%eo^#|a^aijgC5|Dt<<(^dWF*wzU0P&*-crmyvttgro% zZJtx?NU5(I8|OQ0FHt5SWHbFCmu1@P%mSMzC$Ee3{4rf%7>-b+!9_IMwTLK+Xq%s4 zG~7_=meCpLT(qob!!@UzV&yjd1trNaWvDb|2-zk(DP%Br`O{#v zq|)9Lt8~J|%2`9NYuH|00&fS6_+Hqi55aB z8iWUsdTuOJLyn}Ta+thR)pWoC&D%lZBd&7DpC~ zvQm9fd^nUY`QHA^!msGL^zlr;2S%NA;ypE1y6P>#EhIg2?D!4+5kbYC4@_k zQ3EUbjzh2vKMz=Y)jwt9)hL7tF6;!gj_SP5J|YhvgXp5R&YHv|{F2B{rm-Jlz%p?n zi05Y!*9Ld(s*{5eIbb-Wi4%}y5*GsF0mo!CEwH0i?ejGqa^()YA_NDNs~Xg8Zni8I zs-hEP5RT(j_TrW)P+&D4=f+UuoE6QDhW0h~4u?*=v+0Qax@);{4K`Iz4VxB-4@2JM zIvGYQ0!>*O2p+N;72B-EwpHz{;G|uIAB0iQ#y0lAHHZ{vdkM94ss9dl=;2I(kT_bb zbl^yq{=xs`PuKf#s{@TYxKvFxq#-K+KD*IoS;f_9jj7B_8S4U3Pg@oklo*SgDiKms zD7!TW=FRPr{JyUwDcQasqWG9W_wTNic_(|g$pP%{V5J^*6>SgjMc*5n$sZa=1w;#@ z_v~jJy=LzDMP!Yvp-QB2UNjH@IByA*4-FB$3cdQ8N~xeOvAfG0te2u+0_)X)S=RP< zOSjb*?|Zv?XlEG zf03!N96fGhHdB(j*=`D39{QS!zD%9R$d_b# zBxD6(X@qpYcw&<;=c1yaC-~(xwxQ0NoKZf>yM5K=HF%z6o~{$0;|of#@Q}V63_U8V zFO!sYwsTNYGR6)~5}SiHDajbC*X`Tb_jpYV{IaT?O?7mVR_3m8ncqUJ>$byn?r%S) zPJuP3NBRTee%SNRr>_Dr}M!fpylc;X~nV&R2mjXZkn75PqAI z9}!@DMI5gmgk!oWnRG}^GWK%sj`5`2^0n`zeaIMeUqSia_zB(DB?QI+h}CL}r9BY< zoE*eB7UUty{yn!-`$%}jLEs6gxd|@^!;YWS$n0g106=Tbh?C)g&e2 zhK9Ocy#m9;V9{^jWlSDDUDp)@Z;j`EQ;;u!58Vvp#we^$09#!T;yA52sAZ0b8vq$V z01!VH#8+x~lAC9TWY{=7z7C@+JwCUaP9|5sF^Hfn&{^$mFAs^F}!E^+__arCZWZ;1cz9sbwWU5-OLDq@u zDrf9FYLY5(xSOA@`8`zNF|8RRK_+;nRdgj%4xGYEHR=gBu>#o=w0 zxYQIXNZmY?8BRehfpJ=f=;Cu_aYuABf$UBlS3=l0&{ zkEcviIi^D1jdCjMGWknP4EtgLwTDutADiXJ1%}bxGCEBQozV&hSq4xv3x=-zG$nmG zfS<)l`v?{`&>+NbnMjUXuAvpC{%@m8IwLX@P~bpFed_y`)07~(o6-V#wCFB|PLm4J z^ax@hAxOWl2NajLHOqG!{lzlxCrbEIO7oKZV8~s=_6gdO%@iAl(h?cUg)8;skZD{1 zV~>B`piAL&f=oU^qsP%x>}hfd@${se?{C1ipHI8weWO>RS3QX)`7;TI9{$XCr7L57nzKAtyyFZHFC9 zE1D$fD0!WNf1=l|&`N8mAqeTCz1Z#}cA9^TZoI1G!9Hry!KsWA8CXytVJbs#gJrOq zuVy9USx{8hc2;}|95nZZ+aj7C(xL$E%J>y>ddAN(!`FP7DJ>j`9O(P>L1OYX#T}1294Lf~W)l^{dFxrD-(pya zL56Kr0E8$V7RL_z=H70?xShA(?EI+vojIrAJIz37b}1{9*tbpz`Tt*y*|6p|JM2m51mhF$X^qXibF7Jmx*un_FII z3R>RNK$#s-1>Zv{Xt5-xK@rA_kc%nf(_wk)z$9mvn#i>Mnb!STdx_EB)U#I`sX!Ni z^;=l*sV1;rM%eS73)1%tHZ?#eX~&ysd`u_yRmkTzy$)vRLbG4gMwll_XCexAI-Ch~ zsMausz11H)lrj&Anq(j=;bfp?rT*kG38%q&T}YrMqI08?8s*a8E%PM7D{Og%UGhF4 z`R6G;N7d#rZxSZ&#m-zrFv2)4*00`!aMH_P47NuwRmM+Jk@X_O$24+4vS4C09jJk| zL#&#Qrj9AuwT@7BI$ZXu=m(YWlzw}$7Ag1CjdwEl3tAOE*3 z-4=?POk}hSbqQ!!(AnW;hFnzx6#*IK+hF4$jmv{5%WZ3~k42GeZdU|Yo-(htoH@wQOjpqcfCXBT%=Q+o%o! zNa;W>>SkY8)b}HQ0QzuyYHhyqh4Q_Ib27&y9LVM{X_LAQC8!qROf&LjNd?6-= zRV`v~TQ&~Pmtz7ZyyRa~(fb4m>1c^HkJ*(!#+Pa}ES`z`RH^YCdHUxf>FJhdEj?J1 z8QDD~wuY?#MvD$g-YB!Sn2##;FzTdIaJ${Y9X4GS=NGk021pngwLk2stpSWm05uQ1_e6`jo%KvxB?P!CEAocG_l0^G%)$2R$^*{2WZSsNOj9t9uvlVB}=U zK*u+pI+i;Z>Y5WgCjmHMz{*;-={^dxreyrl8BN>ewu$^Z0d%1bJ52IpKkXXpXLOSv zy=`I2djHxv1n#dTMM$XQQ)Kj>EH|0l6!J$V(O&|%eSU^eJy+MA6V&oE#K`|6&>Ml! zDR{tk>e~Ld(Se8S^s=uQY%BR3O_B$6(A?FJ*$h>bQr;9NgV(XqSI|FzcudZ2p3sEt6(~)L*HFh@+Yy)!`P!L`g>Ha8?H89+U#H0 zqwqzvWVo7sP)>9}&G*Bg(llQtrT!OZ8nchx6pbk?W0h4k)t-96{wa3kXCDa@0OFP* zR2pnbL{^cBM8Q#^&vXD;2n>>8($XFvK5#Srbuaj{-^p`!`lEbLqPYywGJ`y!w*tA^ zZbE+0V8rttFPN&D>}v2hN*edF0-AJUupR4|060#op-fv+PIt!gDX~rO(Z~MAjWDo@ zDhkr=_X9uub}Q9VV-aZH;G_ zMoB82x{5^kM@q2-WL?HdczPNF;Vk=+);-P-`l7mT&%JhpW+a$kd?3LfuH!3t*c=bSP!#}L8hrQb*t#n25HZEsAk;TWx zWzAAE@%63D>X_FWEaVbS`%}}I5>h2_NpCQdrwowLG^6zb+(Oag^^=D2%C{R@4LWa( zZSI0p<0&Duw_LM&C3%fI5C#*7v1Y%tmXjYkX2mqgN)V`LB&&<{K)dMJXd#P?NZN*? zoWm?Pu4B6!q*1D^Nk0ijJJgzt8*BwpT>?lU`^Znb9hP!fp1acXCUz=4CQ(*m;<}oo z%i2TeJQaHlKE3QbZHC^L)`dV8+-{pGED?j?RdnPpY*8?KC~(MYye?VPy|+)LJJMyM zBlzYNVWlB3m>V3Ezl#7zFgf+yEE(A>s(8?~g03O#(GB}hU_S^G>286}kRu@TW(|oj z^bgUQ0x7It9eP^|g&$+JjLp?IZIO7ZGZqqfl5uaExDP@73s0M!K8I@JlM>8hHn_Bw z7o@r=ys=_I4HJFp7ZhMl61mcOBfG(>c8yb`cni?JEnKQ)?*+%qG`$=@@|aQJ+Y-1} z0&*Lrvk$0~kAj3_HXMC{&Ct`a-BAlKN7!)CFX`$2gO=C``lB2O7N_7;ezqWPSXZ`M zg@)^xsd1I2^vK0a=v06Hv8=7t+-Xm*oVB7U$=BWR<0gLGIzx-)`4>AUCL`95PZ8Hy zN{V@mmeGF3YR|IK+BGVzTH8t6DI}SRyz2YotmS=yRF^q0-J(0_4k#ydxICgVjz5bK zu2{}!ew8_M(@|6imU0C%kt-;5m(0Im4qzJNK!dM}D= zpcaUgw~jxHe#jl<1XSg#J1XbT>(Hpji$!a_NIR$oLIFyH$ZZho^w0l}VpLhjCx{FJ ze3|$P(WSOpWJHM9CYGX$aqXoYulk?sLFua7^V{vFFRAIcZ1MU^oYlCJYJB*AzvVe% zBUUoq0EA(C0(!^)A~%R{5-$l^jCe`nyZ&up!*EoteY{%V*BPWtc zJoo~@zsNd(oZusIN8$%{P$a}(I*20wKir5koZ1O#3I7k@1#Fk(4)`wU1Bt29H!W#?c(g1jA}M`2H?z~vf~EL!4A;dS&V1z^@>Gfv6$x-VM_7YxbTG-JRFCx zh83~!f1mgBsvJs%V%Zme7RLe@0E$ZZVo{dcTmJluI}$tl^Oybi!yAkw5aktpKM+ma z-~^Q69&m4XPACZCOOd~IunX|r9fMFTqE-KXRmV3$v&>No`hnyB4me0AiD_~FcevBy zL>55D^n3oyaM_qS9XK3@3kydq$vH$00j}debPEhDM*Ck@0lx70qzAzK{D1rl3p}4? zz~5g+`2dqjd`#kmLY?9HB<`q|iMQXe3NY9mI~~xx4qA{{yQ~x^T1NmPJ~}XAz;O}> zRjgY+FEF6^jYseFR9ON77>3y(fB3GX3jZL~(o%OTzM`RI8#vhSKZdi9j5xx7` z5x>}D`lHIk^W%@IQm?N&N_#%McGSO*L^!6-)Yy*&^p9vd#tuwuJJw}zrqHSxI@I2( z9Z}NM%8mB6wFZu#EgTOjSzt@8eOvfH}ZhR-86EGhcj zym`a=&!e{Q{_*qfJC7N@h~9m^=!=+-uCM>X^6A4LzvyvT68>fEF-`H8ai2xJ`(^x> zi9dara5^*mRO0!e#ix=km%Mu_`FrnAr&6xX4*x3k`jXr!|4oV()H7Q)wYN;nVQ0qGqxbd zhBH|qHP_Gd(>Fw%?H{qUTww`NFW#HSHIMk8dzu98t2=adBjM zbMwVf6?@t*zEs(2yfoT-!EtHK%k9mV#!h?Geren+sp<0g+1k>}_PNH5my6~n{d~E2 zkEan z&5bLQuQhc0;pOW~%YLZ4*}Un8DR=hV_+je()^1m)J-kqMb^7o>+BaRD@z|S!Ls04FwmBiSH``v*&x!nTZp5&DtyouY28o6SwQ*)-R*_2&Bd$-mrucTrZVg`h;qc;J4-w!pT_|>?>cA%;<=5Dy5k6WevDVv zRf)VvF`xiD#)a>F0Utbh@?=X{jaR-yV(|p;im=1Y#)Aai?gf>gM76!d-f=Vmk3g`I zi`NhHRMg-U!9gfJC(>FfJarC7b-lLrkk%8)?cz)yHmTo7@LlE9{&@M?p z&tCYDeifb~+$YW$lnRA_uQcvz9NAUU_UPxqSVyeomIlP)ML5N)s{7zgnV~~~qJlW% zAh+dfg+Y)EhNvb`AZQfDb<&wYiAzD@5VDZ|39ru;!y1H! zxxkg|NWu$%qvCzN@rI#};&Nd0AV?$*{kL${ac))DREi8XoLkb3ahc?AASq>b^ZW=S z-qRNlls;dzE`1bXY;mKQZmM;%3Vq+?ABm)|C+6<4KKQ#zgl8BHa-n;MlZw z)8k9rBF(T;fN*LwW{9WsIdij2zDN&3D!^?pU$v*m-k`qEQF-%%5EH&MAKVnHneoW` zYqC2+A0bYd#PkiwN=?B3Ehxq(l{s+c_jLtG!Pg2w5we3>DqpEYRO~WdVUneGh#4sd zi@ES~%5aXo*i)p>1trE|-a;m-GsHmHy3X99&cSEel8WT1u?5dV;A{}EoL*b)i0X9x zV8nBXkRc5S=<_*0Ia<1e6ow2IYxx5KBUqxdM2=FOzOM&FUE8rlyerR9S?-vu&q5F) zP0Y;nAov0y2ZIGTQsmc3KViC)za=%5whx(_dIgg`WK{MlNv?-z#n(*qh|E{=I4y?B zwxU-=UM2r5+J;(Joygi9h^XYpfbC5GLO~cN>*uK@)z+5StpC8X>3XYqod!q>R)t+a zi8c$AEw@omK2=tgRA<_jDMcojLjsQCd0BR~$Gkw2t`BZfX4SYIpu1Ej6@$NA3fFlD z8i*1*@D`9W^tmFEVx2=!R{^gPKWZKIgF*`GTtz5D7fX32OX#P@8nsn8k4C5Khl)Lk z-tw3{XZ=ZLu;Wvb8S>w;v2_?w@uKV%OttkNWT39-7Ym{JDK#{kwRxsD&3?Jei&8O)x@hxjl^6SB$}B!()IF7Bsr;< zbeQAS!doqUESG#D(h-Y`tdnYQ!~OJLK4Jm1wk4PRphr-a-@y~Hf59Z#ANNF@*B50m zFGdhg@Z}og$1pdy9w>}cV+B>0TfaoR8%gb1JpdD?gZPIPR_Umat`8|da6Z@$!qu*U zV5St8*V(H|@F`vwRICvN$81yQik!oi9`*kO4fJ3II;zQBNuIsg2Xr~40E0UMZZX^} z!6paFkG=pO-Nacx4zjsxMIxZ}b)`j|rw>3cEfblK=ds$QqomuUtCq$w)%MZ)q5W<8 ze*Fg(33PnM|!+UolJ47()6Rs=fC6i3yNcI#1LxFoA4_?$XZ zq{5LGbKhlpn5Qx>r@3hzv^T}vDBAvm21AE++BhQZJ*F$UyCb&0TR+t4uEP(P2zu$W zkkkmu_!eeqve8#&b9n@H2=+6p*gIRF#zf0!hv)~3Nvg*MwRHP1C6U;GXv-MJvP_yD zNJ4Tj=59xw(EKV>8xtYSi|K@|Wkm=RXuodRs5EewapMK zx3)`Dm}1LlhVix>s7Y^nr>-_RgozdNq7snd!8a(X%MM;@VX7NtOd9!EtCe8_3;i)~ zKrw7sOnw7N$nBVHcXCW|>$xCYG6>%3F_kFu*x~CGqs0DDX8ksJ7)0)n%E8)PqzA^x z_0PFV6%_+jz2US}E82UMh9=0op1SN?(a$qtBz#DGnm$K^Y3a$iLY{WM8fQjHb$w=V z4IoTV_nV?M&vQ}ozBEyZ4XmX8Jq_{>Fh`pn02FN~v8RGQ=xNP7bq5ZYUi(d;`SST% zPs(n>NvATE4PoM==*Z%@zd)K@ zdVz@$BIAm{ao6{=+woO!ACXy$y{h@v3Ce!pzR?GAv@r~D)HSaT5t+CmxL{vbKZ+?k zX%IZ}Y_>p_mdf-EKFCDTB_Jxe*cJsdlI&MwG39y46vp2A0y|I!WyWI#4<$ zqg#TcQ|%j!b*49D&F)G<$kGJJ- zAg4k#CLtZ8iojl%@tgqO@|~?sdQUdM>2A$n!mXL$A?a;mUI-?VNkM*8%>@IjFJrdu zj9b~bo`k1CluA9~Z5g>h z^JVFaRkF&OB3kH&q7Ps|@=8`u;&3p7xq7v|E0f9J_h$xjtJL))?DPY1&7>ZR$I@eD@poyzI2d(RD_CDT9$*!TM_ja)#JhR?;s0vHxzIPEa4vc zNs}eRoK36fb*lXtdRmONMb(sj>qQVtYSk^lA$4Nm5G8kMXw&?xrG$+OXpe4N&J?%& ze>8o0TvX-v|9xbx-q{W_4>OmU3tZ-2mOkCd!BRN=e>L>XBZ>= zl)xEPZ}IT=Tz`9e+3Bcw>;kZ{Mv=yOGL>nS?G*YbO{Q|9k(o5|Df)#S)9Ys9qMl~x zxLHWsdBkXlXdi4eg^PTy?%r{Ro_@TApisTTVeCVK(JH|E_&~%0Jy;~o*I{RlV6#DG z3y^w5Xv6mhE-7DWh3|}boIe=Hw2IFnAV0if$JJOxae>-nFNK9zU}%#uZF%lQgo=BK zM~5w6AAc~~w-ecA@yH=;?!!er`Bc>%1k^aMVtV9L24G<%>zO||tg89-aG%D6K@I3D zfAOHy@_#z2Ky$LMyBp_%-avmddaMQ%n`YlcWSXIfrO)QuM;>C92AXqf0%#zE*i{!k zUtK|a5!2281?-}T?N}$9PG0p)BBHF#0qjFu7&u_Q zl-d)CTe(Gt2C8FPNQW&LF~XFmEwx~EjIcvt5~piGekMFgiTGD|u+W4xq%73qT&g%Y zQ^~)wls${b&@xs+5m-O!*P8qvk!jq_u2onabRutnh3I;O5h>B2iQ%xx3k|6ku~UR0 zPUk}|<=7QW*XWBTY|638q(2zQ5w5Chz<3a!zseM*LRhP15-U%Lffzp7#OCt9qRm0y z=-s+vR5s=I4DUwwy)|0I=i#u4EA88R{bWAJFHPY=`>42_0)YERBYKp*ZxUqbY zM$GoHsCn2PeF4Oo;Z>cbI2cic1YCK{$RFo!!bNiaIkc)kgrk21LCjK{`7~OL7%8rLJEhxHGlIfJ-Nlc5cXZfv_!)JE&QxBmXOx z-?Dj*x<$A}9gp`2_O?9(^cBwkU)ZEk`Fmlyp4{Q;8)qm%Tl^r*MlXvx>+90)v>%Z+ zzRT#oS8uAoSz{m*UWkS$UGaXD>qo=q6gP}yBCas@$Eaq6!ac*^og4C{6`7*RQoB>W z4fGenx9VzodR_VD9qYn3z|}GT5=HuX;W|vKHAQkdTOeCKZzqXdgs8RKChp}s_Yt^1 zHn1YXeSU!RZBf};;X5NAVxokmfP z1&Qk6@wyV6axcCJ{lIjOm~o#BH{$6m`q3!G58L6ZXk2%lGb63)G)PP!oqVJG5>3(_ zzX18~@Bt2mIdraN@=Zdd#J&3xXWGqBNo@z-haO zwj0=+(ZMya_2$uE#hEnn|07f|m>&%@^vk9j16#-^hPgP&x0&119`J1?OK{owHDS*Y z4~Mj4?CSzV9m$LtyOZe{`*jQx!dkM>ElM~AuueT(rK~r{LJC_~~P*-J?4qsITJa0|Aa?djy0uw;vF5QONy&d8`!j~JGYwO3;GCZYy15S8R>#IO- zeXVumYSfH`+I#8gX!SA@FBWhkqjbL(Zbt)K^(FTeW@e^4(F_ZtjbEyr`GTPmSu4%* zqa0V!)y?ClC8|4`x`jN)q$BDC9Hc(!+sGD?kD9YW{9QaY)g-sdN?skxo!UG8P-@g8E78bs6Cc<}W{^EN#u9)03=|dHd`(>=9G)Bd z5&Br1sRZo@F`)Y4I33OzJyJ7Q)88xXw=fO-c(tQK!+2fVaa==Jr+?m>Hz$xT!_1{Y zywKicddGI^YAegpp48$xz&mHqXN{h_2zxtyDV|L*{3`)dzlRrhgrkQXsmf#Gn3aUc z@A0UO3p#6X0lEO$@oa&iB(kv)mS~v<*Dn?W4uJTy?^=VQW;2C9weCWO-irqO0TqWo z7;a6#Vt9jy#A?)61u~V-V(rw>fWx#?Y12U>(mw^C7;LIaAjMtd#vUeL&YBvWBD}|; z&lE)KkwZHjUNxoV8xWB2_3?W(Na=#P7BU4AbP;`CEhnU_nKJqq$JD{7%~m_z|;gj-L6yA##oH52id=;xP!R^Ty_UJ`X{RWu7bb)YEH&sohy{&gN!hxYJ^evz2%_USJZ52Sf4dIdS_wcJW758iZE|9Pc3zs=8u4WWjD&NP4KeV3C+LjtoLL*ky+|}Db{)4XdOqW=M z2V%v>z+bAiAQW@H2kBt+zN>$lC?6A;+4<9`AsP9_l^;wLce?U-9ps{JJlv;p+D0($-m4z3lBbS10%T#8;v9xp_%68 zVwDyDQQ#YR1hXa0>BE~E-(?UnO=nB_9}@Csk31ImkgG+?*QDsk)zWIwMU=3Rq}}{J z0vCNf1FHgbs!@M$<#_a<`)`a~Bq1=>+Z$-RXe)b87oscP5v(9BM|pX#_thx!qpOjm zU81RIvAJt6vu12fWe0s+8(PcO?wP=Ncic{zAz)H94-}u3Jlmr9^Az5ZB2yUl&Y@oV z7jHt4uDvB)n9hmUCmFCgTN%U#m^hOW#ak1!&Ft@4F8q^(MoWFcUzoP=S{kc{Pc_&m zcXU&q9?oMwgWz2Stc@iv`z9OkrS_$-cqMH&|F%dj7-sb}1v*{3qS&{P3M+htytl5= z`+#YXf#;EcuRzmaB(#OD`kXu* zO!=JwHzhEAbrEG%04gmU0@3v41d@d(j6}+C0CnTy zJoT=6tm@*R4uwz9h(W0uwiWF=Zxc|zHymORP- zmvhjT(mPhCLuOjP=Qt1fG@`DO-jggcTD>gdB=()((Ku<1iJrh(0l!D1EFn-wACv;U zt}>P3Ut?x|W(=9fa(N@@>V>XpIIhf&43He;k|Q z2=^|Ki=PleRo(PJiVCCRA4_BE!nctBDvK;^;nq6-y+n2q;vW3ZJS)*x!4R=ZP61=G zsv|^`!SzdYU>Z|JPijoQeRI|OeggF)mqNnw9g zoC-Ue?xDNr5Yl>A3pXLo)6`2V0d{I&v4Es4`K>qurpxu%cJ$IyHgsay9fMJ6-!ml; zpDtZG_h{jF(p=x9S=-?nj$lI+NeiIg*>WqzooV(Wb7^=7oq$@s6nUoEeQF$>$`xJ$2(>6vyZD*tbKuQM%*EXzXU z=oAQxxL9a*?Vsoyg!=^cC3uheUm1Bo)zASwnp~^O);ne)8C-kUDiX_dr`-eRQvi~- z4Dtb>qD2?cY(jD>a(N!-EXWb*vrX?z`v}w5!WK3O=GyFbd}HWihJA0?lli}8U%6D~ z36NRco@Zkg-ZQHkbLicZ$0y^HQ{InYTqs~)$-ZMKL2!eIPaLP7;EGYTGL(S1b&>J` zjXI`*zL~BGdM?@c0~ z*-B9{fQ$_6N&k$tRQ`_?0Cn+2a~QT7U;RV_#)OW&NedHPr=r~JW5_%llY024CFu>J zUkxYB!y|BW^rFzXg%yf30cEWb#VTB(8MvOEi!()irt32X+f)1d!X-|*Hm&$W22iiP zC0XM0uM8JiA0IpsxIpak9XdXo63BMUOGMQlai?{N-xz$q`|fnVi>g^q_XJZp!n#b^tb7M9tY|lnQH$r{;gOw#z-_P59nbBhgfN-9U4>UPTR=Os$MTW znTbJ6bXxK*Z{8O%-YPj7crcoMW@!O2AO6J@*bp-Q@4r|FpQm`T)+p|yO;2n#ku6kY3KhC!B!+NP5{TkW3gtHcPDxIizea!IZ zM5fy9&)D}Xd5-fpcX=jdke@F8$tLO@p7t!7!ztTy==E``75%Q2JpVQZ{!Jhq##&L1 z3G7pJTID;9+lhR@5fj|3^M0>F)QsAdCw0TTyq{xBV0#R&&vJRQBNI|>S07Yl#ba6_ z%6tML-(f6so|8l{y6Bjk^@K~%w$7yFErTC5%IL=LV&}@;I{F*t=W1w!RUgmC8w_g4F=%?Jo;f);LsVJn4iebuNstF{M^p)Vx zslOh4I@bq8*MR#X;WkO#uCh%R_okR1=St8G?}7)ePe8+(2juaB>yD_vteO)r9uJ!I zD*LVS2%?ppD=tUovTE2N(8F^0+5ApHr>?)z-5u@u2`x`I`+}R5g!FjSuKQY6c46G3 z2~v}+i_%^hJBe@&e~Hhn@<)YZnPwS%ClB*aV{c63^~y`>c&-+wkMb)2YDkb_amuJ* zF2Iv6{hf7%bu&{VyqH0)2C>Q{UTN^XK_(ToaaP0`#Wfki=Vp4|>M|03r`3W>+=0k4 z_&+|Lo{dH)vK^bqa{F1`fUR@@DlxZ4{T@z`ZSW8kU)Sb3VW+Z-s1m6GYjT=ja!FaIZ2GN9W>l$m510=5RE+E++8 zICsLzWSnZ!&@GR`S9;uTaiyUi2uxOLbZjT%r(-dktt?1aNp4Y9y^ARR4v! zes6FTvDZF&7?^Un919_}Bp|+t^7iJ*cM4b+E`2AwuM>;&VXB?hPhuM2R!1nE% zxIs-79lqT5t3iHM1|(bg>ARW(o0?=#VE`HB8d*qcuIw^%TJX|lWiLzs}NvQ;R@v+V}yiJH4$ zoW_K3Z!<#avvkr1%DUJl^`FWLwX|E+h(bfOE)g(RY&zUB3B#=H7BNjvTXYy3MejGM z%6di`;47U=Wh8mzFS;Y$`5TAZ$ArH|3+ZPm{s+*J6Ai2R#0+bJ0ZAFF`$!JEN$(ak z1wulm(HWnz3RMBNrXKpd8`WzK`ua0WpS-qE`jYQ58vaKyd?CEw@sAppO@HCqxCQQt zlYav;N&dnp=O?4G(Nq%XK-(1epq%A&O-zu~81>2jAj6l6?3$u&n7EePch`% zd>EX@c;)&e_C=;#xOEb_EcIcFr$U8sGCgcS&}7T4Oa-47EB}z_E9f}IUf}gHV{PHT zFrzp@W@fnCfWH=@W|UDpV>98?fi6<~tETV=f&J`tVwL^G0me&8h11FGJb6VC7;FdA z&8s;S`HrZ@&N+gU@dxl@g4mEu_U9)?s)n$Ast%W61H&O*Sxea& zJ^c8C-zyn9S5DDypI`v+xq~i0;c%o9Pfx;Y2R@YL_Y2XRB7v{e2OHe$CeSY?+Y{ZN zYm`di(pS7!Z-}Jy^n|fYVg$ppTGv?$Dl-W~rWu!{D~*CQ*|*XACnL0Y1}*XmURBXW z$ERbZ_{IWRZfwAw<7O4QZk?+0MY5>R8c{x5A^d9NoAkPJ%%PUDkhkGq?Hk6X;in8; zkFzAO>lO@o|3MA2UC8;TleKWa4h;-~R0hwr;|7aJ0!Wx{*iNUYe+rWGKjS5y2yYuBkX-o>PeewW&m_PlETzcNQPIF{$~*&xwsi!{bM|cG445b z_^pUG+D-V5`kR-+wyX%$Di}4sLA=&_pjjOGJvrUxi}(#7cPec!Q$2X2@0f6mCzItu z0X3+DnU^LjOU&xSx&~w=^SAI@2Et}ig6wCWv5$}vyaR*aZ)LD*WwDhH_I0zRejxDV; z3I{dsl;Z+=qz@het0}ULYU^;aeeese$oUf`=w|=C0d8?{{+53JT~X*X$qyL#`=i6Q zq5~u_uJ~a_c-(|~;Hu;0utZmMM6JFRccV_ccE9w|_IwQXoNh2xAuYJKMLwi1`P+B&nx5ibLd`EG|9{6_`a5V za#eLb@T!2C$@iCG4wsx_3=frQ@_y>24{B*GFf;hG`Pjb>&|!i8?#0xhvs#Q2-QrcE zwD5GSr+OUuO#o8_Jvfk|?9Pi+PkJ;*_$8k>f)lCBt7{&x)qtbK&>8CO=#_pd8zcU3 zy)Jmwo*eJOd~tO?yrP})6X9n~8XHlL`2)K#{m6B%iG9%6?D3Pp{4M@jQR*ySkM84q zfrlxPbBwuLXpO%3wkUjxgF$yD3E$msR8<6FY87r1cj@NxoWHXbe#wVyj(rF*4pW|A zq=$5YTZ=E``wEn=E144az2G}zJ>cCl&iQW58Tc!u_yGcQw3yO$Gfxw2VtFO#6nNMN z^R;qK9%>0`#WcEDo3`KG90xPC;$k<4er0eT_mWO|krsyod3R=dT^XeF?0uzmwpdw~Q$H7KtJAtMLJk9f=Ug*nlTk3NW>S6Ag1vdJ)dS}rSR7elGW{eBkx&s6dXQ$m?4vQ=!- z361KS3;5Oddqzfy%XKhYyjL2yuLH#WYW_`%71uSG#ov@2lIYcr2+yb9=-wSAiB*@f z*b^|C1s1msA%y@RtfrY}Xyv$?9+yLFaJ+9J_X>|!!kC2*CWNV4b5LcZX5|!R)HVYvb8x440?Jn9ci|-_mKg1DR=-uI8iQ9vnV4C$cIa&+Xa){j0VXJo-xN>p*fHJ|C#=yR zgzqY#kwY`Hv=`xd75dWHnp>)=J_Sd-A@xBtZq zWO-D@U4h`B(O)S)Rl#3jfo(>7TWEGxZKsASMgx~+PL!Ir2F5c3@3#gR<$NWkuzB5S zIDfAWyaDYg<}YA#A%91H{vySW2##w)j;m8e&asB#Y2(RG7|LXu^yhHW;G=cAYGixE znJO9;gLFbX!@NeUxx~&KdL52)mNHzpp|!Dajmu{ek89uwe5_z%Cbh@egG2XoNEa8y zDfTuPE%sx%c5w(P0Iv(ULPH42^SlgZ58mCyo05jlsQevDC?9lr@K!wgenLHTYT3iZ z(YR?wYD)?ldq$)@urWnB<+32>wcXhigpVu`u6D1tz||R0JqsFf+3&27Tv#r}YFyK^ zE7H>WKb0bkLyQ8NX+YY=jd_9H*gL&89sSRzrqW+|`EGqU!}LER1A426DdS(9#Lx85 zkJRL8gwqun`+caH#Plw_8HXsp0ok(wUYvxPNxtPI+xfQV5+D9t*NB2av8I}JFf$>m zP<-169+^tj>L2BWby8a36tB^OW>(s#vtlowVcJ1T!cr>loy?V^-%JJiKg)3>wfxXJFG+_5qGLay*wk@##1q!iJ68eOZIXWkoo%7sYtD$J0V zi~Uz&?;u6A zVv5VIiA5MgnTP9|Jga*Hu@}hKJJ2voUSLM_ENuiiEt1anF+#=->To4yGnB_EX%@s~ zO?ABk2vC7Nab$?M>xqYqNYd!D&?j$M3eW0=cFN2Qt4SN%0RNc3Sc}x0p(fue*x0mi z{4Y5c-0Xz9TH@iAO8H_Od$j&*`muUg7hj9i^SQ`Osyrg>)T(FV&eB#sW|4!lu#IeQ zgf6Y1b?{jw#!^=XBRMyJF63f1dXI2}UMSEHy~1-Kej2lMwq`Tk zK}=Gq$E*PHq>-csCR%Gvy-4LoYs?|5V_dHALlS>|noPA4!+x-Jyw6fl<+2sKki*xFV!`IFzCPdY z95QYFw@HtR=z_VtLDjpIL>$-ny;IZckiLS#&UR#M;!+}b0>^;m(ml8$T809`Jcdj| z)(@TE7$I)$OFf(hT#W{`fo=DVk=Y{f8u>npkyPyk*GE%d`A zexn`!sRMn6`U%?Vgw|;^Y>*r6?#&)(Zb1XowxF{YK3|w{2=bG>95~eOqC-iGW)QL_ zvd-yLf*GNVKp8|?(R~E{d3$}cd5r0*Uj*;laOHb&B1+PyU>nWH#g4vh9~RFFFk2g6 zhMRh1wx)#M61MP28Z1ePkGMVbHV3-tm(%=je{oj6Qq456OKBdDpU=m>;p<>sGP0ue zm3Z+kD;V*aYEguMhCcae9CD}OnpC)=Qu*5p)tvhf@mbj?g>1FBT#1~}6yKE>>EDS= zO2Aiih~1$UUt54j4bxhEZ@E?D3-?JODAOWY@RW(ZS?L~T;N|EQH5mUE>OjZxD<@D1*^5BTM1PB;HkhfFwjqOj6)cI-FQA12 zy*UH>8~G0{dnJ67G@4)2G;71yRi4LGg=>p&W!7W%LJX$UU)5X+{W^T`?9dvNG}Of7TJy=jh~%vQV>Dq7)f zj@=JWNBcTSGPyxIfX{7NHRyG~NL<9A&1{D`qPQ(zy-&YKRTF^R>8f5U`~j+97yL1i zOwWph@g&G}Hjvxvo0K-AswU*v?k6+Qx@73A2o+*c2)^lsel0#cN#EF4sC{V zl4##Vc+jAm-qhO+N9rMGvb2X>LG5P9o5-}w(Gw$H<8|a?M0Hd-E3T#IlIitY)$A_1 zxy84N^ha`CY~nwev|NWx6|8b0$?RDRaum@*-TPYBFU4O$B#+`Y>&R{ZJ`=~nWz&jFjG;Wi6=$niTDGP8yCb=G4e9*kUU;lnjdE9;6D>E;5s*k@yYueB2-r> zanrBj0*Cl-xga`-wA*UwD_Nw5O!hdV=v9ehcR8N$x&C4z$hLTIz5Oy|>v7`jh6S9y zMq;Iz!lMc`)CaNzCuM@eU$Z;tH?;UnX=It-nM>oUN4(xn*1qi0^P9)5s6VhS@Pi8b zoonq&Ig~xfMe%9Z8nc2GFjRoI3cWp3{>Q9Nu|_i~G;J_-XDm4R9U>h`JVV~A^j>|ZjKfX z0@@2t@|aoJqz~*vjLUxnX?Ez94fm-Lx$mVV^WX!u_n8=`d(YKuy$(fq9W+fOr3j+6 zIkD6_i{blN@;RnE2ZA5Kb`4J2zAwnz;U#}6)e=M^F53TSV`Dt zfY}DgSoSpxZ>MYYaBraKN)BDs#VO4$k{mt`*Qtv$(AbmeDwX_h-_vDRWJPRe+t5Ml zg%pzO6?IS%i}TDFnwimCVBbIC^Y&qws^#Z(z(Z)iBY(vWz0S7cim-R|4yi<*7tad3 zLittmXRU`;x+@*t6X=Lu)n`KvQVKlp!Gpg#4uA9J_I|!G0uR$29PDiaed6V1hKfj< z$gCp~(Ab+A2r(`(Z*Uziux}nV!O>h;TO_vI=%LiWCtPcLh_A&I=ovW9NgRZu z!~1-OxzA!Pq}7YzD}nrpj=RdcQ{@B6b`9^ZfmYp)XRs1Hv&jGM$bj#5K3hLLKKva2 zldO=XzC7XKM5e`cDvzYg+1b(y-WCQ{Ef_&DXRp|*!HlXFII35#MZv@$W$@Pg6PN@x z{9qs^tApu~pK4IG1>kjx6qH(tMCd~ADY_gpv&j^d_ z5WT2par1Z{{zxI;TD^7`-W}>2B2Nyk%yQLeFU-%?;aN;rhHXY~Fh$x~^qLm7l}U5- zr}e)<>O$nGw830`O`&p3uN0?{CuT*_J6-%PtN(4^0BRJDFYuik@m^Y!TE(4*>t-@aPX}^jHCGx8Img# z^{$S~GuWlNhzT&<=2Z2B==M00p=#;c{5bM_pPTHu)Q*w!C*D?E9_el}iCHDaSCKc7 z=liz?K2q2hhVH}j=bEt4co(Qws<4+D4cI%diFrShc$H7*(Z$nzKE&;DIG&o#8&ip+ z&`d(Y$2#SDK`J7Xb%^=&nw@kZ=NTaON2HsA*TPdcCm4D|t8D}Hy9E*R?q3q9NYRw3 zLpUF>m*HbHp^)#6p)aQInl*IT&9g2i11T+d=mx-6nebnB9W?66I?s~~lQQ;`tD*nk z5_l{6hM&s$`Bm_gHK9iiRZ4?W)Yd8_7iB%PV-<8IRlaRMh}(7HXA3%nFTerxf}81e z{G<-l+0&gdf(>m;AwO&I+Q>2?xPi61-yc5~kW*^BX`H@x#TYtoo!aQ@5^ncF{7Pdt z#Hl0Qqu((&4Gp>I;56ke9ECaI1DUC$@s%)#(iv+1Z|rHokR+Hn*O-QUJ+eo7o==MQ zcZ!3_{DSOviqY|3p2vH2m;RWE^*LlNaNxs$vB2Bb?KKn%*|Qhh}NqeEdifP7Rt@^Djn_9fJujh z+{e-}BSD(YbW5kU26B3 z#;?5}8q3*La5~qw7Vg$Mj>R9$+V>xL-;8{Rm-9wvhyJFwmMWNp`+%tbA##7LcJkLO zw4lIt#`Nhm>g!fK>iUfY;h@Og7C6do4{k`tzp9u%tHEyz(mQ$(gLtD4U25+wC!O~D ze1-fuEj^=&{PSvGO&x0^ddu|cQd^C$7H-dmBbmdgID<4q(;rYnms=_gqjIX)Us?zA zSA*Tc^d8s>cd2y|7c&}b!Pbm@Xm}aPGR>S`XPaKe_Nbq{=!+P7Un&h|&=?c*l5-*sw$4EnhTFms0AFTc4Y>pA$<McSc|;#iP9L2aj^QOkQ^;%>rALN#KE7>$R}OOcbuv;KtI=zLykEn z^nVSl^rezIIuV)guCE#XW!#GdcZwSn@2PRM=L~_Js_FpDHmTZ{LW#p~+fu}TUaq@kG4*j6S^C^_mVgg7}@m{4-6{iwBKLl$x9ieF23W@0>|qS+r3dUyWH= zGcfT1_L$IgmoJ!Y_&1!4o|=rKYpj25Xg#|)?J%-FQq$nQ3iQ8(r%g<+(<>$N$D?6@ zD!1ms!CREh^imctSR>Q_0NV01oPsD53j&K6hK z1M+mmg%GbMXUpyxPaiUDHR)dqU(Gd!@Dj1R@=beoTCbN&3o)V6U$4K(*X!za?3(dK z9UkSzfp~Ph!swkQ^!2vT+q<~l6dSy$XHP1hm~zi#0p|M6U4s)=zM#X@fqC@t_260Y zf3E7Vl{Y`lPQqLa>M4LLv~Y!5*{=RzfG4YyYq{PZ5 z4IoU}F3%I352jhi9uq3L;ULrCzIFxjZOx8dT6H%5R9M&(j*{oh0|!;!#$5W!QF3+Q zELx(>wee zQym`l-=MNhQ_jXpc3PXGszBGsGGTTaJdz&%OJ3u%7BXHqYDT(kP@E{q&77;5G9Kp} z$TG6&t%dqEa9ecn%`cb@Lc++K+7Pi50_VTz78p z)XWiot!1wJFHcjYGz^A#UKrmK9Wg;GmIkS*G<-oX*m#%?Z z3>VADaq%5FQsXNr%?L8yf#=zU^iVY2Xc*qRce_g*HSR(cM&j^ZvMTG70lU3ycvPq~ zDDNi0HcaJMO;eYOcZu#8A?<*Ea*>AAT*IE=k4^Hm3BOYDU~F2JBR88rVPSJQ6tKgt z7|-h%1IH(KK$VBrSOC)am*agl*As-l(Fj>_;ctm|aHG<`0X{S$yYq>1^0KPS$$y@p z$jyk^4Lt8K%)!UN@kX)wW%^wfhXy2UH=IuzopUi&c~_^jyUyY}tT$qQD_^jg{loKaX(I+^K2d*+p7&R7z!r)B zW{!|vGPcw^w+#C8lm%C^J#>dgu5_r^!FG=Ro-K})Lkckc!dF*|rc$qKL#@8QkQ&>3?Oi?Jr4q}&BjY!)PD@T)fwkGT_8Q@YtI zj-#y8?!~n$B+lYHeDbRt3>l#z2i+RTWjQ)i-k6Z)9=3M8h&wMf=I6TEr{T1Y-)n&)H`A}aNjbU(El8COT+IY_ zHVkIcf9hSYiu7r(djaG6d_1N$!)_xJl5d~Gel&0hZfPp=5O{D>&>*MQs&jQn(n4d^l;x&OIf2b~BaAqCEdi_BiO+;9U~sOjEQAJv$ijt2weo%U%)AVA_M<;dqWf zor7!qS%p8g%2&kyvScvJ)i7RpkmGNiMz``v=x|i|J_@+_%Q0hrkQ2B)%DjQ;mJjRD zrMZV*2yuu-sq>f=#Wobd#Fj*3s)O5r(;qHc-gZD;K5UEj#YUX(ztchUR5B^PyK5Di zK=rpLOcn0Z&>gb0aqI(k$i_ZJ=UDK*cr=B+9?#y}aRFOrDAS)Ph#LCXAE&IfqusnD(6K9OUd{2IxPzkzY7#BKbMKTQT}`ew)k>)%#Md~j#Y9t zLObZck94aK#xHs-1Jq`CAmS9w+mK6+yo*KGAx~+RUf7gLMCtUu!A>`W0nN2r)S3Jx z5HFgfdG7O0{BL?1#9dB$G{LFhYjjkbu{X~|ZfJ0HoxhD=Xhk;c&C$h&G6cpH3LA$Q!^DKU{$-bFBu8&Ns=eYbU z#RoI|S8**UILcd#KW4&mIxgg%PJrsg294{OYOq)RTX9JmZYk}@-4CX2{(Z}H{5YqQ z6Fv3{GQRJ%`)}FoDqNDKGu}WaMx#}AGld(^tyV4V5-(}+Px-eL_h}OxnK{<4Z^GX{ zYoi=9Nw~p9H@N6J3;%)>%ue`vBIG8YIHR9}+C#ByEfgf67e}#>x-{@4Rz_%EW$0Rk zNp#{a*Pc<|y`Jk`=(^B~%=EdC7lU5Q=M!OVG*6}yFaMD7U$DziOZucdIHSj0YxLTI z&MEc}_<#NrxECp59oaA~-oDYDIX<8^u7Mxhxc=TIV%KlbHQ}mDy#{HWtJHresGNGO zS`}=C597!+)LYU(7{JG2p{3uC6rH-bCld!}Fl( z?&9|vnRa#Nbde3_`@IpA7_V+CPcrgHMQ^*7U28ZiUlzc8U_KX5h4E?ySzGG>srzyqVV`{G3iR0-0ZG+A3ZHQD zf4k|ejU9zb0{B*Bu?BoO!43#+<(Fg#u`A81;B}jKKBvs&>dVcpz-;t0#)6Qsfox%4 z6s9CNAFo+!&P8~DP?$!>yOwR*ChVuKU z4t+p=Pk~=zB{e<81r}XiVsBQJb;0MJUH6DiKlWbh*U=wi?N35>Rqih7-Lf9$%2;WY zJ}i5p;jbh~&Oc6%PP1Ptuha5P)x)vq5>P{rtvYp-f42ge+)>$5rm7r^*cKGKaC&-r z61&ob&TMEHDn72auf~~Nn9(%$CaLAnFi9xaA}RHrAreDA5r2$PHS`ZgIq&3;C#z>e zRi^L>udK_+<%Jh+VEX)R!qA|dg@+Ara^jw29bxf{WDu?7>s@j5CCYE=N=ApAV9<%# z7pOtvXomyehi@0*iTpE8*AZ&zL`pcloAaHJx6E*V#;RO1Xto~D@e^j$;?Wga@m`FD zLfeJu0NHeBofHLAvFf$i7t^nKDGrX6(rePGu@L+=#sylP($K~?q|?z}=`_HYnR@RT9r6nLonW1Ja8SOUqoMY8p@$Y!Jn} zxdB%ZJQv0>Sbp3Clyg)&B|E%+l`kau=Z?vn;)XBi@4|1yhtj2q$jenY#~~e!cEWx$ z4X0C-#(zJNU54;+H+_C0-{WMw-WwTOpaq>pyeggC&Gd|&h9w1qOYo+kZ>0L~;H#pM z>;3yu-!uqX;H2F?h#9jK{+8&SjpEsDV@b*Vm+K5nI{kUR0WAaCm(v1V!%IQk%vD{sgc5kv zOg105ha`m_@jsuxlK9@1;T-^$pM%lvl*6%8-URARL=M z@~Cn$PL9)zJf@H~4t@DTkB0=Pj6rMpUtMEa^#(X{je^(H%kAjN(d|WG45RXTV%d)! zrJT4*Ew0zV*;aRD7B{Q21MVC|))h%I^(~Do&gAszw7MUDw?bP1dr-cAhP04gpT@4h zHzX)(z3^QOYa+6|K2A)~T)Lj!?T*G{Q+Gycn^l z+AJ6+N*=jpqWH>Pu+v=sC}IK-wcGzNS?0e7n*sXTbo8g`Tk10u^+hO3=~?iCRs3Rr z@6fQl1Bc;-Sog@xC@ppm2OMli(^-dZZ{ zU8`-VRacb?+$;W{2c>Db70MV{BB&O37N&ZfGxO^u9k&U9FQ3LiY9C% z--#qaJ>pG_x;XxsGgrP!rI=vj=r81=<5pY!Rqj!hve^h}`QmqWCOy2Fp0=yM4?M*- zkn7<@5|(Ax3**jp8jmv73a<7-x}XnVfp94s;`HntFfS6l;W(+lIYbvbyM*8SVS#H` zv18#hm=m9NoTP(W&u$NS2J^3+ckpsxR1Bp!F>^~tj;oWwA-nH05;t#1#0z3um~DmH zDy6ma)C4L{j(BM_ph*|jb^3>kT&64Uv)TTCelXpvQC6AgD`8*7(k#H9+`U~`<+)TR-)Cf8z5?;;RL6@_(HCorpLIE=<3EF^jE+_VBsuuUwYhY7 zJpEJ}z;En=S~{S|!@McmacX|Cis=6-z!d;M> z3>WGUjoLOzp1+8cSl3`4IQ%#b!&nX_t9n!VWt0Hxe0W1C{Z>fU@ob*TSt6F`VRxZp zt50PSFxqgm;9YsN*n++}k+`zq&(lu7 z=H|b+nQ5-M3D_LmCO$8@@|hh!z|-2aH+JQy3sklcf8}OrHoTFjDn;&XCDT4Og$@kT zx3#0~Fs%$Vo284d^Hv3i5w?Xj?As)|y~l48m-^Fl)BwI>P@QUB7DU|6}jXXktQbLO1;{@mB+`n)d%2$R|MM6afc=%s4f2Q%?1NH%tHn4foh&7; zK&FhAR=U2K5HHiep85~}92o=;(7g@+?*R$P|7$+Ne{&1KI0KClXSb%3|1IwTtb5?x z@hAnFFx39v1OhJ*x5_)v{x8RMoU0tXI;dq0|A({we>m&^pK{iV&aazN+oNAUwc&ix z`f2m}*RG$w;Kz&WXFT$!bkfX6)!CC=OG1}SDp?kHYEtQnAp?rbR^??EyVp%yay4qB z=V(yHmgZlADm&Zlyyx(m|KDKib3S->!4EwFTOXcy=lsO23xDljzje{QA1`lx}pR!)fu(l_QNCcdmNKc6I0K zG0vc_HRB44yVg!D+1RyiO8wQY^)ns~+O?r{Rq?Kk727xN+BEyf)m@uwPX_INrr|>I z?k)3fY~20qf}gJL-uj3Szh~QHbn>3gCybl+Y+r7>wr9svPQH8R>cYw0UF%CWb?@3- zf317>)<^lhdv>gvytjMz_Dy^DK6m8W-scXUIq) zVh;5vGGY(+@(W^*^jThwef~`Py>A!3pFMlq3m+6t+5h6@lFj>%epLU_{+B*`H2A>F zpRby7;Mjk*Z$9wKH%C4?@ahjIgAcxT=faeO$A7)C`QYpKe){O(8-M$R96I6aKlM=0 z!0=}dom3`%eCSQT;US0L@*g+#aBo2AGlx$FH++2f?Xbr}j=U4Tdg_tB$Q{odIUV!- z$4A~B^k&HO?W}6h}@8*3%l$PhmOzpQ#$4;d;|b8u9;w z=lvklB_x7+r?H-jWxiu|1Y8)+}!^X+GC}|aLD>E z=lo3k|H3)98bqc3cW>;tKG-DHJmA;K=Vr&V@yI3tU<+Y<9%RFaY<4&!8SPQuG5ini zy#CNI1Ay1{4Q@A_GXIe0rQJ#3tNahxd}E{ZU6Ii|;LIm{W3VES{y_*2n}MT@bb;5C zD}FKw8<#f%;*l#K_~lJW#d*?(~N2oviMks2NkI&P&xV_e5_;V}~6bQeEw7^rH0H z(b1D|EN9Kgf<{J>P444OcT-v*c_PzU}SD4=cuOvnh-7tF=dA6f&lOBlwJ zGrhSS9TaUvRxsm`NaiW2%Ifq6Mzh~&Dp0RfxvJ*l8dm&IQZI@c{DugR z#?J>Y1NYKTgAw!8V5s`XqU}YBM{m;}h;^5j!*KFXwvZzlIcTldOfv)Fg!B5V*)q=r ziJ_z|LFe)k{9Nox5$V}@`|xE{HI<38@L@JeL*k)g;9CHD{C@-+StE0g zNh*RQ#6`efO1qIc?hS8pz(iVZx(6arRp+1Lc$ZIv zH>VrVZB0W{7C|bzt8rsG4&%{x;6o|H=WePn-D|~IIHr(0q}H3P7k%ZOD;=cx*Pzk0OYR}xVQ zAS7-pxX?tO>?{d8CJ+W(^vFH(jd+o&^BgO*M`H}eHARP$Id0xg-P9=~0N}>F^nZh! zqT>IFC35eZ=?xe_22@%+k~Py35CoQ%gy5pIWIL;15?QGx4S%q+L5!W%#oO_f82EwQ z$S*Rkoh4Zqt5=pcNmSm@3-QA;B@Y5*&ylPd1N8u z+9m^*zyB35900ng{70BnCHpUcg3eRk>efV#SRJd%ii+^rL5i z{yhv2duOyw?|-+dv)AzsPEVEUIdj@VzjOT#g5U=#Sye+VJ04woVW`4@t+@mTK||U3 zlfdcYskPNAWleQu?qPwTm_La9y^U;G42zliR7hrXv@T}c>DO7y4u!LdeGpAq#8$t_ z#O5}r{>c^&BDM%s=U1S{vdf~kShAI(P|gmFYwVKChvK*%H=ieRNtLI6zjS2vSKJM+ zcT`$sd{r&&O>E=qpLH<>H?S38xBuOC0LzV$Fk86eMxttvgS$(s!&$16s;_tyK)} zPC)G&zyZd`&i*~&9kz9Xdxiv!k$!KV@JT=PSXi651!@)RWXh3U-zA9q$VL_V*x$(! zn1UU!P96k=Fw#T77xp?;xhy~LpQ~%xQ0cYwG~X;(PJxm}OVEWV@!mY(lFU^^HLnu9 zF=+%$YslUJ$-Xfw7YhwwS#?SoPLI7hTdh>%Hb6k9tK^QN5Nyq0xtBJx9qiS%lk{N~ zK;!excA^2iv!qs}P=vB-*g?hs#jOv5)^j{;O4(CbF|#!u^Pwa34X#gR8Z27Rj5Lk{&*%56Mw1^M2l6(5UKyL~LaBxM zOgAW+6tB2N^a~kN1D(Qc7$H34=aniiC121P#$!K^?MlG|DZWg={bgk0mog;KIBdd5 zRr^xT-utJA^`?0T4r&JqH{;5Di5WVgX{79x6ZO@KY zs4hu(^JF;bm6LQu|26YVvfk8|tG*MC`))kp8ruG~Cqp{k(Zjv11#u2+Hq&sczuIy7 z0pzrWjz@n7pdJi1HJZHpg#L9wt;JM)Bc14nt*g-+njj4u8yU7mbQr~Q zZ$O$KQs$6m4^Cgtfk51CuClovw(|j-vl3Yq7NH;ZVw-#Nc!B*i8OaA<>TC0QdgxDB%&Kqg>4_GcP$ z6MQA{Dftn;Oya2k-?iiDH9xP=*L5R0!*#J0?E|RU-msv~e(`jNcZ&5A@0(dWz%AZ| z)443#b!<@327a4fAB!)MG!0m49zh_+dJTI#H&x9BSj&AKPxtN$x~Hnd%-K}~o8SO} zO3P}UKEARWk8h_sZQBo&mAe)f>a{mV@lukruyw`Z@(|2pp)#*8>)H-R#9KPY1iasp z$JjG(c!r}}(|SGss1KB)AjQScTI+AV;FZV9IL6Z^h9HmE+byc%0{!SQ4oeNPP3Mxw z^g7f^sE&!wAJ>epQ;~sO@{`z^P5F$+GA|$yQ2aV911vlowKfYQR4C*}UEk1oI%$`1 z+@EjY0{_*2$g3bffCE(5grHBkDLs0GDb;l|ciMpbScN1h?NqF<4AK$VArlYs*$AX? zhfE#&Pdp^buDt&(M`=-`x+Ik$L29qBs;uiZzFmRYde~;?f+0{Zep=Y(({n}x+-74e z<}5|kt<&NXJR)g}aP4`itZj?eul+KSHNzxU94Pz=R<(+qWu75NbU4Ogk%@p|7L$}e z7Sx)Kd)C9J@I>^B-qJss-DCfR6~0snQF_{;D6bYQESb@UEv zOAs!~rGI)|+>X0lmVcs3TxmI1;7+r?FpwAnxk$vWSGnorKuM*C`$CRtMR+5ye+!Ek zKR1#o!L}dk&$_5a*>iyU2KFDx{>q23<)_LS`)Qq;89#Yua6y1$im2j0l$k>Cxm2wC z+dn%)+PY!-2f@57K>Uh)86q2LXrR|sq(wo`>FEZZoR?z}uASE)T?d=yIP^FVYS46S z#5s~|3M%+XeB09JN9Osl#r(4&8f<`NWu}WHCX}nDD%9d0VhL5vYpB9dQ?Lfhp1Y2; z1)yG-p~gS%`pFAi74&C6$3xhwP@@Bv>_v_XU-*$uC3!PY9NIJ>IfdJ-VLO`Qvu4Av zJuCo?c~SuoJDn+G!%d5@_oLYG^a^bGoEKPwez<8G@(f(`suJ^emN!+1Ku@3LOMK*g zw>_uuSR^#EZgnvbYaxKm5%qgITwwky!?1#A`9 zbQ$JkA^*ZgZ&PGPm8Ieyn$`wG8y@d)~a-pDAHQdYKxR`5RAb zO=oavH~Hlart37u0+l`4pQz;2=}$vd{8GVak~x5jCJlaMox%83h_`ORz_Uz)bA3$% zU7^R4S9pWvmnfyH@&bA;cl~ic**85>-V;)AoLmnu-}Gl{dR^`%R)esy{MG;o_--B@ zxvAhrM_@3=Ib?t=DJ?ZOb%4Z{YEK-{$Fpqts8AwTF;$%=rjCDJU>7jMlkYHvad%pd z`!Ehmsz#i`p9rB>Wa0A#+U7whslQ2l{=p{xJ(+wVklxf6X8W96s52KTnc;tZ(SJ=czTUDY zK)RM0Yk4l9#py%#$xBX4fo{XuuA#v)6PIo_FwD}qOrv^k+j3E1vkmNcMl!FGPFC8E z4Im$?bvR!`;_2m8b)e6i@U=)kiWl?)^m2z;H!oDcKeDngS7Bo|C$-HqiQr|u|G2=ddpAP7bL#W(@K!0HJ7}~%e>twhuHDAxxm635P5E% zO{8TQva99##L;NjK>ESiw!tvFrgmPHyR5=3{jC4K%vD`WO|rZm;?i_@GP#Je_gJRT zF8VV$oGY3)$%+D7rb@CG4G=@?mCDu_zK|I2@=TfQpexyV5l6*Zl7)70bp-3@3GJLG z*4RH(Snm3VU}N=SW*a;2vroHL9J|iv=<{c(*&f$!GLvTCl_u|!FXY!-qU~4^O`mX2 z7;u2)KLn&Wr_ykJ%YxuT`JWj5D< z3B5#?VvXmXlkryw(uG{Fi9DSor`_0enMT zJaS{Amoc6p%gF6e%p1IhgCPPN$st4Mc5=reyr*%s{Ew(cPpQ|vN!DPjnV5rtNR0af zt^fTNNlnA8uX{phyn?(d*Hx9pA+LlEiML2qq)H~<6+6Tx-V;yH>wz*uY!D#kG%bLA zH45YD2%Cm9RMmW@9m{?ly%S2qtfsN#C+wdjIKuI_q`H=@ibL&*P)CZ?2V}!Rp)v@0th?wb9KdquW2UZt^-Xq}^Ms6DQoW6dZF-)6fsmsXSyfXhcQ|Y? z-cbckn~jKLsPZ7XGVTXe!)z2^3E`TCYOF5c^+`)fo<$r1T?=s{k#t9(3Q3Biq;2S= zH;{K?RLJ2jB~z(17NbQ?~xqUy4mA%Kpli^pTQ{zGMM#dkyWX_WfRMu>us9 zZQ-!yKf*I3VWWLN(i}V}@IeBAVJu=d;H&ghN{ZdI(B=(>J7p!ib>wLS8K%O-?)NeL zMr>oQL*7(5(Hscn9NK0TTc@f**FgS|_%z8f%8-*qmIp{5X5%zqzIaNxaR!_a4YN$! zu(tjd1X2v+a&*zSVDV=-b2@BYuNBm4aJSXF=&|tjUd(v8ej^j*?ITf!$>Ud!5?M^} zfrcJLN(3*MV6~on;@1<`{QbIPY`i@!HP(=tjH)p;#Wv&>;v3RhdvkI0^3Imy>)l$% zPZF1*|NH~)(GUSp{EDXfte*Z=onxe%?KkC`vSx2K&gb#$+3qGC!b_3ZK$2u+wU%X9 zZP!{yDx;&VUks4W6pt~^f)B|BEmOM4Um5pI2(Dxm1gSVqr?{Dh0RWbCD z6zk-8K0XAb4ZF~DkbIN~wPz8pDu*Um{E@EAn^6;6f$gDvX z?#*!3dtRogx~^`RXGui3sty4K2lbx%fx5NY%6)%%BfJS?suS2{W#TSG4FXD|~ijoEZ5(PXUzuU70wXXM+X%Is@+iiN- zH6N=`N&6Y5k&C2vUwggA#$=^`9FluNsq!Y-@`DsIBxIBfQnc7*%^T>e@&duVoZObv z=yY?kD*HJF4%(fuHHQ@m|1sIQ&N!yZ_OX%QERS|_VM_bRfj3XUBGYHcy?9SpXf-N#>p>OfQnH;q>uH@}#WSA2VVu4?qJoXMz>&{-m+vyTa%@%SW6OBlE7+c+Jjg&;y*mvMb+Qwn5hPybVn$I~uYe+i(k1zI1D z6eCEAjwv+_?OVb1@U7wQMed)eDz#k=HHLOFEa%%>Q zqj%@pn?*ECRxrkSh-DJ?j-W2+-sDw`(g9Dn=YxJP4?)S zX5(REDU+EVDIBT7;>6Dc*iWZw?<(i0K8J%4PRNUU--P9Edf40S}idQ z=YNywaHd2WvH4jdJtRX6v17EV)BqUOb&02n3{80SQ(f8zwi(j46!yGD;s>Le+ON|s zUwQK~3FWxwk{ktWvLMmWIK|`~?1cbxl0*$tO&T(DUP5#SCj^u=*yEqjFhNN>X+{$6b_@8L1(uc63Wp?P=r-Ig{*gsBf@u zk?IVfozaLQ0Yh?*ppvr`DP?8&W4gw^-?wNUxkIsX+*57z7sJdw3Lt5sXQ_W@bGV-s zbX+9&vD!Q0ffa+u4%}cq5P-nv{x~$Sn77Yh2Q?g4EoIw*3~(c z+ZNA0!e3FDqg9Y>kV#BdY4F0BrI~Hp<~316=it++BdB;VeJIHBr^%e%!Q!1HiYs)G zMUzr(tTcC*DQ<V z9{mcEK*c1_`DjG#sWfPq*0@hD_hrUe&03VYqnv=~ic{b-57#nt`Mm;Q9|@(MXyfofS`(rO=Qh@YG%8j84>r4F5M&(dr`!`ER!Ht$lW*4_W1( z{;;n%ZIoQ`Zyg|9*Rhky9gOQ$AdXDsCGVLNV!Q*WrCjnb)~xb!!s%{*G8Pw$oXzAW z2uuriTt>=FUUjZQ^a}sgw=S^hnkJB~YPfw#w|-hAkpw0rC*C5);>`5S# z2)}U%sZ3)R%Dlvw_d_kO`ID#3jzn&Ot>=A6_80){*o1q7Ze#>g;o8f0D6^mP4NO5{kdPMN!!l{v%LeKa;&Ch6 zZnjBMZ2gNlM#Gla3w_KIjnJhya9Bq{Oa5gA#cVp6tj)qd6XrF}SR%}P%>|E<#el8&%}q!Q4*3119s0#Z`n zJ(NG>mtGTKe_H~%^L&ul&(xf1qofGh?kM;#j|Grt`~u-^@g|~^*~s!l5_f6u1!gQM z1gyX(|YR#tzWzP~k+UP<@|jPRwBj#OZu!ssC^8I?>$ z&|0Qkzm|zL3VyC}6FM1|4?!T*Y@-$KFRpsWYjROd4V26g_`qZLesN};-Hy4lD#7O;uTdmqBiv`6o$#Xp}XE}L=fJ+ z6WKLfoP#|=kgTWiGmbTIn*-U2ULD1nArqa+9x^bDdxx|BsuesVcu=zH>U)01;%f@D z=SXf&BCFM0Uj{vA!htC^m3)iwx%qUaQ&7pM!%3E9GF61vYO2t1adX!UY?r<#(EU$b zdDd~SycI%{B2e>?kHRRizTP+hgz*|~5hcYC&C79uu&TYC-t^E7$RQ`)2|1^X6X@Za z7}9Qebbxq`JQPS8hBD=$6W|Y@Ku^YyhXOkNq~Cc9hcyN=Kq0+HY#_F~Fy&U?vxdH> z^V*=F9#zDsr?P`GLjoCB-)Hz0AJ&nNM-eq)2f2*Ik1%m<_t4}eKL*hN0fXI@u8VN- zeuojE5OO)%bwO&!x|g4)Y4W17ou5f?wMwaJ2$FGKuIc1^b8}~Lqj-)M5>6WCDj-W0 zDx6bGgb{M*RVkWgXH~hE2K2m-e=CaSUe(17Arlnjgo)dzH6>{tj5xBZ$VUoX(HRf1 zO+!|4$1z)i~EqKF?Z4TK0z-ct<-XXH-4xzWf-sV^mMqeH2~_Bx}R)H6(3{YBR|Qw z>!F}G_Y9;v2@rzK*=($sN2Wd$iwX6HdC=5jvHcQubh-?|VB9TLl(&aabtt#P-Un7#cN7w#VN zL9XP@ZbvV9M9--Li#G}un+U*CJ@#U~+kP~rC{jFS?p|ObrNj6|CF-DWN zQLZeyPewD9*|!+RmaC*pBDD?f`G#poo8CGCXggPHr%kGNzD|H%CpY46>WXKzy;EFk zdawUFU9C%BHQ@C%Dy{_a^3w4@>i*)dg6}-*%(^2wce?BD$GG3HJM z1iPEsMa6RMjJsBJgr)J0OLpLqJ|&oy3YrCvKL0evOsqXBW3?$Qb)}IpbpAm@V>r`L zxVX2Cb?@_H+oEmq8hR7A4l}NIm5H*v?FRK0YKbAe)3|kkG*U?eBIFK!vA=PZ-1el; zw7t@r?rGe5e`yhUatuvK$*%X2C8nfim&j%IB%3f%kR;nJ69vGSvw%Ug+*YOqTS9c~ zom*}8H9qW3ml8jhXY_xaQISoTi{pnR^bImZ0Gl3NjEJHlchy2}67b6zFnrp%nl z2R-8z8{L~pqK!PMq36c8-e*_H=Hk4!U&fCX*`5D{3Uj{^=WefaBQZOfm87QJzig+M z?c_J$R5?+jzK``~G2U6_%H`s8z7im6qs=I{zv@eODZB;s^Mgp?1l%5U$wNlF+Bz|y zdv|(`T37?pwvPU7N))hpVV&Y5)6(1ur_C?}3p#x29wJ|>`w}IhTC1c?d2I%=; z(jCLuGGmW`Q(=8|;TH@Efbh{&4;M&NtCVaBfO5E4v=l@~tJp$1MNfk>=sFRlnC*E( zFSSgkx+eIms>+Nzov3EIwRC(a90~P&z5-_+Y8^pNEAow?6q2VhB<@((f1(V-p{h2< z8YWhHNYfyh3qZbluRb(X)+v13Z<3J^q`%-KMc;4UXRJ2di zm$W&-Lw?To!j2jxN}sOygzP<^x?D?>u_Hbm4|;~iwj<(-$dE2X%;dj=Y(Eg zONjrR_b>Q7 z$&ufQV+{FYA}mT}Ada$a+?nx4HOCc3ao5$wav>p|FVnCebi5X~qcxy&G60A)MDF_3 zn51+XeWkfuDxy%@ZO^F`1 zu`fXBt11)XmD0t=u@f|i7==v9sOcw}ogcFX&or^9Itr_G0~x5}|CGJ>hxJPzjvHYe zE0L7f)40giR%4MCZ)L{=I}hQIJ4g;2q0Xhs*@etJ_jUE}8fY0+vlos}sQ&I(<7a8@ zFN=f98Fu^a<-GGXM~sjO)kmy0yeGUHo!mnZarp0p}SEyXrT|?LlOX zrv0~~R#z|{2Qqs&-Rz&!O~(6?Xf5}G(s;se?doH8E=YYmk&GtXfOrJg86f>5`f*^G zFqx7LgLPND<5@&JWOdVuWm*Wp^xvVopI5*T~LQb%IM)U}@Kfa99-s}d1 zcCIT9d(J4RE2gQ$UC7Mk4)Q7-)7-Q(0LTYZ8^1kQ494c)(Dg9?v)qHI^m=POo2~X` z5^_J)G6|$lpa%l%T{iAX8~SG{8F9R~_8&vxfg(KORBh_+y6Q*<4*j2Vo2Ec$bj z9I*0!>l`vryY`Eq)(H4C5y1{mSQB?6OMG7fVXVPlf=Q#vnKDR^)&SqE=HKtK50lhH zFIXl^1GQd)-h951@}tD}9W^-%$kK4nk8y~%XRk)Un_53R)_{cXi<9~a?5BOKX#=ez zWZmK9eU&gZRPD+>8pj@F>&c%^>X?QjUOff#OQMw3;|D(!tbd$X6VRY_k>`S2&&DOn zkkXypV4a4dC-mP$Ifc36{P6#EJ1$K=%0s$VcSX%D*SW6h|Txz_Qxc2D& zahUPzrnifP%l^VQ$&P$;jv$1Eh?51A3Qk)j4?h|2ezF?@HX_rI`CSb0kEXe~xUxW8 z{gUnVB3HU_n#tK?yBvo8AIfKREL_HES~Nn-yNddj(UwpRdR3^rGRHEb?4S8|9o3*s z0LK0dIkuwtN!E$J>?gBY1K3QGDHO+to+sgf@}CzbphuXRlyI(ZXFByYUs0Mb#gc8Y z-E+NJ@LQ8O^Hj+^SI-j?PdTv#$;xWoJzqnJ?<21pM41d}XlFEclRU=0#y&L@>xsjo zbw)?fexQ_zbq*Y0J|Tzj>!wea^KQ+{>>zjeW9-e_`1GFGy5+!rfnSt zK=!$?IA%oe-^Of%W|XTQ%H8*o+(f!)hrfP&=Uw{@q!iV1yGC(4qETG)LXrwkgNwE& zu)5-Ia&biOdiU~MJA{t1xUaNMdb+%G9eHe+ac+q4!DLC9o8xntGIkISSkojp7JjJU z`xH=Yz{}c|5CRiFl19rLi6TSN*hr6A$z}mnc4aPZpM%52W88ivl#z$!E;&Wi_G`ws z2zNlmjgwJ1=OEUd!H_lU>2Jw!O~1*?uIN&dHA=RtK`SiBWQmb&L+7F{IU=FU{yRK)1@Zh zP@Ho5ZK-9u#x%09Q-gcYAuQJL0G;GnlaUQXTh2)VtK{bCaOPeq%X5M%UvCLfkTl0e4Hgg3lFbeDCcuv}deQG(HlmS!0B zYYPsLzb7-*v><>iCuE%m8tbz%P=4WnJp7P44Z1&xh;Cgf-V$Fl-6DI_tCy3bM*dDF z<^0$v;~Uzzq4vfw#L-vM>tuh%#cpy+&TS%&zKxfG&Bz!>F620VV`o^a2S}g7oqA{z zAQerdInmX}G#L+sktIC0VVrl-K8^uMZfROzlQ-wsP(@yGd%Ym-I3uC8e|Iz*P>nOe zGUMhb`unhx^6!%Dtv*a5IaSIe<(3kO-9`-Ir^ic~d^%`oy9XImj|^^qAtKvr5jTvh zbk)TfB!(<=cUa2`AN6>sD*XF?@ai5-b*D~NQ23bPC~ z`eSOkHJzSf1(g0)3&3zIQ~OCULyFz)VejGLWye^t?^RLr7zL!~G7_ep1R zbmSoFK3{|&o2Fd>6GOpPBa^m6GJ z!f!J5Z+Blg?c&TYh;XL542|OBBrj5hCK7Z}1wYimJwlnPwQq}kmUI5(cPDm8H}OlL z{v}%8iFlewm4As@itw|=8nRIhVe#g*{TbPx52Oj{ zxqlYyO&LynP27+y@~++j7ST~9ZwfZ%sIlgj1dz=sMmm*g9HIbHHN$vDX&E`m{X14P z^GpZ*JDH>ewf{`6>d4DE#y~BHfUO!MU!2Tq(n(aX#HP=V3WkL#XArx**kY~IdQV-s z+=0PoqSmQ{BgO-7IC9jOapPmjQl<4jgw6_r%HB-QF!pyD_7~@2UA`kY_o?AB>r|s{ z5ksDGbHQ@{M21Y7lv6c4E_(IK|44Yrs}8kuQa5NWjf84EE+ zK%XEgD2!!vC?WYld?fB7+Lq~A!at$qc$0f8uuj))GlGwsCg}-9Q#KYWtYamh{@m#B{2e0B%cQtdhFY0iENs0=p7ionLT9f1 zUHWSJ38|MQ86zY2bjC?JuEFs1OqHH6m7~(}q_@psO05yvob$%D>AWG7{T;y~?UCdJ zCAl(rhVhGfVQLy56i(zyHaU~gq(yfYFtuOy6c+u&wzIR0w|MJ)A8+<;*`l4Mpj@(i zH0hA>V~1B~I15-5#IHe_)wbB`eCZFhoJ&JLaTXoo{s=TiN3{AzSJ|KRRap%W)i_3= z^=-_}?$v@)zQ&Ww#LgMDvehfz+y;A~gkGCd_`Pjmw)cxcw~1_uep}O6#wC8<^A#>n z(u7@dfQRw3wSdlRT}5LQ{|U9O5$ZU3sWRGQ?N7U&dNZz9cM!G?@D@ zHGd{C)DgoRF*SXtFHxFQ)pbA=%m^%Swchf&f8gIGxkJQ@Os)MRiz__uF(%gfNHrTM zyc})bM5XiCk!MzsNl|1`lsPZNG9>Zvlct~OY8hXl18(w_0y5YvaaYlBRW-*CQj%{X zrPV+e2s7yso_ji4-%h7Y6L+kbsn1=c&?MT>>>{U2Y~Sau$O%k8I3W8w2YPjX7|tN& zBC}Yq$FtUzinjNiV;I+NVU+&NIpYtqZhhP5WMCRLRHnx9Zi0*4$~XQRCe-T5j3f{` znqtwiiq&-<>U|d7YGX?T<*|w7+{dYXh1q;86c8{;0>Zqo>inCePP!g4!k(hh;KU49 z&>OM9a~bN%`}Is&&~{z90c&<0`C>4;f%`z|XyIq3vWE1+0NY)rfAQq#fn>b?Fa0ea zYbgkEG4~Z6bQ2sw1A-YiIXqpoUgd zqE=E3+Gt^7&7)+D!4O zelJUE%7Q2n%?B&3@A^n^a1B2#_!3$DEz315_`4g4p-W)zQBc~eTbiTQX6GvfL83V_(7 zg96+4qnSt6Br#>;OXMpH_f2%`MS85ovDG}tPuP?qJ~}N>e5QJF7v(FX?ceKqU2N(8 zHQd!{kVtqEAvj@}fxDc{si%jPgx8oSk7Rc+?u0lPbl5HA>k*Icl$oEZR6!^%B|l|| z3#`vGdB>Spdzb>F636B{9u@7xe>8&s#?7BBD5UpYd3;M)-dyv-u_&O6YcK5t1zb3b z5XMeP)|XhUBL@TgxB?q<0wav{l@U6FG)@H{1 zb0B@R@y9)4Zrt4NKhh6NI-A8Nud2k___Inj)A)jo^Ov_@-Ex{ugRzHmXX1r=@CsicQwvD zSLHOR1f?ngQ1{xk7t$uUD>irA`kX*hRl)wN zACSFj6&{Bsl2gG{Sa11A$M+5+SYvw@9PX38$5mSBlVLhT6J{do$rVGEk~|mWom3%} z85q>5H6{|Nz4K4Y%3;yV*lprHAd_WSn5`Alt`@hm&)-G zc!6|a`J--*2RH==9p3m07BmoI4JEZM#=d0oC?0R;L4PHGa zDDx!AT*xr7+?PXaU+FxN<*)1LFhZUQvaOD1re^m~0_Pg#koK1Cdx>qmk1Lhb`_H*(|2^Y3Ba4(C}YK%seId{sMCXpj%<6D8WL1DZ;Q9L2kk0#Ff)EWqqQsG55!NA6_>3KO8 z#DG*0iIGekDhBb#<4upaGI=)|EZF2o&tlTAv)=akZv6gpjFJ2bZ%yu|l}lhTr!T4s z&+4c}B?JX(S?3sSaYo*5`V1I|QDl#!GjNefNA?GZMq!SQ);zTGH-!Iz<@2VE`(4@m z8R-ZopJk#L$!Qnd3bJ$}cH!h@1$(hsyB(RC^*ZiKnDj|bCokONlUb+9IUM(yV<^5| zS|tAV$2UV$N=P7gx%WuX*8oj#zzoUDI&-nXbtp<{)WXT0(qR?kPVH20RbE%?4q z=95xTEZ?6uAVfdOk#yY{rsglz1GHzc0`O%;Ls)7cL^8|8}-BkF^FM1!z z8j7Rh%V}hO7;$RNkxRKclb4rW?k=(Zm zM?8BOb5+H2R2XP&AeY7DPsmTxd;gHGw~v6YTxNYJfJ*@Yo3AakEQq38)7+` z>v7N7AhC6jPM^4F879_=a=86JMF;Ao;%-_Wd-pG4br}|*wn^;w0HRfDOn&JPhdS@E zK)JJB9sQ^eKjhVyaRDIr6b9#AO~36Achc#D4NM`4X{3up_62^QKTL4uHJURNm*_K} z;|H0@V~K*g+7v?~xSVX`m6)us=C5YGJ}~_S>X_KZxmm(LOb5o8K5mzCqX-#o?7$zhIzG7F2`TKy6qWP z?~tQz4naQ>Ju~;a&0>gUbP$=MCVy2hH8u%PUdYB#eC0x>-hGMMgShbl!n0iFQXJen zJ5f#ZzUt0}oWo!Gk-1*Wu4LTjH*|zLmhf7$ajcp@7-!MMvO7gZpTdFs-kO|e>CvfT zGq*Z%|MM=^>hjHXMRaa*zFK+VypPQ`$XTq^viWcO&@e5RtT2WvsuxJ#WbYi`%lZlL z1aY4YX?=|4%&Rq7yGXx+bPd+#k>kRaM;Ir0x03rhIH8zJNG%T-$j{Vjx6s>pP$4_f zkd6BWE;y|i*T)0i8Od;f$_@d-{fPTXj&(Q-k$Wy_?6b1~6r9bd-&W_{9k z(bqo2?_s9FW>HPnDKN!k^%K_`@2eeYYk%T8RCsL0gb4@qIoSnT>x=r<>9{jqa|%8F z{Mi}&mmJ%dnL0qcg*B7A8-q02h^|C<0Nh+afPAa@oC3Dhp-MzHSoyU`E~FDdjpwwi7jZ2U{^?J=DV%m$X8h8cgV5;x|yI;z($JFMlu33ilQVn#Sd z1=XN>3bJzVdb)BgYYA(~Ze?`VNCR?-xOTO}zm_BXkYFnP-nnDm=7XL0qsfAkY%eM0q;81}m0T-?Pq;Kvq3a!_C%q z7D#uIcl^8dvO#&*$=~zQF%6r-cvuBH(fSEX*UQLTZ8X83U8?>xT~u(xluWa{jm{lUa?+VgW|**z8LwN&W);6fn>Nm| zqyJk{I8<2h^u|@}(Bea_6F*(A4XQ`}yi`knOO<+T9+hYE(!fjOvPUILFqttwEv|P?D0eR`5S|CjZ_Xma){_?W>SXo_KDcX6$`A|N ztz{pXQ@~xYqURo)FKKG%-!EyZv$dtOYn+jewR1@5RFmEjl(jtJ40iF0ONzL@9BmJI zTyA{TkIbKmVUJCL{2;TWrj+=_IX+>UZM&usKF#rw*AlR))E5Ja^yk6RG30v{{dh#y zH|%cB-{mgyUZf94auhz6LaH*N`&&BkY)8K3^`NTJB;YN8Km z$aDo$L29%4?*s2{mVtOdl`F`AFl^OFBIL=fXSJV@qP+a?&@InhG7Y165BsH!wU1;S zdGu+F3jG+Cwli)^%QL>MZ&(w2jbF-xa@eoct!$kTrjLtWyO^WFwZ06q5M%Ycm!cosQ%m5JG>bVpKDz8$CvjUN^c3a2KZQZ6{}%pWtzDw zTiI*e)l%YUB!`zn3U$l5QKn=G{JL{JTzeAk5K2Ax{494BAv-D6l#_2PO?Ei z84Sape3BOkkIEodxD4FfA#69qcKG@DWRtwL{mqu!KG~Dd(A-7hwfTYkh6 z@Yf6aIeD@CqjK7~gX-|;R|T}e zSwPdKkjX>w2)`a}`ErC+!m_zu^A)P{)*|)|NRh#go<#1JpF?hT$nVP9t`O&F;l>vJ zM>+j0pQdo~6UPee8B#JJlgn$SXQDfUZ6^nUP5I*}lEY(h`OwUizqmeYwDnaVdSpKP zo^hl+S3)HiEG#dSBqgR#6jps6gQuW#95*0Sv`@dJkbzR;g}^p66}MFSu*KTZHVjsp zl#aPXK8-)tP9?L|ZRC`uV60g$$I;*gXMde&kTleh+fT7mRj`4%J!|LOwNCdb7|+eh zAu;9hq2PnmlNV$vLrHD3w7c~pfQ#p2_Q#U8k@V>bYm*PmZ>50QUAK{oAU!MDHJu#! z!$i(+CC_altNc2~3XO99#0YN`UnyzV^Mmv`E^4P__2YQD`5hVD9a-x{6>6;#GFr!0 z@*idvEXi{4?sepRCb<+%*9~JwH%(?@-MO7Jxf6jTK9l%!{O#dzij#N?xtdEpG||7^ zz*7q&H654e+7ObimPDoIGMSQu_|wm2JIrRYT7Qr+IOEmkx#@V!LKLp%oG=|ss3o;E ztKOJKc9oNHCUyuMQ|*DaC^om55f9i3{o2-utHmm+8U@HUxt*Q7-J2fun5DIlz8LGR zODBz&E>!n&@$;yf^zE$nl{N~Mvcr!QTue5TV1;eVka9AR%z3)7*teT=JVgq!xkE%0 zK+`C7%ZaMOQ{HGviGsc?eUrR3#A=p)Epm1W^z=R=C7SJ7DEKAPtV zn$zQ4;+@a^d%9)n^aBn8(p{dFtx_Nv#2D7Hb2gXm!CIr-RAzlPMu?y`4g38Z?m|{J6nEUL3TL! z6%&nrhOjBZiCR|d){xNwtRJ$@Ylw3YzeU#F%D7FNa+jbpe)_VUuc$UJu9B`?+gJT< zr<-_!SNig^RiBJ%sr7MI;P9tE!#n)w;Ym1c_txZ;Pj6#z(Q&j|-hpFR47J*Z6SYW^ z5Q9?Vt}$2B;x9rEinmFR5PIEf9RENe92O+VhQ8h87$SDrr}~iUNo0i_O!@x2QRwcH znjr5EK2M?Y&irvD4GF(ttJv5rPL#H@MEql2~Cze>)|^GRFFZzAM?%)UvH`JSJcVa_Ejbw2&?q^&l`DuWzM ztnHM9o#vdw5T7S#4TjBvt)q!KJxOffpOH&P{9kOHeOy!Z|M$-s8}9ba_F+4)1I(Sl z2Ai;8zyuWZOg0?~%B|vE9$@H{8|6j?(?Y}4M8(3=G$qBG%+$=(Obrc94Nc2R%L>y< z(@M+AZm;+3`@OE;^|-Eos_*xq;?6$j^Lc;X@7L?~BrgoioNs?J1SY1TKl4+UB}Lo4 z32u6XzcOyIj7ADS+aZ4#9GFf`wb9UX-tZW-H%k_ic?OuhU~igjkAqWs8%v1O9&YEA8E1hTiOJcxO-_hqI*ssxyJWA}lVQl{5l?;) z{`Yd5VY#h%8EoNLVZf{ta7H8a6|>IoDDro@|KN=n`gftDJ(9US0bRi`ckYe{tWn+l zepZn(V3>R)wB{nd-bEN#JKXf?B=PV@a(AogW_Y#kjf>%`wO2*GHHd|NUk@RP)KppR z+6Gu}<+O}N&ia%PtAqE4VwtopP3)?IZ_IJILQQOaf~&EzG9J1-0qgciALpP-;htWN zDx17o?{lW<;ldLTthJ0CMj7WXChrfYW?R19PSsq>KlCBA%gIp<*Tb#5TnL9nhb%j8?L-QukWAhIPl=90HT9X|!OOne1#2^(+;^5<((F_@<^- z$rkr@%n^P)r|l6&EN7NSSdJR#ABa;+qQaTA^3<{BCs-Y^zZI-1@ave!DV87OU7ss) zw79)NoIEh^WR5l&Eh5fjI9u~(#F)13KsdBKs^tp|bjMEjf^w0t&cDF?wxKr~yPcM8 z8vaq7eBK-aM|VqcR(NA-X@2@Fvzfbq1>h-X>e06AaH9<`R>c+WP3appv>=xu)Y5l` zb{G_0_|B8?EIlB3E+LGH zJ>6qUmV3Efw;h|O(WRM5$N>9Jng4RnUd-?qng)Mmu#dGtxk|EZ?{Gohn?V<{3uL=S z<%~v=Z_c^3DDBv9aglw&Q?w!crv{MPoj?~WOZ;K(TV_@3^?r^L9i;-J?L z897KwTH~evDityfke+3Vt{^39W_uY!Pk1j8QFOk%6@uv;%UM*-xI<+oIttdq({kri60FCDY=bQ$@!!){({5>{PzJ-s zR99ry=GSM<81VHju~?`k8$vC6rFf^qVq^;0wA{4Kv8-I=$)%W`V=bSmmVUvfw)&*? z##!(m>#krDsZDZla;qGb(s+CTi)&O(ozzIM{NZPYE z+h&QO@ii!a0p^Wa`Wk88f(q{EC69_L1@^CjkQxH3o<*VREvzqZ>Y2I_%`1#T+qUM& z?cS?d5u$So#2ApAKh_<7=@{1~X}8E1Eh8eTLgww731YLkmWyjW%YSEL6(ET;7vrqD zj;vmX=f;j$@`ki~>y2z(D;pt$&4kYJIK_8bart&6G4ZQV*sNNS#Ul?8G4(!X^aqyEHQo%i?f+BfIiUv9jZzd#GW1U!n@l!N?Hkx&`OgkY;I%V?~$@3_9}BTM?<<`xYO07p^2UJ$Ql()p#r=^J9D^U~y3n*H)t70y5`KPY6k_Pz!U%Ucp=#cn7ei%3foF`IoKQSqKP`WXgF*DB#3f@*>W z*p);+m_wDTy4|*<1@;`N^%A+Zi~dCItC?OKum~~>Rrjr?(<*p#c=y7q{hUWaPXA&; zVaG8IyJj5y5o}Jg6nLC}>ZnG3CjBz3H?sTej_0xvhuZQrLcB0s#Ij8C4xEg{uk!U` zmyez`jm}`dksVJ|K(i|Eaa9RYRFdx{#l!XIv5{FW^mWj$??=w%jQzimQF3OZAFfsO zyvuCV2P(9|aIeTT?BQpu&VRQjV69giT`He1 z&ymEl&*%b@0=6lf&s}@Y2FhERp?V*g7nyb5#>bP4Do~b<7u~BV6PE)pR8c4l5YbEb}0C$x@7H|9Pgx9VHoPKPF}E z@}p-nQOsSTW0!Yye;^)JYu=AO{12aEp6Af7wJBWnDDKyy5d0+rO}2A()HD1u2z#l_ zFSEHsYIFV0Jj0xe9~`_Unnk+PdO3_a!%#NN1l&Wg1mT}Mf-=ZJYT_>+g$;d&> zB8*FukwN|2N(`<2QMG(M4j0_!fLbEwA5m#B)PZ5yvRHm-b;YK0ZzNv zb61L4BpwW-aKNVrsKhf-+FZcrX87%Cc9%lzu7;H!G)Oy6o0*iM%~wVG;`IHPjYX;~ zUEATD(U7Xjs2tk(4;9b04CA+OoVs=5{5 zdfq1>Vx_dQvc6BkR#+ql4WFaxg?-<`z3=PS`E>WIW(KB9P3@^BHZA|bj_uZ7_9YOlJh_!*Js) zwhm`jG0nubi*PSF@+?fZqU9BnBh-|r&fOY0(**AO>{g}W!ped6zceaA5RST+1(wx8el z>pX4)Nl!q#IvmHQjsE&+ns-mHpm%dI%5r~QIcy1s-|gvjvpg1EnQMtiob1eLmWZ9n zXHteCfan?W=Tfx!VQKnH7$SCH?PA=;T0+UAWX%kT`BUZvbmB@T@=sG0_IN+M`ZUT4 zatnNy@pQFKL>GS`IE1lClNd|1wD=9~3V(yiiy%Rq?q#|jYr_(aDZy$IafTnVL7D;? zGS`g9)7u#QlKLg)2+#4OI!-bRweIv?MR;9(Ed=zL^Z@c;0DS~D%DY2gsgcRgfQ~r0 zzsWodFjgXGG-;1TkIW-khUf)7tLUQKUtz~+ShWR~I>}?9@V?w;ibNq?9lX1&_>S%k zL%YScQR<%sH5%7^k=T)#b5?)xr+$_mMc*AH+{D$fzpAM*hPRJ2KPHOuk~eu%ti_To zla(>KvlzLaAL8$Y?n*IgjGv6REzJmI2njRzbvPw=68?1_2in~?7+%UfCUb!+IiLZJ ze9?T2U^3XmC#y@id!#_w^$|T3EJN6Yg?cw4m2C15a~JG%V3G%XA9iz;<(Xmd*#N_3 zwPjm0Y?&munXA+26(;@TFj7XhFf+86CCNOqj9p*hO-uhfH##Wjn+gkt zMq2irvhljUEu16cK`AqREd6P9zv?6(Prh5Iob9h`fY@x;vVfpYYNyiSz@j$`BdKBB zP?&2&-q_&Bs1f!l)2Wf{IA!ybqQ0f+X^zS?Nc2I*W)u}UG!d393i6{A!ZfClTT<krd#{#g(u0&spOX2 zHFTd+<$;DcZXkD#N9i9?QRPnv$j8 zX8AH!a?h~D(zgz}KXiWs`xW#Ai&1eY+fyKd&KY?(WcVOIzbT{Kh8N~jqnOg8cmudQ zg>o%ROEf&!M4t$#+DV^+98z)**c$K-5e_q=fi#liz}mu0OTs!i=oFbb4_3W`!UNwY zNnZ0{Y;nWzL^|8_cNFLpwtxC_M>g!VT{*&jtI>_IS(VHyGTa3qn1JtD$ysNt&TXce z?qub^Wtzux$IYL@YZ|~jBO#E_z_&9lJO@EU({sH2 z+xoai8;=6=f374t#diDZ=8Oi0`SOIXMl$8^3emC(k;%(4^Rww&rPpkKYG3OX2X^-e z6S0iY=i6?{$*TsylHiD?JJd8^VW+`cYRU+;yeNZNa=3pSo#M=V73n2pMI!fr%&=m} z%9w$WoC-fV4aMPi^D@?pm_1sIz>~PRPuUA92d}2Rd4({)Py_73;^7 zi{Wivazl2r$G)eZwd<6EU;uo^!JiH#y-j~8iW$I7XfmFOT ztXt#A2x7h>+)g&v$&|?){pr+S7-a>xXPCN&y`tbh zA34v;TbQ$G8^{f1S09SbS; zz)K8sMYF&h4nkF8YGP7cxiv1?ivElm*i`^ly?>i&$h$~N6JOC{F7(Wqepw@#_TdfG zz*eN>e7luV%P410w($jHBS$9%>k&4btKUoSlZPX=0f_#!Kp% z$%o*JFt+6~++Tp@_H;dK8N{AE3hz!JdnPbJujB3GVzOb;0QMl`Rev6;H}sZ}&R2WK zI!|GzuEuoyFum2zo?UiL;mo6YBH?JXS-yq|V%wh+o^jQP{IukGCNa{!HwddRM9R(Z zq*Bc7^JGaBOdAQ`o`d{_5PHD0_;qsAxb&uP9o#J>i>C$V+>4*Zt`*4AnBMdJNp@Q} zK_pJk%YM57J_H;07XM^%wd7rP%295G>rKjlQMwgAIB^z^WPvLN`zognkjEWZ z+|B(QPuP|3(c7W62X3py#yMa&S=Kf)Qfb%wWJ?+xnQPtPnorfdAc1~5dI{MyiMgYN z-o4eIV3juDJTtO@JE?9E<|g2|ZJ`=`-&2j&w;@f7suYrBU2C*NYF&L=^t<%cPCh8& zCf@G|sF0FYa;nq@DBEi48Sfe_%{edx_vnac#OaA=;?BNSK;y1BinN}mktya}D4|Bf zQ)bkOEL#}#+8pX`1$PGb@g$W={1kiXQJ8n8=LpT&BZ9%DV!}Ql1CG-Nq5d`Ii+$WS z*VB~bYk15KPq?Vjvv&kb#*jx|gQo_#vPEodZr6nyYR4zRu4d};1~{UGOhnghQPwsE z1bg+^Y#15c>w^8JfFOeW)>QqXcOO+@IQa=vGNJT9t0wm%`RfYwhP4cn8dDS9KX;1Z zyR>S~uDy8L=6~|^fYM#&Aj_er;IPf~#Cg{>%Kxcl!WDDXkN z=3a4nsziI{c#vsjkJy;UMt@5crb}EcG!FD!i4^oHV3QP*lQFlm7CO=}725Kplx$VQ zgA%5F6Lany_Y`0FfX1Sz_a={ySmWLlP|DfCGFYT!f;S8IEF&r)2e^%f_OphyF`A0; zxBJYup*X(bC+n22ex!3it|To6w#^C*i8RXo1eq)EXw$hzM498u_J{Exk_G zjx@!cWOmEb#VxCS`Se8keYW2bNyE(}w!&J&iyxXDs1#?r0{I^43sTeJ0~HC4@S86A zk)(y=g87ijxTdJ+dqN7GYT0}wU~9UwkSUP5)EHWvx8r$ny7SBt9mSIRWqU{^m$Ck+3Zl-+`L(WW~!!h~5t`Oh6XLs#1_9m^XcBEfRF zr-t8AO2VA|njUp?_k%|3H}{{lIX=oM6T$Rt;?$&^*ZND-Qyrb7&%{3o*K4ZX5Tg(q zJ-v77ugUz&@XK2ZriI=(*K?Gc&swzTksQ|_4(Z{qVRuKy# z^mBb6g|!$~^D%ds>HZl0!gBRB!}pKa)1>qkON2DgbUqzPXOIUmuu-3P@IKoMbee#8J)jKo+oLK+1AZNpHm%tb-4R7ieanZf-T`4xNo-n9ZgOx zB$gy)0&+0O2e-WEZR2GAr*_n3yhWj?a4H6q#!= zug0{*bnN4U^Bar=NlY}3^?~ZG$zLIY6X1Otf8Ti`ge{Z;k+(jbVU=_D8u!CBjVUv>t@2RLeO^@qGa^CNlT=)WmVAk4U9C?7|>epG~A)4TDIO{r^yQTiI}yW?)Kh+ zl4+KAQe~@JXLA{F$lNu&`ZwE$gx-V(vKpJ?l&#gw@CtWd*I96qk@V7#bS#*QdiG=g z;QX(q@Nhmc<0iH1z9gcl4-VL&Ne}5N`1}spR@G8C{|(J~Pblr3i!+GVEpRXd{#fDO z!QX0kA{?3-rGu%@kTp8{)nM817Om`ODFSs2%hq(4GtEZpD#y&oo+k6haGWuHn3?vs!zfCc9=a^Q6UgI5Gl$Ie@Vcgd~*=6j{$(<|$Qc;Jpw`pk#X)$x8Tp2j#n* z=KM40?kw3tr4I#bhRqrjrp=r|cIwIo2APK&UWjhXL@Qt;41BdaG(muLnY}|#2B|w5 zDB;K_xG^H{l3dc?t><=>?xV^ZE1@Xbv}6vQM%CXO)solxO-m6rFggaI_D-pE{zgH> zXwyp@D0_~*A0E*!%vPs6ldY59JQ7PRPu|#;RU70QDCv}RV&ra|uwf1F&4sLrsTpao^yhi%O*H*DJ?p!5Rs7R!%v2RZD)Yd`S&>Dj7$c2=hAgD9r` zf$Fy70!3y-k}nD%#S#Gh?&%}zwT!GAQ}wVRis)uTQAlrX*55&3O>o%$1iZ!c#$)kX z2os!WRw`DK0Sm#5(B@2OATW7SqIWrv5la_qs_4CBteh;<(ch-ugCPPm#ssXcL%aP2 z?}=Q$%VLm*;!LwnGRci9`XS?lnx~V~^jy<_*i)EQZSn}^{y<*nf0XD1Nr9y z`b3dP6d+HPquC1AR=r7IMAO=TK|V4EokwNsvf|OH5+G1{0z4>5J_hDvuz#hdCM5to zn)c9L5@1W|r)eIaW}Jypvw_|HA)KiZF&$+{oDC3~9+5D4Ue5mF(;EWfucc#@=U_2pu!4Tksy{Z69=^_4#{yVZh-iW`a zv5v+VOC;LR%d>0i{zdVim#^N3CK#WQ_NHLWxL?4*B>rhaO+Eb`Lb+znMEF6*PgD%H z+y8?IqF+S|Am-n5<&?nr6UIq;xp@hK5q|QNc4LrE&Pr|EBcnUa3N>P2fpk&MM+@s?gVq#HsRW0f3mlnhVB5 za8VpSoH7J6U{3s0eux?$W|g15EGbdrw~R4d!_6D2@CW`sP@Pmq+C!|4%A^cHb@(r- z^y6QOsBFm$Ock1nUtu*D#dXI8?k5!iR8)hXJLL!#Exsn=bt5ndpa~yxfR}}!uqq=G zv-ny0GHw&MCw*+Gk`n^@Vei~DpYi{qI7wbi{13RO;vu7q+fCI-Mg>q4!ocuCT%W%B zcx$#AmxNHm_fo#P52@76Y54dt4sytYcpgb~ZHcqqs@H z=xNHA{ze>r9OHk&%{6WGDCaPWXA-L$8<0~I$jL=fnfEs;L*sZT;}Kp79K5RjRDt;(YB4<=gIKeM()M?$8&^?TcolI+-H|xtyrl07L{0YP3u?(; z{7Uj~+>j!Whu?=$rGa2!IiRMllCI>S0B_TUrrRp?SlnqUGV`e3`HES+>M~t$V z096Mc2_`+a97K)4{f+*~7=fEc34F7<$%relYejqoezP<2Ex?`1Xj_B=icF-(HT5)O zno48v9o_n7LE@kfCDr) zn&!%-SSOL|GP)B(2kse$OIvegC^2mvjovW~F!z&Nc*-?ME_y4~b8u&!w&S2*%smKy zNNn>ryR`-HO0<|Zfm;qODUb$f(XgEEOs6GI5=1aWZxR!upiJEj|B@93{)eoP;Z*Rq za<}1=FizuENR1e?6QStwON|wc#Vb&zXYwjK<8#|^74^}+C}n_s*e540sk@Os>rVGJ z-nbBl&NdWK)XntQ)L7@`-u6$-cwJ^M3hG#5tPfBXzKNtLMo?=1^YX9$HWMlk-%!Xwud zc9BRK;3&3m(4k}wD3t+tqoqp*n-uspCr!Ai$hn@+?)rG0cLi$`bNTJ4ax!l*K?^GdAs&7t9E%!XO5-a#| z)n{d+Op_D|2b~Z^**zsR6^s0IDbkO4FD0~;i!1$TP1~&u5HPX$R{D^y%sq!KoBe?5 z7_Lx@o=n6LF)zy{SHf`y)?lnH#x8~^CADR^#bw_`;dRQD+s&B-vzaHQ)8N{GX4lsO~b)+w%Rj>;`HGd zkc=-^v(SgS!#LbE{8eRDLNli1ZRPcNlK84B_@CVbEe^)2*6BTcYx;t+P6pwtgLyta zn5qoNQwi&wdh(TuuG&?%RFPv1>U<{P#@U>&f*&Ep1T(81712}u^-Eug#2H#57+m zDWw`or`r2bhEA;OW!}}`RF0~l_aQ?Kcnz9+^xKhdT?JQAQfk^FHHX;DIMbtVD{(PY zbrPY49;GhB-LayiDM2qFA4RGrYj=UYs1c(!wJ_`|gM+NoLNL-DR!b!e** zUw7X_@+V1GkjJpa*MxA*h6Z1SfF=%pbY}I#Wk zd%sB)JdSQDmVuP?lgF3zRGyy+)W)@jn1?HH6Uy#-r2Zm<`mIO27Co zg$_U!$g`+9eM+?&({%<*ANGh!Uv)f?sUM==T9V-v#`O!$q4lp^fCV}j5pKE_D%of7 zhTwR5jLHzLrXLUg59^L$!G8g#ho>}DlgAo_Ff33&S^#7DKfrIEcH2o_G>J(S|T*Qg@ct!T~&a>WN|I<{mv<#$e`C_m@G4By($ z&vIHrU^^PYJZ<`}APgNKDN5K9!l0meCNU_*O~!x{c>}uLlLTBjzO`txYGAkMZPq{~ z(ktb0;sn2k(2aaFjwWp}EQT=F@z-eL&qL*TzQXoE&+=jPR|cB(FSjHx2>z^XWOnOa z7P_WF^)DET_|#ZoGRYXI+;m7&O?|m*B8l5hNsF zGrQX@b`Crl6hsYY8dUf~G^iwR;Y4MW%1|J~`Pgh#OFp*C7f6D{W2g0P_S~THZ6`q* z^0Kt^bH`-8q<-lr+`2J}D`$|5ig&*^sR#oxd>fe!QYHo>u{?T+9%hH=?H43`!1Gt` zXUu41kz(9jsw+33j^KaoEX*sxTtulBQ?hERYI|o;b^Ivo)%9vITX!ys;w={cBvF`J+3#FK(R1fE5 zad^YVQzQVws^jN+T4`6e6iey)ncP*_9LmlKnSESZ@TL^!A!iyTHkXb*L=7{HS5nBL z2t7JoqQ$#0YVTkNusd;4X@QY468u0&7q%P*`?Dda+nY`5^;CS@@7y-LxgZ~{k-VnN zuO+W25H*U6i)WCI1dWIGg9{640*1_lyLnXsonV%z=;R>qK z^G*=dp|Md5?*GCdORt5UlEmytu!ekPK z;vaMrZNNcdecuVDAcCsmBQVRl!WZElo75^}}>=QY$!E<9&9P0f~UlI+B5X@JB>cB#X$%tuUL9g)j- z6zDFq_d?--8o$}jkpb8yT|wW!T!fnx+aOosEyoYf#B`1`jMR0NyUtPpqKL1if{Be` zX9B;H>t`uqd#;cU73J$(v346eIEr;_UkH<-fDnZxUIlw%&<#66i{T{Zxt^6WajGM4 zl~U|XI{Bp7v<2N8N*+_*dRAciMkF??5brof;F@srMF7m{or{NvoJy98wSA|eE17F5 zQ;ePx^o_pfs0QR+&6LbeJxtYh-)>3qom4ksU59610JEr%p?t23I`%zTARlm8I0B!L zwroBI9|p**6vsc;a~JERjWYfb{yFk@Sj)aVwTOE|_!Ac|v=9il*iIW^nMsPhmM$3% z>4PowSePy|T{X9lmb5uXiEK~lNQyeMKmM?`AG_NeY!p3aSAwK^>Bo+XoTtHz-|+27 zJanAdB0|DlUqw=B&0j^j2GWu>^j6zh4le7V-N1}Bu&;+W#ZhY9F8y_eNVyqPxK*E# zQ*sicrQ*xJ1}02u-($FNYqe3Yl+VATTk%~a?vUM>2*Q0!x%tQdg*P%1ekS;N2*adH ztJCbcdh!itX;byJ!>6dg!*noyne_}^x?ckoA=vt=_I0nivxlDVYM@&V>)UV)TOVIN zhfZV`>qr*It_jDB0VxWjt9>?srWy@03#6G-UlSJ7FS;5ieF>cBFyFB%Cz`S*atD#7 zX&g>ea%q*ZNO*ysMHSPmWDz>;axy7ANwf8;;aw}RCUdT*gzE4*T&p#{a+pjEkJ%D( z*UqA+*~iiBkKu48ni(&}G5FtcDBzfaFIi1Ir}s{=Il}TBGN_4^VoQ*4`iBVQM*{sI zILX1GK>cF>DGufL@R-T}TWXc5lqJ7L+aIW##4uOMj*WzWBABOvzG~+s1skatY;NLW zz$R?{-zHaOS=9gLWm6Lx?=4s@j873s zRwX<}#dcp63c7#CC5W(IdIz2qRMpM(?7al|sy}KzX2;p@1T46bN+kN#`29|eC#S{~I2Ut7MmXH-+ni%S2GWQ7rGL$KWGvr>(nUg*L)gdB}9 zE!XE9q_bj!VT?g+tbl_Ss%rIM5&0uQ*2-VuJMBwUpwro>KZ110ReY{ViIFClVynd| z^l^0nrQE=1<*sSL@VDMT$9cE-pM_xN-`V05;kmz+lm+`aQ-ltF>(6$FpBC>LE_om1 zdc%a!&OZXxs6a5aNif2317wGBUCc^p(|dW_MCuf*&C~Oo@l?{eq3WE${ko?BAGUT^ zcP)9Ez(*!{zyGpMQNehsquO`=NPQqo6= zQM&Z4K+fMmXfTuO{W~M??+?(81CU-{*Anl`_I?smAtt_+%%-UtW(Sz3vp-{`6g(2p z9~YYa8x2cQlR#AQ{zH_{Sr$C06Dn0%QzUt>VB3>_g-Xf06L#hmk?WwW_XFQ|0Sz!g zvgU1)Y2wB)e@3l%Rpfeu_E_ZIFJKzclf5tI_TXUV2L?})6B=fAf7qvDUyJlipiEKG zSPQ`xu+$8oYPbr`8E3M%vqg#)U(yth+iGSgzl`xo`M^=waSXGZt)JN45?t)o2(#He zzx7MD!7fGklH@vU;t)Ynk6HKO&easG1`9SlJI!@?`q5;h4L7sTWCc5^zC)Im zjoSK$v|F@@2ZPY)A_~cLTSi#U*LZ^Ftq`60Crs+C!5C=eo#KoRnaQVGmL#EnRALLU z0d`1DZz@{mQ4PXYXiIR`QHDsFs=0Z!lE)KbsmQa8ZV#N9hZEUnq9W0pjq{5t!Lmk5 zeplVm3zKi`Ti7UefrwrPzo$CSQK>fPS`jL4uG`_qM8s&je{{Srv3XQYzjp2s*Us)M zfuF+IcSBKxHH{UXx27P5vwmh{-*xUl)+GtzyiEh7c}1d|&$QeQ)WHQ_xf*dC=}E9s zcdk%w3$-{_Yg)vXRM{nrgR5KcvzY0L!BmMK?ne^}c!$wK!CERwxOPXk3)wLD_BWO?LS z`{gpfVTTN+q8N(U9PkQ;091ILkyY3V&8w|RFw036QDYwfI}`hL%6e=jbS8TzL$wl2 zgU}m+vQ6^@EZDI7TKkA+J7vlanLR~RIYD%0hmsn@yqY4}N>!S@3-Tq)PKil}4(Dim zuF&A3#RXYXToW6DZ0n^i8%(&OB;8cS1dSAVVUA;>U#x}Qt34Mr8~Rm zVSl|~J2Rl9Uq8HFZJ?Y-#B_dZhv`|R?XVVx$(W)jenPIlX+=Uu)=MIxKXfIhzlj=^ zxtS2AZ&BKN#O!7pK_O8E{awaKV#8hCmAHN+D8zL|x8jI{-Gbm?-)vYi0Pkq8|Rd}Eoh@yF7i%#gzv?sWx(S~g? zxG;WkBG3xjIm?e}t)tB)x@iH6*=G*%58%10i~lbS2Aw5n)Jn3X5cF2%B;#H^Di+Vn zy|3FxsTY5)(@hL$y73`JO{OX&li8?5Zh*c?Jhc`U+3wut2hyj}MD;z_av8~4?D@pN z&n7{t{AdC`tE1|0A}?*J(>^53yc{r!5WHX+7z<_J_3Y8sByf}QAtG>x!i`i6K~Vvp?#)rnz-C~b zF0YV+TQc^EWN7S9U!i=ZSd2bGKk9jp*1sT|hc|f?ZITi8mTxiQyaBDuPFRr<9&fCy z5@y%ZF}T+4!6LM|0^T|z;_z`k8t*s3IxM0j*DZ%I62LT4%NTX^6h_KBzfrOk1F|+y z=#N0(!(}6haZ!Hn$Cop{>{V7uT(1XWqQxn&1^mENn_$rbu`!m9)w#?Ewf zzpOMglg3>ATkOGbSZJhQCoe0S&jxiMCD`XaW_@+ivqB3=iX%*a%%j@RSuf={MfSHO zY8*r0M7u1lsn9h$Se%@g^QBap>PQ670GN`F)QFQSPz`23F77;SuMgrA+ZO0SD%0)RM+Vx9_vx%f` zkn9YE`JTX$1~|-FHH4Iek|3!`KR9oUC?`&bDz7t-+Nj)&--7$hR2B1kfBMFKzByBr zH5`jVsZdkPOdJ5=X@OBD8<{{=yc#Lduk4;pug+)^ar+?+l?;9|OWTp`KU|#1OiXP_ zW=+GP2t#nm2u>J)M?{0az7k4xSjbexxBlk6lY1&~6vIJ+`TK^&@dXy*@?hhY>C|TI zr<^Jq{gFLiEJg<2UwR@_VnI<|33TY8l^zOR5Yr$H{X;xMhZ3ndfzB z&nLxqVF!y_MYbG6eFAN4Tp2U^4l(018z**VUT)z&kYdFEbvfiC18yedgqNO+dwbm= zX#-Ma4uu3d#2BC?yTpu>VFO2O|6N2G^HcIQ8JI(u+PeS_+s}MFkSbsg$pO^jN+T@E z*4ARXy`~nk817^ndPChrILEFVx=bsIvh!tJxFyEbtTkyv;$Kk}r~F0QO1%Z90OxZPB{ z>qWJ{8eO?CY?`6D>bi@yk8{1b2qrLF9*fIXb)s@!ju{f;?BJ2En^i6oC&mmBV? zs%!KOvrznyyMfFExG2T;z*PK_=4k?oqdFc#5V9Vn_y_n(kwTVTBE>my8D>`(6O0#` z1Dg%(Nhdr%l$;5}E$tzH4aSCGzf3}kj~Pm3)J*tT#h#AF#~!uIi-T>))*#}-yL@?V zZD$nT2P>4!XG!WZ1S{5oNvXuJws`&&`X1&h$@5D7Z>pi=ezhSTfpSEVVoS8#xJym5 z${q%ldo3+-uwM?Id!7vzD3ulG1|UB42r!+bBeo(OZ>e z$Sh%EolJ+`uwcN=JbEiyeEfBOq{7+jMY%@wFw4f^?!DZLRM?sKwuWS65q2gvRp5D< zu%B+r$_diY1)D=OVgf;h>)w|puBzgPVhm4hbQf2z4oIfep6hdb^YJvlgrhB>)Z4mV>^P#Cf^UqKitLXXyp3Pw< z=rZ0>NM|-ybhg@0)2L>Fffzu#nh7ovrH9 z`<9Z>)&cv!BOivjMgm$mb7FY+Z7F(4Al8r}ku$et$i|ouXRz?}&)C2|9){uxqwCH; z%0hghT6WR~@h~6r8zc7DuE;e$oCD zEnpyfjucUHn7IL!ydX3DKEm$8Bq7YG7s5_I0cld03uL{T{&Mfzry1{J^Y2;=*{}9h zv5j%EPpC4I>txeqs5lVn%GfhQ9W$vCCP?-;EF|=MI|7MPU77hR_Ecz6jQb}m9arPS z1iZ4^x@onwhWcpuBva$STi3o~{sOG`V5GbKBIVu>`=m@cvAxL96EgNm-TPF3&|CDc z!GXw@7`l!UCjHzv#Nr9hJ0=RK{P7VLkEK$WAB|^hDR4rKPT{MvuFX{8{r%K1+c6D{ zMIf&dmEe0NHnTi+J`*qR1W2+YQ$v7vc}Aq;{1_-h4Z<-498DG*r;;d40Ai{Vob$u% zqX*d=k8O&FDdJ$gZf(9|ihq&q#hFv6UQczYkChj0& zdPjsIN%3ELTjv9Jo;8uGYrl<|2Lq9Z(Ns^q8NsLP$5}B^%GoM`8W|bKUo~28$+%hY z^8l(64B5h#S=t1pr$Qu7NzECWa#13s3Z1J|(xTcqWMC$}IKb@jiMY?%C!(aI{FN(e zLbKkc=SPfssz@d?v zV)A=F+~dJH7JL&kMvF9mvD2k?C1Qc9;4dZZ1u+DsJDT5erBIw=Iu?of**|E6B5Qx! zr<&H|lt6uJ?AFr&X+yj5o~xSgl*Mw`y#7+*ej^>#k)^%?Rc`p zN5T4d!KLcN+eamX;k*sepaZgRvZMpn>G7)D`85n5MDj|+{+Te1sU8UD_0SU?^$YLA ztuNSQdsJJRKne7xW`UUq{HY8?Jyb9oC*bN2)6jnjqbQ&1`-hyD*wIiEB}FaV(%^H^qkxSRn0*;QsA6YV;z{@x`tN^u%U8ufAT zpO+$!kJ&Wo#?sC_@_|OON~Yx(^Aq5&v5;moRI1&7knPF%#?*$;(e4GFm&F+|q6fUC ze+ZZ-8$OFg1Sams4b$=l1}GR+vdM|ci=>~45V5h4`H(St5yU$s+LApMU*@s^Vq#Aw zw-3#*rZtH$UbCVs}Pzzgrf`n|_98 zL&>u$I-`3OV@FQltOJZXQc}cTibf3Fm*Jr6Pox>}d~8!UonzSIfv>`;pH_bq%an#9 z$b(5`cD=CmW5qzyho@S&13Cr@cHmIytQAFIL1?ul}|p4q{{l{frryw%3o|gfp_3O z3CCxZ(y&jjtu^{k5Q}&S)QZl4ZziCip=&31b@GQaHGWh~ zV>QvyJK9_LtY~Qf@9NdFYk^B4p$gAiVsEA44Xep3gZ@&y^!sjUrfR-(?uf{HLhf)Q zq$o@?SoVSB={&b6=j#}8iu25~=~;t=xom?eSD1unLi%gW@@VsOhC6or`{#+WN-4&I zM+2lqhvU#%K$-!3P=I?G=@-E@X3!DXhJ_>lVoGYvK9R@lS6buya0|rikaaZt)ii)PG<*n2t#iY`*)YPtMnp#?# znx&O!W|mf_W>(twH9w!v@A3OSzW?+vMR4c5FR$10^}Oh;*ImvR=ti3RDCT+%J;3!D z`ir&-ox@bi4t}03XL2rM1e)^;`N~ULYBaY@o~7v6O=7_OPC~kB^;<1620&q(7^EFx zo7;QMQWnl@SCGc9@H=h}&YH~^DV(2CWJNYgFgNHqVItQd$7Ui6zK>zPA?4W**TuIs zzi(R~jXa2VmXv?8c-OUuBU85FC|1} zq427XI6~VrIzyeWq{Pq94EA)kZ-zn)M{dNM4WW86&`PiF81?9lz>U8s1czinxI%d1!G^OVM4Ho|` z{Kw7MH}^INi9N~ijRA{a<97;JZ)v|3h~evbq(Q1_lOMv} zGYv;{f;EEf@7r%wMdytUa^4tj4_Dg?wBSt^<|XO9R9w8LYZ2^GP-W(4wb-Q~ooXmp z)m788*V96giu+(H8P#{ipC3HqNaym0@Mrr7$D*hq+7BRi0C^=uH4S(3AbC$)Skb`G zT_tawi-O`PxTRW=-!X>N^-0OsAo_&q#$Od!4v<`>vyTo&7rS%X*N8n6=kNMXxWJM= zeOlY#q*DBV+0Tr%t9x-06>QVM`C^PCBNyeKYr?w(^?DbGEkSVKjpw0nGJF6`bB|Y$ z7>yqV3$kyLB;qV6k;l4FWEFVXi zYmCcMB~>S(pHaMx%ebzAs`Q+IrFiEfceI|o8m{W$Yka3-GV3MwVd3I25>9$TIP{$j zMt(^Nq-tSpAMAFThPni7if*-#-;Hp!ALOY7{Z~) zX3yYG7z6U9<^nOlIEWh7alNHM5@tIZ?3#w_X!cOpP}H@U>#KgI(cNIvAX3^W9tZ#IwjYqti_BiXv0_a8ZD2X`T)X`@ zTKvb{cbM>cgc!|*#X-^te7yZfdr%PruT(<2$uh>Xnzs55lR;7L0Y)LZpuZ$1)Pyr!4JD&ktnGg< zgR$JfBb=yGeTj?XW6_vKOt9!0XegL^61wV@A`;Fs<=yiRX1(>i@)ZS4yf9CKmDU zvddnUZ2Tks7!~8xS@C%4oYnmUkMLBZBJm2hJCyQdP7lI?Yr)2tK&tDQ{&WG}d*5Wj z?|(ThR#l za@c@@aIQ}gSlsJ^ABUkYXHC8BS~j1mZolpcX?q$m-BY$B3Cvzhi-!53IsZu4>}QL9 z11jn983!T3^d4Ur_bmDc>8)Em=F^dOMo~MP-!}xy>$4fcS8{L&`1<++yx}G*3b|Ps zWVeD`%%a+JPK;m6^J8Pp4I-|foQSbhOjSgtM&KULC2}oH@5fxzPcW^9b!vWZFmx)6 zEWxkKmI>Kw(atsovoN@KFnO#xW3?WW1B42)um5#c7#?no;XLL?b2|G4YB-4*r%NLz zqp2iP;OIHbL0679*kd++8Qs{-nN#xU1lJ}+aGMXaktEOdsW9^7rN6`?hq zjHq*5p;{-PXsH2ynG2`FNgV6wpCnSav&uj{5H}3*TQzeU6XNA5eaNs7I6N8ZSYb+( zFl&7Jdx>K#j`$nS=M|=y?jn-Pn_|e;1^ixDSpBI_aH29zt$G1&6k}E|Bt%f9LcA54 zqr~1TN~MMdJ3oZh~z(5ml1zM9P6?xr#9A?(8FnI;tgY&lNKkACdD$^Qv5mRtEGG$_h1_D zZeU+C9#cV6F)@}I56OsYDOH)PtCqwByxzIbW#)|-3Nj2ylt+d@awH^G>T3Mh1{pYr zw7)+Sn*-r(4B+{_ z2p!tE$Z?~2C|E|mS)4!O?{aMM^5@(B?M0sHn;}W#8)Qf;UXb7#3Nu{R!qEI5#ItZ` z6rLCt)JVm#oXh++jMPtrNiN~HA#l@zf3R>QJ%mdNrb;{F`L&_0tK0=wM!!C_3no6w z{19YQy;W_z>AUV?yyBb4F1BlOVvuVC`Dk48J=H~5AB-Z(;<^RSW+3@mW+K(R`G&PD z-1Beiu06>oKCrQ|sJHl1nQr}|>wap!tz zOED8Rp=wiM!}V3>Ex5@^stz`VL#!1t75oP_$BPU(=rPR@hp9Gk)6|e_<#)u3Q^{{~ z+7!8GMOS8=M4#{2Nb?gE=J5yu73E8X3_15yq-nU>*NW_{^1z*wZ-A_7j!H4scc5ZG>5+#VT{+vVi9AD zhz@*)l;P3>uYHk>*<$U8%vB0=!?QnRTZ$x(#}UFaim;(nRd*-%le)0Rl9F*h2o&>> zE(E(&aA7&`V4ZJKIe*dS%QnkZIAXV)vYiL6B!tPkxou+ye5H{E@~oc2$Xr2gv~`XX ze-=Jf@iY2Kz2)#q5*l}ZiH3H>j1e5{*Tj(sd1D~73TA}i8y12!LQsrwk-*p*%spuP z6Zr!M<8aw^h2Um)P1R4ba^qc=d^q%u#=B+fGc6So`z)!)k30ehDj>I-l=V11 z>Hb1l-+G!Sz3V)69jdaUdrdSuG%C&}|~*5%goo0nJ?@c;C& zx21?*!x91#zqGD8BSGo>L7Gu7(KptPspZ2qJPNgq9;NX#G~hraKhoWwNPvsgSnnyw zs}69i#luH|?vXZ|Z^S95=*=%!)K;VYfXS?r4>fp2=K z5k6OI>#!EfET^z(6N5>G;3^M{hsod>(k72-s4J2@8bnSIUK+EKop^Z)4;18*;JP5I_e{UO zz;XiK9)w)#YUr!7txlq+cONpZ3%UM9e6ndMGlIlL(MK9*xk?a##L$P@)zexd;+NtP z@9mOs!=mXij;LNRC>$;?gepH?zL{QS&R9u-R(Whz0Sv^eNd`kT#@S&VbA?kn`gx}) ziyuQ?SGHV{(o+&2sL}uvDh+MjF1(JI!QY;RT^x5l|DhjRRzRO6SR$NBvVJTRhue)( z`*8{u*o=yS%o`Z?6C=xR?9HdKn7>Nrg0ct>W{Nsm#XjQS)^ckV@lnD&4Obrm-xP55 z`qjzS8A{{UD7r}4>fC$}GnkN8c~S40-s4KygthG%Ip&>Xv7VMe)!VXwJI-f3Z+F#$ zdKouO}XfFcarO$t16SasQRh6iMV} z*wcn5&43Z`){+2ZS>CMw7CCRkmt^+pg_7vDG{{`aAF>MuyKN>-{u*mqS8TGsoSTQt zh6dy1`P_mvWQATT317S+T6|1BeRLExx@!-W$6bG>s_=B19&(loQ`pw;+<%^3q_-^r zD8ZA-jK^v$&aD?I@iiS$v&ShPcYG*i;pS+${xbW`a4N3L<8?u}ntt3RX8o9Xmu6~< z4(J!Wp*Jerv=@Ra;7+XTpU@{>o0!J)c%iV6F!M>6MtIZ*VjJOuVpm!ABqGCkTOl+^G3z zK+^ZMfcS6gO3(YekZOF>X;g)gG%u7QRcXd|KbUNHBpn`cPwfc)zMg)-?!$MtPG9vZ z776$D_5u{Va0B$hA2DJr_g{Z{s`GcLeQgxkAfrt%K7l+p`c#syh2f3C5wL42Wh33m z?yX|hO?%D>i7-n~zKnzmskqZBO?4RTiO3!t8;NiMbPwh;`|y<hs_ z>-T2ZUrAb48~b8vrqY%qp>K(AH(Im5V`XVbf84PQuIdqX0RJNFP?8eiKm`WRd=4^{ z+|mis)O6V6jzdmgoFOp@DW)k&Xk+!+=;+jR6o2)t^4EEf8RTS}zHoEfeca`jr<>mK zsIC7FZh>A7^a&q`3X@9W9)wLQTIW2iu>Pz!epF9Yt_ZuiMe1up^_L$fy3N@kO7lWB zdWXPW!ff{?xONILL-7Ndt_o8*cRaVO4_*ThG>D7}b}>jlUN{uGLQwHn*AQO{TkO7O zTCgq1D87jS9WX78`$R28@_}2FVyMXF2yBuNoWrUGdl6CI`Je9!olE}#LmFUPU*jJv z)9p(1Wp$hmcvJbquwXQx8{-2`W~lOW2h_E5z^1^9GYr9C7T%lz2eix>$`je{`h*t6 zV=`3EaZ6tyzoLmM$&9g%yf1BT`DQ>^$l=8luCC0aO_J-?G4d=JH)dMi{uN>N}KC>dA9wVpq8&B+I;sJ zE*pJLxGXtvYOL-1S@N%(8OeR5vCfj4Bkg>n(y0w{caWg*+)6#X6R$yH_%uJcn+iV$ zn+m(@OjYE+mt23~Z)XiflpYc|ixsv0NM0R987pB!d z#%{kmf%14Zp+Su!h5V%yf8?8#u0o><1*RJAo{W20PVY6>E7-;RjF_X#WiP=zSzA42 zIczKBcRdHOcIaD;*WUYYqx+y<<@yP!Jm|7Rrbl{m3AzG*HJN-Z9Lr#D7@tePFEFIhNtC zbDS(Bew{1Hvfg?wiT^7EHW4yE4*$i4{hV(~t>1?me}}5smb`s=CzRP(T0h-C>pV4; zD{>)pCvJ2mp*%VMRYcf4OJyEZTe9WCfCyiV?UsahpmeC5{9NdnjnAl&ai2Dw}w)w&PVfC`eLdcbXwu%DfrcpScwcSE=g%xZb?ZQ(Xv>g%7@;#eYiI! z!|zYoZt1(Ph$9MLVm)?VfmFB^Q1Sv?+@^ZY65ob)lD3Y1RF(0JoXz3ShvPL~;VY;< zC*?$rlRI0NOR>KBNG2o(vsLsi$5+9!smSxblK^jx!HM2x!TpnQip<=ql9pD&`~BH= z+O4VgS9+^pNEjVWYsDrwF&zOd?4K84f4!Dly95t$YEXdF|Dp-T0M|@99@G8V-^jN% z+qkuMz2M2^Pv{_6mbt38G&wnEWE>tRC(lS_qcI2Z2S81s@o*TsP-r!^43@MWbMg{c zxszM(=C8TWSJ}w|$Ir5MS425lXvCx76MU=M-e*=22TNolfKpA9vvx|UDlndU#mKPs zig8G3Hy&2^q~+!sSpU|#9> zPtTqxftHu4xT0TB1eEN2C2i$yDK*4+T-&`S<0CB^2q*N#Cp4t5F#%d?B~Z-f*TNu{ zJkm~^sKy8~V~T#dEi)*XO!hKO(5WxgZh7A}`o8Ukd@ zidKbXM!@!&+rOP^aNa_;4}_|uRW(P~b6>5~_TU7a{A|I|1JNW3DGmG{tP=(9nu9x` z2>XD(Abb-8v%2t%dTlOWq(SY{TGlm(X!@IDEe~JileEV5JG=GV0h|)XA*JMUm-)CJ z&AJ4x6Fb?XYMzeI-lIj?{L9btL4S^{T{7(|KoDF|PC5yZK< zR@ztx3q}jS%7i2VX`S;$SAS*|_bzyDC+2XQuoLxF!Sn06TzBy+a7xY9hFDYM*iCo7 z%=u11CFZHpq=`uuy~#R*HezFi@O>UZFVpkI`aH} zVoV_e%)DEqYt}6ZL9x~~vMwlGlZ%+pRP&WwB?{+qNgo3mSu`75m_C00b@=cV=~SO^ zz?2z*KIKq`2yziR8#~6JBN@5hhxu<#sk4!GPXWOIXAJaXX{ncPhJ%HzL#Qg%Mk>aA z&VHe{O&840CQS;Vh;Qwni@C0$nWPklbaP{E>!j>Tk~KEaJO0y;^ff4vQRNqRfHJFf zU<3kMC}YI)sy!F!(2P4UY0FpEeyaV!yM%s<4~yXMD!M*1&(~(f@S>X6skNES7VdY_ z;Wod`TR&I8tQevi=So1>j+|dlza(a3hM=?#RdoqmeI@-@;OvVhKWyg|R&krgP!XVt zzq1PuZTbhYG!!Y`>JL61WLXn-lAH#Y4en_9p0Hgr^uM-GRn=m(c_R$xkj@hv{X72? z_d-aH<(yfq=KfC5Zf2hs3dVAIQI7EE2}UA}gnKK=!<_-1Xo+bK&8b`+ACebd5Q|`T znvfGlE9rejT8ZONg}9N9OR-}(8NbX<*_wO7m>i^$)}h%B=wBw&W5qlA)#R|unlY-U zH~p)A1ph^j^>2|r?zw0FFiJ3l;u2>fRo8`dnQ=h4kj`7uNcJl*Q%&k)=t8R}GW%{X z<}D@q+xVgNbu@u<6>fl$3UVP{M7nj>QU20cm=#aH-bu}XL7T0wr9yN8cL*H+Dl!+V z^VV%Sy>qd1j|AfNb}xej{B@FE;&~!Z!x<^~Sxe9? z4G!<+!bjKyOphen=W<1Ht_y*>u}`e!52I=lxh2DBtG24ImGHh5;~0H>)ST6j_=q2<6`00xe#O!zFR=XY$xYJm1t8{#rZ~~8B3L~(vvZv79&>k4oKi| zM9%5;xKmH6b8TtEjdNX=;TxCGXYAj^wj7qgQ;M4#kXPMl+oR6#QJGUH(RU^{-kY-5 z{8FD4ouSCh#|F3R{V4QsYG|yhem?>hB5Ryu2HaUrH&}_nxFgk*(%L{IV>I#8Q8VOR zlCW zDj&UMf7IfkGOsy_a4GU!S$$kG=x5yrk zXG+F1(qWC+U93>>9=%pJ!e7U!>|~rO<%O0l$Qy#sGGTZ`gaJ(yO3VBWoMAq{Th=2Z zzi>io7*$`TCL7eJcAZ#mw#vzQRbcRQX<$bTCJn`CUqTd|tF1yo!^8$8T^M0vhHKi* zzOXM1Xq3`&?$mO>oQ%}qwaD+4+iDqVYGPlis&yPc6!7)m1H3dfbyOKyUqI`n6`tmW z+$1PS>h0P=_q$nY!(d?JM~$iOz0w&TG1YoIyEdL2*v@t`V=zJYnFr@5!hLX}-_xQL=+lw&FA=Lv8$Rnr{SM!%0=fh2i4gr2hnN zf=X!7Ny~ij%T5^Ij{3t$N4{0P z@t4Xn$(?N18rj^~sDGio_-2aG1$b zhHQq#Rv#JkWzE^;RwG8*`fQsN$ZQ4(gLigNWjCL*?>PoB?_l<19bAkE zgzkB*e;QmLdG5nLq+Y?OnVu!ri)aqsY~y9s7$rEv(+qDZckvJ@6E3`gvb`qA*iH@! zNTe~8kk}0-$oyRD9=GyKX^|uN*VRMF>LG$Tm_B%zR(V0Lq0_v}2EkkIReeMt=Dv1@9Rm{4tkfG{a%(Pu5niTO4T}hkV&*N+EGZ2!? zIb_>!Ddu++uEX?T`=*YXqgP;-%A7RTcCE4JHX5y=70da7>>}gZgscIke111ZT`2gm z=qS(sB0upO-x|S_0y+hyBAgHm@2~XrBj=-g{inTs4}jk-=0unO@KB zjH``s7SpB?p6j&X=msuT&s)v>A|86nGFGtcb9})N7*Yh!g`3uUFYs8=;7Q`*Y8BQm zOH601y$F9|AXyS^+n|JD>f2$7zuMo6279creIhu6IO2PZEMg^Czow z1Dv6RU^)YvFw@u`-V#Dk2=h@yZWlKJ)2ET7PR!%`@ed-XIPM%`0M)rl)Ss`NL@Y{N z8Fo`k!03s9+~}=j=OqqGvD#ZP$rN58ur5T~f3j@WL z#}a2QMSjqU4;(*4^4}?4)1fdLD*BO&D`D&)tdzp$BPvy|$%sl4-j*LUoc|ck+R;$o zKU*~m#@52|CXg#o5r?L1@V=M36HQ-q(awTiuGjUyGTW@{G-hvlhn+-g4qi4kRl>DT z;nFFf_tM{*&nD(?a=QVEi8UEr(Xb;PCRnj@ZslS633y7mR!zTQ8EyW)zpW;-LzDlB zKqWIr9A|oEZQFGgUQ%?PCb`RRW|^09?l;Blu;f_RE2cWCncUH+CQ?(4`w`>cDxKND z%`vw9!98YSy8yjc20|KYTyW=klFXr%H;QDg9?LnXzyRBv@hp{ky3%V-9{Feh_0;tN zsuv3xZup3nA0-_>w6)X6BS+tSmcOzXbv}OLeHkx4e_fq_hGnTSWsFl2 zYkXw@>RCSD#RbLZ0y_#?2vME}YdrsuCzmZ@#bg*qlrr}Tu0cjSVS&y3fQPgf>j&>SET3;g@^8xGdG7uUs@nWPivG3pkG;jY zbPk{|o?525RbFujEgTnFrKygS^WV?!9gRz64DNg<>LAX)0w0?+L+gCra%QdjMJRfU zRLyDGE{QCF{c`aF97r;*8;(cZ-@4Xg^zZ54b1|I#a@-0lHG^-?$oO5tb%an=@sBbG zN^$;H!)AQy z5eCS(X`!{%?|-waHZi7aEJTZ_b0m|E#t+P7tDa6Y4tukEzQ*9G@|A%yQP>`5VQnAD znPVx5%oaGV=9H{6Pn}!Iz6MJ;X<0MLFgj<1*!sq#_vg3Ea?G-v4WZK1l#`}-=hwYS zq*-;u_)yidMq)#=&1cPfhw)p5f%m{67u)%nylbaRVZNaie@25R?5)h#)X+yuTVO&k zH`*@#hS0_GVC`%47^Z(~hiOS$HrG3a4dch=aoNqNp{WvTwPgJg7eg<#xuq-ObQpA4 z=PPafHzOAWV~CBSp&gC3FU~l12$GBS8Gn2ka zm#*{2c6zYpcVx+|ZK1h7+b&*;iqv^>l(3}2&)&0ArtM0rNR0sLVl)Iqmm1U=8Aig# zjh$*b0(Cs!=b8IP;Ssr5WxY1c6Zvg{@YW9cdr_N5OX*P9MY#F)%n`P>)%1$C-aHCI zcc>9zGd;7hed5>500jS0K=3@i{13N4ZX73_$4v}}J4mBha{!1W`&-Jz12 zSFPR{#@}rcDOeuMFFKDd2Ct;TNFD>q#6TVMY7Cij-W)3$M{Q;IUQZ^!z1y~Z?E~f( z_nw-6JCZ&|{)#p0LOH`4JfW>6983s-0bx{i&bNt=|6$Glu;ltyZn50^3pK=+C__Wc zpP=PKDcomy=Q!5@L}IwvMsX>2=CcdY$!fm>SDpRmUa&lsj8ZBL{_Y-bcO(I`|mn;RAJ-=Lrv`c5Jn7Q?d%$e|jtlDnu# zxo8g72^~svCChh3!AXrVTcfO>>MJM5`qInW>p9g}{<|dMtx={cn6?@v8(1fhnOz@%2Y3&vkxEHD~g&9TLv*XAs=C z-~1_T4*i9`#*MO?Oi!<{7pq)2ZGXdY|_TMQr`cp4dFzFb6&4NrzY;RDxo}r z&&n*mMON>#&Qr2&z8H|`jDI+&`bW3+RqZ?H+Lb+G9RCK#?msbMZH06|7RKi|>@D-#d(^H>WE3pg8#5KO-1s_XJP2w)`Bt_1p_2Dn} z!SI50HAXX7CUd7a(uqS3bPTgb2JodH4mK06WB_xClo!JhTW74&+vJ}PbJj}HKqyN^S_g`h`K*lG zh!sD#xB_MH7FPg5AC@mso)O@^l+YvCv zR6>Cqt-u=Yi^Jrf!LUsw4&d%2fUSI~Z9l_}2+_q1^`rACjMgd*h4pa| zZjV5CWMs8hi~%N^e|IuHzh}O2($N1&xxbjp+=320N9i=^|AHB8;~MBi;#Btq`(G3S z_45~kegFh7hW6u3d~>|7itfhzjeBC9Sc(n?bxknQD#j_RJY`;9(+9IB*BmeTv=^Q6 zaH#ihL|27P1SS~}>x1nq*Cfwqlw^nW4(Ps;rb#iDWcOeyfo4u0KN{BUSczj0I51sS zfC>|)lgc8t#AVxAVNo{k45574L-AIX3*$J9ka<4qGc*UR=Z4Lq{P7M=V?F*BM1*%u z!LYmOD6kjJJ5#Jz60!H_%kOyLgFKNH-hrcJ>jN@^P^?fZCe=Y% z<|)&|1L&&a0aY3~7N_ml{IpRow~q-zJpzmhC1x{OHxEw88OI6=xOB^x*m@byPi+s$ z+D68vn=;^WAsH&S&CI_!n{Z;ck%X9Y77R+k@S6}mhBy5RhjiFuOiSh7OJSySo6>k` zU)Z6~H1*1h?j=o3fL=LN+R0UEuJ4R_EVm(WY(f^k)}h~h9}zzy<4y^GU^2;nO*mtN zdl(+TG`Ln_f#`!RJ;v_}AwLf_!;ln4K3z`lXD1 z$$iZgV_|;+J%C^I6d$pUKGOY`{_)o{PV`DSr8mM2JwI=mstSUvo?+%r(sVAu+(*Hz z+4J|D1?@ZFqBHYN2{L6q84-}(O$*Vb1sIlTr`?%Ut}rr86k&#va%Kfn1!9&I_2^l2 zSnF5RD0s%M8-k@wwHIpDQ266Al-_GH<5$KfVH)>_6Ra_@4<9CQ`;7L2-ekRss!#b9 z_J(j{!}*PCQ#z>%<8hweZ~jM)Q=~(STJNL0cs}xaTkE)81L0>mK5*5yoc#tyPz>;iFSHK_IM?2EpE-Z8*3h< zBtLU}jfMW$re%o+1nEt%jzKF-ZcA|XIf*U>?Je!;lg>$~l#C(URvyZf<~9mF-=d7+ z)*`EEBjvPhq;Z^7J-6IMJ;kk?MqevDSU4RUIM97;9 zv~5kaw8m@V$Vi#Z#?W_pLBp%m%zm3ZE^kT@VBX(A^I)6fR3Bu3<2;z0Iy)N3_V~;W zlkqz}{UP_lSd12)`#7~{*}+G6LJ0jqSki$-;6E2dU)~@c{Ah&FqM&jhEOi#&M0LEI z;esvB&m=jedajyv^wbAf|DsdLia@3OYb z$-EPMx89gV@(2TYtfQAie8AsJF^9%`2H&RH9}BMbMmEijdi2XoW-$;nuITsPWCtpc zV8Q%5f5V>df!7xF(H0ekQfYs@QVTBqq!1ggu!lY79z~yOv;9eD5Q#W|KcwIz&}j>n z?10m$Y>;VC{B9l+c0Krv85Am>9Ngx%2=D&(Nzi>`I~SKfP87B|5t zj0bL{DRZ0KG4cgR6M%auS(Ql;h*>rPtw4UE@>+Wd&)#t5ute=cmTBZCF<=|J0Q%2kO}k=r-mx{~|C4A){2&gISoGdU1- zm^4m|FF-ltvIujCjbmqlACp^R_8-WW~`*uhK8>ER2cze_0`wTL#iTkoSZ|=Km++! zYdM9+#1+13rU4p9aa%W={>%50t-%mKQx=fT2WQ}2=e?KT9=(##ZcJ%r%2~*DPq<$lc2$to9Y@X6v@~XjniCa;yuN$3blH*S#O5T zu_*XTB|RH{>q8m1>@oJsRMtQA6;!vwxMBQ|R^D-N&u3E4Oy~t<|B@BQ>2Dkpdu2rc zZ$Q#V6O3GweU6nTrsNcEl-iR|o~zBUNjQy~a&sHM=1yFs3R2Eg4Z%JyG8!MeYa{&~ zdU@B?H#p*G<{CL;B$=c0KZRHNa&hr=8u|D>JW$byFCDSG$PG(fu^wN{HZVQXpdoQxk_WM6Q&hnkUaPJgc?J4oV_*~=blq0s+#F7JgbA{GS_DT1UG3FE@sD=JAJt}9UKp}MQcnW zaZFa~BUj}#3;sm%_eebXEF;3Ek=zNby^taMMlw5^en*M+TR!lcK(kbQ%9TYPaebQMl6Y|Jvie)$J7yc1l1ek;I(7;Gg(Vz>EPkPa_ZH z|F&=-ho&L0w+%zQmGtPeKwyUlwMdTq%Vby^%BhG+Iozg%6LLdZ$3DpJMN`2K@b27ey>ib{bxy^(X^E2he)-7As|r;y#PqGWp?ghV^;dKp|`{660t(vMDgjcl}>>)I=RqdnbQQm5VRs7XeNTmz- zfIkV)DHSE+sL+Z!dAJk3q<}H zN*b}ms7EfD-@P&p-&vCn*PX$St5K$TVugr|R|EdTtLyRYRxzKsFBN}mz)yma1ZWK) zKIh70$D((}$Z&JeU&%@hS(a&H?@&X*ll!Fg8q*Ow8dCw{3%uo+BSGtyZI=9B zPDw-ijKmk7nDsMHp@Dg2bNd*P(@e#UQ0bZ~o}i^z@Ov#(9eU(Y_4Hz@PQMsc3D+ft zC)*C)d#YW-#bVcuXk@AcB0_LwIo_5aR};PWTzOP|D_WDL+@V*adk-3tVXNiRUp8OK{qc`zRpt1ZK}Nco9;GcDSm?PUrtfQ7wDhxE;7W|U<l~atig6#xewvZtqjx;bbh@dDUE?sA#Q6UXCdpaQ+c!jqn;q@Y zJAP*e(%r6!GF)_~i>AE9*|zh&0+kA;B6v%)7Hl4F3W`6CsCkpub1CIj&6D&dx^&W0 zbe0myu;OGfPlg{<+=Vr(YIj5+m1M7uqD~C{-%t`XywCBJ`b%=Z%{jo>UzSlt`%0?T z+U5maztOmic?HL8-YX*O7|x`B6pC-6$}nUqq{x!%F}>vfr`vbEzc*rt2TvF*f84`d zUFc$Ka2%jezw)mvpkGN(K#6j*{S!(2#3w;ox!qJt<8tiU?42~_-__z+AUX4p`!QgV z$SspO)96tFZ#h4{JB;NBf~TUVf>!D3(Y>Lv zQfpIUMu+eENlhS1sFaM8H($&kmurM&||XL#9__T0713Zz8gWqdIGbiy>G_f=!;75ac7 zd%95>jfWD7B1-WL2OWz;kuw*xpNFEwSs5yPRf}5vh#Y<`KN{|u?zJQ%4<1)08WI^? zWo15>7yL3_29!tt5PP>OX4e=Qp6FgXor~00PnoHIYYKc1(uTU$SoHsGM%Nf6hTWBO z8A^MH1jW}l6eFQ5omKosr@!apfGoIAbbTO_1aF(lX6sx9Mzmp7)o#5B5haZcPom?D zLx3!k=Qbei%z+dIG_vlPtt)9ZpqUQ66Dx!B&4Fd?AvT3)sU;Cni-^P|genq~9N4|3 zW*gYtcU-%uG^ds2v;o(s=NbIp>@(+EJH;u{+5SMP+bHyh_MByc?fEh)O9)Z4Y-H$( z_wB6@n@=c_&RNy!r~MdU(BKs))*Y}O=G$ei!E}`UJZ<}gmbx3X*|1$M!-9v|*ZpV8 zysT=mjm?pI8%T; z2IQ@G6$OrNZE5BKjpZ?um(id}EI>LDV&0@#LqGVR-lOdk9PMaVIPb{N31Xk#^AVhs zlNgoj5IqFT+6G_uP&}ZfdK#;lkcnr=XttvT$D198Z3|>M?UDi~J{reMiY<*2=?HH* z&k~)2$`qbrsZlo%f8UgRw+>%T*+sty8cZ@ zLpr1~1+t|AkqO*znYixew-k~RWLUnD6m3C)4B0PHI{JO<>yUD`Sm-+FIe|E4Ln9g? zdC{ZYXx8TQ8E;B`U`)W6DJ+<|%S!qIhS+r%P<}MRqMwoB?~-K z>Gej+abb`|HyRg_zdFluy_DOaKfhIzjUS~Feo)anWNz#*OSQu3&bO7^ZxCR9oFL=^i#bbs?FV~Fz11XA?ry`|qw7+gEC`%LiDolC?dz^_Kylm^ zwBc`bS?M`o)gV*zk{+F>ItomzylPj!1WsLJS=3d8v>2;4vh2>voTt$vGT+k)El5D4G?|cE61qdDYY)X5?hh7 z?0ypTV$YiwbQ;sWM+q;5VwZ$*a$eDg--GKNM*nI1MYi7|F|QBi<5e=`2zX~A`sP!5 zP8&Z7Gn&H!xp0+bW{EN*jPO<)@iVmn-(5E2ahWR7kzDS21w6DAw^A&x!FTl6BK5D$&^NPTbnJ%&~(#tSy zh0dcI+JEVI=rhU6JwDfmRDI59i427^)#DXr8DxxCkY6>KZ8}*RI&}Ug<2UFYx9QLn zjQxZ@W2mWb#&)mLUy;|;8@U9-wVm5?%u%s#LtaN9r)xZL70Q! zlsFA_pEaB>A_L`c9TCx$*u&M=U@D8xeHRYss4F=Kbn&MGhj{@=l=OMJkto#k0_)u{ zV#27Dss*-Tr2K7N*d&jMiettLD-|x}76{*K96N)|`AQwOmAKT1Hkiulc+R>>x9oLP zBr~(x{u4gN7>E!Jb|xM}YZWFnM`P{Wl$I54&!9%8!&~(&u&B!5RB4k@B&4`*ao4ypA4hex_0Ac4B*}77%mXcfu&A6g+&pD z#lkrreVm8k?)qONTWpRoss*wfkAl*U z>q57ZPDB?}Z#Dfl|8f`?8p`(|$jmQPVS9ZCCaYAJv@ddRg~wOfdm@a}LgA8{|2h2V zF%qm|T3um*B6gZ!zNg#wj5tL9p0pnIvXQRz;$o^sNDd3&LaN!{Y4l-*^jdnQXuNaP zc0gh;VjVGbl>w{42)(n6;=T{-`5Oy%E>tPrLriO$yzwt8u5-Wm;_W>~#vsb+ZT4rW z6~&xYzGC6P1jlaVf_nbR6!esru9qRYBmM{VGIUBrKQk{Rt5$qbj^ORa5H!ZDb=8(< z9WkA)9S9c{uqrI$1+~zRHCjT`Q;iQJjV~ye03fOa z^9c&$URGZ;?ySVuhG*%fV7R5kZ_43WU@#sgFrQW8b=qi*Gs5p8RYzaq#u>DAra74_ z6f%2CV)hC}L}Dry3CRh`G{eZLRIJNTVV0bDdOB&kh|a{-B#z^v<%vf&7Pb6@CuRmP z7L8371vi6@?Q+R==csV&+lh zZq6!(%X-)4_`BN6jtGgDC%>==h&95u-T#*yiN62v>q?u4fu+&h$AM%7P(?viwC7!AAa@t~sBpSwRH^wT zN_)2i3xIlbYGWP~i`I5E3NPgthz>jYAEawK<^oFTJ@8wo44YK`XUJ=f3bm(TBW_R0 z(JAxy92*8eYn&;)y;bqKqO9s3-G%iVf(Kl+yk)b59(%h@G;N$HN=$i(y~gm`1;~n% zp+p(%hENQj4deo@{s_V}q(-B`3%<?ZnoQzP?%9rLMjZd}Z+b125>UAWoQoV+9YnX^^FBdNaMRygU5wed#e*N zBUN2Ot{!JvZG;|4Pq4`(fGJ>)kX_h7gzYSZ$>3&qC_aN4td!k7bel6)qAbJSACn%i z)g&KjDX&KTzawS<$<%qp0M;8if0~mvndAzv|6TQyCW_Rhnys zUC$!UHI17BiDU3I@GKAHxYJMDiyK#cI0t)D1BeGp7*&#tIr zR^QTNC48s1tuNiS<~6A5PfgB(iM_IKRAQx3AzsL^_UaD=**`SVDQtX2_#l#_*&&DR{USzHEjqWGi7cC z1qGYGYPe0x&uKUzo^YU*u4Y(Ul}#|Je&>3 zM=W`wZ*qXFbK}Kxi(lr%vrD)fvn>D*Lwm2-_LAZNL!j)+tB0}a?c!VxtgpJ{YW&}< zHda>kU)T7-%Q-mZMCyPFMaYa4uMkrj2G^QAgyJxO`=x1N49p}qFKq1%2K=76=yDd;4 z<7Ki|az-y{wcX-=lEM}|wNJ_TcHTv!(mYzwId`f?kUIg~S`Gy)aRQmBwSU>}V4~VC zX+QN%+Kd231-&U_FaQ7L5t!vn<(kCn{L3BvaC{9th4Z1awylN^=&o7Len~2Qn$>Ln zm7WHNy8NgqTZxTfG$_{EHOA0g$p)3LKusU|D;mk-zz*HnN2^}8Jm!)Gc2;yZcodG0 ze|rqo`*PVvQfI{WLT;N6jFC#QED|327`(9W!;FOD6)DV>A^&x6h97@6YZn}d!z*G7 z_i(|V7|_!;f__hI6PO%$r+dau+{q{Tv018L$P1Yms|2oC*xz~C;`gPxVkh(r;ZV2JamFvgU-?d*j{GXyU9EbaG}}TR@{(}X`{X?h z@6e8rnp#xW%dBN0+C%Br-C zZBx;&2^+C*gV&W}bwx3z;s9fU0Z8-1RNr+ih9CT%cgItqCfqoJy@IyUs?vXxOycwv zT`o;lS&P+{QPOfLS3)t^m&7+c6ETkD6`{0(Gfr_V#+HvZExg1*0rpsvZZK{0?e8i* zCMDD9(25KdGnAVb4{LN{+`TkLlnWI@_c*}N_Lrur2v{nGj4+rM=CRa2=_*DN`%O68 z6?5boX?YZzgz3E4oLyK?mPYbn)s|OG%TqSWbjN~Is$bWZ|D4wjp8#)DTOIb`;^l)D z4LMBQHI}Vi*#tH}$Atd3LaS{Q{ydWLHDfjkWs7sJ9m3kEupOh?L2;UhI;wgt1difS)c6Z&oR^ z^+Z`~&`?kWCh^|<3rmBBDQQ~=Nq)SXZ#*!2M*uzo!Y^`jnGa6*uQ_RmKA-*-?ufSB z7cbimzXfMtHVt;RqEu4YsA>y*{_g*bj19WZo3cEn@YFz7qZ;a9`R@#;6WzymtUh&4 zijDK|eu5eg$P+6m7FN%funQSi=Q5Vp8`v|3FqyN5<YeK+xU_fTLE@ z5`g)KPSVF1h_h*-tEd!oJy8^&K7`%-<_moUP<7gfq>NE~Ogo_w0Zq5evECS4 z_NGOY*FskrlN7NT3p_vZQ0>q#8{?RdYs5h&UYUaB2@s8qxwR&R3hPEHPMx!?@iy;M z8m35-)_L1}$r^>BRS{hYyOXPpVzVw^B<_X`vClFBS;JvrQ;b<6&}IvmqCkdY!JvI3mLBWKOeM;0wy4D`eA2e44I5-+jy}?kFKr{*agubY z@H&8XD3RNpRK5t$bK1$$otxALzF`L^bP?Kh8MROe>=e^R!aej&Kas)|YBt#B!l&^W z7ubNt>v|n*>tPsbF&j9ThOk*JhF_bDVw)MVG2U{f3nn?>+Ip%RY&A+Q@<%QA0=OiO z{3}T7D~e#HBKk~X5f%W)nXK$$Yjd>Q){UhfdBnuTzMt8%d< z#~;s#!Wje2R>0xlK*aG&@xqYZfgX30QW%9<^O6mc&x;C`k{<+Bv?Nk?*!;|Ub*u(1 z>I{--)hTkUpD90*DKgH0?Hs)Yw)khG^mLRSwn`nB`LyeE#KTK6*w(vJz9ns=2*TuW zhVzu0!IplepHope@`c9;M~-lLE3~~4eVLFq!%`$7b9wHy#xhFO6`SG8%5e~O)Ny+Z zWSyLQoFeS^&+&)Xa@!X0$ZYLDk=2yWO3qm9tm}N?8QrnBq9{>+-?`H8Ou;o74GZHL z=atVed!ivG<&X+{Jh)*2<{x^1!PlBDf()VE5<3PFp|*bd-!XT+6qaM7Uk&+2V~*B2 zUp&9WKJpmwdO6o?JA&bAU%Yk)Bl!f7$!%$vYK&xO{i)JjII?U)U8=8Zw9Vb=?{)|& zM71MrWtV2t*!M-Y`_b5Qr6D`}r;L#?vDpK(C<#2>7i{<2+R3196g_wure4-PKZ(|@ z0-YR*!V36I(+8VYY}4S128IQb;R8GBgu!~==ANZ_qeNbzzT>76A%r6ME*f7YHj$PQ zHl}E@D0(||>)y7*5yR9~AGRH3`z5sEiIWp3b;-zy0G4m(B&Xq(ru{B?9>i)1CKi-B zU7f7jufAdu>cwcYUhmUZNZe5Cz-=d`#l$R8g)T+7hw(cQk#j$-54*($-#* zf~YPogb4J`tn=L^$_SiIjK`hb@fGkc{T(m=sX-%e$;b*+8vx`7oWOt4NUhY1b;5CVXO?4RF`O*ChA!GDQ2qkNu^{ zco8hb4#4J5E;)4FDE$E3R?OEVca9@UWIE}Cj4nP)*SDNn?EZ)?zPOS5Kwt?{lu~_X ziNwe9SZW(!*p1&V*(=v(%3jU191|_hBBzw<$_eO#M5MrCSGLDuScC5nc1{kOL{eUd zvSIozh94BqD#XndV^8=zt4a_%3*gUS;i!-4KZoW{db!Th!wVvHhp$@;B<*eKB`mD* z5&s>Uw#KKRDxSW@k!xYX+lt-R)hm6H^BL;v+Z8W9vUin8725wyy69l;K}1IS91VQw za1Y`injQ~%zCaja#SS#v0;@mkxCj3T9!w=SLR+3JE_d3WA=BaAD+Y_&FpCqrPBC|~ z(L9d9*b(w9JlT6#te%M!^5j-J&_5udzZk<`L@Gq1e^iTIMqzn>$zPf^VqIkU*OC|X zf)XRJ4olN+s*ZbQJG zWV$(=G{|70l#DmBE1DxnqRQk>_w<_KfcSVgD2<46UX|P1l^84OqMsy4df}qDDwrIX znSU_Y1bUDt5!E+mT|Y7+J^8K(x`IuoRY)BU$pW^@x?H5H!};QxE@d=>`E=%AgdNx5 zUp$ujl3xURfFnD7aH1?F78Pkx!+}sHn*8evAB2*l227vgMualu<$i_+N}4eWj(jx; zRC4Huf^)qvPPG;;2Q%fdcOH6sSxEaoS9(##BB1R#@IRfBbF0Yk(CU9LYNLCNMcj$_OgD_ebnNJ-N8 zR5;w-oD(RFmb0Z?TQAuwq#numG`2tT+DGPtV__hVp+sU zcoNeWJqRA&o)9p%XF_yWx@aKZZivm0fZ^Kk4h+w#1+l;ek;67FsVkT0lc31fdPBh= z(y77tHTqRT{Z+%fG`1Lyhr(hWy)J*-nA%gvDV80lbsp<5v0;X*Y3wR)<1ke(h!^0S z2+4bpYV{mJc*PF8hrzFzr1xeA**YP97}G${DWgX_s~x_QGLP3<^(5gxW}W38GMA)Q z%eMTFLtCFG+~vsMIhqmrnAd{Y=U9 zz`{l>SS_89d9fcv3|8W0j?WxnSH~i*Y;mq*5|cjewxnH%9nQXewuDJCjI*=;^ig)x zbg#5D#(j>jwchA*@j1!pu8QY|8fDXL5=TGeOPruo!&E<3hl&5*(^!4GTGevkg zvBm92hZ=<{i0l`QU|i90wqJRXGe{az<(2ABmfPw=rbC}jSK`+H3HExHmxHgG+M<;DnBtKR>zBz+>!6$*Z0UL%Y`Dxj8j1)00_@kFT z#_A`|@iuNuS;MG3=_gfA6AtFFYrq|rVWiH0WW5Mq_EM_7CuP_0yJQJCb!;Sbx`{pp z+=6e6$5s48PWw!$i3>qMqX0EMwWLxeN%iz=!J%*~6*(0d@oj(KYVquarw404@Hgf< z@56gob0#yit6dwEt|_=pr1rbGkhI5S;}og52&+&j-$%Z^;^8hB7TA^qkr~R`B(%RDRsdg_kk~@%mjN8#@u5D^;s2-HMGCOZMN9Y@*LZnDT2`j5Gdm#l&Bf4(oW3Pv`q7WcAjfzy!^Wll|j6Z}lVup-GZZIO@ANp?*V zX}|FS{P_m=B-_X1i_~IzJ2TOKsc)|20=9oCbnPyUE$^R=~Tza0Pv zb1`a`^!7z7-C3C}A^9Ip+2BNPlgg#~oi^}fV;VNkJW%1gv~rY(XU4cg?jd1Z+73ao z*{T!SUJ{=|^AI*EcQBbElU?MtM>?m$`+iI@AG2&BOylimlKetdAEN%D7Ut&I(CBFW zL2jDm>)1#dJQ&m8PAO`kVMk)np0r=YOnmyOXtd}*8ID8OgMN|^4lEZY+e7fSrnm~r zoHRA}@Z()GMBIJ5W&oU5&>fWfq|~qodAJf+M}Lll`p@O31T~$#k~EE&f8%!!+1mALNG$tOi#j4Yx59J9|G)c<7dVg}DG~ zbkg{%&awB%G(Tr$LL6of`akVFUVRF(0!}g2pWBWhq5X%ru8v%ha}yNWIRjyOkW!ah zI)Tp)bXMr>6~$$IVagU!(PD2V;r1eLW|%oKFe#wB(@948z^A^L<~YOc4asuU4wPws z)$?8OUA+_5p)_yumLhWvD?{|P?rmyk#gtN)yFxhPqz8>;kuRfbUWiyak8+D*zL+cF z6Wa4nGZ-#W$+>fy-R49ko^<$M@xiY)V(HDAZ2Gx_cO#rq!bxn}FUL!OxU5hT{B&5w zU?q<;S}YzLmL+K}$-NWG^laS}eV|!C znFA@(#7i_x@w_jK;nOj=9)%IBiEEiC#YY_umeAi+`X2O$Y}%=!eF^`CkTK}M2E%bB zjqri)vif`QCY0%#9-kbTQid-yW{Hi+6Q@=}b;UprN zskA#$VtKmlYb^*%qr=rM`{KR*x+N6*f|;2Wy91G%rOIlSzKQX zek$AdjPv1Y?0l;s5d|LAq_`(_RI0`?5jGDsaxwu3cA^^95yS>+lPF0EA}SgGIm;!7v)Bhp?)kA{Y?d+t^%n4fXKT<6 z$8BkB5s^^CN?^>fzaI$;O+(DERyWLX0bM3vq#>uK9qN%4c!##FW_OM?iO>b4mzL`x z6?5X8Y+km5bN|FYLU=RBm(KP}E)bdK8SUj{Frj`vet7Dvt1osOAo-bS<-oeM=q;X; zXoitLXf0;VMo~u^E>7Vh(m?Rr>6nC#Pjr=!vKSRT;8IcDpfQ_J@SrR0&Hsr{ej{ta z3-0kG*>GU0LfyKl7SE_9iTgqBlK$e%A0jF=I2^N1LX?ZwjuZDV>NybKUZy zr-HizQWK$mVC2YRqGpodXfTpNMq9&x@NaS{}b7uS`+j~J$Gn3K%* zKv@Co)511i)fLzuYpBw)uh{}(CU85(BPJWEcQ2-D--aaB6@AZEH2uVu3R&y|;B1)Rpqa>MJ7dI$~Jn*w)+wvFd$@?^%Kg$X*!sZ1%wtnN-_iGt}87rcgkMySxkh$`L;Bn7u9k=$(yxF3dCKiicN2H87JLu z8BU{n5QY<`UY6^Jg2?*12{04;U~2UHQK3*nF8Ad|2;4YDQnlmKI+1cP#+1RbASy}3 z`kzMKFwBr_T_W;-V8ZLYdWb5=Q-=T^a(azIITyer>ShXYJg*6 z`g?fd#Fg>`7kOK2InS7bSxBoQJEbsEaW<|zLsksS1jA(vOe9M+Oj-S8ZCxxzY_T6& zFGxI6x@?p4jY+cCBuIm`GkM0gdn42Y(G)2&^uYJ6+eOAKrr>FZ);qeqx&B<@s#D11 zRv2hZ#~&a~iSE2J1{Zt;5!NX2_a@h=Az+qMZ#iSu97Z7;X1czQwn;1z@&HQ1Yy?s; zXRfQ$Up=8Ny0E769^G6moYjj_IrnWX>&6HCkpVBji&Br~>vBLr@Sh*J7t&Dbnyf2vl?hULo{YO&5glx+a(dHQX`XT!c?kEON*JZIWvMJME8f^9 zxMSK*3yQw%=Z*6Xzaq;}{%Ig<+&I>mf?Z$RDDYwS=p0%3DH?}75+!m;7aymu^wy~ zI-qmz+tvuvqv5_4nbTs;AWr~UMgaSe-vot0)}!eL40?DM&|ldd4r4|I35o^nt>2TwlBR5rPHuQhOL6ndXi_Tgpr;wUJdUL8X#JOpQ8Yao18TSWAZ!$y5KJ-NWk)>+fB35Z2F#Eu}l1JJ% z`K%evhth$X9}Ekv&fPgoZ5c>F&yl^bxRA8>NcmlkBbH>DY?D43^1**=QbrWJ z+497q`3N_{kAMhZmuCcH2#&wOGO15)5p%Yr?Mqy*lhMstS9;f+#~PX&ZS$xXIW<=3 zmw=o`ejtuvkEQl+xS#xCl#C3R29tcbUzOFhY&v^IyHbt_;)zr?LKq*=_80_U>P(@j zNtsepi4x}fajI@;tMpQWDBkb}ITOPw&`Ne!n#1FfAoP1*L4C0K ztCXtp2w4t*SltBF%G6gtMztEJ|>BDgYAi5QW~^0W8ZNAxpw-fI}FFgJ@k z7$h=Wb*k*rDW|mXz?c1mEQ)rf;L=U@b0oc@Iel|Ytm|8MlylnCE94i9IU)1$=b0ny z4%MHJ_HyjRhokd3?9Jr<;%H?QzZ9eS%E~|&t`A1ZZ$)~KDsg;ly3rH&cFC3v(_=D| zWbP`&3x{$mdohE_%IelEFL)o)zLK7*@{~JrS4Omrb9O{;bzP^+q^sJ+l?7yG02u(P z2>pk)0jIvSH9$X*9F;_61U27+g+@BCCLOEIW}A_R>m3DGBIuqnXFW{q3Vr=fo!(t% zi(uX4?Hs0@KThrxz|cPSY@xab%2;DU5oy|^lns|8TIb5R=_&(Jxwfj2-mWi0Bn5mq zSks-mJwx&z7dTAyFJ+V2atH>T7f2zv<}ej^UPt%Q7Yf_sU$K&0JvM`xtOLE$uHnQV zpZ<$M+@t61DI#38zLPWksbip{QrM&s4|5Tbr4=Pu;R;x&gy2U0ZDEK4!V3+7!=Zkp z&@d&TiCFvQ+1Y;D*6`+W@K|dv)u#D!?<=e>e>Q@qhqCzKS(bNULz1V6lHQ8quOk?U zYe$|#{~>B~ScPS}4${XRxL}s<@QlK4xrl6 zqVqN=eOy;y6Drqm2AN$nrr`g&-5@;3&|hkwZPkd)^L*G%B!7gVS;2nfsVlfY2ztFm zniY}{1O+&^!dqS06I_$b>Axd_o>#yNsbpYslvmr&T$n;%%$B8m&bw|q-p`#OV%M=r z<^*x+U+!6XlT7knN;D?bk^M4lWsby_)##jp&%pPA)K>?mmFDVj5~p(Ag7i2rORYbP zJg4R;kF^~PDm=xPK%52YweWWqkuL2xTfN4;aQEf34H8^UAjrhT!i`jnE%BX@$$DYp za3V&X^*|`GM^B05oZ1VmfNQN}{6cmIlR>^qFz?q;x1f5b^@K!;#@Cx_Phl4Pk( zaNLs=vpyNI@SXx~gvEI#+#O|FcRO+zcxK%@&;If{lSHNDm&tSxc{<;+O3vjdI`X;Q zA@*tqw1wIRRm=Hu7&VytBwV{iO(rZ6yCx-dNU(<$G6RKQHIOL9iVjm(@Wa}Z@fRPi zYSZ_$AJCxCuNGIbfZuk4YJbRiw40SsF`2~E9?W}oZbiz`{4?7wpgW2eg`6PW7ChQ7-1j4S! z7J+?4`d}@ci@c09^Iqoevh?lJH+v;*dvg_m`&^OW>U(N7Ozv*e!`(oxM;acAgm|U) zA41MqC4cd6Uzca5OKcd{yJ{RAt>gNInctG9tmX`Mg*nXYSQh`&bgde#tb;L>A+T$j ztEs7Ua%nNf0KJ?b^{DCm%xo`VnH2WO$iil((fJ?!GO+w!Yg{0At|hb>rs^fd*hH5T$Fo?CD-;H)EdJPczut`9G#<+G*^}*jV=W^rsAc5*%1mT3A?y<7peUEr%w| z!PQLTud;pAjg|Ek#pHnziQmbv#;N&R$RDm<-KXWab(>dH$y72W5SpZh@Gu;lQSf_b zA_6eux@q^BjbiRwpN729tVu`yjm+%F!U;Jqd454!QeWVlA@RLZt*S(z;6Hu#2nHR# zOo?q(&FHD-+h)gOxF(0#byQvKsiKedGej4Yh11A1A9!0&KJnq+L$I8Toal!E3uTi^ z;Ygfb zmYu=4f;#92KHNH)f204YW+hCdoNWyXe#|Z}8*6Cl5p5*j&lQ(N)4zh)rL2Km3FZE_ zrnSn%me}-!awZP8*u-&`bMXyuU16QU%Fft(Lu@sftRm;3>4>Nxonh+C-YkrlD$x)) z5nlIeA1xV88+_lyN!sI#2W4l3{j-w8C9t!uMNjrfaj7~S3$Ig6{;9AqLy7#m6ZJa! zpTW{YSy5b9Lc1(a`c#Z47VX@Cj&tX_or1KxY?C%3KIy83+_#b~k=y`tMwu}jLZn0- zZyw4blIi{j=8m)XlU(GE%ekgruw7=oW6N=YB$|zeXJDeHls5{`k2KlJ#9hMsVC7Ud zt_;CP;J2QzZ8{(ChBPhPI#uMK>Hb4&4x!Ja@J<9fGW|yp*%~5lDAj)el}a(@GwG(; zqxD1iahf%q3JIc5cO|V+W8zHM1i##!9l_qgJ-hWyu0EdAYcz?(7_Rzk&O$4!**EX8GfhFw`V%L{fZq zHNN#T2^7UaVfS?}xcnk10@I+^Wt_P3SNcMg*kVaH)2r9I^f~T4!MF~Gb$-i@0n)S} z>zwRlQ=%wz1X(DB!>E`?bVK#Ec|iz&O8cq6A2c^e=+y*dL?D<-i=7p8Rtg)DzC&!k zFAR_^d&}TPG}fAnuWQby*2PjXXH5QFDJfjcclhr#?QO7eV2ipn36a@G_;?};tjjBH zGdtEtry@jAUQbSQFs_fMA4U;w54c`pyKL4qX?LhP-d((f80C6Yo>jn;#dzB*mmmZ4 z=V8?A7RA=XH!6ApTR3Wj998BfF$g{L&vjv-{H_yM^{PV=z2IZo?ey{wTv4Rz==)#XWFja zq3=wn8r}ZCYTTDn?eO02Bb^)`kG_m~m=6P&!?pmh#FJ=+Y;5%W*hY>4ehK@{zk5>L zAnfc#?!QAS>Ks!OVzL*B-()GYS?IG&KcTSwvUs}owR(?RY@N~rZ{G1X#8r?XkP5uo z@UD`b#MKX)Jy}H7g#$m$dF0;=I3~l-Y+K3H{riFOh&@%PktSVZz!E?#;QUGm3PB8q zo{dzZ)vq4TjKmer;!-rXB5p$`N8%27Nd-em(n>KIxwCCPQ#oTF(yNv3b{PAv`LDj# zLNR=uqIT9`W(K*FY6^2_)`<^RigRaDCa(2CGM1wd-!%6$rxHRiCsIZ(u7F zxZP%HigOY-B9-K9z<`9(!Y3{&#b6kSPr>>Aipm~Kc1eZgSZeTR3jAw%6KSFBWcX2v z(926HJZDKJrRD>LRD~YMnzkuZ?vO(Q4gdXjQ+-25M=)gJv z`mz_NEVp3y$B(_VL*)*caIzcuZ78H;_!8Shj0x*jI47EEJgd$@U&@A#$C5QDR^-0H zYN|@wGZ&%W0`AgG7zoSWg+Lx%db)`uY+LC~GKb1;W`FIKyr_)(%txE&$DX9&TxnmX z(m1hg2vci$k*MDX$7X2%9*Z|0`^|&$oo`h?-@W$#r9!i#|D9&|N0!hfb9omvIvH`V zZLoVbp<@D*t~W6@a*o8BLRVO2k{uVCUW!lvNCo~}!E2GEOcHJ#%e3)KBfl$jR)TNa zK5O3)64V>@0tTKaDcg{cWLKz$llgwPo-%c@^R(%d(}mb4Y4bHgl~n(eStMc_w9kDd z_n<6Uaustly#$QTGT6#-1D-a5enZ*K*WIjMu|QA@%7R}V-IxFYK@O$i_?WYrffFGNNettPw)fxEFp$O_={Ncj@m zUG`uWfcmyulp-pE+9V*L*EXkLHTuq+NhTx%+ z37As%70ul*f=h`oCJ8by@R;z2a0_JpxE;&fr-UFi!onEIE>a;ZJc7_jzE74*R!(}T z+B{|B3-WE_;9bG`T!QCJjo#Beb~xU$U+iBNbklvtmU&?BZli4k)3~gY5cRSfkPPhF zgzLCzxk{l%4-O?BF|d(r=p2Zi1y3vRdXxv)5>=m~7PdngdXc8gPC2Kt6m=0=M`UF? z&Xc(lB-b-%ux6)*-K(7v1VLt$)79%|a3AU(yLWGJiRdaNEuqotGk0$tyFdb)51cCv zNDoedi#GjESgc2%cJ z&^O5a@DPJ;1W7nN?c1h@qcfQ)+V@IiyO5-|Mk^$4`qV)urLaGkn*v~XUrk*#i`9+v zK!1}h9^pF6urBn79QAc+Dt4G5O$A#yE~PAcmxzyt)6$ID`kvYC>WQztZ)4)5jUF}d z-qOM7y&12-Ebs9OL$?7+l<)WF#w+H{7J>OFGNiCsAo!2{vFO6+$jr(H$D- zkc~FK7P)^E7wYuKJQao)lx;`bUVx&`_90Fc7L4F1^K8T%)CIn{{Z5={Zbj5F= z?Ma{uLB_h0M(k!K$pe{6;iCndJ5rX9#)rI5NdGw7(slkcRl&IGBgnEz;?iQu_&b{6 z(_`98q)E^mTqVjCG;iMTYk9wK%MV~Y>dM!mB=nQM$-jCfZpD2pRS#Ik-Yq~drgb_O zPc|G;24V~w#)M6R0FBu0|0Y1A?2ip_l6I((sxxpjD&MoS@5PgRXZkf!=a-qa*saAa z=G$JhJ%W)umR-?nG3;tMEPwhwMj^39|Gsj69C`qk<&_FC>N_^r6N(U&pD-CKtH`dd zXb!;(NV_W}gPj{n!dD0S?!Eb=P7pgmFng;CmL zcI~<(;eni+72_Ntxx%iz{-L|O;dzAX+uT@@bH(~iYJJ?r?zzACrrh_no)q!;c`nyp z>yQ4(#jjGr<}i9qyZeLVIT8GATNipurtK?B2s5mE-+!{I6vxLQ5&l{5Iu_pX-;<$` zyu?1`A4ujik>!FKsugfSru7ZM?Q2~qk!ft%+1e1gNG^P=^#9tEAmpmy&Y;Ihh*b*@ z^T~=twlZ%J4iD@v<(J_&FqQ0|mfuxuTzN2j;!kvbkTrNbUoKrO=jA3U8)w1-{Li#fo6PG+Hcgfun-Y5DkwpRAM&p!5=ajv+u zij0!CUJ|K>BKh{jhs;;=2e8t5r7vky+G^c*P#7Njo1}{E=D3Ch6VdivUr4CD%CbkW z)Tc=vk)MNLYA}rjY=AbO0l4Uk_-cr{6jjTr=y22h?pYO<8VMpp+{zJ##aO4r8UMf? zHtA!reV(%`^pr>U((AJRq)RQ-3S@!~|L@&K*cj)EAb%Eg_H+(}Z$diHkRJ-T!?Co5 zgONcO*Yi(oQ;jnu!|m5deo%{3yIg6+s&zm9VseKl^MELQ{8VWiB7Nu8N&b18kBGAU zM6!43h93IV){jKl4#vW3{^%qrKCpz!O0I|`6SY&Mw3mW`(riiBbOw>H>6KZs{D0BtEQ>^vCfKGXDcxXnq}?E{Y=GUL zFlFZD;VQTNki_lEV|3cyZPinn%}`(^N5M3$6uMxn%H&&p6DM=$c&1AAySbBvZa$<1 z3@>wAgu^M>bYZsQQrJ_gmCS=&}!aK+m`F>e;bS0V7L z0WWo17|A^ZF+T8LJKo>5YMTo8`>P%JCkt1zynT+X0T=mJ4eSpxY$V!OL*afkh|TOk zl3=ixqfl=G*MDgGFKV!c)9xyE7qH#*tKl;rT3*UH^M67DIEg;pxI1L|RMEZ1-dcv{ zN{Qq+{X|1uJ!vY;TOhKzID;8Kx{ebb3`A#9Nh$jD`ZE>e{Ae;lm+xjk?IQ0snP)MM zG;JUC!z;ly?V|t}IB0b9!pH;#ujIt*~!rRf|`9zTW-N)K>|`i=?PYqidaXU$ihh&^$oQ zKkd9Oxna2E3u}kL#lh%Z)!d+6HO8~rL&H1!bS{I{aph*4%K3^NbMXZCI0}?j9LpU2;c%S%aM9vwJBuOUTJDAk}=Tsu(59hbQ~ZMlAEaq$=kZpb_PvB!nq zHSQ(a+Zq#l9_PlDpNqSGf;N*GWsZ-=3%4Ca8oTS;?iT_ z{b;`lr8N`k%R9S5e7L5tD~=e&^=P&%bMt5g)g49GzTluZoX7u&_+Ar&2y=ow&AvheE$di5Qt zZiI7*x4-OP_&T;dl|EDOcZ4(_eg=DkU*#w{vQVV044_R{4O=fbUgT}zZYr#qUi!f` z>qVaUoLVkF2gU+?i|HCqUZ!@ckmoPV@k7Gr00GED8@B@{>3! zPR~`Mhog+HUqx;N!^%aU50uu|WK-XB3J`cryBDW3c~ ztj;;4j|xr{VaeAd*oF9OZ-gVB1v-8-yf6^&Qj!quT+IJ$Y|uU(lrHPSB*H)XbJy+M zs4--@&)L2Fw`{HTPu6UgphoLVfcaf-A>M}_0%1}ZhVNMoD=BRy4DBN6bdR~ zfXp@vn*ia{BC)O{eZJV7v_nt%Y2>WJ=E9RC`D{$vAqX0-#7q|?2ZjPRVY#kj4u~`v zUN4|KZ;&B!*o9&8;nDM<$S3&|hIR4Bj}5ku#R`M(M{`?1tL$d#CpQ%aTeDbnAAjQq z#|)NeFZe(sp6r6p{cN*rUAd#(4dOV-TZV>!(snp`4yA=gCu?nA8@ey~Uo&6Vu^qj# zW$>*pTsXq^)b@-q`TNuDij2w0-ULR@634}zYt=LTExo(;F>P+ulN7(8-`!u5d4+}w zBaD^1nsA`8Jqc|P?)urx+G~FByg%GfHlH~>S1?8BEhdFu^m-iq|E?pBIC3>ryCRat zK^rk{%BV3l?9sbngn%5;5FK*YHS7&2x}g0fQPqdKa|G#>loCJa%;OG?QgSAgAsx&i3)h0W)Ar?kJbX2}pg)FU!g{D0(z!Wr|ho=qhd+1UtVERG3t zZQKUU4)2`l=GRiZZsdgWF@^(?%4OVxL+pF*&*vGvC2n>}yXDpcZT|~*wq)PyvO~|^ zRSH?MjKyTdB7D}n$;qHv*Esi5VR{n6a`U#6kCoh%t>~#Zg`;V0kb8kyByWD$X+w^T z6AWN2Abrx=pK&{k(LU-6L2|=7>R4>vJjk!1z6`@Vg)ZU9T5P$Xe>?eeDg0Fe4Y{g2 zPgAm|_nnU9u2NcBP-dG&%#E;r zgyD1n$~>0)$SRpSNu}vlSGci@p6_Fs%a8!2qt1MytE)Ho^u>X%bEAJ9{aXh~6t?8! z;?Z}Qw8mKpeLfHuI^q5Cr0Y#(R=vx0)>}QS#D$uB@L`JK{kvjaImt<-j+?2rf*NOu zvpfpb>1C+!YHD&q)ot#P!q0{|kSJlC;)gH6@skLvZ5xDnh%3!S6K$(Y!!boWB5^ts zK^^|3>G-+7px


    ?`|kX_$^ML5k@aKQ_}d(u{xjbj<9iA?^2fY_+&E!2b*G$f3^d z6(p;;KGL&KAzvU}9=h8acfe5r|GqtTz6;H=fsfufAG`zUhq9LWwpPP< zYJQT5n8!FDLRI9cY8{rD_z#yjY5EOuO(SjV{oQXqi49sys21epB1MH{jpNiO$tj|Y zKk=dZU6TG4+xDIRM0|>9q&&qafqvn#CLu*u-81X+oI!AgpnBY#=;hMDU#t0vI%Ws&_61CP?#P)8m0#@nma+Y9~}XnuO1ZsXkr5E9cgO=K~v9Y2FAizqgk z68tlsKYgVa$6n?-l^CbpIhEQtx)wTSL7zBAXC6hhFJkC4DH~44h2gMv@)pf|?7Bz( zjj_kMuX3I8TTUi6^RuoPmk+(C!jajYFXnyASYegtm+x-jFYEEEb4$O)ZrJYwljnF% zPlb1~X=3%UqSo`GQ1j-MSZSd$eh0r@7Na%bOXY#5pqA%+mGdswE|-MTnW+9~8LpmC zesPquRo6CH_nLwDdQ>i_(7=!R;nm3wcAMe~!J3@5zRM zmKc7%0&jlC?wGv+)>7%izQT6~ z+SyD0+IEn&ft;tAqR@kq{Iwj{nW!Swy+#_p|&dpgO}!ylvWltLU9BH zeS{SGSB1`nY(2aj!yaPH+Fmj`D(nv*O#JqoMudD@3khHBAyvy@7=xG9bkZAXJ8jt z*aa3?4hp*9B8z~6qM~_NVS!ana#Bc5H1d##Jm4`kEGslCD@`*~DlIKDEi20`EGsQF zD=Yh!J=f^>_j^6h>-GGz722{pbI*NWhtKu?cqj0g3%Vn4!gTa*Iqd0?KgkXEs~K23 zOeiv)9xMLjjYN*bHBWiximQkjc&&@y`2ZTq&|nS5k>?Q+&Go;Hl#FInukrLVr4s@U zln0RZyRN{qF8i%uXP6P32Mbi@GnOE>XZLIFKu1uZxXHeZfzzaRxz#lUZw^M9I45om~d^9B#{&f6IbS#9QUoPGy-PEDJs=gScaPbRQqG1V0{WHF!>>ZQ-t_!2H72VMW#vLMraQ2J9-IY3mcTA;LykDdLm z6wP>fIpKPGnD{OFR&Dfot(=YlR~ze73Gsh(i#6W)_CVE|P)HRVS?Ymj%ol}*hlF#C zw7CelFE}nx z2d<3cPSkVhAHm+yxmHqz<_!dH&tt~_X(UpAsW784W~c(9Lto)H!o`W)v+<~xw#3@e zdK!0kAZS(tiU>>Ypqo+@7ocjD9e;<4!~Pup)BT)$jb>9YJ<_2-=O*j(dS0&eSl~?o+WL9 z%PJiVMiZw=H96jVJV)jIX4jACX9@M~7vDom+`uZf;h7dZ*D8Aj4qZC17WIZb=3 z_h$b?oUaxhT(_*Fck@V&)(KJ?3|B7*@ z`>{BfSCKHpD20`iB;Z=+0y?0PdY&v6H!?s3(WHnE5?(PKm=07m3kdvHW6l5aH}09= z*is7NIyV6SUj|Nt*GM&h)2pc{!+jqUm{Qm<6g;!?7**k3{%jrPP2^g*aA|#VjtoO{zf+Y+!Y(QE^&_q&Ypm@5o@0A`cD_aiUOJrtai9^@O8bWR=+<# zwDrDgk!D+H75MPLHwhQq@5U4xO$0#ibTRoZiAW9ULtfP ztW-cJEdN4b{GB|u`B`_1nB?sag=Y%pP`%=K&@n|Tl)%jnQu>B;1I8E(gTy$`mk?Z#CzT!ru)yU2$Nc^&I%HqBd}qS4S2}K23YJZ;Dz%arLV*O z3)#KY1a}6=sP&y)uIpjPOz;@occ<~aOG2YJ>_-ph4U|0~#DAf-;(7uyjNEq=u1+!p z;K>IgU|rqw)}hK{;K{9qs|)T!-r0%p;K95DfT_WyD1McH2=z*YOwR(!P8(H9c&C_R z?~%<6+t5 zob{|Be`R4gce-xTfQ*Ts9RU+=@VWf;=B-d;H4TOkE#8eLplK)GGbs_*lhX~=;5*ad z+k6gac`bkdfax3oE<|BGu$^!vKI#e^{}bldwdZM@bs(4$mc^r<||tv z*q;mBzgmCJS3&s2f0Ir3j9=hy%D_{17ufXFdTY5@x}?n#09trwM!}y-8g{M|4=K`I z|6^DMVAuSnBY=*np-y-f?VJw_c5{}ej_?oc4{e1t1!K>y978i)f3Q|biy{)!- z81}qcdU`6HNUnY2D1h(+K;$b;?=BS-a@Sm?VTTuvGlg&`s{z;Rmr3UL-Kc#1Ilg~Q z@OZa^oZQ!9{*q|7(kf7^2BCe7&JX?zM&o&RTsZ zWdnUC;9G#iMYns~G+SisMg#URp29wt`$58YeLsxn1E9&Y@0Q!KcL_YJ{YS~m5kNw` z4_68Te0XC)Dsb!_r3t_VKJ}84@C=OXevyT>){ZXF5n$b34hL7OxFajo{3i(cvh4(( zOv_?3?*^j7*F&_B6GIc>-~vju^cf?MhC@R)5e=igqX-)VK9TL>7aEP2pIBAj1X~eE z93a0VALn~$v{kM1fg?|~t4p)UJRM4{@Jk1J%wIuX%Pg=w$lQY@de4cUva)m7@s+%V zpC0tO{&qDX= zzb_y@DY&F0Qu0o-r>-j10?& zaG(HDw7RLKwfjSoi@P5L!TAGDF4aJuHMw5^k6%Z=dh=ZJdAC;TMm<@+cCjD7&bSZt zw#w{|0u7bD`RkLn`W6G&4jc&85%mxh$Swul7X}B#t6^t*UiDrlqm;hH{S!(SRc6T; zRrG@lrrHDFvXOL8c~DmaK%PWunR^)ioXPIjQhsoF0O_m!2DLA*y_JtvU%e5w#~x0B zwrmRvJieD8Yi&gV8gd4=UL%3uuTH8%L{<58mIn3F-R%n3c3i0?rf{KJLK36@Un40o zFWai6WeUq*L~EZO88u9fD;bs2G;FunM!OUP6VM?Vr>Pxdl1V*u@+3kJ%jAN}6r%NPzq{CVIBdS0AU@5oAUsQS zo7Qqe1&(>+$@d}}WP`wFXvOV>7K2|+G=gj4 zN4m%r?rSuhxa7_lP!`L!Mle#?cNTxE0b&SKt(gr$2zd0E6Zal>>4A9Frt$ZTGeE!q z3cS-_!SD`X&z{y$)ynqPK^3s@>X|7-i(?`dZm3Q+07v6t42T4oe5#Sp(N-u?_<1py zr~z#X;3PqGJL$_nd{%7*lOub|=fDqd9K51yh3ITD*!7T}Og-tmOM*cBYIHNgm>O@?#1ZG?aD zR1WTm0D`HvQMB{z8sk5RXV7Fde3XHH@yqtfeOB95$LFN$eK@Z=(KZ^rqDM~{;7n?` z10D_88&qX)>RW-Ez_GH6)|G-72b_SlwQxyWLG_1H*!ygJi|%{~xk=Xq+i6SBgMcw_ zb#4fBeNXr;McRgl(Eoby70shTMOV~7D>ED@8G3~$s_0yUVpm$;sQ~eT6lKXjpf1^= z$SorX|J6D`_WMO1guL*zYfyVI49N7xlhX`f3<<7F#u_5AM*vN>YoXc9%2~jGj2J8X zjLZt10a!qYJ1TE?heEXD2vd@euvOrw=e+}%UG8-~U=DppsRE+j{~bCU427~2=;{mP zjEZ;rNAQ)pUXUsHYcOkcT~PX9K$s?-Daqt&qswU-${s5 z(GLdx2UT_grc*K;CnhLRhidO1@*xK?IC$ofFLOh6WcR*#U85C|9xP+ z>o&*FOD);cTYjL^^m`h zH1e%_xWQKsAdkE&8K;n=XxP@7oy$^S8iTu_$?;%56fM)3VCU;J$*yzE%)W=<;`R+i z37R;6hZk&Ufanfpz>7g=PIg#V8xB26R5^BqmhCH}El2fqN@@y-dQUYe*+M^%!d9_( zEnl>gTCP>tzg4ghBsX}mxLSV1G0a}0|xN|KY;<8PIz*>tv#151VdH>ht3!;LDKNr*-)ab=zx-L zXzFmoEDzqPSGKl>eYg3=?w{af+mm}#TY5qPXOLx)%6fw?)hY%W#~TzR|3R1ntZ5Qy z>Xj+a!$rzYrtL=+%fZt19F1p07MPUSt3rRMy#F?SE02G;YDA~`B-b6njfrrUDV=`@ z<=pO_3EsA3xa9|R`#y~pK21UYw zS>hN2_^v{2wp+S$07gOgX-cj;%h}^!@l%A{G05>FLUS23Uu7`KywpatfYHx`b<+uD zI^lP)7B71X_*$Wm!Gj@YJr~8nLb&f;GXu>GBRaP=)8Og{l?%LA&Hu^~bBf+2_AS8G zs)C)N0(?s_)P%D%j&dWId4iO^w$8gq^TuF4(3iTysh5CX*U}Rw?g52eI}F71ZxNR` z*Xo$(ChZA?fGcY?qO|yXl}Ml(L5}jlcmqWlQA!BeAl=r<dD@^7&d0gpn%r5fci2QnDRs_d(FYW+U$q zWmO&O4MDY<{(gK3ELf$>+71}nzMe|2Oh^oGKurp-ud)-#2T`Rdm(9H<*N*!dKQJ4Tx6%(z4U>=eF8R?HC4ow5$RJ zj8`RRzY}=!d6Mj)@ZKvu-9HGtX!aY=iy&IHF%tLt;H zvf9c3GiO~a%%Gimk|#zYfd+fNk$0--Y*YS)qeQtQm8PDg99^G*rdT?!N!b#S2xSp@ zSOmYP=RQ`qd=~@+lSbr-WZS?50WSo2R-@MlFDc)!z)Y$|w1g^nxS8>na39}2#Wu## z7-U-w_E1ntahbTta9tw=eQkJ>1y@Bt|5s~po%hB5^NzHDA*xWJ8U1LHtJz;!h-T>q zCwp-DtdQ!TUFcd#_#CrX?i23#B{?Mjl(q(H4>7kw;NC1%L7cHl=X%(Fo5BEK-l9h_ zY$#a6!fbJsFoZTgN2cg%ye*&`S|^a7K#|Mk>gM% zkFa4&Xdszd@IF)ese(u?eVQV&PJmq-p>2{d&t3Xe7rK;z(E6ETJ?=cCxVu2BN9JoRT z!gfawS>$kd_?q2kWHU0?X4ns05K5s&Bl!d>Wcv>4pwQXmM~9^DMM@~}V4}LO9g>jC ziTDh5gWf>;53K_VYg09%IKI=Il287GvaR>%pQb3{tencA55wIXhobj#r~@TiqTbKoAU#B_*xw<5~Tg<-{(GWB+Klds`uZreQl;l zv+?8c6O89_Xz6y8(v-)4YG!8g7e#TQBhX5e;}hT%sXz~??SfWNXrUi@H?V62d*xRU zEVKyiYHpf_>?=7*?U0xx{wbP>r$R`Jy)Oumz$8x3C$kGkB@yrWK|d8OrNN>RtZC3H zEe@Bu4`|xuz6O{9Y(v$@sf#`{BR9?(#|lA$&>k^Y}AA#2Jx|YsrZzo#Lc`FB;+#`u-L=1OT zBPZrH_!bK~HSU2VY8^j1uB5|y+(@LO2vhmHDmDemzj==-#;@1k4KQT~n1sVR^kO)7 zF?8xt76OG^8{uKFPYTNI)o}sf`G!JZd`7sF1Y1iME3MGu8HWAYo>)_NlCV93TcmdchQKNGhzYOeY?3*QC?O|-kl}nd(dvAVbe(|Wf%j454J&yU z$2h`X6~0&TwJ7I#?x}D`mXhD&7%YO-dNR_D0f9~C`an5xL@h$rll9VjG zwtEi0j6r*hPz(Yeh*y$&66D9{(ntE-Y6bZ=*-7N{<8%NRzU?Ua1QL{Y^m%S#unS*N zMLWW9~IvhY2&d!}G2K0O_ z{A@rCv2-JBgcfW*RAKMS=C>HcWV{iBks74?a0)*uie22pTF~1w`_Q1#4Anza!iJ83 z&=rcZn!~Pz-WA*jjPDKfdJNQe+VK*0_Ltlv3^N=00MJa!*tIR49Y`m9-A*(|8`^Xq zE-b~x0?usUQOv*QQ^LzJRSuHhV&-VB& zNSj@-FikWI>q0H@sV6Uq0q9I5CODWFS?o`yoZ={a2}li%UIHbl#btCHFa!V5vd~bA zKl`DhDG1jaW&XrZYGM|4Tl#ZhzXA?;ss+MZqvKEzd^L%`@HF{wf19s9&lCVSEu}Iw zv*4T-g+v?DfC`zJ;g9<~Cfi}v;7OW>|Cr6(_E7s>EzEvyGdaqL?f}#r4sJ=3BID3x z7C`xJp2J0vgtF3yvyFy)Xq=ehc)f;*@4w*@SlK|HJ7HDP&B*jw>EoS~Gy{hkX!C;e4r*t7D1TVzdI-#r-a=im=&~vMkdAU4`W49h=qwz7 zuy)I#zuSm8xse)n1s>Q{I#_lsLqcV|dkgFvX0>+;`PS74rpJ*GsHP zQ|4`^4NNC8E)NM@liD8wdBBf?nb*1Di!`B6fjb8)xL?&ZG*IJ_t~318R_?_i=C=lj zFGcP(hiE-6D7_}f{!lT3g&I~>L7bX<)8^_gXwmS8S*+9`aE83Yq7`bo9XzGx8{_{_ z)>rdz9=En}+7v_$b2SK46Ad!Wx~-0~>zd^R3e5|rfz{7#w-A1B0!Z7|^T3Q1V%#*O zK`@W+<6mL8kD~f+!CJSQioJv)9@aVFYkfP9}_3fbz^Vw#{xD z<87~}D&qjw4=un>kXXm#XBg@69HM&mTj)JTtg=#?`1RCq`(?`hg3|R>{}u1eU6+@2 z0$T>g>c^$>HUl-8zsp8I1rZ9qjkTx4P>R8Ag+Fhs#{a~^$NVGo6WIF%V(2!#~ zIwCYPoYOVtp3dC`o z&&^`@y$8d5I*vOYYTrnZr+}a1^S+8SSwt08XAWg&%J*^4Fz@)D_R=(s9h(i!=O0g=bqBRyeYac%(supy(l+$Ln^IKHraon&l|6veSH$rqR+xZ>&(YZhBLId-t(p81iQVe6fE%kn{=oh*9 zr|i2UQAngTi_!NE-UOli4XI+XY~EEG16Iw}63~mZw{ag2&+B9W7BhvBAA*#DYFYD^ z7y+7Zh+2GSW%nZdquLb#mD@E)P9=f;;zKu$+(MYiM|1MwSr-3>Oo~i$yr@+I znC(I++6vnuXyS!RWZR$wBe&-wWKG##Xle=1n_V8VSZ-+BASVFVUpy3gBlYc7)N?40 zP6Hi6W844u(Y6XdYf)q_w=tY~)3q)80qyB^mXSI##%n%aO8EWnLL&nF2yaAzgtmi`um#R9GM@yWI3YdFygz5(q1?PX3IH~}ZjDRJ0O3If9EWKcMbO(`sbw>r zX^GquTGIJ>H%pA;zGdWquUr~spx!FGg-2y{J-`eY5U?Z0+tA`%vVt53#>=k4sfYDG z%l;ten-s`~VW@RPFnTtf|G>^)Er2Zzjf&{~3e^^RUtM+?MhF(OLVA<~%&=wCI__qI zq=nu>1MB>U^nAeE)o3ZpLZPn>e+N`R5McOGsuRqc%6~K1&jZ1s0ZmcCZ5k13Sxdu8 z^GzeF`~fE?;w@1S&p8axNYjh*Oy9psuL;`!5RZmGaRuiS?RjA#SG1TZG6ZSGQZ zNRI|GiCR7-ETX*;3jJOvg=}{Ae|cpUzbl0|LRoJ#6ysxEYsKgGPsC0&ekh;(h5wV) zLB(sP@9K93Xo)~&5B(lWiKplBOG1VB7}pZH?sIJi*DMeIb55T ze@5%wfo!x{bVoRL%Dt)A85vvF+JG||WU;Qya6RPMfd^XbUq>A|1I*+G4YHb@djL}l zpAeNrcN>9$T&hK5qTqc2?00UckgOt_)9+GeAYm!U2G||9BhmE}S-ot8v`&kD&!I-+ zU*ZeirVO$-ZfY_g0t}ptB5Ow9!H9GjHJzH4%1&W8cuVkAJFrXvQg8M1@GvMzd2`W5*2%Km^EZ?u~)rhYdRD5qfLM5nda5%0L0!q6SJ1=)7^@J^dkjq`?xAOZmA! zu$gc9Bv6`%tlfHk43DiWo~+AzFc3d$5Texmr{a0EL64?txYeBgP38~oA(s0(rt>1v z%DW-kjzlY1C@rBLvsh2&0x1n7=^KmDIV)G8%iBaNQ&ReR&^nq(F8WZhYrE2!iE~F^ z-izqcrZ)6GMt@n^{CcmSe}{FPF@QOtV$7m*3Uq^kDmFSEtuH64!pa?a!BT%D+Mwok zbIbPUenQ#b2okek3bLI$XPXiV33Ew^yBym?aGPqc5ltI~S+_5NbmN&uzE(}@taD7Z z(^r1Q6GG!(w$c_DtH1_i6Ko;e1sbUs>D`gk1nxwr?N@F;=AVwiPh+x6nh!mM!NWqj z(Y3VFem++h0p5S`%t^@ebDWuj2se_!H{q zt!UwBZy3Kj5C29}dE6?7dJS553;2fIyvquR^Z5$~T!KoUkuZ$J?4xxlPB={P_Xf0; zE;>q$KP&;s{EfWyN%rGJ*ZX;(m|wGO*CO;)hJ8^PUZ*zyoY$yC*Nl!zh37!-Cer>5 z!=2VxL{<8h4>`znUkV6kR**wc@To{Che+oTj{N zEFhzOdE_kX$xzM^3aXc}SDw7b-QY~>??Uox`~)&43Sse%rxn!i{L2Z-{5mubh6gO4 zNMJabw}MZ=0KWt)H{s@#Qfz5QT4k}YD3ltC}6a36)NOURKkCcH$(vB z**jwfOnj9mGH*c-aG4QJidr@Y;y7FkYBKcvP<*{i=L1z0R3S=1r44Qjw}DgJ!sV$^ zhHCE%$QFzrBnK-am<|+b0`yR8E6kSTPlIj6&TyS{NsSITq^}@% zj&z?eFF=z-)Su*SlP-oi#|D_k*cl2Pi;#P@BoO-2%PlDu{|ItE6b7#D;y>iv!QKOw zJ(|nrbRj#MC}!%Iz2b1LAX+9pH61~?1T|iUpRiB z;X09d6#sh&Ky)F<&zooAo?|^C>JrfUXlvnUAj=O1qZhTV?@n4+D03&`2P42Q`Rs4f z{0Qe$#g3H$_f48h3aByQfs0yLSv7<%X;4Kt`gANYlW%q0_h_7CIsM6+C-#<6!+`?x zgPohJ23KKVns}dsGvPlj7)?yK=c`MhuL$``xaiW zu{=)4KY@X+9XHP8FDR&|=iFMCy^Yu&Q z3Tb~@_Ak`(eF~$)H=$>_vauBxz&P&Y4^}Ec{n6;d*M=7Dhtgk+4mQdTKiY`tPM??S zVDXb9^dB*ga?1_Y#m>#2kiYR$rS4xF4t2ih1`~0>v|3`_Il3p4;3BVR9;4ma!!-&SF{bJ#;2EpOHSB|+wY471*e0I zuaI%V2gA_SFjpfw8Pol|_&xY3LI#7wpiN(S5|ziZ4KwO})W5RdTDzxjpZM73qn4LV zWSMl1_M{4i1UR=6%h03YOfDWZ(z76UKLL4f4a~bj)IpA6`lxj7&L|M}wY0bPsmMpr zl!Srxc=%ALgX9_6X3z$qKZ`AO>Cixcv#lbyZ=US=+Tpiu$Ofwk5X5qyi^u_Hc`|OP z(|Uf$Y=;hdx87FEM;fMC*9t`m*D-@X_L$p$5XR9p zw-qQZ%d(K~$tg;rm3f^r{toJ^g{W?37Q(|fA6xWCkoXGj#Du^9LDW)-CWUi94lkR7 zzfFa394g$Uc`?rYK>`~#c#QWHIa-FG*x+5XWlk7=Dj3uyNN0pB+!dO)P1{-P9%*?} zP|NKWFR?Xs=eGOXM=JMtWs?Rt#?_l6O{ zEfQFdqonUcy`L(JnpTC=HRBcD^C-v3&1cyTe@h$sF8+}c4aylhuojz)+%m0Yvg!H> z@ch7DjsUEC6n;f3j;fruCJ~j`WU6azD2Ui(^+i)lqO_euznG9Rmb{U59*2Z;N3^K7 z9DV6T-NjHYuf|?A7+OHP9XD4(=1k?GiIdUzsYoYKJ=X_ak(S+gEHp@~_aBsws<;B( z-f8fZ0>2FnusY~eHnbsg0&g6GKD1g2b+FyGqYN(|LW?@%Z)jmKekAG2S^PFF>{64@ zi6&u)uA;SkzUs{rRcLUsT-m5)$eFAgI%~KdJZ%V=ds(o>fTnQHRZPt?rUYg0P$5vG zPpIN926u0d+>SOfMcaw^9{(czE+ZZTwd{Q1Z|3|2?spaPfVi)Xds21fb52#sr>KNS zwGC&WN903J3F4_cU*ZZ7x!7y9h>LNb@4jGP7amqv1shm?s9!4jVg<22#)J2%CoAaJz8?QrqYLNf#2e}pW z;`Ci*G}sagmDNNAKJN7{B@f%v+2uExiW_jG*=hb}jjP|jhvKS=fLn!4oMot5x>U`* z7hT!|Ph$FBa)+hRAiV$~h+tsIInW{kdiORRH%9I8&-74an#)XOq9B+F;#P@hlnLex zI?+gQZ4L7duAGOS$-osVFwC-i5YCU(3IQ0+&BGr?p^q8#v3|-p`-vcGk9~1r_8k4b zOy^9-+T+6MBOONfKU2{6cCd5=$FcH_N;HKf^T*cxO5jb-+Kkq;{z*hBkP__fCGCSI!m8m6cdIOKhK`?=zLp8VbHM?!6{! z1MnE?cUb19~3c`H5&@1kvVsoO{y;ipYJe zMU(FM3akZV`Q9jEEHxGdjUoF%ECQXfmPCMvAysH~E0lGhR5WD7g}UyW1|!gWls^b{4>?D&A0!d8X%HLXA>0C7SswNWc)%>Gc8^C1 z)qqP0GBGRSr^HtPupB-h_bZ6^TF{hWh?!th=ANI1CgyRMu=plXld{P5yo*98)=}sI zhu%Q6%Ex^}lNKnW?m%y-23zb!l(MmX-~}W#kPD8um<*ni&=M9GnUOL~^Zlj3EL1?p zE6NGmbzq{TFB#@qYj$P(KZe6++}i?Vp^-G}i%>fR*BQ%1ak0X_cL=nsvq#^kGR z=Tzg&Ghic0%q7?G(Mzn+G4IDihj*rA33=B&XNf--!MUbsqK&vYwlr z0dh#!w-n;f+^vb|N0`{^XfQI1kf1~Fhu|5k{Zg{|Su}GT+8AtpoUMmK720DUTJb-L z`@VztKAWX$-c^9J;7}Fpx=?UpxVp(HPvlL42}ozr**E}Xo{MlFnjpu=t~Fm!7o;V+ z<--}jXW1yP!oDtr{EMywdDhKhlFd#A+GN&~!qjl6b}m~1N~cD-Kl({E{*)1RYGA_U zfM(Y;p^OGVGnq{ncpJ+ObAOgV`^vQweb|K0C6FuPZ$N7TDv1?3=}879=M$~_ui*zR zyK2faDP%VH%co{rXFa+$3uff|(l&qNGmuSCUG#oi@jk?E3BkA{m^^_$2tz-Hi`xnw zHi9g_vDJIvEN3<8kN1^iLYKu=&Akzh4ovAkZGVPDQ#r`HaMyTp^?gz)x;Tzo5&_li z_*U{Dnyp1^6XlA^e;nxLM6`OCvT+uvhh~O6#5@Ci9|0{KIMGp-4edhS9y0|bL3}{R zn~JT8nc_3#aOZ&u{HtTBZ%F|i3FEhV3N!(rYA71b!BO5k1oXA1s8K}e-tmwt2sJdo zb;fdz^zGU}+hRaBU5%G&>dhbHxM=B3gnMUl7l+AK3n`yKZxH>(!+?NqE~wdBW^ldJ z#PalirQ3GT24SB~_F(!`i*}4b39`mee3*CJq#hmV$$pF>W3R7szZmv*<+HBs(1-(r zr3ePjIh-^FUCTjFL_vuMf70em*7Pri^9Ynk&^p$C-EFaIn)$Qf(T4tsf%Ujt^wuvJ@=R9Ft$m`~@l8O%c?FtVnOE1YbflhgXzgnSs7;BFEn}3X(Kx{+PdcoM z(XOHTcorIWjYt};gdJ)+4Y!>V_&j^TB_iiE-R5mY*HmN-^w_;EV2&9soO3ekPmTbA zAJNh`UY3DbzinN1B61nNre3r`nfq4s)MlmYW7jZQcRWWchKg^3>;@55YQN)E(lb14t$VWVPjAX$BMG zSEFqbw~pmDXvlV{S7Z5EG|x6q<)6~{!-cOq@t}&BgKt@d*p$7;&?uYaO+kq&RG(84 zN$mo&b*?G0rh^u5!b4~Y2{ZU0eFSjfHafdVxpKH`4*FgoU-quBt5CU(y0RFxwh6yw zyTUea1YC4W3;$M2*;}Up@r2s5@wE~#ABl9E^U>)Twtj}s-(3hpdsqq6^VODJVa^`f zMVW)eSTt6h9?O5M;p5b(*x{{n7|9)F}Y|LWaij}0)v->mai zo1p0JOUYU&Ju!T0zsB`C+7c=|TMoCO_ajjfghJ@!sT_&2BU$$m^iO{G4a-au>69*L zpu9UO7_6dS3LAU^JuTw>W1MSg*ZI8@EQ>3cjpv`mte&6VLZt|JBnB&WHTRG;`>wCnP{CCLL>r>vQZ#A zh$dTuN0x4)t+9kXCj}xmLE$1xM-6OweHE_2i@o&LHL&xt013I6A zjf<|7pdV9u){>uQ@3dM^C6nKilF-XYGqwD+5UB9Y)Cx(7Op5hfBw;T*{@N?k90wKT zBH?obk#DE1FX=~yjqTfqekkFsGq|NR`D51Cq8Vxp+*Sjbn7$Le&PYqVB=3kC&4aW2 zi%G&R5zXOP7)-OFM^jP65N<2BY!N*HWp}~#(R7EDgKd8;j*8=-o}g^30$CyCUPNc! z6FJP2o_FQG=VvVbqOv`l+e!;_t!TCl#ia4SjYnQEYMJ3u;xn1f$p!5Sv@Rcg`V$P`ZP@*D?8%39$)YNiECmZ zc};3|R3_Umfc>7;7uUVLAi*G{74N-gxbZTslL*2F-Y1d z!NxK36Qwe*9%l1O{0`cd*AARR(P=1XYN-JhZCW;Wo&la(E83*hRe{XC1+huc@2kL# z4xFOi?;#rbWG7lW0gWxhe)W|Y>z#1d`F-zL=z?9ZIU@Dc&z>4;BW}i5E;-wiuDZ~# zk@$%vVhCBaa{IDBaIq*pL<;N*7KvXFVY-}A%{5$8qU!j zGYn1DHt_jHh6em-C4RV*3uc&Yw=S_D;%&j-M!^#OCnYZu%*qkJ;{STdEc!5FR}Ae; zP3f~EXO1#C<3xL$YpOtoRC)jz!X1f3v6IUl)WPf@IFki zOS9@ND}%}9Q*8KT;4w8m)PO{W7Thjk`tq@z4`ucX{ib!~3u)>e>zoPN7vVnHsf1oW4SPEBzZM2BIW zN|~N|N)_cw$ep$->$-AW6Q47mZ%!pzyJ8h&DL)E{78GFRE}_29^u>KC@T~0Na9P-z z;VIXl3;)9eV-JydXJpT2xDECNBwSC+a*+%-e@k=@Kn{&-Cg3h{zmse=-{juSB{vXt zgBx&jQO`#H*l7Il$P1rSlgR|Igz`zIF!3lg6Q2)WwpwoS9PYr^L!93ez3pM`Fr&mx zciTG@gE}Wg@o8G5ewcsQPOWrp9!$@xQWB0*!x#|bocey&^(W0CP?B3$paf)ZfSLmC z9C|baf$!7bo-UI@GgfJufhyPf-@whomgVt>C&NKEF%N+Bt@wi>6+ujNL@X?q8SS;P z)I#)79%`!OhSCt9aGwG>PG_$mxfj(=3AtqWCa2?>V(}8zspF?RhvCf=B`$_cKD|7< zrbL*+IDXN1FXOY!mw#dl)BPCah$x%!lTHMdXrz8#k*2^hnipE z^v0rXP57NAvfWXxU~+&=NtSUdhJumAUupx0hv&4_6|^XH>ChOIZE%Y~V7C{cyK2I5 zYMlw&!`V*Lh)%q)I({S03ioaDEkSRtgbf>^}7L+)mdQqe4o{xp%>tgjsk@7#B3*bh#J`!1>k<)W z;?JP>$AhQ`&5N_{Y}LU4yLT2!OSI0+L=(mkwS6Z!+fs1`ljqh;S!qyJ0JzTAY6PH` zBPG%j9=6_-6M)Er6yoipD;Mp>j)y38#AN@B$QxiHd-$I?iAf+Ak1k_oKpL5X- zplGB~-`GdenbNd4A}jl5#Q1jpa)TQO%qME4_@yUTqsf?`vQAF&(hZX)=rM0ZOF->i zyC&5kIO9XDju8JhDLcsw(V3keW}O&?5|ap13%ul`fCT6zkLUoGL|iwMY9riu{c_ec zy1h*(S|9|gme1zVl;Nl(6U8nDb3;?LZAJ@7QcVpSujj&=PKzrEuSx(3<@!+Bc*^{j zd4lz^q3H4i^!bL!E!0b>Wj4M5?FN-*CIoZ<9m_AY#p9#u7=jtesGx&yb)8}9z5j`;#GS9zkiPTI> zWSG=zx^yW_9H>~q<*0@d>><6vtfRJ`1M((;4V zm5?$HDWdVOxj1(!wH@u2@CF;|;aq|G5Kkn!!r@oeP(4z2Fu4{A_=meSBRrZbyHa%2 zPV^&f{ji6Rp%EL5!IbTFJ$Eyo@VkG9aEhGPE(x`X_SdxDeBmg#&(eJynJ#Ra1shEE zy9zN-a;WFu83=M10(z4QNa%@Y7Cog>Ix2c&SZTkMq`Pl_^>1WH1P+ zRy_bO-;F`)F!)i?J9^klxKeoOSO+ihhI=paMH-^%KF?M{D}wr)D0Jy#V1#H4OvM0; z0>2jm*K2HKe+o=tKM=ayN)esqYMxywt+oIk;OcKE3?sG zNkpyX_FQx*)p}OLAsf6)_Y1-*PdiD@sJun^(mniHjTnPMWB8FFh_A>$ER8PMdBu;1_xs?o&v0}kN)`bEYA7ik zR686h_cZ()kN6~LP}h(WZk{FFso;jI+>_867R_crB7*gLWC`W6+@#;Oj2b7sMpGBa z#pw4WPDr%|rsL%Z{RU$W=&fY*>n6T_>ea9M*YV^i^z}sPFGfrvX1E5Wl;~WjV@_ef*8SlFbYQV z_N;(n!-yIPRRjl16mZpjf}PcqlX6Ys#-dqq=!;@;Ti74wCxii&x85H7(D`AoSd%hd z+o^WN9AA<5*EI1(RF#RPr+V?gYV3;U3)RBc8oV$R3|s5vp8X;a0LAb%YPc5YWWMut z<+d>#ZE)?EzND!Q$Je8kddHmAybt%!&pSk1zkznDx_`2aw4onMxmA;ehZ)yqOLT#` zUVoNciB86qP09T%e*CFGNFUa8kg8M73VtCfEA3tcVb0XY&>jaaG$MUDx)y=e>aKap z?o-I0ar`hjY!X35y&Wl%xwHRq8L{~h{9oBL;)sVh) z&*Kh0gO6sRo+9vB;35E84MrEzBa^siVj!!3A{!;E$dyb7w@ByQ++`P(0D49VLx_%< z)%|xZ%$pX5OF-QCeCtQk`7hMw9owH*?^=snDr{$|Tu6w2g37;_OByF8oINc5g`7%g7kx^tPXs)xr^IzPTJ{bb1X(k#fmX+mAnpBuKX=+|`1|M>k8SJ(AGukGBt->>)U=K1WRHyY0|xZ~*a26Q)DD$F*%`jUrU4%;KRUq)g@ z+;{8zCGwMkF8>R&3eXu&o*l})Eaw&nTaK%{^79Kp;0T3FD!fM%G9+}UOu*Hq z|D1w9`@FDC>f2>EK}m}C@ixokZI=AB&c*5WK$yiipN|*WDB)=)%OiT@U!uw^y>eW{ zvzDwVa;(We3{hI?x}fYgEvj<=EOfS~dPcPe+Fy^#an-uragn33mv~?f|C}~z3<3h2 zwfH+Zy*b;KZj905G=5pH37)XwmhH@wRpU5hu2K9||4|A;3hCYl0`j%#C}W+*Uh^uQ zpxQ$#Z2Kvi*bY*T3zUmZy!p`jb}1S1D)+jT!I~EL_I5H>u1^|D7i!83<+R2&jgpN^ zeh(Td%->sZ12{jY;{)sTCuMmENk++ABRmCcrzJUHLdYE745r?L=TN|<$J`JuT-A^x zM(9$>HW{K}ZV1_%g8Qlv5O3M5(fr0|M!2uxVf*E^x5|Om<1oh6Qtp*-AIHUJfNq*z znJs?Ljh=&0P`+A+(j#38oN1@x$!IH`saMR$tkL-WaTfMGoSa9NBACM-Hx?J+fBs7Ht&lh**JkJo2r4;;lK`Y7k*l;j zf(T2&97WQV`|k=%~Co68})VwiUxI5AZ~POHE^g zUcKo%xXe?PWUshju_VjRjgV6f=67D_pJxmMEMLsBa9VmTR#SCL5sVqP&Gx53->Nf+ zy$NFxpg*!*2w38f z*b*rxnk3gfT8Y~1A^2imXvVEl#ObgcJSw+1a{1n7*c-&hSPgBml?E@S<8#x~BzZH! zxk#q-U3wY5tUp)cvRK?{Yn9r^%Q}@LbroF5E**!RK4L%B60)klWsB6fZ7}~B$gTuO z&CGDwC1}vYMaE~MM==NmhA~y#s26Apzj!)T#m@z4({NYY7?>6ZIRdWA znc4a~m}9>3TjHNR#rT$zws+wTPTK4u3Kee=9LmBG$&D z9Y!U8BO0+!!yGSAV_@_iQOg}BdbgQad9y_)^CK09zbV613Vaj<>cQA%SllW` z*$VT>8UI=amZenrt#UCSF$slSzPYyrcevrnEP$9cGMVkIlL>Sh8Kfm;QP{333rZei zE1b}3Z2D8KCq~#EjZtFSUjOX#`rDy=DBC-QRK2a~f|K6P2ViD#^2Qj?lJB`&N+F5u zcok(Bco+6=!dRdF5a+PyK@c#2s$$dA{06J#JDUohN$*c?%|4D&<&iv*L)bED{5Y64SO^*8h=(96w58*B z{*>XOjq{GO${gfR-Qri@p+~3=LDBQp1s1Xi9P3tWyO~7B?}5XC?WaujRGcxmh8)>o zT=Qz{RtC{4FrhU4a)_;0V(M5vT|&}cgtxPxEf=~J++r3kDaaZ;8K%s99eT1UPsfMw zus=8uJ8WE1ul9>?8t{|2k;u(`gX8-R0=JAFZ9J>6En4()4FZ^BE1r(E^5E=K~=nj2xMD`eU>4)kX{`Us4%9-SsGyayULiNw@Hvk*axcc_rFl zdkDFwOF`y}~YXsEv8@9wYw0<}mc!!d!8vI0LaGLZU)->*gy|P5bMxv54F7j?FC* z*040b8f-dN%cGRsN*4Ww@YWczmQ{K9s#?C!V0$g?i^J7tlL7|1$i)}7H4;JIF-E5c zOb&{#Bm3qnC9d+V>-nu)^;ZbFAxw^updf_Ajk8-NB`1R@>ynQz=1P&uLy5O4+sIsb5poi_gJQ6w7smF;~2?K;opr`Bb^NU*^V`=-e~-q3&EWM>wB2pOts9UU`GYX zSHr#nX`_oAD2oM_5I)NwufGYK-@s?+on*M)k8ZL?Npc6tE^~Xv3s^jIL)JF9TmbtAk-r!mVXD?n zm=a^GQt2;l^3IdZF8vLL79p3_uSYBa!)(YmwNIaW=TwN%C8v_|d>UmEc4xxw|x{rF`izGs(_Jd@`q2h#1RX0KXPLhRZWj11!~;!?G+L>nt_g&W%c}o{DOPMnn+kS8Gcc2(|X^xhsv_j;OL&sqbCjEBiWkoV6RcQRZMTk zO$s|_e|K}k6S-9iLzA^HDLh2_KZOIZm5JFeN%EGA#!$y1QX}<;7E_s*@bm_+smQ1C zFxrc)bopQ%3-NmkmoHx|iC070mOt`Z=Wz#9+`VEy@hO56MIW>1ow zn&sr22f0`ch$1&FnJX+m5MlowHGYXGSnH}VtvB8G9sSGGKJt7E-P3xm^(ve?Kz@7? z9xoKLVZd5$oCABUORP z&8pomA|~OUlFHz^7-^9Ue=ZSa_Pg}WMyN)#Scb4USeU@TjG5#_PPV5n$`;fo_*~YS z!M07tf%m@od(!W)*6*>0ql^y?LL&`MR=kCX;-f2YiV(j=`kr8LtA@opEbT*Z;u?%W{NPZS@@88Y{fu+3Fo?mC*YN>{e>?*#KjjJ~+melqZJbKgrY;EiOcK_6vz;SeV`xkMOm zZy770#*sHeRK?B(SmUUMQ3~?$1fdS!driS+-sL-r{5(eW@zfp6(mMSA+1h2;Ie8cBr1Qkx?3F@5)Me!AmuBqn~hO z=br#JRR8TD_$F@N?!Ksr!5(~UIO*pmo5D6Q9Hc2{zH+-- zm}6Xd8SPA-40fNmu&{xfk)+(ea`KXrSNAjiS&mvn%Q0P^RQ7mj z-`h*6VS2Jph>Rt5r>Nn=BL)L~R6h4`e4?Udl>}5c=D&}>Yf2x+rH?UKvn9P&IDXKO zKq?kH4`5F}G^q^lXB{GGN_;22n3n%V@o37jy1Q^UyuU$Q=v(Hy#dgBoL7X!Nt{j&( zHgJEccve+Nx4Jovigy6j(7Bdd5)P|D-0ld>-^a(`z?#ZMAEvCNEWsZ$&rzL*)8nw| z@mesOyR(RdiTZ~Lkhd45%kXNrxt4dlM7mk}Q}#8-C&p(c(Cx_5L<|b_9|l_iTiY1y zqlQ|ivdUFm=e#a;dmwxTzw}7q2hMd=h3+%9gsh0=ehAFg%HiI#FtmF5%D#`^SHk;B zoc~-D*pt+|3C~CCo%AnUz8qigNfAUHvSfp#`)R77HT=qxw%_`IGz?E@yLV;WRAtTM zpO9OpI%VV7H=LJ3-{_e^bXwUPopIUkN}NyRhi84iZ9~WCwT@tp;5g(Yt$ z~+F+4Zg+G=Svs_92X@7 zmOQDWl9oKFa@3DhpMfwA~#xWrhmg^IIR&t3tb6#rkxs| z7$J;HgZGC?n>~C;tG5K)A~VOXs-^|3g|(>XOdr? zQId-H^s20Za+*;MnJvYBMHpb|83g$bZ+fExop}$C#=|4CvUcv1RG8Y;K||9QmYf5*XrTQ`t~!Kws-? zBKbv2xN1z&ES{UOM3R31KKEqwAOpgj+RuD<91;a@?mrciroen@yaSt@`O7h-^2Ft; zD%|0}(iV-Tu+uo6;g&_h$kB+F?{pgG=WpS^e2$BX7mS=qCm5KrmL>Y9+eIm_1t! z7h+*jCTCw*IF55CaESv|J+e62VP}ZtBB}#e^UJDUJg$2KxD+F~q!*6GbE6UvxKp;A z6B*;`1gzXur)0k=Lz6|w3Ov;wPq9b^oC2q_} zmWVGpzm1=6$Xbz?yu!80a7bJNuMXAibnOLU2sInR*uY ztosYwBdg{ctmn%ej-nO`aVHUjQJhVu+3Mv`-%ay;fhw!1dHng4#pCSj12I+p!+se0fvXV zmoVv&0gbK2p;@XdZ})$IQp1V}lBp8BS{TIOAP5QMo-ZrpT7S?FWvFuNyR`d8_h5&m zGeh<#wm>>P+(y>Aun#E5Klnnp#`dBgwPb7`*+&jW_-bmwsy=PYNK`HS6=M|AxjV;- zW;Ly-$j-B$<}MnX@oj=Ol4{|6y8I9-+Hzhd%-xR9)1f}HQCVtpj@$OFOw?M&P~wE- z2i*zqlL;POF*lg;&{Q(XEITlBT;iwcCn+!<=Bv%Lk8hd^%lC?|-hb{RK2K!!)b!bA{b?3oUhYv@-ugaNO2IS9*T+c(RSearpZgNMh5K5e51i97QYug}7>A@L z$#QbD;ZJ66L*hBS;TM=xQ_TbXb@-*m)^IrVO|Sr&t#j_ffJC(;YZA8~xSHrvX{*3b zWgQdYirgA3^)KeANL#Zm`I5+{t;qKuuIpClN9$n)xGK;N042w$N|;lLTP60L?(^0(Z7k^Y;oxu#ew{ru@COT z+c8{f-1Pf&!S^Us&IYFBZXl}p@JADT{~>y9m53{Mg2zPn`nHo61N{&_oCGyrl80u@ z0ygjJ7~3QXXtP_MM2<)xWyy=nkIZz|l)Gvp$9iDd5uQ`)hpgof6lrtZ6^)Sv9D6pu zXGvEeUu%ePwvOd~F7yNOGCb3C)49(zBAAnS2xVKJ4>-RL~eosZYgY9y2#)4ODoNbfRC zCHG&(S!(WZ0UXkj@dvS!4tW7^yAx9_lpHoIj8j7$#{?rIyHD40OQu{+Ra>fQzLFJ^ z)h#u2{%L&go@OnjlpnV`l`(7Ge8A_V`4#BRF`UDd)leu}x!8eO{bUAOOB(VE-xtSl z!&SxaLi-KQt`;AvKDVTeL1ia5x)?4D1=SSD+$6p(oOr6Y#ZZHG3s~zl9ty!T(Px?H zYWs$hnZ%c&nkT)Xj*$2_I`&B;Yhl+A?2sZ~0p@aGwO(+B!Y6CZ5PMw9)$_JE1~qE{4azn z^1S|ia0dBIUP$6V>`qIu9glV1thi{4aTXZc(NFx=o~}Gh*_3bC0z3aa#xe_9!nK}fXj1hGiE9Cy+^+F|;a{3LmBgFrV^5c!7DiJv?Bl+rPrzI^4 z4!^a;BkB4Tv!eQyl@Sy81?%WKG1B`vzl!I3zl90YjP(pRHV;^KWo#RV9aLoyfCHA? zmHv=0^uZLkD2E9kphq>;YH9qAK0$lgt8kph;~o)p{+4HN{WPbzi{uyiac=a*tatH+ zU+Hn$vmf&v8*;a7OR;<^!{y^*Jb1|&TsHoGHxW@0U+J6{>C(?jf>&HnvQ3y{p-&n9n!6L;?ZVz?cnhc&cC*TY zvWVkrOntyfB^Nq^&(r6wwZASU$wB0dg?ph9XP^gdOg_dfbW0oJ%%Kx;Y(~!2CFkiS zvK8F!GIgD|z78dRcWp~>i;+`Jj-6C_x;_~XaCIOz@gF6V{h<$XOdt5c0}0jkT8TYY zCrwF)r#GGcyN~5H21d?@&+-5jv*#4_b#5c}y0E^s8|dE_#xTcB--C#qENJX<75s zSShIVz*9&0jXLp9dW&VhM(t-(JK@8L^f)@gzE@%~u@iCu;)(5)NDpTkyk!_hEG=Oa_~Z8OqEg97s7Idw>J({j%ujz0L(k&=&QwaaZ=W7-m$)^U*`&ZkOe014(!N6{t4iQ*^tvKhA|wmunx^hZp@dALh!El){E zvX;9S&AuaB1bI;KghXEz&aUIu4&dsq^}f~BJF^>}KZ;eYjEN=B%N{pKEDe&9NbMbU z6sL|ts8Yr-d2$tOl*8iHkXS{&P*}sC$qzK_`s2R-C-5&&&mjS=)-Vj4p%9DENaBY; zcd*{ZfmJKb49>>71qjqlBYXtm~9Zuew=CqyyMO$NbdoW;Z-GBNaHT<3mIp-d!R!(UA1 zPqvW`fy?FcJJQRjUOR&ZHZojAx>%u<NSK+)8&dg2?6((rJ_2jw< zo|`OMI!f(N$=y%b-jaEH=*0FM;rH2`!9X5Qp^K2U$d3-Cr`T^$H)U`vfxl1S@#k

    ip0OofFo!_C#R7asSP?`+G9h!+usPFmYV)K!`qlCH z!M9By4?d*gdk-!v=? z&q4pvEM)oQ|A8Cwvs!Eo$F$ICLHO`n`xyyIjpGJsVU@|T36S;omNK_W*6h%NK`Zvc zt2^LF8@W3aeprK1*(ZR&=0+D!>-CdMPNg^_xkua34IP*(i>ST+JwgmO?!f~-oo zdJ|w>U1+&(*`XuMtbtsDr?N{05pz{A%&FPV7@eFgfPh{Z0?G z8(}YOwbNVf*C?UP6J=d~&(ePhfqu_Y8P4CLX|ItMkNqzl5+}WyFziDE26lKi_|;00 z{xXms8R(xKFZUw!s0?}5IIuh`&VM;^xV#?OrcQe4;QtzCP)UPaB>cLe&13x|qBxl2 zr={RrH2%;2p*oi=ci8_3dhi#q8OZMzpqn-zb_`SeDAn+@@INx?@lrL?5jc0~sh5T5{`9LPP_WY^`;Ce-tQ5b%I(%9y zj^eJv>GTSB{84d;SfIu`ScaAksb^Yo6~->Pjr0OEQT-!ZaZJ@>7ar=F4EqKkbHF(x z4kw`gv7*$Z{#2MQz9`DW{jJ~rX5}9IxE}xs?2dqeho3*6+$GOsCwb^`er&hJ2Bwe~9`={S)bz$;bjn*Lms@ zUL1)PeC%(-n~q=DHG@7e02ys496}ibjt6*59jcwS4RjQKdsM%;5zm)(A?km{K`z5y zrDiv9;c?iR07c0)Hc z+LS}(BEX$qp@8}JE5t3~51m#en;R!HQ( z*gb=3^aqh1Qx<}!zw^jAfgIGbr!6>0l!~vs7KVH+fF$UKNgpvP4BlIchNxH`}8`b>aWrP9! zvC{Cd<$m9Prf)mn4)^n=@t5nn>a(07_(xC^=I*ZUmZId!gD^0BCfzN$u_35yz*V`r zZ7sd9<8S&?9PF&NACX4lgZ{5&teU!(rEo&B-|1zzJ-C zb-qj34kEkfuei=lqElo%xgn2=LqN;FA}e~#zW0iM(w!|X`!9FCXoM0Mi<0T=@h&Nx zmjCg3$k=~<1lT};umWGCwAp^|dl<>O?_-f+-cV&}e!Ian8Y9KwxI`lu7(8-Ov}~ZM zICn9mL;GSS67R~p#%NJ!?>8>YQHfpjcKoZbIQV=_ePp()rNuqVT^ZLMiNRLe3aZZ9 z#t4kkj?<+<>*$dGN?uyA7p#&0lj+WK)asUN%Wx${o@6zsBXJk0==j;u=!eRsD3cIg z-&lnkv7gUg?xmO0gB`3;tXTJ(f9rCQT}p&Y)p2RcC?spwDdq2);_LOFF0)HrXC?VoW;;qs!a7fCY^RLhO3y?u#QC`NY`?- zHz<+4*wXgFzeAgBsTz^34RQAA3fne$YAX^hxvLDer&jYHw&zNzbz zfAvktmSk%XMNR4YDdV?5{;-;g?#y+Z??}eMHy1i@eMfKpN?!=^+bR*xEjrOaOozrB z=-vVuLx(su_BR5Y)5R<`?xeMq&|luRl#>MZd_MVTKnT*mw+2%bXVv_VwCSk2eKFQV zYn6T@p!sXyF(H^+T}{FQ^(`d-q|KwjFt%15AHrY=2p0mWhOQ~}5z7r_6b5qt)pd&h zQO(B&KW~>zydBVmL}-PjyCqt^E~8cF2$U{H$-&P1-r*l(KvBgO<#1hVrE3V zsrDcTwi1Wcr45$Ci&RC|nvmMcf9z7N2AX#J?NSdVg%#-k7-Lx{p>iDW%U-53EnO6q z>H0`jr=bg+T7w+7V83t1;bL&Fz5Ou%mUay4K+u_>3q)~X9U4`{-Yk(IFQ(D@a)3KW z95b_tYQ#bPHLx{^Kgvq$oW4HXZFT;K(h4uU$3eMv#V1)kQ7GS-fngh-Tr5WzaZ!|C zei@H6h#EKdLQuy6)ht}e;7cu4iM_M28hSI53T_A5-j!fuMh`|FJS+mn4QKNU2&{=Hdpi+&#Ir0z*jjKuls=&*OBg!`M|Ej)6YXRhD|_4efTrP&p&8{0}3T#F00`M1hV71!~Lf93u17X5LbXv!H!Qu zW_hYB+znOmGhoA5&&71qb)@x?4MAxH9)FrTr^&uFXzB3=N?KO!c(G>0ic^%!wm*n` z>IZ*7l8%bJ`GEX|iNz{0Is|tOJT26?>03%=Io>g@B2btocl40rAl26@xASdM!#N{R z>;*@I3|whq3?6Et^ZkwCanXMi(>vo6sc4`1uY9Vxd%d|s$97`zr@`yWQwD?&9E5F0 z0|yPvdt2^SIyr3;_M+I5kMGcJtMLaVc}5RwKLJHeEH#{OVp|{}bn1gv%eQP4MhAYq zVRd;!Nd;y660>}?9~M$>HfxLoVc+dHU>b_kSaA;SvHS&P?_0U!a?{j)Txz*KC(L_G z={GZWM04j@#}3Tty`lrNHfs)kd*f@$ICl-6*#EJ#BA0j}ZlGxN$n-sA@RWcP+w=fb z!BmUq9mn}wJo~KXbMg^GW<+4V{5F`!2FZ|kQD#vy*sX(thyuz#wdmI@L%duz*q3Gx zRtkOCn16>V(cA2*rEmJJ*eiLe+*ryQk=y)0&fO0;o|R|hsHlNO+hj%3oJ;&O4<{W^&U7}_}&nf~(k9F1aaiAqfViwqs9Y`}>>I?|q{7AqfvjLqP%{VqVcd6YdWoRT% zsTqvu1bG;)rZ}XAmwI$K|5AUhh(T8q;_Td>f*v_zO&*XvR>BNS9e5;9(m`;+fPBXG zPQR?*=?Hv1$TOOjOo?Mf@)k9YRaRr|ie&YtobHcdxjgR*gPnH+S!`Z$UdM!38BwtD zoxU*f3C#Vyz|jRAE;WW7*tJ+4Mr$tRL4(|P0*Q(+nl*fG8OL)Cf#Mmg`dsBO7Vy^J zEJHHnD}hvfeIaW*6WvqQN&1&Ql# z3((jW0e)PgR)ZGi4teoxb%S3J#GeU+4MAc&5=`vI7`^_kIuCo&QVRBJPd{Rn!*HsW zToA?e;zw{*N!cGv6b1&iZNVc~&5|c28!Uxcw^MPClm7!KGnV*u>*z}zYH4Dye~mQ7|qc03MY~F08~+m@>#li9-3lTkuyXY-YHTa(-?YNycB}KEe>5 zv+{VTavtaGF*1kLQ^p-&tP2A`ug&A-MSGOoPNgkCMlymjDuWT+TN%txQRBErH!He* zpWvtNx-P!tk5l#c8Ozr}|Mf6lx`A{Y`bXV0gV#7)7ylF$w|Y`;j=0J4sS+c5^DG7Y zrPE&%9Pc6+zlyuZ8+{_xNFVAP-TFKnWej^e=$=muv)29Pz^6I_-U*g|%T0R+rE)m_ zK{=g6dN$KJLr{B=1wW|lf@94mWX^wr94 zIF3p&$|{J(_KsS7gTL%A&d}c#s5r;dTznYoHLa0WR=1*|B9J%8^)i@w!WXPxuZP=e zezlf##Kv#veFxdU!uz3)V5-XgC=3asxGFoUg^PMIKwa){Fem4YSdDJdb;gk<-BsBS*b-43jTI0qyE`FJr~b$1(0ie9_x@$Us*Bcs0iEwFBeUw< z4x~fZBeF49aP(JIVwV4z;LuTte~}eI)-s&kH9e2WfCew5AZ?@~vTMmrLX9K=W@wGl z*5g&HZZ=;EPr|hI|Km^RFRP?y3TFtq_Q0Ir7bS~y^#3r-ojoKV!*R3PNAe= zBDEYd6mgN5SwrJb*5fP{9g}f^=Hl_zRl4GgpEKfq#H(W>K@g3_L-3C0dm6~{NXPHW zX=p(t!$Y(f!c^l$_HbR7xFaGA5ip@*O)!Yx;M#5NkO-x5{_22raTLyet+Cjpkj{`1 z8lg50AH>p}j=3;^!G+@45d5uaWMKrH3zE9(K%(H{7+)gSp~I8y{ped&T^d}_a3+Cj zu<-F6;l17ez}dJjftl`UhJ}F)9=FM2Eiw?>oU#09%ZmSqYN6FH;-P}T8HbNvtszcK zZSEt^P(2+|j&3Z>FOdTX_C0@!*bvJIwHz5G9A zG&XO6Y@X{1;^rCsTj{5^p(6P@(syp%jtMXK5lRwZiwQ*VbMz`Jb2DH{!tK8Lm(1iX z4T=uY6kW&1MElKj)#a}G8u-{O5*UCKL$rrtHR*DsxJ8YTBv! z%^RUT(A|tf8wFjj0zwm>HFu}W7L}TTQE(Qym_QHOw-JenpYq+Q^cR$S_a@a6{Tlyh zV+Qn<&1m&^$uH=aJ~+fyOmttfHar5?>YU3^oIN)T#vAEv^z${jh6zciCaOki7$zM3 z5VeAU0Dp%xUaCdB6pNsJq8wX8{DayUf$^hMcuk~KPVc5AKSF0++!~`>FPRM-+TOFPw9r*_?Q)7K6g0EDH9MH3azSeP?o1=7`!W<08Dnc!~ zAL+?-^NMfn<S^U8WA&FY zT0jgO+G6!(15}^tj-nUQbU}?Zp6YU2MS$qNq;6hTfXB#G$Ga$Kk>wpQh9vsULy1XW z9FS0GH&@`fZM0C5q#om!*rSj`TI7NIamzPF@>3O{i-d8=Om{5DfRb1T_R2Yywa-`J zURmkIa3dI{te8go6muW&0`l;HsJqTtsw27YwBE2^-U*j=i?x|K1sfvTYcxdQ{dBXC2lvg=!b|5nw} zdLW8H@it_W3>lt~6MfCoS4r(NP26}BO;_X_FyWERQVwe}s~w4RaP`gLjMd^B;YO!J zqJkQWu-=x5lHN@VRSah}fJLiLQP>Ga*conU)Sg4L2Ntn?YTVv7wqmy{i=v^|g- z2PhvH$UbH9*wuT*_s<^3rJpY2pXra;4DugH{PiENxWysS7qWccAUKbDh{jVFHObtd z^ljVnlr;R7j)m%zsLSM-fn2rH;tRA?2bxl{?$G-j&(93O5z&(pY}h*xLzN5f>I7|g z!72%PQi*LOu!}{gSYlpp60Y`+E-HyO`Tt4x1(pm9mf9?j*H|#ZCxaA%J=pgKS~B#} z!KUD}A1z0umX8y1_lSdxN9AH}dx%wMgw-tVq3Vi$3{uMHu87F~fkW(|+@j6&s|@W# z&*>9}($&_QSY}LPJ=dzO*|G6HM>Y@DVyUXu(*y^w>0x5_TneoUFwX+zX|Oz1Jq*u{ zE~MMwzIc!GopBh@*2pi6wK`40JstK2MmQB)K0#97D-E8#g2!=O~*8 z;*qu7jq)2+1V+EBICj;9$5MPmE(h^f9Qqw9S+=YKHlbpR4B@gh1K4fc(gbV)KM0t$ zX@tq)R9SZ|hS-Pu#V^iMXp68WQ|06X!s#tHOEE!Jd)UmGk>CAeg={m>+MbD79SFZXsR`C}Nn-1d<~ zz{j9lrk{_VP3*mHU)4v^>jttRwcd*{gPpq1L}jhVM9zG)0b@HX^hZn$p`6% zL#8}KY5W!72%QYO2fH_A%v34|VRi~WGr&0mYRE1c@)q=`23n#hDI%?Vm3~t?)DD4x zf%!q?J--`IGp}tJH(7TjLY>?B=ieS_s64YZz$W3X}qZL#D~f6GMFir5gb1CP|0$U?T117>7l+02WiEVz>) z#-aSL9%ZzCPkVnIMm;1Xn4|ic)=yX-M6a?mNwL9FV}=O=-QnJ_?~A-F1CBf7!paWhNgs-(e3^5qh12wI9Cdfv?jcDH^+(e+ehO<<~}n1#ltm?v42=^-+T?MiOSdNe`c(oGpCN)KOf0htyafVt1H_N zaXyYbGZ0pogw5FY0zYcNZG;P^4;5YCL6DN4WyKskiUr^U zLcgt_PwbEAtORb$0Pbg2IGuOU5P+w?i%;+)m6SukADQ~CkqB^Wu%~~elFidP>Km(Y zG<~YF<%xg{5qQ+o&r+Ed*$OH0O+Rsq?Ku^`HsqXK|CRbuD_|tXvf!t*k5zRaQ5^OM2t6#>bV=w@=X1^_iO(D2kjwS86V2Z{rPW_mE z?QaU-iNvPl4i40xSF>w6Pa@)C=}=sdjH^_5AxbbSKO0^M=Gs$}n>u%J1A}XFU6(PJ z=p}j;`W*jOMd2;~hqLLat?5TTHVTD`p5JvP;z>Wfp$0O>$!($ixTleIrlzV>Wpp;I z*2&%?jYcfv7)?oM+i>{mE46r;YB-o0Kvprr@IY}O<0vab;e~Kg&VL}MMyD49wwMDD zDd_rzoJ_>tJ?IkFAq+pX|X*B_i%DN4`$n`iUM5# zZsGJ3*>6w~qsLOAYzjSE?8n^*gS6nT2iET?=qBcyfwC7??nRJd-t;i^yXQR)lBOnt z$LjbjJzqoL!PoE$b;jWUu}{Z$P!NntUNTxm@6TVS#8#ei_y!lVCJcXxCX!@^lSPcM zH;_&s&k6K17`ZPga_X!Wjqvm^I?nQ)4Bw3pRrJE#iSW4|^WC$=*RY9u7PoZ}nW`d= zFubpo5Wk+~lUc`RCc{-tK8(jz{HDmOvZw;#wID5a$uyy{yjhE-z$6vf z#fY=WMh4oH5R!27S*qC(n;t5)Mvf&z<8UDIv)l#xTNXIOaMxmNU-yM0*xtbv^b^eN zg!iz-Q;Q7kB_?q;7LYgKV^PYs3}?mZ@QkJ?n-wlIyqrDoD`hL`P;C3ffPg|Co=w1X zyX-pccI2b;3$a=~f%x=t^Az0OV9fD-l203~EN#9RvU^F_hw0a3s10{=IoR#W4=r-s zbvBZTEargg8mmkNu7UjX33RR33{r(}ZNV-{@;g*{mX*}WbKiiQ%7d@UN`2I5^I;9W zlNnp(Vt1;saSJ*4Glnf$A+xZA$VK{d^i6z6xIHRgA+4pVN&gH6)7IQq4tOO2%^(w9 zae625d$stbnfjHeXK8T%u(`*1jeeUhr0R8V8P37v@vR9NNfP6is`U~idGJC7As?Et zB|U8rZuPjbgby}GWYTlERT{mS!~5!lHKVLMRAgF_u_Mqt-C=wv?Vn`!(@7^G4%7hBbEoZ z9F^p075K8qhSO`!YSP&Vw~UyB+cYx$MqlCU;8PDoqyE>RjuW@NC~h1*3X}Pf&N62? zk=gi{qi!mx#+&xkg=C(Bv=tRyQF11weiFldp2jxc{u0)xh%{9ECSwk(cPj+UpKnzd zWY&v}xW~9ul~EVKU<@e}j%;X6F%KI>HCdJq;L24c*Zh@wT#?3% zHa;IyJb}y~;*<&>gzXz9E);Z%|6ras5MiFzQY{^lk~tB}-$}Ccp}BtS zybqGZWtQ>0X8Q}sPDuek_)8hkdH0OiZ0Ui^MO?6z-(f4xvph@l~D8p)RV}GRA_8+q&j@^1bz&SCaNTMTN(V&Kc>*HpLmj zz#7;#l3S*SObu0SyaSfmthBh6j2wfZW0##@#fg*nRgsSRe=z0tDfpH5MKI-_T76dp z_eo6m?iEkEccp2_AMAkS0f{kXrkH^yJet&kP>2seXeu8W#&t95$b76*(g7iLb#6=t z&4MTNFtCtpx8u6-1D=+{Na$qf8;sotjmWH@!I_h>4ZOI~N#0H>|l=rwc0R>!Qu}Djxsfo zz`Y+G6t4!gPdw$M%rZd#~@tSJzPJ%29l#lqeustEp; zE4{ABG4ObJI5r8#e_5qjPqA>lFBEDx3{8ZL?Am=SZVfBYZwZJKc-j#pV3I zQqW;-B01TxRq3k5{VYX+r?TMi^x-s9=beVeTEFLfv(l8$&cjKLf@GViPWD>}emuXP z4Vr`DjuP&vdQwTPnQp?UnA^Z|eBfrBof>O5Ze@xnqTQ>$#|=Z% zL1v^hc|eb;)y!`P>v>FH86Sr^8$>T0QQ%oBRLBIuo#{%J=V|19R}4VdkFU zfjPhd4s!-(U`7~WfI(1@L1q*b6kJhJ2N-0OMOH;~K}E&Ht<p(|&31J@xzl-}k!St}Ct<9pNm`b3ga}{eC|jOI}BFs5nnkcz^5%4BNN5 z6u68FzxTFh=V_y@iLq9TB|a%J-smioVL-#3Sb+>>@!4v(k+s_Pv$mlavd7O>72cH2 zQML9Hu*S$vjV*9fb7QZFF~ z8>_I4gC4BA*z>AL-6>aC87wQq@J<)Mqc3b=;e8isS&NCN&%NT>4pUPMa-;h_D#k=% zFQ8*IcEsL_#a=cvV00@K5aD}Ytl?Jo(bbQNclL9RcJ{kgGMLIS$yj*XZdn!3 zoMGwDE_&!=iK8+l+;~WSd1Dh>G(GdatZfetyRyQ~D_G%rFGmukc4eae1yXn@LW9FV z49Qx4OE}27uaPca>vLAoP=)HoKDz8c^C~a0ECuVJIvnP0|3EiWXx|T05C|TO>q2T6 zoq4CbC!=d=6zP^l-%MRk**3$<45}=Rai!_rF!L%!rd{5&z#Y$Yxk6=SPC*D0#`yBB zT_L;V-S5@lDLL5tZc`o0wmt07v-oJ{_3`oSI;XNc zl-?oKaPh7}rp*%~EVc})uNZEG8Qme#HSM~WV}utb_f#}%U>30GFMve@3&tuzq1|*B z7uoCx93quAkkmMOe&G?kGr3!&O(ZK?*oq~<7-5(K1C&E!Z0UT75I-43iW5k5B0o=! zS>IJvy?qJAnw|yWrZQRh3n%#1MpXJjHzLzE!j>pH7Y_T;TMVomh4{!`dMxhgMce4X z7z|ZXUS;TQQsfzs=kE<@fjVF(%Qkc)#<@XIJ7B_KPbS!rrx zpC7aY`eeRGqi1;ZWborL{FJA#XLdxeGF!%P3XZ$GM7=mbLDC4 zI!d2Gj{1_1#-SQ!GHf1=?JxB}>1Gi2)3KOzgO5`DbrN1xeTwi$h`uFr8zWh$I?G}j zhO(IvGTS**mMW!`-bt0TZx!ybTR+Bj0W2$aPQ*rUqpP(Czhjg*Ckiqmjc6fKT%E-I z046z1wusjh`c>pFC4VBa>QeF zN;HISx|J7()Ck{upEF=eCJ+4rw1cLgY9CfRnAhO%M4~BzLy~N8Eo5RVrpc5(VOp%W z)dtcdq#jq(CDJ#vGV>;F=%Esyb0n$`Fup%FP}rwr(vY?)rO`6uHbw&%C9Dwfl(0e$ z2Dylq(S8CMJOM95@UP4g?pOFglpa`q^GIdyK9{*%=5JLX2ykNvibME=5yu9T_JQ=0 zn(53ks@Cv{6%UGzUntu&xHp)&RTIp8hQODRHqd;FvyvF-dgUG#P_eynk73%tQ5X2nN)zndgn%`Yw z4!3A%G10*dFUE!%ch*azJ$DTHP9>A8=yZL=}v6popTXi7n-pxW$Rz40Gl5ma;p>jU8h$`jw z;vuthsZ$ztn~Kl1uElkV%yEM|uxKz{+#X064gETf$?&8P5uv&s)qpua+d^fNE64>u z>{ynPlaX`_F3YDAZHLVt%fJvQypf($6l&Q=p|lZC`junxoHNI7;*k^+?S~Aeu|La9 zf2eQYQBwt^B!j#Xh*v`wNh$^?&~%k6F__}n6$lsP!dv9%eVOn~Wt$71`ty%eMv6tC z4BVf@;y8}~TGE7(Y!ztbNU+R&Ldc@N`gST7G>Xnw{oZW*+qOH?poSx=VXvhwQ=xhA z{s=M>Bd1H7|4(~O!nZ?~& ze}}(gWl8Zl{rh4*0^WF0eeH$J8WbgsMLPPOK#U;ve1W)J;+RaKfjBTTp&NxYMiak= z)jd~$yV}!%Yz+{8^0V~7*R3x)yFZJ4kk99idvn1w1vRPp)lQpu4&yI*frm>a=)L#E^Egwnz|tc1fV0WP zA(+Hdp!*?|d#|kl&imV^aI3RN7=GfmzfMM|$vIV$uX7cA!d?LK7+d=O!gm^ytf*Zj zcV|aI zDVKCVu^r(;sRGU@{7RP>kjV#Jii+60dJT4N(EA1TPT z6ytBis_d9TO(J85qokqrZM3&&D>Z+J-6Uw1>%LT&&Z@)-p@x~EhVO%gtAU<=Zl{8q zYVvw(1)On}p-^=-RT`O@##|WWynx~N&WX6YeU*VV)2$H# z7e-#@Vs9a=yR}eQ8O6@{EMkd5qOydrG{rzSDs#)jbTR(IDAu|nJ@3`<;!KJ@D20*y z2w_gIoVygpc25SnA8)BKpZ2H=UG{vQVWklrsaFRedhBTiYz^gy#2RUw?{EDGZUfBc z$!qtPZj#b>yCNl{Y;tHQ}8f!Z81B=RZL!*;y9v~8DnO&+kXRn zB$-;z7bRx~(N&vt*#kvgsl9?3YMAGL*#;dd*cOC+wkQCH0w0g&TwxS`D24_c43!OV z0UK<3ElOt(lcr*GOWftpls`TfKZkD!jE+VN9vb4Bv{5!wR&T=EWKl-$N6OVM;O4fN zlMa~Xi5*kPCOo6@ThqB8=ou)0K>}8zCUMPOW^qz~>3U~76p_wZbb&_!Z8}pxRb+pk z`YUZvM57qaG=F?$2cv^fmUvQ+}`l`zRlq$d}WwM}$ABxytbk z?Yt%&%7(*6{_RHhah!H`go!`%kgJeYG{E9WO__aX!@E+jv5_|tJon-NrD(1Lr~Vv< z8iaYuENojc63iWltLs@7zYOh{^AX#s!ijjpzycL!1#Yr6KbJXb1wMIZvM<+v%|6?5 zXq|~?iOCv7Bw@mmTn0ZR=;o^&O|;FWe ztT|>;%DdTCIx4fB0=pu2zEQ&`3F!VRLv_}#NK1e_1u(|OWRN??Q-d=*0uc z;hNq1wHHw_Ib-Ru54=-Pc}y*Dgy0!z<5-Y~rv5^~)e88b0%(o|4}oPtlFgJ6NT1A% zldVA#9Q_Oq+l8G&=^oZWYDt6ox<+@i8H>4RlUY~EB*47jni1M59`zhLDP6+#I)}qc zND0%OPs(3y{+-Uerl5Dg{VA>8`E}e3XXbSUo0yUW1pyQuf1#T$@9v1U)BsePrz9ra zstu)v>NbY49&vD`6220fZ-^1B)jRNzj)h(Eno>NvTk-!~_y#m};1Ut*sh3MSp4X@x_meQSlO_I8t+&F? zKr}f+22aj%q^*zT1uYKucY5>)BFgI*u)KFF`9k3_?VR%$%dNIG!W(K>=1;lOr+SNa zPn4|iT$9USV4X3$a2Zu%{@p9@cOiZfeCj7f%n#+PugKf8$!I5RR-xUq7iEEj zuz&U3ISFATj0JTTn_^AAb;nz*A7I)cNdpjnaeofp9m5@LQ0TluX2!6ogDAr^WqVok z6KX=oO0qBj-pFz-XPOrE3D<9@n#d?Zka%$^P--E+P6Q)M^crWa_^=1OF!!Jb}EsSWbth#Vt>75wuLS-T!Ahf%(IZsG<;qJx9Hb5n;m?a8rEdkpD0|~ zK~>nQM4be_6&;S?Y3xv!lixqqFfZC!%CAtNauHRU+Dzp4xN`WP!Z3QYGn&qJg>mcY zW4d^*1?h(hcxJ-!a~ZM)n9nh*%jcErpQ*_(cGzJ@Zc_bb6 z=~{B9xyg`|OIm7Bn^o!(-$s43<*eD+JM)d;+}(7C`J9sOT0XGoBk*StU^v;3`lFY% zpOl1lP;*!&XS9Fwmk>N8MNJe8Wn8(G0Gk~~ap`P=!#609<2kwi6B z+j$WWr<R4!9N`Jg) zB&`>g`jI_;FfC11UEls2S>}g?jn)~uGY&`{BFk*rdJwnI`!StEF$pO6f>Du&2uNHH zYHH{j80<^c8&^pYw(O33!ew9S6T{g^a!W450Dv{tk%husR;sRi1(lkByn{Zu3#CvT zbt@V@qgOoZw}kCA+h}KZlAX!lH~DSkpDF3_I!wcTS0S$P%lpkMXTnPIOnL1A8tV8R zJf74}rqQjo8-~|`>MLk_w2qqgs~5kb$nl$(CpQi;J7ZOZ=2QPL^WnkP{r;_Q@fXB` zE8WdyG889#q7r{sSnjA`V=t>ij%N;&onhubDKr68!fEix z3<^zA13K=Lzh8%Z4LP4dm{Kw#4&UH<5-Kpy5W&kOz)&^i7KaksR5R^ujB1&d`Ix~T za6hdqv1gtbhmaImO5AN6F7!7{Wn}|hq^Li>O?<8i?#!U77h%p+8Jui^+r2|k!{e&Z z4l%=@uVA3n*MhKXAbz(KZ6=S|67J>TWTFvMAyv8)gTy9I^vbXWnti;nj|AHWN~@YjNXy?302*;GP{o$mat-*m(g;STW zFx(A3)|Y;bSQbO4h95FonCXjXk7~X>g#U9nT%2wCpt~)@Q0t3|_*NhLKEsnBaygSl zZZDYo<5G1X7Yo{hYQAbdj8W0E>4Eme%uVM_Q4udpRk&XhUJ_hkf?;T9I2jG(Ge06r zgsJ_GUBV*w4-CN`3USG}8O2tkVj}EJ+bvA%Xhc2cWcyL61j|A4Oy$n zh-HuwBH~Q{;@nMR#P4#2L##;?POp}9hHMMCRf4w#{=<=UmC(#Nv&hd%Xb!O*hPw&a zD5JaRkP9;^ucV&}BG+o@LBt9Li6I`dyyGfE61wx*s+`|Rl_KQ!p$NxuuQk0P{^jEH z5f4`ESjB&*mo625EJNf%Mys@k|DAh=2u9Pa0IMo6yIh#0B6B!tuC69j9I1j!S+aW7 zl9LhAS;NjOS^sKSSZ?U@7jAIYa}l;E@q=(-YXtc$z=q!@-)`!R632~o458^px`!c= zgFU`*Q7P8@Hw{D)g3y%j6j2+A#pZb4c9>5YinvzvQ$aWX%nHm6g3QH)(>JWUTWxyX zU%1bWT}6SYfKQSQPy3)~UK_)|qovPj##g@Z1j;-6aAUa-3c_hVVTk59xtgpC8=oHH zrP(BY!yW5|RS!MUR!Qc_`EF|SGK&5bIu*8~mhC#&uHqv#ToTH<4n;{Crp5UuK3NU- z+xy~Sq28Py@$nsJ<`$Z4$Pnhq@dc+tMU`*9(EN(|OGVBLn|%xIrH^EtpB^r+m@u z&u^*ZDOIpU7N+w>DR@|@A|pchpb3TZ5jLwcd>5ImZ#xK&LSf%5II>)KIjiu8*cLL( zYD*-{bl71qELFn{g+0!?j6?CT{&RRI0JgKRU>ug&v*$xK;a@?6Y7?EY`w#Nf1Q_y$ ztk@NN3P%+W~8&arhsYO>|*_x*O0#z=Mqmp4WV16PFfhx$Lw3b863V75T*B5&# zYUdCo9udd&c-DrCH;Qj2LvIoH$61lh3oYxtU##`2TI*S%8f}+C*i7e+*mG;3gz{&M2?E zV;WS1AcUsb*f9wnbL~?MzUZ$;3lpw((eC%jpH;9Zp?ypI;`|KF$A&8th*vbs4zk1+ z7}PxXH@UB2(MJGN+UW|jiWV2hF~tlt{(@kKE2UJeC0&{GfVNEa+N!rLC12odt5*0x znKRSN{8qoFcRD8%Jj$#YdG#Zy7jIaE^1ThwVq@)#9kQw&GHS5S-HsKA?#?DWZ9ds7 zD``me^O~95jT)r8ET3cdT0S4BQ%9%rAf!lwO%c!&E0UK z4{fVpeh|O6!2T_H0|k*i*A(RyXYwkmSZRanVXc>&hZ+3*=`G~EKj_qSB2^dvQf`CY zWcE?$PP6=(T39!OzsBmdImejHxtbMAxZx{RY_d6y|JWqF{x&rZ$|t2Rc>7e`OxI9p zx|run7O223VgvU1Mf|BFE!OOQvbqu&vBG&9$z%@{ng5|kcrpK3K*2bf8sjL4;Fzk? z4SpASbFa=dbgz_Uxe5D{ZjS$h&lc6H1R;TbtQkj@apUL{{PX_7?tegRpc1>4<$s9# zul6-~Pl7#RP~Kfw&_nF=9$&8(FRvHI_Q)HHq zjqxxI#h3tPe~UiK)>ls%PtE>XU3SDqg zbmo%!T`;^Y_%R9&N>T2_9i^%}SCF<4f;B`;FjdaC;vW~Qb%ye-PIJ|AXbiXI#*X7Z zZ`-;XWkyZqx|;6%9Mn-EhJhSRV$db@*i%aVl^epT|`Im}Er*PUOxJ@;+%bsO|it1(Fd z$;gj}fi+#+wf#nk8h(*C2$fA}qoMl3q3%M@@bu~4*yPJmTLw|g1@T92WrL@>NpbL5 z<)Xo#%xi(8OAHg<5k6^S`dcxbQuV6f{;)Cz{(1$If+l-rT z%sdK&VkcF(`9DLEQx3AoV=XLtCheJ+?}9~5tGF~!2z1*j3y&^e&mUM!W{U2Kn@sy&BkB%weP}HYR}CeM-zG7E775V58%0W(T!T#8VRep3qi1*4x z#*@#n|3vpo{2RB z#@1{M%b${7x)XfDaLK2e;T1joUOYavTWMP(o$Y6{?Q8XcCOPHWT`4vycGr^uDtK+Z z!6qkzu-9^MC^-<2dDhDqkhTjS`Xl?OvSU|BYGcw~RNakb;q&n8$-;-D%^!H<2wWlJ z;ch;MGJ})LVofC8pZP%_+ZmT5_m=fccFM7xnPdd71}Y9EfMN#C z5O|yh4a2W#y~S>^RJJZ4^g=q7OHQneU4fPM-*Yd#5cYETyhlC&G6(JaSRy9hWte$*QFulOwE&LeM<6J4&#{1u=q5 zTgeA-M6*_$IguXcil8et-N)a!Zz2h?ayb1LRb_1f0tUWGl((!SD{CWBMjlTSBRw}?J zdFPP!>8wXgqMauVrGqgPY%(gHV3jZbcL=Jk+`4Y#ns%M*wW%12aE4*O0MsJ$=p#vc zg*9_wcR;RQ1ft89YnsKIzp|Ox)$gW)cFCN2=rL*tNDkU#RS&yxIQP!8KJEO0tyGrjs*=8rMGfV)`Qo3CxC=bH&W!ap$5X~}On-AcY$BA?^32cP zPbgEwmlZBAJk5u**%`rnL%1DZKhUrkHSOXbDQW)>hi9eSlY{s=c+SD{029jn${=Gu zau=tR!_x}4oY^Nl13vT<+zgserO%`)$HJV1jsxO{D!3iZ^i}@HFGyBiO%A0w&k6mx zQy0nAT6`~e>k-lTQlj;WFIl_8&`XW3Mtr72O)%)~0X4rcZehsky8 z$_1Y$=82$^!!@Hw=sX1(`7I#n1uWC#i&+H0?Rfs&!B5QDiY6vZuJG6{%~}@obKq<;+4-(xw2yTchyB=t5!=u$5jgb4A`wiodMC5GC4be(M$f7(BPsfpU={EZ&qz6zV8 z3hVvKF~6ueb^d%*aSOwdL8L3*N{=y*_ve-iUvqGHmFWQ|&{4)%ENO*Wux#e&9g>E` zWs~Ct`hk)^tlXhXsFj{QUJEfijA>0Ri>C*Y5q^c~jyP}FwVATy;g>|{(TcAoWHfwy zUhAZ({xGnbDwn(wEecodd~BU;gi{xK7(Jq)hZmvXuFRC?+knI%5|pJIlZNHhODo|e zkAJ!#0opf;dxQ921N1|LzMD-z@aefet|%6vCvMoOz+d}xsO=l^_w|BIJ**h%*0wOi ziP_32q(c;@cgK1bYEJOW=U6* z4#!!8&Vg6p8*GIMCtn@*nlw^eZ3JGRvU7^7GCL_Tj>ozzu!cirBEPBEV;KW2^Pm=f5 zF4}XeUN$Eypf}?1tR!IA6QRMT_3SGlx zXx{s_8Fx&>!PPqBEOL^2@R876{dk{lxwt%3oa1M|%rrL7@+fEmMq zpZDtcgC5uRr5LzXnyH@b#0*Gy-lsAPxBn0Qv0N1n55%d=Rx$WFj#BGKqcn4(pun`x zVrcY-9!F7c^L-<{b^_HpwUgRcrGGKc5YIbb!Brh2#|FLYS)Yek=p!C0Z>%0;haM;@ zFy4@8`qSGX%M%Sl@=Y*!hq%!{_cp}LMe|1Y{nj1+IrC`}BKqCRoGDQK$-`^~cKWL6 zvrxAOhV8O9SjI?nAlp>k0QXL?7V;Ml-_?NyD zrNC%q%p{Aae}VA{cbm8-<@T`|EU#2SRhIaBrEq5{nfsCSf!`baH!SHMh(1Y7zbyYJ zo7t8^{yGEc8?Y)Hx~I?rHIQ;G*Dw{_BT zzVzrcq4%r6S*T=)KMyz4@ZF_V5Lt|Z#dwIEE=x+Fqd*&U?NOlR4S9j8?2^jAv4%YMv$HBM+6o5Yic;mAj}CQLf5ZG^Y_@}xh#1Y6tHq;n>4tj7}C zKq8jW!P$2}mt=8#p4pFv%e~miSO*1u#VjRD()E3G2VxE1E!AJLOgc$V!q9az0l$fT z@i}NM`@oYiDYwB(TC})U!BS$GORA3fycd^$3P<}y zfDih%AA!;A%1Fm{pb}kel*PHvc~F*^m{Z%!`7TTzNcH6RPNFQgUhPT7${&x@cd!`f z&9BMWeVl9`qfcj!!0X${`^nR8cC(Jbc7TKxb_JObd2CC&i!clMM|;Sbn2yh}4+4Mq zV+{Z!zI5(kFq4Et0BnvAD0kP^$CkjNo; zdtBE@C{!`un+FSYI2O7MIEt24m)a`mT^?sfBj^H!+sS10Vp4t#@?*I0)Qw0?4RE&W zwglJ|ye^auBpM_CTvPdo{LOjb5*xbH(eyTtj?8ZbQJ;{=tC}++=p)}Kze|a2vFSyGA7>56|Kk^uqXY?}+8(sX}Q23739ST7g zLi#6k*xM57r8xdsBt1s#zuTrDvtp%ec6V^8|_}8isJ6`?4ghmxda0V)*|A zdqjhK^?b&sOr+=)N|~+olJpgQ2tlVI8JG+N;~pO`%mT7*7d3_d zGQcnb9AVz#L^;({sFWAzyoLU9QYgO`>dk+tN_wEzQ*LV|$DDM07Y3iP9R*}o;j}34 z)H1X*pW7W&>TH-$jv(8usbpsp{x-hn*T5oV869)af~b1iSAt7TZxT0gVUVPMY|f^b8>BHETto=Q#ihDsuNXc#$fcctfyI*nv#rsB zcNCSZ<1n+u{Pc?&vjWo?*O1Ts@ywoHB^ep|px8AI#&}G0u6HpsnBL7Sqm|iv#QKoz z(}rg(69uF2fATxa`CfSPRq+dp{Z^Qdcw@C_UWbzk%ZcuERo?HIS#Nr(A=QA@{+WT& z0AMetjn+5j2iTrS%VA(2u#S@2=>YDM-W%@Efmqf_GDCdGX3o?1NGMp{4tWJs!tMA> zC=H?t;Tu&_L^eaW8yIcLI-SEoEr?PLsqyv`&O!2<(XmI-B-Tb=&sJusCGyJNS z#(QF7NTQiH_Jhw>cA`sM;X3?$)`nb#y6T*)uj;m#AiXk?z*?f!&n{{l*PjWgKtm z#R-Mo#X+JeAV>%cNZms_C!shcbiUy*D}1fA&Wz-$jGtpn<^7^>7sZLmm}wu!Mh)3^GZ`iVKKyng+_v>jf`-d&#>d}HCm4~Ye*;%=retf1o( zpSy=27z+OHTVJK{=!V%qO@h17@O!A(gKP2X+6%&Xx)pccUlVx?VH_yeJ30#@F)m*_>+x&X9ZOyi$E+ zc9qUQsKIGWuzda?K_&uU=hD5)C;5T ze*mYe?j==`F(D!w#_U1&zyud5+3xtk3yOTfIUD!xAcA#I-DLdI*W_st{O%j)j)m%9 zo^~$?K8u6>aqy|DV7@PGiE}AOt??V)OQMn&g>6smV5I3hp7>2t@uxZYCtYJ@p~jpcw&5l#2Xf6?|8J)RDPKE3quQh~TH zbW^l7kjX1+v*4OIyH`h}ZeeKQZ`={Xqm{z51izcmPhrvXpR$N;r2G_azbzdwTFp-kfd}Wwa9_&=rX|HZs`IZ-=bD!eb$yd^3r`}i4!*pv@^ia~7V*2wuFai7~ zf4X~StT$#Dd1*Z{v4cvBQcNFejkLMx8^b(bAtVs?1oBBgV|oO3c)yLL%3*dSZY{gR zQC?UFxdF{@)AQWH^eH@UKtm+-4ADce;^Eug{EYxdg9avHm~&Cg#Rc2{AY_XT3KZS8ImhlqFRo?VHMxg23Y}gf5TEU zysa{g32#q?;m3C~{Kh^IFvs~O{g$ECbRn2=aS0OCEVXUHLuzy?K1{Ws*O67a)aPh) z$5F}7tG45?`FE5VtT9R>Yz43;+BCnbeG+|h4aPLBV|wiWntOX?!&Pto(qx#SPQR6E z(6Q(mX2360^F(j+@*uG|oWv?BwGBfZCp_E05nb+yoF9hbkN!&<)e~gB z@JkOhm3%LGVerjVnv=?5;7(bAoBYw6vfEG3G^m5~#7A#$S_s7ggenU-AzgS_lNVy=lrehE^- zv5#f`*h^8@P>bQi+v%awFI+ObIaBBRldaU<4v`Ao>I6LB6TO^H%Abwhj#L#3Pjtkc z*1pcRL{d3-@SpF8tAYIOr@E8xF|EQ=wz5k2a3WmxC)+2HpC`~$E*m=BUH9PUfiSls z(-4G0sGPD4{7J)7?G^Uv4|_8B`1g&1c_<9sh#ktcD!kR#Dre4NVNNcW4awtS%0hfE zb#3z?`WQA-Yx&2)X5^n11;BGR{H-t#xXz!GOR?~o0@4<>^BA5$ay4)v*75cc{TvwY zE32*MyYA49wq)GiM9oISkto9!BFl0%_v4S9g=0hXzrzqk=XbFDJt6AH4h_9#277P_ zIXI4=U4!`^+SowM#j!0$@46IaEi=HoZ{c0UWMd4ba`g1#@?a(_a4pEKr6?%9X`0k;wG?g3kv? zKn&4GAU#4n_a*L&Ke2bOa#wMOSW-h(h?!C*>xFM;&g@oMa`KZop_H8r%Q9UsdxB51 zV2a!pj0U&gb}t$ygK@#UaoCJW7@Xl8s9O`n&(0+`k@;9xjZBv*$I7wKqn}1Ot#kG> zF|kX?Yf{pIOJvp!cd>XF9=p{vV7@B&pfA9}vtIX-4 z`TRe)tbbWs(TNGzp-D_a*==G%{QnQnO135;Jt+>qBqw1H=bvvqACQMqW#oh_?amEm|(Q0iT zH~^|(23F%(QqNYD>VjP~9iu~QO9j%yJTNbMoEk$vw3F!q1bpD%Ou^t74`HebQ~vRH zdPr25VuW0ZSs5PiMZE{Wf*0u@UK7IyIgy}*{WYdF&J+5Ls;pu(xuKS4PrO@?W@{G{ zk64NKF(BoAs)ByMCqmXLN<9!X4@e22J(K-X5I}`-1^CVWFD*@r=Tu|@VL+J+ZBvyl z{T~>2T2~jNKY;Nmi=-adNUWMb_m0HRK!dJ_g+qTHW7gu2frc&&DXL_SVMI)=EsC~e zAWsKbY?y5rgSWOCxhgaUmm3!ZmEdi~bd-D{3qRps#Hk$k8+W`_2EVQO?A zdSnouA<;5yB97d?uP4!@YtmDR_$$EIIjJkx6lQfJ;hD!24+TvZqo-#@m#R z-v2MEr00K8B{@%N^C3!$ABWE)a?F^0XtZjuzv%6ulpwGJ$BGpmT8Yc%7l6QkhPryr zO<#$9DP;_@js78tNhjp&HoXZi1 zLCZt`2f`$!hvHK<8c

    oYH`U3&Xc*P8NXnj*&fC zSp8`8Z(c>CsHmDWsSBgEjoW)hB5XtJKu$%iOXO=Kl}&E_-e$n*Y#W zQs?aa7*7lOJDmr5{+BoBfdHZ6W{PW}a&~)@`3*1TKR7NabG<36t84W4l1{s@D)Qp}!6CEY7a_I{FqYz}a*2 z%>aa-;Ga)VH@wBtub?ItZVQ3jK4=TyJSqq7z*+P1^tFD#zsi(2`AC zh6i+`2j{-9#`!qR-PDPRR%5TsX&jZ38rkixFHNue+lwmbc&KpJY3-GVm{(=lRc$jd zC@zS_N9i5LTT)Q9+Z{FuJ@F^Jpbu+yQ|M6DIzMT?x9OCJ7t{Q`2f*N{e@&!eW75OGVN1u>)$BafiA zK68Wjvvi1))3r0?@tLazb&K>Q_0}VlL0clcB$tHvpM(B^8sZUUl&`DHwjh0lEC!cS z4-Brv!_Lej-T^q9u%sk70=?O!xD;zI`I10yz{@ujO1QB%DCc%HW?yQDm^N_Jg1qs} zw3iz@6tmpXAONk(&?)%3BhaDBQc2?o&i2-@xm3*dLsXOPK8{AlunG^BbJ#YFC@gh# zJ+`089;(2sn+iTfku6FEhA|4uMixUlx%V)@4k>Qn1Sj2D9arI+iaQ(zb>dFgv|H!c z&FLdno+mk6`;YKk&LaLTdo`{>Rrt16413M?uz&HtydK=^J@`kAU3Av-<5@MXTXn83 zZBI`gd>OKJJkUmD>^LW&v8bW$SQ&OOM{)r?$V(Vj^U&9YrWi^;=T4(yoXh9~crZ6BNP)tyBFEuX!1>U75PI=1NR_m!Y}@cjjn~q6 zD!`6;{#~d8g~xNdsXM*?;1pew!nVdqoGZac-f;;dS#0R4*yP6KmnQxPg}95Om&Ojp zpm9XOy`V;C-t=qFX7N=m%VSW!ad9GxIV3kYDl@l|>ZkjFFt6iT9Gx~ucTp@l?A0(` zvU@V2CmDO0epTdOl0G#|mygY*nYna#(JdGHVE(}rXOn$P+ML+qy3tB>gx5B9&cL3U zuAd(o_AvpD-=frQkuy$nlp5zC3y8SOlS58_m2?JMS5H}8AdCOn6&v6|w&88f6HsD; z_|W!^^dN(lrQb2Re09%!JD=e;Q_+54lcOMr5q|ci4KT{TJ=^2wsHi|4T;&TG9KfR5 zxnow-dD!opzONgGs@EY-(N(7-#B+QW<$mIQnyK9Epob6(;9<64bHG`X^1rjRrq>;3re59S{7VFMIi@aNZAPm^$}b2JPkc(~Kf%a_|OTud#XKpWP_Qv35qj1_q#)>c$hiO&2-c zO|^6(c!9XjmvZWRD(dhRf{A|FYq(O(bG#fNO{9-MpACz7F(<%%jsIGH5VML@3Y-o# zL6M4=Ba#dgT3UE+y!szB7nCTFSBV4M7_GCto5EFF<>X!dg0}{JEcmK-VsGWTUo_UX z#h53FbB8MWAy;n_kl82_?09(kZ}fhJN7vc1pPOzTjSx&N`aK?N@V#u(P*s8>P&X)m z1o1*{0In!?7-={VbB&GRpz!rbDqqpiWzFkQTtH3P`hCrf8$N!>-Oj#+a?s!)@^_$U z!92nA7ix>0GJfZj)BD5}PEQky8nc~;y-dY4cjMQhk%<^*;9zTw0*~Z{VcF9#4X;)j z!IVi+ieiNI#m-^^kU9Dm2!5LmnlS`e&Z4<`*n`d|_G8c*7>UYCE&hllsGaXibc+J9 zavbc!r4Esc0;vaUMRY^?_F(7&)+(ih->f<=fYEJveDxvR+#h+PZm zmaS6y-su(X!Y=fG0hy4_b>2o)CG-aw#>c39Lo4v}JdjBEJXq+>b5%`EMLX@U;I30t z#7rbd0#AJmCzWnwv^fv!`$$7V|5bqEcf(7cd0Ysj*jN1z4HU`*$0mkKxKW`r_fyg> z^yJ_#%wNbbhjE4%6D^tWSmGhCArFpBz~yr6J`TRu2p58-IY!6YlK6hcgv=V*KbXqq zb)k5RJTyyJ?(E=wIH9Y;5NLSBndyKIJ1Rnchah~A@TZC~DAme^#`*2xIz|cKanP#9 zhM%OiXF)~~wuZm;>S$5_6PpQpm3+Ei#~wi&B;Az?N9|DYX>wDtoG(x~H>$CKch;sC z@$>+DEVG&a2J;PckL0$`$z5MPvWihY-M${me1(%rx&sA@%UIq?+`ExKi40O{1njHXIhzn4=Ww!YlEwN} zrW)m>{ARza%hW?XZ@_~$@sgeMvUd2`?886xfh?A)@7T*$O{lxNh`E32Ec2%^cjc2< zt&}01;40uYx`%4(?I)V6smA7F48NwP34d^c&f@~UT*pl8@+JM)_-{KuZF`JWtV^acbs`5^-4|RkOmItgW}^nPhe%sMU)OKW090b()^?` zwmI}?FgcW89e~U6Go@&kI}qPz$y71rxWIP-9D%=vPvui;B> z(Ys#7iFA4xO+S>9+(-YlLy%!%g+*znj2^{`^1r``#g%ws=U1U)ZP*6}*)CCq?_~gO+?`~Qv0l4cP#8QBc>QRk|2u{ILW>p^Sa@Lg zA@AVH1AkkK(zOu{s}WB17Xzw2wX@t6{JPMzjqoM7g1e^#l>e8Lh(5Wfa)>R4P!?&> z%mA$Dw>9SNr3x)~!@KNoB;w>Qgq>VN$q@w_1}xW*z5u#`DimW>D_)SR}nVHfAnPGM?XJW-o%KjBz!Rkm>*b?BXorOE7yHT)M_xLg6??(VS zXE%DtL2dB=OZ0XSvz*U6s^ z&+^yt7+x0-o6v^B4F|NhI4U1LgSIGYyk(PEGiVp5GvuhyTvr;V?K$F3Qjfr95heu3 z|7VzA+ZY`=MRb^bRAK+Q@1v6{bSu!1tSuRBlo7Y@31VB_4TjB1Jj?%!(#iOQvfT!% zmiemXAlAX_jb7XT*NxmCLUs>V2@VIwRA92yjIQli#*|}UhgCG(Ld!Z8l}8`NR3L`M zEoZoG6mn9Ivvp-NiC+jEh&NcmdL0%XNhYyXcJYf_h z>$!nIN8|VkfKyas8HJ#-6~Lyo#rrI?qBO!Ac?#NS&MySRiMXl(%no@~19V1U2P2L1 zr#~>+6?w}Q&tmXx&pW~e*uZ}8!|azB-@MuQchM)YUg`Z4(}YXNLVg6=mqE#Ll#$-oWW)0n=ban$rkg6wN;(D;@N}r3q-y(A3R%;Q)W{1QWr zRV>PWS6<>Kk63hItTEmOyTQGZ^7Q|=6kf7X9M~Xt= zr%=Q>*F{Bw^v9U#X$5YoJxg))v*0ZnEGpX{X3yvG!^9~yiY-jqYdgf@t zaK%wGFX9xyVSry^(TVIjThwVj7^KFS*$SA3Q3amqXfBTjvNO{&#qk1sY=C700Ogg- zun|=V*2}>tHT*M1aoqY?AdG)Xu8Bkv)(k=Fdy6Cz;XFb}3Zg8h4=SY3nHD3}L_ddDOA9~B$n2jzi%mZ)#Tp&qfGELLE|$58|C% zGr{pbtcr<8XagTNJ^@s>L4S-6f!Vn(I1uNaiI3P80QcBlALnt{5JQ#0KUl0p(v{e! z&!A6ua}v9j7{>F$MHath`Tx?s3SUTGj3+sI@=XYhK{xs@=%Z~9EGgmmcHCye2DFa} zBK;v@cz$C&RbB15tn+#Ur^t!&H zBs|L7rNCk)x2sh+(=Nl&`|=%O<*18DD8p=-3T`NZBZvjmyDBhUau)s*q2t(w#(0=4 z$SWH61h7pFjd;xd$dYrxj@V#SgH^a|8#RrXkLmC&Sm~{UQHfcs?D0k4Z&u9oKdj)LLB)W_C5era1mD$ev7pL_WrWb_71zz0-8nh&fb{I2KfKrZ-up zR0{C<&$T^Q@Aw6Zl!ctn?B6I?%3KT(AxdUYFe27v2-E@3@_q62+tdulB;f!Z34y`z zF^R|2gqBGBUoh$v1(Q1T34j@_s1z)rD$}8$z>#V%*$`qhHO>4QRuFKe82c1dCLr); zXfR=IBZwGiN3IT_SM0sdg(&!!G#QDSuq1D)Y|}Gm!ru z+cdyrX3=>kdrs+KAscUTs>PhC477SmXg3{AHFhk8UM;%V740K0o4oxw_=b=dG{zIi zqpBXnjF4mf{I5#FY@_l9x9RgJDTjXewIJqQ-%DDG;KrXh4 zLwBlBn{!G-;xuqYaJ4vm!5WE&K!!k1;~%p?MRX6-yb*gN>j7n$=#AmXTLe!fIr$&314B7zBAr3Q?1u7b(Qy^vqX{Kbnj^en6w59Nx)bo*{E25337l=Dl z_`ByMd;2*Ofa2l$$cBqb`Jl9{Ga>S%)GpzhwX(2rm_SvB(YW0AA-H4`Jdp@`W#A;k zRlQ=F3R{VARw1KwcG#yaAgh}FV+4e~49eQQ_`rU?(w?@`=8fUl;)k(Rv! z@4f7tHb+8JNk!2VBun0ig{Jub;0yRDYI7|%pmhqmFC+tG8rZHd+cfG1T;Zh83rO_5 zfU&*giIr{<4jxFZz3wM|7)fqus4`;~%7$I~etcg0ICv0exh#hp8fGSr^nTOe4fDi| zqT;);ut6{FmhY8v_Q>UftU1LY24NdONFL{%^b3K)d?kl99 z)o71e?ef(0XmxmIMb~Ib1Lh)DTGP^$fCwN=0aDAm4hgfZ)4=r!0UI*I8_N060GRLp zpPl!95N5mT)s2X`kjrYZaRBVu9ExSu*j2ynM(PmeZPuQOY3BmL%b?Dd+6O^6TAtK zdH7u!8q9{(jqoNwu68P@xpbP)hx?C7!?9VK@n^U?q~#;>q0wD}um67-84T>UDDmU|FSH)n`pq)X6Ghd72>WQZehau#pE#Retk(K{B|9!aQHsa<6)EaRA3+u_$ ztThZ&b7=%F4ne}gU;}EP>D%a9UaRPbD6PD#u3w_d=rCPV15QM5cBJ?etjg+EQAzpZ zWmL+^!-LdgF)k7Y#vqOHOt|5cR=-|{HLIt=+QX;|>*{J+yL{1&vS}!N!4e>oo~8qT z;*wRk!WR&dk}f=u8Yxm20AH#wliqMET=<}Uo@r}16lmxp=p4eeFwVW+w-BI>R!SX8wRom19X(luSM-Ip;l= z8hrAkMV{~CFQvpYQ z+-)6!{70Iu8{~kF4ng-Qg$~>Qx{9XFqokJ@-eBhThtVk~9-Dm<_DtaZQ34;GJ%U@S z=U->(H1R!@stanl8gt3}u9hX{Z z|NKoFYLLxWS3D$qb@4FX3^_x>p@=n18m8$X{|3d5hwwE1`VejdNl7wyD7kqtbhCl~**t-$2`K18Dvt7_PD)DNGURbfPm3W~&W5hwb?q zR)x#kLb6tcn;u2Woy{k{qqBA!aqU`;svs|fOA6hyW<_T>zl+f0#qYSb40;L<01Xz= zl;lq*_f@(o9TTOSD$668kehw$|2w^aN(%vL-h+cAhR`{MUr`=9Wxb=H+zADVkHnEr zUBfIa=xnc0WqB0W6RO5n*Pu`aPe6Ro%Y1SKp%B6eeMWLgNxw<>O!X+VErh{A(4p*} zbnB`)-DVP4Q<9ee{W zI8^NoI7f!FJhA~ogK(QaqfsoSDs5ssnXNFDIE7!SO76-CdWRZ^)D@&UE&F+|AM{&E z>I%f)vrp#C|+Y_n9>XKC_HGFcV}w_}*sjK$1R9NpAaFje6F>YEzU=nb!A|fXz)M`5lvFJtUp<(ZYI1 zrX^bE)uL<*A|^g|kMIB=sd#ndLYNmX`$gMvTznZ(MY2vsukQ&BzyWuK+l^s` zR0XYB)ZrbrjG~_~zd?2=%n7s{mbD3R!A`ZnqyfwCF&=jd9d3GKunsY%hFO-Qgg&uw zBKI|cC1xZtd*Bly@N|?J$%Az;Imz&@)$nVWI~Iv+gUm$qx~Z$gUh}M$eV3;bvxK%jU~{T@NyvM=?{d30xJK#rm*GgHm&5tL3Sw z5EPCQbNrHWTUn2csW41Rhe=M;LY*aIV726_zWb=+R9aiFk` zE%TItHJYksB86j-8R$Dw?M8Hu4~fiPi30D`f z{F1PnZlyb2i_#CEY=y{JZk#_=qj;E8hq)ZCrUmq9>oOT8y;s*O+z^DFc`d1T?!F?; zX2qF7bOzHwUkYE%VZrUlHPxt`d-p6MD@U51uuLXhu=_IWRR_q@$T*d{F4E<}^BT^x zu1C5#O-PU-Y7IOSNQP@26m)5zB@{tIA%e~;d6yrrVyfULEjcDysZ6mlh0YgMdaNaspMa zID#@zPoqob$iwOx&a(XAWd6Vq$Gccrf2_1*D7q@})~UBp&88XA9do5+N<0Z&IQgOhPXeYkEecMez>>l4NdjN@rKDJ`%6A#s2VxGWY6$6LEOqY|GgKUFx2a|@?`ini|IqiStHAt z8O$c7B_1zk2%~W>^_p@-MlxYq(^cD zaqC8M6aqc*GSN+xqcCl|fe`3`@XO6Ilg2m8SK<-ZmVLq(L&61GMJU;Er*(cF`H& zD9|O~*<3>}w!9{qUo|qV=){TMzvUcW4^s*ZKMoOZBr#(*-+lOs=~-a1>AB)e9Y0o2 zAERn_Z|AGP%SULbgLnlHWUi44MSiUeehAA?7$#3jqj@UrilBB`}a*5yhW-ZZf%{oYDvr+N;~t$IZFp1`$m!i>B9;}H_^bG*up z%_h;Il-u)JFD4Pg)j^i8<^jb zZRl=6&@!t-uEU{NMHT#|KoV%|F(JX@fOAoh!cjGRzApcmpZN6n{47=+rcfNA-RPq1 z;co|MT99gk6tMcM3_`lyhvsZ9{`9Birkg_f9lY|2HXb{s3=i z@@``>U3kxr|578KRMM6j-)}A}sa&$xA!u+gJ~9j)gfZo#Z5A6 zwFR~QE0a%{;Yg${?eTs4O*I9*i@67%V%0x|*;s#q=*HEyff6{*n(~z-Q#eQ&6>y=ENDMpi(hkHrfSapS` z9QS>W*HpQJ>>+p?6co9-ae8FAO08GJMU)*iktInEH~pM@qu1So=xeLU1P z3Kl5&E1@O31Y%dHtaU2a$b>K3mT@|g2C*GvLl8MTG-D@{NdI@s@BS@B?(d9c-gUHa zRbecK-XB=dS|aNzHj87#l5pck#?OSe&6|pZe6Ca=tm4Ftyv&CxD9yrz7xE9@4crE; zfKl<*GC%WAaafC2yU|9RzoTHza)TW?k@A@ezs^wDUIL@y#hnV_@(FWa2z<=J&koUE zf)(D)>~xg6sYr!C*jV!jf72iSy^FX_h5QyX$yJh*@ysx3LQpnOH5mT!N)BERb6gXL zmB2Gf(*jI0D_&5PRUqrQpMOeidxcCr8glzzD;xvqXbAtg1^_1+m3DtWgmITs?n!=L zoug|e?-!be`AGC+a=LKiAhvZEoJFxDoVa7W?w5(=J z0t;Uqv|?2VrbAEj$6lNN!9Z6UHeuAZj1IP5l#?J3G^^7Gdou@dy2-d5tHoZvw;a>k z^H38WS%oOha~kqbTH2D3TjKda?H5Q+py5rgIgve(-s3%`j$l?ip4G6~iB(=xDIT+B z5I-~wZ+fIs&8h1;f-|dT^sTG_bC7&S1Js3kGbbydRV5DR9RJv#Vqkr`^@%9P=%5{7 zPq?`^w0PJ^$68XXN8OHnWJ)lJ#mEf!S|zVRSLKnossSY&RI3Ble7JGYG*OnD@X`LYx1p)jnv;AIi?EWM({hnu0i@+2hWAIK4f6#8vD z#S5mwiC(j#Q~n_njO!}>`23MRrc1hn{QJLfw*wQd(7R!p9_)H(2tj0IxD~FWAEGym zzP3Wc(+T~&WvUHk4x^gHx6;~5>DLT%BU+yGJi}iF_pB3RdY+(^=vNM6lkh_aC#`tX zC$C-12!cjpyeP-`^&d^Mt)>U6*qfGrX~#>_J}Oq-)5rf@Y|2W)mtAl^>sgs)hd>uJ zv9Q#{f1W2~Pz_DZ^fO-DWVoKeKSn|vq+n{;D zy=Of}3#GzXgiQ!-2;BJ(K%yU#WzSCI&mvCz{V`*}`#(4iVTDY&cK3p*C;<7; zbI?dSiEzA4U5S&trnkg}N?g^4BkwJ?%~R6*#0znT(}T#rx*XygkcvanL`&8ZO|J$$ zqfd&tXs$Iu#Dgyrt<+9idC|8rD$lS+#U#o-&72t6jzm+aat2P$ zT2E8)X>nbno8xJ*Ie>{XxI`?Pi^7qRjO=;dKrm{LMOG5|iFI^=neUiSwZb)(cN?C{ zLfg?RnwZ4PqAdSnp>%oep1!W#8g;*sUyEYrb8Ps+?7hnP{JPPdDkX1b9qx^ z1fi75gLw3mh|FkvZiR_4=w@Xd^|5D!vB;kzH6ppD#5S=;F{Ax~G*o^dhI|$IZxK0_ zi#itTht_F69#+|X1(w%FxWGm_3BTKQI`K^uk9oZxRX)p#@A z{-`1WHTv=J4TKz~+<|w=Kpq~12p_U2R&Wic7qT^;3cf|MtyaL0G7>+E?9lR)75(On zEgYWl6NXadp0A41$O;uvY3M4GM?*CVsmutrs?MEr&+0v6(<<@v*_;8}e>1_Kq1+#t zXTLy0^FC<(AB}<`BvaOs11uCO+%MdF8HS^Uki*{~rQiDz_fMF{Qkx_U%=i)69&VTE zPElosx+5L!ZQN&Yx37u3{B!my*fN|gL!VA#6q-y<^KJR|@(|ymcMdfpex}*sU1MX2c{Sq2gY75NGYVZ2y$_84S^qzpUfZUsHZv5Wg$1*1`ImgzEQqh@_c$)xaHs-f>Fo(Do{0gr;` zn#X8;R(zT58Oh&i;PooOPH#r{eRr*GjIWraJ@M+P;(~7TD5aRL74JlFB5QhuB@ludaxrrt;iB&g>qHK6J_zTVEJHa+4k9psIM4h;Vp!FPHVefh|V)x zD=o)ZYa3Iv&Keyk=+bO8mtDtdUQdaK1;O$!0<#tbvt!Z8KKwBrtAO8{ie7YlA}kKB_d3D28aa$eK<7{$nl=uE{&cXbStJ_J`+8HDB)f{n zOVqZDf*TX?XU^&F%cmi;;$;eYRZ0NcAlj1Av1^KDa^b5<+YK< zV78$pK5rU)JkPMM**F*zWr-^hf3;&Y?w8N}rCZZ(Hk$VNLkWkC6lYMvEEan%bI~+@ zmXdo%56w+H<1klZp?Dx- zHZzR8Rm1HsbokIWox8DWvV2WRxkD&7-AQtjVRRJt49TmbpK`2{Vr2Z=!wg@e3l8sJ zjrYp6Sy`oxh_54(us2CuY&>6)6N+xe)|?1^aOxl|tWpP^{5i&vg^wL}1d@@Z#wIq) zRqpv5@9xV9Ff4qToz-LugAGl^OkNn82cg;s9THv}K#hZb1$yvk+z zDnZk@d!-xGg-%pCCN8g}OKrC&VuxFz)Gv0cv5les$Ae<|c8&>!*Yt#C6K2rX0s~yj zfWs_vzQjMzw0lVG-sLMuemsQ6GFwQImcQU{YMcW5h7wHl$T4FiBp4!vrgYQ2 znYZp^p{@(J6jOVKgR)Lu?{SpzqEZ?q1Ft=C1xYQWpUxL$!p7YRL;$m2V#=wuF0~6) zOOUVbnQe|!3(FFI#Saqej~uv~GPkG?|JN$Mr?#x3m`v+;l%aS&E(tUioSV1OuqGQ1 zoPb(#N@41%O892|=ZAYp_F!*R2ZC>E1u`>cR1)mh_KhZ|wfJqR8fupKINWgnP<)?V zC(JSwD|rOQe^(frExlUiv|~C^6!d+ScQ_@#pv9&yRpUB{Jv!M+jpWl=@<)nYa+{|r zm<>WRw@}gQkx6M(+wU;G64+egn?`4~g`o)y^CahO7H_wI9e7GlRus=rQgg)%F^W#Q z%32_SLxG~EvKCw_*syI56xPECPQSp)k8y0wJ|b}_B!h=M`6F36q{v@S_x?i;l$wH- zUQ_%%iyhb7Ut9hOzev2do!R1WQS;!Dn|zzbwID#|K_BvA5nQeFUYQQ#2lqk?L1lQ17}1kJzqLAFpnHm^YbiNcz;^NCzVn4hQ8?w z$D7X?V_zl@lqPir{f3ajD|NPq_56&H5HXJ5KKQJ%td=?Xs;v08#J-bap=#FxWmApi zof3E_5YLXk#=)yv_`DkVz_qjPr_#wN-XW9JjXJbSjBjEjUKLMpWI z#$w8Ke>{8|ZMc@DYj&eRlwTkB?=KJ-2&0nvejpM;MH;s~X=~OQ8TYqBI-w-xD%ckc zgBor=M)#uE2Jz5pc)JXK4MJdkuKpo+P>o^1=fa#Ba?~XaUBVxWUVh1(fW#Bir(VTH zH3>|nT-j*aUGyvLo(pfOL}yyhBlt(KZbuJNf5Iiu59F2TN;}Z;oMW5tl6#i$H5WcG zpwfkKU3tMW604=pLy)FxRAGbiN|*-0u-|7=xwn$Y(-wr8zd$Dnf^p&F6lSv(7y^s>D$*5X}XaU=dv85Dq0PGLy*E##hid4 zT>HdWUsH+3+UBQ-a%{o3J2lX7+T?W}hD7LlRn#cO7t@4clFb`cVK76inU4X0DSYNL z#Fr(<4D<}RS8RGgM;b(Cyu8BY`Vq|j%#Dz3{EMpm=Vb@K^(+1|@P7qOwt^-@E+!{h z;F8Vwtf8RHd{vk7J{{*+f`f-Y4{YhMqMOJILExjzsCAq6x#6Q>$OW4PX9DFnwORNz z3;8=4EKd8m+bS-M!(ykFzi8+s?SA|l?26-o{J~)Uxk1K#RJ5iF2@SQ;&TCY3h=*%O z*XU?h163g&(ea-KkZU|-WOG-ng3kP&gBdLz&21M0R%v^4Kl6kHj zWa{vVrbiAx7?D>(+srps$0Av2W^ju562YOEJUo#+A$Ml@D) z6Ey0%uIgDFa(_Nn73cUkRskgN;c3uoC4I47XH0(Tl*?3nuiJ5*A3ladW6l=h3Z?4l z#oS-!lKGA&UZ_TfT7NfxB@3&GPaW3%n)C)Nb;K6KgAQ^{51SO6$zd5JGa7Q_K9~(} z2!f&LMa;o7gW>H$GH4hg>IS#onTl7$^CQS~b;(ybBLjp-87>(i0&!+r4ytmN_#$%z zeY6nK|7wN-;g7}B<*wR2aY6^YoK015r<+q2Qss-*i;nFXEesW1u$PMss(JiWBrF0SF7#)j5AK!DKmfSPd7IW@Vd5iULiUg{SjQQcausWq(ckuedU+&$r@I|$mZ1m2k<44A(ls=c ztG1od*p3B$^}3vLa<3}L^pQ!kjBN|IwOV9t-O^Ma(wWIn{nm_EL5_VO4qbR-_P=Gqm= zOjm><)vzQV2Ao%M{6sQBiNK5HFl(7e z$s;Stuz79gfNJ7jpWyXXSun!zgr#3d7-4@`PDU(sMp#$SWFSG34^Gn>(OPAr8bh)l zJk58Riq8k!Yy&A7%NpNxR2lb!^8i+?I01r}Br!EeaUthn``N#;_RHZ;hV571so!dE zC)&LPyu}-gE7H!8@&>Xx6h6?oKEkO}_PT;(sfi|6EnO&9jzstgQ(d5ZxIMFpSF5Bj zd&-FR0SBlSm4&PMDs8yuskkzGkB)nz)l8-b)RLN^Z4wsII1)$9&#J#T<&f1@*AVGoCG(UxUR%AsT=aWrl31%x$xomYza}CAVaX1@k{yBi`4}=$xhmf>{9%P(TyF&)+Yvm1d zU_SbNz?+--Mx(H@=p8tgfWiRhV+cv>E=g)JoSo*aKR*g$Ufi==Je1Y{7@rRPH~Cp1 z=nR`2q_7_5O(zNdVst1oimku^nJdYwJC3Yx0e+uF4{?|JVXdm=#HILloRtwWIP=5)eS zJZwQiD{ogxyOZF`G*YjJiyFgSj%u{bQUS|JK`9uvF^lUn{sZ^HN@8iyuoA5@D&2ETD+HvoT7Uvc}x3huwt}s^>wV|TOF`ttp1a(wcbRz z*m1&4Ql>>oOo^f6E0dTo%w>W(AUeqw%Rbfr@2d?fr_BPIkWI)J2}TlWf{WR*x&e+N}R{M zJA~9I;L9!IZ_#p(d-WbaxElu}>#XDb=(~yv>k=gl^GA^LP&&6pqz7dEsc2h|3=$mb zu9!=vWFvfFDfPQw5_?eE?PD6I6C-u8tH_ycAc-h)hMEe|Um={hRqqWnsBUuPS~3&h zXEhcCYe$k*(R5t}**?a@nkESp{U#2T$kJeYdo^}-@cUqRQo8L2{t8RacZ?>#gv)DDAQcT2Nq9h#X5tF6 zH^`wW)Eum~2K&GR1zYQ?HQx=1#i2$ySuWCrIE^Q-r%@G-U}>3--WXihP~}1&k8TW_ z#{D;#40R!LoWs9nPI}HdT$xoUgBK$5i)G{^#YrKAEp|7UKtt~*TeH6}l$z8pUs66$Zl>x zT6+VxG78qj=}*w#Sd)E`qLs-VQ|C=aq#rf1(mJXJ{XpC>FacKTdS+q2e2C3E#*E=M zj)$lh;b1J^=}fsMURag0KqkJTBxlpPKC}ge@3tYhPo7mmK`Q*%V!ES|-jqQ>Gx<6V zRD!5r4WS`4hsf*bc~nE*Mf{8Y^%6ZUXr(AWadEt9O~C39zhXTOr+z;)m__3QNS=y+ z#pOUk66s^EP-&H~xKcZbqm9pZ_|}Z;c?@e*$dt04+6hB=5+ag5RqUrEaV(XZ^FVL9 z6C)on1A1fG7W}jmK|Znp!h^5h)FYXnzRQe5?HqC|$+ID(=i|>r!k5%F_$nn(3rD*bjGkhajuE7lKIl0?Weealp^6>UBxVT0G zjq^y+HSjW$BcFyeBe!%Z=U@%WY*;fJeh-$3ulz9uP|ACXi1^M|{Y)*4-QFk1Y`aCIns)6V6WOi^iY$ zP+G)7ZUFavHur0Ss1AY&I(~jYTY+hd5$Bm73UqVGTC!H<_?xfMOJZTk()M$F<{NOW zT`U{URM3U7+P)r~xaf1GnAHCJmeb?m`^Y>crC2gWxPOO#A3?r-fG=AA2Kz0Eru711QWMuqnE9@YoMTaEG0}O z7m%9vHrg;ml9?H>Z9Go6PK`tIP@0AwDRt9kzW`HpZrTUDys+(gmlFhuz+7tXiBIi| zW%OF1mw-ssa>+&TJ%{J)jHl2atp$Euf0)ki9{mM8 z4iINII8B8gWLduULFpwv`wy(5qmet$N@o^89#R@O_c}V5zGvLy8ZG$nfz{IW2=lUh zGD*?BmuT3+2~J*Qdwvw+OmAr+7x={OFoR2CGP+e>DjfKqzA)SsP_tzD&$jtKnx!x$ zx9O=Bp+1Und!92Sg;J5cYCfDb7hjj#)IKHG{e0&6~c+I##ze!v2xFC__Nen$SC@xGZEsLChH^}J%TRaURiz< zSmf}yHtV;^QI%5Oiv7ZM46Y>wmB3>%5ZuDy5P7T1(|7p-@*lDUUvXfr?IE~L{Jua_ zMY#PjQ?nQP9azCUewzP!CYg{7iR~Rp}HhJ8e_bXjvVn|D!~ zLeb0L{|?{zmvhO%PI2@E{G}s?lhIKmRO)(w=Ken#LOC5`ljZSHKB#Rv7MOzvkXiHK z)EjJVqX+(Ww|#Fr%7D5H83_YQ>Foe-h{a0uhiT%s_>=P@lEbZyqrz(3b1)Sb>$+PB zI&aEpBe-AT2I)1sayp`|Hnh!D6u-4%FK=HHcv{I2eQ z!JfR7sW2Q4?k=Rs!Z6N0h@b3lsEUGYRFjVA`G8KujIsAnm{VoCe}L>$^+%E9;Ct_q zE$ZS+a@%p8p>(bzir=fv8wI5S;xr|E+#u%ZFCXgqh1^Reia6uf;)cjul^MCRlga|_ z@;L7198I@C(lZ?SioYx^rP4sv+J1{|97R_uCK$GlJh2mQDQ(yCh$B302oj$RJ3>q= zSn{68>lKbR$5=5y(N;sx33*0bk?JhVIjNKiNS&)I^v^_Mbg4-=($09+ zuQ*6gS$_}G%aPUi)-*%7UMh2yL^2nhFZXQc710JA#u*_Yn|y9aIF!LIKm&mRdea{Y z;fgJW<`XA(ZsD#6!sZ+x$WyN47H*O+56g-iL^&Ze(%g{5yh)dG4+@-n#eq70HoGBe zkbM%xeIuZg6<(FQBe(^%)={=7@*tXdU zSwj(b7h~~~7e?oAk=yi&l5ujki!>^rDMZ{klW8z1_~pUU7Yak%(3FMr+ysFuGLv_P zir+er)zw?3%c*lm=E2ljZk}yYV+NDI_cJm!C-xZ30E=xix}T7@b=;wHy@y^y?D_O% zT7!fp`x^N4{n)cCGRF9MJCK6neQ{1V8~ zF)(*B=!2kXm)JK%DDHX)s!S8-LGl_3em-e18wA{@^XDfVm!`?+i`_%`4{_Fws_gp( zc#V-!L7;rW6dYh=xq?PU)i;WSLBS8qO8)RZRPEq^j{jwhI5!QkA?s!`ayhhF>D>xv z`|y(L><5<*a^srC*?OmsWtVL8JnmekV-JiOS3AXrieG<)j7YZlGR#HCCCbzFi_v8L zpIkWYctbJNk}fw*S!vX9Z>HY7*Y-DDA>C7uArGe#_@%=QH(2Llt4)_Q6%z&FhbfBD zUY-C(s^e%zD3rTv&8Z3YXf zDNWW8Dk;ZjL_iYS*}Goz_ixo zo`r=^@6*B}&9U>#B)81+o40#=(ny{~ka?Wx_%lhu%q70$ZXYEK*? zXh-~R_DA@3J}wpJz@v0>^h|AV^Y5uO=C6tMTHwi^jIjUlEs zaAcqO9D{D*=UBs1e|oWFmiZS|*4J`cuw4lU(AQlQM9XSzE zx)cizrXYVOo0J;wIl>Mel=wrhk7EQ5UyF+ABlKSEwa{fI52nvXy)ie$it~#fs#`zt zp&X{47i0J1Dv+krXL<5g3VQL>l|e-ySsS8XQ1}uHu6_KEdAl#ryP9Ks9BRme9y1Kb zVZsZXa~fQXghQdkW}@@$+fac;uvwcGBK@%0ptC@wiJz?}bt)l)w*~))h>d|GOB@@Z zAs31*+{p^KTiP;3JfbkI4s(o8NOZhI&0w~A9SknK2;WWX-NsMndbUrU!qNXy?$T4U zkHUm#enuCxMZm>GE*?XI)iw2))p008--g0yLPzxU(P{i)tt*V~w?2~b*Fz1 zVUS@3ih{VBDvWcBgw&U_9;1~>GVGm^zp?>cfG;hU4^FkIEUPb+Snih62dO-=H-LX; zHBNR?@lk(_g*|zDk>+8$a))86@Q(?{1fPdN51=`j)ar{!cw(StvEkrKX(1yN%d>0I zDGok2QWGF=HC$Q)VF&pUYN~$sZ&ahWHkEl(_g`E>+f~v&ouh(LY>Y=qQ90|bcXMxX z*5$cQ9ALz91F~T~i>-v=5=*~BKaWl|dG}0J!Qv&o^IZ0v0Q5|&MB0p)?Dztg(eN38 zBl*&82nz6{F)|oF?J=G7C!0L35^9e1`6$v`#r$k7q{U5j=rg`Hnr@OlrQxuGJcwr6 zaaJ)8#$@yak=wy!l#^e^OE(x>%NDqyFNin18QA+r_!cM)IdS#yHT^>|xuRbXsP#En zXls%Jzt5$ty>cpf66G6aNkn|dVo9Qzlda{FK$DQ5q`S_8)Hp+2YCL)o7B!%rJknX) z46p8ouLE0YUuhC0g=!U(9HR{f^;8ox3Eea%xrUgwq?fDi2}bn5SyCazQ%u374`~vM6^a%MSl%EPq;rN z>nkjIYjXM+@{9`%X%G;Dp&rX@bc}pP6MPDqsZ1PR0Op;Lbr{8)Al{oN-xT!yFNEHrW8onPnCBm$bO}1lNPzpHJ~`ljhezm`R~XZ zbH2oI#vbi&{(!QL=k4DOfHBT!>xYiF6+95p%G2<%7Ai9`@4dj+W-{%}X&oLWm zarpeU9dmy}*NB}iL)#F#orEpI$fBQf#or{9L`$i3u-A3pn+-H@0>5ynm(+TUz$FWd z=Df71#vmCt@G)Y^JoDXF?lhXv95 zU*6En1rfuq>m*aGw4cgZ%ZR&JQ>a2Pp!OE-u$*ry-#ZmOVKR0zNVtHVD$1I_E(q2i zm8V)yXH7C}T#P3iJ(U}ylTK0rNY6n4t82LsO5wofmDiqU%!^fG?m(&{q#qgh2V>jj z^NhI-a*hR3S^S3A$muN0<3Mpg|1v3^YBZ+16oTYt@u@8D+dY7;$FU_2CW<-q?(27# zk`iEM?>@}8q~!(B$)sI{0vLJ&H$;nPVQn}w%ea}VRG6fE=A+&Km_8Ot{c#_gHie;w zLfu^cn@Mz$*~}Ui%pv}!(oeFM%b9C44nYk%7fDayxsnGs$> zX*l?W(J|1a#rM@0DUU28gI|NwMP%(rc>4mH+;Sd)`I+1KHFE}rSjbD5j2Qs)ruL;G zSF3_+4n){d>>w8cs8R4m7*%^Vo!=6|-}R?cg=>mF8bapL^^Q#V{3*!$T z#-@#?v%|^xBJAikJ>C9OdYmxUl*GcGG1Q*I@ZPp}JY#p?6kak(fsQEq?%+MYZdeya zkFg|b;7^6Y7DP|QFp=@nG76Rjz`hPOve)Wq7J^XmKr)dfo3WBoT<4qKMg!zVo1JzZ zV$qL`E7tLKNRdNPyZc?PGsav#hdT(_hhz2FRrfKljHDf)<}hla&6)kTiE35Mk>;!6 zs7fRW_PdneL$A#iYwnZy1pYeD=Y`TSfjHmqEu=S)`}Y4s)VaqsS^oe3zQ-o_PH(o0 zaRE1QyL+&~CQKMG0R-7 zWu=8?rKYK+rK$bi^Yi(Be*e%T#U1YZzOL(ic)g!5_S@qz;$3zCI~IzDk=HoiTsA?f zp8<8Rk$un7X#J5&Vcy{4pJ84$-57`Sro!B8eoschivgvdsNWPkYHLXU-uLL|I(DmY zDBE&LUpRHIVHmJl+XxAJjcSIm&zF9#o{qs96P7U&dlhhPu`Q~LUwM!UJB8$7bYCcu zD`BuUf4juH9aB*t<=Abb3pMa$q2IW3_)sLhu^F9xZWCVdyhQph;gCz+wZSke)>#IB zWa!8TKHWk_->C+^784@$lOu!{cf&@L7ME5?&GpN1;UY4+=Ru9QoLM zM;9VPNx1A8+f9jeped_}#qAWo={^^I(#+DDKgkatBQM@@IQI_;Q*Ij^>iP?KGyID5 zk;>jTp&o~ix4`Z^>QJ#RGA|rHPl3TnOucas+sZ~*cLb1k>~KB_MyC+j5Ry1toQT#h z&!x*Ud<%)QGMmW#?Pytq)RuT+C071C-V>gW40nypNYAn5rzDFNFq8LvBCLuvOoO~V z(4^pV6c-=QE=Y8g!Z{6ZZ?&h$?B`kPir?7;{pI%R6uLIl+7*#e8oT}+PV1q984kKg$bjYnK=mNjL1j23T#%zFJEcXNzM{4!+t4jG4ZoBA=lx1iy$9=b-W{IXD}%nYp^UJN&4R3*~jS3!OpAq zr{NGVobQ9Rc`j>rARi%DPhw(^JWkFBskbIX!njz&%>=_{EzOf>d?zuTkCIQpUYBuP zcb4IDw#BZ0V3X~#;n|^n$(@D{!6gRiKBEe9=jg{Yw&Jv2bzK!nwr=|Ov^`M@Vd$&? zA87d9ZSK|t^VI8s_RJmiul(Fi#?IEa`-e8V_2HYT}4VSvT;@-1nd|TgYe3n+l!mUf-2*quvEfw4qySu}vh5e& zfXCGA5d6(Vt`l*Pr2S{i)!66ZsyyTX=|OEf`PTEq9;s^^)NV>y`kIZSg_=JKmkbcd1Q> zqxxnM-xGqpCckJNc{>=pO7dpww-W2F2=+4)*GPUgLq(mTQAak)eG5Plj??quZ{Zx7 zl$HI$jxwZu!j97Z4IT%EpqI%rC1khgMlibJ4iV!V4Ah=5xI(Bjm@d!?FCL>yBTHLt zUrXtnAm}Yuk7CDbE3E45uAMT$P#aFR7W#6})o8L7OJKa3E5>4k8 zO_*lw`xm`%UOoF7nK9FG9rV-1V~|-R-n4O%f;6o|f_qTlbg#35LBYggQ?s8-&9aZIK&J}+Z{z)LOZtU=4 ztKCJI@uu9t_N&-g&pgrdKDjdrALzHMJx7zU3tkI0Pe z%Y)TXq%MZdaaf6dDx1w}wQuCbo4>G@N@+C+BM?H^%3tN_X9}x>=}wm)fa8NwvH4;e ztP;P2*+KkOU9rfHEL`Tk-*=B5{mIR;f<=?Z@5m)qJ3{qw0`UEDFhov&cga#`D+~FI z_CY6J*}d`~vL}=*kB4@?HxZfE`Vnwo9>i~xJ<1f(gG<}&5^a%#x4BiIGD~Y~VQhGJ z7s*sHHDu{t5o{IDu!!cw@zPpkLXdB^_PvV<(YqE{F&H*og@BJy;EkRjO@`EyQ%umB zOPZI_wX|!b<0*EnxRyk&aIS?{b)a`^Z=pYn>=v7IS|(nw-H_4r?`hKwuHJ)|o~QKkZL+pw{UNh z-(My%20lt*r;%eJ+CQwjS-3LAu;(XoKap1|A#()(;dNN6JT+|ld;DP>Eo`t3mRWMjW>S>zwD*z@lX~6 zAzELV`W4#Ufhd_8`oUxf9tXDV^w}AvT$O8T?ro{5zllE9f*YhGwfGOiS8`1BTymZZ zN|i1)BBnP$IhY7aFx*dLpILs62)UK|96x5Jz7 zh{&7DvIlj~wdHX1jVc(Ywfr4>fWu;O8T{O26Op^3Oew*dL0J8^A9YKmIn9>A zx0tc*d08>7>{0t~inbJqugs3Pl`qHO1GX$&I6|4~J?q(vHEXTm{YZTfeK&}|{&lC% za#nHtBQgcp;p|rHH7?_{jO2us>|+!Df>RNvvmu;k%4)vPlNna3od4d4Mwd`}$4pyP z@JBje#(UaK&#kz$b>)*#Hg@0Vj+~Iy|JWzhN#y=3+k_E8!mMY>C=uS$T-@I2EL~dDiaTau zU`9hfLaOyt>~%F6~U}W~*T8TI@s% znPz5epVfVn$u)fQ6O(5;q^pTs{u+Tc5uHijX)_rvn$~4wdVOl!8_zNjcmZc+y&P;I zm%hh6HrCS=a+mE9mLeY;>m1G zq96J1(c>TiO1x^GgdNk6;@t06NhyDpN&Go#8zBYcF zoBx>9pkoX+UT}QQZy|zz><2G2A$UICPl`sLPSlX$D>ot5070ubQ|RERM--eJ-xob$Wa}|Z$PZxE zv$bs4f4zrfiIt^HJbsx9k6&k5=BZFuW>03r^!P#R-L0|}nOfKx2JZU)6o-?p)+4Nu6sU&-%-$kmpjaiV_iKwF$l93n~HQ~iT z8W!@Y^<(|px!B@-24T4V?k^7K;-UK$laT(G=HWAna<7S#8OAGK_FI@ZCT6dew4V2W z2Xsa-j&nzabR^<+{f{#dx(IlTc{tNt>-X4V$KZJ8aJ=dGz43dtB>dp8vV#y!+l=O0 zWv%UlH=wbL4tei52V!PWQdK-vQ-|EETG#K67qR=-WHvArV$zU!eEN~Ng2T(`_=EN* zzIum5h1T(&gk))%+Z~|6_p9*w&atIgBPGUBvNV*`<>mT(I=ubppd`!kI8Z3r#O_JK z$Ls%FNi`aoG5EqLgKzYfBl@;>7J^xtT09(I%uTK1ZM(ziZUV8ip5$vFRx@UA4qj}Ctb%*0z&)+&yO z#J8PUho9GX$-TAsdB=N*1@iWcV4B1n$MeS1wi5wXR;EGGZe3IRDXi>ze4l&u_(1wi zbn?DOKu`A;5f4P$CYhfZ$}aBQ%%O*h@nl=EjNRZWbADy-V8j07FVW;^z=?6&L%)!o zg!EV1UvL*_aFtcKdkQhet8Nv2Qm^}X{K_BQyKn)at4m|v7~G}MPR9@baaK6~@PpbL z`_419>bUK`l!qQv|HHY6GuTJgFpIZg8A1$|dMg$m!%%$BYvSVY9cT=SrLCeV@wgo0 zY)R<{kNL-77jjrDU%>g&*j2lJa(`#*Coy9aa`~qc!wt@#G4}l7+va(OY3f~NyCUi9 zzTv}m!z|oy!~uM`9CcOB_plLugGEda+L$1e9P5=%RncY!CC)|e_Om+Np71`py2Yh^ zhhoqz>%R&!Zv#5DgI*r_A19B-cy?>}dr1De$Dys{9BAQOzoY6)?=G%HmT?u4E27@Y z3qvJ%-h*3Dvmd7aWOoNJ<2r|#*W7x>@kMW5q#qINcg*N^bM@ZZzRzbal_I3}8^pAF z=N!&P3o6%@rvirAj^0dk-HCZoKJ6(h)-kGhDb^6XnFd>L2>r)9tWDT zV|@?_MAm+6Pjw7#1#aYP;?d)~*Vn`8Jzi&h$qpI5-qbf`nE86!{|dtfKVAz&~i>_EwU)40Wmy{ zt$i8sRS4=v3300)cY9clvAB`Nsf^5NIF`~li+v#smnzzHdtGZZ-WoK96IG5$$P%K{ zl(xTAxH+>mv%h4w;OSj@q?5;oh~J{%a0_3s50g0e4#ze8+^J9LaEUh5Hr{NKkVh5F z6gp4A7@)uMKmKbrYa;slGSl++t5EMKyMR_N$oPFiAhKz&ACl<3G1OqfekU~>Wf(d^`CltFctSmF z?0M0UrcBF zvQ?<9ZegG6c|u;5qQ|#HG-oYRT@gCRMzZ03*pPz?j!h5;pmRnunhmzX0WKbOuYN%H zLx&|Y6=YwTK2gYft=2&7D)I{T&Li85@6k;h+oGyRsHi6uhkIo6dT|RBuktoPXE2ra zT@)H3!WdphM;ARReGyJ8>x}a>wBSBmi}T%0q#4MgD*SlfIsBJO4#SjAlp*CE)7SrB zSxh$HKT%rM(6@~yXxT?mTiW0rh^z@~;mEyfHR@YvYAQdZ%JCoOWmq-*g0;?*Fiz(@ zbqnU<8#Lk5Tu-^bRz2h;UR5U9=!aSjPJh;w_r^JgvgdHO$@@vX$9Bfy>F^($g*H#p zo=CjU5Ba`grnOOms`uL}yyda(QnZ>_=!-HaCio;TDcB=4GEI!7BByI6_b_cf5{%Qn=shJ(ZP?C2_c8{U7f!tPQZ@fA$&B-T!lBg=5-?PH^thBgO$BAm-^0rMK9J}^rEmO?cVwG;mB#Of zQ!bB(N-cR5ix^t=g8Eeyrye8m7%)Dxv8qDO67^&(>VbF#lVfu&2 zOTGK2^{I?LAN_Zd3qs@%jlz=B4jxiM1Lygdy_)f^jI7cyInGvOL&{!fitMwb*gyLw zxQzzXmSLCzw=|u9xEG)aUKRYJ;7@YCd*qhR7Oiz`Lq=n%PS;rPMVKRcCYGdL1%bmY z9BUheoaow_gj-biKvY?ygC{N0ng4LUG#u}xyQU0%^3bKo@AKtxJ7d$Zh}h`$kFmRJ zJ^1G^Cq(DBvBXxbSCxq8H)72z@ORMIgUW-M#=Kzol^C-gviAEvGaU<(b*A`RZVj#e z85=*`9iiGG9}0g3ovOsPm16?_lMmRFad?f8YukYPVCD7?5|mE6z5!pk5u?Bwk#~QD zIFed=6jXk8aF5%+y^iP`4r$0*Z^G!Wxxzgv20zPxEdn4-M{-rh$?dQ9ZIw1OlO294 z;_3V1N-YzL(<@IsjR;|XMz5(lZ@GF6 zy{$&XfPoFl4-G)`jL-l-DaK|?{tEwhxP42Y26s7q&W$a`vzUV~i=6M&ImWXT&pdZ^4ZAS! zO+4ykyD{bH$)1wNVZ=vG&dS1 z0sBVRe8l%4$-(0*XP-Krr7y?zhLC?xLyr|t6O>!eA=kJyS?2WK@s^Wv$2Z9Eb9WMK zy6;lvKPACof~O=WmP$$zb%xj=W?aVv`|I4T?aMnP_9%tQT~k-PW;q-WMN7TjdzLtb zxWbO3u^9@-N+DQb$_H4j70}db7CxnWzSrT+!1U|VC`XKKjl?vEW2{p|-_>QC|~huhjbe~+1eAAjO-PDH_O3F?6wwSKpPf)6EpIrnX$ z3@2&Y6#l;Z7~5}3CXa>$@pW>3v2ytVY=ha)Dd;SvPs}pO$Om%qUsBHrN6AGb|J0gp zQs0we11^{LIjqXQO5%AS{?yqL{)J(`qOc9ep*pfAD-DMg2vtQ)bVHvU*HkAQS5EyA zQS9OcwvF)=j%&ZB!9%{T=Av2WXHt1;$xfw>VeJ#tk^T|?M)VUwl?mO=Y5(G1)Fdo* zZny7JdK$%$45_Yny4llf5I#^&+@va+FUhybq)CGg?g?zg5kuP)u+K(2o%V!9^)2K(5Py|7RNpNGi+otI;*-d*)o5Z`GCGdAvcsw6)QYP z&^5H8xqOc;X$!rtg@gV%(xM3Z8Q@hVqY#{hu2hUTUjjeI+G{Epr3qgwV!`K+>N?bSw8w!a?}p{AZF@@&r5e*bt@AlBiGqTx zx$JM}R^SuwTgTs5vR+$EK(}@M_2UHLszilaOu2^drVS{5G^kr26iglL~`vkEgw$^D+2cGF=HsNYa$^O z@1rJ4o39$vTvpA$9V2$*3i2paev_b`+qVp%Qyb7l1tzN48m#z!sHgk%X?Q2b_~*nb z5Qsa&>z1vFeAp4fVg%hHch4~9`6Ebm7W!V?A@r7>-NnRa?`Hf18(M|T#@`6`3x!~D zB>xgc3SGC2bJTb``*XGWa?|gT%m^44qS9wKc;TKJ$4abIq8(3Rx{M15FJ?~~jML*T zTgy&B>}g%yEOrKRSdHJvK11uZM!rvBh|$>s1vIS4h?NK%g4{t)GfmgxR-`9u5ck5~ zqEpn;hE_RBVvM1DuNHUJwF;t!SJqiQW9t+(Yj?}?svP6Ax=FE2`uv$QrZ?wtw4A&iny0-fQ zTAIwPYbae9wM{jnxvUW`m~h|u8z&64Q5aI2l9l8p!KnFL#GK=p=cZ^j-1&?H3t_H4 zy1@_3xgO`4V%;c_#bX*%{9$%^P#CJz5E*FCPgNXDR+MG4?APZ0nG{e-?`c@544XNQ z!L-S|2d~TAI1(C`pv6MtE?Vo8v~Lqf%HzcX<0Pgfa|2W1NCo8UVZ4=4POj*Mk7G?g z8t^2Zpx0s1rV0n(uAzOQ9|hPm$bhaKe;Xj1;DmgU(SMLdO5IhCF>D*!O#0pP$O?HJ zRt#IP?(@*sxDux7r441iPx%uO9YMC{7LrWoTc+j&Xezv3v{ z&$30URE%fgFsb@?8m+1M>?^D>1FD>=ycf}0Az*!al-XZLHzWE4oS#eT$sm`lGH`Y;A=^k{tN zI;Jipg+m|n&W$t)r`M|T8g+PP)YjFw6}XI%OI3wmjC8A@fm%xSu3md!pyyEp_~UXb z9G5Z0s7Xefp5&wJ!%@XLeL%*rX#0F7;WB%ee2tHJL&d^%Qs@ZJYct05ePBDoYA>d* zVk$i@*)Mh>wrr9F#hjQ+@_UsTyBMr<)wedl%fTun(6rEHih{!oR(!_K@WRrE2mTTZ z<2GH=Lq7_r2H&T5kCWCnI~HLsY)xR%af{9g4tqG)kx)i&C79mj*om^X_B3BHP7*y( zG8LW6`UEl&{EZ6uDwb)WKN^TzPBSfHivev_)&@Ja(=`@$lC*d%a%hSlc@QSa2*Y#E zkYnWVtfX@j*xf0(m*5UsX!ONlSJ)>=+>@GnaUCQJ?$OegI&~Jl)y_NU1ye)RW^ zOb)-k%Uye9Gt=nPoc>2BHRA({1f2%{buGFnH9B6-z+vO;0gkXQH`A9*5NO26 zxthvVmq_?=BtF*0(_M0SBi=#9f8Bc!(;$w3J;AujGjV+wu0}ZLVwQ<*U$xn5 z`c?kyr(d0$AVqQbN~3Y){SuRtr|Fuh5t6ndoDIJ8rtJcQOG`uwBkWIbo3VT~G%7b< zjYN>LCI%i=W~IayH^66DM)88%h8vmn6l2<=>)Bx#sYGxJroVS8x5}}y-9XAhF)^G0 zuZ6;%Nceo9aNHz}3WoOw&>dgGEFvnjHF+Ixt*Wf*beW|kt*X$e75D^6*MaiEx zCUh)=R|UsD{7lvO;xJrgOmRK|8^d57kNB?AicS^oUVDNZ^JN8|`!jEFm6Ih0vz5|< zI(8eB+Hg*&RlI^l5)v{%_Rhs)i#Nj~7|3C9wk=zNC@D=M#?9ZvX)uKGRvQD6@89I^ z`rNb-8)N3qdtlZvRXnSR!Qh|;QxfT^Hl#RrD;%~lW!hGzGQ5@j5iOMDjfFdb#q{SJk!uM@F6phEEcS{2>gj0&oX!+8YgeIV{}$qS5CIe{fI}T zrNKmkS6Dr6v6 zIRv5(vt_2M{JgfsZNkaKLIoM65r0MHbybqIzM7_FumabDHr!n{M*_kr@S!JdLKs%u zDx2!+`Ja{e>~9R^y!CE!MGd(j*^fyI`}dtPo)(*h7ieev{pq%=Obn*{|FwmOb87ie zSruz4jbTSiXV#&##~ClHHwH4X_U8he-+4__?#hNCg*cR>E7MFcpau;e#XdSC1P;Xs zt~khxy1LtSk$q~)RMRMdZ%{k`m38_H`4t|&BTG$)b-$X4Q-?}Z&5mDsL)^I}FbuX~ zjKhu+hxRJj+59Fg#`UuEHRp?ybFKZPwn0aM+dddWlR-MQ$NQyWfzbAnM4e;&bInc2 zLd|07bHe7Z_Ih&DAQ#Gq7=ArT4Bt|_wV`HACXC^1VK+m!^5 zs0`}{tH;QH@rAcPf^FdgX ztHC)fcyj>!G5~Yyi(%;0?5#H0gPA7VdN%a|+bvAW5*EjK18h6{&5kg;_%3-uOV>}i zxf0Bjj=nRP{1fBYk1kD>#=zRa{o2YUovd}OywbzK*-*opsH@q2pvXsPt$I<>M++3} zalWex=>kp(nqSvC2jQ-nbk2TQ;=VzUleZW45;_L;xHwHH$rn6B7mm9hm_pXU!NGA0M(EYZ>L%uKfsaLBcsv zZO|X{{lb;Dk<$DOX`c(Xg2x8ShUl;i=`Qz>P6af@;+Vzv10g-#v>XQ@4H|RL4m`tr zb-9Dmz8WC0jZr~mP~|E4l2i$XlVT2}rlBXiyGPRZw(K`ttDF_aAo@QDMhtPMaM=BV z%|lIp6F97*2cf7)k$nQhc?P}uqUbv&yc#L~$apN%f{bTiC@N%OwGG9FjnErIEolkc zQlAi47M{bhkQ<&2F&R^AKeLEPB_YMHxmIkCz%6*<$3gtZa`|qQ)BO{4^BP-n2(IlM zM0XCd)QYL4Of0M%WF4f^VRhSERm;z#;dk-fMx~>UX@JUf0oZ$FbOfFQ`xB&Svk;yu zZECb6q=Oaxbmum~QJi_ouNQM44KeK+z`3xT`GLO_mcJyJiFF-$?i6HHF-NuuoWKXj z4c}^bZ4B;E`7I2d-Ei}1*LP4&3 ztCclrzsA7GBz@%uWXrIWStjkcP zOZr=Q3DG{a2x&KNBgY0zY+}OjfJLXB3J6vT?<-{~hRaIr+w@=@<0(z-E`gP?n3$^| zC?tKkstj4q7kT3<+yt;>Ke@m8eHb#Zs|$j4FftQu28)N1t6}UL_UlZ-26jX150D;( zfOMaMBva=;nnG1>tW@;qWIp3XEaUx3`X&n3!uWKK!{bAJLVMM4FZSWA)d+L1GmYJY zJmcph;OQ6?SX)j6vn&0#maJAG!3U3FI7#6vVZjh~9sNgX>}30=qK8=g1`#E2RtYOy zH<1epk~1V-x5gxORM0n#@JojHHLt=f#P{%8>({x!HK9TeZ zHEdNNI+>}M`l5^-WI3dOiZpT~yrz)M4w1Ha=%HcSD*j6~9UpyWo?jHpZ{p=8hCi*a zAsUzaUY>oPoo!qo8_kzQ%P8#Cla#?UOsji{?5@epSEQfM+QEvABur%q0^yci*1{KM zY7e`#Xs0TSO2dKf^){Kklf~6~jU!eEx-tZx?jW7%OtnB185Gc*`)Ei2lhgLL)G#dv zeX{I3C2f%bP^F=tritygk^sl!va1QvJ)?3%qVQD;k}x7igV_X;_k@xUa{Q3=%0$yK zPK<9KNPgiAH(g@)*;fnuxzJB-IJ`RC)bof-N&ghcqj_CV!ErN_;5&%6rLCstE%f^k zn4e&OR#uvJWHq~3yoaYyFGm|y^2hh|F|np48L|`XUl{g!(5wXJ496r4(sSU~5KC!> zzdx`31dS^en1QB3K^8KHF6D1;>&P*VWLKC*C-**!oAwujXmTO`7h+*cYz)c^P+Eg2 zVXME3Ravu`FO}b(bEulEYF0I1AvUlhNf2QV{(Wbj;R}@kD-+| z_5vHidxsip*t;=Ujrq@8Od=4jc^S8ctZ~R$0_3Amxf>2R!y}}~l z)=&{@{@dCm-&toW)ERcC;*8CBBNV&DBdDdQYrm9q%ymMy7u=(cDY8J%}%@lkxjFhWtQFt(`gTn_*C$0fP*75{8XN+eS!yug!9v0}INr5MAz z%1E>)D4&7V40tR`Nan?FU2$1<&d?sMa#vs$Y#qjC5W{%MQZ7L3VWKA-!DJ%552^(zx$&s4}yz=5Hu=JD~OQbJZa@HS&0Mlmj^fV z$d~=uv)&iPcW9;-`o!n-5>!}BS9nuI{#KwN0s zf!JHsI*+b}fp^eSOsg!sMp zd9p^~`1p*$_Dz8GfD1zr8j8ATX(;)`SoDB0*6k+{i>AxZoFuGN3Ih=608CT+BQ-M~ za?#{L)=|vVcOys=$A68Ed6vsSo`D4sj$wo^T0#OK0#~TM9CnrB-9du7Lg|yshNu6L z%LmXOlGWGQ-)ybp4Hri4IYi1Q*aJlB9l-AgFP^O481IL9BZWk{Vc#$qk?x#h(CHU! zMKj4oO6Ul~3YNar;})_)9BuHMNX9+VQ)0BA&J)b`HJU*&4OiC) zI)~$I>AIewfJTR!;60nN6Z&yU_OyZqJ_hFxY<^O(E#>Hd2~4)}j=T@@wdwoCq|Q}s z9TI2*^9m<-RiCk00-OSd0U57^xs#<;wX@%GrJ=<22elaJ+%NoXLeCr~4_*x8+d}wV z#Q36iyJ@rDr!qZ1z_%GoNKB^VMEVoL+bE}$vvCfIjpXAw-lb(XmcA+*L88;iISpH> zK8Zc2te9A%w{yJp6AeE^WgW;Gg5ynRgV|552js;ua5snC84sW5=O#*|gHj6;B}bQx zXU1Ej0%5vNI4^fcsXq~u*=J~#X1QHrYY6n=SVFD$55E&87V^QKkMLYrUFdmRd@eJ# zOpd4#+d=g2?3+_l@0OLk?$-sr_ouyfRBtUu`;S>j(RtT0vc zrzrV#vhawa?`?K)X<4p0*c^BDH4bg76DHixWwWFHxU(I;>u=R^a43rI=YiE=mIUS6 z?f0xh0}2e1g74Fql%pf1%-D;E@EaS%LB^P}J(A`9CEceSVdRrB{9mX6skOy$nf>9V zGHFAN*tT+{I4q&c{cgTSA}-7tuX9{MJ+wSH;l40(LVIn`QLLN|io}72njxI0qIu=h zrfBj%yUdGvCcgPA4a(NAI&hg6BXc{Yrgu~}ld0zre|fB_Ck$br-(mDH7oJtFc|Rc? zt4de19ba`G0T|EBqCFw)9mdVhd3y%I*Ap?_Al>0>Dj`=(zn)r{olzX*&w$#D_H^f^ zOl*1G$)qs~@leQ9%hM%Obh7gzq5%h{i3l64>@|K$6q#Y?qg1^^FAkVZ(7D=v zGcaS4#MULJF3pr3;0(fbR^}ALy2g{2BVbm9`w4e0?Vil&FYUnB8%=E|*}@`IaFGA$ zhbhraDl02^Nm_ZGE6EIcuuv>pD3%VM5-LJzO6fTG%T3~x*g~vDeJzPK3(K;}5`{sT zx#V}&^nHR#v7m#`Ef0cKawbQd&35$s$`lh*rlEhSL+5%?=ZBx@$0Faqru4ZLqWCde zM!$_TBa)WiNeiblUW2_<=2>$FJ_&}$VzBt_=RLaIteI>USBq(Nr4cudqOC;Dgxtw0|OE$X22KtG7M6UDK^fSIK6&pMmp}NN#y+qve|*?|bUc zESE;I$H~QDEI3_>hZB#G4>jyQd~5#9l$D>tS~_u<#&Bo~458vzSZto_;!x*S*GQx@ z=@}h)T<{5yX~m;0KA3bQ%QtRl6PGRi#QZfbV)z&t@3eUYxmhaPiVbc)O>I3c*)@w_ zk$-MyP^(kES$MzHJ8Da2fpa!*icvp;Y)_JsVC|WJ+RNgQtU8I|^d4LMOw zO4>RY)6DKdte%_IC0W7N%Zv)Qm`b{E5)8z;OGWt3Y)haK&1&G53Hl{ud{k;3$7tLY zs2nj5@6*!y2-ATex^y5;Hk!gw6N7H2`xD8>O2>Gp3Kz?|cJ^`f@_4kP<=2H9rxjwgZLo)WJg0DlcU zxF_8v%Ak@;M>coWOC9CLx%3{*~iAs%nx3}~4FnyJ~ zF`?eO@~k}Zc$Z(+i+Bw`mr?H~pT|H^2t;Lx$LL29P$hH)Ir6(KVz*^~5`UsZ*2PBT zmAO-3l9rZ73{Cxngmabx zEuXJJ`%!~UjpPDO+w%u6o9TRHrwePHC|EW~)xHGT)ccj$dTnAFQfK@)(R6I+rRRTB z8kuCnzEDz93M*q3(!{j$l7QZV&P@3(S{NzSkGOFen+89OMt{PP;RwzD1N|U`*-knI=WoY2>hpHP^9rF`4(kO>L~ka*p?u#ap?(bMr-Um(HLJj?@ZH4fBa4lK z2I00}bdZ0JF`WX>A9Pv{_6y!F@Jy4IH6MRRG^%g9Gi)`}AuL{aM=tx&-6q?MxFo|w zKm|9_nBstpg`@~Wi8+Yth>_F)T%G= zEc~s(n!}J)jn>ii@YO6-A~qXe%~DI~H*#UH9v_&><|=q=Cb>fB&OGr?c9p6gdrJ17 zO{n{s;ch^p+t5flDYNGvq6%Z9n2NsDm_5TMIhtA=x-5s)dAOPQEfx5?IAPsjicnr6 zrbBfu`=%QTB1U0`42w%Ca=$KO^w0kmZ_*E2+yzG`;Zkm>pxh(yYYg2fLcG$jSjc!o z$$sNoZ%XIn)tMf;(+yv{oZGNIcTRa#&t?g3j{O0*7`td1KMjR4m?~AsOt|eel5)Ro zOf9^ako~t*nw*}0IgrDpckoOglYOLcaW)nw;5&>)8env|bhsDZFTp%@`A(ZT1X|_f zg-Xj^H5p+w+`_(t+g{F?_NuPl)QrYifbqoIRO4i_p<^iexa)Ihd+hQb`$=P~*gUA8M2hrGtoSxG z$P=1oGpefUx-v_Imt;i4x-yK<5Kyp!^vO$gg`Wm-sTQd7H zJ6l>`M;?!dx97sF9HFg>?Qi}PW48<);Q01A^_qojp(v9LW!2eJSj!|is}KMEP7+gA zpiA*a3L8}Uh-3Y!pa1cWp+u*0FrtLr+_PQWg`J{}F>PZc;hE&OSokm;lI2K)m!gig zxZnWlqie0hv43DW#7%u)X4N9Xu z4Q8}t&7Wl-JcJj3tY{`=`<^t$+P@9l-})L?5hV|^{yPz{A{@ji|jxZ7~{+Skuy04mqfKa@<3Y#l}{FVECepp3YxXEYfS z%nmIcLSKpPnPL1pYiViUAp75}yd0`^HZH(2T`qI?eaGL82M#?KNlQFp5m4;w@zAP~ zzH6OZ>8SXJ!0ZB#zivRz=n%a}T{*BBgxkW^&9p6-b(zu^Kz&~B?}}5wY&8j%^Uo)c zVR9i?(dW(HioRU%!>9r!Vib~K>(~<-IWq<)Q60mCI34D{ML})DB-*sa-IlV2esN`5 zGv9xj^{m>skE=vmq4$EY$5u<;8k}`FsBaL+Du@+VPSJ-!jxcdKSvVkTpOmH#gf}zE zzM}N=bdkAKazu+|c&G*fQ>Y`^AxE`e!L)>xLB2bt@8+@V$oG+sS@gv^a=-=)05)q1 z&HTJ{rv-<`FP>4=dYT)YEi^e<>|p!vN+KVrg@p_JJ30FG@XBe9D*0!ifqc6pKc|dI z%E~D#SfqSfFWqsCOpvePJ+Z){J+Dnq?HhC?Hdc*u(RPRic2wD7WAkC*=;*tB$^{hujJJpDM2ZKg{@ ztv8eSxFkb}#%x0;yY3ksRpO6)ox1S4_#GZ0wYA0Xhv#OWVb??_{Rnlu;}>z6`B`x^ z`8*WP$Jm~dH$T$3U#PYBy+>DRtX-j2djK3!(wdZ&8)4ocY`ZHWt{vyyk&f?Cpm2<5 zTvlTMDghYJB1E75ruI}av0ck)pibPsvRw#Kv0rJLYjNbQ^K1URrRN>8F_h$}`OX-} zd^(3CPph2=*}}YQ{9`UwE4E0hs)T)yg4Ad-M1oG2ofN>-7FYtHc|5U)5kndhRxpxRV5WZJgUKvqy z7WrQ84r*5!uL+NiWK&TJdAxFGiS^G&<5l;hod#2;QTCQ^FU%^--iKzZY58&$V~4|` ziS~4iWmEj4!6~VO&c7MTWDET%0_IK;e1`dVL-}|4o}*A5WxRlF4V0Z(M&`HuCU@uL zJ}xyJ8v@S$xS`yS<1OGw=f{Loc_L|uVp@ImSh?`>IB4cf(U!pKaA9Pq@ZRX&IlL)~ z3^Dt?##dy4PNl);&F$q4Re5uz-ZtTi=G1-TUCdBvHvLkKqv68A2(nZQi7pHfjz^kC zXxWdj7GVE8fFDF*c-YG1&Q!NT{`meq}x45xIXIPb_!J*FTcrqC)oGqOn!$`fXP}73LPUSFkIu>@_HDq7CTZZERZZ~o} zlpS+jyJdEVo*7HNQDW$Mn5XYX!j7fr8VSrWUdstrHB4iMTVo3g_1%Cn6@06J8-PXK zHG?r=TUU(Hb@_}I68@y^U=S2m`6It-v;{!B0b%Z71lQu&pXn!a#sZn^q?lXmf_)TT z=57V&on==i$jCjd?VDirSs|Bmp6Cl9vzMVwJzP=3-E!y~LC)ui+pXO}>F19$Wmm{_ zXv^z&>HRZu;%5@Sv6emkXp2^0h9I1AXdE6=R^zN!w-HOy67 zUqhAC3^zjZ?ku?U0)ETal$bc29B3&*^QE3mkh?@$*XVd3oAae#O7-RHWd-kpbvVNp za$R22qQT5?)AbC?FX6DW5ufxcm?l{mLWFE`G}!rz_#+vZ$QK78kC&_rB2%rdVtPN= zF$o20H-k+x9ga~G*YWP$>~Pk`%jkVe7!E6-{IkJo5$G%z zMg*}{?7`g06939s#3P;g=!a!}1Z}^mZ-pl(Vr(Qka#ZUThMxgt9EwDBQ|0eKbt0 z^rQM~XF-e_MWy_!X?VFj_yTVh=uqwD!Bqd5GWcND#eD3HRG0f zFCt?VaDIy8myU6r-@!XZ!_!&2zAy$@Mr7rcgxrSlh|D9ugUrkxF~-AX1^tJtUoR7; z41z^d$t&r?dmMaG$kaNHknDJNlp~9Mgnl8Etkj~y0;{yrw8Y#iHZH}MMgkQFTLN`s zo6DLT%E;G|Oi|5a=n$wI-Q3hT%L{WS@-NE!RxC&9V54?4yfB(SkV2mfGt7kJtfRsL zY7{dIo0O~%J`-g=acTCRM8nY)c`qbog0d8fva_y7vQ4&6o7vj*JN(^n)>L?swrQ{* z%RUAp!mv9*jjah9?Inm+SrQal>T%2+0TO!QVj@2H_3-CR5%gJAV z+^|HR@mwO4a-w7cnyS;g8YY`BS0hhkdd`*#xpucOK$CGRp4?FxK2pG+oOMGIXyouZ zXPB>KZ@beCKDn?*YrE2~;2SwjS2?uVmmdy@G|Up0s;^g$1>;qCybNxqlKI0ON9azl zH1Q4#QzM+44}7$+Fc!m?Q-nv`tO_sepsK2%$@sU?QdAAhP!xW*9j6l9h86B)l19`GVtt`>i7FtGfa;eC_gh@QXRAE_Nrh2x+ggi`7In%q|tVJolF zyYRtusbRsega$l1R_C*$aRRxxwibI*ky4j?r*}&b^?fQ#)CjKt+JYI<64(lMS;llN zZ2~q6+lSg0XRm|WAlNvS?u`JOfC`>XPvDQ9M8ul(>{2z=mCrH^0MBqo3lxNdZj87C zeTXWw*I)-xUq!0~n3PEF8$gu~2NyB!z9wmNy%-v`%-^~-ZEj%;bVZ(ugj_eIjaQAp zaW;6hoC?53VgQZ|WtCJv3O@3}0tY(`(|F$uzZ~O8Dt6P#;rXRV#Mr?>W(;(yV21@> zD`u~l)X!M{T;uH%Z^OAfGK=foWPemKF(>hKysQgLTsSbaSr@NwtV0u;oiosN8fPp( zSC2$qm}E8NJ%NRG4~{eVh9#U%3OC+CS6OGc?O2#7bsazcq)UYPYF2=+6u#Mx1V|cj z_1gnihQcaE>Q`)Y=GPGDH!H4e=dUga*^Q5paq0gf>)qp`D!(@Fy@%Pd=d_r)88)zm z?d%OR$jFQ^z;IBpK?el|MFfS!9AJP^&Ic6?bu>)O^VzhLj0{c7%*^r-8kWb>(zG%| zt?T+;OYW&@7u=G(|AB)5m$V)eOqO7- z0zirF9{4&jvxYxv$jqlV=;q*o3?&Mm!x>by9U`hheO}1UMCymi#qpi*G98THAadBgsN7b)+!%nFgQ+*mfO5jz)1_r{i|5e1(LaBi^68LHYbOy1CF{ZP|#(ve8F zw*5o$({U#5e9T*m?tE{Za3H<=3~uqZ=TLG&&qRCaM~gEv<#ldsYQ3@qYtLCnj&gj6 zIljhm2Z}YYU$M_g?-)_Z6iMgS@?r@H2H_PkwM5;u2)nK`3rN7QBR3L1a;x{O$UH;M z;rAr9UB+yczI<^NRTsS!4@>jdlr>LMwOQk}Gf&FS_sH-e*?j9f{stTVk&N(sPBv6mBNld51BOivhZ)$j}M2 z1x~Vr9e9)SU>&zzi)F0hd-c+MP|^+1%{lRn>1#65DuSaKvu$Rv_|n&O&p{}~6KeDgyRJ7@rmTVg0}?2F%9Hu;Zr_z2dL*$bLml7UBUuy z_95n$H;d~W1n0HcRi=x+RBY^^U5Vp);4iDVV>6id7O~2h#a8rHzIy|E$XBB)sA$RKOV()nVH8sRcm99VOUB}H;Wj7@{?0aX55t*Sa zqsV?W8TmBH3O8L))Hg7#LNL;5bGxqbg-Yj2+6+m9EYEibw#H*)4evwOu3%|kUBYpc^MWmHUi6ZsH?OYwy}%(q`M|D;c} zalISiJ*|AZKI1*DU^0-yYzT@_@=)AI3awHvPo$ES3Tdc%kvFfSDH_F_AHFx$qCnnnNV3j6in5Yagag*t3 zrEt}#DaQ>!ufpljDM}Rh89`Vz=9SvU%5HBJ3Wsxw2*;Sz?JONACKwx_Mk7tu31!P$ z78&mtkCLNtkTQ^5P}+Xa5S|Mr5J zOE@ml_*J*QDMVXgh?2m!^(tVY)*4C@xhM!J=TF^8{MA$wYt0 z<6yQyP6OhbT#3fTq<&)b80^mGaVEpC>Q>jS-cO|hlPxfEgN_$jx}J+r=DduYm7EnS z2uXPd|9A9;dGwFgSt!hA7D38jVhp7mmzGkKx%crZMW0=^T{dE|F~WQz$QnqpZu@Ja z@Zfhn_z?uHSfedNi&qsFs~{if;jC0NfQ6hgP^wAfAZS z-WgrzT?319{lyS^aB&fQ8)@opr^9srHcNPzVER!cN|qc%mr^Md5(v50o|L^ z4i2Dyw_owM_EXlefg)``?1BRJl7r4X^*LqOvjUpa=)|Bmb7sh?IC9vKwJz%X?*mq3 z1FPoVQ8OEHA_`+dQJ?`6jnegWYIM)GWx2A}WSKWj_{mEDkQ+$0VRCv4-73BUD^&cS z*k+G4IYWg(YWgv5JWGrA4K&2>hRp&dd8$!n`E z1pZ^}y+W^|8|Z<;ezo)Gv(>Q( zcKFN*OE&X`V-b!_nqG{~wv?DJYskHQsP4SlY)xdS#-3Gu4j)T$-4awQ3YmIqw9I;I zIK0ee9t8hL_$7vn0mWx5>eJS6j!VKW7AjTTZUqbsfyc5i%d#17ll(yF=(#(AY82Xl zPu7;77ywR%z?L~)&>=(8C@B@Fi7bVQLpg=QB3bA8PwE?x-q4cfz)>2=i(?pnQ^IQx zvzDZ0E#cn`wXUR1YL+Zwg`4v=SH!veP!yNV7GC3pReHWqYqQh*O1*f-Ydmz*`YK_j zWUhvn^m0{L#!Gs{vNy+cts=9AF{<`zajSW98kO4DhaHN@81+Q#iNW$iU=3t58k*s= zml!qu0g@`djxcRozwC&fZkF0Z9jTsIdv{ z7V>6uYFU+igj_fsZJ#-;=S-Cjczl=#qnj;Uv=q=lj~m=-pS{W zCe;(6ZBpx`0oZ2xezKDyDPgcpPZo0F7%nzMytX35x zZpGFxuL<9><9c3jcJSV&gF=|I!?TFE%5m_Y%| z-;*Fbh~$mrN))8tAgwiu_s#{FcPp&lg>498k+qley@U@aEYF7{##oyj-M+RY6bjhv zDH*~3@;DnrZl`RJQH(#3VRBpC4b3p_iFk5L2S1ObCX!cM3HptCmS38||58oWE;{h6 zZXz~U26x+S+l1s`@iXy_-krS^cVHhZd^TtSzEJbDOh_IN^A#9!_tTVp^A3%N4~Fa+ zmuu73;mzI!r7y`xySdR;d5PO~5^IA?K}dQ$K9l^0-tCy&{iKt?wavnWdhiQ6bllO; zeXPa0;F+hu6=E7%D<%sUL!cvXW@CfnBRUPIk8W5S-M$ooEEuiO#x&S=rDY~zNfV8y z4pf*qF@-;2u_Yf<>#K-L2c7Nsfm#(CM_=gb;V{U#N4O=F)zcYJM|v4MM93Fd7u zNkbMA@r-z*dOiJAbr@)$Coc|9&wr9bTTCf=n`L%xSeZUVNu^8*^wZ<}nP5x7m=Aq| zNv~k`h6c!^45uO~r*SmpzUo2+1Gg`#wPZkO7E>5)>54Jlv8|M;D>1MHYBs`+8hGq6 z#|%)#pa-}SoIN-W7-ZIr5(365rr4J+gX(nXoh6NBT{+_9`hjpqIy4C$#-%1Phpxu` zgO?Su8A17S+zbBRCVncfa6#xWu3QbXbkYmSoHl^_E{#O0*Zk#EB$n86f4`JRXWt%K zzNOjR8AzXlk1c#k7$;S93>OoqaxOOs+5;(zux37=vJE-*pgg$d!u?T~22rlKtIWoF z%cP%Pl$I;5-e3}~{WRLRs-S1Mk98q_b?ZE6Lxsl@bcx*({2YMy@B35H;d>-=#kCsF z52ozNnZ4&+0>fz{EJXHoO$(0r!MI-GV) z=JFF@3$itAn^Yx(ndn<^#Ek;~{Yv4G)9M{iud*BcGIlBPDL5n8^)lOCJ9$oxz3lXY zjK^g{kSf2lIG_0iR)tfR-sdT+t&DERx-lCwp~)`+Of7c%U)R8c4GuHRdK=Q-M@=$q zg7wPijP5*A@vNwccDXD6PIY{dJH37<_qH0HKkQI*;Go%4qTDTUi|G8g@(sM=DerRQ z3OIgN`btB`rS2YZL5{a1Yo0n?H-HS1EuUK)P zJdA!5C(jSlnpUXrM)cngJI7Bdg}CKTy8lD5uX8Lp2ILP7H<#tH;(YgUlUYko9q}sv zleXisFe;S%p>)hTz{41I&od|`gG83`=Tu7^e)+Y8sF;-|4B_KC>dIYy_OpJF zFpsWptAVXSrt*>WVpDz+H;i{Q@NcoHf&TF4TA9bD=`&0a+UtkX%K?ClAW_KsWN>A@Ka;!mwORCKct@ z!9{&qz8~!Gk{0GlG#a+{9Z*j@`+x$E$a$fL6j( zwJlE@H$a?Y`&f~dFy+*FK4HA@T8LOjZ=uUQt26p#Iq3n|Z#Sw_Cx)A62Z>`*$m9vd z(%|8RmF_{IZwbF$;MRro4M!g#8%{^B*hJ6bvo+E;E`DF2L(R2~2GmM9h zbV~cQ!UjSaqyt0s_y8j642nL4QEcwrj_ssz3#?4Av97BrnJWr*>FG_`JE)jLC>l|m zhWA)&Iyoda{}4%Lt)-ew)If4z^8er~3=?5ozJLf8JZ-;AvVi^5F z#veMm7pBLJcoOaeALztI%h#=fm-9$Xm}8z@@8`m85^VE`E7mJ-Z-TQ?n#b9Ora45j zf!qwRoW|ZMs5Y+1gZUh6RAhag^hYES3;|#aAVUKv`;BCR0_Qhjs>Gd~EKYLiJnhe3 z9|O}=xs@El+KvRLZ)dpWLBgg;s?=I=+*ePVosfPpv5sE1VX#=U=Zq_x*(v^HTOHJ& zApNRyV0e8LrwPH%FqfgqJVd$_h3Cz|k7owKued?EA?@&i*}}nA@{a?tmWx=7JR#Fg zIWI$K7+KwpSBS0elek6jQ9JJA=bK0y+8*^SuH%izBlj9a;RFXC1mCiq66 z_XFY9V)ItV-O>F9@Mc-RI+*)AJ*CeeZMAwAIQ*ndbsnBf*1?fxY$`%P7}cD$Yzj4+ zGf&iJ)?mI7ybz2LI~efBmBqwNa#dK+<6%j!t#Ol!q-78PhT8gznDlUoeY;XT7+;!g)6)x!vshM7lZ}R8CJCq$iSNY1X~LWMf3eF3L^^z~DH&yTwxJ z^1#7hpMPohF3*SdwgD0ttg@-n3LP{Kh7CHhu~I5MZCay)?PwSzh?p-x-n`(SLthf6 zXFteZ)1+9Ih!#g%^DEp>DfoVZwc+lY=F6kVdV|#GR)ltF#-Zck>AIAgDjcMe3CaIdoISo zjEXIKf`S9XttW%Ye_p|le)|q*na#-BMc$3B3fNhVmNILvhF zEe)QsGB+3W4t*Sc8w0PMh5(ZzJxvj2+3S#`a)d5bLjEg|Gs)Vk=GV`R{tzwzm-8{5 z$|9gc(0u{NdBN=@PZKFNsB;ShMFNhG@^Zy%dyX<)sIP`spN7Rbasz4rYv31kb_cvQ z80iDO(uj)GL8{@C{JfX{j(Vb18}hRmCTVoo`E%dmkAy;CjOm5gwL!PjKH4p`Rx8I%tZG4&|pt<7YPXOXQ_^ zKsg#dXtjg-g552oGb;vx3aGMCL7HyO`@;4`mzij#Ac2 zd3xTzKc;0A40@h;2BJcNOJ2~|n6`$cb9z@KZc9%KU=v~!G8PIrn@KHDtjrDSL4AGt zVSmqX$vvF&U*K?ZGoEZ6?pH9G!Uy3>I7pY&HK>p!58I(-CRWfxqd2+B`>CW@nEr_$ z#*vSOKQ+Q*1-QR+r5S?tJ!dcuW6-L+Z^EgWp!^ukNOiC)1!fz_n~Q|$ix@j>DiHqk z*!IieK1MWKomUV+Y17H2Nvzyz;0Nx5f)~1;g)`G|@HJcyf2`qZosJT^lB3PsHlg!r zu0-u=g{R`MlXdIuQ)oY{7DlkR{7Z>F66tKhfHJnh;DQ7b9JIPVN3nkN5bhf#q%Y<2 z1_>jhS6tk4v14p;f9g#JMq_aayULKy)@^=rQuJQ$nd&vJ4|Dd)vVz)uvn!ndKjmYN#GSzlQx}~(Cmsn{m4Zr5C5)XLO zQl6qpxY8-;S*wCw*y5iGj@S83Ff6n~h7+2Y z11a=;zDNPt*u!h+Iwg$P@p)$6TY`yB+#fpYZ#wIXGx56bnhD)`T%Lp{ZQN8CJx7bo z&N{SbY*HIaTS_r{k^Cf(cqQ|6uN#>7=%mh4*J5b3Wk28zgc~2iy%=S?M`vI*Ii7!e zPf`u3S7P!f=iW?xI0+|rU(LRFMMh0TXOkJReD5e=rkOmxL>T^(*pfC~-Fj0dAA|4P zXO3sN9~5TvX5}I6U%@R<(-Be#YyZTO{tN?HO3t+qnF70RGh3wIG?PmeJrmN#QMKvk zC+fVWP}vD z1<l2)gcqk^Q$l`2Jm;Zu|ztJbtKQ{Zx*v`|f#0fQD5c&-2@NLhapTEF2Y?cuJ6q@Iwa ztyIx=O;1jx2B*`{sPGb+^#qGx!KKq4ma#$^OO5B};LTS0?;-2eL(C`khT7H(GMK?O zFGp^%@R5T5Qbj6;LILVuV5OG7kW(^O#igrYMlDu{FTQeMFe;me3>7|lld4f1gOi_k z%(d^Qj9*}D*R=9$Y2$Tg9qTHa4H4;7nQ5bnPfP)$Q{G^JDopqYCvF9_s^NDfZc5p^ z9ACjzL74s>TkWdpyi8R|jy4>L!u&&6Iz&7{x5J|Ad^DR?M^i0bDBQObQ8A%Fv&2y||8!$MlYyxc8+o#J( z66^T9=K}YtB5S=2CP!1Tr(+{hL*6}i5IX|b1DW@Ga_Q~)dCL~a3e;e;$mx&M0|L0~ zS|-f32!1HQR0;A+q?y+)*@>%w3+*}d5qurMwan;igu&AsN5SzfT+cI^hCP@`za;qA z36BM8qHRCZybgOF0)Aeumq7izlfg%=F!)pk3n}|v*w(an9J;9%`KVSbdeUM&4zbZ^Yvh^6|1Ut62aXzJDFbyRT`UChI zH;u&*6?y9I=D$Iu#zE#BoEi|^F3C4Zf@XGR7UVsV@&xB+@|{jyr#M+)XSgr68M8dr zLOzA(F+2#W4z>Hq;3-a=ZR)%#CbcAHu3&z2#nXf9ixQ7O!xDUAKKU6}Rn|m5aR4MZ zupqN)5wF}`W$A{Qap-xh4AmmaxXuNC9HZaCXW0J+EW`~AuI&;hl9Dl^nbwH;Se%4z zARmT-@eMh4y1rQF7*2JPa3;U}p}tL|(jZe|IB^Xsb`4Go&A1?%<#hu?!SDk{(RV+@tYr>D|uFAQ31=%>f!FJ}=bom&GdYQ?S67h0-J z*pdu1%IP=Kv!rPvcH0v3yT{|;cGo9F%X*NqIU1fB8hr!XrEAfNuo5p${Hd_6gWW}n zxb~04`<>65Mt$tl((G&Q-tDL%N_2Vi>mGO9(^k1Kya2w}a67c8L_8@D+gJ>OfX=7r zCGhczQ$v{@3M0O@ou$0mW_~f8v@hlEe@A+@JFu(X05K8p@k|Jb$H5#XF#V7QZ}k!5 z8Al>>$x+T_{Fi^hN!Clb&x?t84tAdI5J{f8V{cG8lp)<4`*BBrG)(K*fvx6=YvI#s z{5om8s1`!Rb7|_ywRLqcA7)594mMXZSP1y+TxgO2b)rCk#wGFNC93_RrGJp~8+8XmP4) zF6E5B;O;0)bFQaa2QN$gnQ7JVGW$y=MSkVuqXsM zyl!`v*(8ro$}%R(?Fpyf4izp|YsVtw+HK8<#LEjxQLgSH|BPBTM+TZYT{`^3O3Rn> zQ&rHW$VffTD;<*Zl6MA^)_@j7!mE+gW@lG0ahfO zA#@wFnBGe@nCpWRN1)B_{4Dx{^lW72mbQyIzsa-q23`ziU0L|h+rH#ZUF8i*Div%X z3{cA_%;u_=sLL@%XXR2AbZPi7HKH*4ZJI)ilec=JkW$=o%V>|DE8J+Y7LJGTi+J$# zj-qN6EBkl0zp9ymn2DuR+2-9DW(4a6|yTsRCp-=f5+c?j9B#q`N0 z$gd`?xArW`_Y7`~L1q}@)9?}#iwQnx6mG7W<3dmft@>$HZCw)zd>g9`c+r&gAw`Yo$Z0_M0RB1>z-p06_b5xq7st|oLO_Jl`#{Qg&Q)Mw zN^RL342Ch#&mv_UDgE^8k-o$nU#3n?DH3M#$_)Siz#3chFat&eGlL$bqR{$~6kmXi z(x9Q`Z81SAYF?0%rXTzNh7D!=4pU>O!Rbqh@ud?Od0*>nRBg55d)AO%%e+QOp}F+` zMGY+q9arf?>-k zULso5zE~xZplY+iEskWmlYN^H+Su@A`Jmd(#ve7sYTSStEhoYd8-{P6p_=}BG=2#G z!u)-~Mfk2YHqpiC252$K z{KyTX;~9_E@F<4i;c)yIFfz#(zvBx9sBLi08jjl=wxp5qUuD4hqp``UajaA~*SM;j zBdFQNuOegcb3ofzZ9^%&*)cl|6OAxeskS^(f&QV!M&^y-GizJWIE&E+kC@}`MrJ6E zFGLGHB0X7#o28FxnwXrCCJVFsqSWoN2`5L(22aMaDbp7u)#MUqgrHh{GEO6-Bg6vz zB(!k4s#?=zv=gH?>YI%_#^P`L3Lp5~uVNqGyIYN{%RPQrx9Hw)qs* zb-)xIq?@vz>F0@hN`nnLEC?DhXf9Vr^{94*68mL&WW;$f=M>53i^=>zUp zRAOdzrRH1P5z2N_uJ#%5T!+P9C|BW7S0r9#5RlixEL4}ct7<*Dk*-IORYQfl#?jS& zAZrLF(>jJ=>x`k2@xP>;MAWW05`7$W3hlpCynUpseJ)kpkxWVAtbfx<;;o5~(n(UY zVz6YpQ<#g!te=edl!RCx+nfmZi)BL_%iPr#48&G}PUohJpSK$v1{5NBI6QAH%xJ8f6gIPz|=~0a_m$ zzk;rIC0y8;{~8?{X7Evlnkr*bD`~~c8O2P;Nyk2HEHySouMGY1QI3PS8x4N7r|w|` zahx0Zm>8|Fq%#vyY0YJ{lX7<$I&*QBVtfw^BE^*6n7&8!wj#?|F)8d{__wF7ozSKc z#l}yl+RiC@146SsZq0{uQtwwdIAuoS7Es};b}OtMuV9Ii-R|1jxtHG5J6es;QMF>0 zW8S&rddxv@uCwNbV7I5gMf)fw%{`8$Guv>cG+dSv%Utg3rCiQ*=wY>(QqkOS|7qvn z^j`WC*GA78)T4drpH_sR>YjeJFQ&y6Wsb&IhlO}z zirv0oK;fnGL_aD6Xf@R$+*4)Jj>mB2l~>`QAeHj-rBUr^ek<88G#SU3pHfY(1iChD zjUQ4$pWylsPA?v#BcltwUr6hfEXI0~DXe#T!3LSJ9Sa!`31e53=k}3{O0_Rz44WIm zQMGqv+FgoqcKpM?s}y!9yPKG!oipVnwGOZNJL=r4pi|M;?EMXnC~${g)PH<=^zc5T!vY7kCO0Use;b&G3R>PaG)ScXurWT zw2FDMGfDq%@)ZnY=?j_%-B0v9y|cO1<%+?1h-wgO{aGAa~oVv5c26_tGQD_P$=r}lNufxiJS z+>PRT{yC*l*V-#XFVyVuEamBcTBK9s{EYElWi?uoefOX0>8mMDjXg%Zz^&Ba1x|E# zEu?DuH_rT4_TYHmQ{JteKUn^{rgO^hIy)NjU!qHTOC5(#30)ny_HKPb#dKde^&IN0 zuEt|`4%K`A)nMgh_!p+j;YFpkeBbMIt`@WA+;wD-X5Vhgy7`3rfJZL|?!3AN6VaSJ-Gusjw`DNX z1WQ!{sHBBN|8L3>AfogwP~)*0WBr~{tjAO=ALh5h<4WDds^{RBN)MvN>99bdM!tc& zn`1q$hR!xi8W*Sw^VOdvwXO!Qax@~seUL81%lOh2(W)^^oQT^3CgXIT6jKgGV-fI( z%P)in^lZZJ+yjm0fziv@#2Hj$xlqBYX5^WByy z4M!QrM(MO_O_Bm<;+ez5R}n*dOZZ!X>v_#Z(x}8iDb15+C1yCZ%w^r_LvN2$1dI<*0r1&$qH*2}SAyPT08fM)5wHt|&bA#;y{KFH5h z(N23sKnSvBJecEk>ZGt*SzU$eGBt1jGft0nE1n_k^P?Z&*@q(ctQ#^a0j}uK0X*qD z2HOqj1fIv9z99?UY5WBLR^s#B>7pK&$wiI4tb*K7hQ_jWuEzO)Gocn;F|HgB`Oz1~ z(f+ccI`vbz_aN1n`~KdysXk2 zN1HK|aV{;N$=q-=-hWI=*27sXEUtcmRl(cpCH^{gqN_phus(AWBK{ojPwMw~-6J(R zs;TEVRpr>|r4Y1kZsR}=EN0=+3$v;?zE0yS7yqK%J-sjxFgOXhwR-&UnRnA249p0{ z={<@xKUH!v74Dz6Q>5X+h}hzyRK{S_--MnD3spW({4~Dnlwvg3pzP#y+1!LsXjBMY zAzXV9J?i#T($L_H&qFr6#NAUkGR47#HS`!3u`k@|fv9=^6~|Mw38&-yDYbdODr1H( zbm%KNF8H;ta_BmEl{0m5mL~X{rTY}Wb4x?aZ?h!>)TyJ8Hz#Ni>Pu1r?sw7=mayvU z*fB#O?zYg3V;nz$6h23dCT*dnS2!w_ZysofF-)v#uC6oWkp`|~D5@L=52VJBPk4Sc zYu%{lrV%MS%)8WlkrOqcEu2N~11O?sunfM`Vx}Kv(z;zu&Ey*`3da8kB!|GEs5Y49 zVNydFmi=VQ@|P4K-6@~VQ~WGZFRwx|YrZp-u19~y~z~a>jmT-Gq#aH1S4du$lv=nR70G!!rzIQxEUw7G!?`b~cJC(*O(5lxz zis@{Iv4K?Gr8;^qHtm|)H;elKxjyc>y0?&5Rd_9@O_n*V`XHoYm(2X1V9IsmL#jG0 z%MU9z?5({a@L8eGO~N>}^$*T5$u2ROKRM2>_`2^1cPPl*tiRM8ez5Pa-hTKdJUwav zn~^z?nxwbnW-c*{m2V*n{|L!1I5+Q{LQ`QwT%=6Ta zuer;*uD$ffrfs39IK|9$@>3{GlJJuXk?L~}BpQ!)qEdvc3#I>%-eTjz+J-|rcdm`9 z=r`jH39SPvHFjsJ_)T!_Ri@bVt4jDred?4snCSnF)FqV?eYF0McGO%dsY=r-t~y3g zv)&T=O$02oWT^ev_{3QJNp6oN?ojf(b}-uh>~TJdmn{}AmvN_!epnaSCa}JbU_5sj z;aMv8PUjr&rfL(CiZ2Hu8D!b(jCB%?(V(6(i1A%qklw+s3!Yg<;~^xy6xjI`qK>#O zC3eNrF7RR|_eFsFYNXYWhb5;kK?~OEnQ#{K{fv#C9_P!#yQt4;Za+&$l??NPYXha# z60u>w>%mn1_rTm2yM8ilk)$gjR3mdDEkZ`m$^Vq=3B&MNEVvp`W63&%lx2dSnrh}X z;eEG^FNk42`2HO9)k5=3_%@WP5Y#5e59F4F2-n#j?<)99FMiW9{@j%ZwQYqCyY&i9 zrjoQuzvyzft%qPkkC}c^TT<2BScy%~3cYA^B|#;|-C$cJCSyb}lY*7KXgg5SH?{k? z{*fiVG$+ds>($GlIq7=O1S;v|Fh6RNkf)&XAwuBr=X8FoUh$W461~g1Pt_XlM>!m& z+xl9(a?2RAbr%go*dCi2J8ZLE%TcXRsG{{? z)X;abcIIhHp;c{{gN;+m|rA0SU5k343Fgd#k3C?Ji0oM^ZsI( zk2vDN%b}^9(_#vyyBg|6ZW6(Zbc5RhSz%f%Buksgh9S_-;t>p6HNLq+vx=}v+vn% zV$rcQf-H!@nNO0^v`8V8v*sU(*WYpW+*|!_t`b%5ogc!$e}rLC&nFB5nT9*0 zBkK&-k%KS_%BsdrfJ@gy@Q9=9a-Z%ga~jwDYPzlAE2Z{+#ZK#2a#O2Td`QLYxj#FG zSR7JqAk)IVKZLH~M-Ucssrl~*Q!QMkM))ECc3ala5XcE$#h$kh*x?l0+mf>i4fx59 z#d|U`7R!9wJ+uw!a-?3?uktT#M%PiHD4>0|uTuP!8vtPj z{eQo8Dz>Q`&#`N9Cb z0#>x}Yor!O2{@*`Gl*8E{@0c@OLk+XKM^bsJ+bpWvA3g*?WtH}`*K@o zcp)`MSBS@<%Q3C{KGa6@-`VI3#jP6SCofQuhW}Fk(-Nx4O}~oj~Nl{8m+Hz1%sQ?+b%e z7M>WyXDhX(E^MO1tvC#z=L1w~taTb7inul-!Elu-ax^+)4O2W-vpl@Ps`W+BR0zX} z`;OdD2H)%8FC|q1?Hc+ugD->Ef_r^k|F5W{@(6H^5zu4X z9ZLLyL}DH}WQ5oA3vGai_^=kd0%OEzdGns|Q;HYu{t8UQqnfy7s!8v~!Mnc2!$l-O zT0DzQKG;1ND6Nj95Uf{hsy8F4~nC;_*!SVbFVP5wm)U&AM6m3q__*;>F8|rEUeSe z!_Oo|-#2X^4CavL`}Di6o#MHMU49~iH;KGttQ$(iK^?0px7UXgC_$1_1OKy6d&|F| zpckcPD~Z*_Oc3gaVHNh3A#-_tA%<5;#R_;l0>sB|U&dy2yAmCga(8L;%jmJyOob>5S3<V3YSvz4|z@nK}O~uA#+gX2mi8gY6eji)=(Lc zfE8-|7sRGpg@Qa7_MxznG}|4)FebvZBSBipce9F<_^DOzqQ9oe@ar7Lv{>D&NyTYGetAw$M2%aHN1(Mp&B}yj^g+tOet0`NSBH+dW8Dyy2j!{uoi-z83HnXjJWwv;R z9@brfs4a|m2=_!M=c7M_i#I}O9JalWhtFZg6R_aN^j&gi6Iagd(L-p!zV`l~aY-2G zWCprItD_%mb3ER?yMMcHe*wdA9Nv|=`CVb*-B7Qvtr*T9OUAB4XA0~dhEwI1iH;yH zhGh=*yc&I0A|rgU=$Phge(1|AOuZ#b-#}xexC=X~$492vbkp(ci2L~{8`+}k9B6)A zV}DV>pHVTJrB>GJC6H`IGof@^X&HXMHfxnk@AGxpaPE_JJf0S)c<1wo0RJgeRM_96 z$SB2Cj{d<>byaA6S(c6>f_qr0c;CkwFMlPIXPb|g6Y{>IuMDo~gkcJT^u#Bk|ARYi ztnyzq4Y?gD{?l!8L=`Tg-=xD#69O|%Q;(ianV#rO#p{?f?qlPcPwDZ9khdK+^5v}e zM$ZD|)wz|#qsrJYSSsQ6ZI`aHM>^0!c$SB^cxhX>sYM~2<6H{!Fh!WpJY0bf1GzN> zWy9}EgDkXFhPI*n!h8tg>eq>p~~nL9Zxeqimnmn)@NkTC59G>@1ckYij(!&ot=qU z=mW@59X$&^WvO8z5Bo%BVJDDS%_HVAJTH*BF?eCa;YMv;(E5%a%r`N9Ps&HL2u{*t zk+do8*~Of+pJR|~hn1X-3w;guHSavE=B7lNtm)i83VMFG0{MQUn+c^5-)@mdzeB~) zA4~sIZ!2%^pZERb~GI$PxKW!JP>r1p(ylNN$t@f(A+V24VI8K)c7GI0=6$GCuZkm=_qa zwR>Zi%=}b<_jPUyfmf}Gr%6IUYp2ZdOHdXr{u5ZHl#zofa=|D)r^8JTHCQEqz zjN^IkgAnn#&_*0uHdbM7H-@T1{75>iP(9+yxGL^)>V~Pv3T=ef17VuL`Gv}n?0qZU zd$adfdLq}rx=i?eTOuW6q$ApGqK(iGIC(Mr51;8Uh#zpnRk-A>uTkOc+qZNmB1$>jVP!v)G*)TIc7U169STMA9H-H zb{k4v?gHCUe{g9O>+MEG)*Kmb1)mO7$0sDk^u2!a8xCXK+%-H}qfg2%SDc%D6go_VT@CP0RAy%LRs&vltK1c?(iYoY5T+@a znH_nQ`|hWY<_0r0MdJd3T7*?5`jy^KU@v&fZ~c=QZM~;VEsJMjZ0i_HW%M`Uf0C60 z=^}*UEseeJDhN=uwOQ{d>CvW0rFqU^q&3V3*I@hx_k63HD?T*qGh1|ER+x+9G87Dp zkNTud0Z@WA#MI8rf(INrKHiG8{zPYY_s_;_$CNSfYC5^&K{PkB~7aSe=cz zCW+4|kaV)XvnQJM>&Tc!L&hTvEDXP)j_NG{FXh+zF^RWDK=4XSy9UWnR6TD z2g1NW$MfEyWPBKg(TrtDyMsw0U#J~B65mhxMtlfano|F!^ zBNn2g;oFJiTNSugf?qdn&qvYaeb{P_=Z9j#f{{qRXErCq5lcJtxDW$m)8 zX_WJ+^n-rUDI>1Jvl=nl9^z*j!iV56u@Y(bP?8{bc}V$CpZ9A)HV!;7IZ{gx6EKGq zrG8g~nLuN%<%1PeC!=ntEo+7kl(2jh?+x-jwf8BXx#~zRhyU(%=RR(Xvf~UVY3Moj zHz;3|_a=MlXUCri%ZF8A;@kt-7^e0b><_X3K|^Rfjx&)o_D_rtg9~edJ@d)7LAbQr zV%CJ%=b*2F6ZKFS1V>f$=IpciKlhEI8d{otA-7G)ddQf<;-)YlMILWEeIuCPZ?d#_ zG}a=S8VBNaCS!PMNi z5q7m-(5YM1WZ{ryGRD!M`3@#SUqbuW8T$q}Z)i)(RACu z4GFrRl!0#%li9~nM!W5Cf9cD>+mD;h1>Sxl{Zo1av2|D}m-YW4>)qp`DBC~&nPnGt z_HeO#vpc{DCB2E{Z(p6iA>{dOFAq}OKZf{jRy#dOLq!=;GpyiVv7OSiC zR5aqj`Qi|4W#Lkz1d^#o*W|Ey9xzQ-dF$ua!)*f@&d~?SPs8DKELoyw;|g;>qYn^i zK_AF%*5T|G3s+EZVr&7fAn4qZ+2|wj#rR=0>-pJEEPS*At0}-^b3qAxuo7+$!aCQ| zJ<@qOsbT+oCyo#co6@JzsalgXg-ib#zT9TgnuI^;GZ|Om?+0*B&R%8NNh<9xTuO>>1E-tLHiuz~A&Y3S z00+dWgb*Aztxbu)hG1yes3BVvmU120JroT@gE)4y+M*>~Z9(&9D6~VKP5evmS5=gk zcix3pt!%D>bPvXL3_HPNW2H57nSA!FBJv>mVqu2?$4qkOCEg5VT@;FsO5AfnHW>3! zD(63~NLdD|nNk+Jg!Vbg<1PtZuooA{CR{Q)r5dVtnXe zRg%tQo8Fmu~C78ibgH4=q^i1P@>tr=t2{Dm+j&zD$VXis2_>bpt2h6&Ui$%`_ ztc^(=aSX597VL-r)ftGB!B=X~MC{~v%qGtR=K%5`3A2@x08SAy7O;cSJ5u(x91|6} z)nnLs!yzxRuLL!-6O3cGG1(UavBZ|zhG$e@fMNkIig0%zu|T|wXN|^}nfbzd=GWMq zaN%S|bvXS#SuuiZRCEp@g<2BFTgwuK6_&i=F^@Gq0lNmUhm*yyw4vO=z!^k7j=0SR_Oj;PLOwQ-8q?v0i7>9@ z%K@l=swr#TXqjp3Qwhh7AFX^rZ~P#>odjV3LPn4>W5;0EH1z1?CE*{F{C}Js2&+ej z4aHHv$2@~M;Rz&#=)JehJ7%8470;n?pBBeik8VdEn1^YwhErE_5{E`i5Fu08P<=K z!Y?x{B|`6Baf8AZtUP)P@lmKehh1{dJP1?DKI1@(h^*r=ZDUm7?>RogR8ct|=ZOZV zZ0UjN&=bs_o@V--l6PgIm|`NGSn|wmdH(>1VG7AS}OZ1<2v2{g(JxL2ftgsbd_EghiA-K#6JEj zI84C*_lpkkc&p03BBN}0UWgh>*+3{&`2$F79Rc%N#B+Yp%gs()tg%ow1|!Sva(7tW)?qd z666hIyGC_=BHIINBRiMSHm4(gZT44z8PCZw?hN)n>dI05zwTYl9xs61LgXThM5=IC zliXCgnQjq(h!-BRfjT-4!Ua=Bh~N%GnJqS(-4HaPGh@pWU8nGw$x*QhgW2q62VrE%M=1oiC&J7vvwfp-n@T!z4L(%|xHeDzNNy!PA0_ z<2t?ExmfPJJpN;TxBBRA88!I=p>jW)Dh%8EJYSKraDxOsm+RNqcLl+}~|L)Fe57R+ret*K#6YB~zFAf#g`F2w2`vKa0WIa?%md}ZGjME>ONI5v6zhOu>vah+DUa@usIqGe zPHx9|fkDjGd5jULGvtXDGbE@O!6o&k@U0isTQ}!XzxF4n{eTa1F?& z6@KtPCuPXO%C6$`lQz7NM!DRI{z9@u4e|=Vw88~z@BswdGwPL3NV2no99n+QNcZDC zD*9x46UBYPAO(>uh<7G+&j0K!xdB_a-%lY=GI$8Mble!e=@+;=K;=)f>S?6Ptx+mC z#6a|9IVO{FBZK>Yf+=>y%z(p5&G)^J!Z|FC!e@|;YRkYR*NOO7_*skwNB5W|eM3Wb zh6%^XJQKG!QE;>8gW=?K;+iOYK)MrK`VS9*M}yfEmCVjPWS~Qpdr?BnBS68i3)Gf+ zb;enl^H}N~4L3CeretOXaHpc!fr%jM&>8pn>=vp1H*yBe;fVNCHPBzHP*Yrk{p1R~ zKjW=7nRDmg)5fGv8`Hnaw^jd?V_~jyOh+q}jl=Sd`%v4yFm+$8$-=|f`PgHb3qKc9 zdopszAiCb|F~7)dA1Y5aLN*Jl z9?=^rT1s#3LfF=QC16BTsqN+Rtj$g6w4Z>Zx#&D)ogF~ctm_U`=c$kc zSt{pMNljIicu-wA(Y=kHi(}EM#tkYI zVmFXcf^~xEISu=4@|wAx+^ztZ+php`YMAX($PNk1?Zp8kEEw_d8}#$t1L31=K3PLX zyWPLSZZG{Te&B92nAX)m-y*25R@Hecyxur^Bm%nY$Q|OB?y?^-e0z2FO3M2c{k6Xk zfnnpZp)iOpV1Ezx_`ng4LIK|#aaD>d{|+!Y?o>B=D2htnYt6=i?4n0;AK zHTur_Tb2fSr>K50{p0d92Bfh`8CfPj!u>-96%R}ul;`sD@FVIa;Vq~*+dbOvt}7%z zI6Et-NnNk0qt5(_^C{gpwW;r8>+~i$PSYGsIy6F|D*~RaLK8@`&y1?7NK226{nacE zA~GKr3$j&y>$N3!25$X_!eNgG#9Wk~buYFuf#PSu%z5n&I@b0nMISh5XG0Cb38oPd z?R|5kH6@*|x@+h$cUM4suKoMKzMXh;Cn@O&dVEg>yrR2B4!%QbP?d>d%U%vn5c4v6 zoxBu5e}f+Bi!tkAkG-Xh&Xr>vAncjuZlFk4L_M4xHADzB6eJ2E240jGW0bf1F#vkhrm{zomlK2+=SZE*7~&ts+XbEP`J*X z7zbA|Fh(p+CI`~97O?9kVGHNxUu1AB-l|=(&Y{q(rr-YzU>;@)%3*>gJq>ffBlxv; zUl$*zMD@moNx8}ZTOZ{(mHd6G<*6u#8cwN%uT7cb*v3>I?{@G2)0|59Y%qQNgHoH( zQ8-LkZ~9Yj3RIBm;rvPy>S&V>2EdMB@sSC5Ao|E4jt|hPk2A+Ddj; zQ|x2VpMbyA5bIxZV_@SK!VMJdVu&gH#Kv#p67?~s;B*)&?FYh?A?ZI$$RQ0JQd73< zy<_2bHR7^8OW{NHk-b==k>WW^bxMq~c!)$K?kUB>-z4eNl+G#Q3Z<78Uk}E-1@UyL z@owuZ^o?__V8Q25K$8M4XGkk6TlQhj2!e~V<~W+slJuSuim^`Q?kwa?At|5Y(mWpn zybnLa)cW3x*=T>xK{jDnrv+aQ%XHuC^x9NPPH!dOF2z(T+@YIfPtsD4fMT z>|Pe)K&B9Oy6hWjEN=>t34~ISIU1b5&{KU=g|95bxUM964t+<4GMa{-zn!~H&7-M? z{W+N0%tXVNstivyyrw46tiFK!qn14OkJJV$eD@RQL@_xF$!y^!#!+gok(UF}FC}<+)N&Byn z`VhLtGE?O4gC%&Ba~~FY#1lp%3q72aj%OaYxyLfUd zH`odo_n*Wyg`AJ16B}{BNIJ4$a}!y>(h*&g>2dZJy7N{43iaxM^a=8kT-l9mnPV=z zYV=*@&kSsTL?|W^>UA&Uz;zg$U4eaoC>0(R8%fL{`ui|E7FE?71~UbS9-fN-n})h< zt2LC20eZO2Ot|H$y&C5S&YxP%@&=TnOnnrh4Oj>Asv&3Yioy_o#~9Czk*)xT4j-0B zU6;l}_%K{rg)-N?_}59Fnk0K=2kEVy4sQP}5+-NeTC!pq`@{_TMf$bQzpGMhJ>YQ{ zPUb3u=_iV&%FGEepD`YS^=+|cSnD(96DDwjPRxl+*D-c{i?oR-5z>3C17 z&~F;55uQj*2_nQ{GOs|CL2!usPVQ6{Am3$9J%;-|riJCf{r%R3vX1NI*HDa#o~WXt z^A&K60VW*F!JHnqM_8~D?@)lfL&Y7z^x<;ZTsi)}@J^m16W&mAq8j#0z$69d4NkQyjwXJ{Rt<8mU@<50@m0q=#O7{==XeK>iR@yp%6)22_v zXd4@zXMm`4^CbmDU9c{cO1yS!4E-Htuv{C%%R@XL!`gZLOfUT-dx%&M2f*c0u2s%& zm76qrQ8o@TaBjM=P+(_F#S!VIIe=MG=8S!z(u|tcMQ%HmM1OjyWSO#~5CMU?&D10k zuJ`9|)i>}PBcI&t|9A8u921~j$P*)ch|;$*C|9uYQ?OCIIfbP9{R8mKRC2}4<#PHb zu-ND`^*x7?vsHwjg@XGUh_N`rVT%j2ax$VFR0FXXsAs!fM1h2IdNwjT3kg~{+z?_` z_c=~OsM7Yn8bal;KMXI3Q%8tPT(EX3XACD{!$|u;_;4sD+kcXU17_}HrK1bi*tbUD zdcv<)Ric)KKJFPxY$_t8qT#E8J-=A?B2}jDlx;y3cO~{E(fC{9uCQnsKD3<9V($_A zK1y)obg=@ijii6T?<%YkELcZ0az}Ljrp=FGM6n9G>X2#dTSv#ohU3F@K!DdK(JrRl zG+vHLwe$mFrt4juyQ&0zal|~>^Fz+N@Xh0$)$X5h0EC);@J_l_LpF}bL=<+c|HvV} zxY)u^b`OQid2Er6`&I>+c5rAM+o-A~gFvZg!v~w#;IEd3dW`ftFn%%`ji^eF38UX1 zQj4aQ7;HeHh;RnZe-?fu_lCpOc6LIIzu9RcLU(T*cHK#|pKrWsLdNI-bnSfxqoW;4 zyCZ-rNx*wm;1ule8-ucxab9o@CcDG1EjBJA#$|ks0ME(>aywT;y2dfeMg5g^x6(gcH`V(}P)=LZ}de;T&VtgyvqCnA7LI z0XGy7=A=jazW^l|@Wg8N7o8kk<)k(oPqFW~$Y@s@kA|p>>0X$rlP1JnIh)Zt4=V9@ zSId@lT3{YfF+w5zIqX;kPv$M06i_HY--uML9Y&kl$|yElL(fM$V*^slhbhqsTgS0^ z^thZ%c4Z1}F1+D9&2FzD^iZ*w%UaKTu0hXqWxc45b)K|7HUyjaWih4%udW22<+&a> zkRya*o?ZQHFYMdkA&y8?NmJFGMUJYQf%FrNB!dZ>XJpH#!o2}EU7bT^(|kX`)p?ZX z1MF0)+KXiSL~|BvP_yIK3Xyg}>UGHupZYB@Cp>l@rwAjLma(HddgaI)UmVza!WhZk z=z!G6IZX(zTKP9rn8V|Rd0|uxr<{`ZgCsX(Exh*VDQN}Sq-C&cB~G5@8!L_s7aE0c z@=vtgme>x+`O|4>F3KHjX-%T4SZ|aoT2`O*I#tzw1EPzl$}ByJlRFf)3<)`p#v1S{ zU?K9e!8_F?U587{ag$@!-bBkYa-kg#k3jEEPX3Fi_H}bx%P2$lTWtA6c!c4EKz!%Gp|Q zuIPowf`MI5|4NQny0=&p0vx+@yXCPdoj;+6|DNi?(wqbKwIiiN;;+OsT4yUrot$;* z=|w4ii>|jCJwKmhV&VUMgyVzAJS@R=^LpQKbozh7BL(cALsLxLKhCca!VquZv0|TNR@kkB=!Dpd01Gl)j_fib$1|Y$z2tY5{_pm{ zN_l3~ri_5KO`LU&TSsrP@0a#nQm=@;FV0qaI)st*I(lTvl(Y#F?kNjZZT&KUj^n39 zm;#ktua1t?&&3WG`7xtsl5AtTR+c>@;^M;~%9XZ7=KI6etT^0ldR*QXA~WA6XBo$A zda9$fHw*D4Zx0~d9dZLqm$Lk9@vb_@rV?0O}nu(T`lduA)C6_ zyXm_bZ^eFmcf*D2u2%A{lPnHrmu+nP4c=um9-P>EE`693C97xi%xRy>l77JK4=y~? zQ1#z9%_{BVN+Kkoa7zGhvU9%TCQ+B#7uQK6wTEpk_%3F zR~d$W`1$B(fotZft%sA0QG1hNDmjQHM*2<(+%*6FMv(Q5AVhBM3ubSPc8}(ooQ~oA zFeMpb0HRvBU4m6Wtnmq*@DaG-Sz>jO6=t)wcgaR9nc^vd+ z`FvzE@7v0CjL2$he44JMP5$&>%oF)LnDoTqkfsLX?{H`ZBb2ax?Eak2%W30efA5r} z?vz+o+qYb?Twr8}?KOc*pW{1+TdIa(1(ShFwjnC+OGf(>nH&}V7`ustw@DkkCYvUE z6J>laeS$1CRhBzInno9ZTZbKv{t*86u{cwOL=_&xc!g7n!uBu(O3^!GA2@1D257W< z=EcKq;AoA!)ZOS%!43-q)p45#JCcfI8kA0Q2V?yUV)O=$;!^O>Ws-t>?BAPLvzu4* zf3oyP`6hTPo*g~HvOR7&FM;h*a&PHuSr9xwRHTYMSHzndUnzV>&_2-nn(+bUG0kzY zLvr9~xCRYdh7y*`BCBFmRjA&FYTOuM*JBV9Dh&)yk8}+hi`WUQw;Bv%`Ka-}0j8`$ zR62w&W`~YCqiHjRa*u8o%=%fPRHSElvvJ;>lf^}jr`(Z?Y_IcaO)_?hh5S+On!|oD z0X}C*L6+~BWu-!u=BccNLmIL>0Rp!c?V3Qprr+Z(LUIJgdHqI*hoN7;61!xaN2l)X zndM&9Qz`bFS*aCzaauzAW4ba@!>TLl4He#U{x1!kgVV|q_$vZsE_a?GzsEqQf09H# zsO+hSZ{~ZpvwP)OL(PVx&*yeq`6rd+ONQ?=CU2@nJOMfd;IRU89Pbg?dulk%qPkbM zjgKicO-%W!itSvH!ARIJ1qmKZ?-sNv_p;E;EoqIQ_;q^`STnKjBVcpcmiQ}p6x0|@z#+BgX1EenMwgwjuB&2 zjkPt^+zHm*)12vFv~DzE+d1bc2-U;YIKF90{5DxGurKuefX^V@wLrv9eqs_`AjH_` zL?r((*spl;9Uza4qhn&vvW`+`KDm}=|5XMbfUSV_R>(SRF_JSyo<>MivX6S)$eprG zodg@?T5HNz>EFtvwz!OoCDQm2r|R+@HS_kce+1)$5^a_punm^Bc_rFxs2{&F1$ub$*B7EMaxW4Dyvo?rmjfMQs`>HI%?wqi2NyaSAnt##*d=Pc9X< zA~$ZA8GME6k6;vP$VrVAZ_w&=^6VpUnxW^y-XTy_0HGytXuIuK%KQ;jmQdA}U`Nd5 zteA|+Q|%2Bt~pBfJNa`EyGQNl+#80Q2!C!2ktE1gi<1(ZD`RJneAe{Gi{iJDTRv?a z?$6x#r$pv&fWpt4P_Oz6xUyG@kdj@#pWy~7A{t42A?~`rY5lsRU#8%126#@u0T_8UlqBTID`q!f{Q&x5 z>~k?BdgZOwd1p+kHLd>6{nUS44_-NZR7_!24^$K;y8Mv$L*-pbPgY{Ph=T^Y$ zRit0RM-FmGsRrR^Il^X=N~mU2!Vt&Ez8G?DIs3&c>L%V(#>_X=XBb*=G^!wTR)GjXR1 zgx^z)TScS_SUGc%U8r#1mFY-ts_mZC-a}*M^=yQ^8kL+yih`xH;a#VtGX*9#k)1hr zRlgQ3>`26p(!l{#7Jv>9 zq3uqoqa0fC!xC^EqR~k*yDF|NFc?!F@HkxUu7Wq~>FH!c0lJfF7m(tCaszJXW9Cq0 z9pm8gYw-O>w%5-8sOvOYZs_`6c8+%@N<9YhXE>$+9P+?cqhAg*0y_m&+_VT$5sn(^ zQ`}ND+Ay})n4TQSt@neYJRa_a6eIzlAT$wCkHH7)`Sj(gI!_f=gH<~1cOo?mou?#< zoj(l1qsZ+cFfy836^)0da1Y?!JMk+2G$emMl>a4zJvvZ-+O}79>qEJh#Uu0A;)BggpQK-B!-K^+;gL7^L}=NTlQi$4Q4fEJFmg5;5qu%u zKZH;CP1ETFb}DrL=G=0&Y5{M7ui;uFq8Ft5hI>Q@C$IzAka*rPwq-((Yh~9~9!E^&{UP7VrdqT`c z%jnG*D}sv_xLmOAWq4XazF!73BX{G=TCQciiS%5&n8U-6`U_FP_@CER2+Nm-&`LVe z|95OMRpw~#S%a~M*o8T^gx&$o>*#Qq+B#HnAsn$Ise85jDFf|@pMi}+E&7$H=$$JA zgxRKVwL)nAEqyM(Rpb|qgNpUY?VJTarOdcx*OU49?Puar|UX+f^s-=1(Gt#;$xbG`amB778 zFf2lNfL?=f^I?P>VW)4-CFcDa)FQdjzBH$$g8hvlYZAO>+cUH^*$b2PEzcn*mkW^# zZP%l7P~!lRO_vSSWjf? z`Wf>XuIW{L(l6?TaQtw%9#cn@afj56gM>l-7R-@GrM+(%&E>dYh(%sg)@&MUcQnAh zOp`q^sowaTb>~3Xvy=N|3yinRTDxL|>##kZ{jni6&@%6D-*G1H()V&SJiyslu0YKz z(Ujl)9)0-!N0z-2{PBU>FHI_?z;WBcbnX&-)N0tsDKMc@{4|ui7h{(PS~W7`eB(Hr z-HpnhEyUq)18e-M+({B#d;Xr6k)&%qfOdzJLGmdLb=(TZeJ&=I%HtMHr6!wNhqdKN zv=~uh2~VClt;n9Imh-^q4bG0a;%ilc@ z6{)foskEkyTwt8rIOO|BwDMhQ;0I9U+F7an(VNOU3ru?^nMMHff#tD5xP2x6GpP4d z*sbh)6;i=*K4qC_EIt_b1h`iz)+otnl@KP3GCj&4zFK_lQBwXWrI#>gJ6-0 z%7v&|y$AR^?LxJ5awVBD*f~I+?yc_XZ)=taF7{+3(MJhtK9;2mNPjG?PZ4{^a^Hlw z*3g2bgQ04fH9iKT6K8x(7Ml7uTQ)MZgMEG`JDSiMZJiXavR>{R$3);9O((}*3iPTl zX07Ls`}5OuPE(my_69kn#26!|34iOM16=*a-?5scoB8WXfw%0_)0;27Pxo>clw=36 zzYsc#s${>7v@bs8f>epOQCWJH57lup*(gGGo^t%9MLHBORO2U7{;`K%*Z z4COExMJkhDnu|XFmuBgvxXV$4*>*aL%JYn1U+|)&X;K&{hvFW=%@-{nh|oKVL1MIi z`rQU}R44yR*~}8htz2H+(ruoM?^$K)#sIQ2r1vGr*7eo0pD!YBr;-kx^K&G?)MGXL z$}yfF25&`*CJ;72`d*AynoDkOhU+48-XCmGJ5o49zcoK43X&#UEK$CDor{uMxtF6b zYAw%5Xd}B~IBg+Yh7=`iwJm_GA-3m~z7>DBORL+ZY};s+x73h(VFC#l<6uPO&tBT_dM+ta~)9T?IOM%O3K~Bb_rXFLM3KK=2onWzBah4}><^==MFg4OkdtjXSQ6iL%V?#?k-#;85~vllmVSr18Z%g0U*(tq z1-bZ~f5&hys@RVdC{3Q*eVK33kf(H}3wm*iwzxq;W-prGEJ?+-zcQ#`f{sdP>qusg zgqZfJ`~_H$o&8%;yd{cDek46bGVdPR5?$%S)GRFPVv6LYh9+{ClMOQd?KqACC2@fq z3UpGnKD|I^${s=9+$2lt|3SQwcI#YQj*d&v3V#`UMGM;(=lep|8;(UFE351I890VL zqv2{l;5zL+pLwPpJS8rQbj{4?_}e*#ya`T2?xaas(K3Z*!le8uPDZK9bYx9t6k%!3 zag!%a$z#;Iyh)P{lhUm*lrWl351W)Z&XDEE=IoQiN2Uv3a4)FbA>_2Ft4{chov3IO z;3#LWGr@PsT+A5$=(=}8f_j$8-1y?J@pwCAGaJ+O}`nIdS@_P-h!{z%L&|czVAt}$k~*M z*WS}*J;ExKTq~1vwQ~jgH4}eTc0XTLH4*LM-v(=EkZuKcqLDk& zIz8x&#T5ORr9UnGN?`WOwP2^&FG5?F~tnhaJGc z^df0x1FW->I%G*eDl6}?X?`&bE0CDO4qB>!Dps+O4O(cRC& z3?=wdDYtEeR2&<@{322Vy7ofnUhen-Xw8EM{s~^23af$NqutX?J%hU!@;zqW!^3So zEM7n=;*yOv$40l(@meFpO_kHrHI=CTtYr5^3NKl{(l1;gW~^G}Jk0K&cy{>_$Kk#n zSu3r+wG9p=z$c~dL*{{>Wo#R@v{wQjA%niE7FtfTCkdT-=1sDx02Tmy6L~WrzW^9D z^3RZ}?|oAt)P{$M``g%QY4AP1`Y=T9(#vvk((RW6Tc1`}(F0JU%)UBPXmC`tbo(Vw z*@NBLRHbYQ+#r136w-lor26h!?7Y65%Flj8_#65M(pKmx;GWS#1%ZxsvLBTm0y}#! z*H_Z>7`t}G;R@!T~sAHOUlyd`I&XktS0e%+w1;~pb=u&Hd05{ehKfFiQWRQFEy`P)dY~gtlD!1Gu zwtX4;1{nQ1{2EU_L&KKo9r<6&@jyh?w|_yE+UEz+v+X~dY2se%I}46X_NYR(*1n0c z^vcsM$NpzdwSa^a28FP zS(1Irq-ydDB*vWMk_AVk{;igZDjWSyQVt}AK&5Wo?_hc=(_vr^`M!sbO>~WLAm$;h z?0fvo&tytmT6NF`jrvxaPxiKwY7$rGrmJb+XQWOG>jycz=Z&!?GqTr`o96J<{LL@p zKV^6BqqjpHj`AR7ig7aiiCC}8S(EAswO&LWVg|)9IGwgM>c<-bv%akx6GLt-poj;32*SQb67V{?NxV zQhRjzZTXGAbom$I`yz5|i2D*UVfcr-&dpq8@WJh^_Pw9>sMwdw*aCK8d%pNFTH z;p;4#bmSj}eT&pwCQLW62C;e-X!R78@%QCUuL?_V50tLM#^GNE={Wc8g+44`EDGI} zyj-Uyhi0`zR&S|`oqO!p9Hr>s;@Z9vCB+^Xar!yZcWY5HNH;0? zZGmZ&ik^|S7lX$~Ig-f7X>5$$`8=r97-DN0ZYR5l_@#~vYl8Rz>{N#TmdUx)`?z>- zARAE4I^vQ))5_CoN=%D~`)zjP&5&5comctosn!12i6-N(8kG5!Ho{{Ade@S>3g6GT zif{M|9?^Gfvi>S#t+xJ_znaY_u!!qiO={(5Mqe7}IskkfVt*$#vamLW&3~I7+xRBR zAof8}_jnxu^pGsc>JD1ZR1 z-=qCgh{NdAIV{PB0LNsQokHdhG%kq`)4xr$+O&si>4?~jk?~>iBajmvAAc&NxPYj- zI%N;TuP^*btsX&6BAOwUAeYV7*@j$59`Hlc?Z>iF-}LHTyUjmpNKEl9lQn zh4z@pW6&8#LLVXKZB$uLH2tC+kpvjAiA?)Bht8by#`LUA{~@re9Ur4jd}CsjmwO=s zmT=m)VrubyNeLzwk>dv|Rq*3ss>w2ae7o8{T_SkcDQe2A?II%=!tPJ9I&pVt)@GC! zU$UD{&%}U}vPFVE{jdan=L?QXzItvKnGg)cSLOKfphT~7oO{0T#(ppS(Z29a2{RhL zk0v{ZBlf4lQ&UlgIpTlk3ZD24FkZ*4ertwt#wqN$_kSbY;!Y$Nz9yT5Beii&^e*~j z_#wiCCKnJgV~`^UcE>=>-vlBL*U~{I++UN!mlEE|xjgECPrPmWFU$+7P8NTa+;X##X=a{q!lV#SbCLzW^mB! z$rP5+15vR@XYKt*TGL2^*Fh#5hD@~*Brn@rUq@YUJ)Ep7e4idgXH|WY{elGEjnDPS z&d!oqf1@2G{CKXQGH78p&InD#;T!J&<^v~AuLrk9_ebID4 zPNpgN)=&~{G8M12u9PEb5nHyO?=ila{kYs=1W7T(Jqj|08#4+H=R+{E`-0Ig{^EM7 zyyMw_qvW0}HU69=WR!&v7G;aolnF{cH2yO}--O-i?!o zCr?^91?9HrvtUjzf1c@*_4go1v)0`(o2?#XQKewEYv&yPprXo{;}fSa8EcU1eQH`B z<=|(HMS3IIIZ&v!jo0HkyY9Qtq#-a^pPDiiCiYTgcFveuMsa=25(#!GF$Sq4&Y6gs zv$0L7KQZ$jvcdAIo6UbgeAV8vn>=z)*(FK>wOf3r&n%~HWQonm~%S!CWG_DyA12eb^py>EpC5v)2q-W7L-cU%OuX3 zxl@DA{>`Ayap_BNHpRBb6g$+r|H%yn{BvWW&4E1u?|xw+DllODu+&RZi1zbSb`P+A zCWYtZkfy`FY8`nh3Atr16Dd-fCS8a?tw>otu8A#2Krv8zlH0)8Zna?9?0XOPy3gEk z9J#d_??Fwi@`Cin;gpioY`4M@;fWx)}y7Y?ugV1a7o)%gY(@5_T;EqaMw;=9sfZ zS}>Gd_x$tfZ^g?AVCPKL(XDCLa}*~Ijh6_)N$X8shAIVOCRwch?kxer_mJ1i_&j;) zhRsr=I$b}sGeDZ@hTRYI(DxOGQzXAAQTvUW$e3Or*%-YRy+Te z-OJG7>H-|%Twvhp1xQkNy#kk$NrCcKZ0tI^2bQg~DWui|vd-GKm${F}CzH8rpfek1 zQuI?W?iu()K@Wqi@}9e7{t)dX@{+2#I7`5wVg1u0X~7MMl!X&)6}&yb(Ja1;qnzZV zXRa;QBRtCbE8Tlc)QqOm$@JZAF9pp=6!=yN`J<{Ygnpg7@;E;^CVmXu8;v{eY7FZm z9X9h0a&n?`xb<_|87s_e4$1;lq4*QrOI3t3(-jo2&@N zSK%~9E)hoy9yTY0b0@{KK8D!!>=cLQxno*NYNi+U-ZXxl?f zBjluALATrW4)LBMc7Wq3Jw5V|?BhWe@nv}acL=bNn(^$q5$zjX7T+vxj=Jl5#*Uzj zPZ}-`l2{d|9Q)X~{3D~z!I6g;-FS+B5t3Ji@NY4N zc`nYpAMfWU^SSrru*cMu0Q+9$x66UD*p9A=`MRf>tkfZi7TQ=?5=uO)q1P4jFgZxP zL8MgXnG2?G*5Dn^lkH5pHZT z+c}MHZ}GyH{uk7&#O1gyg<~j8UI9iF)Zi7M6ZUI27OnGZ>in)d1KJWXYsY}jDMYdR zf7t&&FJ?sSe*l25>kH7&^e0=QxVq>T!GKF+Tv@B@2h)NZ_Krz{XetwMC z2%Cv{EV!o2u1?3l6Z7z@{x4|*L6~^C7_}kClpNVHU0I_C<8+K+nf`d4|7GOhP!#Qh zbv5cwRsLiRAx~ag(;#HeLXQ`YQ4If0*}zDd^2)}4Ltp5)XuMi~*hUXf)FNh|25)Mm zhkktAL@$bHuwp`$$bXbA_2wrN)Bl?Vla2rl47Aa%rbP7@2uelZUR^VtW?ZfB9&Yd_ z`1rGT{OKDpU&+gAs_5+DrG|Qp48bqLk9MxQ$@m;qt6!*TnvJp_C-vXtjjtzQN{&BM z1MR5(PzWT@ArdoFSMM*wD|7Pk!VtEJ4@9|apCcNvSDsq8P)OC#Lnq+H{l7^dW&dWl zIMOJOEH(^7N-!R%o}L@#HsEb4Z>A^e{=*}s_tK9#56cngjG&vrI!^4?|86GG`wCW@|1$4QeSY`YrJDpa~ z)Y6og932ooJ{oz#WuE%~26W^X2Dap-|3l*;(fQ8uKnY@Q5H%e`Z(-RO$Rb5xueuEJGucBg_qoYoZ}$1o_zE%f))Gk5*b2!_-(@}$k_a=Bk> zvQ$FZPc%#V(u8*@_om|cMS%;KNnniJQ4Cf&zA2~)!Pw`EI!vs=;4a~8Ye`W_5VIK3 zF|lvQR2tj6e(?>957VHMwV~eeT5IGWd_SuEsQ=o^3%7Ou$*}5q!A~b=xA}qgedAoR zXk5g~52N>&edjk@mc8iw{zvT(6;j4PESgALR@+y(P^jtOd-B$ovooh=q*s3f37* zl`T=Si)RkIpP=0AtMa?)S+nB)6DEd%5uRprGPf-KZz4(I(3bOb*IhRLAQhcDkS1?2 zjx+dVxJz_?zq7ZY%h*2s%cYp{=CMV{=#|z+ru|p$kizUc{FH2CXE0TF>ms(AT4q{% zX|bK*Dpky1zB_0BNOEPBrdFzYubuTu(Z6wyF|Nc175Y)BUkf`F)cmdm1z$4@XGnaN zt~6p*J4fYKO2{OIAIn&YZimC}V^qEIB`iTMp!7M~`S{8@1r_bY2s))7BKOEamBV8{1)6W_<9w>1CD5FJg9l*>eRs zg+#BSzgWWdn(3gw=L6RThh#>64!70J&Hm{k3my$O|5B)Nvrhw7Tov{dQUq>QtsBK{>u)6c1d)k23wv~S)OOY zx3N1J7_V-BpK4;ZP$kS3Kl|2MhUMdt%1uza>2Wvn?=EmE`xveE zqD=iw(B>dK)K5|G)cPsvM?mnRJwmvIazOVDZnz3_cwjsu&}g_(_v1Nb1(iD8FW@>U z$Ft`f;2chJRHiOuAp}^v17i;3o1Fe?0H*!8htO?wH@ZLAAC$41DMQMdmSRn@;ie1 zn}qjTul^f^g8V}E6?x92{2@9lnEW{yqg0v-EWv8&61->JYz&6Lyg_$^`-rJ5gkL6S zzgJ}Nn2M2&eQb70f6+h^OC?Jy4GuybI8O*UY_nrT{CT3S|CR@%j=sGk~@m6etD|E&K1=l?vlr@VpNIp_Pi zyx;HFB1N}<@-ZXU+*sdL&vp$9T|FoS?-Fn!ie?sl4(GYeY!q8Cmg0wKyNA^ki8e;R z(cR(LO0mD|NG>)nnD|&z#XYM|{`vpHowja8q$;(*vQB~7q(Rxx85xvC_)gKY#Ep#a z^8iaImAI2ZLpTP3nss6s z(4hOjh1UNTiXOO|dhDt{RrJ3idkIa>>%(rpy!Mh->uR_Pp< zmGM0QLnCZ5<{*3Qsw0i5yUgulrLUBSJBDk8i*@6LraS*^ZDJS5>G*@sbu4!bhI9F7 zw>oze>KH^dA>-1$iA8&1v!$DXmkGAU^gkd*6rZ9qmxPf{LvA1v<&J?!%rp2X?Fn3C z3M znAJRzyu|73NUXyrR#oJ;Zz=I4tx(k?hqb;m|Hen8NE;-0l2=u*!iYO?PNhIw0hAdv z!GO|QdL@=}t{%!g6X#i#krI2QYJd0sPWD_ay~I%8iUf>?R$&TNbt&9{75eN3Qw3nw zUQ95_4?}5ciHcAa@Pk^3i33&aXbl4H8k&j9h_wy=Kppwm1y4PDj zrLS9(nf&jJSlOX!zS7@4pYD{sYbe8S2jLm!4r6>77I_#v)ED+&_}^TF|14%rNPlcY z&1OyIPLj{=? z6=aql74)~Xqd&-EK8Pb(>8+aAkpvTDfHufB<2wqo7zSexgk@ONRbrzkI%IU7m4`35 zOZ(51s7f#7PxTg~8v;BA*|h0n>3PzxatcCJ58?y2LglKWAX|+#6;lwF=RV%i#x5eN zCRh=M2E+lIkboYFR9t3o0hM(5Gr8H&15mEOv=v-Ty{5p*9gn(Wv3Oht5?f zBD15(gellGYIXYGcfa2;0Z;KA5H4WPG>Ju8_C1+5-aEVxGxTb-OkHaWCR^c@u@P=Y zqI|p#6<<`X`;orKmDmYa`?m6n!iDM9Z_O>F2nKe#;zKXFJU3B>KeS+R1e2ON^!$^G zgUqgmY8su1vV1+BDU{BBl-(jHa}4b}Lg1ppn-;Mc-POWJ8~@V% zE5!9XB;or)S&+eqD0WuV-8W@r<{NZ@vqTd7e1d>(GLq0yTw^#sXzXiu{2&Q>5{}8x zSAHx{T8g&NTK1RhH(zf@GJ!;H7)i0HzDr1^D75oh1fgDi2Jvu*2b1*dwcJcKpN%0RAxTo9wA&` z{cQ+3MiSg7Z}`a}9T%%4M}!+F$`#fz*n!jac#TP`XPlz=4d``1%Al?)m~`3V&IQZXX@2?c-r(e0SYPgTe|UqD9TYce%po$=#?-#FRD*7$ zdOuri$-Pf|_u6N6k5HoBr`hr?j~V8Y45k z*izQ`=2G*ZLFs=s{$D1esltZ?j-D0bo-lTu{NVLqsX8n0aIRX5Z$^6Yx{%CYEo<#z zM6HdwLRH|i2wsRmJBROJZa%%bDP)|ebt$a?ZZxa=}_H0(uvc6BC7? z8K65VunOHNk6?V{rDIAAXl#PTaOVkMIBpt~kG%?=8h9a^s?D!L9UD9@oIb3>g0H!? zS-hz~_haB=%ynSw6@G+pC5JGWdNu*ctQZ_@djBnnrVQs-4g5a2Z$L~@`66Xo@a+|@ z(T~+VMfumJhNQL9UUE%F=Xzs$LR}+5Kr7QXbn~=ByiNEIRle~Nhfpn!PufTZUN;8u z5oDH}9}L{fLAxMHk>PuO059bR=>*OwCm*VvuhD@L$D0zdSdQtynwo#DQqzVo_@sa| z&Bp!WSOhkJfw(8&6C95}^o7?+uhXad(d}N_+Ku~rXhALH0_4r_$4`o(>c~=z`G>JF z$^|tjwOFgdluDGpemI1FAM387o85KTK-s>Qj|&}qKR3ja8zLF!=RZ+qz9+?s=~9mM zv!buNwW}9MqDn~$^}*RhmA{UBpTMm$ z3#0f3jkHAjp)x3}1iy`H5HJ@F#Q>xMFv#%%m4ai-KQk>I`WpLc(>&Kl|h%U zP-C6dcGVGQEsGU6hCLBKOPTmPdTuG3wqor*iT8=#5$s~7=kWT3UMc2(KZ@YAzV9*i zl%1u{8Lqxk(teQ2X_ZKF+b&HaDitc`&qc9&0fs}fFFuEB$m;0)(5NHQ`Mw=Gj1sq5rdNzxXp)U?bYT=~3)GlnLA1l5U z!sV&cHsFbT`4G0Ejwtu9X^8#yj+6Lj!RLu&sG_t0J2xI;=6&RKMuV*yrZX(CB)>;ru*D^Cl?*%1ASxlG>p>ck(3GeCZAU)Qr z6GliD_;CjhJ2VpoQ6B1fV~`;wC?-isDVVBf(p*U&Eg%KQq!`9lhH5j3znY7Rq00ED zMbw@TagciJY7$D-3aSf(J6nVZjE^F_!s8GB;nz zA58;yA`qFe2ItSsD0+txspti3^a1oHULrvy0^;t7pgHBS#UdaR$lW^|s;y%8h* zn~t|wnbsI?lgr&SrBqL6WG_O9!n9*&gDk)zefM%<9Xy|g-rX9KjnOuht?pYOH=tNp z^e4gVigV#Q>=Lo(cWsj{{-pSY5M2<`o|@))k}zpQ(>{73WQs+CZ&G2~AN223{;|QU zp9`5%P6@HOA4K~Gwl9XE3_NYX;ShtX1LqitvJF3B@|TA4>${}eumEUe%Z%&0&V32@ z9hO+DaIyOfX>#z!L8}oYXF(|T|Ml+b{u8vtVqgLTrHUWU3={tNU`V zoV|fX`PK(>e<%0d(oDA$u~@KVm`JB6aYi=2Cf030`LkauscBg9m`ji%AkpVsFQfaT z-lR(cz3vU{W-C{afo)fw5f4kuQx{gTV`S`$a+t*2sO-z$H_P@|yrcp{8BNkDP^=)X zXi~>f^)&oYJB`txh{BtuNW_!&3_MLv zekPGNkyD74g=HG?)g)mE75CBrvCG&tGn)vx15(zfR|bO&-EW`Xg(tXWp&a&WeT&JR zXspVs=}8`6h$Pk3wa9p zgOp|WtCmH^x>)j*A-CPA|IW;J`+QFNWz{p&m*aN_C3d)F^3>vlI=ydZah&~~iV$iX z7q7R3NF}I!EMn&=uQFHho8TMOcEUr*0|0C4_ zMAN*7unz0CEM64F^#j}!{TGA2;)NA(?c{P z5u02C)ebT|yRDyg3x*4iXY!h;>+DrccIkS`Y=IXs=FPG_a$}`zCco1O&Tu|l?RISa zgpW{D3I1njBZJT5+bwuI!*>vH0F5$L@?)aoLoNKGmSD`CRiA%WyPo!N8EU%U)Y#mH znN76~)g(LI_G%OY0;0XKh)V8^UD{r zbiB(?u|Fc;v?l~Yv+;&m;CSAM%-~r_daKbJkR(^vjAgsQ7>ld!+J=U?c2u|RO+ih< z#n?Na_g{6N0Jnp^H4=1e-+{j8#L|2+(uyKWiON}Op=J*abIcutd)bD%hK^xIl+5DX2%B%a7w5H5 z7eV%7gc6Cfz=dS;iZbY2oK2RQGuxjtt2vNoo?jE2q$qim{COs^WA) zVRYq~_;f5n($cZ_OijNyicnrSiGF1G(P{b1L|=e|a=64g#!A{lL*Xk~>0wn~?rNG? zIl7_i=#t&i{9nmsBg7^~?P4!Q`SQFgdljY^nlx0{=Ek#xmTm zYIirLS0#whuINJEv{;~GJ9PZdQ7DNHQ&2S>Jwzi(${2ZSxrVCKwe1bN20bREA~_jdQDY%3b_Ewi}Rl#pXnqRGX8`npSncgXM++`G_ajYBFP3#lL=ka ziDfQ>5>~0#T#O021QW&+%$s~` zg=T)YhW^o+IEb3X+QQhu#B&I9>V_87!TT4aj@O4)yhgc-2Dd*EvivP2DeB%-+`1;6gicL;OU!Wp8#yN+xC;%#KIO+t2dDBfOvXMzSwv zNKfQ^5Q4w!o)sR+1a>6x1(lcIC>-}BJzNkB4;03%DU?CXJX(k72jKKr_Z2>iaWu#3 zF!T(i7)4)-7ew@@Z45x9%5iceSEM#976hPmsDc>tUGEyvIL=Jf$XIYs3|R zDe4kWgSl|)5h`KvJAmPi4H_KYNvi8XO@e0r8u+e6$jMwp)tzB~R#0u{KIFSc&|A1o zdU7#*Yx6#nbrPDjW|w#uAI$7JglpOPP6J{>G0UI@W=FB(!$gf;e+LCV^{~fI(lQ+m z3FTnj>cf`4BDTYRqjdf4z;Ocx;2>LaE_D8zF^0q!{0JFTm%v?vWl|1123=5?{qL{1 zfi}~sqRWBPII&=V7<B zQ*Xp$qon~iTi$0;mbzZ<>{n?kskrI&=9}E=68bA~u^a*>=vHChjH*vb z)5-9Fo!wZ-Kcl!YhK*4LW!{#L%Z0g)Jh|@-jza1oHq#o(MKQrh(nCXFzyfz8@Q5h1 zx}U%n{%sV*G_u!KbuxNq&yL7a=$&qk>{;d$@IOH|5X~z8b>e?JnQPR7uv)bPb>H9@` zg?3SK?mhaMHdS932#%C{9KKr z0tIrxq||BSeNU0s)ZDWM^58J!Ub!FT)lA?|a$^h;!?Aa{WyL8MZf+$5lqtVry>OLU4sk_8L8| zaPIA~xK?KSi=?G=9{a+Sp5Li);%!~s>D9ToFR14&rMP7Kek3l3p;|AF%K?q+@W*r= zCZ@%sCM_Q`eEk@E9_4nK=$a_lZY8s&-i`;jnXb8M{g0`^4yPu?IOGR_h?=2MSJ0*g{T!i32$u&Yfk&yE5$c ztKnjtY`V~C+2IHnEuBiT)Lk@0V)Da>N|-Sc_m#tW{$;uJ3O>wR1Uyi=PZ%ZYj^>dO zGxLjsNvSUj%I21~+OGex5ix9*o@%sDm3q^rLw<~~6^)IMrts%WW7)T~FmX78az5NL zL70ZTnnGXBx8Q=#UkiLT?8^#L1e(d_6#5(06(b(g|Ax%N7t!P)2jnKA38vJ6d7!^0 z3x^`=GcI^s9i)nu5o1xyr`t9rx z6PIE3orW{vIB9!)BtAmP5H)3Ib0*>v3L$ogcKa$S;v2k~YKUgIWsDL|#df|@ejU!C z=Qn58WP0X=`Jv#52dB@P0cSImO_jc8*?9Wv#gFq76?C{U$mK;qT%+0MOp+|N((?ly zSjpdv!%p9EP7-`0s=6X2adHTY+-85)=r zNzH}-VXejLMmv^H^G$>u=+!{hMH#MZVU0)9&`1>8+;xL>$;oL6ret`fG9fuRSRlG^ z7L)9h25~Hi1Vs905*Cxmo=Tf8ISqehI;=J)B&Xr8Odg8*)$~+49fKp((n885Rnw!W zq4X%z(BuTuzsMZdCxh3DdKe|=E&9U;%`2%g$9qz0Vpnqelu)hPhxHuUU@Cf8X+nA) zJfJn#vzJTYj;!8*rAITn zXJU2T8H-~M4CyxGFo(aUC-pXZ0S?Nh7qjW4w@Nydslya0uha5~zWYNV923Q{Mk#|; zm6`J?+p`rYqiu%kxp+anWC%utVZBIxoJOy({0~#@#fq@N&ESG*dnzoKS>6qUujS$_ zBl52=kf{NHAMyXD)5f*$ueymi;@-TZ>qA`FYRYP%71zr%S^+KRK=7SY(1T2|om9auU8I zT||RQndMUkt(+e))Of&`Om9*l1Hhx(4l3Q4q#-^aTPjxBVpqAwJ< zw}=%Z`LnZf(iz7#p8pF2I1hdwpNB_hg2`RsuT2OHLDojYY`ivc_1S15_y{O%_4`@d zL}l4*e+4{|hDV4W%;WL<-keWWOU)zQ6-~a`K9urea2{$E+uMEIq@i@L&K-=ot>vZz zDrS2Yxc~Hj(s!5m?XVoEmZBBH6iY30r2^~K=@hRM0?kfO2=}c_Ij6O%+WjYO;*Xdt zH)T022Bg%xufcaJ7+*x}ah-4C8r}RPyb}S}hT^9kTVOpJEJl0l*b~TgQ(QP|-U;JJ zV!^25Ff5A<1vsRL_<{@LaFcgszmO`H%54*Y?Dml|HT;Dh!dclWOg;vk9!?Ntb#<-3 zAkVB!PIe_+I3-C=?wvy=`{F2P?;MFUx%X8nNYIV|aRg4))=Pbw9(4~GfW2M1AB>0#lh4ZGI_&=ewjW{yJKpUPEaaW85x z-U@M;q*BEv5O#HK#NnbxESqGQMeVO77a4jZJ9QM4$?!otx?0+SVQK7;O0GRAYTY?M zz1!G`wft{3Jm};Zd{!sDr z1lGV|2R9{)!>k?uj6*8d6#3=_GGKic-oa%k0 z)L4jfiHqkrewVH898}*l2=*v((pe>T>M{pQ^Ib|*d^N$27~;_Fi#s^H=XWlHA@8{K zdmQo*ywAO4xmj1=(1H?w_PSS0*RnUJx$~8yP+UP~$utGN%7zMPOv1eac$F7k2CErk zjcD6{CKWgW*`H#BdqoLV&tH#4No4Xr7edk)xWhQVOcK)_9TVXjRKWRrrGEvc6nrUl zexRgd=Mk#X{=z&h$r{TFq+8WHm8YZf`!W37*XFE|U9r=N&LtY|Vl~ygUZ;QGf5?CL z!n2O+fQqlmR&qsep|#Q}f~P5c@C;ihB&zV5EZ~xCS{0RcahREn(4eHPPWXV{!78Uy znVDTqnxjg%14==pH77}E{a^(c^tO|7s-=7njuY_4kf-?`%Xh+qO4vMsHOmM7q$(}L z748LMWU8u_O1P}E-Xj;|{N?l;{Bjk8@OT)efu}RwKf#$XGsdT!;)+CV2A@g zC1QN+92Hdr(P^ctBrUbw$NVjpCxbxdx67c<$Nu1iIUMTB;h}JTlbSn3a84Dbp(}zY z6Ir)s>U2k6C@WRcKWlFy)B}%-PbP9A!!kN^zTf5rjEcT8AD!IPZ^p}Tk8(JE$3aK)IEsU}I7QpZ+*kJxRcky6PopM|y20mYu zWFu|qNfkAU_~gO~YMjGjl(c2`2l#br_XL#Gw3$XVh=Za1x)f7{!VB!Dij4a%*;}xf zLYo#K3DLQiG%W?lOCu9l)=?)sz(%Pt%ZiQH)nQ6vQ=9N2IaVXQM}8B0XDo3A?5807 zR&fyX>10&3^MgkCpGeL(MqsSG<+_N=t!6Y~w8BsYTR9D730$w5PajJ)xO(*L9u2o# zM&pV~_13%>xTjO_*x^be*(Vd}3(k>h1W%BxdP{js(1KQ~M_nLntP;NNR|{`LhJdEi zCb((jeg;8m-yj_#IQh&N_(aXNMix9C0)L~~zd$$c{ht9(W;7`_Js|Bc<=3|~wV~)e z(^8fxHQ?LlZ>hBwkc3XI3Dx@2nziY4>-dv1i)fVB1vD(*c z52nnJ+X-;Z;EHd=rIG(-Zi)gzSo*N=CiL66DQxk43!NhVD0kcmmp*|fh_wL~ghy+k zG8=5+!sE_WQhH~{^Uh6!E&KHRDINVNDAlmLnS5Z7Hqs?=gyEB@x@MLzp~Tx1$lajE0v_`T_(kZ?~IsF z6q?$a3y)1_JqY7~Z?kbY%3n1?kBoO4E~kif+TL*;ub2yGq{UqwMkRDbx)z3U8#KOQ zVpSqMYh>arRPF<9brxHTS(O8KM&aVJ3XYHAKQVMKk;J)eE24BL?Q5uwt9x?OStAy! zXALl2-#r2A=WP@7Q}w?)J0l}DuYXQVFGS6Rui6sDV}WW?oq@4!Ji=U1Gk`9PCb+0E zj;yJ~y?1k5!DUL~h$ClG$QKcS%#D*qR8g18judF7FGF&5d;(QOPa>Aq`2QCU zVDcbkCpTb1u&KXkt_gDl#5aaSyz6|GVZTN3y-oKYb@KFtJ;ocg zh$eeKiR+G|ufRNFZ-!DecH@NhWc#__5%MjjBsw3Udsl*3bZ$0DV>)(FKG&UO)~_^w zh;y>eB-&FGD~_(0y(80uQ*b`wY*RVzgjlpT>!>1m&Y;i^T~S|7m+{yJ=~Egk> zd=|btN-^_H`1WeV!RmRJspl-dO_YUi zn~u-UX4pDciEUvcjyzzC6Q%4yPD*aIRnMj|;`k{3BMmGx!z+z&0d3R<^GmJGB%49b z6B)zUq{0{LqjG)-^{ov|;WtDfx^7h-J)g>RB&JI8W`maPnv9*wj;LJ309hGyMeyBe z{@#vbE)6`nkm)P=Hy7GHG(igMV;7#YU+ko1ONs@?^wus`$RP|C}uM8OQ(`YKi# z4Yzm{a@dNc+pNTd zUeEI~;0>mfj095#_F3uh56`$V((k{|llS@QFF<8DRR&=z_q~CP? zB@qRDxusu_{sBXkC=v6%Yi@6A5!Z9w8>M!Bfed^GwtiyrSgbv8iV2%c?q^(i5{`~X zh6=)$Z)Nb6iJ2o)rNh}CCgK=rCm6?s#Vm}NPbFkVrqa!mhjYz|T);riU?3M)V({PylA*Y3=-NK; z2EM26JgC;zT=IQn9RZtXkosh{nrSt`3swW}{ry$7ZG4N3YUh>_N57Ps-}eo*fR)sy z#RfA#hRNs+`+mT>@@*skC8_y)!U=|dEc!-w-)vm*9wnS79gf-A<4I7K7u**(hruVn z9Y};bk!Y+;4ZLZ`1rlt?quSs-6*MiCP14_m`wKifW&Db9=8FaA)9lX#zf8emcyTIR zS&19=o@8!NOy*QZS^$56W!56RO1S)VS(oot?w6q$i1dNz`%;sR4V8}DhQp%}M}>RFQ8hD&f0+9PcBanfblwhi zYaYVMe)Lohwo+Nw{<0Ec>k z*`6vQG$%`pRgs0!(zlhH?R~>B1?{-^?GBL$CHy(OZ`V;VnZ|m_f zP;Z%SzVvbqI~cCAIQ=)(a?4GyjJ>+gyhqa71pcwT*?koxRW2mKsAAjZG(@HIJ6Cni zrCKs8E72hW(>=a5oFPd%%|9n+M<|!C@J1`K?VAPGnZ8QvJA_t|Fde*=gsLR_`0jV? zC+H_B|Mumixt?Wpwv{UStu9Ku365fkq`C>LyoHg~{OTT2vxz}w6l_U_Ta0xwe47Ou zm%}rdW<)i1e3-i-6zaVQ-k3kQuL*8M>s;yB&bnZ8&b3XUl&514V;b2;0<~BbJjhbs zOW0k|&-XrRUMBJQmi!u~DstSS@ePQ@MG^EGixy21nn3lfGjV# zH598FIuQKucF9E~n7_&`k=aHi<98IQK=**3?b8R@c**_P0(}!KYY&NZ+2sdeih_K+ zjFw57=KAL2pY!%?I<{yZ+5yxcxcwJeuWyB4oRpHmOS33q#363SBd9xEpHu@lIjNrGH?vj!iBn%{rRnXK~(4 zv*0^VE@oj4=AG5sWiUgDP#<%1QoY$3VA~5 za4}qd+Qx7G9kRpR(?A@V?1SNs`%=%YPzbldns6!=2CP(S@x!&SB!)yP zbm?iqa6HndL$m(1qoIytXw*Ps?Kpl+75yePmR+T3cMNunrX0ngR3*F*FxJdQnh)*< zm5FVR#XbAjBw-Z!#Rq0N*DQDUlcNTS!^BS;<7)^e6h7}}up!lF*cOi$u0f+SNGH+` zhcNV1C?GBzZl`v?)%F4ZOqMir-f~#5Ry^88Z;-a-uQFeW&GXe&q1JDF!vgMEaI6WD zB^Qmt=xUf?ViP0b>pG}1O6$-%RY$_*`@W^GSvG`~zDqXB94osnoua>kL&KnaUPly) zAOp|a=LE1n();Z>PYg=d!CsT&-88x}^SN+WXDGK(E?cJgH<0Cay6PvSi;zXUbDBo- z)iUvC4Guim#mgxlH{U=naxc|BX|Jc97Jam`1%-)Z&NLKZBHD6UcK#kAyPzkO9$TJI zf3NhRZQ8dpz+m*0XH_U^uv19|2*Tb1aM^-6wolsOQ_Hmlp^icm#^fBC!}V&+6G?5c z#N_6alG_)B!akJkIED=2IpC(vBtMDf*vXgYf2|2}CL1AH^xWr>{K@*dGH&s^w6NG? z3=%%^TCNN@y@KTeg9_Vx)V<7`PjV+=+E1*U46B3R?65kFO;<>d2p>TkMl4?#uK5?X z4i7Hkm3ng`KGolgfnT!eQP$h8ZBev`4`^XyA>15yA&lnckKDlx z-h1R44z&u&k0az%o02Rorf#lyNszIO%zE5mV?}ARVHd*w8eWJRvNZ8Qc4c zegLDqFR0iAnZWe*qY(f$kJ5MAo{E7`9p6y`!%{7unY8QhgDbChzf2#HJ?5=F#{{gOA!R}7v-kOYFKmUARO-+zt@K7wA@bGmO_7p2VSF5ZypN=E4e^9P4CvQwYOHOAzTpzwHXgBQ65>n<0X#Xi?m9Wl2&2Ha0fVLI`mbRY ztTYGCIK)AlI0Fg_>)1C7srgbnK7~Ufg}Lrr{-x>g8s_(sxe=)5=&7c8jjsxUf}A|e zH6f(#q|i?_luA6f)=1UDxZ&_Y36oeZ8-NpceWofH(KOozPWYa2o( z<7e|not8N{I3*b+_C|WYq{_TQu*~JHo8FuWr)1>y81EV`BE|BC%=5LTXuYLSO}3bD zvNWF*K0!nVJ_{3STffWwP~yl|!3Qo@{X}N19b_nAHRD6{ax`Q`kn^SRgod5Vle0Dk zJ?>B~69%YibC|nu>IKvGh~5w$BUX-0h29HPMO$p z2UnBF-!ZseQ{iZmZX>2J-;-?F?2I?P`E-n!#*)|MbOO!VrZQwjgs_xxxjIV3E8Y z>q)RE$2K+0f&O;ms8%%mRQQ|NyAi@oW@Jq@NiBeve56+9TZ1Ql!5;Z>hb6a(g4gR% z$x~d()~rGOUQA?A>Q9cj;O(b@8rDBm zlVHNb05rKomVsx1wH1fLi)xr^U+ujevTvvs@y7zH#<^(;Nm_s-eD^}Ckz5jSHAc>$ z9FXZYNXlBsl~%)?R*Z6~s_}Qp&hHCh`#ioLu3PBKV8vnV3Yicmscaz*&M|KcJ9jbO z7Y0HHv(mAft{>(%gw zz{f|ENV)Bga6rVjA8<}Elb|=TqURFWl3|gC&;_XQ$DdiMHn(D@mV%i->){ZKJ>}(G z*>0hiyE6r%HJVu_e^o1+Z)RgSGJV!ppRdpTHiZ3@;mziG)2YIuezrB%-QT_gJd-d` z%M3&;aTX~|D4(C*B z@KT2vda^Rjf8yMO-GAU4{8|nkQT6$qup$fJ>BSMqbNA;qG|*FO3f$*CcL5Qie2R*y zHGct5Yq@vZ$zWao&qWkco2$q)z1M4KXsSjBQM>&fiI$_$u8v3a2UQJQBj6(gY%ZDn z7A^o~TBL1)VZIS%jTm%MiTCjiZv!!)?v9LNrT?&JR7gO;%dcYtRmt5`!Gwt1-8AVQ z!yQ9#YkkHrE}1bWZ;XPE!{A33#^H5f_!{Y3jNiXK9%h>*3mb)L-64m0T0@>HBJ~EC z&0fH`LxwNMh-*JNw-nj65H1sMP4`J^hH8f*&N#an$?A*4ABe*+ZN6X6WFjIcVScz5rPpXaO5w&xue^Hp5`Y0>3XdWMC1T znvsU9RNM&#SE{CTys4A1rA&kA1RC?G6sbxoh0ERSqYA7T9-WH2*QDSEw&39mCGK4_ zV5cm%%8Un0qH!ASyxrYZ5y%Yf$@Cd1{T>-SU_%V24tfD z5H3xE?VAu&uKEctyRFk_l&G+d zhH4KsO5|oN)Uxz#F-F<>ti{L(=H3G$Op$X{GNPz#M+N&{^v(XfvV#N-);K1Jt^=omloFfsHCYa&@7qT z+%XN>m&+EwdiKJ57uM%Yrt?SUl+Y4%VpMKp|BPhS=#xZ;$QBLx0c{joI9Lb>PTO<= znHdcIl`V2??z>7VwR7>-N2sBJhXRdICt$&p?Utk^!H-HRspDz9&Ui395I`7KveYh( zpkv^-C@O9H&Vua{yo?IBKcPv(9exHB@|_Km)YQNd3<&J2!)t2vXndKc!k7BsORW`O z-sAAauEUq2(M(2C+E?2o)Ohhz84fT%DHEL31pZGsY|)5K%o4M10+Cp95lJ0+?gyZw z;B`5XD)7uWypGIB!`1k41>VqiAGm=#0nEi~^Ys9=4y|fTOU*2@@83^Sp(WqT5z{l( zg=S0>K3p5{^zc=ccH+o~{gok6D}$uFnJ%P$cTbj-)Wf1AOSTGq7lAUF+x@+AJjSe= zBWT|-(t!|Bh=g)Vth_|GiVQ}BDWMBrl2!aw~n6Jt;iip zv&}L=>X{?sDh-mcqhN@EK|>JyWF}a0c zBM|-P>=g9$1PZbx{=dmCMv|H!9>doRnskn!<&IYvPl# zE`JUpQiZp_rA%UiVfAVzXN_{o`4H#s(Vllh@HsC$<9HkT&6fRuM63n= zPr1JpOjB!ZZ->y6`=>(bt8Vg>=fegLc{Wh`yQ*KoY&hpdLEWy*q83j!1?R0)f6KTZNW&&I+vX&5*hoi&4o9qsdBi#A9v6eBRfe)4yZft zJD(!mIr!$$2VuP??P2t)gAn2V!l7sSh!UGqN5MJ@qBme3(7aZ(H{)k^`x5EZXRHLe z5K1b#a}he+1V@>D72>l>-V>C7AdLI=B zDSU-6tOm;(A6tu|V3mnz__j<;GOUHW{Ji_HDxOcTguYha$;|BEX zEZM$EI1czD3O3b1r55NKIMRtXurn(Z>=EME3ZG#;3j^umY7I%zSPLMGvEE~U*JiHN zh~?yl?IkY;#9YwT|~)s9|xnN;mllkV{UNLn;xx6!SmM%&nvEt z4&^76F(a{CdQV2bL3zYY4yw!=)@~TA%Ay+C&1Tm4B%h|W4SQ55_lysjvxb#+!6!=l z8r*d}(Yugz$Vr*3=cHwqoGbyl!L>mO4=TWiL@M{+*w^h0%e_PM&$PE5^R0A;u+cBE zqjl0PTw54dt*AL|vmqNQhI|bDHdGr2+0^VLvskGv|C#V z{Q!03wU=D&eIcIXA$_CBWz9368aPX&`F}X;jM0>1Ny(#cqkFgT!JW-`gFZ15jD^@F zYCHoU@2e7@VQ`T$LI#BnPFo8{0q zjx!U;?sRN0cPiVY=MLn2q#-xto=-Idb0~Bb5?s0M4}&@mANyuI_Z?$xVwLq6Km@FX zJ_9vr{;G;B!rrl1Mn*e+4AY^48w2lr8L&ijtma4==gbb_?nMX{{DzJ}*nV z)|KNK5z_y2LF6EdPez)x{7kJs3!jz+5rgouBr~<_G#Sj5S;lBBL$x=ZT2eoZYO?I- zBzdjus%ItWBHVo%$a-M|m2V4#qaknE$o2`L)Oa=^*!y)&)qZ<(C7ej*c1Ezq2zrXM zgywvmR6;>Heg8~2!GAs-#(fwjsjLO>WcK2ImXwf&Ff7sUsd01Rh%8Q%*S#zL!NB_l zXgp)P6Tzh}Mh!qG`llL;o5y}P(a!_58{&;EFK&A6nTDXewNo+?$-NW4GT24?%+k3ayJ;^?S zqwF@ZILfnekaJT6zf^W%Kb2na9txLa{uz)Q0Ywq#4qn?kD6^*8+3Ctnl(c(8bCalU zFZY`QT=giGC$rsTvC?+dgggo53HFH6vQX(FM`6fhhd#uYQKa|&;CNr1pKp20&pTd(CS%8gM4_49C#%Fb z-??VUc$~Z;BUMYVKb$FpgC&r#lN1`uzXPj$-)CH(vd9l#8QIBE9lH@29^B`8G5!Q4 zwv8pQC`TAdPxfr4mwYd$U0nt`pIt2YqteQ8!H`qs(;DeH!31i0ym;=^T07rw|z4~l=6Uk4}V7`(mp0`fq z4>~EU_M+=GDs#gadL;L32G;4OShj+{dyxK3S2-KAd}fQXbSolp^(VNj1)a+?OKD;j zcw@Nh(0rmwKU~VM&*kMxwLvx@ zLG4_)678)`+_+qLNUv(a#m@Pm*rrCtP}N=vyb7{0lg!8`S4DnpR>U7^$+!PtKg!Hd zLx+eR_9Zzi83R2J)5oo&%uTXRa2eP^Tk$ICejukf^xzfoye;r;av%Jag=%&3o9h@iaf6bCyswxBAwbxAM30F^9L{qIVrTnU$S| zU#6fFz6lk6tjm~%Ez=@b>Fs&*+8$@dV%51YTUQh$^!iAY52xf+zJ#>btcS>{BuTSX zref*H?Mp0n{O)VW5f>3gz?|)!&qiIsSYc;eLD99M%iL%61Ie-mB(?bL?C(RIFB!P@ z)bfx0*YN_Vd(qtjk*VC?Z4k;}H~oGGIhZMXgMA~4C^N-1S>kRKm%}@5U6pCJud$IW z9Sh<{V1{6dO(VMO;k#$+T2x1%$0u%SM-+(VRgdtM_3Hc$4(WmX6OP#%{CkAYi>fr3 zP>=2PT|}X{`f066Q{UQz6xL>x;+S8xmgJY9=&QEpF=fzROOTkpFbp~p*$++RgcBSQ z=6uK5##|o*lm1;AyNrx8Jq==a!9^XM0W7MJCh~uXdiQ{+s{Q?cZuZ z6n9Ut#;czc(AptHS=n#r|`rN0eF zktNL@hhZu$S_h_R?FgpY9-B#j&W72~-{|^ARZz^m#V)>)w|6b$pqhtC3kXN#K^OU5 z3yFCHa)s-tseoOrMy4p)n?kazaY@z-_iq~2fM8hq*HTkSbCT6Nm+UIBjIa007w&(O zq}8Z>jm>0_LLKV5N85i^S2r}eZ_{1tq@C4k_Z3Y(R*F}Fe>642wh#gxGN(+gA^m3d zt{|Gp_Vz*aO-jEkz^Uyw6FKc^H!}WHw|!4~f2e!7TmEDbUN!R&nvIv#RWh-6CD-BD z(@#R$d5iG$y2SD!+@K@Jg*FfT4b2S@#|z6{WJEr$7ky)rIAWOpF0}a+Azhe4d&Qi$ zSSc)Ad7v1%p(V8~qN_kTr{>zxDEdct5z#cwKEg+&j(21%FfLF=rFt^^$&ZUDDjuIa z?jR+eAtZN*?<-Y$n(rj}KFa?U<81wD;d0OM&~}!5AMg7Un3~FP*dX7a!IQBif}MHx zK&Y?qlh17tucQ5&e$kTDt z>pZ>}a9 z(aG%?H-tcgnlA{q$Fc?tm6rrDItOQy0&B zPp4HLFO{g-0gi7Oxu=18k^_xLomJ+Nf*`g-w$3iE7q2TzB-j5{}p0LR=c9}?cK7oUz5 zw!i1*-T$^75KaLwBUvJV2AkQ@*|OFH39XO*U4R~yv#o}y>}t0!9!uCFRZCO*LRGT^ zU)ko%xhF(O)su6UoPk<0yFfaxA@4*2wO8HRT<%`as@mqWB7$(5=8`e$U>~AxD(Qz* zSn}?R^zUtm12&SgVlbF*#`D7UL~^yn{!ulD$#(fha*kA|dcAz@!x*d{K}GIhm|<+p`WjrNwfu$62cJhe5n zuiSZ3gC%hDAaY;`?>sayl+@@P%bt-(l{J%Lpm54p1)jRsh;LGLk>9ua{=kj-$+K*` zBkwLa>01tYX~zwhJb_*|xEhV@s>Fx&Y6P80pzu@Au+_2LRAx zD=pYLTI(9CTkjQ3lwZqKUEF0eE7eB1U3qD&uz(~F>|F!x@i#AV>Eyyon6&iUkGHUb zwt303dYUnSJM6tqPT9$(q3jlA++;~RnN21W1L%IdNV$j^pOB{Q^jjn6cI@lqKh$p) zJzC{xFw*tl60#wdzCT*LFSn6I`K#vt5R;QMfN4t6pu*YtV@`U#@IkWJ@I}x>jp6_A}W@lvHrk+>v7oEXf z%hLa1RNI?@HjlL*9{$P0a6};oHOhxE^kf=Vw3vZ-bFMl>*C2W=hL#VecMrTYb&4ZP zO%GQlXNXoWne^Pcr(%NQiiNCnIZt?FCYUk_%W#P=d`@;a>UyQ;h`(3N7VxT&bq|v- z0`&6(5XO;*bn-Xj;#4^YLxqJ|-nSi3GWOs3o}zqR#JxlB@9KynKQ9nI4JRcpBP3`}5fTDn{hSa%5L;8QYki~` zYW7`Vm(j2Kdw$ak71cO1iL2Zr9skidR_a56DLoLgh; z9Cw=~Szckq`1Y4mXWLXL|3~)Ee;v*lcy^gA-<#z1L{h6+(j7|o06*=dA839ob&@fo zX_=*c1%fCdDSMEaAo&V(V<8zLOC0l`(Xd7KFAQ{`FLCCx#CjL&MeeKLr%Z0QMLK7+ z!W*Z2*`Iu@6Ho6H_Uas^>$%OR77CYRm~y)NB>5o=)nYy+qxM1w0 z8f){N)Bz~a&^H8I0{JB-Fgr1VkQ07o?*wKft$s*^Ep-3H)5eRFeFK2vT>Fx{H187p z1mvG5=~Gdprx;jB^6*q>j>MrB-+D5=S==_aydU*FK!h3+C30){NkVBH>s1Cs2xW=( zi(YZX$b?e*ic463mw2sOme}D;oe(M0Gf&u9)eJ@c<%&OBNtv}i|x^^g5rP5YfZn33H zehVqrIjW6h@l3*;GS3yTB$Nw(q&d^V!1?ie$kte_mf`+(3u6^0gji$(A(H&A|v!55R)lZ#Njmvpu{_bBioteBfGE? zU)R7;_nwCK?T6Oj=}2zA_{ae2=SlreqTVef4`ja%h7a2cFULnW`sURGsZhf|o*1I( zSmf@Bc}jdo!;KN1(uhw}VHo0)>n@&2sD<5U>OjX%Rz69LlujP2UmP_3}LFJqiQanJLW7hv2qU8 z8`oYLCH9-hCMIj?TPBh=QyP2^Nwty12GJgK%xJ)2tF=kk{4MK;ckR5+H=U)@;s)Qg zfR>!$?M97|vzU7$_=4=qy0VVk9_{>@<4%jyCvgXrf@p3P-J9Xq!sa}$m(Pi@1@?}2 z+3vkf1?}Jx8!-G9MY-==7U0fcyoTOH;*iMf<`FHjd{0rC7o zve**XSoE=6rBqqT3y_VrSZT;;+NzfZ8U%baxCX z5@zH_&X`+Pwsw}&&C(ZU({nuWpN775;RUL`MDP$%pjDh{fU zcaS>4@$PcAZ~Mmu;dcLu;G#J8{SYBn2>TFjBmyOG(Gx#I{p z*&w;S>=9cebIYAdCiTKg9b_Lq#VYq8$Qx(S!B2_X3DgJS>0$HIXf z9jnJ?!A6ozT1?kD_7rxNIEM~`@_;xwx@3=c6viJ7v&aX0&;2wcrtP<)dJO0HRs|yE zJlBsQ%EfS8$N{lVf2^DOadcGG~rNV#_N_~gym2R7eW0)W{!k2Ixzr58%XF28BcqKdy zRGI`IiAxFbJ;V6wo)s5`3)`Z_x$E6`$r`NIGm1#K8O;+|^OE=5y+_#P?7Y0cBiyUo z&r1JlY+n~Ud!E<7}QXeEDq;`Csl==+Scv(v!CsGx^~LtOin8wFMI9sFY?)OF$_scrD9FpxxzRm zaYmDLpxG|Ub>DF-dnZcI)Nm$#g3v9~NBWc1qA;NtLvZpyjeCuL6#FKtjEhy1<8C-z zsud}Tc-=vCSAmflK1V7C5>w98i8I&{&TyV_IM4e;k+*;C>sU;FP?Jr{#pgP2iM!N@ zL=f|ueJrZ0qDK9Q&W{rxQj5>{NWPA#?c2$hSu5!giKdbsnPid?pcTs-Xsnt~LMrWJSVH%SLfi+Lrv2SIYTH zjwTNokF0g_yA*iEQ>I*osg#ixvB@C#2a_0e4!2Bx&GjB9salmC zI@{vBH^Pp*&gKf|5CTKrSwX+zos&X*i3-(ayem99l+7#J(z7kG)tKnfyRUk?a^C%h zzO7Lz*L$btz#F&F)w#R%Aa`79Rg*#+*)UW1!|W?}W$MY-G;mE?s}`4s`w5#Ob$Owk z2@FIhJ$t3TlSW$P7sz@_xKE0XyDtSp{g50noK**v_=BQ^c@f(~=%+-g`0c<%Ar}Wz zGkI1D%BagDrPx|F1LylmNhHH>%aCX0MRO7`+X1r4)qb3un4WW84cSE^IP;s-?MY(( z3({Y$qQNAHzbaLoIlIHQf6F8#Y$Mj;c^ZdH($Jmegsxz>`qa)Stj3?HTmz41)o*jj%- zafq3yG{iyNjpn9Pzmi-FRH|t8Da*9IWt@+_EqMrAM^)36{l2n;k~NA=5lRuuC6nj> z;8xR_ot+6SfJXG!ZCFs-IK>z%bHa(o&>ADdjB*?<_aC&J{u;=@3HZs3E^3<~+ zsCb)auVd%@{zBqT#Ubd)rBTG~X>TGg*=Lxu;MV&`=%Vs8o8 z&*yiA>RiwslD9V?R0x;b7E4Q0@!y+@ut1Sqd<=>VRVFE|Ik4dK%ulWv)1dw!NPD@ z(N?eZw*_TP){1IhFzf(4jagvK1(Sf0@B>Ru0G@pW7Bu@IVFHFB3Cd7t1DgHy{HW_A z5G~&n^c6s%4j={4USOP|+CY30P))T}SX%*K!oMfTal=Juvi_Gl7MKqN6!L2;ef1T7 zu6r#0Xs}zN@!JS)6~f3`KoMhCBRRMMP6BQrnx(+5aVOC|u4rJ-!5Z4k<)&0277kyh zxwWF&>f^q)+`)0w``O3Y7|t%IOu;x|J|ZjOd-daL{XZrd7j1$Ux~`>~8x+*bvO`#B z<^K;(L&j(`IAlR+9=z4fE%Lod^8&c2|7DT+ZKIh0`&KkA31XTm>y3XQl+?=q&U%?9 z`Qda3DH`yzF#aM{x0Y+U3;8h!wt*6%0{=uX9jm?)F>A&ZNRL56%}c7f2G*&o#T8=z zjhi+SnR+=vyKzEVdVFeHFsdXSO?hWVP(}x78!{C*6T0{5LBZPuXzJ2ZplG@iK9VrR zIx)!plgCfLgZ_(84cdoNv+&cY+4x22Dd{Z7Y2wjp%jonP$fnK7|{eeUULf= zc}?EM@C;^I@>_Au{YvCqmbEAdsDWz@U&;_x5?&^dR(|=)n z?k-sCob3!Vmv3jPxpp?Iyo0gg1_x#Zp>=KxW+csAITC>Cd`J~+@cB$g+`zNNMzN(M z!LRXIEAM3e<4Om4h8aJn+@Z!bVdBNnO&B88`dH#rZ-KXuP8j-MW?B&K0G~#i z-_K@seQo+Lqp*WZ*e(x;v+S!N;JDh?+%ca0B`)|T2Fig}Y4N|qG?kQklUYRv{y^(y zr=bx{pC-9!gO5q#A90)rMc9k{ngK6j(_DEn_j!h=e8}XFay`u(G()Wi2 zl$9m~y4Zg6JQ<2z$v51$m`V4owxr@A%W?)EJv=^D>q3!}6CE?il7Xi(D=qE9(opqS z|1ACMYHv$*M^pR=ysWjzC#>-2Y~H~Xb0D8 z^H6jH7qInH#Fcy|lQ^slwbpo8s%xQ;1g~Qcdfv$?Ol9A6LkqO&3H&2x=G0Xp)*2yL zwIx}ptv1e^)t-$)rab}5A>U0oLKozSbuNORBFJdLmDfMWv~iCQ#X^Inycw@SEv6#% zE$lg5+W$p7_KlM7#kMt*VV$kg;Sm<+M)1yhVt({Q(Y9#^MkJA2*=-tgAA{7Ydx z99FE|x7dQ8%*Ic#2yH%eCd?4bcWXH^k2}Xq>ZFDVK^kb`S7A(nI7rPDq;BIfRQUm) zN#(9!(|oJv*M&N^tC*(9#pLlI3eUFm)Mfb@@oBXQHxicsl4*EzuW&)zI`YBtc%~6S z$Ub=$Mi}+-@-xA-#L>3v0R91zax5{W3cMaHK&Wi6!jnWzJfNBX1&=iO+^+`-AW)wA zkFoA{D`2H~M*;AoLwI#%!>nW9_6$M7jmo3Z$`5cxq-^*Y! zAt|U~uJ0KPfI48k_U|wRu_yi`0iPkGi+zQ}sgK=*j`Yt+plJXc?I4n#>e}1of8~L> zU$E2J(Lq)zF{>Hhv6b+ZSNo3qTChMqs0L$7-l=N^`^uL~S@n(Gg`+}sxLcWZDphJG zN!A2E<2Ak###QAB%}--gnOQxb5?OP0M5y7eU~J*BwJ>Y*r%c#a5yrVC+WK!$%L;}jW`tZk#4H8-nda^b+G?<8jTw_s##SGv*G6lx~ zJ==$pZlYHFM6Z8}j^J^ltW|WH*8L(mrB~Kz5*}gN*iuU!MEQ-awd^MDBD=~2Ojdnr10hBA50o^~F=>Fl>-`uZ; zAi4prAws^_a8KYs;5x{Xt#GrkbER>5!Ar22VTo$?t;=v??u$&^zyqX@2!o(AWbJ?O z!6fX=@cg_`%s-CY+k?_vkK60SzTF1@IhLxWxpfz{Cq=+#|3#Q2InQiHfByvEx{=ykx$G#$9vnxAl3 ze2HM00AvjJvK3Gm963_dx@IUM?OfyIXw*9p3S3mU8#u(FB_da6o`LAoPmK4ZeUd z&i`xh4@yCF7t{w>7NOupn5X;{ea&zzsclT&C=Is{*pzMq<1lWIuE)~i!(LAcwU*$P z-xTm4`x~miJ$m0~Bv)gv*IaC3-?}r;WZz>|(Um^DpQ!lc*L6X9a>qYO{}1trjonwP z3iwF1T5QlOqm2I7t=QzSJHcVmxlTrmKN&{woZL9aG$R{22rMOq1VKQrZB?D@FFwDx=MJ!euV!V3Fdb8Mv-Gbi}0Fi=z=a--G?6-xaq>pZNyRMIlO zcDow9N6{C0HLf#Vtdq62UZ@MMo5?C@LxkjT_aAD6(IlUA_>7)+ z4JxNI|NSt09!=64I|Gdg2jGupUkF_EKJWM;boEOi-HW$Z$pz@lZZ%`G=l?>X{Bzfb z>od`TU;nA=9~He}?E1!+8a$B5f4=&YitFmUthP3kd$)UkPX0XaV{YnSi~$E6UyFOc z1r<+~KhU!FgwWqWK35yR#UIGrOTI+lmv5D+3c)!jaXRFmR8_w2QXR5dn>e-D7tYM@ zYudGhOw-{`BBg4bes5{rdEZ~Dhuj~zg#N*oxk(X?`tO7Ji?t09>~4OtdzHJ#y^ksH z9*O7%M;xJXYEVDk3gK4>V>GTFF26g3P5`koHUEW>=(H@HG}5v%k8TekgZVQ&;Y@Ux z$*nEhlYE($2=ljwI3_Tk+)f>@AC<@UBmIQ+-+^3`vw$hcK*74O;B)NHb>vecQ?cRC zFRKG zgeTCdX;CDddwcSq2J0Ov+`_!y`>{(Mllr+ADYJPah~Ux!gSB*xw~hs zYYz-%S~lfapZ_g(27QRK7MtJw9oZc|ZX__3g~RZ1{CgD~MaiN8yM4<%qV1phz5c8} zk9#KBfg54pAF(PwMCuYf_b{L}H8qj@EWW2Y-(v@%`tOMo|K;gQbJsbWQMk*P*U3cV zJaH$ut8cUXs-YQ2mx}Q! zL&K%18YNH1ec-+grNG?=VGWYZD#&QMYD`GB-#Fz;I#-%4_v9DF$rVxz7Bt)0p1RF) z^#5|>TRPI@O*y*_^r;Ax0zZa3_Z!-uN3%Or?_A3G4hc7rBUHt$>3NK4D}D=9U+nu( zR*`Sr?i z_MzclPm5z0s)R@TBS=@cYGP+OmPNJi^ff2k#eU-YDME#WwIU4)v-)~+84+HEH-(}J zB+F3vZ5S(E`aaAb?ii-F9anC~?p;pR0!N@7w{=`RHNPSxZw7`;;#*ih%uI9BR(1C` z+Xs_=C<>`^6u~s%E*{r)T$G@b*n41&u5Z?7Lm!@ZOQ(O{{TDIw_S4$Dago3;a?4ns!^}e# z)pe75hG{E&Of@bq4mnYaI;5rznbq^=XMr|?YZpceXT+G!B~k9N)rusjgjmz7exz8 z6=I139UAHNE#3EHp=~8KM!89VSMy;5*y6Rd?G@y5#ICW5tUqupxGLRYT1?dOg$Kes zI-YJccvgVJb#nz|{N-eVnl!``k0`wqF1s8yjbN5?3uOP^-S$UKf7nSAA~I~jmmmnG zB>iKsEgs=ZBFP#x3^hoI9ct7U+jpqr@UKB<47?-Y8ca-kVVxoiQ9K?k zE%feKm9M^N?NF4;qk?Q7s|ROW9JxrR6kUV-VWe!-vx#CxEX1nTf$p-0EY|;Kmu;Wr zxMg&`8b-Gm$#b}rv@1r|S@0<1m{PHMH+Mo(1#enm1p^;ahljCN9bvYv;7agj!>T+- zhfS5vh&6u3Tgl0Y;N<@R-+e1O80r#iO$ZKidz@^sQ_cTN*meKK_&fjdWk@Svn7D$p zE|VI}T5?@vhhrCLsB!nkT+hOnoPaYq4DYp#)d8Q4F^u!ivzAdrEIf)qSfIXR3*Mf* zqfF}Gy19Y50a9cn%VPT;$2VR04Rvg zl{W<{XOTJ!xhy5bvIm`GG{Q!cy1b$7*jemUKclxIcd(f;f^ zLKOzeSSW-{5mr;K;nW%D8FdmK!2gSJvy$a9H&Py0lyQEeY3BG4a#>FnP+Xm|iA5Jt zojh!sIfjurd9>|c_Y-U{ea@uzR|Znw$iFMJ_=d10D3P8r5SSp+9#uaiq~LM#F9@pj z>|vo_G)Y#rKIS?mLQnTiys9oBthe)zGJf04BW`+?NBha@hBlIkM|GGVd+Zc@q8%B= z&C=j_SOmxh6aO*a!Ck96Z$Xib<5jcpX85h8fnBslYw)$;u8~+>;zw$_BKYG)nMyyC zE;SpilyOX}JGbuF)Iw&S{E9DIxGFpU2@Reyv9$pbz@84mF(C>oZ`CIPJy=pt4p9=3 zh|z3kVn@%hgLW=9dzu%)V)X$RJ27sSzu`{4cA&!hWXV;g(ziv<>Z1G^G9W%bgpb3) z9{V;tLurNIgpo~p1Db?sSx2ANyLdJ^W5egZwT@TVx{~=fLR=+`9lHh}Cl~8Sksmai zf!?jB-;w-lP+oE!7*YOgWaf$YN0PMgf~k&g*n%o_)LL;K0u$?8Vmw-TsIA+On+N({ z5;sW~^p(?nahN{ek1!v=h5RkT390>zlpTp6ff8_M42G7vhUP|gVN-@k+M+=*;yZCO zGKn{6lg_y}gznNM{K_<4u5;9~LGribimCmxx)<12@P2a}mFa5i6lej|xEt74?XTDk z=p@xvviFH^XpPx8-uY^i`Ix#6;m^39hgqt^q3EXFme?B6GuHF2Y23Pyf`@SQNdKs= zKP2fNCy4i`-Ri=Vx5b=cpfVKAz zS}Idy&M8f@nn_vif$Mne1lXJWt}PSklNkI{?Rpo^pjRqgdpB>E}0$`b4DCU zjxDZx5Ea!EkXj1EVlj|gjJ=Q43^uf(2?Z7)kG@8IUzt2gEar7+qy*^eR9)d~YTtoM z&M3t^11tNoq>eVGxi6CJ8ti|cJT1_1JeO>l8$gC~eT6VD$+nP|P_~*MOHOIYa|yI? zfcpowf9~I0x&G63b8tIu_IDpQG_`@4Om9aa(B;x#HK@V#xmcXJ*Dfr+$j-_6wV(Gc zEDZJmLUvNy6|Bznh%3Bc<~^!rEBRso)5IV3bgLkKAy*VtX3DssAxzrQ%#ijGhC5MH zG!^+LyVjGwXrfhY2JvGi| z%NW@Ads2d~Eg;;;<63n=OS5>ozi?8P`~LVn@4VXedjuAyR`DHPUVLgP`>WJ{KzFuk zZs5q@$_u0*gTK_BYR@ut4b2^_Y@}BnBzei~bJn?N$~3g1w4;}kgmiV}r833&rB0fV z-tht{jwMe!#X;uIFOTG1UYfXKa8Y4Sqf_lnOF5bmQvR8~+wb_bU*ES71}u6nZ1#AD z7_|U8?|qlONq$HqA3F%JUWwsY(8NNW{5hY*=F$i?b!*9sxY*TVZwyw>;sL>xo;D6D zx>2Uf`8*WbpLBh&JgD={ZfLUS=l~HeC&P8*awOBVw?_U2DO?MJv3_8BhAvXpHi*P9p1SQ3Ke^3lCVstLm+%P{cRv9c-3rDehp#Aal496 zz^_q_k+t#zP~J_-IKF729kB$bwE2&#gkk*Asu1OkIBBWIJrh+6E3#KHa3MbfHQ|h6 z=WkMZN}2Yy{Cq}y5Mg~HQ-17w;d7ZLrP1G=>{2-eGv%LRNU24cptbE}qv$Pt*LJ2s zxsT8ywfL;o&5~Pb`VZ_vMA6dqN9-$Y?7czH0XbwqKi)r2(#NxnXD%?al)>q2Imu5G z+N7BwX7QMz$lWoCJE}sQ^(k|~@HPXE!t~u}#hxxb5Dz7_7#m(Jp%V9u)LuGhGC$<( zG}PA9j3uGR}8AX8l%#23|K{$Qra(ZsNb9M`WAWj#}&@BHL> zxgHM{y(Y*b=vWg|YmYWz&dKH&^SRS(st$J079!`EaJ6cXl5#@J_nB&eMsD)=9Ux29 z+#akTWxO&wja?5R4jT&#$D>?-EG_Ae7DBM>p5wHcb-MNck3v z2Jk6tS;;;sY2+OpzoUL-x95*cm~&AVaf3u@BLoiH1!aXSIuXKzN{?XupO&m^B8xu;{L^%coR)Y`aOocqe{%_i` zZX#(hq8#IIBj0Eeo=iS~UJZ8WidLJO9m-KPD#RlxaX=dV7x7(5UQQ&XPU9lmRXn;Y z4D2>$Zo*{Zu*%^Gb))+5nC-&!Xr_Wb6Qx60H;XJu)1l8@NsjBu#%S5kPSG`#!*uyu zyz~+wADF!>iQP=y$Z=0Pcb!YO)?xM)Kx5TU7HX6?c;o5pKiCcJ19quMdN%!ts#{^> zU<7%R+TYT4ev!GPPh3ZFpnb*^_>P&hb>sZk!^|V8C!DTEEh)?s5UBcUe-fqTBF$gJ z%#BX^i3l{Sp2|Tc);#j}AZ#Slv*{CwI?OmhVNy$}{hg626w0kls9xUAeLeMew<8+m zN(J~S1@t~M`v`zdi11EVJ01^(yOC54ao=ZabiNSkL|WXRQHeb%Jxjf@YkTD`@vSWO z;@U@Wz44s)UTYuU5pF*bE&ZO0emv%i1#|Sn_;raD(M^U3pizjFCnTHQS(Iot2Z=%z zsJa@E0X~&|v17BeNJjZ+PdA}!Y)U252HV1eB}eP5S@KGh65L%_q{-xTrlosm=QQ>t zTxsMkLic4N2MS|b@{O4mxoEq&bK{&7V7JgGBMS~E7U{bVIEI8uYvR{G&F)~&xreB0 z{rCEg`{LzqP^Dx?l2t?5?RIaH&=Dg(Dnq3IVAi;Q4NMBj8v<3;XL;mbvmrQDNr!_L zs)GNd!%0en;i*p4U|HE{0K06^FU=Y3WdA98I8X zU*8*ye@WXA=R^=|$u~|z6NcAq?Z?Q;xbDxO@q1LHKjkqk?stUulX361B_WT16lL1? zDdhdZGjDMFJ}UBgtt5X?)jm!)aC~hghJU`6it2&Z`0i4S#aJU5>L#bu!fFqb(6?ms zbJR8nr__iVgUyY)(8ARe?*EdVJOc(Pcr5G!&j!_5MSscjgQfj%ZAQ zCSXo#+V=zrIA6r8TM(QyWw5sh1j%~3!cDaa(E&6VTkEmVuOuJjssfe5Q+klS#V4F| z#^tQj_^$x3hdCcnWeasNu!cF7@MMA7b`IUnztnv*5>G^kH+1v`Ez@M1Micc^&JaJ( zvju3R!Zfne4G<{!YH&vI0dz(Yg55R@#af@Vd4ia&-8J~)z&SN}PwC|o!ElC3QP!{( zzIx+O9g0>TnGSd;EtTj_;w@_bK&a0_mN(Z$YZATADKQvJMTEhg0T<_j8P4+>-ktI@pV6 zkq*}Qjv@B^B^_JSJpyfD5}(z6uJ@$0LL&_44Uo$>){>hDF7%NHgFmnQtC3iZe7`)g zcb=uOwW+x^(6W8Aa7xdvWh#{%(sQr4DN>xTH8zv;HkA(mpS);mFr2&*#GNB*aO!8V z_hAR<+(-|ZVL8oku&;w8;OoO;Ek4kFNnoc?>(h~cAMAaThMu64YWlf~$ z6zmZ|To&G?^{fgH_@tFus*{AySovioS7!<7 z$PP_*JLxmP33{ZIzMGVBuN^pbUscBmmO7oQlN_5fif+GTMb!*P%4JO^4B^eVg8Zo^_o+phVBZoCC?M zmGm1so)F(Z%2OjsTN&;&Y2^VknU##bL2@}6UBG_dK1f(FirZttSQYS!_67)|eLV?1 zLrJ$zXGO}O7_OH`3#l4o4ld>;tunDc{d)j6j;!>!?xwQEg5Gg+wY9}J#Xm%hqRPu2 z|8_F7Kmg+M{{Bou-!2l+2vHeKy$BA`llT=AEe1rFU?b`mF27@e^r*HL+K7#Cs(B@L zKB*Yhei>tMNC1c{T^dvf3Kv#yKZzd$N%*FGvAd8f#zOa}m8o<5!j&!ayljF}ZbE@7 zB@M|Q!QnOOcKWwK&Iq$h{`)36Ps6zS9E{6%60c$=LQ2nu_Zt^W6OTsqEMl)p(=;mU zNb<85J?EyG;mu!f1> z>Twi-T#tPfy?kFUU~5f6n~tBN3d}EX`nIXj4-%K@@nvgFhKd^WdPzK`kJ>Ot^rNFW z)y_1ycc})Bpj+H%`LI2{Gvvc?0ocE2D%<<#(|E$(qPhB1EW z)M&26l^|x6IA0-LE4xG)Ym$@PZQ=m6@_<@=foG$RY=E~1M?O>%_5r>K;Z2@033s+UNNnL}a$JO=?bml!8?g#OEjr|MgWCz1gDfSLX*d}ZVPxjlU6y}Cf#FA|r zK-TKjY1x_M28Y6YV#&l?LxO4NYJqV=NLO@-u$%7u8}s5KBo3& z2FipPe8)e+V^-;1HG1KfqFnPVDD|4jjAU%)a8}_2vdf+D2Rok37>L+H`v|^Zc7od5 zPHObRM4lWaL0oc!&n3K+Y=DxazJ`97EO!Ruim5J>HNqOOglF%?19{LWKH*K=7Y#K^ zBfXu6tg7K2;c0!3grc*@btfOQr%s&eVDA?q3At`3uNmnnUF%AvRKbC=<4e+|$0JdE zH19WFxoj5fkvW{(^OeK%pAgrZynQb(9Oes+PS4{!dD253=f!6caN!{fJ!gl7kqw66 zW;05P)^)CeL7dS73GuW z&B0V-GIKaN1T!V+OraeS-URW-{`P&bIw%2sBsu{{a(ywb`T5c8USc+ry@Q#G-X|d` zVsCH_G1rAx4MMkCnxkjx6W`XUM#4f)@(_s9)b%FBH?@e~A=5O@rHELlU-)wNK>DGR zZ|r>U z46*1&H8r$~jh4DNW`r_Zvt+U%ajAubrZbIgmck9#b(9bBVbcoz)XJOY_AXx%x#%SU zt1s969I={|kF@lW@Su@8SME5{>mNXG#o1R`047FyWS!4@P~Z*R{2&vtW4Qgk2-~ad zr22XTH-xnne#JQ6O+l0~w@w_ZBQ2DvN*pejM^F7iCq1mr>l{#&KamH+RE-87fuiXss^iegvtFo2L_h2`AHK z8q(hm+|2{Jv$wO!ew%-M3sgHm`8M3%06XAk-JmL2!WYQ77v;~ zB9xulkxqKiD{T^1N0=~WgOG~s(hEZ~sMcj4fI;UxvSW<2(-PUH8aRucuZCjMU8}3D zM6Pd=1iH`n+R}NE@=<^s6-I9RNb#zrnOf3pAchEjk$k@Obse^dCNcvtI~mc5Yr@Ny zN3!?BCo?{UqKT|b0TPf;f3!`BoI!TvDHpv$mX02e z$BX=f;VZov~U=SK)hvB*vh1L>b z^fVz$$XOuwwF$$9(^_iZC*qLaR0-?GIhzzSz5~6j=HyPlgM6n(E+O_V$b?DLq&XJj ze)3K(5VL{iE6H32;neI+XB@+RrQ{4IVG+z+(%}_86PYTib(8K?UH!cQ|B6$dwuDSnY8>DbE1G9=f|*RdAg2J|fT)!4u$8q5=N z4#eSDQ%5^SV2dNS2reH#0>Lml3dvm&?r+GlA{-+-8$dNPJPT5Wmjy+x~BLyp}eauI1xOe_7^j>;`t$1 zrrCGeN=bh+=}950Z7SFnw+H+SiXJn-dl#s2Hoq3Ncbz z{+I|=W(HX^QI+AsCj%n)aWV>yU# z#my@-)KXF;si2Xa2IyOG$-YvPIVB}OuYJ_#AcONr!)R57k8UW*?q*u{K2M3hb(Or* zogIh?iUR!`yPGN3-*FnMVftNacN%WN-7)Uwy^jUL_APK13D1@gp_JZM7$2J{tS%OI zmvEg-i@%SlrmMqyJi=is+jMlIvUT*53+O0KFkL0Z44PFl)l1U{#34_ z(UD}GE>VIy!4aLmK_{n^GU(Q7(e_Kf5bcSr#Id%`g!c{&22B2ZF#Beuc zPb4P4z195yJ%FIYO6P;XQ^jHgyz5DMf5H9a$s|0Cd!H-_3LX1i1;c`vD=sE;ABauH zIeBYe4HntTV7Cy8S+X#2nta|_!(<}`pYEGd`X#qjl{}^RAlA z-Xk}`b5W(tuMFu9SF#7OKW+HMcq`!xx>m!M^6lhN6FWF#1SaH59Oxx%4&f4&&6BST?#RQAH5?4B?3zGsk3dHbXMZOd1IM|)iwPJr!i{upvWs8<0}0)zlrty_QW_Bd-7l)5iWFPMeKFl+mfs8=E~HzwEWU z$$AlHGIAx7Mp?;+JY6z1`)`t=n{k=08d%UvN4iykMtW(W+s_0Ndm{>FlDCcaCnJ)l z5^*-s=14o;nAPB6t5x1eWbZ3U<9=f4A4@POA^9GZ995-w?a3mm6sFKzy`XdXCr{j^ zDm*>m!pkbDpH?nIV`P4HFoCL}yfk$FcGZl2k<$=QaMeskr}?YpaL2em*`*|R9W-D~&FJTkW($PxeWlNYv8Tj^Q2jP_Y30i-0dA2d56LSM@CANJ_nO=j zg$-U*qfdUQxb^0x%JW9y6M=m!?=a(YOZ{?KYv<$S{Q~;@-DqMVd$B=WH?rerrBt_d ztbh59>Dk+n`+qaW04ZF+N1La2rI#!rpJqFs89(k#RpG=)Ci5dnhtN6<(ptz}9@HxI z4GP#GJY0Dm)%>v`nD*2)&~v5w9NX`LaahkUu8*^e?*oHXE-zccG#_~#a<{5xav_VE z)joq%#JR^Z73>S7LrXO@;Zbrxle1CoJf?Wlxw|`6LShQ}PZ9Sg`7)Nfi8hOPdQ8t3 z1%AipW7=40TZHXHcA7ZIRknaNdx}FGyBQpatmZ;zJc@|)Y$m<*JUfmhrSF)23>_=R zM{gb17SFWA{Odj>rs;BC46&P1=&f*DSn6Ddtj&vJm5xjn43G+POihO6iJh7BGyoeQ z<5UMaY(vQvld3T?zde)ew5SRjdd`qmncL2m8b$<~Dr%LPdfiA+&S>3eRgrJkfK^vb z;#XrL%fYWhy@yZ-8yk>L#`!)cM=dxJwD?Gvy7LAp9f9|fe8w}C#--@&)r;#hM72@u z2Thz2fVFU(7nbs5T~YFeU~_+nwTO5#bt40{<%Eo77wBqz=LNdBMrTgiQ)8)wUa+ptCvFL6Tk~GLOBq&s{##SghMrdT9;x01 z{#o`t?3YZwbhb*l*dK+(*Cr!^md)gKzqqo$dlFLo6ZUjx%;|$;UZ+8qaeFS877g_@ z+Nv!L%KXfrwyRNmMrP%_b1a_ar|as{gJX?W_j%#wZ0BGb(cfe8wF(Yx@J&4$-#>D4@qn_I#2v;^msM3 z^x9}vkj=`1>g>$oR@)&ij=YsAbP-J8A~KefVHSaAqJ)woNoa&^UQXL|a+i%Aic)h{ zjr}Th<|dHqr0CyvWA7oMHJM(ry07K^>|)m_Gvo1SOd29Q#dGiYzhkU{3m4xP>J(=a z>xnW$f=G4@La()AI68O}Tk(+}oZue+yzGF-3Qf=W))qKIy0_DX@xD~)r8&$*VP5|7 z=kzfXdrmX{eUH$|{qg6TWuk#d(V_9Bwv~`-O4pjm-y&oR^_9nV_l{;7X51^EBF9qc zRNi)zoXrsavMZX#8GE>o$b?4ocf$G%dAseA>@M=&AfbK~<8V}jkqgC+*En)>HcV@? z=tdiaC`nr$U17X%l^79?AU`oQWrb_z*^UB8Wv<@sLuG-mKyXVU3B zyH@H^V*{lNQ@5s(n#Ka<4)J5^9C|}5#O7k4>?7Ig?W@@j%D!X#1xCe=;yW|F`&FgGKB(7g4_*iI@JgNbzcZX5RS_<;&PPNkI8F z)sbZi@Cr>RF#9UWpyAvw@^B5QYB4^flxsZoA?ozh^ujm#Z_Q`2kM8atY^#-!=>LzY zH;;>|eB=JlfjKzq#mvocm^s2>&d7`~!UzM5f{G3}C@3f@DDDFcFbWJXEP`98nBcyq zxlTojyP1}j8Wk3rmX@WJ78RLWrB-H({;sj_^E|&lMDvv_XSwg|zOK*b^B%%alj8bG zUcxT|qT%A&!WxhX)Y!FysESp#;FNt*7-55+e%vNBp7SsouR*b`-Y{2G?}pMKSi-jr zbL{igGIFX=|3P-ggA5Cn@pc=Ko)NnW<&#I%(QEBFT9HZi2 zmHHklTi5m0`=V5h0&Yp*Qg3WDvge0%AJ?DIH+^k7qrsBandP{p7)%bC_(URXhadXktZ1i<;JEmU64;@q-??XD zy(#$Vrf6(q;pBJ`?qK`fWZ#fy7;Shtm>F^DGHD4izwC$e<3FYuGZd8LaUz_bf-PXe zCIcFzCnk{_p*?H#Kl#AYs(NG}^Hu5eS1D=**Zmw!OlC)B!z-+BXpU>HwAA`Y1>1u4 zZ#|d&NR(OJiyCm_fk;0?iP*0R0QCxLJUY)6v#b1Vu5%VUt-WD|ADZEc5$bQd<}_LP?mGECWywn$!qb{ zI7l{<52Q^_Uaz2rbKfeVNEvmBe&g7j)(S@T5&q!jdb~@_NH0g`N;87#DLvEqYB3xm zwlOei0v;4z8mV7|&0r^Nn}QScLtL$#pChqvz;%>XS|-Y2nv`+ot?d=ujD;#}4x%cK z8qc=Fn7ZAQYrtk97e0*%Orh{ z1)Ct`ugJEoe411+!Bh+xP_Zoy`sGsnm%%VMKckng_39pB|6TA)UExRmPJnk(CjZ_` z6dw(z1M%oQUz$uUpvE?#W1U$R)%e>9*k`|r9RvYw+;Hsp;S$r zAS_%vjoo1Jj)Lda_EY@poIWevTCKI5poMZUS)fKMQgi7wT39TjvdDKyRNoE?E|)V4 zjknVD2L@gczgnTCTiC&FVp{HtvmB%67No$cFfc2r_tJl9;IAf8j<9BZK2i>+S8L7X z6nsWF6ZSzOX)XJ%hl&!?ZEx~x8lZU~b{fu)%z#ELFw(aD~M{2#oj^uy$t z+LlYNxdYZ+^&_1oua!Njpc|8)1M-r_ye|Mgjzwi|5t$x@X~}&lS6e;l7o{)nctYKP7jgv-|GO>+lytVpQ{HJS5cMliW_v1y==EXiVnnrP0t z$SiP)5h}l2-MW;Am(|PGlupu_Z%T8IKiRLFB1Ae#SFUKoHcu;UkaKatl)2_vFzo_L7$xZg}6+_fD_2eA4q zSRuwfPf1%B3QP-~F6cmW#tMUjdn*Rs$;9*i*FI@I`8?3~$sF9}rSyyN2ai55h}N=U z{pc4@^)L$v9|1dRm?P{vV&S~-#JEAp%n`03F8cV|b4P|Iaa>_<+*G_$D~%)3P8n5Z zzONwD`(v#C;VNc|In3R1!ExGr9<5e1y_P;Ad30hAP<<&+`ELBG$#Qtf%vQ5>{}!B| z11BY?^0Hs{gH@S`^V6vCGA&suiXU*UDpsC`!f^OK(XoJ4smN40o+LT+r@G+0)qX#`*Q7SP>E;Ab2v|Il@8+?mdy_dqZSizd z)C2D&cK%d$Gpkpm(|cAfyzm@`tdT|SR>=?SO(W4vgqztXmci^sZjQ_`0yTx)=0e47 zILvWwG565jcEdS=WBF1#c`LV(#*d)iPLR*aa{umtUkIloIdTW(EF0Uq{|UJLo9vef-qlIyS1jpLhgrYCA@A-{Vk2-k9h|*(~b5 z`Y!?50gE-9a&1bRLi6Oc62~!nJ=D&yb{7s z3nUqfNJ^Hkc~m%({dxi~%H8a7Rev| z{9eyW*qR`2r^IrfwsodA%2sxev%zG-6y|t)K5SI8>*VEo*)H+D6D$=3RsC&GaDzQp zflsEsD9}EMJg&42ZQ3E+gdrw)8H7Nwb50@1HSppf#SDIUR`ydmySL=x8v(3Tg5_VI zsq_of#GX-NUAk-0=q(+4&1V?sM>^Nie{$PL*ap#gu9wW?0@ywyZK32uCF@_v-Wkas zSqamG^35Fw;nN&+G?w+x?S<_V`5fo){InsP_~n7{$&z~vOjLA62{rUqHd7W?!%l2y z8HL~}r!r@5R}1|*on#uKjX83y3LXLXM$CZ^S&ek%W_oDG1j@zLz4-W3c$<@Z3LTZ1 zTteQGfQyX*l%0K3LQEE%CAP4 ze>kMPN?5hls{d7W>p@BsO{%5LNpfGJJ!t`CGLgfja55M@WTV!z%d$a&3GUp&`B?XN z8DWx`nTJQdBq_{Z1&d_X)e82ufvVI0tk;+JZ@QAzn)NMxw)VC?k`=~O-ObpFqM~vb znVxxtdGd!m{SP_m7;lK|`5o^H5)So`ovlC6W`8hF6Zmc=E0ZEFLlD`&k#I_ygXUN&`vFfrIRJ;|^ zDMUN*QXTFJEmHltRqfrzG&Qrd=Ph=b8NL||#mmu_N_%;2ISiS=P8>Wa378*{XD6{(#@)i!J4`8s`y z#Fphe=`$bT-#osrEBUs0?HH5n|h0B#Am()S0bQV4pTx*%nqYlMn0&^>Nb%w$~DFhcq)@#EPYGDG1)l$@?gXiUpi>W8g^g0KYsu zu*bKSj^uI^;F=lcC`^_O@Yfc28wblp;D~|#Lh=U;sO2Iw0H?fwed&8j%5$RFo(8`W z`UzJWQeNz>(o1H?CDVP#b0YymP0RY|2Xi>|6s5808cvgiBi3q9-)S55N*#Z(w2R5??~yvGtj@;Ui%HbHqjl>=MWVB&5kU>#D3{mza%h@Gt-7>J<* zq<`;?tuVRTpk=+Uy&6qDyVfFp<>w4yauK9B^dPqAI`+_ zlx9}S;si%>R3Ul9k@Z=mOu*fJYZfhKczP;kb2N~Oe%Lyv2W?puH4uu3?gA*@M(TdlMeE}0ly-^(Z z0-d_?GLRu;z`#G$vs@bbdwM!5%ftKDYFqn?4W3&vdKhfQ(}>{|^bBE>hXx-5mxS%5 zCML=JA>3yZpe_~)`Wi|gtW^IJ>qwysg)QD2a1gU8xiS4PH$oRDx7R{yE?+K%mqx+O zav=jh<%M$g@Hkf+=@G73`iU12)&_ zW7zRf^^?qkLt|@+tAAdZe}1+0Glvez07ZOywB*}qZ^Md(uwkV4c}EJ~>xNOJYEx4} z=1noCsAfit!Sux7HvABdf4aDBZTdZ_X=*I}BI`sd^>{vRG{yv5hSDh;gVjDRgrnLh z&565hr;vpvayrQO(0xNN*@nTOROl^_`O8{HGp|xki!n@uZL{F<#`k3U8;Mp?=tdj+ zLX7!!S?-JUXjo&$4x40eS1ma-41Og(x?VdemS7G>M;uja2-H|u zZz(M6DRX9+DJ&~>kp!!b>XB4@_842n1@LdxB1r7 ze#z7Q@F~kRL9Be=YTqfE7r*xQ8QR7Q1Sruh-w8QXl--ara> z0j=j=7i-@$e@(%!tQeE1V9r8_Z6nW5hr1D2w9hx1_Oc2)w^I$X3Do-X9LYRkq9#}FvoqrxPzn9UCpSQ z`A97AuGN;Wn5=4ukkaenfy|Xaxs8&6%vk<q?)j^u;ixUj|RCW5deo)g}6rYgUtzpB(7k^jVZj(u78|ZH@wo$QxN_820!a3E2FIXe2WZL}|12EHHQ%cZD5e2%ez=5pf3b%<=eZ3l^T z2ZT-S$o6G>PT2$ByFs%Hc1v=y%|~d=y->(3%<~`~f%z<4c92g&A&OO_7O$|O5PqH| z4A05Vxx&98wQlpnwopf3cJ{I>^>r?TwbWq#%1>xEn#I^+r|J#i=1+aXd;2^XRZn(C zBKre$uan>U^6z4VNOfsLO=&qHgnOXHzyy4NhU>(M0}{^e8OSZxvhTFEPlP`cDEqCg zs2H}hPkG}C1%g)j5v>cDHX6>$g_muSlmGD-4$&AB-Zq7`_RcyPHPdF%Zx1{WLYuj% z2ZgVbYa+}ZT3;8U-=@IZh3-rg4e&Y{HuSL?8rKdF6~F(W-#g8VWo{unaI(t7w#(30 z%B>UQV5^Gb_c`H-&%RIxGAsQ>6`y|*zEbGVj4(%7iF|t2Ugt`^6@&;AD<+!))|3HC1DPp>Vk@^)%Fj^r$jLezP1*A*myrl6K^6TS*XLOh8kLu}k z<4~#P9~TK}!drWlWiwQ~CEmNiyi=TB;0IIK(>LTl=CI~#)ZS?<|79Gi1jtO8{*gi; zS^k#wD1{_zO^zNIzJ?utT)!a^%YyCuAqDv#wU!aAXrwZG1WOg&T1uA*-;0n+-}?a0 zJYeYF?$fx0*ifkX!3o$LL5(-AJ&FgKYH|69RtL)$S=fcB=*`G7CC8|J(bCQsUQ^J# z+^d2bD=ZIDw6hMe(2qW7EEumi;our}aZ^wDhACSQQZfO9`fBJ$qIJ0Hh3Ag zG*bH!KOv5k^~E=i{=)W^pn!|M0e!H{_~8l14($!glL54qz0lWro1de?(-c(i;y+V6 zVmNAi>Sb&o!?981gBlnzRaB$Pk=Pdrui(|KZX<^f(=bwuT5|YvhE0eXOHakW|11<= z2<`XS{d(iv-q<$g-8cQn8U;Lu4?bkib!_9iW5}%Ds@5MGmkQRwPTTX_cWvmsPxz+?# zxw*IzW5u=f9t`%kt+O2V6Eq~Wfa#1XuyrE?<*9FT*&hO%7N>s{0LFQ^Wq-0zWKBF* zJ(x;sc|bZ9&>tC$#^Dx7WonMqkjabu6f6_9WVE|l!c8t8A*xOE7}b``*H!H|A{tskrpo1rL8Y{vdZ z5qzw*jtPd}*<(*_8F&r_?*#i%?91xSHrOP&MsV zA-7m)(vo7aF-4rQ5;rY2UBxq2GC<5E;mJ0%0)CgLP}=NDzyDnNnO`gL4qnX8Mm?Z8 zRATvjHrh%dT|s0C9L}+hym_mS&=hkIPeXU37c}^#xGAzoY5y!U#*fM85xVFK!q zHP{d1kjNpA{T;8Cui-g1SaJ%N41P*6Q*rFL>F`+gwLtRaLn?{27VekFLK zA)5K>mPmq%1&*uo-ozmH+!3k4t^8^QEI)yJPCp|YR-~SC3k%V&ifz>s^D^%QJQ?Vh zGtj%*dWUKnMKYhy(!s|kF^~QC6x4IFZKvR>N;Ibi3fEC(+D8i#{Is)$+JXd$b-Wl? zhlT+$x0AmKfO&y!k4(Qyg||Dt6Dl*^+QE;6DaW3Ly*RHmT3X~8Kf}C9 z#1cYzQf0mH^-IWxEHS;|S~t{0U?{=$9O0<#E_tu|nG0%6I{8h)?$E|vmHbU>p+>5B z!CTz@LS~~MJU4gN+ae_z{IFa*-JEh(lxJ10`lX`Sq=YXOmh1Wa)4pwIxEz^b6xxkz zK`qn2GK`$WU^Pst$8h%;LoM#&LsFaC^(UT#I)eS8J|IkS5c9o#*sbDv#7fLo`#U^+ zv{Iao=kdoy`G4tO9A@5jGBVqRt!LyNW27z=Ckr34mvuZ+in8YLle=v9f`4!0V3Q0m zyQ$R4-65t`iRjD6e%`G)uzIQM2EE>_Nl;ffD@&dA5*(hBgceC8-cz?!<8j8!#(-Y< z)xy%g*zM1P+N%o?LYF z0k!eh{*q?%n__cFOiUQIt^)>{azBCyOiG$5Xz4Lc`eWXOz6LocIaPj!B9F5ba zYV0OirubnmdPN^%O6I;z1$3K>q3%2kL=SdtIkYdzzBAr%#~u&k@mL6t7La@~sT@q( z%2(Kivp4seKE#{FuAV^JBgnSFwHb7>yvFVDz?vw*+?Hl~q;qCuS%pkk7N}3?3uZxs zsTeh-4TI=SI6vLK0x|`huGEnxsZb=s`dc~!_i1u|oPnQ~MBXZdQ)R-4$ogB6<~O34*{fQ=#c-|=uES8>6d<*y%|%PuuAE!?Dtl+*qOP4gA_I*1P< zmSs}5@4H<8z}&S=l8xdMHO4e^YF;m}b^0LDWuch3{ob2uYXSz7SYg0QH0K46q~gx) z%}mm_t#Fi>mkJrnnb+DTg3RZhaaJsd%}t(&F-&n~IBY91`c%Z1gK&&Uq%)E~T-0W? z#9HAS4Y3Wd`&sTZ!Jikgk|g&pw%b(gO3!Re4`maE+lG){VV1Z6;W5;>jq8>ZQT;Uo z-0jb@y-|GXs$ffz<~C08jifT;SG=iyrF5EeXi|cnOtG9$p<$vB-R!SQ@dzE%Uxe67 zX^5{2v`>=X9fIqBHM?x0vJzW2Ztwa|L?%v#bKwq)Z4^o;kmJ(=v!(2K6Q43r-~I9Z z3RI7?1t$6*?pw6O9qR;@RaDZzzVk60{=_#EF~z56EGD}R;{raNUu)eP2a*@yvnU9Bv5|dCm@7RXd{qk6KViMkl#EZcv*}G!HLgB3Wj+jbLz7ya* zZlCSYc(2lbVTt@R%C)l$2E48dUhtPx0$-#qz_}ap=xkOxZgI!C&8+Kta5 z;@8+gj_F6$aek;(EQhXlePr*ihEWat@Q-wkioTwh0*u`Cu7kX>bV*YcOc}`uYw6o5 zm9!(fX@eL`Qg*z}Je5Y3LP@QDxX@FAHZwdBg3yPWO&=15JBmAg!XGFvl#7sc%p+kh zKuoZx&;`Bsl6fyjZG;XxOp@6iqZ_`UjNAXF@rOPsm(y%ilbuA26MEB^9gHEPX$kWR zOct;O_v3c-bqoz=w+`eu89n+)9#SIGucd%TVR|!`E^fKa9hcgd2`5NW6*nizaRXse zFguF9!Kb_Yv4ylJ0q;e+Xe!=`Z(8ub53TXto6Z){cHv)5?NVDU7!GQ^m^gtQs9+vt z{KG9VQMDbb`Fl8fha<;2lB05vG(t+njbkv}Ux~3X@cmJ$CP$ueocmWy2B3CHuXv7_ z@@?xb{K2+0M&&8C0|pKC4!SV+$j9t+Nf~97$BLu!5C+>76SzqUq%{ogvRq3J*$^7l zmH9woX_UnIb3--8$sgE;9;p=W*;1_%s@BOhq2su zh{)i|KBS_nSM|a}2dbmvoU;rKq;i~NqQhW0Bhq)t>4T5y#hQf3RTX7A58oPVW^s3jI5b~#HPYmF0hPHn$95J4d-b?G~VV=|COi@Nv za`Ouu!>q_)F~g-Pmmb$@xdESEdC263_8sZ2kJe2rh5DJoVrpV{09;%Q>6@7;u9@^I zx~dzUE4UvdeGOX%!cuAZY};KZ4e?&S^;@@_4Oq!tG&18{dFFFqe7l5QeTFLMS01qG z6@Mlx#Xc*}!bAM}PtcanjxE4m^XGf9B*4?##8bkN?rZav7cRGtp|MrR{hh?`xO~HY!Er{u!$sUR4So!>+&=m|lYJ~BWxY%uBWU5THfgQhy{UK=b zF3LynVTVT{sW*8KCCm%kZ&(Apb(F_7o^m;6+85DL`h_wON%S8&e4RCRqnaGm_IT+S z)0^5TVmho~N^;%?N=lyl(${Bo0r{;Tcgq7xz6q_O_+W&r9Z9Ce!iZS*)719$<^6et zd{(=em3WZrH3+r?ycNf_mSBU%wlqc4OW!J2jfDv*j#79zh)ZO_+Ph<#!OUI^f|(sz zAK@U-^I}UX9-ftH`nWLoEJoj}_1-}Kel!eAR$|;0`U=utqYscOF_fw4Jr^9_Q`t;7 zTx=A_Cl2iJz41nG=6WU9q6CeXian^5fa} zq^O>R+;gnvHRGP(R>41YsqZ|)AC*AwAoCoFxs}3~Z;M!XO2xpOLIqjB)Ht^~%`xt5|LMXd(^R_zTR;M_cQ=#IL9+*C$9SB(oz) zV4Arvtyp?%wKahj*VL9{o^uI_wbSeH1WAuJ>LpPr+~%=dF(}$MrZIPfV%PDGKYanI zn4+!f$8)MoMF3u*+X8<0Bnv-`+eBG2orzBt$YFu}!c!ibB~oJnom_ru-OYWlWyP(>G=$Rp{+z%?2J} z@g|l&%M^Rp8xs|V{Scr5rJQfqGBKvba&uX)^d2#*mcy>FY_;4RCJ; za!f!jg|uNxA0ENsCEoGOFZ3FCK}?cD;h{2Xr?pMQwMDT-VmqJ!dD0~IEBy4NBf{Dv zvWIOHXH3yIX=o?q>DX*og5lIo_Vt0JfY57+Mh3qpo7PWYa^U`4QB8wO58v&?L5DNU zq(~u)5^VSBk@|PU<#UCPje9LCg}T*#Xa*i4#^pTul;#PmJI(6&{Lmu}Cq`P|2j)Hu z4&ykDzB8RIRGJYM)tj3raefR>!>Om)Ps7#D#zt4Y3!X}i?}Soz*cHwn*XeudZ~;@r zu>Iu1IyO(wpC8p4pyT2j>A~&0%u*da$J>Sb{Pj>9PTYcPn9C%qMzvJ9uae^_+NQ=F z_{n%GvB~U-oF z#ym%oqwt0L@zt!s*i3#r%AD#4Rh&LI3GyW8_Qk@}5HO5@y;?k>%s(f0V9*d`dT?xy zQ87cDYn?=D?m<_S)#+#6k8E6p@H*QFrpxtSOhMAZJB|Eu!d6UgSr*5jC*X~U^gkB+ zlEmTjI}luifttlJEC1o$N_M7Be?$ST;p8T!uGY|I{q7*R5W$4ezX=(}_8^SOse^qD zXsxoFahc4i!Mi2IA<$ zUrBaug#0Y_ZqKTRetdL37SXKhOJAsM_(X^sfJ2whWw0`Y3o+7F_`Dn&;usS3V){5K zJ7gD@$8niwN1(lk+6%)Kut$sj<**}Ed^nchF>)Qb-n*!iqE!W>F&UVgW zQ!;+nGl!_mb-AA;Rb0CZ`?TdvK9Bh#CjA><24)oEu3V^t1^xslCE;)%e2DMlyo#llR`e(W& zb7}xrD1*AW2XgdXGU6T=Wrg7~-aR-o&L3iQc%7UtW6(alo zlhjnaT(2#I`g+Ul065tfR)@mONzRSiXYs9fm?rZ*3YN$Ept3K|g)>dvSHcF;|Bzp? zJ8gwpOv@vX1pkAKbO!NCY3HeFce&l6Bu{DiTuB0JP$Ud_ z6*2Z@u=_`2z})Q%jT6AgPLeFga-}U2{!|*z1mAntx=3z_Y}AeBhDBIbn}9|i7Mm*; z)?_f&9j5L8w(EOyMP@3d%w9Q+S9v;e>cH;^WpOw$VLh`pj*i4a-j`C^tzt{LixmUW zWb#J3aFKV(;H5LH`%f`C4cJ#6T5}3or}-;J`>ICErnl%4((57Ft9#r(^T8ifJ}g7N zX!rA2F9&jY|H>d(;eAzccn3ano9fM_3Ud2-hYCi?wOP>l6)|gt4)1TU99^vNFAK#Z zmC{u(26@t(Lh*598}3mvYIJmG*|XII3@R9xsn$_t|{i_luG6 zvrioNvz%PN3#a9#yK-{7H?AZkd_J_h*wK+NFN_Tqn4MI~@1Ax{hp*^3q<8IsiJ2Xr zu}`-1hjuYL;8;m=pBWiHb!;`Jhq$Wr)oL~p*u4czlMrGJ@d=>bu?i^+#_!{Vj*O6{ zhWm@+k~+TWsG}_7hAtw4gzDxhxRNTs{7T6we)3q)vgB4L; zwl0zziLsGo?DAQb=o;1KxNBHGzxgwKdKmtaaLMxWF{W-Seb?}gq>6kT$R>w@@)j5U zgH3HbRYNzEoFokRau<{VyG$5o6A@iPM}4x_kG2qfGdlmRt4>PlJBsl%2q^;D&T(%@ z1i9ihTBgVJmNMWB+&`ht=eccv7}Bt=F;97s*+IE$F&4tOMlCMFxf>ZU9?T_ zO%z5$kd&RA!5$38J7gMk0aG2?gWyG+gy?5C>nDxH>-l+ca*GUpvT>t_$Ar$(VTU9M zZW`Hf|7L#bgJZ&9lyz^X^Vbyg|5Z0UBWGbyqHj}1YT2`Lq6FDgNT@)x3WlHAFi)-; zWk<=ne4m^ebFPv3<*Y7gU?N72ccYE9O!t3+8THXpT^MEr{s+-Ql$*Ok<$4B`9p^?W z72|%+pYA~r;aE;?s*jT?b*y2@t&ISlWY48ROB{EQef zUBc|dpmSYOOd5{NoyBF&LWxoH9}26Qc43#yL-(k${6~ALu)&arsVz(C*L*C568yJx zgyL9q0b&h2Iv=hLopXIOI1?yG>QPKk@1?T@lKXm_(t5#Qg_pW44V%fKa7J7a1StYerZGMj?kSx1O4h ze&e~p!89#K2wU!bWtOiw&b*i~+(*>XVXSYikAfx))1yA8=yv7`nA#}W7CDx%lf^Rc`c zLzM@=iIaZ^6Ds`0xG9f)WL7cG%#;p8SbWqI?4UETm^q2DOEr!e_8{6~j{0wU48LXM zXE-qr%ZENglu6c5s?zb;c3zB*H)aN&jvYlV)Ie>H@Z~~Rl;AT`L9drwb$pR=U$P3@ zsTE9*AY{BB>LU)iFn&F|5VLwSr~8R4v1jxBsEpi4K0tbsNQX$h|KMs4yE5Hpb#-(` z;LA7~>0ubUWYD6r+uLRx<|mXyqlV@gZo+|boF;#{kCa$DKN7KJNR@Gx;qxR!Asxm? zqbO@IH~0(n%w_`yL}F@%v*|=EKG**NDG&!%%p6u?j(mAR+&wHu-iZ1H2?m(!>_`=6 z4J>fXc2;BK@>%6l5$(Dffw-=sXnb$ovs(^o{+H9t zOQl^PpcS8Zjiyr)#9>pZddpO5g3lHG3~+}F2gb=^l74li+td9%`l8M#sx!LneFYCj zE?3}l=QOQllV(Ic*5RY|AJ?$6j6RMo0pSrYWM^>*)3bWq3V$VH4iQx)xz)=j%BpDF zgFBx05>;$-QEu-NdW9S(w;o2pzK4jB=mYB<`_aSV<1@5j+6F6N>+`@YzWW;c+gU z-u;i+d2GBIuQ`rrI)56B*8_(&vvC2&MFCMvJ>OuFK<~v{b3FgIP~0eRDRou|TQh&^ zMa9{U*p7>06Ectc*}tTcFlR1tfb}K6o}1LPjC4v5A^#&r4fr21DszQ2cq<-Rv4Q>E zFnkmK11}=G5`mtWj9w%4=85rbMB+8KTw*TvB`5UUv<&iV`I%cOL90Tk)6;VsJ!IYu z$jcJb6MbQYWwnAj0bdv$LO5|5Ey6|D_UQxe)#z`i za~9cR=~1G}GGdW2gG9wTdbu2*D38lpzEkMa@d~VycHPEGfw>%k-&>I`3uApFV~7az z>^017re1^JmoBotw8N~#Lu-M%{fHX*fXKRH%4=s+9>riGi5Vos<8ZGHGY2DsPpy=q zaXBW0ii(3f2$+}*VPFxWRkP(3SfiPC)yd-v2*R(Vidjf**Tjt5LmSL`! zyK5hgAl#LX7nHcqdCDa#g=H5LL{3aE^4vQC+|wxz{Iefa(0H49x^x$H#gJ>)gTcTp)=Las8TUf*WiI1FCRNt3-W5oW76ml2d~l zE>=oYnh8z2qE)o@CqK%WYw=lxGvbCb%W<x@h5f_ z2?ylGE`%U{m$jUV7RJbZCy^l#+Tn$qKDW@<$8lT?k1}v6zm>cWW*rgpS z&{$bkLodZ#Fr8!NLUKdmJ*EDSwZeWPN91Uo8!rr(^C-1G0L|(H)5`-e1wkqa9bmz% z#sLYjxZ)y7*2jDJj~P1+yZI@aXGy_0B!6B^d4y|t=L#LQ2$iCjXi(UKU%kNgnh=-u zo$$37*G0ylF2jAwQ_;8AMAxmD17M9 z`wjxdF2g5TdvWV3cfleFc8V*ApG1&ZcZ(zycz7$7QJ$(IG8$kubo}G&*SQ7D5`3r~ zW%mABwfn_5j+)x)_A)@nmcSQJrafnOCC7V1}QWc$XBwZrM zm)J}**gkPM*5az=jPdb$o%CF+lBx||sCUEn!6LUkAB%sFn}n|98H(5uq;}W19H`oP zRW)P|yeOd``S8HZF)I4RW4cRF9Z32wndFwjHt9O;3c^~)McZ$k!Nc*(5)3Y-XM#8g zXU2{u5rR{HLtSeo@2|wW7dIeX@PEc#O^lCnN{EDTy@PsAlU{^*MO5Zy|CVpxOnWfU zyOivdQUy&baXJdW2RhF=bV^M5*42~CLBsxwfxu1jS$ZKN3dn8+Rb%LnPH^nk!9Owq za0~Nhi`>Rr*{d_bR}c-&Y~}22apfs8l>2t z^f)tk%GI))`LrP{$^e69m~4j=Ib4d3l~UURu9Vd@lo#OJRR}n;a&zb8zTde2tLDxMEhJv9pOHzpKkX6&KVt zU_egta6(3bBoE7fQ(}nC+|0O2%zkv!1Rpf73=v^J1!)kISb&8NVhJw%h`E4hcE{<( zlb*Sl=>gYd2=&8|Va$Y_stiT43nm^Q(EWj=X_4hu312MbCrO2o@RD@PYGHL|g1;QA z#{_T?yrh)`^OQ5ogQ)@f0*QD4M!S?rtZDu}coUul9PH0QSy{YF+@|N}NytDJA|&uG z;9(OThujjtH9>_9rS^WIwRrGEKt>tJNcr#Cy?b>QlfSiMeDP0n{?u^72CDJ#c3|-D zbHR|U6fD$O@`s8QFeX#eNcl@fwjDGMl~a!3+ptk9M+{9(R+(fH>{X!$J>N`4^VOJ6 zUFL9=JKGBlhXonE*(Xl6v$!*t!m2=d4e}=GV?x}4S>Ej$vu>O(@fS8o$x|`2&GtlG zR^wpri8WYlSG%h{DH5?5Gt-;5Gqd!EA?|$JbwsyViwJIhsngv zCcn&a7&J|?xXu+VD)u%oHw7`>c#ZGg8YRY_2m8955%ed5$P=+Jg&u$~vubFSVkw|{ z9M`1AN1zzRh~KIBB3SnUhY@3FAs)lcQf8f}Ccsj%agbg{8cY4CJZ@76_l6QPQm=+| zzo<^d-LK5aj#WjbV_AZsV!BjENtc5bl%pNxC@vX-Xh6%*pr)VTRh7Zt`l-kl!CnqW zh%uRP4XdWD3<<_Pz9aysG6p0^p-X++*iZD zDtJxRF^q^LR2e&fgnjHN7S(#ZeGzhuOS@Z#>I30@6c5y12uHGYg|ngUGVU6|%fRWA zeeq4fQGm#bGLodCpBIfOBipb)4fo_2c2IaxR);~LgjWP*U-qL0cuW5~&Gi6Va7Tix{C7dZNy!KJsKOsXjROPVDK0{7n_!Qa8B3=$yZB7@ zfrmjmRisXgg&Dbu%h`B(6Y~nG?oA)3CX%IuX{1Kz`*4jKf8lh)Z~P@G>yj#c?vdI2 zw_4*38JPo2G4m}KBNxma=S*!fNqf)7OnY*sj7c*Wvv9$eaSdm6R2e8S)IS(#1^u$V zHAsv`Z)0l^{hSe_Rv&YQ-}T3X%<+=g39gC;9r`tp?~aA&7O^@D_h<~6xb11TP5n;Fynt#C@Rqk$qPYImGpRdssoKEx5bvc zU^9`6aXW%-L53F8w&5b9kr;kW{ZWiv;>ox~M-Z_kAu+uHH%%YbI({I-D1F@)Bq{V3 zC0V)Dz^0UpgPjvF*1Ne{iCSE@tEqwgQ~!7n{e$^lpoLQio54>)z6?*#@5RoPtN&xd zb=pvh|0XIEPxpw?yO6HHyfwjOm;_nC4vq-L3a1DU3pK4X{i#%VLCRiL(92JKW-l>C z1)7fl98uF{=)~$q+V#fM4vpzONJ`H5OR){!RN)*}zfRxqUe{>3uOx+E`@qINSnO1H zj=cX~=R3|z%4bk?@&(3CmzjUy7!2DoKUH8TP194#lk{VIne(6I#}uGD=LW6mN#@pv z!WR+fRD>dy^j7gB0rpA+EYh)aQsPYC<)=xoU?rH4n0*qUTqYhEmz1?)9>Oz9Wr67+hE-O~T~7`tEk&c?6BLTa8yG$Z0Nun@ZK&^ms2XMj(Bs9`+Jq zmO*MCp7gTXHpM;z}H>|Sq@VJT$#JkWATD#wDZoU9edFY1`dli${o;YfBZrklv)5aw_3 z{2EB_6{;SA$34vGxhTWzp*Jx93R}Hi zz9W)7-&bCa96I8~fPBYkpa~~v(Yr!N`%rXxBVVJ&xz9C;??6{uh=2-+xmg2HMLFAXN_|;et?`3H9D7C1?&B;j6$Ef%kE@#O4_9Kh53NLbA-=v>aWN^1 zYU6wqymEJqGd0eSUDStiH}CUty%qO4KURs1YIilCuP_IQrY(a}k?2V>M78~%ltnJf zaSeH3a(0rS2pAJZHQ4uXM^M@3+AP*Z7BT&>zZV~cU!vetl;d zouS0$p`)a8G&6#IK>~qVBGDjiHrVkgzGo<*-Y>(N*LKxWgCX7-54fX}#8v5uzJt^E zAt$Fs*+w_q@wHyZIk9z&HaeXe7ag0cDC;K`oi_#<6E!Vox_kJDP_l=Gn_>EJ0R`uI z2mKBAaa$^HJ^<$-M}pt~2ttxEWt>Zp;+b)?+;Ea|3HQibIDl&E#~2bHb%x-2d_d9F zh2dr;a3>T_D4KtqZzNU%F##WBlkmw-x%C)pzJ2;umFI_9OMY57yd zk(MZf2IWR!TDF^oxq-q$syYdOk(y|9JGZN0l$hTg310}-)qbh7*a#d$V5%}6wH)_$ z(N{5Rxe^A&5R*z-fel%VFvATuw{utKg-wv^KwmM74wlJ zEdMR=1W7Qs6gRf}KoWyHuM3-mmpXrz=tI3*a7~CC{xZ|Cn-MXR)BCS4&?yib~W!mEiEQI}(NB^HuOgH2z0Eu7kK^N~7rh zbho9=@5(%KN@nRx(`}+s2RsSHcD<_+P%YO$FXEPp4QgCFJ`IFqB~_gBG4y8f7{zx; z6esDrAuhZ|?}c_vMCxb}@==^aFrmelPCPfJ!;XJMwJMX8v?gnm`EOc@9s0PqbFYXn zu&xaKuVp&0C=r`Ogx=KH|F6Ao0gI|y``>$<(HWRo3>(EDJv~2E4!TPbo>9-o&iDW zoX&U7_dU<|{o`@Q+1GV@*Sp^JUVd*}xpMVPnIQtaq)dfmLB=uLx?DMi3|-@x70;42 z2ChVe`ln0ZM!q))uW2%5D&V{KTuHw3=f6o%q|l537C;ivtn0PLr?jRuq*$lybbGkR z;>c!Y;Bj)l7Vc0^%Yww34*9xz?0s%lB1tGg*-p|K%Y8@eGgucUdM$D=E{->DPVT)+ z+1Axe5;(}-#-I?hdKgJD(4J`$JfmGRNwr_vFn&=2WoSnP`&er>aq&X6j{S`rqtitu z^KCJl7_NJK^oa(`Ju*{<9L?RLB&|9~jYTuW`Xpv-{-&@u7RdO6qvd5T?rJEn^0>F- zub3q(vS_|2C;?tL400bRSFKBa%y{`2rc+f5O^wsdm8!|U1SJKe??^CY$&sY&G(=I? zzB`QzN&9Tb#hG3DhNj-vIBP)HO2e0jFDX#~$g8C56}ywaF~#+WZi%XAz3pPe6*X|L zCat>@2xPn>n7}sso(Yikhv#wmgxG?}{>YcUQ-hDYNVO_&)wU>dhacj9&(s`P?I>b@ zFea*WUn;f0_X7mj4+8rZYdriswBj3^$?JYxVffDd>)OpG>Q9`OUz(U1D=WQ@C{xWz zms}f{_(A@4#OUWITo=baXST{*#gwLRlD8k`pD`8*8N7`9Vhkkg+Gr#Q?WrbD#ls?6 zA8AMg@&(et-4v!=azvZ6n228oaNWT(q)e%Z5U!@U7_M|^Go955Y@ofDYJYRwE>E@Y z+sNCO6GVGCk29XY*>+iY7f>q|T^M?Mm=HY@YE>kay=iWklv6e#+O}F@ve-8YVg$Kp z438DN1&Q9+#|*A87%e=B*Z|6tQDt_O<`AosFhFNVvs1wF-#IKX31uw?W!Qn=j1&<-Z>`Bn?tdM-|3I! z;IK-0fQX>lYQ7RGEa6i#zh(^il_MJi#0~!Zlg5a?{HNq9O~$f7vMyQf1}vnBz0k0n zuJs!ep$m;W9%@b*qnj0@(-4qF2pY`MWWFRrpqJrB-NOL|M7S_SQ@?bTOpS!CwHyHR1J#;!?_cb!fd?4Bpfr_SK)!50yAtpKtT8&E!nOlhgAH7 z0sLkDY%kKf2n#s-TlOv7)^M(e0}yi+_oT(RB=Sgf&TGSwH`GE-M#D7&Igs=b2U+ck z3hqOH{sX>Y!;+gdd!SKTyiHA+g4Gj>YKOYO(Lby8=qAcH* z$m;A#jM;um&nJfQ2j7xIe&W^!o<_D(^F>fr*=?GuwAjEx&v^ex@`*C6&SVkGQ%NrgdXYXUmnn?<@s7;(z-d-++x@MLiZb>cDM{G@fA&4Y8gXu< zBS|aeG*+C_e9J^{ngttJ{zLvi#6K7`fxjLqRCXh`h`*5V-R&tXyNNFptaj))X3>kUdY0)KM_xxoPAa?2ma$yEo$?N0z$|!P=Ke--N z-MfeI8vc_w(`~&?afkic7#mW=#mUfG>Q(z&V8$&Ze3P3w@rj#_4Pl~fV`PFhz`2>s zK}dk^MUJ~FgnWu@BkbMA?2(*YP3{$p;jv^KF+9XRXt{oP_-giR#Yt|hdfVE#eOlKX z#VCUUt4w?E(oC6}N&YoXu`7S6+ANO~a{dU~~V!Ii!{akrQ!({9F-jB%oFz)3v{z(m&iBMv$-~q?1^zvcG zcroq6idUb@dW8WTgb~i_hJ&6JzjnyH0P+c=W6Xt=;K@mEaJ9c zU|-~h6VEugKI`z(f*)2N)(XqVGST4+nCJ~xsD45$-%)Ox+I}*;ljaKAG>Xr2*e43} zL(`vC0MZnE`#L)y4%=JF+>GFbZkn}>Fadp7+|QfHN#l+P-Cxp$GfG3W7N*12M#F8G zH)M+0o<;78*FBVDd16Gx%>n#3$|6>&Yv)KC+c9gm~ znb7;S!Zy!ogOzaGAR#>TOOYyj3K^cw-Didm2zOtmyrq$=N!QKEVxzDH{+_2E&MtnB zCH-PWUOTXM`9w7$gV)6NE>_J~WV-H%lM%5)E3kxJ2n!9MHFdG3=#X-7)$c?3F$U`a z+w76L@bTvP;(>dO&xWeu$zm?L;NU!M(X*=((%(roBobGgJ(PTa;nru<`#^=@X z1|5-`$p?{WF~Uor^wC{4a^mGAFU;`)DF`PaIwew|kYm^kInEH7gK4p!CfzE>lGy8l zrQCup(U#e}RaYJ>yswE3CAVc;_66v&?We}}tP$oaoiDSw{F4C>JUxs(x#&6bdP4U4 z<$b}H8y1r9lG&(ad(M|i-EcLMJU5dMjj=B`jO2^L`B9^pgpytCQu7@$^Ac!mTe+{| z!QoBENL3Wm!Ux2eKE7nkF!n*TLEQyFM)Q}k$qP-XnSm;KN^-uI1Y0SnBT#zBA!6t6 z34LF8S>;x1T&-o#N%$k$O1@=sxP#-^jfOa`If1`^B-R*z;b=;C>9D{uE-Rgk(sE7F zv1`QF1Jf-E{^@K}UCDc<8{sQmKIM_zy+vj_OR)i5J>OCE^h^Bn9uYtEH>@x|ZZn-$ zy~5O3zGPT&l{5_>6^bg!&XN2xf}+lnG~9UEr~_LS^M2%+f$?-%| zXSEz+T(1c`gEl0qZU9xdC!YE;25#JqaGgo4#3H>_WZZk_9FIb70mijg0}CRq0MODl znT3hJXC%{J8foQ@#29`-_FBc8oFA4`p|l|G!_h)~VuL;ZMYz7$@~0%^Jx_MT?%640 zrWzR~GXr0S*T`Eb_NaYG0-D9tm}AB;IVbK18_|8BgjqFUc=!Tw0n~UaZZcobCZBP9 zAlw~J@s$&)`5Vw3xm+z~QYw%h)#KX{Q(WoK-7qz32>@C2wXpMbS#Bm(nMy~K}~BbRP%A+EZfnW#Y_{QQtcbTok^wE zQwMih06<{ayYp@Z=9}F()34j5Fr=DC`f+o3Ewa5fwQ$PFo4UFDNE$yr*^ewqqTmZl zVrZa5XoRUgaJkv+N8So6ml-YoN(BELBU1*AcvED-{jmp)?-h}kr*I4CBB!{M{Tk}L9=T?-7*O1xaT8yP}USP4)KPmG+kW|zdWh?VHxt}xyAfh z?@lXkHb=6geLC_=vGEgMF+c$2ryGQI2G(Ry+6zcA?6iEKKg?uEGtRb%4+4m@RTvf& zIAPN>K)BT)D1d*!V*HTXUI>=p7{y-7FEks=r_bqCFI@dfKNTM%)#s4AiPvGj_Dpz3NIbED93Fj?9a-v<@ffQ^``1 zZ#N>MTG$*yqD=_i*b!vU=(Q`}$GTEQo=Ih#+x_@E1Up~!w0%~3s*Lh zX-!^BBB4*XbNHZ544p#zhmN^ExX=tXK8uSYr$<{gI9b!?ca{{^8 z2w@k-L8R*>6J|JLdv1aRqpfUjsdhOZ#eUwtlRI3>IVM8*YfC`#0?k_8jxftR3>Rr6 z4+oJ%o#{H=p%CHTF#Bs*K##}JywXcjxQk-(!1qX|&0X&27>6B%vtbVTs}WN9yk!2# z1aeU@_e4HS*F-Pyu?uvc26D>-xlPJ~3v5>;S*~OUPP{8;mdy0H z5W(~7{b2j+k?WmMgDV%cy95{XLRE?D0#{?szNgyzo%w-7sWXtt2?Gsv(+W5gsO1n@X1TxIBvrxnjq zdEBKWaZ~o*U$I<9>SuxdB-;oO!Miezd3-`BxmkefWWz*xZHtf^!39sqxLjtiWiFKE zJWI0;|4p^$qab0KiY$mHyXJvS|9yPH9A}p~N_OIlz1KdT1a4ldH@`aUif)-XiP7q- zok(x6c@EQg{6-jA5dtFbbdry9ppRlVnucXw#jLx9yg!ya7DIN9*X@t&eSbq9&{mnC z-VnweUZ#YD>xwWgDcSf_Bu(r?)`#m3rz(nJ*g(v?XA}uj@+XZY!DJpGla&0W1?IgY z;{H054)s>f@dgQw*!aCg%kDg#xEX1h*E*K=_-#Nuag)%bM%o2FWiBfkL#o+c@%u@9 zmC@e7v>Dh<4;1C5o2+U}(zw_srpcID#-({XwzA7B$`zoTI|4{jz9BX9n5_Fvt>tlf z`ubsj4VX}Z1RC|h!?}yGO(7q1$3vhAF+6Ucv`=d=Meapw^L26(8eaT1Q{YtP?QM1V zZ6D@7ruD!Fwuw}YXIfUx-Tn$$sV)3?So&8J3WE9Xl{8Jghuk+-hh&()S&x!q2})OU zyO60etmdDX#`YR65~BjyvESXLy6e>8jk}DOM>uam)QzpVTv$KZV8_<0x}7~-GFMcm zynL&inI_y~(6+g%>KY;aQQ`O0mj)Zu27uM%?h7Xm+OTr%Q*pau$R#5Ab+R~tXW4we z5m3~>j?}14q*4iW4Ywwv=Njw|Mw{WPfPfvDwosI79eK(NLv(UYXYQ8Rv zc+BKi6+hiYzMF0+i#;4$z;yK#k;w+w>Q0vHlCrfe?$(8^>`C&_WX6*?pQedZPUk*N zW}Fklt?J%xl2<`)o4mnkQ^+zm*S@?+&J>p)N17sMGw&a6HQ2+EqVRhx`d3uQmyAt3 zV13B2U5&VcTGGgex7c+d9U-2;i9cqs8+taGkFbu2MQ`Q>ZTp0LUBZ?6D{RM1ii)!GsviN0dVuqAWJ=CyG(BXE$1HK`jD$4g*!C+GXI()E8RlAXc4&$6&1h})mG_gij8q*_1K<#OI}U@A<+m(?QX zms^U&BKp<$5a9+<@v#^h#Qxo~jv>Xfct?s(Rl94Xu1#dK_>bp+COX0T?v9Z=6ZrRo zRQE9pRreW0@?t1=eHNq>SB>f^b`m)a<32y54sRw!$k@b>&2tW8^;|(VhCVP0mYw6~ zHNz@4h~#c1_wE>Xyzow_aeh6Qf=rdvxJ+8+VZ4g~So^F=Y@e9;n*}m-G&BoFO;{Be zji;+scPxXui*UbH*&Ys7o#Fh$S0yo(iI0)L)^IPzkre^zW_L#ui4nNh?ZH^BT#ZiB z5X96LTuG{*DvBT06IxhOkN5OxHsrXA=eTMWY1IE2f? zA?m##?vh2^7bvzioxS7*eZ`B-J*P4s;Hg2=Wqab zMh{8I_Nu}T96dg8oFh{Um(v+dm*kB-9I~q1co|C3{V+8cl4Mx#Xp| z{2y%S2XeXr_9`McmMBxLspRzZm+#i=<}2Za6et=aM%pjk^aXh{5C{-EE{5E&S|iVP z9f%Q*n&35w6jDkA6_5h6L3w03jT|)H!)?(Z<1UkGo$(u8CvZ`wrTJfBaNYLaszgggU-A5xI&SL8RIg`IF^H z!@JkB8`p`!shptVe;i3(<@g=(id*<`hP)l*${7Aevl>3- zPT|5yrg53;<=E_!nX|}?McDdg%>!@`Io`yi6t2|UZjd7xYtL=W*n=r)IT!l@26?T? z)TPzi8{E}mxx0Iej11>U#&piCw3z(JZ7I4#3k=P{us$I)<+})TjqbYw4E1jS%5`wE z`H{0CD%;(jHhp`u!T_~o{7mjx7`ezV`DYUBXIMqXM*u;Ahp2l;m?k))6>ckV1w}Hr z&dl9yoE0I`e3BKUSKjDIBy9m$1ZU1O?PaPP^u}vrN}?5sPNt*5snWl`X3MmUl993g`Ltcowy%9Vtet|h!NruO8fPgq`MvhW<%T1m9m$9ct zn)mzL*2S^6>mtZrqdlCj7{gsT8M)A3BezG62+m z-|(JgkvXs^pLAcyj~EZE1t<6EDB@pf$~WXdhTq@8*9MZu;G!gyNAt7Pu~(Cce%J{Z zr_PECGQ!!oxJzj`$%!M$^iisOyGVlbMILe^d2o!%$=;l=ujh^dk%d_E`0pyi@7E&M zqOFO1n@D|m-kV3>7D|8iv%IRw{AHNLu!b|KFJGjLT@ISK+Al6Hmc1QtuotL$mm^bv zqrCg*Fm@Vt)?|eV*um2$a9=~Vf24`2bbqV3fLk2N|8}A7-toGJG~4buv4dUpZocr0 zmfWl_{Y(7L<2F1n7q3nV5HKO2&IFjnTa_4?N zGr$=NzdXTeyeVW+;D)(mr=K&|I6ENcLl!gYOdSAwZM`oZ90!e>Zfl33Sg0Q@E?Xp@ z-a)R8!cyS0>fTP|tHf@E8fKEU4)$+LA7st1suamfW;0EJOTW90-PZGNZ?x_kt?^V8 zNdRu})btt!AD2%yXPD-Ytoib4JsG~td93$osB4{D0GK#YV|moCC|l=LJK4BLtmd%B z4RP{L7dKx_`-I)QDz0Y@r!6HvEKy7)6XUsE8H6`6iFtQrelU!$@cZ$j%xb?AKjbLF zGTnZhO!-%vOk5u!KI&8)djPq@?ZU5Ga~$yUb!)WyY`VV(Ddy@-fx>aEak7rw&gE##ixr+mHfL!u;h-np2c8%A^0@LD(LftKaJsXA1f$kHWDUEs; zbP@8JfqQQ$*$o%1CXN*IP*31b(3 zovG^{xr5yPR%p%~hAf;FT!)~6wmSa#g*=pvo0pMeg0LsdK9idZ%BVJP4K{DonCCH~ zCJo#qyTz=Z24^pQRvkIA)S&9Ul{};-m7x*UZl@k=f`{y%sQM0w$4m%SBOjP$OBuIl zg^(PmGhAw{;@NPyzRHwJA~lJB=ex{?O=QGOvcJZ(9R|OKNOraO!Z`A=k}nN%)s_Dm z8x?ogJm;@4rG+}=dN;Si#jlwIb_$4daQ9J77JAOYUqCFG!; zq!SKiYVJOEMbCRrN&{ zqn^a-oOhwazD-g*1aE)f^L|DQCkjtS7G_(?xDFB?Do*R#qtceH$J#R7ZV00Mu*ew5$^CWTqrC2+a!A}llt`cqGipn z!&6SYKL2IK=~ZC&b7Ynx#t_5{emcWaY@(OXFa&S7-W)faJRL>WBp>fyQE1*K(K2+}6)E`y!CF+=CRPS$MGtb^hf|tXn z*sc+pt4Vzdg8GUsEw~ZAcGDHYoylsrJ0kUGk^M#0y23HC{LhMeu7a-i=`pg*eIpE3 zA{3B0E125YDViI(+oG6e_Oot_%sI<8n<3j(g(=iCwN}tHQYVQG!CaAn{psja&WCcW zGSmBecgO9Tt}9lpTb_OZn@3>E)HTF4jbz$R6Yhx`#;$jHrh;N#t zA{QEjj{|j1l^QYPki0fTvNu4FZ1l@}8rw_G7ETgU#U)YYi?)v-B_kEzAWkBDlj9|w zzq54b=={GD?f`i@S;kDucsIs*f9!s=`>$p8G^~$rMRl8G`LDD5+|i7S?6;BB_2l`* z@~SrBP)vFa!`(WKsO!lUQ*?$kfy(#K<+139+W9xup3_ zqw9sh}WZzL??q%jzWyl0VE(jrv&2c+o2gs?3 zqE3SsF1UhRYv&mf0bgGiLed*KA*|;a_6Ks?ET+TJp}JD_7o*jGMH%Fc*injPMC);$ zP=^aoeleC@Y&tFq_60rHIb2YDB?i{pLys)aNSA3-fxVdYbh=FZYnbsJmGiyW>(zQ! zH8_C!lGn$Zn^-;{Fw2qL4Z*r?%N^MUkNAN~QBPh|(ln7@PlEc0%nVv|*(2R8H!}8l z+*-fni_9F{4c!g)Wqfia<65*z^IqJlO0r)~4liVy$%q)NZ(9=(0tGj@+Y;{-KS|Y0 zK3Z+RbX7O|;i(0PI~aX!PoQEG85vAEF0p^lcWUL$Evnr>slLKQk}gCfBeI2ZQ&vqJ zW;+=I;PhtQ7guVo&^@bcG$Mo>Q8>2br$t%Z^h8BB|B?&2Z*DJ^1GBrHThP9@fMzi! zwMyNJB&Q}b1vv&_S6Z(7O@&0h>E;0IFz1%^I8}Lux&{FiB(l)b;urU(AN!i&;qn`h zI|&KCZ_DGNbNG)!w@0xi;er$rW@HvRpNER`<{73i(?Pz=L#_+8|CZq&0sy}PbD@#H zM`I1<&Zt2jE3yrGni?3My1DFM!asWHSL@HZw}apZoJ`&JelI`cABH!sUcl5@X63CRETvg7x|J+~HVmxX|o{K{%HO)njZwjdFYUGxjbWYW zxJEpsR%|8XHPmH>`#GI^yoQ_Nhjz>)NnzZSi^&9JqlwB{pdnlINWLk^)k^5038yjc z2}=A~2!>;IG^xLcJD4CW3(rV^7xLbOOh5U_DWL)%oKaJ=?uhVG5ci>$Yz`LQ2%@RO zj4t5;ed1fd!uV47YGU9qcq49KpBKQrsUaaFk;C*&u}dI9q4IbxXJv`DxTz9roy!`L z1s01i<(XWJ|91*fRf8yu%#jKm95!=W_?~XN)9|?#;0Y~F8@^d>4i&zSMrcx1kAhUR zDVth66t#R6!xdtKqto_~N3Dux%ki?kX~NF%14YE4-FpvLq2#|48JDVD^IrJg@W(-^ zYI$BONh*&mWFyqjhPe#$%-QjtY&1JtqvZ)Vsy67>cbj@*65XkCdurjteYnu=R-4^&QJF>T! zl&iQ{Q~2rF=U4-@24p08;v!*dW9*z*z3B(jNKPB1XfnSOeEbu`QOjp~a_2ggqbHDy z5=b!NE-~~T!8H1~jl5#zKdsWaX@0TO*y4BYjRzK_LSf1@6e1RJk(pO4vTx(Ri-|p%^QDaYtWJ076fo39GkZ3{Vcx_4~{BMiDk`I!rV%5MVF&ErJs1krCgaFExb-`Hq2&?tjiVl=a*w)7&8tj8(D@cfw^GIf%Z)4i9U@psv3PNtb^INB~h zb8+Ad(}!{IsuCaNkIzn=q;7=(=)Q)0zmd4+abekHLl3cCi|r_XTjYj!44Gs+G0vXL z25!8PBFb;#qf}&cC`rxkagbj`EF+(!aYqAmyM%_Fwkz58pG8MVUV!RL(}Tr+a=EL4 zpT3T*CSs5{(`{#6%z4z(kT0V^EBX6Zzib+A_+{G^)s?z;H^hpHwKN3s zwMDCcWL3G`^AUo1En@LY3@b~R*bi#%QIMmy$_ma3cS(TT(H$K$#A7& zNnCd1<3F*N^NVBiO6GH1dCIEZ6?Fwc%4&$v>nE$L^l-nruS!^~Dv4w-g`0!Q!EvAY zlZNb~A4^I|n~G?w$@{Ct9~bIA7l5gnJUZka`)-Kkhc_btQJkp!)inHwY28DLy%t7c zco|9I8N;n~uc6?(!(`@ZjJenaD5)Hk96lR`b-)>Cu>zQZ-E@!e9_UE>oudT+F@xn}X zf!T2{Ha!Lfxo{3!*b}khg}CyOB+$rjAIG1HlJs~jNZ^L+_C)!WuBq=Drr5mb z@ul%x&s1|MtJ`DRc6!Gfx^Ff7Y5!Aisnpx2KwkP}UEvi~+tTl6UV6;>6kDjc^xZ|a z2ZoU+Ci5HB`$m$LvF1tmofWlSc(|S3vAH$)AY+ zemlRjzlhYLzYr4Q7d!mO7VFntr(uYkpN_9ieDMZ9GFn|M`Ux3oSd250{7SPq#`5d2 z+F-ajQ^iZ(X#-H1xIwd4{@p$;p+W3T5$axj9P_Ns;!H{WYIUY zwhutyLUfZ401EN%RR|5E&{zN=K+Kd6G0TfaLSbWC6M&iH($^yQsb0b=YQ)eX?g=mu z6wyaQVSsl&y{EFN%Xgu6FuBO-f z(816uxWKz404V@$ODJJ2E{}xwMX{nNDiPxLfU<=~xVt614*GIL@%YfUC^A@oky0V3 z5^%8ks|+^@m`G{?2nGO)YBU4T*1i_eRwGgaN0m)@g0=z}M<@hhvab}1g#lO+1eEEk z+$~k@4G_EmO6A4c^4(M0j%^9h?OUZ54Cs4Qz7FFMYI@v& zG@|W-9sn9>q%vzpV^Pa41nNkQa5vCkIYiRp%@|7z56FTJh}2qh9|<6Yx*F}2utg-I zpoHNiF#3!B4J4DP0HtxjS(D;`rPH3*=l0V8a4_5S*?lxHog#6dF7%$vJ{p+bM+0Tf zJ|gs%fl>xww)H{6c^lsadziOGj2@aWh)`+o(^mbLNfGfheWTb1E&^I>^^yEp^7QrI zP~`cKDAQXpRGFrgZM(3BXz>BTgwQ_8pI~xWzjLG zz;x8X$V0K~D0Z3)?EyYgT^pT(O?1pK8);x04Irm5bd*@=NP6j9U)=>C7CxD|*D1k&L2f=Gdm(6e=2fF}cGA@mhiU(6iJvFKKS@+#onQIZ0l4cs96 zhk-%_;&l=ZO<&ce0UpdtCF*ju`LG0~8@-5ugV@gi{yoGz>I0TR{m)JoAjjXfMl)AV+BqgFT?9D9W3(()n2S?-88D z#?H1Gqg#z3u4)6rKuf*obbT{uh~EFb^_5Z!l?Ko;dIT{^Ypg^!XN84+KuW2{`rsbX z65q&3Yj`WvQdj`NS)F*CLJ0yw0374&qUoFXQur|(gKq>%p1joqwAvEy9R+|sEL6hR?=|>A+)zr@VmOE1{W3=31W^G=v|6& z*~|7N97*sd2tpFDr9>lr1OXlhEK6FSLDE)#UtpSfagzF2S1rJX=t?a?x=BKmm(}{< z3kUH+A0Xzr#PwgHt2~Mp=^ZvnGR*B0JE)vQI~YNcu75&Wv%p@wi(|7_aPlpN(xOY> zLDv`GGT}un^>oqc3Pe}n2m%?*1NH;%-pBU)MIY3`OC$76V0Qz?5Jmj4g;Hw7S&n&j zjiUf%baVzRPeZP75|i`-s6vAB2~<8}#LTI3wNO#95(MOBDU=`8P)ejN$65_eM2U4E zE2d$@)l$nS9~vkDN>o7?P^`ZF^V2K6Nh@3*BTwjGHYuB;k`<+OFEK)vq%xaCj=re$ zN^EPXOeWQdg0o0t-6d@d&dM+lpD3ti-xBLvL0kKHnWIn4`Zt!)X+FU;)7Ot6KM1CO zfWFSMle1zN<_pAzf#NV-4)8u760IbAqkka8_LJ8@aTh?7=qL1cA8VlihtjZk-`fbT zK}8eavH^v?6Oz5;j)*CPpXhS|Yipi4wK(JE^>x{Cn+or| zrhZ@jBlGXS-jj3p(Z=03Ha`E^k4vArxp_*0aOM8nS`K*9w;sB)Eq_PFeQ({<@xtlu zC*Qw+@ig=1S3Y^D`=!Q5-}`F!MTPgh^W_f{P$UC0ct}Kuep-kugy9&5011O(EJ+qy zVp4KqQW|sve26euGvIgja@c_1fq{6^KgQP(_FI;|`sQIFpR&_JQl*z4V&!T^#WJjF zgdFC2C8NYghL0SdVfZNU(cm)zA3uCl_zcHKi%&8>f%y326M|1LKJEA<;A6oj2OnOe zoB+I1>5usSM+=ZPclSW;MwqhQcQH)K`hM|D%n)a#HkE%h+t(fBB zpi9oi1(z);S4;dhIs5*AT1k>ZG9K~a5KD38W(!s#CfOH zzzOKPlUA!wDKJ#EaJ{cmA#(4_{0B_qzVd#ra)ARYx1heYsd3;F!{PUWm9y^@?PBC- z?RGKzw`_Ps_|ICAi3m}LTbbe7a5@$tGF;$qp28o>5^tLTSUoH4&*@2_jcY4Ue#c$bb+3+0ZS(bUOkBItc**mkn?LF4S ze>+axvy~MO)l-5_{+IQ;Vd?e(YF`QUBppulXH|ESEHJYjvrXE>K(aw#dV3Y!&kR*{ z{^r`jwBJ|lKKA3S`28QL_+!t@#lIg?h|k{2(z@>$F6kp6L}AYc@g6E2n$CcV>;0(7 zH8|;kO8D$Pv!8onw}gf`TM&_=&vsV<{IE3|P%h^-E+Lw3DFOcvi46Pa%%;lzw`2hQ3Q3EQ_pQla6PEJzvO7*1KCg^QmiPF1yIj1F5 zRyj}m44oZ30q`QIx+qS0D+G2);_wM>U{;dU(oA&_6hEI90{K;f>Zbx-6SiK^4Fdfa z7oeJ^Nb~*sRWN(H!N-=H?xCn~N~I)6rK{1^jb{2_!xL!F&|Q`n-XE$xsliSC`+BM& z#P$Gt^sJ_qM)aAtt#q`Sot=#kmjJ{cE!Cf01n5%ouzAF*U}zA{*z{^uWpxAHq;tI30X1>K2U5$l3M5OEs)FE`~p537Wf%-^4_Te3}4#R z{+to09gfjx-=38AQ=eNpZ8mHHz?(dG@_5x<(sZShQPLID&g>f{DZvc*1&t#@#E~~u z2nZHBcgjI9seC*D)$LE`AW=WyeVkrP*FeJSpAD1;Nx;t1T#{xGt^u09730-URs;A{ zziQDu7XWKU2{4T6L z_P@~NW*9Qay#fsgmACRaEA%r`Q=SO*Cbl zJ{S3B8&MB<_dx|98MXnt1EmF3u0Y4*wdcbJ0`^TwuJ$@*>H+!cJ{dmc$+76Ao@#kokBa%U$iP{i#HuEJ%Nmg&kqym8%%RPGMLhDOB$qHA80WGRcz7lH{O`e-@9j|cI$2l+tOcM1!XfGX5bpk+v2hFqL`x{6_noaj1F(qeNXO8j!4$ z0((i6LT}E3l^L;eNN(2ep+rx^*9k*MpQxmYWhh&{iWBO6Ao&iXr+g}$L8>Gv1+Y{L zN^mHQD*KT2$fvCJcDB#qfR=N%KG0l8dz%|Q(3yn#c(zOG7D{mR5sIw<=Uz0u5$YTO zkHIydU-I|%0Id>2X=zpIQ~gb#*rH$HR5L7fDJQ5LHsrQoMP5rOJ3Ud@;7M)H^fm0lD!!UB2;;Ob1#O zsx790gI?dJzAE*RtCyL0wSEYQLg1~FQb#AeJ)n_nM`B0HDV$aC5`&j%pW_2M56%U2 zF42zmX^xUTocc6{u13%&brzR+f;S_rw4RO(J9pZaDaB4ayws&R9Yix)Tzgl2(NQ0 z5{kiV15_x@0(3Td4StrA^Bm>Y0Kgi=X@DjQB|9zZtgl?ZN9)k+=k;gO!eL&!%Rju7 zu31|&_!?j;{v9qfzZ*aUKRRz@cBg#y7V6`QVO6szqtO> z|G}cX@j2(0b@u#!u&_RF-1CbYc;%b|X@t-mX{6@S=YY8U&uIC)A(SGC&M&n8^f@K| zYcuD(()xgA&YK_uF8pUp92jPFelyR#`kyTujBeriW%ivtr>q)JlXJ+KIN-uRnv3TL zat&29b=4mj>_zW6ry~F65ckE5onQLEE9aCc5we&0{+B6v;8;olWkb|pKtNpoE$39_ z-)uhJQ#K8;0-QbnpDm9@#hu^KzO(0))z8!ibBg}c=h7Ela1k}$;s%(LwAfyV706gc z4L?mS(#q&@Bj%!|i!O}KT@?7RlU4?yE7Uwl&sq@cYfduK=X{kJc+s3kVV*pQX0IZnqcVL;t4Q?Wy+6T6>P&UTe>)mCj{m4!Yh+PdfUq=N9F8 zkMS+NMY@i2opwBj|D~6V%fe+G+wEDYIF~s#uffw^kz1NN+fvw3Ii<9%va!HD-JJ|q1uz@?ySvgu+~+UmC$?ItIHO*PRp{pt5S;Vsv3)M&fe)e z?x@Pjv*l$wx(etsjfF`Sv+eZy;+oQ=*1W9z`bx{<BHCB4to-JRtUOw;24`7mYei04dwE&1N9w}{&qArZ#!U1j`YSmt z$u&FEd#$mw-C0JqbSnQc?@ztTBqPe1M@xs}bzP`4*ofv!cWldE>XAtgZC<*` zN&3&tgT~_K>fFUXUT{85Rp)w=Dt+^AsPU^Vvo?e77J|3Xc@3VI-03PEFn1f$+|Gv5 z`s#my)~iy$XUlTBT;6w{&np@WF?W-}Qy2bjfBkpVtD>>AwK69SywjTWk7#Vj`-Y;m z{|>$;twpU;znr%&WaW2(hqXv_I8=QaDq1ToIsb@nHB{!N)t%)ZgVzS|<<`n6SihzW z;`v=zJDRaR)?gj$tOT!=jxAnVAF_`B;Qs$98brOo)A30u_`SXaU0N67(}=bC_tx50 z=j_6yGK+5x{3qvaLj~6O#Wk3F?bW%Z?bSJHi>mPZ_jt^?G&$SS++FD#ga4^Mt;#L! za+ale*ZCpV*g@BaqR;=9`BK>IYVgVxL(pQkb9S?rHx5;we|IhQ%6fIxQ;N|q`Nu#x-o!^ZyXqVnmpVwZ{mD-)xm;`~hoJzhvd6A0Ry^xB@tyElgbW%~dmL8{3F}r|@%~=Ihwl1Z|`Bc8nT!=6GbowO;-B}CA%osBU z2buOd=_D=GD{o7O^g+8F?XXoyGJ1BE?|xbd{AHK)J)c=jkEKcvd_I?+?4u*xpGWT> zGoyRV7+Rg866vk^^rrr;1e!w6<_7Sbzw|#}C{=Rc^Yl@v<=$3G`wy(U6=if>?DpC8d29dkInu4(^1M$; zcU9p#vm5Jg8>JC@-YnENK6Olux4(V;MQ<9|U(@LEIegjPO3RC<&r9v~mX{@U-P!Uo zX;U+QkGEscrRU4Xboj=5F)hh{Zu!#tsv2_Iofsc92`??D|9k&xGxPeM_tjszBK42= z4oax@b9tL|$uTQ_%$T&)bDlq!-loud`{j+I%vO4T(~Pl$=tUZ@0rZkdyJCu0Zlce7 z=>6mBQQjY;j{))?ecZm7K0l`a`K+PGmlm1{S*^59dMG;^&(QMhQg!TE^}b`r?>z6D z-?OoQYs9;9&v`!QpFK|}U}kH@>H{{Y}B-DUs) literal 156921 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�U1uEe*qSCj6; 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 z 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

    H3j1;QIa8QW~Dv24#hV(rj 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%0A!f<=drVd*4P&xe|;@tX=D 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¬w?y#8cdzC^uTbpW;d(WxIL&#ZW86vCFVjMk)Ol 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 Y6Q^pLQr&*x_xP)?$~PYCFw^GEAJ$`|#sB~S literal 59240 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 diff --git a/tests/verbs/data/documents.parquet b/tests/verbs/data/documents.parquet index 654c5c7f5e49abba4ed1f124f406781d179627dc..8176b28f3405dea347fb140fd9ade2abbb71e72f 100644 GIT binary patch delta 63476 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%0A@UO0?%$4EA`t`!|?3(DshPB`|@ljuX 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 VfAf;1rGNczNnW(HbY!+U{uK>-xf%cf delta 64381 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 #^6 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 C@o!@Q diff --git a/tests/verbs/data/entities.parquet b/tests/verbs/data/entities.parquet index 8de7e6da158cfb611e64022c3876235fbde39e5c..0d7d047d0579e4810fb3b1b63687d381e53b0360 100644 GIT binary patch literal 119565 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Χ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 literal 41136 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 diff --git a/tests/verbs/data/relationships.parquet b/tests/verbs/data/relationships.parquet index f926d44091ce24877875d8f8ffa6c2d4e30b716f..b96143352a6eb27ba74762ac5dffbf7be4c1f3ce 100644 GIT binary patch literal 126576 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 ^Dk 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

    +6uIe#iZ5F2Yein#! zK#cI~YZAvZ!D+RvQN{@~VX~XN%uMKOF`WDTB#^M$t50-OBaHUQewZbq=mgBKq9j>$G0d1UO>fr5>`rIMD=?~34^EYBdE zfR7o$jI$2%R~PbI1B(k7I&`EEFQ3L9(QDDDTvEwzoo0Q8!K$~mY#fugm4P`N>XBt- zcTeIa1{RIRIfKM>k(mWu1*lV zr;+F!SuB%&EQDM+OFIA!A8+A(fXRx&YBL}Gm}Te)%Yru}yc?{4D!7+3xEF)fhhXJk zD3+O7kVaxF+$D!J10wc+Qejq91?&op&bax4u7`=zUEucUn5G9KGsiJi(eEPewsUXC z9T4EqeDGIsFC_7kl+x8)IEanX!(ZTD124)zqQQtLM}~S=LGX=gtOOZbjS7+_$H9{=(_4daE5Bpp@M?zkm#N_ zbfp;=vth>=dQVUPE9L%z1O+>X>(bh0GM-ziXdL;rmohYdurRk%=7{MC$sB^v<|=-@ zUY^tS8{P!IHw2?BQe9D6;~CTY2b%y9hq3nwjDtKQ9P^1aW=3P zOHKG$uEiqDTh*Q9$s_5~;joJ(2XM}uY&A4MH((#_3+WL3J{kJkIrT`~oK3lS*wW`Q zx;e)er5qUM!_iDFp{a5tiNcG+g|XP+X=1y1LkTgX?r6$L)t8#j!OsIop`4Wm!kh7E z9K`8qgq#)yq1VPc;KoHB9PtYyuxhhUVoaqas_F`KYaBt>Z&@?^QRYh_T2lgb(bu!+ zWgVVfXqtsnF;Hshe(TE#Cr`nNc&!70KDG2o7AsAKN0VsfAkTW#dR{K`>AV-ThRyVm z+_3TFZ?>eGMAV<#*h*ddQ%fOEAwk+iNzEX7dzk5r!ZQ)2 zZg^g14GU$*#*)26fb=qSmIwlxSx)*auW0rJL?`ayLL>Dc6kwVj8I4}URwd_16td?Ku#q1>E&4}-OzGL)!<4&On zEt=b|GbzGAR3N;CNr4H9#K%$g>VEC3VZZ?CAt8e){7B_dg&CO^|}oHV~vu^b3 z!b6+FCJO(Wc4+WbY<^PlKX}iFx99d|V_$(>!dSB2Qq=?;FyL|(!qR_dGI=wZ`t!`V z?w7ig<9Bh3&`D;S;Ee93$7N*b&6j0G-X_8`DfH~r?rn}=Nw%a6uOYK~W>R!8v|8L0 ziAdZFxt+s%td#sluqNHapB8Qw|sbBpBGD}+5T z4xZdS)?&=E_3Qi7aZhTaZw%C(b*zLpd5>UqFx�)JmK6#EL&g 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 xu5rg7K!kh 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 O|0$2sT7EEWy={r+e;VFtos)d)rtL0yX{5@s}P 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∈_{lC`* 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 diff --git a/tests/verbs/data/text_units_metadata.parquet b/tests/verbs/data/text_units_metadata.parquet deleted file mode 100644 index 71ec620e2ab50c6b2da900c0d8e83361fdc28c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128451 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

    q%I1jiW}G&l7QbW&Xn6xvQ5 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 J08EPWe*x5R%eVjl diff --git a/tests/verbs/data/text_units_metadata_included_chunk.parquet b/tests/verbs/data/text_units_metadata_included_chunk.parquet deleted file mode 100644 index ccf4b3903ef80963e26cde535d7e48631776d27e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128513 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

    A|a})zdCCgHs(x*lATb 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�#Jg4bj@1WOx2o3c7}>yIUi8oecGiwX$od92 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

    9GBaQjyg6y!CU1%)HDycb zFhS{ZW>a>Koau2k`O-4dd}(Re8?%0xrL2s!l$4zG^sJPOl(h78XNoU1)0>qIinEF@7#UQe1c zMS@|=@OjfyC78>c3}1SxH#05O=Syo!^WiX0N@{9~C%q{x!>-h&A)lbV;3B2VDM*PeKYplmDLP#>y*ddH2{A^XTNf?6^LtKHK=S&&2XeR zoHjfc+pm}Y&5urp(~)Ld%|+-Dcdcy5{bgi}Sfih=ywaLoqA1S8|H^BwD5i_~&0>)# zHj4$#W83oc|LOOBWh0LH^><+YfBBC0v9pZ*?iR&<5y#=*v6JB6v4im5i2w8Z8yhlO z8|Rnfa}SQs&vLi7^(`o_PoM9sSkY8c-`mtt?yvOcH^~E~-4gb7FY9b}ca*j?wR_v# z{{CindqzuBL!GiupSNLUPg#NJ_oP*~csk}`o7n&B_Z6N3cc!~=-oUTl+kW|8lrz6Z zImfTpYRlRnKSV~aCVn~M8;+y$lWQbT>uf})(h#)i~3 zWxuA5`ktl&oTnon<-)a7b5i8_`D4GiJL>zShKdynitGH!wXtunr=-p2Eoti?J8wbh zibgni8q?eDff$d zP3@QKe{)amIew|Vewnvm?DyUU^Q&8Mj+Dl~*VD?JvI3>-|G1tP&-B;*|E>Pq9jNn? z|Gni|P@J<2_tnghl3_n)3~`^qk~yQaU_U46>`m*+j!hJ9$0Xz#yy zj+hb^=X5V<$oOx|+0=&Rqq7(HQ$BXx|MXnZhEgh){o2m{y&ZNnb7`ObPTyGDUFJ$HTPF6E z`%BS2&`|mohx)|=Q7rk@9w|HKj~!WZ>EF&*4x=ZE zzdhgBrN>U77%K5!+k~=B96NqmzhX-9EkD0{Y^!4A6#MtL*I48N9)ishFfB~n@Q{QZxMHgFuED5?JoZgjWP diff --git a/tests/verbs/test_create_base_text_units.py b/tests/verbs/test_create_base_text_units.py index ea34ae8b9c..34bad99dc7 100644 --- a/tests/verbs/test_create_base_text_units.py +++ b/tests/verbs/test_create_base_text_units.py @@ -1,16 +1,15 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -from graphrag.config.create_graphrag_config import create_graphrag_config from graphrag.index.workflows.create_base_text_units import run_workflow from graphrag.utils.storage import load_table_from_storage +from tests.unit.config.utils import get_default_graphrag_config + from .util import ( - DEFAULT_MODEL_CONFIG, compare_outputs, create_test_context, load_test_table, - update_document_metadata, ) @@ -19,50 +18,19 @@ async def test_create_base_text_units(): context = await create_test_context() - config = create_graphrag_config({"models": DEFAULT_MODEL_CONFIG}) + config = get_default_graphrag_config() + config.chunking.prepend_metadata = ["title"] await run_workflow(config, context) actual = await load_table_from_storage("text_units", context.output_storage) - compare_outputs(actual, expected, columns=["text", "document_ids", "n_tokens"]) - - -async def test_create_base_text_units_metadata(): - expected = load_test_table("text_units_metadata") - - context = await create_test_context() - - config = create_graphrag_config({"models": DEFAULT_MODEL_CONFIG}) - # test data was created with 4o, so we need to match the encoding for chunks to be identical - config.chunks.encoding_model = "o200k_base" - config.input.metadata = ["title"] - config.chunks.prepend_metadata = True - - await update_document_metadata(config.input.metadata, context) + print("EXPECTED") + print(expected.columns) + print(expected) - await run_workflow(config, context) - - actual = await load_table_from_storage("text_units", context.output_storage) - compare_outputs(actual, expected) + print("ACTUAL") + print(actual.columns) + print(actual) - -async def test_create_base_text_units_metadata_included_in_chunk(): - expected = load_test_table("text_units_metadata_included_chunk") - - context = await create_test_context() - - config = create_graphrag_config({"models": DEFAULT_MODEL_CONFIG}) - # test data was created with 4o, so we need to match the encoding for chunks to be identical - config.chunks.encoding_model = "o200k_base" - config.input.metadata = ["title"] - config.chunks.prepend_metadata = True - config.chunks.chunk_size_includes_metadata = True - - await update_document_metadata(config.input.metadata, context) - - await run_workflow(config, context) - - actual = await load_table_from_storage("text_units", context.output_storage) - # only check the columns from the base workflow - our expected table is the final and will have more - compare_outputs(actual, expected, columns=["text", "document_ids", "n_tokens"]) + compare_outputs(actual, expected, columns=["text", "document_id", "n_tokens"]) diff --git a/tests/verbs/test_create_communities.py b/tests/verbs/test_create_communities.py index 1f51667cf3..d5505d7a31 100644 --- a/tests/verbs/test_create_communities.py +++ b/tests/verbs/test_create_communities.py @@ -1,15 +1,15 @@ # Copyright (c) 2024 Microsoft Corporation. # Licensed under the MIT License -from graphrag.config.create_graphrag_config import create_graphrag_config from graphrag.data_model.schemas import COMMUNITIES_FINAL_COLUMNS from graphrag.index.workflows.create_communities import ( run_workflow, ) from graphrag.utils.storage import load_table_from_storage +from tests.unit.config.utils import get_default_graphrag_config + from .util import ( - DEFAULT_MODEL_CONFIG, compare_outputs, create_test_context, load_test_table, @@ -26,7 +26,7 @@ async def test_create_communities(): ], ) - config = create_graphrag_config({"models": DEFAULT_MODEL_CONFIG}) + config = get_default_graphrag_config() await run_workflow( config, diff --git a/tests/verbs/test_create_community_reports.py b/tests/verbs/test_create_community_reports.py index 56fe4a6221..a36b6c7a66 100644 --- a/tests/verbs/test_create_community_reports.py +++ b/tests/verbs/test_create_community_reports.py @@ -2,8 +2,6 @@ # Licensed under the MIT License -from graphrag.config.create_graphrag_config import create_graphrag_config -from graphrag.config.enums import ModelType from graphrag.data_model.schemas import COMMUNITY_REPORTS_FINAL_COLUMNS from graphrag.index.operations.summarize_communities.community_reports_extractor import ( CommunityReportResponse, @@ -14,8 +12,9 @@ ) from graphrag.utils.storage import load_table_from_storage +from tests.unit.config.utils import get_default_graphrag_config + from .util import ( - DEFAULT_MODEL_CONFIG, compare_outputs, create_test_context, load_test_table, @@ -35,7 +34,7 @@ summary="", explanation=" PipelineRunContext: """Create a test context with tables loaded into storage storage.""" @@ -68,7 +45,10 @@ def compare_outputs( ) for column in cols: - assert column in actual.columns + try: + assert column in actual.columns + except AssertionError: + print(f"Column '{column}' not found in actual output.") try: # dtypes can differ since the test data is read from parquet and our workflow runs in memory if column != "id": # don't check uuids @@ -79,17 +59,9 @@ def compare_outputs( check_index=False, ) except AssertionError: + print(f"Column '{column}' does not match.") print("Expected:") print(expected[column]) print("Actual:") print(actual[column]) raise - - -async def update_document_metadata(metadata: list[str], context: PipelineRunContext): - """Takes the default documents and adds the configured metadata columns for later parsing by the text units and final documents workflows.""" - documents = await load_table_from_storage("documents", context.output_storage) - documents["metadata"] = documents[metadata].apply(lambda row: row.to_dict(), axis=1) - await write_table_to_storage( - documents, "documents", context.output_storage - ) # write to the runtime context storage only diff --git a/unified-search-app/README.md b/unified-search-app/README.md index 0f74a8c67e..6e7ccc82f0 100644 --- a/unified-search-app/README.md +++ b/unified-search-app/README.md @@ -15,14 +15,7 @@ We recommend always using a virtual environment: - `source .venv/bin/activate` ## Run index -Use GraphRAG to index your dataset before running Unified Search. We recommend starting with the [Getting Started guide](https://microsoft.github.io/graphrag/get_started/). You need to run GraphRAG indexing with graph embedding umap enabled to use the functionalities of Unified Search. -``` yaml -embed_graph: - enabled: true - -umap: - enabled: true -``` +Use GraphRAG to index your dataset before running Unified Search. We recommend starting with the [Getting Started guide](https://microsoft.github.io/graphrag/get_started/). ## Datasets Unified Search supports multiple GraphRAG indexes by using a directory listing file. Create a `listing.json` file in the root folder where all your datasets are stored (locally or in blob storage), with the following format (one entry per dataset): @@ -46,8 +39,8 @@ Unified Search supports multiple GraphRAG indexes by using a directory listing f For example, if you have a folder of GraphRAG indexes called "projects" and inside that you ran the Getting Started instructions, your listing.json in the projects folder could look like: ```json [{ - "key": "ragtest-demo", - "path": "ragtest", + "key": "christmas-demo", + "path": "christmas", "name": "A Christmas Carol", "description": "Getting Started index of the novel A Christmas Carol", "community_level": 2 @@ -110,9 +103,9 @@ In the right panel you have several functionalities. 1. At the top you can see general information related to the chosen dataset (name and description). 2. Below the dataset information there is a button labeled "Suggest some questions" which analyzes the dataset using global search and generates the most important questions (the number of questions generated is the amount set in the configuration panel). If you want to select a question generated you have to click the checkbox at the left side of the question to select it. 3. A textbox that it is labeled as "Ask a question to compare the results" where you can type the question that you want to send. -4. Two tabs called Search and Graph Explorer: +4. Two tabs called Search and Community Explorer: 1. Search: Here all the searches results are displayed with their citations. - 2. Graph Explorer: This tab is divided in three sections: Community Reports, Entity Graph and Selected Report. + 2. Community Explorer: This tab is divided in two sections: Community Reports List, and Selected Report. ##### Suggest some question clicked ![Suggest some question clicked](images/image-2.png) @@ -120,8 +113,8 @@ In the right panel you have several functionalities. ##### Selected question clicked ![Selected question clicked](images/image-3.png) -##### Graph Explorer tab -![Graph Explorer tab](images/image-4.png) +##### Community Explorer tab +![Community Explorer tab](images/image-4.png) diff --git a/unified-search-app/app/app_logic.py b/unified-search-app/app/app_logic.py index a573b9daa5..dc64e0e77c 100644 --- a/unified-search-app/app/app_logic.py +++ b/unified-search-app/app/app_logic.py @@ -7,6 +7,7 @@ import logging from typing import TYPE_CHECKING +import graphrag.api as api import streamlit as st from knowledge_loader.data_sources.loader import ( create_datasource, @@ -17,8 +18,6 @@ from state.session_variables import SessionVariables from ui.search import display_search_result -import graphrag.api as api - if TYPE_CHECKING: import pandas as pd diff --git a/unified-search-app/app/home_page.py b/unified-search-app/app/home_page.py index 47aa070e6e..6a249f0e5c 100644 --- a/unified-search-app/app/home_page.py +++ b/unified-search-app/app/home_page.py @@ -10,7 +10,6 @@ from rag.typing import SearchType from st_tabs import TabBar from state.session_variables import SessionVariables -from ui.full_graph import create_full_graph_ui from ui.questions_list import create_questions_list_ui from ui.report_details import create_report_details_ui from ui.report_list import create_report_list_ui @@ -78,7 +77,7 @@ def on_change(sv: SessionVariables): st.button(label="Reset", on_click=on_click_reset, kwargs={"sv": sv}) tab_id = TabBar( - tabs=["Search", "Graph Explorer"], + tabs=["Search", "Community Explorer"], color="#fc9e9e", activeColor="#ff4b4b", default=0, @@ -237,20 +236,12 @@ def on_change(sv: SessionVariables): st.write(e) if tab_id == 1: - report_list, graph, report_content = st.columns([0.20, 0.55, 0.25]) + report_list, report_content = st.columns([0.33, 0.67]) with report_list: st.markdown("##### Community Reports") create_report_list_ui(sv) - with graph: - title, dropdown = st.columns([0.80, 0.20]) - title.markdown("##### Entity Graph (All entities)") - dropdown.selectbox( - "Community level", options=[0, 1], key=sv.graph_community_level.key - ) - create_full_graph_ui(sv) - with report_content: st.markdown("##### Selected Report") create_report_details_ui(sv) diff --git a/unified-search-app/app/knowledge_loader/data_sources/blob_source.py b/unified-search-app/app/knowledge_loader/data_sources/blob_source.py index 8f86b8dfa7..63774d79f7 100644 --- a/unified-search-app/app/knowledge_loader/data_sources/blob_source.py +++ b/unified-search-app/app/knowledge_loader/data_sources/blob_source.py @@ -13,10 +13,8 @@ import yaml from azure.identity import DefaultAzureCredential from azure.storage.blob import BlobServiceClient, ContainerClient -from knowledge_loader.data_sources.typing import Datasource - -from graphrag.config.create_graphrag_config import create_graphrag_config from graphrag.config.models.graph_rag_config import GraphRagConfig +from knowledge_loader.data_sources.typing import Datasource from .default import blob_account_name, blob_container_name @@ -115,7 +113,7 @@ def read_settings( str_settings = settings.read().decode("utf-8") config = os.path.expandvars(str_settings) settings_yaml = yaml.safe_load(config) - graphrag_config = create_graphrag_config(values=settings_yaml) + graphrag_config = GraphRagConfig(**settings_yaml) except Exception as err: if throw_on_missing: error_msg = f"File {file} does not exist" diff --git a/unified-search-app/app/knowledge_loader/data_sources/local_source.py b/unified-search-app/app/knowledge_loader/data_sources/local_source.py index f68f616858..bd6370ba23 100644 --- a/unified-search-app/app/knowledge_loader/data_sources/local_source.py +++ b/unified-search-app/app/knowledge_loader/data_sources/local_source.py @@ -8,10 +8,9 @@ from pathlib import Path import pandas as pd -from knowledge_loader.data_sources.typing import Datasource - from graphrag.config.load_config import load_config from graphrag.config.models.graph_rag_config import GraphRagConfig +from knowledge_loader.data_sources.typing import Datasource logging.basicConfig(level=logging.INFO) logging.getLogger("azure").setLevel(logging.WARNING) diff --git a/unified-search-app/app/knowledge_loader/data_sources/typing.py b/unified-search-app/app/knowledge_loader/data_sources/typing.py index 95fc2f120b..2f595f00ec 100644 --- a/unified-search-app/app/knowledge_loader/data_sources/typing.py +++ b/unified-search-app/app/knowledge_loader/data_sources/typing.py @@ -8,7 +8,6 @@ from enum import Enum import pandas as pd - from graphrag.config.models.graph_rag_config import GraphRagConfig diff --git a/unified-search-app/app/ui/full_graph.py b/unified-search-app/app/ui/full_graph.py deleted file mode 100644 index e2017c9ea8..0000000000 --- a/unified-search-app/app/ui/full_graph.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) 2024 Microsoft Corporation. -# Licensed under the MIT License - -"""Full graph module.""" - -import altair as alt -import pandas as pd -import streamlit as st -from state.session_variables import SessionVariables - - -def create_full_graph_ui(sv: SessionVariables): - """Return graph UI object.""" - entities = sv.entities.value.copy() - communities = sv.communities.value.copy() - - if not communities.empty and not entities.empty: - communities_entities = ( - communities.explode("entity_ids") - .merge( - entities, - left_on="entity_ids", - right_on="id", - suffixes=("_entities", "_communities"), - ) - .dropna(subset=["x", "y"]) - ) - else: - communities_entities = pd.DataFrame() - - level = sv.graph_community_level.value - communities_entities_filtered = communities_entities[ - communities_entities["level"] == level - ] - - graph = ( - alt.Chart(communities_entities_filtered) - .mark_circle() - .encode( - x="x", - y="y", - color=alt.Color( - "community", - scale=alt.Scale( - domain=communities_entities_filtered["community"].unique(), - scheme="category10", - ), - ), - size=alt.Size("degree", scale=alt.Scale(range=[50, 1000]), legend=None), - tooltip=["id_entities", "type", "description", "community"], - ) - .properties(height=1000) - .configure_axis(disable=True) - ) - st.altair_chart(graph, use_container_width=True) - return graph diff --git a/unified-search-app/app/ui/report_details.py b/unified-search-app/app/ui/report_details.py index 3b5b7a41d7..606be50aee 100644 --- a/unified-search-app/app/ui/report_details.py +++ b/unified-search-app/app/ui/report_details.py @@ -58,7 +58,8 @@ def create_report_details_ui(sv: SessionVariables): st.write("Error parsing report.") st.write(sv.selected_report.value.full_content_json) text_replacement = ( - text.replace("Entity_Relationships", "Relationships") + text + .replace("Entity_Relationships", "Relationships") .replace("Entity_Claims", "Claims") .replace("Entity_Details", "Entities") ) diff --git a/unified-search-app/app/ui/report_list.py b/unified-search-app/app/ui/report_list.py index edd221566a..b7f7e1df23 100644 --- a/unified-search-app/app/ui/report_list.py +++ b/unified-search-app/app/ui/report_list.py @@ -13,7 +13,7 @@ def create_report_list_ui(sv: SessionVariables): sv.community_reports.value, height=1000, hide_index=True, - column_order=["id", "title"], + column_order=["human_readable_id", "title"], selection_mode="single-row", on_select="rerun", ) diff --git a/unified-search-app/app/ui/search.py b/unified-search-app/app/ui/search.py index fa5c062f38..5e9d0c61c3 100644 --- a/unified-search-app/app/ui/search.py +++ b/unified-search-app/app/ui/search.py @@ -247,7 +247,8 @@ def render_html_table(df: pd.DataFrame, search_type: str, key: str): else value ) title_value = ( - title_value.replace('"', """) + title_value + .replace('"', """) .replace("'", "'") .replace("\n", " ") .replace("\n\n", " ") diff --git a/unified-search-app/pyproject.toml b/unified-search-app/pyproject.toml index 4dc2cf6519..2b55568f63 100644 --- a/unified-search-app/pyproject.toml +++ b/unified-search-app/pyproject.toml @@ -6,26 +6,26 @@ authors = [ {name = "GraphRAG team"}, ] readme = "README.md" -requires-python = ">=3.10,<3.12" +requires-python = ">=3.11,<3.14" dependencies = [ "streamlit==1.43.0", - "azure-search-documents>=11.4.0", - "azure-storage-blob>=12.20.0", - "azure-identity>=1.16.0", - "graphrag==2.0.0", - "altair>=5.3.0", - "streamlit-agraph>=0.0.45", - "st-tabs>=0.1.1", - "spacy>=3.8.4,<4.0.0", + "azure-search-documents~=11.4", + "azure-storage-blob~=12.20", + "azure-identity~=1.16", + "graphrag==2.5.0", + "altair~=5.3", + "streamlit-agraph~=0.0.45", + "st-tabs~=0.1", + "spacy~=3.8", ] [project.optional-dependencies] dev = [ - "poethepoet>=0.26.1", - "ipykernel>=6.29.4", - "pyright>=1.1.349", - "ruff>=0.4.7", + "poethepoet~=0.26", + "ipykernel~=6.29", + "pyright~=1.1", + "ruff~=0.8", ] [build-system] diff --git a/unified-search-app/uv.lock b/unified-search-app/uv.lock index 0fdb3dbf47..c200f831cd 100644 --- a/unified-search-app/uv.lock +++ b/unified-search-app/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 1 requires-python = ">=3.10, <3.12" resolution-markers = [ "python_full_version >= '3.11'", @@ -10,18 +10,18 @@ resolution-markers = [ name = "aiofiles" version = "24.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247, upload-time = "2024-06-24T11:02:03.584Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896, upload-time = "2024-06-24T11:02:01.529Z" }, + { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 }, ] [[package]] name = "aiolimiter" version = "1.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/23/b52debf471f7a1e42e362d959a3982bdcb4fe13a5d46e63d28868807a79c/aiolimiter-1.2.1.tar.gz", hash = "sha256:e02a37ea1a855d9e832252a105420ad4d15011505512a1a1d814647451b5cca9", size = 7185, upload-time = "2024-12-08T15:31:51.496Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/23/b52debf471f7a1e42e362d959a3982bdcb4fe13a5d46e63d28868807a79c/aiolimiter-1.2.1.tar.gz", hash = "sha256:e02a37ea1a855d9e832252a105420ad4d15011505512a1a1d814647451b5cca9", size = 7185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/ba/df6e8e1045aebc4778d19b8a3a9bc1808adb1619ba94ca354d9ba17d86c3/aiolimiter-1.2.1-py3-none-any.whl", hash = "sha256:d3f249e9059a20badcb56b61601a83556133655c11d1eb3dd3e04ff069e5f3c7", size = 6711, upload-time = "2024-12-08T15:31:49.874Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ba/df6e8e1045aebc4778d19b8a3a9bc1808adb1619ba94ca354d9ba17d86c3/aiolimiter-1.2.1-py3-none-any.whl", hash = "sha256:d3f249e9059a20badcb56b61601a83556133655c11d1eb3dd3e04ff069e5f3c7", size = 6711 }, ] [[package]] @@ -35,18 +35,18 @@ dependencies = [ { name = "packaging" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/16/b1/f2969c7bdb8ad8bbdda031687defdce2c19afba2aa2c8e1d2a17f78376d8/altair-5.5.0.tar.gz", hash = "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d", size = 705305, upload-time = "2024-11-23T23:39:58.542Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b1/f2969c7bdb8ad8bbdda031687defdce2c19afba2aa2c8e1d2a17f78376d8/altair-5.5.0.tar.gz", hash = "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d", size = 705305 } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200, upload-time = "2024-11-23T23:39:56.4Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } 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" }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, ] [[package]] @@ -59,27 +59,27 @@ dependencies = [ { name = "sniffio" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949, upload-time = "2025-03-17T00:02:54.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916, upload-time = "2025-03-17T00:02:52.713Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, ] [[package]] name = "anytree" version = "2.13.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/a8/eb55fab589c56f9b6be2b3fd6997aa04bb6f3da93b01154ce6fc8e799db2/anytree-2.13.0.tar.gz", hash = "sha256:c9d3aa6825fdd06af7ebb05b4ef291d2db63e62bb1f9b7d9b71354be9d362714", size = 48389, upload-time = "2025-04-08T21:06:30.662Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/a8/eb55fab589c56f9b6be2b3fd6997aa04bb6f3da93b01154ce6fc8e799db2/anytree-2.13.0.tar.gz", hash = "sha256:c9d3aa6825fdd06af7ebb05b4ef291d2db63e62bb1f9b7d9b71354be9d362714", size = 48389 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/98/f6aa7fe0783e42be3093d8ef1b0ecdc22c34c0d69640dfb37f56925cb141/anytree-2.13.0-py3-none-any.whl", hash = "sha256:4cbcf10df36b1f1cba131b7e487ff3edafc9d6e932a3c70071b5b768bab901ff", size = 45077, upload-time = "2025-04-08T21:06:29.494Z" }, + { url = "https://files.pythonhosted.org/packages/7b/98/f6aa7fe0783e42be3093d8ef1b0ecdc22c34c0d69640dfb37f56925cb141/anytree-2.13.0-py3-none-any.whl", hash = "sha256:4cbcf10df36b1f1cba131b7e487ff3edafc9d6e932a3c70071b5b768bab901ff", size = 45077 }, ] [[package]] name = "appnope" version = "0.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, ] [[package]] @@ -89,18 +89,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284, upload-time = "2023-10-26T10:03:05.06Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/1d/f03bcb60c4a3212e15f99a56085d93093a497718adf828d050b9d675da81/asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0", size = 62284 } wheels = [ - { url = "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764, upload-time = "2023-10-26T10:03:01.789Z" }, + { url = "https://files.pythonhosted.org/packages/45/86/4736ac618d82a20d87d2f92ae19441ebc7ac9e7a581d7e58bbe79233b24a/asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", size = 27764 }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, ] [[package]] @@ -110,18 +110,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/1c/3c24ec03c8ba4decc742b1df5a10c52f98c84ca8797757f313e7bdcdf276/autograd-1.8.0.tar.gz", hash = "sha256:107374ded5b09fc8643ac925348c0369e7b0e73bbed9565ffd61b8fd04425683", size = 2562146, upload-time = "2025-05-05T12:49:02.502Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/1c/3c24ec03c8ba4decc742b1df5a10c52f98c84ca8797757f313e7bdcdf276/autograd-1.8.0.tar.gz", hash = "sha256:107374ded5b09fc8643ac925348c0369e7b0e73bbed9565ffd61b8fd04425683", size = 2562146 } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/ea/e16f0c423f7d83cf8b79cae9452040fb7b2e020c7439a167ee7c317de448/autograd-1.8.0-py3-none-any.whl", hash = "sha256:4ab9084294f814cf56c280adbe19612546a35574d67c574b04933c7d2ecb7d78", size = 51478, upload-time = "2025-05-05T12:49:00.585Z" }, + { url = "https://files.pythonhosted.org/packages/84/ea/e16f0c423f7d83cf8b79cae9452040fb7b2e020c7439a167ee7c317de448/autograd-1.8.0-py3-none-any.whl", hash = "sha256:4ab9084294f814cf56c280adbe19612546a35574d67c574b04933c7d2ecb7d78", size = 51478 }, ] [[package]] name = "azure-common" version = "1.1.28" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/71/f6f71a276e2e69264a97ad39ef850dca0a04fce67b12570730cb38d0ccac/azure-common-1.1.28.zip", hash = "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3", size = 20914, upload-time = "2022-02-03T19:39:44.373Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/71/f6f71a276e2e69264a97ad39ef850dca0a04fce67b12570730cb38d0ccac/azure-common-1.1.28.zip", hash = "sha256:4ac0cd3214e36b6a1b6a442686722a5d8cc449603aa833f3f0f40bda836704a3", size = 20914 } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/55/7f118b9c1b23ec15ca05d15a578d8207aa1706bc6f7c87218efffbbf875d/azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad", size = 14462, upload-time = "2022-02-03T19:39:42.417Z" }, + { url = "https://files.pythonhosted.org/packages/62/55/7f118b9c1b23ec15ca05d15a578d8207aa1706bc6f7c87218efffbbf875d/azure_common-1.1.28-py2.py3-none-any.whl", hash = "sha256:5c12d3dcf4ec20599ca6b0d3e09e86e146353d443e7fcc050c9a19c1f9df20ad", size = 14462 }, ] [[package]] @@ -133,9 +133,9 @@ dependencies = [ { name = "six" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/89/f53968635b1b2e53e4aad2dd641488929fef4ca9dfb0b97927fa7697ddf3/azure_core-1.35.0.tar.gz", hash = "sha256:c0be528489485e9ede59b6971eb63c1eaacf83ef53001bfe3904e475e972be5c", size = 339689, upload-time = "2025-07-03T00:55:23.496Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/89/f53968635b1b2e53e4aad2dd641488929fef4ca9dfb0b97927fa7697ddf3/azure_core-1.35.0.tar.gz", hash = "sha256:c0be528489485e9ede59b6971eb63c1eaacf83ef53001bfe3904e475e972be5c", size = 339689 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/78/bf94897361fdd650850f0f2e405b2293e2f12808239046232bdedf554301/azure_core-1.35.0-py3-none-any.whl", hash = "sha256:8db78c72868a58f3de8991eb4d22c4d368fae226dac1002998d6c50437e7dad1", size = 210708, upload-time = "2025-07-03T00:55:25.238Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/bf94897361fdd650850f0f2e405b2293e2f12808239046232bdedf554301/azure_core-1.35.0-py3-none-any.whl", hash = "sha256:8db78c72868a58f3de8991eb4d22c4d368fae226dac1002998d6c50437e7dad1", size = 210708 }, ] [[package]] @@ -146,9 +146,9 @@ dependencies = [ { name = "azure-core" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/be/7c/a4e7810f85e7f83d94265ef5ff0fb1efad55a768de737d940151ea2eec45/azure_cosmos-4.9.0.tar.gz", hash = "sha256:c70db4cbf55b0ff261ed7bb8aa325a5dfa565d3c6eaa43d75d26ae5e2ad6d74f", size = 1824155, upload-time = "2024-11-19T04:09:30.195Z" } +sdist = { url = "https://files.pythonhosted.org/packages/be/7c/a4e7810f85e7f83d94265ef5ff0fb1efad55a768de737d940151ea2eec45/azure_cosmos-4.9.0.tar.gz", hash = "sha256:c70db4cbf55b0ff261ed7bb8aa325a5dfa565d3c6eaa43d75d26ae5e2ad6d74f", size = 1824155 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/dc/380f843744535497acd0b85aacb59565c84fc28bf938c8d6e897a858cd95/azure_cosmos-4.9.0-py3-none-any.whl", hash = "sha256:3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe", size = 303157, upload-time = "2024-11-19T04:09:32.148Z" }, + { url = "https://files.pythonhosted.org/packages/61/dc/380f843744535497acd0b85aacb59565c84fc28bf938c8d6e897a858cd95/azure_cosmos-4.9.0-py3-none-any.whl", hash = "sha256:3b60eaa01a16a857d0faf0cec304bac6fa8620a81bc268ce760339032ef617fe", size = 303157 }, ] [[package]] @@ -162,9 +162,9 @@ dependencies = [ { name = "msal-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/29/1201ffbb6a57a16524dd91f3e741b4c828a70aaba436578bdcb3fbcb438c/azure_identity-1.23.1.tar.gz", hash = "sha256:226c1ef982a9f8d5dcf6e0f9ed35eaef2a4d971e7dd86317e9b9d52e70a035e4", size = 266185, upload-time = "2025-07-15T19:16:38.077Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/29/1201ffbb6a57a16524dd91f3e741b4c828a70aaba436578bdcb3fbcb438c/azure_identity-1.23.1.tar.gz", hash = "sha256:226c1ef982a9f8d5dcf6e0f9ed35eaef2a4d971e7dd86317e9b9d52e70a035e4", size = 266185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/b3/e2d7ab810eb68575a5c7569b03c0228b8f4ce927ffa6211471b526f270c9/azure_identity-1.23.1-py3-none-any.whl", hash = "sha256:7eed28baa0097a47e3fb53bd35a63b769e6b085bb3cb616dfce2b67f28a004a1", size = 186810, upload-time = "2025-07-15T19:16:40.184Z" }, + { url = "https://files.pythonhosted.org/packages/99/b3/e2d7ab810eb68575a5c7569b03c0228b8f4ce927ffa6211471b526f270c9/azure_identity-1.23.1-py3-none-any.whl", hash = "sha256:7eed28baa0097a47e3fb53bd35a63b769e6b085bb3cb616dfce2b67f28a004a1", size = 186810 }, ] [[package]] @@ -177,9 +177,9 @@ dependencies = [ { name = "isodate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/11/9ecde2bd9e6c00cc0e3f312ab096a33d333f8ba40c847f01f94d524895fe/azure_search_documents-11.5.3.tar.gz", hash = "sha256:6931149ec0db90485d78648407f18ea4271420473c7cb646bf87790374439989", size = 300353, upload-time = "2025-06-25T16:48:58.924Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/11/9ecde2bd9e6c00cc0e3f312ab096a33d333f8ba40c847f01f94d524895fe/azure_search_documents-11.5.3.tar.gz", hash = "sha256:6931149ec0db90485d78648407f18ea4271420473c7cb646bf87790374439989", size = 300353 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/f5/0f6b52567cbb33f1efba13060514ed7088a86de84d74b77cda17d278bcd9/azure_search_documents-11.5.3-py3-none-any.whl", hash = "sha256:110617751c6c8bd50b1f0af2b00a478bd4fbaf4e2f0387e3454c26ec3eb433d6", size = 298772, upload-time = "2025-06-25T16:49:00.764Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f5/0f6b52567cbb33f1efba13060514ed7088a86de84d74b77cda17d278bcd9/azure_search_documents-11.5.3-py3-none-any.whl", hash = "sha256:110617751c6c8bd50b1f0af2b00a478bd4fbaf4e2f0387e3454c26ec3eb433d6", size = 298772 }, ] [[package]] @@ -192,53 +192,53 @@ dependencies = [ { name = "isodate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/95/3e3414491ce45025a1cde107b6ae72bf72049e6021597c201cd6a3029b9a/azure_storage_blob-12.26.0.tar.gz", hash = "sha256:5dd7d7824224f7de00bfeb032753601c982655173061e242f13be6e26d78d71f", size = 583332, upload-time = "2025-07-16T21:34:07.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/95/3e3414491ce45025a1cde107b6ae72bf72049e6021597c201cd6a3029b9a/azure_storage_blob-12.26.0.tar.gz", hash = "sha256:5dd7d7824224f7de00bfeb032753601c982655173061e242f13be6e26d78d71f", size = 583332 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/64/63dbfdd83b31200ac58820a7951ddfdeed1fbee9285b0f3eae12d1357155/azure_storage_blob-12.26.0-py3-none-any.whl", hash = "sha256:8c5631b8b22b4f53ec5fff2f3bededf34cfef111e2af613ad42c9e6de00a77fe", size = 412907, upload-time = "2025-07-16T21:34:09.367Z" }, + { url = "https://files.pythonhosted.org/packages/5b/64/63dbfdd83b31200ac58820a7951ddfdeed1fbee9285b0f3eae12d1357155/azure_storage_blob-12.26.0-py3-none-any.whl", hash = "sha256:8c5631b8b22b4f53ec5fff2f3bededf34cfef111e2af613ad42c9e6de00a77fe", size = 412907 }, ] [[package]] name = "backports-datetime-fromisoformat" version = "2.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/71/81/eff3184acb1d9dc3ce95a98b6f3c81a49b4be296e664db8e1c2eeabef3d9/backports_datetime_fromisoformat-2.0.3.tar.gz", hash = "sha256:b58edc8f517b66b397abc250ecc737969486703a66eb97e01e6d51291b1a139d", size = 23588, upload-time = "2024-12-28T20:18:15.017Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/4b/d6b051ca4b3d76f23c2c436a9669f3be616b8cf6461a7e8061c7c4269642/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f681f638f10588fa3c101ee9ae2b63d3734713202ddfcfb6ec6cea0778a29d4", size = 27561, upload-time = "2024-12-28T20:16:47.974Z" }, - { url = "https://files.pythonhosted.org/packages/6d/40/e39b0d471e55eb1b5c7c81edab605c02f71c786d59fb875f0a6f23318747/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:cd681460e9142f1249408e5aee6d178c6d89b49e06d44913c8fdfb6defda8d1c", size = 34448, upload-time = "2024-12-28T20:16:50.712Z" }, - { url = "https://files.pythonhosted.org/packages/f2/28/7a5c87c5561d14f1c9af979231fdf85d8f9fad7a95ff94e56d2205e2520a/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ee68bc8735ae5058695b76d3bb2aee1d137c052a11c8303f1e966aa23b72b65b", size = 27093, upload-time = "2024-12-28T20:16:52.994Z" }, - { url = "https://files.pythonhosted.org/packages/80/ba/f00296c5c4536967c7d1136107fdb91c48404fe769a4a6fd5ab045629af8/backports_datetime_fromisoformat-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8273fe7932db65d952a43e238318966eab9e49e8dd546550a41df12175cc2be4", size = 52836, upload-time = "2024-12-28T20:16:55.283Z" }, - { url = "https://files.pythonhosted.org/packages/e3/92/bb1da57a069ddd601aee352a87262c7ae93467e66721d5762f59df5021a6/backports_datetime_fromisoformat-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39d57ea50aa5a524bb239688adc1d1d824c31b6094ebd39aa164d6cadb85de22", size = 52798, upload-time = "2024-12-28T20:16:56.64Z" }, - { url = "https://files.pythonhosted.org/packages/df/ef/b6cfd355982e817ccdb8d8d109f720cab6e06f900784b034b30efa8fa832/backports_datetime_fromisoformat-2.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ac6272f87693e78209dc72e84cf9ab58052027733cd0721c55356d3c881791cf", size = 52891, upload-time = "2024-12-28T20:16:58.887Z" }, - { url = "https://files.pythonhosted.org/packages/37/39/b13e3ae8a7c5d88b68a6e9248ffe7066534b0cfe504bf521963e61b6282d/backports_datetime_fromisoformat-2.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:44c497a71f80cd2bcfc26faae8857cf8e79388e3d5fbf79d2354b8c360547d58", size = 52955, upload-time = "2024-12-28T20:17:00.028Z" }, - { url = "https://files.pythonhosted.org/packages/1e/e4/70cffa3ce1eb4f2ff0c0d6f5d56285aacead6bd3879b27a2ba57ab261172/backports_datetime_fromisoformat-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:6335a4c9e8af329cb1ded5ab41a666e1448116161905a94e054f205aa6d263bc", size = 29323, upload-time = "2024-12-28T20:17:01.125Z" }, - { url = "https://files.pythonhosted.org/packages/62/f5/5bc92030deadf34c365d908d4533709341fb05d0082db318774fdf1b2bcb/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2e4b66e017253cdbe5a1de49e0eecff3f66cd72bcb1229d7db6e6b1832c0443", size = 27626, upload-time = "2024-12-28T20:17:03.448Z" }, - { url = "https://files.pythonhosted.org/packages/28/45/5885737d51f81dfcd0911dd5c16b510b249d4c4cf6f4a991176e0358a42a/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:43e2d648e150777e13bbc2549cc960373e37bf65bd8a5d2e0cef40e16e5d8dd0", size = 34588, upload-time = "2024-12-28T20:17:04.459Z" }, - { url = "https://files.pythonhosted.org/packages/bc/6d/bd74de70953f5dd3e768c8fc774af942af0ce9f211e7c38dd478fa7ea910/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:4ce6326fd86d5bae37813c7bf1543bae9e4c215ec6f5afe4c518be2635e2e005", size = 27162, upload-time = "2024-12-28T20:17:06.752Z" }, - { url = "https://files.pythonhosted.org/packages/47/ba/1d14b097f13cce45b2b35db9898957578b7fcc984e79af3b35189e0d332f/backports_datetime_fromisoformat-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7c8fac333bf860208fd522a5394369ee3c790d0aa4311f515fcc4b6c5ef8d75", size = 54482, upload-time = "2024-12-28T20:17:08.15Z" }, - { url = "https://files.pythonhosted.org/packages/25/e9/a2a7927d053b6fa148b64b5e13ca741ca254c13edca99d8251e9a8a09cfe/backports_datetime_fromisoformat-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4da5ab3aa0cc293dc0662a0c6d1da1a011dc1edcbc3122a288cfed13a0b45", size = 54362, upload-time = "2024-12-28T20:17:10.605Z" }, - { url = "https://files.pythonhosted.org/packages/c1/99/394fb5e80131a7d58c49b89e78a61733a9994885804a0bb582416dd10c6f/backports_datetime_fromisoformat-2.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58ea11e3bf912bd0a36b0519eae2c5b560b3cb972ea756e66b73fb9be460af01", size = 54162, upload-time = "2024-12-28T20:17:12.301Z" }, - { url = "https://files.pythonhosted.org/packages/88/25/1940369de573c752889646d70b3fe8645e77b9e17984e72a554b9b51ffc4/backports_datetime_fromisoformat-2.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8a375c7dbee4734318714a799b6c697223e4bbb57232af37fbfff88fb48a14c6", size = 54118, upload-time = "2024-12-28T20:17:13.609Z" }, - { url = "https://files.pythonhosted.org/packages/b7/46/f275bf6c61683414acaf42b2df7286d68cfef03e98b45c168323d7707778/backports_datetime_fromisoformat-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:ac677b1664c4585c2e014739f6678137c8336815406052349c85898206ec7061", size = 29329, upload-time = "2024-12-28T20:17:16.124Z" }, - { url = "https://files.pythonhosted.org/packages/be/03/7eaa9f9bf290395d57fd30d7f1f2f9dff60c06a31c237dc2beb477e8f899/backports_datetime_fromisoformat-2.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90e202e72a3d5aae673fcc8c9a4267d56b2f532beeb9173361293625fe4d2039", size = 28980, upload-time = "2024-12-28T20:18:06.554Z" }, - { url = "https://files.pythonhosted.org/packages/47/80/a0ecf33446c7349e79f54cc532933780341d20cff0ee12b5bfdcaa47067e/backports_datetime_fromisoformat-2.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2df98ef1b76f5a58bb493dda552259ba60c3a37557d848e039524203951c9f06", size = 28449, upload-time = "2024-12-28T20:18:07.77Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/71/81/eff3184acb1d9dc3ce95a98b6f3c81a49b4be296e664db8e1c2eeabef3d9/backports_datetime_fromisoformat-2.0.3.tar.gz", hash = "sha256:b58edc8f517b66b397abc250ecc737969486703a66eb97e01e6d51291b1a139d", size = 23588 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/4b/d6b051ca4b3d76f23c2c436a9669f3be616b8cf6461a7e8061c7c4269642/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f681f638f10588fa3c101ee9ae2b63d3734713202ddfcfb6ec6cea0778a29d4", size = 27561 }, + { url = "https://files.pythonhosted.org/packages/6d/40/e39b0d471e55eb1b5c7c81edab605c02f71c786d59fb875f0a6f23318747/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:cd681460e9142f1249408e5aee6d178c6d89b49e06d44913c8fdfb6defda8d1c", size = 34448 }, + { url = "https://files.pythonhosted.org/packages/f2/28/7a5c87c5561d14f1c9af979231fdf85d8f9fad7a95ff94e56d2205e2520a/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ee68bc8735ae5058695b76d3bb2aee1d137c052a11c8303f1e966aa23b72b65b", size = 27093 }, + { url = "https://files.pythonhosted.org/packages/80/ba/f00296c5c4536967c7d1136107fdb91c48404fe769a4a6fd5ab045629af8/backports_datetime_fromisoformat-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8273fe7932db65d952a43e238318966eab9e49e8dd546550a41df12175cc2be4", size = 52836 }, + { url = "https://files.pythonhosted.org/packages/e3/92/bb1da57a069ddd601aee352a87262c7ae93467e66721d5762f59df5021a6/backports_datetime_fromisoformat-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39d57ea50aa5a524bb239688adc1d1d824c31b6094ebd39aa164d6cadb85de22", size = 52798 }, + { url = "https://files.pythonhosted.org/packages/df/ef/b6cfd355982e817ccdb8d8d109f720cab6e06f900784b034b30efa8fa832/backports_datetime_fromisoformat-2.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ac6272f87693e78209dc72e84cf9ab58052027733cd0721c55356d3c881791cf", size = 52891 }, + { url = "https://files.pythonhosted.org/packages/37/39/b13e3ae8a7c5d88b68a6e9248ffe7066534b0cfe504bf521963e61b6282d/backports_datetime_fromisoformat-2.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:44c497a71f80cd2bcfc26faae8857cf8e79388e3d5fbf79d2354b8c360547d58", size = 52955 }, + { url = "https://files.pythonhosted.org/packages/1e/e4/70cffa3ce1eb4f2ff0c0d6f5d56285aacead6bd3879b27a2ba57ab261172/backports_datetime_fromisoformat-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:6335a4c9e8af329cb1ded5ab41a666e1448116161905a94e054f205aa6d263bc", size = 29323 }, + { url = "https://files.pythonhosted.org/packages/62/f5/5bc92030deadf34c365d908d4533709341fb05d0082db318774fdf1b2bcb/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2e4b66e017253cdbe5a1de49e0eecff3f66cd72bcb1229d7db6e6b1832c0443", size = 27626 }, + { url = "https://files.pythonhosted.org/packages/28/45/5885737d51f81dfcd0911dd5c16b510b249d4c4cf6f4a991176e0358a42a/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:43e2d648e150777e13bbc2549cc960373e37bf65bd8a5d2e0cef40e16e5d8dd0", size = 34588 }, + { url = "https://files.pythonhosted.org/packages/bc/6d/bd74de70953f5dd3e768c8fc774af942af0ce9f211e7c38dd478fa7ea910/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:4ce6326fd86d5bae37813c7bf1543bae9e4c215ec6f5afe4c518be2635e2e005", size = 27162 }, + { url = "https://files.pythonhosted.org/packages/47/ba/1d14b097f13cce45b2b35db9898957578b7fcc984e79af3b35189e0d332f/backports_datetime_fromisoformat-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7c8fac333bf860208fd522a5394369ee3c790d0aa4311f515fcc4b6c5ef8d75", size = 54482 }, + { url = "https://files.pythonhosted.org/packages/25/e9/a2a7927d053b6fa148b64b5e13ca741ca254c13edca99d8251e9a8a09cfe/backports_datetime_fromisoformat-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4da5ab3aa0cc293dc0662a0c6d1da1a011dc1edcbc3122a288cfed13a0b45", size = 54362 }, + { url = "https://files.pythonhosted.org/packages/c1/99/394fb5e80131a7d58c49b89e78a61733a9994885804a0bb582416dd10c6f/backports_datetime_fromisoformat-2.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58ea11e3bf912bd0a36b0519eae2c5b560b3cb972ea756e66b73fb9be460af01", size = 54162 }, + { url = "https://files.pythonhosted.org/packages/88/25/1940369de573c752889646d70b3fe8645e77b9e17984e72a554b9b51ffc4/backports_datetime_fromisoformat-2.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8a375c7dbee4734318714a799b6c697223e4bbb57232af37fbfff88fb48a14c6", size = 54118 }, + { url = "https://files.pythonhosted.org/packages/b7/46/f275bf6c61683414acaf42b2df7286d68cfef03e98b45c168323d7707778/backports_datetime_fromisoformat-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:ac677b1664c4585c2e014739f6678137c8336815406052349c85898206ec7061", size = 29329 }, + { url = "https://files.pythonhosted.org/packages/be/03/7eaa9f9bf290395d57fd30d7f1f2f9dff60c06a31c237dc2beb477e8f899/backports_datetime_fromisoformat-2.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90e202e72a3d5aae673fcc8c9a4267d56b2f532beeb9173361293625fe4d2039", size = 28980 }, + { url = "https://files.pythonhosted.org/packages/47/80/a0ecf33446c7349e79f54cc532933780341d20cff0ee12b5bfdcaa47067e/backports_datetime_fromisoformat-2.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2df98ef1b76f5a58bb493dda552259ba60c3a37557d848e039524203951c9f06", size = 28449 }, ] [[package]] name = "beartype" version = "0.18.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/15/4e623478a9628ad4cee2391f19aba0b16c1dd6fedcb2a399f0928097b597/beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927", size = 1193506, upload-time = "2024-04-21T07:25:58.64Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/15/4e623478a9628ad4cee2391f19aba0b16c1dd6fedcb2a399f0928097b597/beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927", size = 1193506 } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/43/7a1259741bd989723272ac7d381a43be932422abcff09a1d9f7ba212cb74/beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089", size = 917762, upload-time = "2024-04-21T07:25:55.758Z" }, + { url = "https://files.pythonhosted.org/packages/64/43/7a1259741bd989723272ac7d381a43be932422abcff09a1d9f7ba212cb74/beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089", size = 917762 }, ] [[package]] name = "blinker" version = "1.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 } wheels = [ - { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 }, ] [[package]] @@ -248,53 +248,53 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/aa/0743c994884de83472c854bb534c9edab8d711e1880d4fa194e6d876bb60/blis-1.2.1.tar.gz", hash = "sha256:1066beedbedc2143c22bd28742658de05694afebacde8d8c2d14dd4b5a96765a", size = 2510297, upload-time = "2025-04-01T12:01:56.849Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/83/9f74b0f768628ddc213502446900dbe133dd2d7aa12f2b462e119ce61952/blis-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112443b90698158ada38f71e74c079c3561e802554a51e9850d487c39db25de0", size = 6973893, upload-time = "2025-04-01T12:01:03.13Z" }, - { url = "https://files.pythonhosted.org/packages/a7/47/b503681ddd77c6cabcf192c566a476b09f3dbecf10652abb3e6c1c11df0b/blis-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b9f8c4fbc303f47778d1fd47916cae785b6f3beaa2031502112a8c0aa5eb29f6", size = 1280909, upload-time = "2025-04-01T12:01:05.576Z" }, - { url = "https://files.pythonhosted.org/packages/ee/9e/7bf08ee499938b0237b206e11578e37d0086558bdc063bfff39d6bdf8247/blis-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0260ecbbaa890f11d8c88e9ce37d4fc9a91839adc34ba1763ba89424362e54c9", size = 2982233, upload-time = "2025-04-01T12:01:07.711Z" }, - { url = "https://files.pythonhosted.org/packages/c6/b3/37a90ff44d51aada91a33e9e64a35d6424ccfaac49cd5d090e2f1ac46ba2/blis-1.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b70e0693564444b608d765727ab31618de3b92c5f203b9dc6b6a108170a8cea", size = 3187098, upload-time = "2025-04-01T12:01:09.624Z" }, - { url = "https://files.pythonhosted.org/packages/30/f2/b52d4c18b116dc3feda9269e3f944defe1e9d12ec157b1ae5ec823191834/blis-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67ae48f73828cf38f65f24b6c6d8ec16f22c99820e0d13e7d97370682fdb023d", size = 11526282, upload-time = "2025-04-01T12:01:11.322Z" }, - { url = "https://files.pythonhosted.org/packages/a9/3a/3979ebe9629fe0040cc8768c9b02791bc6995aa3518ad29dcbd452b05555/blis-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9eff1af9b142fd156a7b83f513061f2e464c4409afb37080fde436e969951703", size = 3000400, upload-time = "2025-04-01T12:01:13.339Z" }, - { url = "https://files.pythonhosted.org/packages/d3/bb/c102d2583cd51d541e4785989d6025d40372661e2aa40e908d5bf073a17f/blis-1.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d05f07fd37b407edb294322d3b2991b0950a61123076cc380d3e9c3deba77c83", size = 4226030, upload-time = "2025-04-01T12:01:15.264Z" }, - { url = "https://files.pythonhosted.org/packages/6b/16/cd57b4bd0d2a207e36fd8f5625bc63541129258666f267804c661ca0e12f/blis-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8d5abc324180918a4d7ef81f31c37907d13e85f2831317cba3edacd4ef9b7d39", size = 14694442, upload-time = "2025-04-01T12:01:17.453Z" }, - { url = "https://files.pythonhosted.org/packages/84/50/fd53ebc7eb911f1db0e802b35d1247b44df1cfdad550eea565dba74c0eb4/blis-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:8de9a1e536202064b57c60d09ff0886275b50c5878df6d58fb49c731eaf535a7", size = 6249165, upload-time = "2025-04-01T12:01:19.535Z" }, - { url = "https://files.pythonhosted.org/packages/67/57/ae6596b1e27859886e0b81fb99497bcfff139895585a9e2284681c8a8846/blis-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:778c4f72b71f97187e3304acfbd30eab98c9ba1a5b03b65128bc3875400ae604", size = 6976808, upload-time = "2025-04-01T12:01:21.175Z" }, - { url = "https://files.pythonhosted.org/packages/ce/35/6225e6ad2bccf23ac124448d59112c098d63a8917462e9f73967bc217168/blis-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c5f2ffb0ae9c1f5aaa95b9681bcdd9a777d007c501fa220796329b939ca2790", size = 1281913, upload-time = "2025-04-01T12:01:23.202Z" }, - { url = "https://files.pythonhosted.org/packages/7a/84/c6a6d1c0a8a00799d2ec5db05d676bd9a9b0472cac4d3eff2e2fd1953521/blis-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4dc5d2d57106bb411633603a5c7d178a0845267c3efc7e5ea4fa7a44772976", size = 3104139, upload-time = "2025-04-01T12:01:24.781Z" }, - { url = "https://files.pythonhosted.org/packages/a5/6c/c5fab7ed1fe6e8bdcda732017400d1adc53db5b6dd2c2a6046acab91f4fa/blis-1.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c621271c2843101927407e052b35a67f853da59d5c74e9e070e982c7f82e2e04", size = 3304143, upload-time = "2025-04-01T12:01:27.363Z" }, - { url = "https://files.pythonhosted.org/packages/22/d1/85f03269886253758546fcfdbeddee7e717d843ea134596b60db9c2648c4/blis-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43f65f882250b817566d7543abd1f6da297f1662e5dd9936e14c04b88285a497", size = 11660080, upload-time = "2025-04-01T12:01:29.478Z" }, - { url = "https://files.pythonhosted.org/packages/78/c8/c81ed3036e8ce0d6ce0d19a032c7f3d69247f221c5357e18548dea9380d3/blis-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78a0613d559ccc426c101c67e8f84e1f93491e29d722c370872c538ee652bd07", size = 3133133, upload-time = "2025-04-01T12:01:31.537Z" }, - { url = "https://files.pythonhosted.org/packages/b8/42/7c296e04b979204777ecae2fe9287ac7b0255d8c4c2111d2a735c439b9d7/blis-1.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2f5e32e5e5635fc7087b724b53120dbcd86201f56c0405882ce254bc0e493392", size = 4360695, upload-time = "2025-04-01T12:01:33.449Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ab/aa5c8dfd0068d2cc976830797dd092779259860f964286db05739154e3a7/blis-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d339c97cc83f53e39c1013d0dcd7d5278c853dc102d931132eeb05b226e28429", size = 14828081, upload-time = "2025-04-01T12:01:35.129Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c0/047fef3ac4a531903c52ba7c108fd608556627723bfef7554f040b10e556/blis-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:8d284323cc994e9b818c32046f1aa3e57bcc41c74e02daebdf0d3bc3e14355cb", size = 6232639, upload-time = "2025-04-01T12:01:37.268Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/61/aa/0743c994884de83472c854bb534c9edab8d711e1880d4fa194e6d876bb60/blis-1.2.1.tar.gz", hash = "sha256:1066beedbedc2143c22bd28742658de05694afebacde8d8c2d14dd4b5a96765a", size = 2510297 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/83/9f74b0f768628ddc213502446900dbe133dd2d7aa12f2b462e119ce61952/blis-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112443b90698158ada38f71e74c079c3561e802554a51e9850d487c39db25de0", size = 6973893 }, + { url = "https://files.pythonhosted.org/packages/a7/47/b503681ddd77c6cabcf192c566a476b09f3dbecf10652abb3e6c1c11df0b/blis-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b9f8c4fbc303f47778d1fd47916cae785b6f3beaa2031502112a8c0aa5eb29f6", size = 1280909 }, + { url = "https://files.pythonhosted.org/packages/ee/9e/7bf08ee499938b0237b206e11578e37d0086558bdc063bfff39d6bdf8247/blis-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0260ecbbaa890f11d8c88e9ce37d4fc9a91839adc34ba1763ba89424362e54c9", size = 2982233 }, + { url = "https://files.pythonhosted.org/packages/c6/b3/37a90ff44d51aada91a33e9e64a35d6424ccfaac49cd5d090e2f1ac46ba2/blis-1.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b70e0693564444b608d765727ab31618de3b92c5f203b9dc6b6a108170a8cea", size = 3187098 }, + { url = "https://files.pythonhosted.org/packages/30/f2/b52d4c18b116dc3feda9269e3f944defe1e9d12ec157b1ae5ec823191834/blis-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67ae48f73828cf38f65f24b6c6d8ec16f22c99820e0d13e7d97370682fdb023d", size = 11526282 }, + { url = "https://files.pythonhosted.org/packages/a9/3a/3979ebe9629fe0040cc8768c9b02791bc6995aa3518ad29dcbd452b05555/blis-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9eff1af9b142fd156a7b83f513061f2e464c4409afb37080fde436e969951703", size = 3000400 }, + { url = "https://files.pythonhosted.org/packages/d3/bb/c102d2583cd51d541e4785989d6025d40372661e2aa40e908d5bf073a17f/blis-1.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:d05f07fd37b407edb294322d3b2991b0950a61123076cc380d3e9c3deba77c83", size = 4226030 }, + { url = "https://files.pythonhosted.org/packages/6b/16/cd57b4bd0d2a207e36fd8f5625bc63541129258666f267804c661ca0e12f/blis-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8d5abc324180918a4d7ef81f31c37907d13e85f2831317cba3edacd4ef9b7d39", size = 14694442 }, + { url = "https://files.pythonhosted.org/packages/84/50/fd53ebc7eb911f1db0e802b35d1247b44df1cfdad550eea565dba74c0eb4/blis-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:8de9a1e536202064b57c60d09ff0886275b50c5878df6d58fb49c731eaf535a7", size = 6249165 }, + { url = "https://files.pythonhosted.org/packages/67/57/ae6596b1e27859886e0b81fb99497bcfff139895585a9e2284681c8a8846/blis-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:778c4f72b71f97187e3304acfbd30eab98c9ba1a5b03b65128bc3875400ae604", size = 6976808 }, + { url = "https://files.pythonhosted.org/packages/ce/35/6225e6ad2bccf23ac124448d59112c098d63a8917462e9f73967bc217168/blis-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c5f2ffb0ae9c1f5aaa95b9681bcdd9a777d007c501fa220796329b939ca2790", size = 1281913 }, + { url = "https://files.pythonhosted.org/packages/7a/84/c6a6d1c0a8a00799d2ec5db05d676bd9a9b0472cac4d3eff2e2fd1953521/blis-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4dc5d2d57106bb411633603a5c7d178a0845267c3efc7e5ea4fa7a44772976", size = 3104139 }, + { url = "https://files.pythonhosted.org/packages/a5/6c/c5fab7ed1fe6e8bdcda732017400d1adc53db5b6dd2c2a6046acab91f4fa/blis-1.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c621271c2843101927407e052b35a67f853da59d5c74e9e070e982c7f82e2e04", size = 3304143 }, + { url = "https://files.pythonhosted.org/packages/22/d1/85f03269886253758546fcfdbeddee7e717d843ea134596b60db9c2648c4/blis-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43f65f882250b817566d7543abd1f6da297f1662e5dd9936e14c04b88285a497", size = 11660080 }, + { url = "https://files.pythonhosted.org/packages/78/c8/c81ed3036e8ce0d6ce0d19a032c7f3d69247f221c5357e18548dea9380d3/blis-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78a0613d559ccc426c101c67e8f84e1f93491e29d722c370872c538ee652bd07", size = 3133133 }, + { url = "https://files.pythonhosted.org/packages/b8/42/7c296e04b979204777ecae2fe9287ac7b0255d8c4c2111d2a735c439b9d7/blis-1.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2f5e32e5e5635fc7087b724b53120dbcd86201f56c0405882ce254bc0e493392", size = 4360695 }, + { url = "https://files.pythonhosted.org/packages/0c/ab/aa5c8dfd0068d2cc976830797dd092779259860f964286db05739154e3a7/blis-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d339c97cc83f53e39c1013d0dcd7d5278c853dc102d931132eeb05b226e28429", size = 14828081 }, + { url = "https://files.pythonhosted.org/packages/7c/c0/047fef3ac4a531903c52ba7c108fd608556627723bfef7554f040b10e556/blis-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:8d284323cc994e9b818c32046f1aa3e57bcc41c74e02daebdf0d3bc3e14355cb", size = 6232639 }, ] [[package]] name = "cachetools" version = "5.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload-time = "2025-02-20T21:01:19.524Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 }, ] [[package]] name = "catalogue" version = "2.0.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/b4/244d58127e1cdf04cf2dc7d9566f0d24ef01d5ce21811bab088ecc62b5ea/catalogue-2.0.10.tar.gz", hash = "sha256:4f56daa940913d3f09d589c191c74e5a6d51762b3a9e37dd53b7437afd6cda15", size = 19561, upload-time = "2023-09-25T06:29:24.962Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/b4/244d58127e1cdf04cf2dc7d9566f0d24ef01d5ce21811bab088ecc62b5ea/catalogue-2.0.10.tar.gz", hash = "sha256:4f56daa940913d3f09d589c191c74e5a6d51762b3a9e37dd53b7437afd6cda15", size = 19561 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/96/d32b941a501ab566a16358d68b6eb4e4acc373fab3c3c4d7d9e649f7b4bb/catalogue-2.0.10-py3-none-any.whl", hash = "sha256:58c2de0020aa90f4a2da7dfad161bf7b3b054c86a5f09fcedc0b2b740c109a9f", size = 17325, upload-time = "2023-09-25T06:29:23.337Z" }, + { url = "https://files.pythonhosted.org/packages/9e/96/d32b941a501ab566a16358d68b6eb4e4acc373fab3c3c4d7d9e649f7b4bb/catalogue-2.0.10-py3-none-any.whl", hash = "sha256:58c2de0020aa90f4a2da7dfad161bf7b3b054c86a5f09fcedc0b2b740c109a9f", size = 17325 }, ] [[package]] name = "certifi" version = "2025.7.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981, upload-time = "2025-07-14T03:29:28.449Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722, upload-time = "2025-07-14T03:29:26.863Z" }, + { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722 }, ] [[package]] @@ -304,67 +304,67 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, ] [[package]] name = "charset-normalizer" version = "3.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818, upload-time = "2025-05-02T08:31:46.725Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649, upload-time = "2025-05-02T08:31:48.889Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045, upload-time = "2025-05-02T08:31:50.757Z" }, - { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356, upload-time = "2025-05-02T08:31:52.634Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471, upload-time = "2025-05-02T08:31:56.207Z" }, - { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317, upload-time = "2025-05-02T08:31:57.613Z" }, - { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368, upload-time = "2025-05-02T08:31:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491, upload-time = "2025-05-02T08:32:01.219Z" }, - { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695, upload-time = "2025-05-02T08:32:03.045Z" }, - { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849, upload-time = "2025-05-02T08:32:04.651Z" }, - { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091, upload-time = "2025-05-02T08:32:06.719Z" }, - { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445, upload-time = "2025-05-02T08:32:08.66Z" }, - { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782, upload-time = "2025-05-02T08:32:10.46Z" }, - { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, - { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, - { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, - { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, - { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, - { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, - { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, - { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, - { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/28/9901804da60055b406e1a1c5ba7aac1276fb77f1dde635aabfc7fd84b8ab/charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", size = 201818 }, + { url = "https://files.pythonhosted.org/packages/d9/9b/892a8c8af9110935e5adcbb06d9c6fe741b6bb02608c6513983048ba1a18/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", size = 144649 }, + { url = "https://files.pythonhosted.org/packages/7b/a5/4179abd063ff6414223575e008593861d62abfc22455b5d1a44995b7c101/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", size = 155045 }, + { url = "https://files.pythonhosted.org/packages/3b/95/bc08c7dfeddd26b4be8c8287b9bb055716f31077c8b0ea1cd09553794665/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", size = 147356 }, + { url = "https://files.pythonhosted.org/packages/a8/2d/7a5b635aa65284bf3eab7653e8b4151ab420ecbae918d3e359d1947b4d61/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", size = 149471 }, + { url = "https://files.pythonhosted.org/packages/ae/38/51fc6ac74251fd331a8cfdb7ec57beba8c23fd5493f1050f71c87ef77ed0/charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", size = 151317 }, + { url = "https://files.pythonhosted.org/packages/b7/17/edee1e32215ee6e9e46c3e482645b46575a44a2d72c7dfd49e49f60ce6bf/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", size = 146368 }, + { url = "https://files.pythonhosted.org/packages/26/2c/ea3e66f2b5f21fd00b2825c94cafb8c326ea6240cd80a91eb09e4a285830/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", size = 154491 }, + { url = "https://files.pythonhosted.org/packages/52/47/7be7fa972422ad062e909fd62460d45c3ef4c141805b7078dbab15904ff7/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", size = 157695 }, + { url = "https://files.pythonhosted.org/packages/2f/42/9f02c194da282b2b340f28e5fb60762de1151387a36842a92b533685c61e/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", size = 154849 }, + { url = "https://files.pythonhosted.org/packages/67/44/89cacd6628f31fb0b63201a618049be4be2a7435a31b55b5eb1c3674547a/charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", size = 150091 }, + { url = "https://files.pythonhosted.org/packages/1f/79/4b8da9f712bc079c0f16b6d67b099b0b8d808c2292c937f267d816ec5ecc/charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", size = 98445 }, + { url = "https://files.pythonhosted.org/packages/7d/d7/96970afb4fb66497a40761cdf7bd4f6fca0fc7bafde3a84f836c1f57a926/charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", size = 105782 }, + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794 }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846 }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350 }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657 }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260 }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164 }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571 }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952 }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959 }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030 }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015 }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106 }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402 }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, ] [[package]] @@ -374,9 +374,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593, upload-time = "2024-12-21T18:38:44.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188, upload-time = "2024-12-21T18:38:41.666Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, ] [[package]] @@ -386,27 +386,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/15/ae3256348834b92b9594d73eb7230538bae2bf726c2d721b920a668017c5/cloudpathlib-0.21.1.tar.gz", hash = "sha256:f26a855abf34d98f267aafd15efdb2db3c9665913dbabe5fad079df92837a431", size = 45295, upload-time = "2025-05-15T02:32:05.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/15/ae3256348834b92b9594d73eb7230538bae2bf726c2d721b920a668017c5/cloudpathlib-0.21.1.tar.gz", hash = "sha256:f26a855abf34d98f267aafd15efdb2db3c9665913dbabe5fad079df92837a431", size = 45295 } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/e7/6fea57b887f8e367c1e4a496ba03bfaf57824b766f777723ce1faf28834b/cloudpathlib-0.21.1-py3-none-any.whl", hash = "sha256:bfe580ad72ec030472ec233cd7380701b2d3227da7b2898387bd170aa70c803c", size = 52776, upload-time = "2025-05-15T02:32:03.99Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/6fea57b887f8e367c1e4a496ba03bfaf57824b766f777723ce1faf28834b/cloudpathlib-0.21.1-py3-none-any.whl", hash = "sha256:bfe580ad72ec030472ec233cd7380701b2d3227da7b2898387bd170aa70c803c", size = 52776 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } 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" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319 } 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" }, + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294 }, ] [[package]] @@ -417,9 +417,9 @@ dependencies = [ { name = "pydantic" }, { name = "srsly" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/51/d3/57c6631159a1b48d273b40865c315cf51f89df7a9d1101094ef12e3a37c2/confection-0.1.5.tar.gz", hash = "sha256:8e72dd3ca6bd4f48913cd220f10b8275978e740411654b6e8ca6d7008c590f0e", size = 38924, upload-time = "2024-05-31T16:17:01.559Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/d3/57c6631159a1b48d273b40865c315cf51f89df7a9d1101094ef12e3a37c2/confection-0.1.5.tar.gz", hash = "sha256:8e72dd3ca6bd4f48913cd220f10b8275978e740411654b6e8ca6d7008c590f0e", size = 38924 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/00/3106b1854b45bd0474ced037dfe6b73b90fe68a68968cef47c23de3d43d2/confection-0.1.5-py3-none-any.whl", hash = "sha256:e29d3c3f8eac06b3f77eb9dfb4bf2fc6bcc9622a98ca00a698e3d019c6430b14", size = 35451, upload-time = "2024-05-31T16:16:59.075Z" }, + { url = "https://files.pythonhosted.org/packages/0c/00/3106b1854b45bd0474ced037dfe6b73b90fe68a68968cef47c23de3d43d2/confection-0.1.5-py3-none-any.whl", hash = "sha256:e29d3c3f8eac06b3f77eb9dfb4bf2fc6bcc9622a98ca00a698e3d019c6430b14", size = 35451 }, ] [[package]] @@ -432,34 +432,34 @@ resolution-markers = [ dependencies = [ { name = "numpy", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, - { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, - { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, - { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, - { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, - { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, - { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, - { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, - { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, - { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, - { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, - { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, - { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, - { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, - { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, - { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, - { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, - { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551 }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399 }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061 }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956 }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872 }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027 }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641 }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075 }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534 }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188 }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636 }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636 }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053 }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985 }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750 }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246 }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728 }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762 }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196 }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017 }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681 }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101 }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599 }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807 }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729 }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791 }, ] [[package]] @@ -472,24 +472,24 @@ resolution-markers = [ dependencies = [ { name = "numpy", marker = "python_full_version >= '3.11'" }, ] -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" } +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174 } 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/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" }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677 }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234 }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123 }, + { 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 }, + { 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 }, + { 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 }, + { 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 }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315 }, ] [[package]] @@ -499,101 +499,101 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/1e/49527ac611af559665f71cbb8f92b332b5ec9c6fbc4e88b0f8e92f5e85df/cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a", size = 744903, upload-time = "2025-07-02T13:06:25.941Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/fb/09e28bc0c46d2c547085e60897fea96310574c70fb21cd58a730a45f3403/cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8", size = 7043092, upload-time = "2025-07-02T13:05:01.514Z" }, - { url = "https://files.pythonhosted.org/packages/b1/05/2194432935e29b91fb649f6149c1a4f9e6d3d9fc880919f4ad1bcc22641e/cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d", size = 4205926, upload-time = "2025-07-02T13:05:04.741Z" }, - { url = "https://files.pythonhosted.org/packages/07/8b/9ef5da82350175e32de245646b1884fc01124f53eb31164c77f95a08d682/cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5", size = 4429235, upload-time = "2025-07-02T13:05:07.084Z" }, - { url = "https://files.pythonhosted.org/packages/7c/e1/c809f398adde1994ee53438912192d92a1d0fc0f2d7582659d9ef4c28b0c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57", size = 4209785, upload-time = "2025-07-02T13:05:09.321Z" }, - { url = "https://files.pythonhosted.org/packages/d0/8b/07eb6bd5acff58406c5e806eff34a124936f41a4fb52909ffa4d00815f8c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0", size = 3893050, upload-time = "2025-07-02T13:05:11.069Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ef/3333295ed58d900a13c92806b67e62f27876845a9a908c939f040887cca9/cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d", size = 4457379, upload-time = "2025-07-02T13:05:13.32Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9d/44080674dee514dbb82b21d6fa5d1055368f208304e2ab1828d85c9de8f4/cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9", size = 4209355, upload-time = "2025-07-02T13:05:15.017Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d8/0749f7d39f53f8258e5c18a93131919ac465ee1f9dccaf1b3f420235e0b5/cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27", size = 4456087, upload-time = "2025-07-02T13:05:16.945Z" }, - { url = "https://files.pythonhosted.org/packages/09/d7/92acac187387bf08902b0bf0699816f08553927bdd6ba3654da0010289b4/cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e", size = 4332873, upload-time = "2025-07-02T13:05:18.743Z" }, - { url = "https://files.pythonhosted.org/packages/03/c2/840e0710da5106a7c3d4153c7215b2736151bba60bf4491bdb421df5056d/cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174", size = 4564651, upload-time = "2025-07-02T13:05:21.382Z" }, - { url = "https://files.pythonhosted.org/packages/2e/92/cc723dd6d71e9747a887b94eb3827825c6c24b9e6ce2bb33b847d31d5eaa/cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9", size = 2929050, upload-time = "2025-07-02T13:05:23.39Z" }, - { url = "https://files.pythonhosted.org/packages/1f/10/197da38a5911a48dd5389c043de4aec4b3c94cb836299b01253940788d78/cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63", size = 3403224, upload-time = "2025-07-02T13:05:25.202Z" }, - { url = "https://files.pythonhosted.org/packages/fe/2b/160ce8c2765e7a481ce57d55eba1546148583e7b6f85514472b1d151711d/cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8", size = 7017143, upload-time = "2025-07-02T13:05:27.229Z" }, - { url = "https://files.pythonhosted.org/packages/c2/e7/2187be2f871c0221a81f55ee3105d3cf3e273c0a0853651d7011eada0d7e/cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd", size = 4197780, upload-time = "2025-07-02T13:05:29.299Z" }, - { url = "https://files.pythonhosted.org/packages/b9/cf/84210c447c06104e6be9122661159ad4ce7a8190011669afceeaea150524/cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e", size = 4420091, upload-time = "2025-07-02T13:05:31.221Z" }, - { url = "https://files.pythonhosted.org/packages/3e/6a/cb8b5c8bb82fafffa23aeff8d3a39822593cee6e2f16c5ca5c2ecca344f7/cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0", size = 4198711, upload-time = "2025-07-02T13:05:33.062Z" }, - { url = "https://files.pythonhosted.org/packages/04/f7/36d2d69df69c94cbb2473871926daf0f01ad8e00fe3986ac3c1e8c4ca4b3/cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135", size = 3883299, upload-time = "2025-07-02T13:05:34.94Z" }, - { url = "https://files.pythonhosted.org/packages/82/c7/f0ea40f016de72f81288e9fe8d1f6748036cb5ba6118774317a3ffc6022d/cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7", size = 4450558, upload-time = "2025-07-02T13:05:37.288Z" }, - { url = "https://files.pythonhosted.org/packages/06/ae/94b504dc1a3cdf642d710407c62e86296f7da9e66f27ab12a1ee6fdf005b/cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42", size = 4198020, upload-time = "2025-07-02T13:05:39.102Z" }, - { url = "https://files.pythonhosted.org/packages/05/2b/aaf0adb845d5dabb43480f18f7ca72e94f92c280aa983ddbd0bcd6ecd037/cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492", size = 4449759, upload-time = "2025-07-02T13:05:41.398Z" }, - { url = "https://files.pythonhosted.org/packages/91/e4/f17e02066de63e0100a3a01b56f8f1016973a1d67551beaf585157a86b3f/cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0", size = 4319991, upload-time = "2025-07-02T13:05:43.64Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2e/e2dbd629481b499b14516eed933f3276eb3239f7cee2dcfa4ee6b44d4711/cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a", size = 4554189, upload-time = "2025-07-02T13:05:46.045Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ea/a78a0c38f4c8736287b71c2ea3799d173d5ce778c7d6e3c163a95a05ad2a/cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f", size = 2911769, upload-time = "2025-07-02T13:05:48.329Z" }, - { url = "https://files.pythonhosted.org/packages/79/b3/28ac139109d9005ad3f6b6f8976ffede6706a6478e21c889ce36c840918e/cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97", size = 3390016, upload-time = "2025-07-02T13:05:50.811Z" }, - { url = "https://files.pythonhosted.org/packages/f8/8b/34394337abe4566848a2bd49b26bcd4b07fd466afd3e8cce4cb79a390869/cryptography-45.0.5-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:206210d03c1193f4e1ff681d22885181d47efa1ab3018766a7b32a7b3d6e6afd", size = 3575762, upload-time = "2025-07-02T13:05:53.166Z" }, - { url = "https://files.pythonhosted.org/packages/8b/5d/a19441c1e89afb0f173ac13178606ca6fab0d3bd3ebc29e9ed1318b507fc/cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c648025b6840fe62e57107e0a25f604db740e728bd67da4f6f060f03017d5097", size = 4140906, upload-time = "2025-07-02T13:05:55.914Z" }, - { url = "https://files.pythonhosted.org/packages/4b/db/daceb259982a3c2da4e619f45b5bfdec0e922a23de213b2636e78ef0919b/cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b8fa8b0a35a9982a3c60ec79905ba5bb090fc0b9addcfd3dc2dd04267e45f25e", size = 4374411, upload-time = "2025-07-02T13:05:57.814Z" }, - { url = "https://files.pythonhosted.org/packages/6a/35/5d06ad06402fc522c8bf7eab73422d05e789b4e38fe3206a85e3d6966c11/cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:14d96584701a887763384f3c47f0ca7c1cce322aa1c31172680eb596b890ec30", size = 4140942, upload-time = "2025-07-02T13:06:00.137Z" }, - { url = "https://files.pythonhosted.org/packages/65/79/020a5413347e44c382ef1f7f7e7a66817cd6273e3e6b5a72d18177b08b2f/cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57c816dfbd1659a367831baca4b775b2a5b43c003daf52e9d57e1d30bc2e1b0e", size = 4374079, upload-time = "2025-07-02T13:06:02.043Z" }, - { url = "https://files.pythonhosted.org/packages/9b/c5/c0e07d84a9a2a8a0ed4f865e58f37c71af3eab7d5e094ff1b21f3f3af3bc/cryptography-45.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b9e38e0a83cd51e07f5a48ff9691cae95a79bea28fe4ded168a8e5c6c77e819d", size = 3321362, upload-time = "2025-07-02T13:06:04.463Z" }, - { url = "https://files.pythonhosted.org/packages/c0/71/9bdbcfd58d6ff5084687fe722c58ac718ebedbc98b9f8f93781354e6d286/cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e", size = 3587878, upload-time = "2025-07-02T13:06:06.339Z" }, - { url = "https://files.pythonhosted.org/packages/f0/63/83516cfb87f4a8756eaa4203f93b283fda23d210fc14e1e594bd5f20edb6/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6", size = 4152447, upload-time = "2025-07-02T13:06:08.345Z" }, - { url = "https://files.pythonhosted.org/packages/22/11/d2823d2a5a0bd5802b3565437add16f5c8ce1f0778bf3822f89ad2740a38/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18", size = 4386778, upload-time = "2025-07-02T13:06:10.263Z" }, - { url = "https://files.pythonhosted.org/packages/5f/38/6bf177ca6bce4fe14704ab3e93627c5b0ca05242261a2e43ef3168472540/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463", size = 4151627, upload-time = "2025-07-02T13:06:13.097Z" }, - { url = "https://files.pythonhosted.org/packages/38/6a/69fc67e5266bff68a91bcb81dff8fb0aba4d79a78521a08812048913e16f/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1", size = 4385593, upload-time = "2025-07-02T13:06:15.689Z" }, - { url = "https://files.pythonhosted.org/packages/f6/34/31a1604c9a9ade0fdab61eb48570e09a796f4d9836121266447b0eaf7feb/cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f", size = 3331106, upload-time = "2025-07-02T13:06:18.058Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/95/1e/49527ac611af559665f71cbb8f92b332b5ec9c6fbc4e88b0f8e92f5e85df/cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a", size = 744903 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/fb/09e28bc0c46d2c547085e60897fea96310574c70fb21cd58a730a45f3403/cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8", size = 7043092 }, + { url = "https://files.pythonhosted.org/packages/b1/05/2194432935e29b91fb649f6149c1a4f9e6d3d9fc880919f4ad1bcc22641e/cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d", size = 4205926 }, + { url = "https://files.pythonhosted.org/packages/07/8b/9ef5da82350175e32de245646b1884fc01124f53eb31164c77f95a08d682/cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5", size = 4429235 }, + { url = "https://files.pythonhosted.org/packages/7c/e1/c809f398adde1994ee53438912192d92a1d0fc0f2d7582659d9ef4c28b0c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57", size = 4209785 }, + { url = "https://files.pythonhosted.org/packages/d0/8b/07eb6bd5acff58406c5e806eff34a124936f41a4fb52909ffa4d00815f8c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0", size = 3893050 }, + { url = "https://files.pythonhosted.org/packages/ec/ef/3333295ed58d900a13c92806b67e62f27876845a9a908c939f040887cca9/cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d", size = 4457379 }, + { url = "https://files.pythonhosted.org/packages/d9/9d/44080674dee514dbb82b21d6fa5d1055368f208304e2ab1828d85c9de8f4/cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9", size = 4209355 }, + { url = "https://files.pythonhosted.org/packages/c9/d8/0749f7d39f53f8258e5c18a93131919ac465ee1f9dccaf1b3f420235e0b5/cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27", size = 4456087 }, + { url = "https://files.pythonhosted.org/packages/09/d7/92acac187387bf08902b0bf0699816f08553927bdd6ba3654da0010289b4/cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e", size = 4332873 }, + { url = "https://files.pythonhosted.org/packages/03/c2/840e0710da5106a7c3d4153c7215b2736151bba60bf4491bdb421df5056d/cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174", size = 4564651 }, + { url = "https://files.pythonhosted.org/packages/2e/92/cc723dd6d71e9747a887b94eb3827825c6c24b9e6ce2bb33b847d31d5eaa/cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9", size = 2929050 }, + { url = "https://files.pythonhosted.org/packages/1f/10/197da38a5911a48dd5389c043de4aec4b3c94cb836299b01253940788d78/cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63", size = 3403224 }, + { url = "https://files.pythonhosted.org/packages/fe/2b/160ce8c2765e7a481ce57d55eba1546148583e7b6f85514472b1d151711d/cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8", size = 7017143 }, + { url = "https://files.pythonhosted.org/packages/c2/e7/2187be2f871c0221a81f55ee3105d3cf3e273c0a0853651d7011eada0d7e/cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd", size = 4197780 }, + { url = "https://files.pythonhosted.org/packages/b9/cf/84210c447c06104e6be9122661159ad4ce7a8190011669afceeaea150524/cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e", size = 4420091 }, + { url = "https://files.pythonhosted.org/packages/3e/6a/cb8b5c8bb82fafffa23aeff8d3a39822593cee6e2f16c5ca5c2ecca344f7/cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0", size = 4198711 }, + { url = "https://files.pythonhosted.org/packages/04/f7/36d2d69df69c94cbb2473871926daf0f01ad8e00fe3986ac3c1e8c4ca4b3/cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135", size = 3883299 }, + { url = "https://files.pythonhosted.org/packages/82/c7/f0ea40f016de72f81288e9fe8d1f6748036cb5ba6118774317a3ffc6022d/cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7", size = 4450558 }, + { url = "https://files.pythonhosted.org/packages/06/ae/94b504dc1a3cdf642d710407c62e86296f7da9e66f27ab12a1ee6fdf005b/cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42", size = 4198020 }, + { url = "https://files.pythonhosted.org/packages/05/2b/aaf0adb845d5dabb43480f18f7ca72e94f92c280aa983ddbd0bcd6ecd037/cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492", size = 4449759 }, + { url = "https://files.pythonhosted.org/packages/91/e4/f17e02066de63e0100a3a01b56f8f1016973a1d67551beaf585157a86b3f/cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0", size = 4319991 }, + { url = "https://files.pythonhosted.org/packages/f2/2e/e2dbd629481b499b14516eed933f3276eb3239f7cee2dcfa4ee6b44d4711/cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a", size = 4554189 }, + { url = "https://files.pythonhosted.org/packages/f8/ea/a78a0c38f4c8736287b71c2ea3799d173d5ce778c7d6e3c163a95a05ad2a/cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f", size = 2911769 }, + { url = "https://files.pythonhosted.org/packages/79/b3/28ac139109d9005ad3f6b6f8976ffede6706a6478e21c889ce36c840918e/cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97", size = 3390016 }, + { url = "https://files.pythonhosted.org/packages/f8/8b/34394337abe4566848a2bd49b26bcd4b07fd466afd3e8cce4cb79a390869/cryptography-45.0.5-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:206210d03c1193f4e1ff681d22885181d47efa1ab3018766a7b32a7b3d6e6afd", size = 3575762 }, + { url = "https://files.pythonhosted.org/packages/8b/5d/a19441c1e89afb0f173ac13178606ca6fab0d3bd3ebc29e9ed1318b507fc/cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c648025b6840fe62e57107e0a25f604db740e728bd67da4f6f060f03017d5097", size = 4140906 }, + { url = "https://files.pythonhosted.org/packages/4b/db/daceb259982a3c2da4e619f45b5bfdec0e922a23de213b2636e78ef0919b/cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b8fa8b0a35a9982a3c60ec79905ba5bb090fc0b9addcfd3dc2dd04267e45f25e", size = 4374411 }, + { url = "https://files.pythonhosted.org/packages/6a/35/5d06ad06402fc522c8bf7eab73422d05e789b4e38fe3206a85e3d6966c11/cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:14d96584701a887763384f3c47f0ca7c1cce322aa1c31172680eb596b890ec30", size = 4140942 }, + { url = "https://files.pythonhosted.org/packages/65/79/020a5413347e44c382ef1f7f7e7a66817cd6273e3e6b5a72d18177b08b2f/cryptography-45.0.5-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:57c816dfbd1659a367831baca4b775b2a5b43c003daf52e9d57e1d30bc2e1b0e", size = 4374079 }, + { url = "https://files.pythonhosted.org/packages/9b/c5/c0e07d84a9a2a8a0ed4f865e58f37c71af3eab7d5e094ff1b21f3f3af3bc/cryptography-45.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b9e38e0a83cd51e07f5a48ff9691cae95a79bea28fe4ded168a8e5c6c77e819d", size = 3321362 }, + { url = "https://files.pythonhosted.org/packages/c0/71/9bdbcfd58d6ff5084687fe722c58ac718ebedbc98b9f8f93781354e6d286/cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e", size = 3587878 }, + { url = "https://files.pythonhosted.org/packages/f0/63/83516cfb87f4a8756eaa4203f93b283fda23d210fc14e1e594bd5f20edb6/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6", size = 4152447 }, + { url = "https://files.pythonhosted.org/packages/22/11/d2823d2a5a0bd5802b3565437add16f5c8ce1f0778bf3822f89ad2740a38/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18", size = 4386778 }, + { url = "https://files.pythonhosted.org/packages/5f/38/6bf177ca6bce4fe14704ab3e93627c5b0ca05242261a2e43ef3168472540/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463", size = 4151627 }, + { url = "https://files.pythonhosted.org/packages/38/6a/69fc67e5266bff68a91bcb81dff8fb0aba4d79a78521a08812048913e16f/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1", size = 4385593 }, + { url = "https://files.pythonhosted.org/packages/f6/34/31a1604c9a9ade0fdab61eb48570e09a796f4d9836121266447b0eaf7feb/cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f", size = 3331106 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } 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" }, + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, ] [[package]] name = "cymem" version = "2.0.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/4a/1acd761fb6ac4c560e823ce40536a62f886f2d59b2763b5c3fc7e9d92101/cymem-2.0.11.tar.gz", hash = "sha256:efe49a349d4a518be6b6c6b255d4a80f740a341544bde1a807707c058b88d0bd", size = 10346, upload-time = "2025-01-16T21:50:41.045Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4a/1acd761fb6ac4c560e823ce40536a62f886f2d59b2763b5c3fc7e9d92101/cymem-2.0.11.tar.gz", hash = "sha256:efe49a349d4a518be6b6c6b255d4a80f740a341544bde1a807707c058b88d0bd", size = 10346 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/55/f453f2b2f560e057f20eb2acdaafbf6488d72a6e8a36a4aef30f6053a51c/cymem-2.0.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1b4dd8f8c2475c7c9948eefa89c790d83134600858d8d43b90276efd8df3882e", size = 41886, upload-time = "2025-01-16T21:49:17.183Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9d/03299eff35bd4fd80db33e4fd516661b82bb7b898cb677829acf22391ede/cymem-2.0.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d46ba0d2e0f749195297d16f2286b55af7d7c084db2b853fdfccece2c000c5dc", size = 41696, upload-time = "2025-01-16T21:49:18.788Z" }, - { url = "https://files.pythonhosted.org/packages/d3/0c/90aa41f258a67ea210886c5c73f88dc9f120b7a20e6b5d92c5ce73a68276/cymem-2.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739c4336b9d04ce9761851e9260ef77508d4a86ee3060e41302bfb6fa82c37de", size = 203719, upload-time = "2025-01-16T21:49:23.13Z" }, - { url = "https://files.pythonhosted.org/packages/52/d1/dc4a72aa2049c34a53a220290b1a59fadae61929dff3a6e1a830a22971fe/cymem-2.0.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a69c470c2fb118161f49761f9137384f46723c77078b659bba33858e19e46b49", size = 204763, upload-time = "2025-01-16T21:49:26.164Z" }, - { url = "https://files.pythonhosted.org/packages/69/51/86ed323585530558bcdda1324c570abe032db2c1d5afd1c5e8e3e8fde63a/cymem-2.0.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:40159f6c92627438de970fd761916e745d70dfd84a7dcc28c1627eb49cee00d8", size = 193964, upload-time = "2025-01-16T21:49:28.057Z" }, - { url = "https://files.pythonhosted.org/packages/ed/0c/aee4ad2996a4e24342228ccf44d7835c7784042f0ee0c47ad33be1443f18/cymem-2.0.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f503f98e6aa333fffbe657a6854f13a9c3de68860795ae21171284213b9c5c09", size = 195002, upload-time = "2025-01-16T21:49:31.329Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d5/eda823d639258d2ed1db83403c991a9a57d5a4ddea3bf08e59060809a9aa/cymem-2.0.11-cp310-cp310-win_amd64.whl", hash = "sha256:7f05ed5920cc92d6b958ec5da55bd820d326fe9332b90660e6fa67e3b476ceb1", size = 39079, upload-time = "2025-01-16T21:49:33.777Z" }, - { url = "https://files.pythonhosted.org/packages/03/e3/d98e3976f4ffa99cddebc1ce379d4d62e3eb1da22285267f902c99cc3395/cymem-2.0.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3ee54039aad3ef65de82d66c40516bf54586287b46d32c91ea0530c34e8a2745", size = 42005, upload-time = "2025-01-16T21:49:34.977Z" }, - { url = "https://files.pythonhosted.org/packages/41/b4/7546faf2ab63e59befc95972316d62276cec153f7d4d60e7b0d5e08f0602/cymem-2.0.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c05ef75b5db217be820604e43a47ccbbafea98ab6659d07cea92fa3c864ea58", size = 41747, upload-time = "2025-01-16T21:49:36.108Z" }, - { url = "https://files.pythonhosted.org/packages/7d/4e/042f372e5b3eb7f5f3dd7677161771d301de2b6fa3f7c74e1cebcd502552/cymem-2.0.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d5381e5793ce531bac0dbc00829c8381f18605bb67e4b61d34f8850463da40", size = 217647, upload-time = "2025-01-16T21:49:37.433Z" }, - { url = "https://files.pythonhosted.org/packages/48/cb/2207679e4b92701f78cf141e1ab4f81f55247dbe154eb426b842a0a993de/cymem-2.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2b9d3f42d7249ac81802135cad51d707def058001a32f73fc7fbf3de7045ac7", size = 218857, upload-time = "2025-01-16T21:49:40.09Z" }, - { url = "https://files.pythonhosted.org/packages/31/7a/76ae3b7a39ab2531029d281e43fcfcaad728c2341b150a81a3a1f5587cf3/cymem-2.0.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:39b78f2195d20b75c2d465732f6b8e8721c5d4eb012777c2cb89bdb45a043185", size = 206148, upload-time = "2025-01-16T21:49:41.383Z" }, - { url = "https://files.pythonhosted.org/packages/25/f9/d0fc0191ac79f15638ddb59237aa76f234691374d7d7950e10f384bd8a25/cymem-2.0.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2203bd6525a80d8fd0c94654a263af21c0387ae1d5062cceaebb652bf9bad7bc", size = 207112, upload-time = "2025-01-16T21:49:43.986Z" }, - { url = "https://files.pythonhosted.org/packages/56/c8/75f75889401b20f4c3a7c5965dda09df42913e904ddc2ffe7ef3bdf25061/cymem-2.0.11-cp311-cp311-win_amd64.whl", hash = "sha256:aa54af7314de400634448da1f935b61323da80a49484074688d344fb2036681b", size = 39360, upload-time = "2025-01-16T21:49:45.479Z" }, + { url = "https://files.pythonhosted.org/packages/6d/55/f453f2b2f560e057f20eb2acdaafbf6488d72a6e8a36a4aef30f6053a51c/cymem-2.0.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1b4dd8f8c2475c7c9948eefa89c790d83134600858d8d43b90276efd8df3882e", size = 41886 }, + { url = "https://files.pythonhosted.org/packages/a6/9d/03299eff35bd4fd80db33e4fd516661b82bb7b898cb677829acf22391ede/cymem-2.0.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d46ba0d2e0f749195297d16f2286b55af7d7c084db2b853fdfccece2c000c5dc", size = 41696 }, + { url = "https://files.pythonhosted.org/packages/d3/0c/90aa41f258a67ea210886c5c73f88dc9f120b7a20e6b5d92c5ce73a68276/cymem-2.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739c4336b9d04ce9761851e9260ef77508d4a86ee3060e41302bfb6fa82c37de", size = 203719 }, + { url = "https://files.pythonhosted.org/packages/52/d1/dc4a72aa2049c34a53a220290b1a59fadae61929dff3a6e1a830a22971fe/cymem-2.0.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a69c470c2fb118161f49761f9137384f46723c77078b659bba33858e19e46b49", size = 204763 }, + { url = "https://files.pythonhosted.org/packages/69/51/86ed323585530558bcdda1324c570abe032db2c1d5afd1c5e8e3e8fde63a/cymem-2.0.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:40159f6c92627438de970fd761916e745d70dfd84a7dcc28c1627eb49cee00d8", size = 193964 }, + { url = "https://files.pythonhosted.org/packages/ed/0c/aee4ad2996a4e24342228ccf44d7835c7784042f0ee0c47ad33be1443f18/cymem-2.0.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f503f98e6aa333fffbe657a6854f13a9c3de68860795ae21171284213b9c5c09", size = 195002 }, + { url = "https://files.pythonhosted.org/packages/eb/d5/eda823d639258d2ed1db83403c991a9a57d5a4ddea3bf08e59060809a9aa/cymem-2.0.11-cp310-cp310-win_amd64.whl", hash = "sha256:7f05ed5920cc92d6b958ec5da55bd820d326fe9332b90660e6fa67e3b476ceb1", size = 39079 }, + { url = "https://files.pythonhosted.org/packages/03/e3/d98e3976f4ffa99cddebc1ce379d4d62e3eb1da22285267f902c99cc3395/cymem-2.0.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3ee54039aad3ef65de82d66c40516bf54586287b46d32c91ea0530c34e8a2745", size = 42005 }, + { url = "https://files.pythonhosted.org/packages/41/b4/7546faf2ab63e59befc95972316d62276cec153f7d4d60e7b0d5e08f0602/cymem-2.0.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c05ef75b5db217be820604e43a47ccbbafea98ab6659d07cea92fa3c864ea58", size = 41747 }, + { url = "https://files.pythonhosted.org/packages/7d/4e/042f372e5b3eb7f5f3dd7677161771d301de2b6fa3f7c74e1cebcd502552/cymem-2.0.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d5381e5793ce531bac0dbc00829c8381f18605bb67e4b61d34f8850463da40", size = 217647 }, + { url = "https://files.pythonhosted.org/packages/48/cb/2207679e4b92701f78cf141e1ab4f81f55247dbe154eb426b842a0a993de/cymem-2.0.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2b9d3f42d7249ac81802135cad51d707def058001a32f73fc7fbf3de7045ac7", size = 218857 }, + { url = "https://files.pythonhosted.org/packages/31/7a/76ae3b7a39ab2531029d281e43fcfcaad728c2341b150a81a3a1f5587cf3/cymem-2.0.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:39b78f2195d20b75c2d465732f6b8e8721c5d4eb012777c2cb89bdb45a043185", size = 206148 }, + { url = "https://files.pythonhosted.org/packages/25/f9/d0fc0191ac79f15638ddb59237aa76f234691374d7d7950e10f384bd8a25/cymem-2.0.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2203bd6525a80d8fd0c94654a263af21c0387ae1d5062cceaebb652bf9bad7bc", size = 207112 }, + { url = "https://files.pythonhosted.org/packages/56/c8/75f75889401b20f4c3a7c5965dda09df42913e904ddc2ffe7ef3bdf25061/cymem-2.0.11-cp311-cp311-win_amd64.whl", hash = "sha256:aa54af7314de400634448da1f935b61323da80a49484074688d344fb2036681b", size = 39360 }, ] [[package]] name = "debugpy" version = "1.8.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279, upload-time = "2025-07-15T16:43:29.135Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279 } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/51/0b4315169f0d945271db037ae6b98c0548a2d48cc036335cd1b2f5516c1b/debugpy-1.8.15-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e9a8125c85172e3ec30985012e7a81ea5e70bbb836637f8a4104f454f9b06c97", size = 2084890, upload-time = "2025-07-15T16:43:31.239Z" }, - { url = "https://files.pythonhosted.org/packages/36/cc/a5391dedb079280d7b72418022e00ba8227ae0b5bc8b2e3d1ecffc5d6b01/debugpy-1.8.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd0b6b5eccaa745c214fd240ea82f46049d99ef74b185a3517dad3ea1ec55d9", size = 3561470, upload-time = "2025-07-15T16:43:32.515Z" }, - { url = "https://files.pythonhosted.org/packages/e8/92/acf64b92010c66b33c077dee3862c733798a2c90e7d14b25c01d771e2a0d/debugpy-1.8.15-cp310-cp310-win32.whl", hash = "sha256:8181cce4d344010f6bfe94a531c351a46a96b0f7987750932b2908e7a1e14a55", size = 5229194, upload-time = "2025-07-15T16:43:33.997Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f5/c58c015c9ff78de35901bea3ab4dbf7946d7a4aa867ee73875df06ba6468/debugpy-1.8.15-cp310-cp310-win_amd64.whl", hash = "sha256:af2dcae4e4cd6e8b35f982ccab29fe65f7e8766e10720a717bc80c464584ee21", size = 5260900, upload-time = "2025-07-15T16:43:35.413Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b3/1c44a2ed311199ab11c2299c9474a6c7cd80d19278defd333aeb7c287995/debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3", size = 2183442, upload-time = "2025-07-15T16:43:36.733Z" }, - { url = "https://files.pythonhosted.org/packages/f6/69/e2dcb721491e1c294d348681227c9b44fb95218f379aa88e12a19d85528d/debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53", size = 3134215, upload-time = "2025-07-15T16:43:38.116Z" }, - { url = "https://files.pythonhosted.org/packages/17/76/4ce63b95d8294dcf2fd1820860b300a420d077df4e93afcaa25a984c2ca7/debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702", size = 5154037, upload-time = "2025-07-15T16:43:39.471Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a7/e5a7c784465eb9c976d84408873d597dc7ce74a0fc69ed009548a1a94813/debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b", size = 5178133, upload-time = "2025-07-15T16:43:40.969Z" }, - { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697, upload-time = "2025-07-15T16:44:07.996Z" }, + { url = "https://files.pythonhosted.org/packages/69/51/0b4315169f0d945271db037ae6b98c0548a2d48cc036335cd1b2f5516c1b/debugpy-1.8.15-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e9a8125c85172e3ec30985012e7a81ea5e70bbb836637f8a4104f454f9b06c97", size = 2084890 }, + { url = "https://files.pythonhosted.org/packages/36/cc/a5391dedb079280d7b72418022e00ba8227ae0b5bc8b2e3d1ecffc5d6b01/debugpy-1.8.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd0b6b5eccaa745c214fd240ea82f46049d99ef74b185a3517dad3ea1ec55d9", size = 3561470 }, + { url = "https://files.pythonhosted.org/packages/e8/92/acf64b92010c66b33c077dee3862c733798a2c90e7d14b25c01d771e2a0d/debugpy-1.8.15-cp310-cp310-win32.whl", hash = "sha256:8181cce4d344010f6bfe94a531c351a46a96b0f7987750932b2908e7a1e14a55", size = 5229194 }, + { url = "https://files.pythonhosted.org/packages/3f/f5/c58c015c9ff78de35901bea3ab4dbf7946d7a4aa867ee73875df06ba6468/debugpy-1.8.15-cp310-cp310-win_amd64.whl", hash = "sha256:af2dcae4e4cd6e8b35f982ccab29fe65f7e8766e10720a717bc80c464584ee21", size = 5260900 }, + { url = "https://files.pythonhosted.org/packages/d2/b3/1c44a2ed311199ab11c2299c9474a6c7cd80d19278defd333aeb7c287995/debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3", size = 2183442 }, + { url = "https://files.pythonhosted.org/packages/f6/69/e2dcb721491e1c294d348681227c9b44fb95218f379aa88e12a19d85528d/debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53", size = 3134215 }, + { url = "https://files.pythonhosted.org/packages/17/76/4ce63b95d8294dcf2fd1820860b300a420d077df4e93afcaa25a984c2ca7/debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702", size = 5154037 }, + { url = "https://files.pythonhosted.org/packages/c2/a7/e5a7c784465eb9c976d84408873d597dc7ce74a0fc69ed009548a1a94813/debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b", size = 5178133 }, + { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697 }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, ] [[package]] @@ -603,9 +603,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788, upload-time = "2020-04-20T14:23:38.738Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/d3/8ae2869247df154b64c1884d7346d412fed0c49df84db635aab2d1c40e62/deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff", size = 173788 } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178, upload-time = "2020-04-20T14:23:36.581Z" }, + { url = "https://files.pythonhosted.org/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a", size = 11178 }, ] [[package]] @@ -617,18 +617,18 @@ dependencies = [ { name = "executing" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/84/75/b78198620640d394bc435c17bb49db18419afdd6cfa3ed8bcfe14034ec80/devtools-0.12.2.tar.gz", hash = "sha256:efceab184cb35e3a11fa8e602cc4fadacaa2e859e920fc6f87bf130b69885507", size = 75005, upload-time = "2023-09-03T16:57:00.679Z" } +sdist = { url = "https://files.pythonhosted.org/packages/84/75/b78198620640d394bc435c17bb49db18419afdd6cfa3ed8bcfe14034ec80/devtools-0.12.2.tar.gz", hash = "sha256:efceab184cb35e3a11fa8e602cc4fadacaa2e859e920fc6f87bf130b69885507", size = 75005 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/ae/afb1487556e2dc827a17097aac8158a25b433a345386f0e249f6d2694ccb/devtools-0.12.2-py3-none-any.whl", hash = "sha256:c366e3de1df4cdd635f1ad8cbcd3af01a384d7abda71900e68d43b04eb6aaca7", size = 19411, upload-time = "2023-09-03T16:56:59.049Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ae/afb1487556e2dc827a17097aac8158a25b433a345386f0e249f6d2694ccb/devtools-0.12.2-py3-none-any.whl", hash = "sha256:c366e3de1df4cdd635f1ad8cbcd3af01a384d7abda71900e68d43b04eb6aaca7", size = 19411 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } 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" }, + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, ] [[package]] @@ -639,9 +639,9 @@ dependencies = [ { name = "marshmallow" }, { name = "python-dotenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/77/08/2b7d9cacf2b27482c9218ee6762336aa47bdb9d07ee26a136d072a328297/environs-11.2.1.tar.gz", hash = "sha256:e068ae3174cef52ba4b95ead22e639056a02465f616e62323e04ae08e86a75a4", size = 27485, upload-time = "2024-11-20T17:38:40.795Z" } +sdist = { url = "https://files.pythonhosted.org/packages/77/08/2b7d9cacf2b27482c9218ee6762336aa47bdb9d07ee26a136d072a328297/environs-11.2.1.tar.gz", hash = "sha256:e068ae3174cef52ba4b95ead22e639056a02465f616e62323e04ae08e86a75a4", size = 27485 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/21/1e0d8de234e9d0c675ea8fd50f9e7ad66fae32c207bc982f1d14f7c0835b/environs-11.2.1-py3-none-any.whl", hash = "sha256:9d2080cf25807a26fc0d4301e2d7b62c64fbf547540f21e3a30cc02bc5fbe948", size = 12923, upload-time = "2024-11-20T17:38:39.013Z" }, + { url = "https://files.pythonhosted.org/packages/1a/21/1e0d8de234e9d0c675ea8fd50f9e7ad66fae32c207bc982f1d14f7c0835b/environs-11.2.1-py3-none-any.whl", hash = "sha256:9d2080cf25807a26fc0d4301e2d7b62c64fbf547540f21e3a30cc02bc5fbe948", size = 12923 }, ] [[package]] @@ -651,23 +651,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749, upload-time = "2025-05-10T17:42:51.123Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/9f/a65090624ecf468cdca03533906e7c69ed7588582240cfe7cc9e770b50eb/exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88", size = 29749 } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, + { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674 }, ] [[package]] name = "executing" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload-time = "2025-01-22T15:41:29.403Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload-time = "2025-01-22T15:41:25.929Z" }, + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, ] [[package]] name = "fnllm" -version = "0.2.9" +version = "0.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiolimiter" }, @@ -676,9 +676,9 @@ dependencies = [ { name = "pydantic" }, { name = "tenacity" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/48/37/3cd445ea54eac04239e5a1e351b0c2970b0bc38edc31467eb2ad557165de/fnllm-0.2.9.tar.gz", hash = "sha256:6760094565741492154bc7e076a5e90e1f013b350419876d3fa426179b97933c", size = 88545, upload-time = "2025-04-07T19:32:33.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/84/bc3d02134a46dd267afbed66a47dc281b252bd8171c94ad22bcc8f924f8b/fnllm-0.4.1.tar.gz", hash = "sha256:80a7450693691bf0832e12a2d70420647bfea35a43cb91c4a9cb5e2f39172b50", size = 93566 } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/6a/dac596ffc5b4b395773ed72abfb4d6b16ca117adec397a0649a80ef41ebc/fnllm-0.2.9-py3-none-any.whl", hash = "sha256:ad09074902cff32c0bf9f36a8e1f327a950b2186613de6198ed8e46e7a941da9", size = 74092, upload-time = "2025-04-07T19:32:31.844Z" }, + { url = "https://files.pythonhosted.org/packages/ac/6a/04db92a7e8d9cf9b73d3c29c38e16d5728069ec1be06a4723f74579499fa/fnllm-0.4.1-py3-none-any.whl", hash = "sha256:22f1b3316a90f29fde94bfe651e0e4963ff68cddb438035ef7c2161e39789ccf", size = 79273 }, ] [package.optional-dependencies] @@ -695,34 +695,34 @@ openai = [ name = "fonttools" version = "4.59.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/27/ec3c723bfdf86f34c5c82bf6305df3e0f0d8ea798d2d3a7cb0c0a866d286/fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14", size = 3532521, upload-time = "2025-07-16T12:04:54.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/27/ec3c723bfdf86f34c5c82bf6305df3e0f0d8ea798d2d3a7cb0c0a866d286/fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14", size = 3532521 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/1f/3dcae710b7c4b56e79442b03db64f6c9f10c3348f7af40339dffcefb581e/fonttools-4.59.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:524133c1be38445c5c0575eacea42dbd44374b310b1ffc4b60ff01d881fabb96", size = 2761846, upload-time = "2025-07-16T12:03:33.267Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0e/ae3a1884fa1549acac1191cc9ec039142f6ac0e9cbc139c2e6a3dab967da/fonttools-4.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21e606b2d38fed938dde871c5736822dd6bda7a4631b92e509a1f5cd1b90c5df", size = 2332060, upload-time = "2025-07-16T12:03:36.472Z" }, - { url = "https://files.pythonhosted.org/packages/75/46/58bff92a7216829159ac7bdb1d05a48ad1b8ab8c539555f12d29fdecfdd4/fonttools-4.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93df708c69a193fc7987192f94df250f83f3851fda49413f02ba5dded639482", size = 4852354, upload-time = "2025-07-16T12:03:39.102Z" }, - { url = "https://files.pythonhosted.org/packages/05/57/767e31e48861045d89691128bd81fd4c62b62150f9a17a666f731ce4f197/fonttools-4.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:62224a9bb85b4b66d1b46d45cbe43d71cbf8f527d332b177e3b96191ffbc1e64", size = 4781132, upload-time = "2025-07-16T12:03:41.415Z" }, - { url = "https://files.pythonhosted.org/packages/d7/78/adb5e9b0af5c6ce469e8b0e112f144eaa84b30dd72a486e9c778a9b03b31/fonttools-4.59.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8974b2a266b54c96709bd5e239979cddfd2dbceed331aa567ea1d7c4a2202db", size = 4832901, upload-time = "2025-07-16T12:03:43.115Z" }, - { url = "https://files.pythonhosted.org/packages/ac/92/bc3881097fbf3d56d112bec308c863c058e5d4c9c65f534e8ae58450ab8a/fonttools-4.59.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:209b75943d158f610b78320eacb5539aa9e920bee2c775445b2846c65d20e19d", size = 4940140, upload-time = "2025-07-16T12:03:44.781Z" }, - { url = "https://files.pythonhosted.org/packages/4a/54/39cdb23f0eeda2e07ae9cb189f2b6f41da89aabc682d3a387b3ff4a4ed29/fonttools-4.59.0-cp310-cp310-win32.whl", hash = "sha256:4c908a7036f0f3677f8afa577bcd973e3e20ddd2f7c42a33208d18bee95cdb6f", size = 2215890, upload-time = "2025-07-16T12:03:46.961Z" }, - { url = "https://files.pythonhosted.org/packages/d8/eb/f8388d9e19f95d8df2449febe9b1a38ddd758cfdb7d6de3a05198d785d61/fonttools-4.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:8b4309a2775e4feee7356e63b163969a215d663399cce1b3d3b65e7ec2d9680e", size = 2260191, upload-time = "2025-07-16T12:03:48.908Z" }, - { url = "https://files.pythonhosted.org/packages/06/96/520733d9602fa1bf6592e5354c6721ac6fc9ea72bc98d112d0c38b967199/fonttools-4.59.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:841b2186adce48903c0fef235421ae21549020eca942c1da773ac380b056ab3c", size = 2782387, upload-time = "2025-07-16T12:03:51.424Z" }, - { url = "https://files.pythonhosted.org/packages/87/6a/170fce30b9bce69077d8eec9bea2cfd9f7995e8911c71be905e2eba6368b/fonttools-4.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9bcc1e77fbd1609198966ded6b2a9897bd6c6bcbd2287a2fc7d75f1a254179c5", size = 2342194, upload-time = "2025-07-16T12:03:53.295Z" }, - { url = "https://files.pythonhosted.org/packages/b0/b6/7c8166c0066856f1408092f7968ac744060cf72ca53aec9036106f57eeca/fonttools-4.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37c377f7cb2ab2eca8a0b319c68146d34a339792f9420fca6cd49cf28d370705", size = 5032333, upload-time = "2025-07-16T12:03:55.177Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0c/707c5a19598eafcafd489b73c4cb1c142102d6197e872f531512d084aa76/fonttools-4.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa39475eaccb98f9199eccfda4298abaf35ae0caec676ffc25b3a5e224044464", size = 4974422, upload-time = "2025-07-16T12:03:57.406Z" }, - { url = "https://files.pythonhosted.org/packages/f6/e7/6d33737d9fe632a0f59289b6f9743a86d2a9d0673de2a0c38c0f54729822/fonttools-4.59.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d3972b13148c1d1fbc092b27678a33b3080d1ac0ca305742b0119b75f9e87e38", size = 5010631, upload-time = "2025-07-16T12:03:59.449Z" }, - { url = "https://files.pythonhosted.org/packages/63/e1/a4c3d089ab034a578820c8f2dff21ef60daf9668034a1e4fb38bb1cc3398/fonttools-4.59.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a408c3c51358c89b29cfa5317cf11518b7ce5de1717abb55c5ae2d2921027de6", size = 5122198, upload-time = "2025-07-16T12:04:01.542Z" }, - { url = "https://files.pythonhosted.org/packages/09/77/ca82b9c12fa4de3c520b7760ee61787640cf3fde55ef1b0bfe1de38c8153/fonttools-4.59.0-cp311-cp311-win32.whl", hash = "sha256:6770d7da00f358183d8fd5c4615436189e4f683bdb6affb02cad3d221d7bb757", size = 2214216, upload-time = "2025-07-16T12:04:03.515Z" }, - { url = "https://files.pythonhosted.org/packages/ab/25/5aa7ca24b560b2f00f260acf32c4cf29d7aaf8656e159a336111c18bc345/fonttools-4.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:84fc186980231a287b28560d3123bd255d3c6b6659828c642b4cf961e2b923d0", size = 2261879, upload-time = "2025-07-16T12:04:05.015Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9c/df0ef2c51845a13043e5088f7bb988ca6cd5bb82d5d4203d6a158aa58cf2/fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d", size = 1128050, upload-time = "2025-07-16T12:04:52.687Z" }, + { url = "https://files.pythonhosted.org/packages/1c/1f/3dcae710b7c4b56e79442b03db64f6c9f10c3348f7af40339dffcefb581e/fonttools-4.59.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:524133c1be38445c5c0575eacea42dbd44374b310b1ffc4b60ff01d881fabb96", size = 2761846 }, + { url = "https://files.pythonhosted.org/packages/eb/0e/ae3a1884fa1549acac1191cc9ec039142f6ac0e9cbc139c2e6a3dab967da/fonttools-4.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21e606b2d38fed938dde871c5736822dd6bda7a4631b92e509a1f5cd1b90c5df", size = 2332060 }, + { url = "https://files.pythonhosted.org/packages/75/46/58bff92a7216829159ac7bdb1d05a48ad1b8ab8c539555f12d29fdecfdd4/fonttools-4.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93df708c69a193fc7987192f94df250f83f3851fda49413f02ba5dded639482", size = 4852354 }, + { url = "https://files.pythonhosted.org/packages/05/57/767e31e48861045d89691128bd81fd4c62b62150f9a17a666f731ce4f197/fonttools-4.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:62224a9bb85b4b66d1b46d45cbe43d71cbf8f527d332b177e3b96191ffbc1e64", size = 4781132 }, + { url = "https://files.pythonhosted.org/packages/d7/78/adb5e9b0af5c6ce469e8b0e112f144eaa84b30dd72a486e9c778a9b03b31/fonttools-4.59.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8974b2a266b54c96709bd5e239979cddfd2dbceed331aa567ea1d7c4a2202db", size = 4832901 }, + { url = "https://files.pythonhosted.org/packages/ac/92/bc3881097fbf3d56d112bec308c863c058e5d4c9c65f534e8ae58450ab8a/fonttools-4.59.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:209b75943d158f610b78320eacb5539aa9e920bee2c775445b2846c65d20e19d", size = 4940140 }, + { url = "https://files.pythonhosted.org/packages/4a/54/39cdb23f0eeda2e07ae9cb189f2b6f41da89aabc682d3a387b3ff4a4ed29/fonttools-4.59.0-cp310-cp310-win32.whl", hash = "sha256:4c908a7036f0f3677f8afa577bcd973e3e20ddd2f7c42a33208d18bee95cdb6f", size = 2215890 }, + { url = "https://files.pythonhosted.org/packages/d8/eb/f8388d9e19f95d8df2449febe9b1a38ddd758cfdb7d6de3a05198d785d61/fonttools-4.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:8b4309a2775e4feee7356e63b163969a215d663399cce1b3d3b65e7ec2d9680e", size = 2260191 }, + { url = "https://files.pythonhosted.org/packages/06/96/520733d9602fa1bf6592e5354c6721ac6fc9ea72bc98d112d0c38b967199/fonttools-4.59.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:841b2186adce48903c0fef235421ae21549020eca942c1da773ac380b056ab3c", size = 2782387 }, + { url = "https://files.pythonhosted.org/packages/87/6a/170fce30b9bce69077d8eec9bea2cfd9f7995e8911c71be905e2eba6368b/fonttools-4.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9bcc1e77fbd1609198966ded6b2a9897bd6c6bcbd2287a2fc7d75f1a254179c5", size = 2342194 }, + { url = "https://files.pythonhosted.org/packages/b0/b6/7c8166c0066856f1408092f7968ac744060cf72ca53aec9036106f57eeca/fonttools-4.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37c377f7cb2ab2eca8a0b319c68146d34a339792f9420fca6cd49cf28d370705", size = 5032333 }, + { url = "https://files.pythonhosted.org/packages/eb/0c/707c5a19598eafcafd489b73c4cb1c142102d6197e872f531512d084aa76/fonttools-4.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa39475eaccb98f9199eccfda4298abaf35ae0caec676ffc25b3a5e224044464", size = 4974422 }, + { url = "https://files.pythonhosted.org/packages/f6/e7/6d33737d9fe632a0f59289b6f9743a86d2a9d0673de2a0c38c0f54729822/fonttools-4.59.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d3972b13148c1d1fbc092b27678a33b3080d1ac0ca305742b0119b75f9e87e38", size = 5010631 }, + { url = "https://files.pythonhosted.org/packages/63/e1/a4c3d089ab034a578820c8f2dff21ef60daf9668034a1e4fb38bb1cc3398/fonttools-4.59.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a408c3c51358c89b29cfa5317cf11518b7ce5de1717abb55c5ae2d2921027de6", size = 5122198 }, + { url = "https://files.pythonhosted.org/packages/09/77/ca82b9c12fa4de3c520b7760ee61787640cf3fde55ef1b0bfe1de38c8153/fonttools-4.59.0-cp311-cp311-win32.whl", hash = "sha256:6770d7da00f358183d8fd5c4615436189e4f683bdb6affb02cad3d221d7bb757", size = 2214216 }, + { url = "https://files.pythonhosted.org/packages/ab/25/5aa7ca24b560b2f00f260acf32c4cf29d7aaf8656e159a336111c18bc345/fonttools-4.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:84fc186980231a287b28560d3123bd255d3c6b6659828c642b4cf961e2b923d0", size = 2261879 }, + { url = "https://files.pythonhosted.org/packages/d0/9c/df0ef2c51845a13043e5088f7bb988ca6cd5bb82d5d4203d6a158aa58cf2/fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d", size = 1128050 }, ] [[package]] name = "future" version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490, upload-time = "2024-02-21T11:52:38.461Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490 } wheels = [ - { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326, upload-time = "2024-02-21T11:52:35.956Z" }, + { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326 }, ] [[package]] @@ -734,18 +734,18 @@ dependencies = [ { name = "scipy" }, { name = "smart-open" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ec/bc/36ce4d510085cf150f17d79bb5e88cde942aeba2a894aed5893812ea1e6d/gensim-4.3.3.tar.gz", hash = "sha256:84852076a6a3d88d7dac5be245e24c21c3b819b565e14c1b61fa3e5ee76dcf57", size = 23258708, upload-time = "2024-07-19T14:42:35.418Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/bc/36ce4d510085cf150f17d79bb5e88cde942aeba2a894aed5893812ea1e6d/gensim-4.3.3.tar.gz", hash = "sha256:84852076a6a3d88d7dac5be245e24c21c3b819b565e14c1b61fa3e5ee76dcf57", size = 23258708 } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/12/047dc8b6bed7c4833bcdfbafc10af0f96dc3847ce37be63b14bd6e6c7767/gensim-4.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4e72840adfbea35c5804fd559bc0cb6bc9f439926220a37d852b7ce76eb325c1", size = 24086876, upload-time = "2024-07-19T14:39:26.268Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6e/7c6d7dda41924b83c4b1eb096942b68b85ba305df7f0963ad0642ac0d73f/gensim-4.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4019263c9d9afae7c669f880c17e09461e77a71afce04ed4d79cf71a4cad2848", size = 24041730, upload-time = "2024-07-19T14:39:34.431Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/376290613da44ea9d11bdce3a1705ba7cc25f971edb2b460dc192092068c/gensim-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dea62d3e2ada547687bde6cbba37efa50b534db77e9d44fd5802676bb072c9d9", size = 26398007, upload-time = "2024-07-19T14:39:41.67Z" }, - { url = "https://files.pythonhosted.org/packages/de/63/776ee55c773f55fa9d4fc1596f2e5e15de109921a6727dfe29cc4f0baeb7/gensim-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fac93ef5e44982defef9d3c1e4cd00245506b8a29cec19ec5e00f0221b8144c", size = 26506925, upload-time = "2024-07-19T14:39:48.662Z" }, - { url = "https://files.pythonhosted.org/packages/cd/4a/f07e2f255aedd6bb4bd0ae420a465f228a4a91bc78ac359216ea20557be6/gensim-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:7c3409f755fb8d62da99cea65e7a40a99d21f8fd86443a3aaf2d90eb68995021", size = 24012924, upload-time = "2024-07-19T14:39:56.224Z" }, - { url = "https://files.pythonhosted.org/packages/7b/f4/f43fd909aa29fd92f0e6d703d90c0e6507a7c6be3d686a025b1e192afa3a/gensim-4.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:99e7b70352aecc6c1674dde82b75f453e7a5d1cc71ac1cfbc460bf1fe20501b7", size = 24082968, upload-time = "2024-07-19T14:40:03.849Z" }, - { url = "https://files.pythonhosted.org/packages/2a/15/aca2fc3b9e97bd0e28be4a4302793c43757b04b828223c6d103c72132f19/gensim-4.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:32a4cac3f3c38af2069eab9524609fc92ebaeb2692b7280cfda365a3517a280a", size = 24036231, upload-time = "2024-07-19T14:40:10.943Z" }, - { url = "https://files.pythonhosted.org/packages/ef/84/e46049a16fa7daa26ac9e83e41b3bc3b30867da832a5d7cb0779da893255/gensim-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c071b4329ed1be02446eb7ef637b94c68cf0080c15c57fbcde667fce2e49c3fe", size = 26558362, upload-time = "2024-07-19T14:40:17.997Z" }, - { url = "https://files.pythonhosted.org/packages/78/4f/f6045d5d5f8e7838c42572607ce440f95dbf4de5da41ae664198c2839c05/gensim-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d662bf96e3d741b6ab61a54be842a7cbf5e45193008b2f4225c758cafd7f9cdc", size = 26662669, upload-time = "2024-07-19T14:40:26.14Z" }, - { url = "https://files.pythonhosted.org/packages/f5/57/f2e6568dbf464a4b270954e5fa3dee4a4054d163a41c0e7bf0a34eb40f0f/gensim-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a54bd53a0e6f991abb837f126663353657270e75be53287e8a568ada0b35b1b0", size = 24010102, upload-time = "2024-07-19T14:40:33.359Z" }, + { url = "https://files.pythonhosted.org/packages/27/12/047dc8b6bed7c4833bcdfbafc10af0f96dc3847ce37be63b14bd6e6c7767/gensim-4.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4e72840adfbea35c5804fd559bc0cb6bc9f439926220a37d852b7ce76eb325c1", size = 24086876 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/7c6d7dda41924b83c4b1eb096942b68b85ba305df7f0963ad0642ac0d73f/gensim-4.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4019263c9d9afae7c669f880c17e09461e77a71afce04ed4d79cf71a4cad2848", size = 24041730 }, + { url = "https://files.pythonhosted.org/packages/73/f4/376290613da44ea9d11bdce3a1705ba7cc25f971edb2b460dc192092068c/gensim-4.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dea62d3e2ada547687bde6cbba37efa50b534db77e9d44fd5802676bb072c9d9", size = 26398007 }, + { url = "https://files.pythonhosted.org/packages/de/63/776ee55c773f55fa9d4fc1596f2e5e15de109921a6727dfe29cc4f0baeb7/gensim-4.3.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fac93ef5e44982defef9d3c1e4cd00245506b8a29cec19ec5e00f0221b8144c", size = 26506925 }, + { url = "https://files.pythonhosted.org/packages/cd/4a/f07e2f255aedd6bb4bd0ae420a465f228a4a91bc78ac359216ea20557be6/gensim-4.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:7c3409f755fb8d62da99cea65e7a40a99d21f8fd86443a3aaf2d90eb68995021", size = 24012924 }, + { url = "https://files.pythonhosted.org/packages/7b/f4/f43fd909aa29fd92f0e6d703d90c0e6507a7c6be3d686a025b1e192afa3a/gensim-4.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:99e7b70352aecc6c1674dde82b75f453e7a5d1cc71ac1cfbc460bf1fe20501b7", size = 24082968 }, + { url = "https://files.pythonhosted.org/packages/2a/15/aca2fc3b9e97bd0e28be4a4302793c43757b04b828223c6d103c72132f19/gensim-4.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:32a4cac3f3c38af2069eab9524609fc92ebaeb2692b7280cfda365a3517a280a", size = 24036231 }, + { url = "https://files.pythonhosted.org/packages/ef/84/e46049a16fa7daa26ac9e83e41b3bc3b30867da832a5d7cb0779da893255/gensim-4.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c071b4329ed1be02446eb7ef637b94c68cf0080c15c57fbcde667fce2e49c3fe", size = 26558362 }, + { url = "https://files.pythonhosted.org/packages/78/4f/f6045d5d5f8e7838c42572607ce440f95dbf4de5da41ae664198c2839c05/gensim-4.3.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d662bf96e3d741b6ab61a54be842a7cbf5e45193008b2f4225c758cafd7f9cdc", size = 26662669 }, + { url = "https://files.pythonhosted.org/packages/f5/57/f2e6568dbf464a4b270954e5fa3dee4a4054d163a41c0e7bf0a34eb40f0f/gensim-4.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a54bd53a0e6f991abb837f126663353657270e75be53287e8a568ada0b35b1b0", size = 24010102 }, ] [[package]] @@ -755,9 +755,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, ] [[package]] @@ -767,14 +767,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076, upload-time = "2025-07-24T03:45:54.871Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076 } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168, upload-time = "2025-07-24T03:45:52.517Z" }, + { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168 }, ] [[package]] name = "graphrag" -version = "2.0.0" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiofiles" }, @@ -799,7 +799,6 @@ dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "pyyaml" }, - { name = "rich" }, { name = "spacy" }, { name = "textblob" }, { name = "tiktoken" }, @@ -808,9 +807,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "umap-learn" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f7/71/9fed9773efb6f5b483dce39878d6821bc211c0b5be435d27668e150616bb/graphrag-2.0.0.tar.gz", hash = "sha256:7279e1535b93ffa929e5c08b8f6ebb26878df01f191d6b01dea4852a22af4863", size = 208669, upload-time = "2025-02-26T16:59:16.454Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/39/42538610cf97438e4acbcb688e7dfa84b99b7e8f34fd923959922cccc413/graphrag-2.5.0.tar.gz", hash = "sha256:a68ebc73f55693d9c6e197da60f491aa42147a70d326e4ca2bc96f95a0964645", size = 219699 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/31/638fa7a1069bbabffedb85c3fe810174b9bf124695eea8dc1851829f4b6d/graphrag-2.0.0-py3-none-any.whl", hash = "sha256:57ac39315ad49c722bf40cb5c4311bf737fd40343c10ff267d090fb29c6fafd9", size = 361145, upload-time = "2025-02-26T16:59:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/49/93/d773256100cdc1b8335928cc4971d97925764a502503d75e4d17892d029b/graphrag-2.5.0-py3-none-any.whl", hash = "sha256:23c8df37a2910d071bb93f2ced33edea54037bd4a613dde445cc5f8fe451247f", size = 370350 }, ] [[package]] @@ -836,30 +835,30 @@ dependencies = [ { name = "typing-extensions" }, { name = "umap-learn" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/de/83d653cc8029dc8c5f75bc5aea68f6b1e834230f05525fb3e7ac4aeae226/graspologic-3.4.1.tar.gz", hash = "sha256:7561f0b852a2bccd351bff77e8db07d9892f9dfa35a420fdec01690e4fdc8075", size = 5134018, upload-time = "2024-05-22T22:54:42.797Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/de/83d653cc8029dc8c5f75bc5aea68f6b1e834230f05525fb3e7ac4aeae226/graspologic-3.4.1.tar.gz", hash = "sha256:7561f0b852a2bccd351bff77e8db07d9892f9dfa35a420fdec01690e4fdc8075", size = 5134018 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/0b/9a167cec9cc4555b59cd282e8669998a50cb3f929a9a503965b24fa58a20/graspologic-3.4.1-py3-none-any.whl", hash = "sha256:c6563e087eda599bad1de831d4b7321c0daa7a82f4e85a7d7737ff67e07cdda2", size = 5200768, upload-time = "2024-05-22T22:54:39.259Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0b/9a167cec9cc4555b59cd282e8669998a50cb3f929a9a503965b24fa58a20/graspologic-3.4.1-py3-none-any.whl", hash = "sha256:c6563e087eda599bad1de831d4b7321c0daa7a82f4e85a7d7737ff67e07cdda2", size = 5200768 }, ] [[package]] name = "graspologic-native" version = "1.2.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/2d/62b30d89533643ccf4778a18eb023f291b8877b5d85de3342f07b2d363a7/graspologic_native-1.2.5.tar.gz", hash = "sha256:27ea7e01fa44466c0b4cdd678d4561e5d3dc0cb400015683b7ae1386031257a0", size = 2512729, upload-time = "2025-04-02T19:34:22.961Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/2d/62b30d89533643ccf4778a18eb023f291b8877b5d85de3342f07b2d363a7/graspologic_native-1.2.5.tar.gz", hash = "sha256:27ea7e01fa44466c0b4cdd678d4561e5d3dc0cb400015683b7ae1386031257a0", size = 2512729 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/86/10748f4c474b0c8f6060dd379bb0c4da5d42779244bb13a58656ffb44a03/graspologic_native-1.2.5-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bf05f2e162ae2a2a8d6e8cfccbe3586d1faa0b808159ff950478348df557c61e", size = 648437, upload-time = "2025-04-02T19:34:16.29Z" }, - { url = "https://files.pythonhosted.org/packages/42/cc/b75ea35755340bedda29727e5388390c639ea533f55b9249f5ac3003f656/graspologic_native-1.2.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fff06ed49c3875cf351bb09a92ae7cbc169ce92dcc4c3439e28e801f822ae", size = 352044, upload-time = "2025-04-02T19:34:18.153Z" }, - { url = "https://files.pythonhosted.org/packages/8e/55/15e6e4f18bf249b529ac4cd1522b03f5c9ef9284a2f7bfaa1fd1f96464fe/graspologic_native-1.2.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e7e993e7d70fe0d860773fc62812fbb8cb4ef2d11d8661a1f06f8772593915", size = 364644, upload-time = "2025-04-02T19:34:19.486Z" }, - { url = "https://files.pythonhosted.org/packages/3b/51/21097af79f3d68626539ab829bdbf6cc42933f020e161972927d916e394c/graspologic_native-1.2.5-cp38-abi3-win_amd64.whl", hash = "sha256:c3ef2172d774083d7e2c8e77daccd218571ddeebeb2c1703cebb1a2cc4c56e07", size = 210438, upload-time = "2025-04-02T19:34:21.139Z" }, + { url = "https://files.pythonhosted.org/packages/ae/86/10748f4c474b0c8f6060dd379bb0c4da5d42779244bb13a58656ffb44a03/graspologic_native-1.2.5-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:bf05f2e162ae2a2a8d6e8cfccbe3586d1faa0b808159ff950478348df557c61e", size = 648437 }, + { url = "https://files.pythonhosted.org/packages/42/cc/b75ea35755340bedda29727e5388390c639ea533f55b9249f5ac3003f656/graspologic_native-1.2.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7fff06ed49c3875cf351bb09a92ae7cbc169ce92dcc4c3439e28e801f822ae", size = 352044 }, + { url = "https://files.pythonhosted.org/packages/8e/55/15e6e4f18bf249b529ac4cd1522b03f5c9ef9284a2f7bfaa1fd1f96464fe/graspologic_native-1.2.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53e7e993e7d70fe0d860773fc62812fbb8cb4ef2d11d8661a1f06f8772593915", size = 364644 }, + { url = "https://files.pythonhosted.org/packages/3b/51/21097af79f3d68626539ab829bdbf6cc42933f020e161972927d916e394c/graspologic_native-1.2.5-cp38-abi3-win_amd64.whl", hash = "sha256:c3ef2172d774083d7e2c8e77daccd218571ddeebeb2c1703cebb1a2cc4c56e07", size = 210438 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } 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" }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, ] [[package]] @@ -870,9 +869,9 @@ 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" } +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } 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" }, + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, ] [[package]] @@ -885,9 +884,9 @@ dependencies = [ { 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" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } 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" }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] [[package]] @@ -902,16 +901,16 @@ dependencies = [ { name = "scipy" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/34/87/7940713f929d0280cff1bde207479cb588a0d3a4dd49a0e2e69bfff46363/hyppo-0.4.0-py3-none-any.whl", hash = "sha256:4e75565b8deb601485cd7bc1b5c3f44e6ddf329136fc81e65d011f9b4e95132f", size = 146607, upload-time = "2023-05-24T13:50:04.441Z" }, + { url = "https://files.pythonhosted.org/packages/34/87/7940713f929d0280cff1bde207479cb588a0d3a4dd49a0e2e69bfff46363/hyppo-0.4.0-py3-none-any.whl", hash = "sha256:4e75565b8deb601485cd7bc1b5c3f44e6ddf329136fc81e65d011f9b4e95132f", size = 146607 }, ] [[package]] name = "idna" version = "3.10" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] @@ -934,9 +933,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/27/9e6e30ed92f2ac53d29f70b09da8b2dc456e256148e289678fa0e825f46a/ipykernel-6.30.0.tar.gz", hash = "sha256:b7b808ddb2d261aae2df3a26ff3ff810046e6de3dfbc6f7de8c98ea0a6cb632c", size = 165125, upload-time = "2025-07-21T10:36:09.259Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/27/9e6e30ed92f2ac53d29f70b09da8b2dc456e256148e289678fa0e825f46a/ipykernel-6.30.0.tar.gz", hash = "sha256:b7b808ddb2d261aae2df3a26ff3ff810046e6de3dfbc6f7de8c98ea0a6cb632c", size = 165125 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/3d/00813c3d9b46e3dcd88bd4530e0a3c63c0509e5d8c9eff34723ea243ab04/ipykernel-6.30.0-py3-none-any.whl", hash = "sha256:fd2936e55c4a1c2ee8b1e5fa6a372b8eecc0ab1338750dee76f48fa5cca1301e", size = 117264, upload-time = "2025-07-21T10:36:06.854Z" }, + { url = "https://files.pythonhosted.org/packages/1f/3d/00813c3d9b46e3dcd88bd4530e0a3c63c0509e5d8c9eff34723ea243ab04/ipykernel-6.30.0-py3-none-any.whl", hash = "sha256:fd2936e55c4a1c2ee8b1e5fa6a372b8eecc0ab1338750dee76f48fa5cca1301e", size = 117264 }, ] [[package]] @@ -959,9 +958,9 @@ dependencies = [ { name = "traitlets", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088, upload-time = "2025-05-31T16:39:09.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/31/10ac88f3357fc276dc8a64e8880c82e80e7459326ae1d0a211b40abf6665/ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216", size = 5606088 } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864, upload-time = "2025-05-31T16:39:06.38Z" }, + { url = "https://files.pythonhosted.org/packages/91/d0/274fbf7b0b12643cbbc001ce13e6a5b1607ac4929d1b11c72460152c9fc3/ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2", size = 831864 }, ] [[package]] @@ -984,9 +983,9 @@ dependencies = [ { name = "traitlets", marker = "python_full_version >= '3.11'" }, { name = "typing-extensions", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload-time = "2025-07-01T11:11:30.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338 } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload-time = "2025-07-01T11:11:27.85Z" }, + { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021 }, ] [[package]] @@ -996,18 +995,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments", marker = "python_full_version >= '3.11'" }, ] -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" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } 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" }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, ] [[package]] name = "isodate" version = "0.7.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705 } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, ] [[package]] @@ -1017,9 +1016,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, ] [[package]] @@ -1029,59 +1028,59 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] [[package]] name = "jiter" version = "0.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", size = 162759, upload-time = "2025-05-18T19:04:59.73Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/7e/4011b5c77bec97cb2b572f566220364e3e21b51c48c5bd9c4a9c26b41b67/jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303", size = 317215, upload-time = "2025-05-18T19:03:04.303Z" }, - { url = "https://files.pythonhosted.org/packages/8a/4f/144c1b57c39692efc7ea7d8e247acf28e47d0912800b34d0ad815f6b2824/jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e", size = 322814, upload-time = "2025-05-18T19:03:06.433Z" }, - { url = "https://files.pythonhosted.org/packages/63/1f/db977336d332a9406c0b1f0b82be6f71f72526a806cbb2281baf201d38e3/jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f", size = 345237, upload-time = "2025-05-18T19:03:07.833Z" }, - { url = "https://files.pythonhosted.org/packages/d7/1c/aa30a4a775e8a672ad7f21532bdbfb269f0706b39c6ff14e1f86bdd9e5ff/jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224", size = 370999, upload-time = "2025-05-18T19:03:09.338Z" }, - { url = "https://files.pythonhosted.org/packages/35/df/f8257abc4207830cb18880781b5f5b716bad5b2a22fb4330cfd357407c5b/jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7", size = 491109, upload-time = "2025-05-18T19:03:11.13Z" }, - { url = "https://files.pythonhosted.org/packages/06/76/9e1516fd7b4278aa13a2cc7f159e56befbea9aa65c71586305e7afa8b0b3/jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6", size = 388608, upload-time = "2025-05-18T19:03:12.911Z" }, - { url = "https://files.pythonhosted.org/packages/6d/64/67750672b4354ca20ca18d3d1ccf2c62a072e8a2d452ac3cf8ced73571ef/jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf", size = 352454, upload-time = "2025-05-18T19:03:14.741Z" }, - { url = "https://files.pythonhosted.org/packages/96/4d/5c4e36d48f169a54b53a305114be3efa2bbffd33b648cd1478a688f639c1/jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90", size = 391833, upload-time = "2025-05-18T19:03:16.426Z" }, - { url = "https://files.pythonhosted.org/packages/0b/de/ce4a6166a78810bd83763d2fa13f85f73cbd3743a325469a4a9289af6dae/jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0", size = 523646, upload-time = "2025-05-18T19:03:17.704Z" }, - { url = "https://files.pythonhosted.org/packages/a2/a6/3bc9acce53466972964cf4ad85efecb94f9244539ab6da1107f7aed82934/jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee", size = 514735, upload-time = "2025-05-18T19:03:19.44Z" }, - { url = "https://files.pythonhosted.org/packages/b4/d8/243c2ab8426a2a4dea85ba2a2ba43df379ccece2145320dfd4799b9633c5/jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4", size = 210747, upload-time = "2025-05-18T19:03:21.184Z" }, - { url = "https://files.pythonhosted.org/packages/37/7a/8021bd615ef7788b98fc76ff533eaac846322c170e93cbffa01979197a45/jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5", size = 207484, upload-time = "2025-05-18T19:03:23.046Z" }, - { url = "https://files.pythonhosted.org/packages/1b/dd/6cefc6bd68b1c3c979cecfa7029ab582b57690a31cd2f346c4d0ce7951b6/jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978", size = 317473, upload-time = "2025-05-18T19:03:25.942Z" }, - { url = "https://files.pythonhosted.org/packages/be/cf/fc33f5159ce132be1d8dd57251a1ec7a631c7df4bd11e1cd198308c6ae32/jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc", size = 321971, upload-time = "2025-05-18T19:03:27.255Z" }, - { url = "https://files.pythonhosted.org/packages/68/a4/da3f150cf1d51f6c472616fb7650429c7ce053e0c962b41b68557fdf6379/jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d", size = 345574, upload-time = "2025-05-18T19:03:28.63Z" }, - { url = "https://files.pythonhosted.org/packages/84/34/6e8d412e60ff06b186040e77da5f83bc158e9735759fcae65b37d681f28b/jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2", size = 371028, upload-time = "2025-05-18T19:03:30.292Z" }, - { url = "https://files.pythonhosted.org/packages/fb/d9/9ee86173aae4576c35a2f50ae930d2ccb4c4c236f6cb9353267aa1d626b7/jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61", size = 491083, upload-time = "2025-05-18T19:03:31.654Z" }, - { url = "https://files.pythonhosted.org/packages/d9/2c/f955de55e74771493ac9e188b0f731524c6a995dffdcb8c255b89c6fb74b/jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db", size = 388821, upload-time = "2025-05-18T19:03:33.184Z" }, - { url = "https://files.pythonhosted.org/packages/81/5a/0e73541b6edd3f4aada586c24e50626c7815c561a7ba337d6a7eb0a915b4/jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5", size = 352174, upload-time = "2025-05-18T19:03:34.965Z" }, - { url = "https://files.pythonhosted.org/packages/1c/c0/61eeec33b8c75b31cae42be14d44f9e6fe3ac15a4e58010256ac3abf3638/jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606", size = 391869, upload-time = "2025-05-18T19:03:36.436Z" }, - { url = "https://files.pythonhosted.org/packages/41/22/5beb5ee4ad4ef7d86f5ea5b4509f680a20706c4a7659e74344777efb7739/jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605", size = 523741, upload-time = "2025-05-18T19:03:38.168Z" }, - { url = "https://files.pythonhosted.org/packages/ea/10/768e8818538e5817c637b0df52e54366ec4cebc3346108a4457ea7a98f32/jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5", size = 514527, upload-time = "2025-05-18T19:03:39.577Z" }, - { url = "https://files.pythonhosted.org/packages/73/6d/29b7c2dc76ce93cbedabfd842fc9096d01a0550c52692dfc33d3cc889815/jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7", size = 210765, upload-time = "2025-05-18T19:03:41.271Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c9/d394706deb4c660137caf13e33d05a031d734eb99c051142e039d8ceb794/jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812", size = 209234, upload-time = "2025-05-18T19:03:42.918Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ee/9d/ae7ddb4b8ab3fb1b51faf4deb36cb48a4fbbd7cb36bad6a5fca4741306f7/jiter-0.10.0.tar.gz", hash = "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", size = 162759 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/7e/4011b5c77bec97cb2b572f566220364e3e21b51c48c5bd9c4a9c26b41b67/jiter-0.10.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303", size = 317215 }, + { url = "https://files.pythonhosted.org/packages/8a/4f/144c1b57c39692efc7ea7d8e247acf28e47d0912800b34d0ad815f6b2824/jiter-0.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e", size = 322814 }, + { url = "https://files.pythonhosted.org/packages/63/1f/db977336d332a9406c0b1f0b82be6f71f72526a806cbb2281baf201d38e3/jiter-0.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f", size = 345237 }, + { url = "https://files.pythonhosted.org/packages/d7/1c/aa30a4a775e8a672ad7f21532bdbfb269f0706b39c6ff14e1f86bdd9e5ff/jiter-0.10.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224", size = 370999 }, + { url = "https://files.pythonhosted.org/packages/35/df/f8257abc4207830cb18880781b5f5b716bad5b2a22fb4330cfd357407c5b/jiter-0.10.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7", size = 491109 }, + { url = "https://files.pythonhosted.org/packages/06/76/9e1516fd7b4278aa13a2cc7f159e56befbea9aa65c71586305e7afa8b0b3/jiter-0.10.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6", size = 388608 }, + { url = "https://files.pythonhosted.org/packages/6d/64/67750672b4354ca20ca18d3d1ccf2c62a072e8a2d452ac3cf8ced73571ef/jiter-0.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf", size = 352454 }, + { url = "https://files.pythonhosted.org/packages/96/4d/5c4e36d48f169a54b53a305114be3efa2bbffd33b648cd1478a688f639c1/jiter-0.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90", size = 391833 }, + { url = "https://files.pythonhosted.org/packages/0b/de/ce4a6166a78810bd83763d2fa13f85f73cbd3743a325469a4a9289af6dae/jiter-0.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0", size = 523646 }, + { url = "https://files.pythonhosted.org/packages/a2/a6/3bc9acce53466972964cf4ad85efecb94f9244539ab6da1107f7aed82934/jiter-0.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee", size = 514735 }, + { url = "https://files.pythonhosted.org/packages/b4/d8/243c2ab8426a2a4dea85ba2a2ba43df379ccece2145320dfd4799b9633c5/jiter-0.10.0-cp310-cp310-win32.whl", hash = "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4", size = 210747 }, + { url = "https://files.pythonhosted.org/packages/37/7a/8021bd615ef7788b98fc76ff533eaac846322c170e93cbffa01979197a45/jiter-0.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5", size = 207484 }, + { url = "https://files.pythonhosted.org/packages/1b/dd/6cefc6bd68b1c3c979cecfa7029ab582b57690a31cd2f346c4d0ce7951b6/jiter-0.10.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978", size = 317473 }, + { url = "https://files.pythonhosted.org/packages/be/cf/fc33f5159ce132be1d8dd57251a1ec7a631c7df4bd11e1cd198308c6ae32/jiter-0.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc", size = 321971 }, + { url = "https://files.pythonhosted.org/packages/68/a4/da3f150cf1d51f6c472616fb7650429c7ce053e0c962b41b68557fdf6379/jiter-0.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d", size = 345574 }, + { url = "https://files.pythonhosted.org/packages/84/34/6e8d412e60ff06b186040e77da5f83bc158e9735759fcae65b37d681f28b/jiter-0.10.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2", size = 371028 }, + { url = "https://files.pythonhosted.org/packages/fb/d9/9ee86173aae4576c35a2f50ae930d2ccb4c4c236f6cb9353267aa1d626b7/jiter-0.10.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61", size = 491083 }, + { url = "https://files.pythonhosted.org/packages/d9/2c/f955de55e74771493ac9e188b0f731524c6a995dffdcb8c255b89c6fb74b/jiter-0.10.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db", size = 388821 }, + { url = "https://files.pythonhosted.org/packages/81/5a/0e73541b6edd3f4aada586c24e50626c7815c561a7ba337d6a7eb0a915b4/jiter-0.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5", size = 352174 }, + { url = "https://files.pythonhosted.org/packages/1c/c0/61eeec33b8c75b31cae42be14d44f9e6fe3ac15a4e58010256ac3abf3638/jiter-0.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606", size = 391869 }, + { url = "https://files.pythonhosted.org/packages/41/22/5beb5ee4ad4ef7d86f5ea5b4509f680a20706c4a7659e74344777efb7739/jiter-0.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605", size = 523741 }, + { url = "https://files.pythonhosted.org/packages/ea/10/768e8818538e5817c637b0df52e54366ec4cebc3346108a4457ea7a98f32/jiter-0.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5", size = 514527 }, + { url = "https://files.pythonhosted.org/packages/73/6d/29b7c2dc76ce93cbedabfd842fc9096d01a0550c52692dfc33d3cc889815/jiter-0.10.0-cp311-cp311-win32.whl", hash = "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7", size = 210765 }, + { url = "https://files.pythonhosted.org/packages/c2/c9/d394706deb4c660137caf13e33d05a031d734eb99c051142e039d8ceb794/jiter-0.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812", size = 209234 }, ] [[package]] name = "joblib" version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475, upload-time = "2025-05-23T12:04:37.097Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746, upload-time = "2025-05-23T12:04:35.124Z" }, + { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746 }, ] [[package]] name = "json-repair" version = "0.30.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/7a/7745d0d908563a478421c7520649dfd6a5c551858e2233ff7caf20cb8df7/json_repair-0.30.3.tar.gz", hash = "sha256:0ac56e7ae9253ee9c507a7e1a3a26799c9b0bbe5e2bec1b2cc5053e90d5b05e3", size = 27803, upload-time = "2024-12-04T19:53:02.278Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/7a/7745d0d908563a478421c7520649dfd6a5c551858e2233ff7caf20cb8df7/json_repair-0.30.3.tar.gz", hash = "sha256:0ac56e7ae9253ee9c507a7e1a3a26799c9b0bbe5e2bec1b2cc5053e90d5b05e3", size = 27803 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/2d/79a46330c4b97ee90dd403fb0d267da7b25b24d7db604c5294e5c57d5f7c/json_repair-0.30.3-py3-none-any.whl", hash = "sha256:63bb588162b0958ae93d85356ecbe54c06b8c33f8a4834f93fa2719ea669804e", size = 18951, upload-time = "2024-12-04T19:53:00.612Z" }, + { url = "https://files.pythonhosted.org/packages/fd/2d/79a46330c4b97ee90dd403fb0d267da7b25b24d7db604c5294e5c57d5f7c/json_repair-0.30.3-py3-none-any.whl", hash = "sha256:63bb588162b0958ae93d85356ecbe54c06b8c33f8a4834f93fa2719ea669804e", size = 18951 }, ] [[package]] @@ -1094,9 +1093,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/00/a297a868e9d0784450faa7365c2172a7d6110c763e30ba861867c32ae6a9/jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f", size = 356830, upload-time = "2025-07-18T15:39:45.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/00/a297a868e9d0784450faa7365c2172a7d6110c763e30ba861867c32ae6a9/jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f", size = 356830 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/54/c86cd8e011fe98803d7e382fd67c0df5ceab8d2b7ad8c5a81524f791551c/jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716", size = 89184, upload-time = "2025-07-18T15:39:42.956Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/c86cd8e011fe98803d7e382fd67c0df5ceab8d2b7ad8c5a81524f791551c/jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716", size = 89184 }, ] [[package]] @@ -1106,9 +1105,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload-time = "2025-04-23T12:34:07.418Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513 } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" }, + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437 }, ] [[package]] @@ -1122,9 +1121,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" } +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" }, + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, ] [[package]] @@ -1136,53 +1135,53 @@ dependencies = [ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload-time = "2025-05-27T07:38:16.655Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload-time = "2025-05-27T07:38:15.137Z" }, + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, ] [[package]] name = "kiwisolver" version = "1.4.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538, upload-time = "2024-12-24T18:30:51.519Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623, upload-time = "2024-12-24T18:28:17.687Z" }, - { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720, upload-time = "2024-12-24T18:28:19.158Z" }, - { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413, upload-time = "2024-12-24T18:28:20.064Z" }, - { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826, upload-time = "2024-12-24T18:28:21.203Z" }, - { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231, upload-time = "2024-12-24T18:28:23.851Z" }, - { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938, upload-time = "2024-12-24T18:28:26.687Z" }, - { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799, upload-time = "2024-12-24T18:28:30.538Z" }, - { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362, upload-time = "2024-12-24T18:28:32.943Z" }, - { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695, upload-time = "2024-12-24T18:28:35.641Z" }, - { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802, upload-time = "2024-12-24T18:28:38.357Z" }, - { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646, upload-time = "2024-12-24T18:28:40.941Z" }, - { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260, upload-time = "2024-12-24T18:28:42.273Z" }, - { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633, upload-time = "2024-12-24T18:28:44.87Z" }, - { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885, upload-time = "2024-12-24T18:28:47.346Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175, upload-time = "2024-12-24T18:28:49.651Z" }, - { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635, upload-time = "2024-12-24T18:28:51.826Z" }, - { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717, upload-time = "2024-12-24T18:28:54.256Z" }, - { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413, upload-time = "2024-12-24T18:28:55.184Z" }, - { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994, upload-time = "2024-12-24T18:28:57.493Z" }, - { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804, upload-time = "2024-12-24T18:29:00.077Z" }, - { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690, upload-time = "2024-12-24T18:29:01.401Z" }, - { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839, upload-time = "2024-12-24T18:29:02.685Z" }, - { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109, upload-time = "2024-12-24T18:29:04.113Z" }, - { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269, upload-time = "2024-12-24T18:29:05.488Z" }, - { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468, upload-time = "2024-12-24T18:29:06.79Z" }, - { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394, upload-time = "2024-12-24T18:29:08.24Z" }, - { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901, upload-time = "2024-12-24T18:29:09.653Z" }, - { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306, upload-time = "2024-12-24T18:29:12.644Z" }, - { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966, upload-time = "2024-12-24T18:29:14.089Z" }, - { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311, upload-time = "2024-12-24T18:29:15.892Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403, upload-time = "2024-12-24T18:30:41.372Z" }, - { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657, upload-time = "2024-12-24T18:30:42.392Z" }, - { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948, upload-time = "2024-12-24T18:30:44.703Z" }, - { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186, upload-time = "2024-12-24T18:30:45.654Z" }, - { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279, upload-time = "2024-12-24T18:30:47.951Z" }, - { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762, upload-time = "2024-12-24T18:30:48.903Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623 }, + { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720 }, + { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826 }, + { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231 }, + { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938 }, + { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799 }, + { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362 }, + { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695 }, + { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646 }, + { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260 }, + { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633 }, + { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885 }, + { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175 }, + { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, + { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, + { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, + { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, + { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, + { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, + { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, + { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, + { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, + { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, + { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, + { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, + { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, + { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403 }, + { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657 }, + { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948 }, + { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186 }, + { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279 }, + { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762 }, ] [[package]] @@ -1198,12 +1197,12 @@ dependencies = [ { name = "tqdm" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/ed/58e04eaf815acd6b75ad7db8a6a61d01eccc5cb2191d431c0d5f234cf20a/lancedb-0.17.0-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:40aac1583edda390e51189c4e95bdfd4768d23705234e12a7b81957f1143df42", size = 26393821, upload-time = "2024-12-06T17:57:29.699Z" }, - { url = "https://files.pythonhosted.org/packages/87/a9/14807f23f0fb415453626ba4ea7431ab62f0906bd0ef1df24680fd5ae2df/lancedb-0.17.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:895bed499dae61cac1dbfc40ad71a566e06ab5c8d538aa57873a0cba859f8a7a", size = 24846600, upload-time = "2024-12-06T17:39:43.739Z" }, - { url = "https://files.pythonhosted.org/packages/a5/46/4a5af607b9904d76344b56e62d6799ce7ae8f6c835bf05d1678313ca877f/lancedb-0.17.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea688d0f63796ee912a7cfe6667f36661e36756fa8340b94dd54d666a7db63f", size = 30443392, upload-time = "2024-12-06T17:31:41.92Z" }, - { url = "https://files.pythonhosted.org/packages/eb/03/4eb452f02a740ab1cfa334570384f10810890b2670ef6277af7abcb0039d/lancedb-0.17.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:f51a61950ead30a605b5653a81e8362e4aac6fec32705b88b9c9319e9308b2bb", size = 28242872, upload-time = "2024-12-06T17:32:03.134Z" }, - { url = "https://files.pythonhosted.org/packages/b2/11/c48248f984dfd8dfec0bb074465ca697cf64b6b71b0aa199c15ad0153597/lancedb-0.17.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:07e6f10b3fcbeb6c737996e5ebd68d04c3ca2656a9b8b970111ecf368245e7f6", size = 29925342, upload-time = "2024-12-06T17:31:37.967Z" }, - { url = "https://files.pythonhosted.org/packages/34/b9/a3d4bfdaefbc9098ef18bff2cf403c6060f70894c5022983464f9c3db367/lancedb-0.17.0-cp39-abi3-win_amd64.whl", hash = "sha256:9d7e82f83f430d906c285d3303729258b21b1cc8da634c9f7017e354bcb7318a", size = 27511050, upload-time = "2024-12-06T17:55:58.08Z" }, + { url = "https://files.pythonhosted.org/packages/fb/ed/58e04eaf815acd6b75ad7db8a6a61d01eccc5cb2191d431c0d5f234cf20a/lancedb-0.17.0-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:40aac1583edda390e51189c4e95bdfd4768d23705234e12a7b81957f1143df42", size = 26393821 }, + { url = "https://files.pythonhosted.org/packages/87/a9/14807f23f0fb415453626ba4ea7431ab62f0906bd0ef1df24680fd5ae2df/lancedb-0.17.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:895bed499dae61cac1dbfc40ad71a566e06ab5c8d538aa57873a0cba859f8a7a", size = 24846600 }, + { url = "https://files.pythonhosted.org/packages/a5/46/4a5af607b9904d76344b56e62d6799ce7ae8f6c835bf05d1678313ca877f/lancedb-0.17.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea688d0f63796ee912a7cfe6667f36661e36756fa8340b94dd54d666a7db63f", size = 30443392 }, + { url = "https://files.pythonhosted.org/packages/eb/03/4eb452f02a740ab1cfa334570384f10810890b2670ef6277af7abcb0039d/lancedb-0.17.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:f51a61950ead30a605b5653a81e8362e4aac6fec32705b88b9c9319e9308b2bb", size = 28242872 }, + { url = "https://files.pythonhosted.org/packages/b2/11/c48248f984dfd8dfec0bb074465ca697cf64b6b71b0aa199c15ad0153597/lancedb-0.17.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:07e6f10b3fcbeb6c737996e5ebd68d04c3ca2656a9b8b970111ecf368245e7f6", size = 29925342 }, + { url = "https://files.pythonhosted.org/packages/34/b9/a3d4bfdaefbc9098ef18bff2cf403c6060f70894c5022983464f9c3db367/lancedb-0.17.0-cp39-abi3-win_amd64.whl", hash = "sha256:9d7e82f83f430d906c285d3303729258b21b1cc8da634c9f7017e354bcb7318a", size = 27511050 }, ] [[package]] @@ -1213,9 +1212,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "language-data" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3a/7a/5a97e327063409a5caa21541e6d08ae4a0f2da328447e9f2c7b39e179226/langcodes-3.5.0.tar.gz", hash = "sha256:1eef8168d07e51e131a2497ffecad4b663f6208e7c3ae3b8dc15c51734a6f801", size = 191030, upload-time = "2024-11-19T10:23:45.546Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/7a/5a97e327063409a5caa21541e6d08ae4a0f2da328447e9f2c7b39e179226/langcodes-3.5.0.tar.gz", hash = "sha256:1eef8168d07e51e131a2497ffecad4b663f6208e7c3ae3b8dc15c51734a6f801", size = 191030 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6b/068c2ea7a712bf805c62445bd9e9c06d7340358ef2824150eceac027444b/langcodes-3.5.0-py3-none-any.whl", hash = "sha256:853c69d1a35e0e13da2f427bb68fb2fa4a8f4fb899e0c62ad8df8d073dcfed33", size = 182974, upload-time = "2024-11-19T10:23:42.824Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6b/068c2ea7a712bf805c62445bd9e9c06d7340358ef2824150eceac027444b/langcodes-3.5.0-py3-none-any.whl", hash = "sha256:853c69d1a35e0e13da2f427bb68fb2fa4a8f4fb899e0c62ad8df8d073dcfed33", size = 182974 }, ] [[package]] @@ -1225,27 +1224,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "marisa-trie" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/ce/3f144716a9f2cbf42aa86ebc8b085a184be25c80aa453eea17c294d239c1/language_data-1.3.0.tar.gz", hash = "sha256:7600ef8aa39555145d06c89f0c324bf7dab834ea0b0a439d8243762e3ebad7ec", size = 5129310, upload-time = "2024-11-19T10:21:37.912Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/ce/3f144716a9f2cbf42aa86ebc8b085a184be25c80aa453eea17c294d239c1/language_data-1.3.0.tar.gz", hash = "sha256:7600ef8aa39555145d06c89f0c324bf7dab834ea0b0a439d8243762e3ebad7ec", size = 5129310 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/e9/5a5ffd9b286db82be70d677d0a91e4d58f7912bb8dd026ddeeb4abe70679/language_data-1.3.0-py3-none-any.whl", hash = "sha256:e2ee943551b5ae5f89cd0e801d1fc3835bb0ef5b7e9c3a4e8e17b2b214548fbf", size = 5385760, upload-time = "2024-11-19T10:21:36.005Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e9/5a5ffd9b286db82be70d677d0a91e4d58f7912bb8dd026ddeeb4abe70679/language_data-1.3.0-py3-none-any.whl", hash = "sha256:e2ee943551b5ae5f89cd0e801d1fc3835bb0ef5b7e9c3a4e8e17b2b214548fbf", size = 5385760 }, ] [[package]] name = "llvmlite" version = "0.44.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880, upload-time = "2025-01-20T11:14:41.342Z" } +sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/75/d4863ddfd8ab5f6e70f4504cf8cc37f4e986ec6910f4ef8502bb7d3c1c71/llvmlite-0.44.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9fbadbfba8422123bab5535b293da1cf72f9f478a65645ecd73e781f962ca614", size = 28132306, upload-time = "2025-01-20T11:12:18.634Z" }, - { url = "https://files.pythonhosted.org/packages/37/d9/6e8943e1515d2f1003e8278819ec03e4e653e2eeb71e4d00de6cfe59424e/llvmlite-0.44.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cccf8eb28f24840f2689fb1a45f9c0f7e582dd24e088dcf96e424834af11f791", size = 26201096, upload-time = "2025-01-20T11:12:24.544Z" }, - { url = "https://files.pythonhosted.org/packages/aa/46/8ffbc114def88cc698906bf5acab54ca9fdf9214fe04aed0e71731fb3688/llvmlite-0.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7202b678cdf904823c764ee0fe2dfe38a76981f4c1e51715b4cb5abb6cf1d9e8", size = 42361859, upload-time = "2025-01-20T11:12:31.839Z" }, - { url = "https://files.pythonhosted.org/packages/30/1c/9366b29ab050a726af13ebaae8d0dff00c3c58562261c79c635ad4f5eb71/llvmlite-0.44.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40526fb5e313d7b96bda4cbb2c85cd5374e04d80732dd36a282d72a560bb6408", size = 41184199, upload-time = "2025-01-20T11:12:40.049Z" }, - { url = "https://files.pythonhosted.org/packages/69/07/35e7c594b021ecb1938540f5bce543ddd8713cff97f71d81f021221edc1b/llvmlite-0.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:41e3839150db4330e1b2716c0be3b5c4672525b4c9005e17c7597f835f351ce2", size = 30332381, upload-time = "2025-01-20T11:12:47.054Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e2/86b245397052386595ad726f9742e5223d7aea999b18c518a50e96c3aca4/llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", size = 28132305, upload-time = "2025-01-20T11:12:53.936Z" }, - { url = "https://files.pythonhosted.org/packages/ff/ec/506902dc6870249fbe2466d9cf66d531265d0f3a1157213c8f986250c033/llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427", size = 26201090, upload-time = "2025-01-20T11:12:59.847Z" }, - { url = "https://files.pythonhosted.org/packages/99/fe/d030f1849ebb1f394bb3f7adad5e729b634fb100515594aca25c354ffc62/llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1", size = 42361858, upload-time = "2025-01-20T11:13:07.623Z" }, - { url = "https://files.pythonhosted.org/packages/d7/7a/ce6174664b9077fc673d172e4c888cb0b128e707e306bc33fff8c2035f0d/llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610", size = 41184200, upload-time = "2025-01-20T11:13:20.058Z" }, - { url = "https://files.pythonhosted.org/packages/5f/c6/258801143975a6d09a373f2641237992496e15567b907a4d401839d671b8/llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955", size = 30331193, upload-time = "2025-01-20T11:13:26.976Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/d4863ddfd8ab5f6e70f4504cf8cc37f4e986ec6910f4ef8502bb7d3c1c71/llvmlite-0.44.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:9fbadbfba8422123bab5535b293da1cf72f9f478a65645ecd73e781f962ca614", size = 28132306 }, + { url = "https://files.pythonhosted.org/packages/37/d9/6e8943e1515d2f1003e8278819ec03e4e653e2eeb71e4d00de6cfe59424e/llvmlite-0.44.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cccf8eb28f24840f2689fb1a45f9c0f7e582dd24e088dcf96e424834af11f791", size = 26201096 }, + { url = "https://files.pythonhosted.org/packages/aa/46/8ffbc114def88cc698906bf5acab54ca9fdf9214fe04aed0e71731fb3688/llvmlite-0.44.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7202b678cdf904823c764ee0fe2dfe38a76981f4c1e51715b4cb5abb6cf1d9e8", size = 42361859 }, + { url = "https://files.pythonhosted.org/packages/30/1c/9366b29ab050a726af13ebaae8d0dff00c3c58562261c79c635ad4f5eb71/llvmlite-0.44.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40526fb5e313d7b96bda4cbb2c85cd5374e04d80732dd36a282d72a560bb6408", size = 41184199 }, + { url = "https://files.pythonhosted.org/packages/69/07/35e7c594b021ecb1938540f5bce543ddd8713cff97f71d81f021221edc1b/llvmlite-0.44.0-cp310-cp310-win_amd64.whl", hash = "sha256:41e3839150db4330e1b2716c0be3b5c4672525b4c9005e17c7597f835f351ce2", size = 30332381 }, + { url = "https://files.pythonhosted.org/packages/b5/e2/86b245397052386595ad726f9742e5223d7aea999b18c518a50e96c3aca4/llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", size = 28132305 }, + { url = "https://files.pythonhosted.org/packages/ff/ec/506902dc6870249fbe2466d9cf66d531265d0f3a1157213c8f986250c033/llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427", size = 26201090 }, + { url = "https://files.pythonhosted.org/packages/99/fe/d030f1849ebb1f394bb3f7adad5e729b634fb100515594aca25c354ffc62/llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1", size = 42361858 }, + { url = "https://files.pythonhosted.org/packages/d7/7a/ce6174664b9077fc673d172e4c888cb0b128e707e306bc33fff8c2035f0d/llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610", size = 41184200 }, + { url = "https://files.pythonhosted.org/packages/5f/c6/258801143975a6d09a373f2641237992496e15567b907a4d401839d671b8/llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955", size = 30331193 }, ] [[package]] @@ -1255,30 +1254,30 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/31/15/9d9743897e4450b2de199ee673b50cb018980c4ced477d41cf91304a85e3/marisa_trie-1.2.1.tar.gz", hash = "sha256:3a27c408e2aefc03e0f1d25b2ff2afb85aac3568f6fa2ae2a53b57a2e87ce29d", size = 416124, upload-time = "2024-10-12T11:30:15.989Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/83/ccf5b33f2123f3110705c608f8e0caa82002626511aafafc58f82e50d322/marisa_trie-1.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2eb41d2f9114d8b7bd66772c237111e00d2bae2260824560eaa0a1e291ce9e8", size = 362200, upload-time = "2024-10-12T11:28:25.418Z" }, - { url = "https://files.pythonhosted.org/packages/9d/74/f7ce1fc2ee480c7f8ceadd9b992caceaba442a97e5e99d6aea00d3635a0b/marisa_trie-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e956e6a46f604b17d570901e66f5214fb6f658c21e5e7665deace236793cef6", size = 192309, upload-time = "2024-10-12T11:28:27.348Z" }, - { url = "https://files.pythonhosted.org/packages/e4/52/5dbbc13e57ce54c2ef0d04962d7d8f66edc69ed34310c734a2913199a581/marisa_trie-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bd45142501300e7538b2e544905580918b67b1c82abed1275fe4c682c95635fa", size = 174713, upload-time = "2024-10-12T11:28:28.912Z" }, - { url = "https://files.pythonhosted.org/packages/57/49/2580372f3f980aea95c23d05b2c1d3bbb9ee1ab8cfd441545153e44f1be7/marisa_trie-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8443d116c612cfd1961fbf76769faf0561a46d8e317315dd13f9d9639ad500c", size = 1314808, upload-time = "2024-10-12T11:28:30.705Z" }, - { url = "https://files.pythonhosted.org/packages/5a/ba/e12a4d450f265414cc68df6a116a78beece72b95f774f04d29cd48e08d19/marisa_trie-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:875a6248e60fbb48d947b574ffa4170f34981f9e579bde960d0f9a49ea393ecc", size = 1346678, upload-time = "2024-10-12T11:28:33.106Z" }, - { url = "https://files.pythonhosted.org/packages/b2/81/8e130cb1eea741fd17694d821096f7ec9841f0e3d3c69b740257f5eeafa8/marisa_trie-1.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:746a7c60a17fccd3cfcfd4326926f02ea4fcdfc25d513411a0c4fc8e4a1ca51f", size = 1307254, upload-time = "2024-10-12T11:28:35.053Z" }, - { url = "https://files.pythonhosted.org/packages/d7/d0/3deb5ea2bf7e4d845339875dbb31f3c3f66c8d6568723db1d137fb08a91c/marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e70869737cc0e5bd903f620667da6c330d6737048d1f44db792a6af68a1d35be", size = 2194712, upload-time = "2024-10-12T11:28:36.87Z" }, - { url = "https://files.pythonhosted.org/packages/9c/5f/b38d728dd30954816497b53425cfaddaf7b93ac0912db5911888f191b07a/marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06b099dd743676dbcd8abd8465ceac8f6d97d8bfaabe2c83b965495523b4cef2", size = 2355625, upload-time = "2024-10-12T11:28:38.206Z" }, - { url = "https://files.pythonhosted.org/packages/7e/4f/61c0faa9ae9e53600a1b7a0c367bc9db1a4fdc625402ec232c755a05e094/marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d2a82eb21afdaf22b50d9b996472305c05ca67fc4ff5a026a220320c9c961db6", size = 2290290, upload-time = "2024-10-12T11:28:40.148Z" }, - { url = "https://files.pythonhosted.org/packages/7c/7d/713b970fb3043248881ed776dbf4d54918398aa5dde843a38711d0d62c8f/marisa_trie-1.2.1-cp310-cp310-win32.whl", hash = "sha256:8951e7ce5d3167fbd085703b4cbb3f47948ed66826bef9a2173c379508776cf5", size = 130743, upload-time = "2024-10-12T11:28:41.31Z" }, - { url = "https://files.pythonhosted.org/packages/cc/94/3d619cc82c30daeacd18a88674f4e6540ebfb7b4b7752ca0552793be80cf/marisa_trie-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:5685a14b3099b1422c4f59fa38b0bf4b5342ee6cc38ae57df9666a0b28eeaad3", size = 151891, upload-time = "2024-10-12T11:28:42.279Z" }, - { url = "https://files.pythonhosted.org/packages/4a/93/ffb01dfa22b6eee918e798e0bc3487427036c608aa4c065725f31aaf4104/marisa_trie-1.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed3fb4ed7f2084597e862bcd56c56c5529e773729a426c083238682dba540e98", size = 362823, upload-time = "2024-10-12T11:28:43.983Z" }, - { url = "https://files.pythonhosted.org/packages/6d/1d/5c36500ac350c278c9bdfd88e17fa846fa4136d75597c167141ed973cdf2/marisa_trie-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe69fb9ffb2767746181f7b3b29bbd3454d1d24717b5958e030494f3d3cddf3", size = 192741, upload-time = "2024-10-12T11:28:45.536Z" }, - { url = "https://files.pythonhosted.org/packages/e8/04/87dd0840f3f720e511eba56193c02bf64d7d96df1ca9f6d19994f55154be/marisa_trie-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4728ed3ae372d1ea2cdbd5eaa27b8f20a10e415d1f9d153314831e67d963f281", size = 174995, upload-time = "2024-10-12T11:28:46.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/51/9e903a7e13b7593e2e675d0ec4c390ca076dc5df1c1a0d5e85a513b886a3/marisa_trie-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cf4f25cf895692b232f49aa5397af6aba78bb679fb917a05fce8d3cb1ee446d", size = 1384728, upload-time = "2024-10-12T11:28:48.28Z" }, - { url = "https://files.pythonhosted.org/packages/e8/3f/7362a5ac60c2b0aad0f52cd57e7bd0c708f20d2660d8df85360f3d8f1c4b/marisa_trie-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cca7f96236ffdbf49be4b2e42c132e3df05968ac424544034767650913524de", size = 1412620, upload-time = "2024-10-12T11:28:50.427Z" }, - { url = "https://files.pythonhosted.org/packages/1f/bc/aaa3eaf6875f78a204a8da9692d56e3a36f89997dad2c388628385614576/marisa_trie-1.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7eb20bf0e8b55a58d2a9b518aabc4c18278787bdba476c551dd1c1ed109e509", size = 1361555, upload-time = "2024-10-12T11:28:51.603Z" }, - { url = "https://files.pythonhosted.org/packages/18/98/e11b5a6206c5d110f32adab37fa84a85410d684e9c731acdd5c9250e2ce4/marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b1ec93f0d1ee6d7ab680a6d8ea1a08bf264636358e92692072170032dda652ba", size = 2257717, upload-time = "2024-10-12T11:28:52.881Z" }, - { url = "https://files.pythonhosted.org/packages/d2/9d/6b4a40867875e738a67c5b29f83e2e490a66bd9067ace3dd9a5c497e2b7f/marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e2699255d7ac610dee26d4ae7bda5951d05c7d9123a22e1f7c6a6f1964e0a4e4", size = 2417044, upload-time = "2024-10-12T11:28:54.115Z" }, - { url = "https://files.pythonhosted.org/packages/fe/61/e25613c72f2931757334b8bcf6b501569ef713f5ee9c6c7688ec460bd720/marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c484410911182457a8a1a0249d0c09c01e2071b78a0a8538cd5f7fa45589b13a", size = 2351960, upload-time = "2024-10-12T11:28:55.417Z" }, - { url = "https://files.pythonhosted.org/packages/19/0a/a90ccaf3eb476d13ec261f80c6c52defaf10ebc7f35eb2bcd7dfb533aef7/marisa_trie-1.2.1-cp311-cp311-win32.whl", hash = "sha256:ad548117744b2bcf0e3d97374608be0a92d18c2af13d98b728d37cd06248e571", size = 130446, upload-time = "2024-10-12T11:28:57.294Z" }, - { url = "https://files.pythonhosted.org/packages/fc/98/574b4e143e0a2f5f71af8716b6c4a8a46220f75a6e0847ce7d11ee0ba4aa/marisa_trie-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:436f62d27714970b9cdd3b3c41bdad046f260e62ebb0daa38125ef70536fc73b", size = 152037, upload-time = "2024-10-12T11:28:58.399Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/31/15/9d9743897e4450b2de199ee673b50cb018980c4ced477d41cf91304a85e3/marisa_trie-1.2.1.tar.gz", hash = "sha256:3a27c408e2aefc03e0f1d25b2ff2afb85aac3568f6fa2ae2a53b57a2e87ce29d", size = 416124 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/83/ccf5b33f2123f3110705c608f8e0caa82002626511aafafc58f82e50d322/marisa_trie-1.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2eb41d2f9114d8b7bd66772c237111e00d2bae2260824560eaa0a1e291ce9e8", size = 362200 }, + { url = "https://files.pythonhosted.org/packages/9d/74/f7ce1fc2ee480c7f8ceadd9b992caceaba442a97e5e99d6aea00d3635a0b/marisa_trie-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e956e6a46f604b17d570901e66f5214fb6f658c21e5e7665deace236793cef6", size = 192309 }, + { url = "https://files.pythonhosted.org/packages/e4/52/5dbbc13e57ce54c2ef0d04962d7d8f66edc69ed34310c734a2913199a581/marisa_trie-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bd45142501300e7538b2e544905580918b67b1c82abed1275fe4c682c95635fa", size = 174713 }, + { url = "https://files.pythonhosted.org/packages/57/49/2580372f3f980aea95c23d05b2c1d3bbb9ee1ab8cfd441545153e44f1be7/marisa_trie-1.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8443d116c612cfd1961fbf76769faf0561a46d8e317315dd13f9d9639ad500c", size = 1314808 }, + { url = "https://files.pythonhosted.org/packages/5a/ba/e12a4d450f265414cc68df6a116a78beece72b95f774f04d29cd48e08d19/marisa_trie-1.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:875a6248e60fbb48d947b574ffa4170f34981f9e579bde960d0f9a49ea393ecc", size = 1346678 }, + { url = "https://files.pythonhosted.org/packages/b2/81/8e130cb1eea741fd17694d821096f7ec9841f0e3d3c69b740257f5eeafa8/marisa_trie-1.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:746a7c60a17fccd3cfcfd4326926f02ea4fcdfc25d513411a0c4fc8e4a1ca51f", size = 1307254 }, + { url = "https://files.pythonhosted.org/packages/d7/d0/3deb5ea2bf7e4d845339875dbb31f3c3f66c8d6568723db1d137fb08a91c/marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e70869737cc0e5bd903f620667da6c330d6737048d1f44db792a6af68a1d35be", size = 2194712 }, + { url = "https://files.pythonhosted.org/packages/9c/5f/b38d728dd30954816497b53425cfaddaf7b93ac0912db5911888f191b07a/marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06b099dd743676dbcd8abd8465ceac8f6d97d8bfaabe2c83b965495523b4cef2", size = 2355625 }, + { url = "https://files.pythonhosted.org/packages/7e/4f/61c0faa9ae9e53600a1b7a0c367bc9db1a4fdc625402ec232c755a05e094/marisa_trie-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d2a82eb21afdaf22b50d9b996472305c05ca67fc4ff5a026a220320c9c961db6", size = 2290290 }, + { url = "https://files.pythonhosted.org/packages/7c/7d/713b970fb3043248881ed776dbf4d54918398aa5dde843a38711d0d62c8f/marisa_trie-1.2.1-cp310-cp310-win32.whl", hash = "sha256:8951e7ce5d3167fbd085703b4cbb3f47948ed66826bef9a2173c379508776cf5", size = 130743 }, + { url = "https://files.pythonhosted.org/packages/cc/94/3d619cc82c30daeacd18a88674f4e6540ebfb7b4b7752ca0552793be80cf/marisa_trie-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:5685a14b3099b1422c4f59fa38b0bf4b5342ee6cc38ae57df9666a0b28eeaad3", size = 151891 }, + { url = "https://files.pythonhosted.org/packages/4a/93/ffb01dfa22b6eee918e798e0bc3487427036c608aa4c065725f31aaf4104/marisa_trie-1.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed3fb4ed7f2084597e862bcd56c56c5529e773729a426c083238682dba540e98", size = 362823 }, + { url = "https://files.pythonhosted.org/packages/6d/1d/5c36500ac350c278c9bdfd88e17fa846fa4136d75597c167141ed973cdf2/marisa_trie-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fe69fb9ffb2767746181f7b3b29bbd3454d1d24717b5958e030494f3d3cddf3", size = 192741 }, + { url = "https://files.pythonhosted.org/packages/e8/04/87dd0840f3f720e511eba56193c02bf64d7d96df1ca9f6d19994f55154be/marisa_trie-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4728ed3ae372d1ea2cdbd5eaa27b8f20a10e415d1f9d153314831e67d963f281", size = 174995 }, + { url = "https://files.pythonhosted.org/packages/c9/51/9e903a7e13b7593e2e675d0ec4c390ca076dc5df1c1a0d5e85a513b886a3/marisa_trie-1.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cf4f25cf895692b232f49aa5397af6aba78bb679fb917a05fce8d3cb1ee446d", size = 1384728 }, + { url = "https://files.pythonhosted.org/packages/e8/3f/7362a5ac60c2b0aad0f52cd57e7bd0c708f20d2660d8df85360f3d8f1c4b/marisa_trie-1.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cca7f96236ffdbf49be4b2e42c132e3df05968ac424544034767650913524de", size = 1412620 }, + { url = "https://files.pythonhosted.org/packages/1f/bc/aaa3eaf6875f78a204a8da9692d56e3a36f89997dad2c388628385614576/marisa_trie-1.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d7eb20bf0e8b55a58d2a9b518aabc4c18278787bdba476c551dd1c1ed109e509", size = 1361555 }, + { url = "https://files.pythonhosted.org/packages/18/98/e11b5a6206c5d110f32adab37fa84a85410d684e9c731acdd5c9250e2ce4/marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b1ec93f0d1ee6d7ab680a6d8ea1a08bf264636358e92692072170032dda652ba", size = 2257717 }, + { url = "https://files.pythonhosted.org/packages/d2/9d/6b4a40867875e738a67c5b29f83e2e490a66bd9067ace3dd9a5c497e2b7f/marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e2699255d7ac610dee26d4ae7bda5951d05c7d9123a22e1f7c6a6f1964e0a4e4", size = 2417044 }, + { url = "https://files.pythonhosted.org/packages/fe/61/e25613c72f2931757334b8bcf6b501569ef713f5ee9c6c7688ec460bd720/marisa_trie-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c484410911182457a8a1a0249d0c09c01e2071b78a0a8538cd5f7fa45589b13a", size = 2351960 }, + { url = "https://files.pythonhosted.org/packages/19/0a/a90ccaf3eb476d13ec261f80c6c52defaf10ebc7f35eb2bcd7dfb533aef7/marisa_trie-1.2.1-cp311-cp311-win32.whl", hash = "sha256:ad548117744b2bcf0e3d97374608be0a92d18c2af13d98b728d37cd06248e571", size = 130446 }, + { url = "https://files.pythonhosted.org/packages/fc/98/574b4e143e0a2f5f71af8716b6c4a8a46220f75a6e0847ce7d11ee0ba4aa/marisa_trie-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:436f62d27714970b9cdd3b3c41bdad046f260e62ebb0daa38125ef70536fc73b", size = 152037 }, ] [[package]] @@ -1288,37 +1287,37 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357, upload-time = "2024-10-18T15:20:51.44Z" }, - { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393, upload-time = "2024-10-18T15:20:52.426Z" }, - { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732, upload-time = "2024-10-18T15:20:53.578Z" }, - { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866, upload-time = "2024-10-18T15:20:55.06Z" }, - { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964, upload-time = "2024-10-18T15:20:55.906Z" }, - { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977, upload-time = "2024-10-18T15:20:57.189Z" }, - { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366, upload-time = "2024-10-18T15:20:58.235Z" }, - { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091, upload-time = "2024-10-18T15:20:59.235Z" }, - { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065, upload-time = "2024-10-18T15:21:00.307Z" }, - { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514, upload-time = "2024-10-18T15:21:01.122Z" }, - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, ] [[package]] @@ -1329,9 +1328,9 @@ dependencies = [ { name = "backports-datetime-fromisoformat", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/ff/26df5a9f5ac57ccf693a5854916ab47243039d2aa9e0fe5f5a0331e7b74b/marshmallow-4.0.0.tar.gz", hash = "sha256:3b6e80aac299a7935cfb97ed01d1854fb90b5079430969af92118ea1b12a8d55", size = 220507, upload-time = "2025-04-17T02:25:54.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/ff/26df5a9f5ac57ccf693a5854916ab47243039d2aa9e0fe5f5a0331e7b74b/marshmallow-4.0.0.tar.gz", hash = "sha256:3b6e80aac299a7935cfb97ed01d1854fb90b5079430969af92118ea1b12a8d55", size = 220507 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/26/6cc45d156f44dbe1d5696d9e54042e4dcaf7b946c0b86df6a97d29706f32/marshmallow-4.0.0-py3-none-any.whl", hash = "sha256:e7b0528337e9990fd64950f8a6b3a1baabed09ad17a0dfb844d701151f92d203", size = 48420, upload-time = "2025-04-17T02:25:53.375Z" }, + { url = "https://files.pythonhosted.org/packages/d6/26/6cc45d156f44dbe1d5696d9e54042e4dcaf7b946c0b86df6a97d29706f32/marshmallow-4.0.0-py3-none-any.whl", hash = "sha256:e7b0528337e9990fd64950f8a6b3a1baabed09ad17a0dfb844d701151f92d203", size = 48420 }, ] [[package]] @@ -1350,23 +1349,23 @@ dependencies = [ { name = "pyparsing" }, { name = "python-dateutil" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811, upload-time = "2025-05-08T19:10:54.39Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/91/d49359a21893183ed2a5b6c76bec40e0b1dcbf8ca148f864d134897cfc75/matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0", size = 34799811 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/ea/2bba25d289d389c7451f331ecd593944b3705f06ddf593fa7be75037d308/matplotlib-3.10.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7", size = 8167862, upload-time = "2025-05-08T19:09:39.563Z" }, - { url = "https://files.pythonhosted.org/packages/41/81/cc70b5138c926604e8c9ed810ed4c79e8116ba72e02230852f5c12c87ba2/matplotlib-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb", size = 8042149, upload-time = "2025-05-08T19:09:42.413Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9a/0ff45b6bfa42bb16de597e6058edf2361c298ad5ef93b327728145161bbf/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb", size = 8453719, upload-time = "2025-05-08T19:09:44.901Z" }, - { url = "https://files.pythonhosted.org/packages/85/c7/1866e972fed6d71ef136efbc980d4d1854ab7ef1ea8152bbd995ca231c81/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30", size = 8590801, upload-time = "2025-05-08T19:09:47.404Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b9/748f6626d534ab7e255bdc39dc22634d337cf3ce200f261b5d65742044a1/matplotlib-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8", size = 9402111, upload-time = "2025-05-08T19:09:49.474Z" }, - { url = "https://files.pythonhosted.org/packages/1f/78/8bf07bd8fb67ea5665a6af188e70b57fcb2ab67057daa06b85a08e59160a/matplotlib-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd", size = 8057213, upload-time = "2025-05-08T19:09:51.489Z" }, - { url = "https://files.pythonhosted.org/packages/f5/bd/af9f655456f60fe1d575f54fb14704ee299b16e999704817a7645dfce6b0/matplotlib-3.10.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8", size = 8178873, upload-time = "2025-05-08T19:09:53.857Z" }, - { url = "https://files.pythonhosted.org/packages/c2/86/e1c86690610661cd716eda5f9d0b35eaf606ae6c9b6736687cfc8f2d0cd8/matplotlib-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d", size = 8052205, upload-time = "2025-05-08T19:09:55.684Z" }, - { url = "https://files.pythonhosted.org/packages/54/51/a9f8e49af3883dacddb2da1af5fca1f7468677f1188936452dd9aaaeb9ed/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049", size = 8465823, upload-time = "2025-05-08T19:09:57.442Z" }, - { url = "https://files.pythonhosted.org/packages/e7/e3/c82963a3b86d6e6d5874cbeaa390166458a7f1961bab9feb14d3d1a10f02/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b", size = 8606464, upload-time = "2025-05-08T19:09:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/0e/34/24da1027e7fcdd9e82da3194c470143c551852757a4b473a09a012f5b945/matplotlib-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220", size = 9413103, upload-time = "2025-05-08T19:10:03.208Z" }, - { url = "https://files.pythonhosted.org/packages/a6/da/948a017c3ea13fd4a97afad5fdebe2f5bbc4d28c0654510ce6fd6b06b7bd/matplotlib-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1", size = 8065492, upload-time = "2025-05-08T19:10:05.271Z" }, - { url = "https://files.pythonhosted.org/packages/3d/d1/f54d43e95384b312ffa4a74a4326c722f3b8187aaaa12e9a84cdf3037131/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4", size = 8162896, upload-time = "2025-05-08T19:10:46.432Z" }, - { url = "https://files.pythonhosted.org/packages/24/a4/fbfc00c2346177c95b353dcf9b5a004106abe8730a62cb6f27e79df0a698/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751", size = 8039702, upload-time = "2025-05-08T19:10:49.634Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b9/59e120d24a2ec5fc2d30646adb2efb4621aab3c6d83d66fb2a7a182db032/matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014", size = 8594298, upload-time = "2025-05-08T19:10:51.738Z" }, + { url = "https://files.pythonhosted.org/packages/d0/ea/2bba25d289d389c7451f331ecd593944b3705f06ddf593fa7be75037d308/matplotlib-3.10.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7", size = 8167862 }, + { url = "https://files.pythonhosted.org/packages/41/81/cc70b5138c926604e8c9ed810ed4c79e8116ba72e02230852f5c12c87ba2/matplotlib-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb", size = 8042149 }, + { url = "https://files.pythonhosted.org/packages/4a/9a/0ff45b6bfa42bb16de597e6058edf2361c298ad5ef93b327728145161bbf/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb", size = 8453719 }, + { url = "https://files.pythonhosted.org/packages/85/c7/1866e972fed6d71ef136efbc980d4d1854ab7ef1ea8152bbd995ca231c81/matplotlib-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30", size = 8590801 }, + { url = "https://files.pythonhosted.org/packages/5d/b9/748f6626d534ab7e255bdc39dc22634d337cf3ce200f261b5d65742044a1/matplotlib-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8", size = 9402111 }, + { url = "https://files.pythonhosted.org/packages/1f/78/8bf07bd8fb67ea5665a6af188e70b57fcb2ab67057daa06b85a08e59160a/matplotlib-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd", size = 8057213 }, + { url = "https://files.pythonhosted.org/packages/f5/bd/af9f655456f60fe1d575f54fb14704ee299b16e999704817a7645dfce6b0/matplotlib-3.10.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8", size = 8178873 }, + { url = "https://files.pythonhosted.org/packages/c2/86/e1c86690610661cd716eda5f9d0b35eaf606ae6c9b6736687cfc8f2d0cd8/matplotlib-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d", size = 8052205 }, + { url = "https://files.pythonhosted.org/packages/54/51/a9f8e49af3883dacddb2da1af5fca1f7468677f1188936452dd9aaaeb9ed/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049", size = 8465823 }, + { url = "https://files.pythonhosted.org/packages/e7/e3/c82963a3b86d6e6d5874cbeaa390166458a7f1961bab9feb14d3d1a10f02/matplotlib-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b", size = 8606464 }, + { url = "https://files.pythonhosted.org/packages/0e/34/24da1027e7fcdd9e82da3194c470143c551852757a4b473a09a012f5b945/matplotlib-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220", size = 9413103 }, + { url = "https://files.pythonhosted.org/packages/a6/da/948a017c3ea13fd4a97afad5fdebe2f5bbc4d28c0654510ce6fd6b06b7bd/matplotlib-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1", size = 8065492 }, + { url = "https://files.pythonhosted.org/packages/3d/d1/f54d43e95384b312ffa4a74a4326c722f3b8187aaaa12e9a84cdf3037131/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4", size = 8162896 }, + { url = "https://files.pythonhosted.org/packages/24/a4/fbfc00c2346177c95b353dcf9b5a004106abe8730a62cb6f27e79df0a698/matplotlib-3.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751", size = 8039702 }, + { url = "https://files.pythonhosted.org/packages/6a/b9/59e120d24a2ec5fc2d30646adb2efb4621aab3c6d83d66fb2a7a182db032/matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014", size = 8594298 }, ] [[package]] @@ -1376,18 +1375,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] [[package]] @@ -1399,9 +1398,9 @@ dependencies = [ { name = "pyjwt", extra = ["crypto"] }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d5/da/81acbe0c1fd7e9e4ec35f55dadeba9833a847b9a6ba2e2d1e4432da901dd/msal-1.33.0.tar.gz", hash = "sha256:836ad80faa3e25a7d71015c990ce61f704a87328b1e73bcbb0623a18cbf17510", size = 153801, upload-time = "2025-07-22T19:36:33.693Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/da/81acbe0c1fd7e9e4ec35f55dadeba9833a847b9a6ba2e2d1e4432da901dd/msal-1.33.0.tar.gz", hash = "sha256:836ad80faa3e25a7d71015c990ce61f704a87328b1e73bcbb0623a18cbf17510", size = 153801 } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/5b/fbc73e91f7727ae1e79b21ed833308e99dc11cc1cd3d4717f579775de5e9/msal-1.33.0-py3-none-any.whl", hash = "sha256:c0cd41cecf8eaed733ee7e3be9e040291eba53b0f262d3ae9c58f38b04244273", size = 116853, upload-time = "2025-07-22T19:36:32.403Z" }, + { url = "https://files.pythonhosted.org/packages/86/5b/fbc73e91f7727ae1e79b21ed833308e99dc11cc1cd3d4717f579775de5e9/msal-1.33.0-py3-none-any.whl", hash = "sha256:c0cd41cecf8eaed733ee7e3be9e040291eba53b0f262d3ae9c58f38b04244273", size = 116853 }, ] [[package]] @@ -1411,49 +1410,49 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "msal" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/99/5d239b6156eddf761a636bded1118414d161bd6b7b37a9335549ed159396/msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4", size = 23315, upload-time = "2025-03-14T23:51:03.902Z" } +sdist = { url = "https://files.pythonhosted.org/packages/01/99/5d239b6156eddf761a636bded1118414d161bd6b7b37a9335549ed159396/msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4", size = 23315 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca", size = 20583, upload-time = "2025-03-14T23:51:03.016Z" }, + { url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca", size = 20583 }, ] [[package]] name = "murmurhash" version = "1.0.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/e9/02efbc6dfc2dd2085da3daacf9a8c17e8356019eceaedbfa21555e32d2af/murmurhash-1.0.13.tar.gz", hash = "sha256:737246d41ee00ff74b07b0bd1f0888be304d203ce668e642c86aa64ede30f8b7", size = 13258, upload-time = "2025-05-22T12:35:57.019Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/e9/02efbc6dfc2dd2085da3daacf9a8c17e8356019eceaedbfa21555e32d2af/murmurhash-1.0.13.tar.gz", hash = "sha256:737246d41ee00ff74b07b0bd1f0888be304d203ce668e642c86aa64ede30f8b7", size = 13258 } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/c3/ac14ed2aff4f18eadccf7d4e80c2361cf6e9a6a350442db9987919c4a747/murmurhash-1.0.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:136c7017e7d59ef16f065c2285bf5d30557ad8260adf47714c3c2802725e3e07", size = 26278, upload-time = "2025-05-22T12:35:10.16Z" }, - { url = "https://files.pythonhosted.org/packages/62/38/87e5f72aa96a0a816b90cd66209cda713e168d4d23b52af62fdba3c8b33c/murmurhash-1.0.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d0292f6fcd99361157fafad5c86d508f367931b7699cce1e14747364596950cb", size = 26528, upload-time = "2025-05-22T12:35:12.181Z" }, - { url = "https://files.pythonhosted.org/packages/6a/df/f74b22acf2ebf04ea24b858667836c9490e677ef29c1fe7bc993ecf4bc12/murmurhash-1.0.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12265dc748257966c62041b677201b8fa74334a2548dc27f1c7a9e78dab7c2c1", size = 120045, upload-time = "2025-05-22T12:35:13.657Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ed/19c48d4c5ad475e144fba5b1adf45d8a189eabde503168660e1ec5d081e8/murmurhash-1.0.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e411d5be64d37f2ce10a5d4d74c50bb35bd06205745b9631c4d8b1cb193e540", size = 117103, upload-time = "2025-05-22T12:35:14.899Z" }, - { url = "https://files.pythonhosted.org/packages/48/0e/3d6e009c539709f0cf643679977e2dfbd5d50e1ef49928f9a92941839482/murmurhash-1.0.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:da3500ad3dbf75ac9c6bc8c5fbc677d56dfc34aec0a289269939d059f194f61d", size = 118191, upload-time = "2025-05-22T12:35:16.098Z" }, - { url = "https://files.pythonhosted.org/packages/7c/8c/fab9d11bde62783d2aa7919e1ecbbf12dea7100ea61f63f55c9e0f199a6a/murmurhash-1.0.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b23278c5428fc14f3101f8794f38ec937da042198930073e8c86d00add0fa2f0", size = 118663, upload-time = "2025-05-22T12:35:17.847Z" }, - { url = "https://files.pythonhosted.org/packages/cf/23/322d87ab935782f2676a836ea88d92f87e58db40fb49112ba03b03d335a1/murmurhash-1.0.13-cp310-cp310-win_amd64.whl", hash = "sha256:7bc27226c0e8d9927f8e59af0dfefc93f5009e4ec3dde8da4ba7751ba19edd47", size = 24504, upload-time = "2025-05-22T12:35:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/2c/d1/9d13a02d9c8bfff10b1f68d19df206eaf2a8011defeccf7eb05ea0b8c54e/murmurhash-1.0.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b20d168370bc3ce82920121b78ab35ae244070a9b18798f4a2e8678fa03bd7e0", size = 26410, upload-time = "2025-05-22T12:35:20.786Z" }, - { url = "https://files.pythonhosted.org/packages/14/b0/3ee762e98cf9a8c2df9c8b377c326f3dd4495066d4eace9066fca46eba7a/murmurhash-1.0.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cef667d2e83bdceea3bc20c586c491fa442662ace1aea66ff5e3a18bb38268d8", size = 26679, upload-time = "2025-05-22T12:35:21.808Z" }, - { url = "https://files.pythonhosted.org/packages/39/06/24618f79cd5aac48490932e50263bddfd1ea90f7123d49bfe806a5982675/murmurhash-1.0.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:507148e50929ba1fce36898808573b9f81c763d5676f3fc6e4e832ff56b66992", size = 125970, upload-time = "2025-05-22T12:35:23.222Z" }, - { url = "https://files.pythonhosted.org/packages/e8/09/0e7afce0a422692506c85474a26fb3a03c1971b2b5f7e7745276c4b3de7f/murmurhash-1.0.13-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d50f6173d266ad165beb8bca6101d824217fc9279f9e9981f4c0245c1e7ee6", size = 123390, upload-time = "2025-05-22T12:35:24.303Z" }, - { url = "https://files.pythonhosted.org/packages/22/4c/c98f579b1a951b2bcc722a35270a2eec105c1e21585c9b314a02079e3c4d/murmurhash-1.0.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0f272e15a84a8ae5f8b4bc0a68f9f47be38518ddffc72405791178058e9d019a", size = 124007, upload-time = "2025-05-22T12:35:25.446Z" }, - { url = "https://files.pythonhosted.org/packages/df/f8/1b0dcebc8df8e091341617102b5b3b97deb6435f345b84f75382c290ec2c/murmurhash-1.0.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9423e0b0964ed1013a06c970199538c7ef9ca28c0be54798c0f1473a6591761", size = 123705, upload-time = "2025-05-22T12:35:26.709Z" }, - { url = "https://files.pythonhosted.org/packages/79/17/f2a38558e150a0669d843f75e128afb83c1a67af41885ea2acb940e18e2a/murmurhash-1.0.13-cp311-cp311-win_amd64.whl", hash = "sha256:83b81e7084b696df3d853f2c78e0c9bda6b285d643f923f1a6fa9ab145d705c5", size = 24572, upload-time = "2025-05-22T12:35:30.38Z" }, + { url = "https://files.pythonhosted.org/packages/32/c3/ac14ed2aff4f18eadccf7d4e80c2361cf6e9a6a350442db9987919c4a747/murmurhash-1.0.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:136c7017e7d59ef16f065c2285bf5d30557ad8260adf47714c3c2802725e3e07", size = 26278 }, + { url = "https://files.pythonhosted.org/packages/62/38/87e5f72aa96a0a816b90cd66209cda713e168d4d23b52af62fdba3c8b33c/murmurhash-1.0.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d0292f6fcd99361157fafad5c86d508f367931b7699cce1e14747364596950cb", size = 26528 }, + { url = "https://files.pythonhosted.org/packages/6a/df/f74b22acf2ebf04ea24b858667836c9490e677ef29c1fe7bc993ecf4bc12/murmurhash-1.0.13-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12265dc748257966c62041b677201b8fa74334a2548dc27f1c7a9e78dab7c2c1", size = 120045 }, + { url = "https://files.pythonhosted.org/packages/f8/ed/19c48d4c5ad475e144fba5b1adf45d8a189eabde503168660e1ec5d081e8/murmurhash-1.0.13-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e411d5be64d37f2ce10a5d4d74c50bb35bd06205745b9631c4d8b1cb193e540", size = 117103 }, + { url = "https://files.pythonhosted.org/packages/48/0e/3d6e009c539709f0cf643679977e2dfbd5d50e1ef49928f9a92941839482/murmurhash-1.0.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:da3500ad3dbf75ac9c6bc8c5fbc677d56dfc34aec0a289269939d059f194f61d", size = 118191 }, + { url = "https://files.pythonhosted.org/packages/7c/8c/fab9d11bde62783d2aa7919e1ecbbf12dea7100ea61f63f55c9e0f199a6a/murmurhash-1.0.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b23278c5428fc14f3101f8794f38ec937da042198930073e8c86d00add0fa2f0", size = 118663 }, + { url = "https://files.pythonhosted.org/packages/cf/23/322d87ab935782f2676a836ea88d92f87e58db40fb49112ba03b03d335a1/murmurhash-1.0.13-cp310-cp310-win_amd64.whl", hash = "sha256:7bc27226c0e8d9927f8e59af0dfefc93f5009e4ec3dde8da4ba7751ba19edd47", size = 24504 }, + { url = "https://files.pythonhosted.org/packages/2c/d1/9d13a02d9c8bfff10b1f68d19df206eaf2a8011defeccf7eb05ea0b8c54e/murmurhash-1.0.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b20d168370bc3ce82920121b78ab35ae244070a9b18798f4a2e8678fa03bd7e0", size = 26410 }, + { url = "https://files.pythonhosted.org/packages/14/b0/3ee762e98cf9a8c2df9c8b377c326f3dd4495066d4eace9066fca46eba7a/murmurhash-1.0.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cef667d2e83bdceea3bc20c586c491fa442662ace1aea66ff5e3a18bb38268d8", size = 26679 }, + { url = "https://files.pythonhosted.org/packages/39/06/24618f79cd5aac48490932e50263bddfd1ea90f7123d49bfe806a5982675/murmurhash-1.0.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:507148e50929ba1fce36898808573b9f81c763d5676f3fc6e4e832ff56b66992", size = 125970 }, + { url = "https://files.pythonhosted.org/packages/e8/09/0e7afce0a422692506c85474a26fb3a03c1971b2b5f7e7745276c4b3de7f/murmurhash-1.0.13-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64d50f6173d266ad165beb8bca6101d824217fc9279f9e9981f4c0245c1e7ee6", size = 123390 }, + { url = "https://files.pythonhosted.org/packages/22/4c/c98f579b1a951b2bcc722a35270a2eec105c1e21585c9b314a02079e3c4d/murmurhash-1.0.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0f272e15a84a8ae5f8b4bc0a68f9f47be38518ddffc72405791178058e9d019a", size = 124007 }, + { url = "https://files.pythonhosted.org/packages/df/f8/1b0dcebc8df8e091341617102b5b3b97deb6435f345b84f75382c290ec2c/murmurhash-1.0.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9423e0b0964ed1013a06c970199538c7ef9ca28c0be54798c0f1473a6591761", size = 123705 }, + { url = "https://files.pythonhosted.org/packages/79/17/f2a38558e150a0669d843f75e128afb83c1a67af41885ea2acb940e18e2a/murmurhash-1.0.13-cp311-cp311-win_amd64.whl", hash = "sha256:83b81e7084b696df3d853f2c78e0c9bda6b285d643f923f1a6fa9ab145d705c5", size = 24572 }, ] [[package]] name = "narwhals" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d9/58/0fbbfb13662297c8447d1872670da79f3f2a63fb68ae9aac9965cdc2d428/narwhals-2.0.0.tar.gz", hash = "sha256:d967bea54dfb6cd787abf3865ab4d72b8259d8f798c1c12c4eb693d5e9cebb24", size = 525527, upload-time = "2025-07-28T08:12:43.407Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/58/0fbbfb13662297c8447d1872670da79f3f2a63fb68ae9aac9965cdc2d428/narwhals-2.0.0.tar.gz", hash = "sha256:d967bea54dfb6cd787abf3865ab4d72b8259d8f798c1c12c4eb693d5e9cebb24", size = 525527 } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/9d/9e2afb7d3d43bfa1a1f80d2da291064753305f9871851f1cd5a60d870893/narwhals-2.0.0-py3-none-any.whl", hash = "sha256:9c9fe8a969b090d783edbcb3b58e1d0d15f5100fdf85b53f5e76d38f4ce7f19a", size = 385206, upload-time = "2025-07-28T08:12:39.545Z" }, + { url = "https://files.pythonhosted.org/packages/93/9d/9e2afb7d3d43bfa1a1f80d2da291064753305f9871851f1cd5a60d870893/narwhals-2.0.0-py3-none-any.whl", hash = "sha256:9c9fe8a969b090d783edbcb3b58e1d0d15f5100fdf85b53f5e76d38f4ce7f19a", size = 385206 }, ] [[package]] name = "nest-asyncio" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, ] [[package]] @@ -1463,9 +1462,9 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.11'", ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, ] [[package]] @@ -1475,9 +1474,9 @@ source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.11'", ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065 } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406 }, ] [[package]] @@ -1490,18 +1489,18 @@ dependencies = [ { name = "regex" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/87/db8be88ad32c2d042420b6fd9ffd4a149f9a0d7f0e86b3f543be2eeeedd2/nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868", size = 2904691, upload-time = "2024-08-18T19:48:37.769Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/87/db8be88ad32c2d042420b6fd9ffd4a149f9a0d7f0e86b3f543be2eeeedd2/nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868", size = 2904691 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1", size = 1505442, upload-time = "2024-08-18T19:48:21.909Z" }, + { url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1", size = 1505442 }, ] [[package]] name = "nodeenv" version = "1.9.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, ] [[package]] @@ -1512,47 +1511,47 @@ dependencies = [ { name = "llvmlite" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615, upload-time = "2025-04-09T02:58:07.659Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615 } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/ca/f470be59552ccbf9531d2d383b67ae0b9b524d435fb4a0d229fef135116e/numba-0.61.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:cf9f9fc00d6eca0c23fc840817ce9f439b9f03c8f03d6246c0e7f0cb15b7162a", size = 2775663, upload-time = "2025-04-09T02:57:34.143Z" }, - { url = "https://files.pythonhosted.org/packages/f5/13/3bdf52609c80d460a3b4acfb9fdb3817e392875c0d6270cf3fd9546f138b/numba-0.61.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd", size = 2778344, upload-time = "2025-04-09T02:57:36.609Z" }, - { url = "https://files.pythonhosted.org/packages/e2/7d/bfb2805bcfbd479f04f835241ecf28519f6e3609912e3a985aed45e21370/numba-0.61.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae8c7a522c26215d5f62ebec436e3d341f7f590079245a2f1008dfd498cc1642", size = 3824054, upload-time = "2025-04-09T02:57:38.162Z" }, - { url = "https://files.pythonhosted.org/packages/e3/27/797b2004745c92955470c73c82f0e300cf033c791f45bdecb4b33b12bdea/numba-0.61.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd1e74609855aa43661edffca37346e4e8462f6903889917e9f41db40907daa2", size = 3518531, upload-time = "2025-04-09T02:57:39.709Z" }, - { url = "https://files.pythonhosted.org/packages/b1/c6/c2fb11e50482cb310afae87a997707f6c7d8a48967b9696271347441f650/numba-0.61.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae45830b129c6137294093b269ef0a22998ccc27bf7cf096ab8dcf7bca8946f9", size = 2831612, upload-time = "2025-04-09T02:57:41.559Z" }, - { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825, upload-time = "2025-04-09T02:57:43.442Z" }, - { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695, upload-time = "2025-04-09T02:57:44.968Z" }, - { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227, upload-time = "2025-04-09T02:57:46.63Z" }, - { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422, upload-time = "2025-04-09T02:57:48.222Z" }, - { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505, upload-time = "2025-04-09T02:57:50.108Z" }, + { url = "https://files.pythonhosted.org/packages/eb/ca/f470be59552ccbf9531d2d383b67ae0b9b524d435fb4a0d229fef135116e/numba-0.61.2-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:cf9f9fc00d6eca0c23fc840817ce9f439b9f03c8f03d6246c0e7f0cb15b7162a", size = 2775663 }, + { url = "https://files.pythonhosted.org/packages/f5/13/3bdf52609c80d460a3b4acfb9fdb3817e392875c0d6270cf3fd9546f138b/numba-0.61.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ea0247617edcb5dd61f6106a56255baab031acc4257bddaeddb3a1003b4ca3fd", size = 2778344 }, + { url = "https://files.pythonhosted.org/packages/e2/7d/bfb2805bcfbd479f04f835241ecf28519f6e3609912e3a985aed45e21370/numba-0.61.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae8c7a522c26215d5f62ebec436e3d341f7f590079245a2f1008dfd498cc1642", size = 3824054 }, + { url = "https://files.pythonhosted.org/packages/e3/27/797b2004745c92955470c73c82f0e300cf033c791f45bdecb4b33b12bdea/numba-0.61.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd1e74609855aa43661edffca37346e4e8462f6903889917e9f41db40907daa2", size = 3518531 }, + { url = "https://files.pythonhosted.org/packages/b1/c6/c2fb11e50482cb310afae87a997707f6c7d8a48967b9696271347441f650/numba-0.61.2-cp310-cp310-win_amd64.whl", hash = "sha256:ae45830b129c6137294093b269ef0a22998ccc27bf7cf096ab8dcf7bca8946f9", size = 2831612 }, + { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825 }, + { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695 }, + { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227 }, + { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422 }, + { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505 }, ] [[package]] name = "numpy" version = "1.26.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468, upload-time = "2024-02-05T23:48:01.194Z" }, - { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411, upload-time = "2024-02-05T23:48:29.038Z" }, - { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016, upload-time = "2024-02-05T23:48:54.098Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889, upload-time = "2024-02-05T23:49:25.361Z" }, - { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746, upload-time = "2024-02-05T23:49:51.983Z" }, - { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620, upload-time = "2024-02-05T23:50:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659, upload-time = "2024-02-05T23:50:35.834Z" }, - { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905, upload-time = "2024-02-05T23:51:03.701Z" }, - { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload-time = "2024-02-05T23:51:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload-time = "2024-02-05T23:52:15.314Z" }, - { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload-time = "2024-02-05T23:52:47.569Z" }, - { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload-time = "2024-02-05T23:53:15.637Z" }, - { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload-time = "2024-02-05T23:53:42.16Z" }, - { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload-time = "2024-02-05T23:54:11.696Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload-time = "2024-02-05T23:54:26.453Z" }, - { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload-time = "2024-02-05T23:54:53.933Z" }, + { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468 }, + { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411 }, + { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016 }, + { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889 }, + { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746 }, + { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620 }, + { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659 }, + { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905 }, + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554 }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127 }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994 }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005 }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297 }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567 }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812 }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913 }, ] [[package]] name = "openai" -version = "1.97.1" +version = "1.107.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -1564,27 +1563,27 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/57/1c471f6b3efb879d26686d31582997615e969f3bb4458111c9705e56332e/openai-1.97.1.tar.gz", hash = "sha256:a744b27ae624e3d4135225da9b1c89c107a2a7e5bc4c93e5b7b5214772ce7a4e", size = 494267, upload-time = "2025-07-22T13:10:12.607Z" } +sdist = { url = "https://files.pythonhosted.org/packages/88/67/d6498de300f83ff57a79cb7aa96ef3bef8d6f070c3ded0f1b5b45442a6bc/openai-1.107.0.tar.gz", hash = "sha256:43e04927584e57d0e9e640ee0077c78baf8150098be96ebd5c512539b6c4e9a4", size = 566056 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ee/35/412a0e9c3f0d37c94ed764b8ac7adae2d834dbd20e69f6aca582118e0f55/openai-1.97.1-py3-none-any.whl", hash = "sha256:4e96bbdf672ec3d44968c9ea39d2c375891db1acc1794668d8149d5fa6000606", size = 764380, upload-time = "2025-07-22T13:10:10.689Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/e8a4fd20390f2858b95227c288df8fe0c835f7c77625f7583609161684ba/openai-1.107.0-py3-none-any.whl", hash = "sha256:3dcfa3cbb116bd6924b27913b8da28c4a787379ff60049588547a1013e6d6438", size = 950968 }, ] [[package]] name = "overrides" version = "7.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812, upload-time = "2024-01-27T21:01:33.423Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload-time = "2024-01-27T21:01:31.393Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 }, ] [[package]] name = "packaging" version = "24.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950, upload-time = "2024-11-08T09:47:47.202Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451, upload-time = "2024-11-08T09:47:44.722Z" }, + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] @@ -1597,40 +1596,40 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload-time = "2025-07-07T19:20:04.079Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c4/ca/aa97b47287221fa37a49634532e520300088e290b20d690b21ce3e448143/pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9", size = 11542731, upload-time = "2025-07-07T19:18:12.619Z" }, - { url = "https://files.pythonhosted.org/packages/80/bf/7938dddc5f01e18e573dcfb0f1b8c9357d9b5fa6ffdee6e605b92efbdff2/pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1", size = 10790031, upload-time = "2025-07-07T19:18:16.611Z" }, - { url = "https://files.pythonhosted.org/packages/ee/2f/9af748366763b2a494fed477f88051dbf06f56053d5c00eba652697e3f94/pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0", size = 11724083, upload-time = "2025-07-07T19:18:20.512Z" }, - { url = "https://files.pythonhosted.org/packages/2c/95/79ab37aa4c25d1e7df953dde407bb9c3e4ae47d154bc0dd1692f3a6dcf8c/pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191", size = 12342360, upload-time = "2025-07-07T19:18:23.194Z" }, - { url = "https://files.pythonhosted.org/packages/75/a7/d65e5d8665c12c3c6ff5edd9709d5836ec9b6f80071b7f4a718c6106e86e/pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1", size = 13202098, upload-time = "2025-07-07T19:18:25.558Z" }, - { url = "https://files.pythonhosted.org/packages/65/f3/4c1dbd754dbaa79dbf8b537800cb2fa1a6e534764fef50ab1f7533226c5c/pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97", size = 13837228, upload-time = "2025-07-07T19:18:28.344Z" }, - { url = "https://files.pythonhosted.org/packages/3f/d6/d7f5777162aa9b48ec3910bca5a58c9b5927cfd9cfde3aa64322f5ba4b9f/pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83", size = 11336561, upload-time = "2025-07-07T19:18:31.211Z" }, - { url = "https://files.pythonhosted.org/packages/76/1c/ccf70029e927e473a4476c00e0d5b32e623bff27f0402d0a92b7fc29bb9f/pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b", size = 11566608, upload-time = "2025-07-07T19:18:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d3/3c37cb724d76a841f14b8f5fe57e5e3645207cc67370e4f84717e8bb7657/pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f", size = 10823181, upload-time = "2025-07-07T19:18:36.151Z" }, - { url = "https://files.pythonhosted.org/packages/8a/4c/367c98854a1251940edf54a4df0826dcacfb987f9068abf3e3064081a382/pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85", size = 11793570, upload-time = "2025-07-07T19:18:38.385Z" }, - { url = "https://files.pythonhosted.org/packages/07/5f/63760ff107bcf5146eee41b38b3985f9055e710a72fdd637b791dea3495c/pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d", size = 12378887, upload-time = "2025-07-07T19:18:41.284Z" }, - { url = "https://files.pythonhosted.org/packages/15/53/f31a9b4dfe73fe4711c3a609bd8e60238022f48eacedc257cd13ae9327a7/pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678", size = 13230957, upload-time = "2025-07-07T19:18:44.187Z" }, - { url = "https://files.pythonhosted.org/packages/e0/94/6fce6bf85b5056d065e0a7933cba2616dcb48596f7ba3c6341ec4bcc529d/pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299", size = 13883883, upload-time = "2025-07-07T19:18:46.498Z" }, - { url = "https://files.pythonhosted.org/packages/c8/7b/bdcb1ed8fccb63d04bdb7635161d0ec26596d92c9d7a6cce964e7876b6c1/pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab", size = 11340212, upload-time = "2025-07-07T19:18:49.293Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ca/aa97b47287221fa37a49634532e520300088e290b20d690b21ce3e448143/pandas-2.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9", size = 11542731 }, + { url = "https://files.pythonhosted.org/packages/80/bf/7938dddc5f01e18e573dcfb0f1b8c9357d9b5fa6ffdee6e605b92efbdff2/pandas-2.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1", size = 10790031 }, + { url = "https://files.pythonhosted.org/packages/ee/2f/9af748366763b2a494fed477f88051dbf06f56053d5c00eba652697e3f94/pandas-2.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0", size = 11724083 }, + { url = "https://files.pythonhosted.org/packages/2c/95/79ab37aa4c25d1e7df953dde407bb9c3e4ae47d154bc0dd1692f3a6dcf8c/pandas-2.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191", size = 12342360 }, + { url = "https://files.pythonhosted.org/packages/75/a7/d65e5d8665c12c3c6ff5edd9709d5836ec9b6f80071b7f4a718c6106e86e/pandas-2.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1", size = 13202098 }, + { url = "https://files.pythonhosted.org/packages/65/f3/4c1dbd754dbaa79dbf8b537800cb2fa1a6e534764fef50ab1f7533226c5c/pandas-2.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97", size = 13837228 }, + { url = "https://files.pythonhosted.org/packages/3f/d6/d7f5777162aa9b48ec3910bca5a58c9b5927cfd9cfde3aa64322f5ba4b9f/pandas-2.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83", size = 11336561 }, + { url = "https://files.pythonhosted.org/packages/76/1c/ccf70029e927e473a4476c00e0d5b32e623bff27f0402d0a92b7fc29bb9f/pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b", size = 11566608 }, + { url = "https://files.pythonhosted.org/packages/ec/d3/3c37cb724d76a841f14b8f5fe57e5e3645207cc67370e4f84717e8bb7657/pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f", size = 10823181 }, + { url = "https://files.pythonhosted.org/packages/8a/4c/367c98854a1251940edf54a4df0826dcacfb987f9068abf3e3064081a382/pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85", size = 11793570 }, + { url = "https://files.pythonhosted.org/packages/07/5f/63760ff107bcf5146eee41b38b3985f9055e710a72fdd637b791dea3495c/pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d", size = 12378887 }, + { url = "https://files.pythonhosted.org/packages/15/53/f31a9b4dfe73fe4711c3a609bd8e60238022f48eacedc257cd13ae9327a7/pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678", size = 13230957 }, + { url = "https://files.pythonhosted.org/packages/e0/94/6fce6bf85b5056d065e0a7933cba2616dcb48596f7ba3c6341ec4bcc529d/pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299", size = 13883883 }, + { url = "https://files.pythonhosted.org/packages/c8/7b/bdcb1ed8fccb63d04bdb7635161d0ec26596d92c9d7a6cce964e7876b6c1/pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab", size = 11340212 }, ] [[package]] name = "parso" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, ] [[package]] name = "pastel" version = "0.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/f1/4594f5e0fcddb6953e5b8fe00da8c317b8b41b547e2b3ae2da7512943c62/pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d", size = 7555, upload-time = "2020-09-16T19:21:12.43Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/f1/4594f5e0fcddb6953e5b8fe00da8c317b8b41b547e2b3ae2da7512943c62/pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d", size = 7555 } wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/18/a8444036c6dd65ba3624c63b734d3ba95ba63ace513078e1580590075d21/pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364", size = 5955, upload-time = "2020-09-16T19:21:11.409Z" }, + { url = "https://files.pythonhosted.org/packages/aa/18/a8444036c6dd65ba3624c63b734d3ba95ba63ace513078e1580590075d21/pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364", size = 5955 }, ] [[package]] @@ -1640,9 +1639,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/81/74f6a65b848ffd16c18f920620ce999fe45fe27f01ab3911260ce4ed85e4/patsy-1.0.1.tar.gz", hash = "sha256:e786a9391eec818c054e359b737bbce692f051aee4c661f4141cc88fb459c0c4", size = 396010, upload-time = "2024-11-12T14:10:54.642Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/81/74f6a65b848ffd16c18f920620ce999fe45fe27f01ab3911260ce4ed85e4/patsy-1.0.1.tar.gz", hash = "sha256:e786a9391eec818c054e359b737bbce692f051aee4c661f4141cc88fb459c0c4", size = 396010 } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/2b/b50d3d08ea0fc419c183a84210571eba005328efa62b6b98bc28e9ead32a/patsy-1.0.1-py2.py3-none-any.whl", hash = "sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c", size = 232923, upload-time = "2024-11-12T14:10:52.85Z" }, + { url = "https://files.pythonhosted.org/packages/87/2b/b50d3d08ea0fc419c183a84210571eba005328efa62b6b98bc28e9ead32a/patsy-1.0.1-py2.py3-none-any.whl", hash = "sha256:751fb38f9e97e62312e921a1954b81e1bb2bcda4f5eeabaf94db251ee791509c", size = 232923 }, ] [[package]] @@ -1652,62 +1651,62 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] -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" } +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } 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" }, + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, ] [[package]] name = "pillow" version = "11.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, - { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, - { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, - { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, - { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, - { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090, upload-time = "2025-07-01T09:13:53.915Z" }, - { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988, upload-time = "2025-07-01T09:13:55.699Z" }, - { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899, upload-time = "2025-07-01T09:13:57.497Z" }, - { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, - { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, - { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, - { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, - { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, - { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, - { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, - { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, - { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, - { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, - { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, - { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596, upload-time = "2025-07-01T09:16:18.07Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, - { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, - { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, - { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, - { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554 }, + { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548 }, + { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742 }, + { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087 }, + { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350 }, + { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840 }, + { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005 }, + { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372 }, + { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090 }, + { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988 }, + { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899 }, + { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531 }, + { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560 }, + { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978 }, + { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168 }, + { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053 }, + { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273 }, + { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043 }, + { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516 }, + { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768 }, + { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055 }, + { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079 }, + { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556 }, + { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625 }, + { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207 }, + { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939 }, + { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166 }, + { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482 }, + { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566 }, + { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618 }, + { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248 }, + { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963 }, + { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170 }, + { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505 }, + { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598 }, ] [[package]] name = "platformdirs" version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567 }, ] [[package]] @@ -1719,9 +1718,9 @@ dependencies = [ { name = "pyyaml" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cf/ac/311c8a492dc887f0b7a54d0ec3324cb2f9538b7b78ea06e5f7ae1f167e52/poethepoet-0.36.0.tar.gz", hash = "sha256:2217b49cb4e4c64af0b42ff8c4814b17f02e107d38bc461542517348ede25663", size = 66854, upload-time = "2025-06-29T19:54:50.444Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/ac/311c8a492dc887f0b7a54d0ec3324cb2f9538b7b78ea06e5f7ae1f167e52/poethepoet-0.36.0.tar.gz", hash = "sha256:2217b49cb4e4c64af0b42ff8c4814b17f02e107d38bc461542517348ede25663", size = 66854 } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/29/dedb3a6b7e17ea723143b834a2da428a7d743c80d5cd4d22ed28b5e8c441/poethepoet-0.36.0-py3-none-any.whl", hash = "sha256:693e3c1eae9f6731d3613c3c0c40f747d3c5c68a375beda42e590a63c5623308", size = 88031, upload-time = "2025-06-29T19:54:48.884Z" }, + { url = "https://files.pythonhosted.org/packages/03/29/dedb3a6b7e17ea723143b834a2da428a7d743c80d5cd4d22ed28b5e8c441/poethepoet-0.36.0-py3-none-any.whl", hash = "sha256:693e3c1eae9f6731d3613c3c0c40f747d3c5c68a375beda42e590a63c5623308", size = 88031 }, ] [[package]] @@ -1732,22 +1731,22 @@ dependencies = [ { name = "numpy" }, { name = "scipy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c1/40/3e0c8dd88328d944f9d82b30cafd2a1c911bddff0b8bccc8dc9dd5e45b7c/pot-0.9.5.tar.gz", hash = "sha256:9644ee7ff51c3cffa3c2632b9dd9dff4f3520266f9fb771450935ffb646d6042", size = 440808, upload-time = "2024-11-07T10:05:05.567Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c1/40/3e0c8dd88328d944f9d82b30cafd2a1c911bddff0b8bccc8dc9dd5e45b7c/pot-0.9.5.tar.gz", hash = "sha256:9644ee7ff51c3cffa3c2632b9dd9dff4f3520266f9fb771450935ffb646d6042", size = 440808 } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/53/acd66a8e50f992e6ca578181009e81d367ad738d0ac135f63d0de3ca92cd/POT-0.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:34d766c38e65a69c087b01a854fe89fbd152c3e8af93da2227b6c40aed6d37b9", size = 410989, upload-time = "2024-11-07T10:04:04.166Z" }, - { url = "https://files.pythonhosted.org/packages/24/51/43c68e7cb1dc7c40286d9e19f6cb599108cd01c2b32307296eba9cb01a05/POT-0.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5407377256de11b6fdc94bbba9b50ea5a2301570905fc9014541cc8473806d9", size = 351111, upload-time = "2024-11-07T10:04:06.604Z" }, - { url = "https://files.pythonhosted.org/packages/3f/87/17069069948e40fa0e41366e6412322c7849d4b2a0ddae0428d10b571604/POT-0.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f37039cd356198c1fb994e7d935b9bf75d44f2a40319d298bf8cc149eb360d5", size = 344289, upload-time = "2024-11-07T10:04:08.151Z" }, - { url = "https://files.pythonhosted.org/packages/21/49/7bbb5ac2989abd775ae200cdbcf1a2e023cf07e8d1d6afc7d673d4e380d3/POT-0.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00a18427c9abdd107a2285ea0a814c6b22e95a1af8f88a37c56f23cd216f7a6b", size = 858699, upload-time = "2024-11-07T10:04:10.231Z" }, - { url = "https://files.pythonhosted.org/packages/97/ad/1724a238cef180c04a3d63e8702cbe91f0abe946eb7a55c3857cd0ac1d9b/POT-0.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0dc608cea1107289a58dec33cddc1b0a3fea77ff36d66e2c8ac7aeea543969a", size = 865565, upload-time = "2024-11-07T10:04:12.421Z" }, - { url = "https://files.pythonhosted.org/packages/1c/e9/a1901cbbf765b765ab4adace1711adc3eef01db526dc898e31fbdca653a5/POT-0.9.5-cp310-cp310-win32.whl", hash = "sha256:8312bee055389db47adab063749c8d77b5981534177ca6cd9b91e4fb68f69d00", size = 344137, upload-time = "2024-11-07T10:04:14.693Z" }, - { url = "https://files.pythonhosted.org/packages/95/00/2ef88c57c0ee5ff55a95bcb3ff62d904039bb460809d7577ec314b5e7186/POT-0.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:043706d69202ac87e140121ba32ed1b038f2b3fc4a5549586187239a583cd50d", size = 348385, upload-time = "2024-11-07T10:04:15.851Z" }, - { url = "https://files.pythonhosted.org/packages/08/81/c9eaa405d40567452d102385a2077b4d34f7961dd7ea3354b7749efd4ea7/POT-0.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b5f000da00e408ff781672a4895bfa8daacec055bd534c9e66ead479f3c6d83c", size = 410977, upload-time = "2024-11-07T10:04:17.396Z" }, - { url = "https://files.pythonhosted.org/packages/43/32/8d319ab8eee96397569115aac644b19136170966667c59b026c277e1b026/POT-0.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9eddd9ff29bdb17d4db8ba00ba18d42656c694a128591502bf59afc1369e1bb3", size = 351059, upload-time = "2024-11-07T10:04:18.821Z" }, - { url = "https://files.pythonhosted.org/packages/23/7c/ed772734847ada457af0fdb9dd7073bd3823915721bf64147a1434da5a0c/POT-0.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7eb9b88c73387a9966775a6f6d077d9d071814783701d2656dc05b5032a9662d", size = 344293, upload-time = "2024-11-07T10:04:20.193Z" }, - { url = "https://files.pythonhosted.org/packages/8d/af/a99bc77cf4f79ec04b23d415da005e83aa2a2b91d4216045c87f46d3109f/POT-0.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f44446056f5fc9d132ed8e431732c33cbe754fb1e6d73636f1b6ae811be7df", size = 891139, upload-time = "2024-11-07T10:04:22.344Z" }, - { url = "https://files.pythonhosted.org/packages/68/e8/efc53871cc5b086565702e123d62b37aa40320023b46b30923bb9055b287/POT-0.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7f5d27bc9063e01b03d906bb77e7b3428065fdd72ed64233b249584ead2e2bf", size = 897470, upload-time = "2024-11-07T10:04:23.686Z" }, - { url = "https://files.pythonhosted.org/packages/a1/dd/aab8edf448d68fa6be6454887667e04a7bf2b2a5929f2ec35c49f83ef286/POT-0.9.5-cp311-cp311-win32.whl", hash = "sha256:cd79a8b4d35b706f2124f73ebff3bb1ce3450e01cc8f610eda3b6ce13616b829", size = 343915, upload-time = "2024-11-07T10:04:24.98Z" }, - { url = "https://files.pythonhosted.org/packages/fe/ee/9cd8b16e4e8e7254951b83fc6f871763e7e1315078b17b7008662833ed63/POT-0.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:6680aadb69df2f75a413fe9c58bd1c5cb744d017a7c8ba8841654fd0dc75433b", size = 348566, upload-time = "2024-11-07T10:04:26.557Z" }, + { url = "https://files.pythonhosted.org/packages/87/53/acd66a8e50f992e6ca578181009e81d367ad738d0ac135f63d0de3ca92cd/POT-0.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:34d766c38e65a69c087b01a854fe89fbd152c3e8af93da2227b6c40aed6d37b9", size = 410989 }, + { url = "https://files.pythonhosted.org/packages/24/51/43c68e7cb1dc7c40286d9e19f6cb599108cd01c2b32307296eba9cb01a05/POT-0.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5407377256de11b6fdc94bbba9b50ea5a2301570905fc9014541cc8473806d9", size = 351111 }, + { url = "https://files.pythonhosted.org/packages/3f/87/17069069948e40fa0e41366e6412322c7849d4b2a0ddae0428d10b571604/POT-0.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f37039cd356198c1fb994e7d935b9bf75d44f2a40319d298bf8cc149eb360d5", size = 344289 }, + { url = "https://files.pythonhosted.org/packages/21/49/7bbb5ac2989abd775ae200cdbcf1a2e023cf07e8d1d6afc7d673d4e380d3/POT-0.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00a18427c9abdd107a2285ea0a814c6b22e95a1af8f88a37c56f23cd216f7a6b", size = 858699 }, + { url = "https://files.pythonhosted.org/packages/97/ad/1724a238cef180c04a3d63e8702cbe91f0abe946eb7a55c3857cd0ac1d9b/POT-0.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0dc608cea1107289a58dec33cddc1b0a3fea77ff36d66e2c8ac7aeea543969a", size = 865565 }, + { url = "https://files.pythonhosted.org/packages/1c/e9/a1901cbbf765b765ab4adace1711adc3eef01db526dc898e31fbdca653a5/POT-0.9.5-cp310-cp310-win32.whl", hash = "sha256:8312bee055389db47adab063749c8d77b5981534177ca6cd9b91e4fb68f69d00", size = 344137 }, + { url = "https://files.pythonhosted.org/packages/95/00/2ef88c57c0ee5ff55a95bcb3ff62d904039bb460809d7577ec314b5e7186/POT-0.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:043706d69202ac87e140121ba32ed1b038f2b3fc4a5549586187239a583cd50d", size = 348385 }, + { url = "https://files.pythonhosted.org/packages/08/81/c9eaa405d40567452d102385a2077b4d34f7961dd7ea3354b7749efd4ea7/POT-0.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b5f000da00e408ff781672a4895bfa8daacec055bd534c9e66ead479f3c6d83c", size = 410977 }, + { url = "https://files.pythonhosted.org/packages/43/32/8d319ab8eee96397569115aac644b19136170966667c59b026c277e1b026/POT-0.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9eddd9ff29bdb17d4db8ba00ba18d42656c694a128591502bf59afc1369e1bb3", size = 351059 }, + { url = "https://files.pythonhosted.org/packages/23/7c/ed772734847ada457af0fdb9dd7073bd3823915721bf64147a1434da5a0c/POT-0.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7eb9b88c73387a9966775a6f6d077d9d071814783701d2656dc05b5032a9662d", size = 344293 }, + { url = "https://files.pythonhosted.org/packages/8d/af/a99bc77cf4f79ec04b23d415da005e83aa2a2b91d4216045c87f46d3109f/POT-0.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f44446056f5fc9d132ed8e431732c33cbe754fb1e6d73636f1b6ae811be7df", size = 891139 }, + { url = "https://files.pythonhosted.org/packages/68/e8/efc53871cc5b086565702e123d62b37aa40320023b46b30923bb9055b287/POT-0.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7f5d27bc9063e01b03d906bb77e7b3428065fdd72ed64233b249584ead2e2bf", size = 897470 }, + { url = "https://files.pythonhosted.org/packages/a1/dd/aab8edf448d68fa6be6454887667e04a7bf2b2a5929f2ec35c49f83ef286/POT-0.9.5-cp311-cp311-win32.whl", hash = "sha256:cd79a8b4d35b706f2124f73ebff3bb1ce3450e01cc8f610eda3b6ce13616b829", size = 343915 }, + { url = "https://files.pythonhosted.org/packages/fe/ee/9cd8b16e4e8e7254951b83fc6f871763e7e1315078b17b7008662833ed63/POT-0.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:6680aadb69df2f75a413fe9c58bd1c5cb744d017a7c8ba8841654fd0dc75433b", size = 348566 }, ] [[package]] @@ -1758,22 +1757,22 @@ dependencies = [ { name = "cymem" }, { name = "murmurhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/3a/db814f67a05b6d7f9c15d38edef5ec9b21415710705b393883de92aee5ef/preshed-3.0.10.tar.gz", hash = "sha256:5a5c8e685e941f4ffec97f1fbf32694b8107858891a4bc34107fac981d8296ff", size = 15039, upload-time = "2025-05-26T15:18:33.612Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/3a/db814f67a05b6d7f9c15d38edef5ec9b21415710705b393883de92aee5ef/preshed-3.0.10.tar.gz", hash = "sha256:5a5c8e685e941f4ffec97f1fbf32694b8107858891a4bc34107fac981d8296ff", size = 15039 } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/12/3bfd7790481513d71a281a3a7194a6d7aa9a59289a109253e78d9bcedcec/preshed-3.0.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:14593c32e6705fda0fd54684293ca079530418bb1fb036dcbaa6c0ef0f144b7d", size = 131102, upload-time = "2025-05-26T15:17:41.762Z" }, - { url = "https://files.pythonhosted.org/packages/e4/bf/54635387524315fe40b1f3d1688a5ad369f59a4e3a377b0da6e8a3ecba30/preshed-3.0.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba1960a3996678aded882260133853e19e3a251d9f35a19c9d7d830c4238c4eb", size = 127302, upload-time = "2025-05-26T15:17:43.263Z" }, - { url = "https://files.pythonhosted.org/packages/fe/df/d057705c9c6aff877ee687f612f242006750f165c0e557f6075fe913a8e3/preshed-3.0.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0830c0a262015be743a01455a1da5963750afed1bde2395590b01af3b7da2741", size = 793737, upload-time = "2025-05-26T15:17:44.736Z" }, - { url = "https://files.pythonhosted.org/packages/c4/73/9206a60e59e81a259d49273f95307821f5e88c84c400533ed0cb9a8093af/preshed-3.0.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:165dda5862c28e77ee1f3feabad98d4ebb65345f458b5626596b92fd20a65275", size = 795131, upload-time = "2025-05-26T15:17:46.382Z" }, - { url = "https://files.pythonhosted.org/packages/25/18/02a40bcb13ae6c1ca3a859a709354621b45c83857994943c9c409f85f183/preshed-3.0.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e88e4c7fbbfa7c23a90d7d0cbe27e4c5fa2fd742ef1be09c153f9ccd2c600098", size = 777924, upload-time = "2025-05-26T15:17:48.184Z" }, - { url = "https://files.pythonhosted.org/packages/11/13/bb2db0f037fc659494fbe964255f80fbca7e5e4154137e9855619e3543d9/preshed-3.0.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87780ae00def0c97130c9d1652295ec8362c2e4ca553673b64fe0dc7b321a382", size = 796024, upload-time = "2025-05-26T15:17:49.568Z" }, - { url = "https://files.pythonhosted.org/packages/99/ab/7187df84a32f02d987b689f4bbb1ad77304bdc8129d8fed483b8ebde113d/preshed-3.0.10-cp310-cp310-win_amd64.whl", hash = "sha256:32496f216255a6cbdd60965dde29ff42ed8fc2d77968c28ae875e3856c6fa01a", size = 117429, upload-time = "2025-05-26T15:17:51.091Z" }, - { url = "https://files.pythonhosted.org/packages/08/99/c3709638f687da339504d1daeca48604cadb338bf3556a1484d1f0cd95e6/preshed-3.0.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d96c4fe2b41c1cdcc8c4fc1fdb10f922a6095c0430a3ebe361fe62c78902d068", size = 131486, upload-time = "2025-05-26T15:17:52.231Z" }, - { url = "https://files.pythonhosted.org/packages/e0/27/0fd36b63caa8bbf57b31a121d9565d385bbd7521771d4eb93e17d326873d/preshed-3.0.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb01ea930b96f3301526a2ab26f41347d07555e4378c4144c6b7645074f2ebb0", size = 127938, upload-time = "2025-05-26T15:17:54.19Z" }, - { url = "https://files.pythonhosted.org/packages/90/54/6a876d9cc8d401a9c1fb6bb8ca5a31b3664d0bcb888a9016258a1ae17344/preshed-3.0.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dd1f0a7b7d150e229d073fd4fe94f72610cae992e907cee74687c4695873a98", size = 842263, upload-time = "2025-05-26T15:17:55.398Z" }, - { url = "https://files.pythonhosted.org/packages/1c/7d/ff19f74d15ee587905bafa3582883cfe2f72b574e6d691ee64dc690dc276/preshed-3.0.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fd7b350c280137f324cd447afbf6ba9a849af0e8898850046ac6f34010e08bd", size = 842913, upload-time = "2025-05-26T15:17:56.687Z" }, - { url = "https://files.pythonhosted.org/packages/f1/3a/1c345a26463345557705b61965e1e0a732cc0e9c6dfd4787845dbfa50b4a/preshed-3.0.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf6a5fdc89ad06079aa6ee63621e417d4f4cf2a3d8b63c72728baad35a9ff641", size = 820548, upload-time = "2025-05-26T15:17:58.057Z" }, - { url = "https://files.pythonhosted.org/packages/7f/6b/71f25e2b7a23dba168f43edfae0bb508552dbef89114ce65c73f2ea7172f/preshed-3.0.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b4c29a7bd66985808ad181c9ad05205a6aa7400cd0f98426acd7bc86588b93f8", size = 840379, upload-time = "2025-05-26T15:17:59.565Z" }, - { url = "https://files.pythonhosted.org/packages/3a/86/d8f32b0b31a36ee8770a9b1a95321430e364cd0ba4bfebb7348aed2f198d/preshed-3.0.10-cp311-cp311-win_amd64.whl", hash = "sha256:1367c1fd6f44296305315d4e1c3fe3171787d4d01c1008a76bc9466bd79c3249", size = 117655, upload-time = "2025-05-26T15:18:00.836Z" }, + { url = "https://files.pythonhosted.org/packages/66/12/3bfd7790481513d71a281a3a7194a6d7aa9a59289a109253e78d9bcedcec/preshed-3.0.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:14593c32e6705fda0fd54684293ca079530418bb1fb036dcbaa6c0ef0f144b7d", size = 131102 }, + { url = "https://files.pythonhosted.org/packages/e4/bf/54635387524315fe40b1f3d1688a5ad369f59a4e3a377b0da6e8a3ecba30/preshed-3.0.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba1960a3996678aded882260133853e19e3a251d9f35a19c9d7d830c4238c4eb", size = 127302 }, + { url = "https://files.pythonhosted.org/packages/fe/df/d057705c9c6aff877ee687f612f242006750f165c0e557f6075fe913a8e3/preshed-3.0.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0830c0a262015be743a01455a1da5963750afed1bde2395590b01af3b7da2741", size = 793737 }, + { url = "https://files.pythonhosted.org/packages/c4/73/9206a60e59e81a259d49273f95307821f5e88c84c400533ed0cb9a8093af/preshed-3.0.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:165dda5862c28e77ee1f3feabad98d4ebb65345f458b5626596b92fd20a65275", size = 795131 }, + { url = "https://files.pythonhosted.org/packages/25/18/02a40bcb13ae6c1ca3a859a709354621b45c83857994943c9c409f85f183/preshed-3.0.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e88e4c7fbbfa7c23a90d7d0cbe27e4c5fa2fd742ef1be09c153f9ccd2c600098", size = 777924 }, + { url = "https://files.pythonhosted.org/packages/11/13/bb2db0f037fc659494fbe964255f80fbca7e5e4154137e9855619e3543d9/preshed-3.0.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87780ae00def0c97130c9d1652295ec8362c2e4ca553673b64fe0dc7b321a382", size = 796024 }, + { url = "https://files.pythonhosted.org/packages/99/ab/7187df84a32f02d987b689f4bbb1ad77304bdc8129d8fed483b8ebde113d/preshed-3.0.10-cp310-cp310-win_amd64.whl", hash = "sha256:32496f216255a6cbdd60965dde29ff42ed8fc2d77968c28ae875e3856c6fa01a", size = 117429 }, + { url = "https://files.pythonhosted.org/packages/08/99/c3709638f687da339504d1daeca48604cadb338bf3556a1484d1f0cd95e6/preshed-3.0.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d96c4fe2b41c1cdcc8c4fc1fdb10f922a6095c0430a3ebe361fe62c78902d068", size = 131486 }, + { url = "https://files.pythonhosted.org/packages/e0/27/0fd36b63caa8bbf57b31a121d9565d385bbd7521771d4eb93e17d326873d/preshed-3.0.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:cb01ea930b96f3301526a2ab26f41347d07555e4378c4144c6b7645074f2ebb0", size = 127938 }, + { url = "https://files.pythonhosted.org/packages/90/54/6a876d9cc8d401a9c1fb6bb8ca5a31b3664d0bcb888a9016258a1ae17344/preshed-3.0.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dd1f0a7b7d150e229d073fd4fe94f72610cae992e907cee74687c4695873a98", size = 842263 }, + { url = "https://files.pythonhosted.org/packages/1c/7d/ff19f74d15ee587905bafa3582883cfe2f72b574e6d691ee64dc690dc276/preshed-3.0.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fd7b350c280137f324cd447afbf6ba9a849af0e8898850046ac6f34010e08bd", size = 842913 }, + { url = "https://files.pythonhosted.org/packages/f1/3a/1c345a26463345557705b61965e1e0a732cc0e9c6dfd4787845dbfa50b4a/preshed-3.0.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cf6a5fdc89ad06079aa6ee63621e417d4f4cf2a3d8b63c72728baad35a9ff641", size = 820548 }, + { url = "https://files.pythonhosted.org/packages/7f/6b/71f25e2b7a23dba168f43edfae0bb508552dbef89114ce65c73f2ea7172f/preshed-3.0.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b4c29a7bd66985808ad181c9ad05205a6aa7400cd0f98426acd7bc86588b93f8", size = 840379 }, + { url = "https://files.pythonhosted.org/packages/3a/86/d8f32b0b31a36ee8770a9b1a95321430e364cd0ba4bfebb7348aed2f198d/preshed-3.0.10-cp311-cp311-win_amd64.whl", hash = "sha256:1367c1fd6f44296305315d4e1c3fe3171787d4d01c1008a76bc9466bd79c3249", size = 117655 }, ] [[package]] @@ -1783,90 +1782,87 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload-time = "2025-04-15T09:18:47.731Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload-time = "2025-04-15T09:18:44.753Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, ] [[package]] name = "protobuf" version = "5.29.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/29/d09e70352e4e88c9c7a198d5645d7277811448d76c23b00345670f7c8a38/protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84", size = 425226, upload-time = "2025-05-28T23:51:59.82Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/29/d09e70352e4e88c9c7a198d5645d7277811448d76c23b00345670f7c8a38/protobuf-5.29.5.tar.gz", hash = "sha256:bc1463bafd4b0929216c35f437a8e28731a2b7fe3d98bb77a600efced5a15c84", size = 425226 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/11/6e40e9fc5bba02988a214c07cf324595789ca7820160bfd1f8be96e48539/protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079", size = 422963, upload-time = "2025-05-28T23:51:41.204Z" }, - { url = "https://files.pythonhosted.org/packages/81/7f/73cefb093e1a2a7c3ffd839e6f9fcafb7a427d300c7f8aef9c64405d8ac6/protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc", size = 434818, upload-time = "2025-05-28T23:51:44.297Z" }, - { url = "https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671", size = 418091, upload-time = "2025-05-28T23:51:45.907Z" }, - { url = "https://files.pythonhosted.org/packages/6c/04/98f6f8cf5b07ab1294c13f34b4e69b3722bb609c5b701d6c169828f9f8aa/protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015", size = 319824, upload-time = "2025-05-28T23:51:47.545Z" }, - { url = "https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61", size = 319942, upload-time = "2025-05-28T23:51:49.11Z" }, - { url = "https://files.pythonhosted.org/packages/7e/cc/7e77861000a0691aeea8f4566e5d3aa716f2b1dece4a24439437e41d3d25/protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5", size = 172823, upload-time = "2025-05-28T23:51:58.157Z" }, + { url = "https://files.pythonhosted.org/packages/5f/11/6e40e9fc5bba02988a214c07cf324595789ca7820160bfd1f8be96e48539/protobuf-5.29.5-cp310-abi3-win32.whl", hash = "sha256:3f1c6468a2cfd102ff4703976138844f78ebd1fb45f49011afc5139e9e283079", size = 422963 }, + { url = "https://files.pythonhosted.org/packages/81/7f/73cefb093e1a2a7c3ffd839e6f9fcafb7a427d300c7f8aef9c64405d8ac6/protobuf-5.29.5-cp310-abi3-win_amd64.whl", hash = "sha256:3f76e3a3675b4a4d867b52e4a5f5b78a2ef9565549d4037e06cf7b0942b1d3fc", size = 434818 }, + { url = "https://files.pythonhosted.org/packages/dd/73/10e1661c21f139f2c6ad9b23040ff36fee624310dc28fba20d33fdae124c/protobuf-5.29.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e38c5add5a311f2a6eb0340716ef9b039c1dfa428b28f25a7838ac329204a671", size = 418091 }, + { url = "https://files.pythonhosted.org/packages/6c/04/98f6f8cf5b07ab1294c13f34b4e69b3722bb609c5b701d6c169828f9f8aa/protobuf-5.29.5-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:fa18533a299d7ab6c55a238bf8629311439995f2e7eca5caaff08663606e9015", size = 319824 }, + { url = "https://files.pythonhosted.org/packages/85/e4/07c80521879c2d15f321465ac24c70efe2381378c00bf5e56a0f4fbac8cd/protobuf-5.29.5-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:63848923da3325e1bf7e9003d680ce6e14b07e55d0473253a690c3a8b8fd6e61", size = 319942 }, + { url = "https://files.pythonhosted.org/packages/7e/cc/7e77861000a0691aeea8f4566e5d3aa716f2b1dece4a24439437e41d3d25/protobuf-5.29.5-py3-none-any.whl", hash = "sha256:6cf42630262c59b2d8de33954443d94b746c952b01434fc58a417fdbd2e84bd5", size = 172823 }, ] [[package]] name = "psutil" version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } 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" }, + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } 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" }, + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, ] [[package]] name = "pyarrow" -version = "15.0.2" +version = "21.0.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/35/a1/b7c9bacfd17a9d1d8d025db2fc39112e0b1a629ea401880e4e97632dbc4c/pyarrow-15.0.2.tar.gz", hash = "sha256:9c9bc803cb3b7bfacc1e96ffbfd923601065d9d3f911179d81e72d99fd74a3d9", size = 1064226, upload-time = "2024-03-18T16:58:06.866Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/fc/9e58e43f41d161bf3b3bcc580170b3b0bdac8c0f1603a65b967cf94b6bf4/pyarrow-15.0.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:88b340f0a1d05b5ccc3d2d986279045655b1fe8e41aba6ca44ea28da0d1455d8", size = 27150472, upload-time = "2024-03-18T16:53:30.164Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f4/d39bdce9661621df9bdb511c3f72c81817edc8bc6365672b22a5de41004a/pyarrow-15.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eaa8f96cecf32da508e6c7f69bb8401f03745c050c1dd42ec2596f2e98deecac", size = 24196261, upload-time = "2024-03-18T16:53:37.402Z" }, - { url = "https://files.pythonhosted.org/packages/1a/b2/de978e01592192695c7449c6fa28f2269bf74808b533a177c90ee6295bdd/pyarrow-15.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23c6753ed4f6adb8461e7c383e418391b8d8453c5d67e17f416c3a5d5709afbd", size = 36153060, upload-time = "2024-03-18T16:53:46.902Z" }, - { url = "https://files.pythonhosted.org/packages/01/e0/13aada7b0af1039554e675bd8c878acb3d86bab690e5a6b05fc8547a9cf2/pyarrow-15.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f639c059035011db8c0497e541a8a45d98a58dbe34dc8fadd0ef128f2cee46e5", size = 38402930, upload-time = "2024-03-18T16:53:55.894Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f9/7f82c25c89828f38ebc2ce2f7d6b544107bc7502255ed92ac398be69cc19/pyarrow-15.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:290e36a59a0993e9a5224ed2fb3e53375770f07379a0ea03ee2fce2e6d30b423", size = 35655190, upload-time = "2024-03-18T16:54:04.8Z" }, - { url = "https://files.pythonhosted.org/packages/e9/0e/0d30e6fd1e0fc9cc267381520f9386a56b2b51c4066d8f9a0d4a5a2e0b44/pyarrow-15.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06c2bb2a98bc792f040bef31ad3e9be6a63d0cb39189227c08a7d955db96816e", size = 38331501, upload-time = "2024-03-18T16:54:14.322Z" }, - { url = "https://files.pythonhosted.org/packages/ec/85/abca962d99950aad803bd755baf020a8183ca3be1319bb205f52bbbcce16/pyarrow-15.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:f7a197f3670606a960ddc12adbe8075cea5f707ad7bf0dffa09637fdbb89f76c", size = 24814742, upload-time = "2024-03-18T16:54:21.932Z" }, - { url = "https://files.pythonhosted.org/packages/34/50/93f6104e79bec6e1af4356f5164695a0b6338f230e1273706ec9eb836bea/pyarrow-15.0.2-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5f8bc839ea36b1f99984c78e06e7a06054693dc2af8920f6fb416b5bca9944e4", size = 27187122, upload-time = "2024-03-18T16:54:29.514Z" }, - { url = "https://files.pythonhosted.org/packages/47/cb/be17c4879e60e683761be281d955923d586a572fbc2503e08f08ca713349/pyarrow-15.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5e81dfb4e519baa6b4c80410421528c214427e77ca0ea9461eb4097c328fa33", size = 24217346, upload-time = "2024-03-18T16:54:36.41Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f6/57d67d7729643ebc80f0df18420b9fc1857ca418d1b2bb3bc5be2fd2119e/pyarrow-15.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4f240852b302a7af4646c8bfe9950c4691a419847001178662a98915fd7ee7", size = 36151795, upload-time = "2024-03-18T16:54:44.674Z" }, - { url = "https://files.pythonhosted.org/packages/ff/42/df219f3a1e06c2dd63599243384d6ba2a02a44a976801fbc9601264ff562/pyarrow-15.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e7d9cfb5a1e648e172428c7a42b744610956f3b70f524aa3a6c02a448ba853e", size = 38398065, upload-time = "2024-03-18T16:54:53.221Z" }, - { url = "https://files.pythonhosted.org/packages/4a/37/a32de321c7270df01b709f554903acf4edaaef373310ff116302224348a9/pyarrow-15.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2d4f905209de70c0eb5b2de6763104d5a9a37430f137678edfb9a675bac9cd98", size = 35672270, upload-time = "2024-03-18T16:55:02.175Z" }, - { url = "https://files.pythonhosted.org/packages/61/94/0b28417737ea56a4819603c0024c8b24365f85154bb938785352e09bea55/pyarrow-15.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90adb99e8ce5f36fbecbbc422e7dcbcbed07d985eed6062e459e23f9e71fd197", size = 38346410, upload-time = "2024-03-18T16:55:10.399Z" }, - { url = "https://files.pythonhosted.org/packages/96/2f/0092154f3e1ebbc814de1f8a9075543d77a7ecc691fbad407df174799abe/pyarrow-15.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:b116e7fd7889294cbd24eb90cd9bdd3850be3738d61297855a71ac3b8124ee38", size = 24799922, upload-time = "2024-03-18T16:55:17.261Z" }, + { url = "https://files.pythonhosted.org/packages/17/d9/110de31880016e2afc52d8580b397dbe47615defbf09ca8cf55f56c62165/pyarrow-21.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:e563271e2c5ff4d4a4cbeb2c83d5cf0d4938b891518e676025f7268c6fe5fe26", size = 31196837 }, + { url = "https://files.pythonhosted.org/packages/df/5f/c1c1997613abf24fceb087e79432d24c19bc6f7259cab57c2c8e5e545fab/pyarrow-21.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:fee33b0ca46f4c85443d6c450357101e47d53e6c3f008d658c27a2d020d44c79", size = 32659470 }, + { url = "https://files.pythonhosted.org/packages/3e/ed/b1589a777816ee33ba123ba1e4f8f02243a844fed0deec97bde9fb21a5cf/pyarrow-21.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:7be45519b830f7c24b21d630a31d48bcebfd5d4d7f9d3bdb49da9cdf6d764edb", size = 41055619 }, + { url = "https://files.pythonhosted.org/packages/44/28/b6672962639e85dc0ac36f71ab3a8f5f38e01b51343d7aa372a6b56fa3f3/pyarrow-21.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:26bfd95f6bff443ceae63c65dc7e048670b7e98bc892210acba7e4995d3d4b51", size = 42733488 }, + { url = "https://files.pythonhosted.org/packages/f8/cc/de02c3614874b9089c94eac093f90ca5dfa6d5afe45de3ba847fd950fdf1/pyarrow-21.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bd04ec08f7f8bd113c55868bd3fc442a9db67c27af098c5f814a3091e71cc61a", size = 43329159 }, + { url = "https://files.pythonhosted.org/packages/a6/3e/99473332ac40278f196e105ce30b79ab8affab12f6194802f2593d6b0be2/pyarrow-21.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9b0b14b49ac10654332a805aedfc0147fb3469cbf8ea951b3d040dab12372594", size = 45050567 }, + { url = "https://files.pythonhosted.org/packages/7b/f5/c372ef60593d713e8bfbb7e0c743501605f0ad00719146dc075faf11172b/pyarrow-21.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:9d9f8bcb4c3be7738add259738abdeddc363de1b80e3310e04067aa1ca596634", size = 26217959 }, + { url = "https://files.pythonhosted.org/packages/94/dc/80564a3071a57c20b7c32575e4a0120e8a330ef487c319b122942d665960/pyarrow-21.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c077f48aab61738c237802836fc3844f85409a46015635198761b0d6a688f87b", size = 31243234 }, + { url = "https://files.pythonhosted.org/packages/ea/cc/3b51cb2db26fe535d14f74cab4c79b191ed9a8cd4cbba45e2379b5ca2746/pyarrow-21.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:689f448066781856237eca8d1975b98cace19b8dd2ab6145bf49475478bcaa10", size = 32714370 }, + { url = "https://files.pythonhosted.org/packages/24/11/a4431f36d5ad7d83b87146f515c063e4d07ef0b7240876ddb885e6b44f2e/pyarrow-21.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:479ee41399fcddc46159a551705b89c05f11e8b8cb8e968f7fec64f62d91985e", size = 41135424 }, + { url = "https://files.pythonhosted.org/packages/74/dc/035d54638fc5d2971cbf1e987ccd45f1091c83bcf747281cf6cc25e72c88/pyarrow-21.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:40ebfcb54a4f11bcde86bc586cbd0272bac0d516cfa539c799c2453768477569", size = 42823810 }, + { url = "https://files.pythonhosted.org/packages/2e/3b/89fced102448a9e3e0d4dded1f37fa3ce4700f02cdb8665457fcc8015f5b/pyarrow-21.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8d58d8497814274d3d20214fbb24abcad2f7e351474357d552a8d53bce70c70e", size = 43391538 }, + { url = "https://files.pythonhosted.org/packages/fb/bb/ea7f1bd08978d39debd3b23611c293f64a642557e8141c80635d501e6d53/pyarrow-21.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:585e7224f21124dd57836b1530ac8f2df2afc43c861d7bf3d58a4870c42ae36c", size = 45120056 }, + { url = "https://files.pythonhosted.org/packages/6e/0b/77ea0600009842b30ceebc3337639a7380cd946061b620ac1a2f3cb541e2/pyarrow-21.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:555ca6935b2cbca2c0e932bedd853e9bc523098c39636de9ad4693b5b1df86d6", size = 26220568 }, ] [[package]] name = "pycparser" version = "2.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, ] [[package]] @@ -1879,9 +1875,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782 }, ] [[package]] @@ -1891,53 +1887,53 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817, upload-time = "2025-04-23T18:30:43.919Z" }, - { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357, upload-time = "2025-04-23T18:30:46.372Z" }, - { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011, upload-time = "2025-04-23T18:30:47.591Z" }, - { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730, upload-time = "2025-04-23T18:30:49.328Z" }, - { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178, upload-time = "2025-04-23T18:30:50.907Z" }, - { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462, upload-time = "2025-04-23T18:30:52.083Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652, upload-time = "2025-04-23T18:30:53.389Z" }, - { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306, upload-time = "2025-04-23T18:30:54.661Z" }, - { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720, upload-time = "2025-04-23T18:30:56.11Z" }, - { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915, upload-time = "2025-04-23T18:30:57.501Z" }, - { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884, upload-time = "2025-04-23T18:30:58.867Z" }, - { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496, upload-time = "2025-04-23T18:31:00.078Z" }, - { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019, upload-time = "2025-04-23T18:31:01.335Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, - { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, - { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, - { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, - { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, - { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, - { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, - { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, - { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, - { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, - { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, - { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, - { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982, upload-time = "2025-04-23T18:32:53.14Z" }, - { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412, upload-time = "2025-04-23T18:32:55.52Z" }, - { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749, upload-time = "2025-04-23T18:32:57.546Z" }, - { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527, upload-time = "2025-04-23T18:32:59.771Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225, upload-time = "2025-04-23T18:33:04.51Z" }, - { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490, upload-time = "2025-04-23T18:33:06.391Z" }, - { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525, upload-time = "2025-04-23T18:33:08.44Z" }, - { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446, upload-time = "2025-04-23T18:33:10.313Z" }, - { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678, upload-time = "2025-04-23T18:33:12.224Z" }, - { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, - { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, - { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, - { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, - { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, - { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, - { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, - { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, - { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/92/b31726561b5dae176c2d2c2dc43a9c5bfba5d32f96f8b4c0a600dd492447/pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", size = 2028817 }, + { url = "https://files.pythonhosted.org/packages/a3/44/3f0b95fafdaca04a483c4e685fe437c6891001bf3ce8b2fded82b9ea3aa1/pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", size = 1861357 }, + { url = "https://files.pythonhosted.org/packages/30/97/e8f13b55766234caae05372826e8e4b3b96e7b248be3157f53237682e43c/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", size = 1898011 }, + { url = "https://files.pythonhosted.org/packages/9b/a3/99c48cf7bafc991cc3ee66fd544c0aae8dc907b752f1dad2d79b1b5a471f/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", size = 1982730 }, + { url = "https://files.pythonhosted.org/packages/de/8e/a5b882ec4307010a840fb8b58bd9bf65d1840c92eae7534c7441709bf54b/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", size = 2136178 }, + { url = "https://files.pythonhosted.org/packages/e4/bb/71e35fc3ed05af6834e890edb75968e2802fe98778971ab5cba20a162315/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", size = 2736462 }, + { url = "https://files.pythonhosted.org/packages/31/0d/c8f7593e6bc7066289bbc366f2235701dcbebcd1ff0ef8e64f6f239fb47d/pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", size = 2005652 }, + { url = "https://files.pythonhosted.org/packages/d2/7a/996d8bd75f3eda405e3dd219ff5ff0a283cd8e34add39d8ef9157e722867/pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", size = 2113306 }, + { url = "https://files.pythonhosted.org/packages/ff/84/daf2a6fb2db40ffda6578a7e8c5a6e9c8affb251a05c233ae37098118788/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", size = 2073720 }, + { url = "https://files.pythonhosted.org/packages/77/fb/2258da019f4825128445ae79456a5499c032b55849dbd5bed78c95ccf163/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", size = 2244915 }, + { url = "https://files.pythonhosted.org/packages/d8/7a/925ff73756031289468326e355b6fa8316960d0d65f8b5d6b3a3e7866de7/pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", size = 2241884 }, + { url = "https://files.pythonhosted.org/packages/0b/b0/249ee6d2646f1cdadcb813805fe76265745c4010cf20a8eba7b0e639d9b2/pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", size = 1910496 }, + { url = "https://files.pythonhosted.org/packages/66/ff/172ba8f12a42d4b552917aa65d1f2328990d3ccfc01d5b7c943ec084299f/pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", size = 1955019 }, + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584 }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071 }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823 }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792 }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338 }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998 }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200 }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890 }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359 }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883 }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074 }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538 }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909 }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786 }, + { url = "https://files.pythonhosted.org/packages/30/68/373d55e58b7e83ce371691f6eaa7175e3a24b956c44628eb25d7da007917/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", size = 2023982 }, + { url = "https://files.pythonhosted.org/packages/a4/16/145f54ac08c96a63d8ed6442f9dec17b2773d19920b627b18d4f10a061ea/pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", size = 1858412 }, + { url = "https://files.pythonhosted.org/packages/41/b1/c6dc6c3e2de4516c0bb2c46f6a373b91b5660312342a0cf5826e38ad82fa/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", size = 1892749 }, + { url = "https://files.pythonhosted.org/packages/12/73/8cd57e20afba760b21b742106f9dbdfa6697f1570b189c7457a1af4cd8a0/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", size = 2067527 }, + { url = "https://files.pythonhosted.org/packages/e3/d5/0bb5d988cc019b3cba4a78f2d4b3854427fc47ee8ec8e9eaabf787da239c/pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", size = 2108225 }, + { url = "https://files.pythonhosted.org/packages/f1/c5/00c02d1571913d496aabf146106ad8239dc132485ee22efe08085084ff7c/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", size = 2069490 }, + { url = "https://files.pythonhosted.org/packages/22/a8/dccc38768274d3ed3a59b5d06f59ccb845778687652daa71df0cab4040d7/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", size = 2237525 }, + { url = "https://files.pythonhosted.org/packages/d4/e7/4f98c0b125dda7cf7ccd14ba936218397b44f50a56dd8c16a3091df116c3/pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", size = 2238446 }, + { url = "https://files.pythonhosted.org/packages/ce/91/2ec36480fdb0b783cd9ef6795753c1dea13882f2e68e73bce76ae8c21e6a/pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", size = 2066678 }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200 }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123 }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852 }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484 }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896 }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475 }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013 }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715 }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757 }, ] [[package]] @@ -1948,27 +1944,27 @@ dependencies = [ { name = "jinja2" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/ca/40e14e196864a0f61a92abb14d09b3d3da98f94ccb03b49cf51688140dab/pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605", size = 3832240, upload-time = "2024-05-10T15:36:21.153Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/ca/40e14e196864a0f61a92abb14d09b3d3da98f94ccb03b49cf51688140dab/pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605", size = 3832240 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038", size = 6900403, upload-time = "2024-05-10T15:36:17.36Z" }, + { url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038", size = 6900403 }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, ] [[package]] name = "pyjwt" version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, ] [package.optional-dependencies] @@ -1985,12 +1981,12 @@ dependencies = [ { name = "pyarrow" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/d9/f2a5ee73b07df1c2c6bc06b53f67960caa5374f55118ee46fabe35396de5/pylance-0.20.0-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:fbb640b00567ff79d23a5994c0f0bc97587fcf74ece6ca568e77c453f70801c5", size = 31512397, upload-time = "2024-12-04T22:59:47.925Z" }, - { url = "https://files.pythonhosted.org/packages/01/dc/14c8321a08bbe110789e19aa8b9ba840f52ef8db88d0cdd9c3a29789791b/pylance-0.20.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8e30f1b6429b843429fde8f3d6fb7e715153174161e3bcf29902e2d32ee471f", size = 29266199, upload-time = "2024-12-04T22:42:09.353Z" }, - { url = "https://files.pythonhosted.org/packages/1e/2c/f262507cdbed70994afc8bcc60beae2b823d10967bc632d9144806f035d4/pylance-0.20.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032242a347ac909db81c0ade6384d82102f4ec61bc892d8caaa04b3d0a7b1613", size = 33539993, upload-time = "2024-12-04T22:41:27.379Z" }, - { url = "https://files.pythonhosted.org/packages/41/9c/88eb6eb07f1a803dec43930d28c587d9df3dc996337d399fa74bcb3cbb10/pylance-0.20.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:5320f11925524c1a67279afc4638cad60f61c36f11d3d9c2a91651489874be0d", size = 31858413, upload-time = "2024-12-04T22:41:48.2Z" }, - { url = "https://files.pythonhosted.org/packages/22/d2/acaf3328d1bd55201f9775d8b8a3f7c497966d3f3371e22aabb269cb4f0f/pylance-0.20.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:fa5acd4488c574f6017145eafd5b45b178d611a5cbcd2ed492e01013fc72f5a2", size = 33465409, upload-time = "2024-12-04T22:41:44.675Z" }, - { url = "https://files.pythonhosted.org/packages/c7/0a/c012ef957c3c99edf7a87d5f77ccf174bdf161d4ae1aac2181d750fcbcd5/pylance-0.20.0-cp39-abi3-win_amd64.whl", hash = "sha256:587850cddd0e669addd9414f378fa30527fc9020010cb73c842f026ea8a9b4ea", size = 31356456, upload-time = "2024-12-04T22:52:54.62Z" }, + { url = "https://files.pythonhosted.org/packages/c1/d9/f2a5ee73b07df1c2c6bc06b53f67960caa5374f55118ee46fabe35396de5/pylance-0.20.0-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:fbb640b00567ff79d23a5994c0f0bc97587fcf74ece6ca568e77c453f70801c5", size = 31512397 }, + { url = "https://files.pythonhosted.org/packages/01/dc/14c8321a08bbe110789e19aa8b9ba840f52ef8db88d0cdd9c3a29789791b/pylance-0.20.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8e30f1b6429b843429fde8f3d6fb7e715153174161e3bcf29902e2d32ee471f", size = 29266199 }, + { url = "https://files.pythonhosted.org/packages/1e/2c/f262507cdbed70994afc8bcc60beae2b823d10967bc632d9144806f035d4/pylance-0.20.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032242a347ac909db81c0ade6384d82102f4ec61bc892d8caaa04b3d0a7b1613", size = 33539993 }, + { url = "https://files.pythonhosted.org/packages/41/9c/88eb6eb07f1a803dec43930d28c587d9df3dc996337d399fa74bcb3cbb10/pylance-0.20.0-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:5320f11925524c1a67279afc4638cad60f61c36f11d3d9c2a91651489874be0d", size = 31858413 }, + { url = "https://files.pythonhosted.org/packages/22/d2/acaf3328d1bd55201f9775d8b8a3f7c497966d3f3371e22aabb269cb4f0f/pylance-0.20.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:fa5acd4488c574f6017145eafd5b45b178d611a5cbcd2ed492e01013fc72f5a2", size = 33465409 }, + { url = "https://files.pythonhosted.org/packages/c7/0a/c012ef957c3c99edf7a87d5f77ccf174bdf161d4ae1aac2181d750fcbcd5/pylance-0.20.0-cp39-abi3-win_amd64.whl", hash = "sha256:587850cddd0e669addd9414f378fa30527fc9020010cb73c842f026ea8a9b4ea", size = 31356456 }, ] [[package]] @@ -2004,18 +2000,18 @@ dependencies = [ { name = "scikit-learn" }, { name = "scipy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/58/560a4db5eb3794d922fe55804b10326534ded3d971e1933c1eef91193f5e/pynndescent-0.5.13.tar.gz", hash = "sha256:d74254c0ee0a1eeec84597d5fe89fedcf778593eeabe32c2f97412934a9800fb", size = 2975955, upload-time = "2024-06-17T15:48:32.914Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/58/560a4db5eb3794d922fe55804b10326534ded3d971e1933c1eef91193f5e/pynndescent-0.5.13.tar.gz", hash = "sha256:d74254c0ee0a1eeec84597d5fe89fedcf778593eeabe32c2f97412934a9800fb", size = 2975955 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/53/d23a97e0a2c690d40b165d1062e2c4ccc796be458a1ce59f6ba030434663/pynndescent-0.5.13-py3-none-any.whl", hash = "sha256:69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949", size = 56850, upload-time = "2024-06-17T15:48:31.184Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/d23a97e0a2c690d40b165d1062e2c4ccc796be458a1ce59f6ba030434663/pynndescent-0.5.13-py3-none-any.whl", hash = "sha256:69aabb8f394bc631b6ac475a1c7f3994c54adf3f51cd63b2730fefba5771b949", size = 56850 }, ] [[package]] name = "pyparsing" version = "3.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608, upload-time = "2025-03-25T05:01:28.114Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/22/f1129e69d94ffff626bdb5c835506b3a5b4f3d070f17ea295e12c2c6f60f/pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be", size = 1088608 } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, + { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120 }, ] [[package]] @@ -2026,9 +2022,9 @@ dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/f6/35f885264ff08c960b23d1542038d8da86971c5d8c955cfab195a4f672d7/pyright-1.1.403.tar.gz", hash = "sha256:3ab69b9f41c67fb5bbb4d7a36243256f0d549ed3608678d381d5f51863921104", size = 3913526, upload-time = "2025-07-09T07:15:52.882Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/f6/35f885264ff08c960b23d1542038d8da86971c5d8c955cfab195a4f672d7/pyright-1.1.403.tar.gz", hash = "sha256:3ab69b9f41c67fb5bbb4d7a36243256f0d549ed3608678d381d5f51863921104", size = 3913526 } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/b6/b04e5c2f41a5ccad74a1a4759da41adb20b4bc9d59a5e08d29ba60084d07/pyright-1.1.403-py3-none-any.whl", hash = "sha256:c0eeca5aa76cbef3fcc271259bbd785753c7ad7bcac99a9162b4c4c7daed23b3", size = 5684504, upload-time = "2025-07-09T07:15:50.958Z" }, + { url = "https://files.pythonhosted.org/packages/49/b6/b04e5c2f41a5ccad74a1a4759da41adb20b4bc9d59a5e08d29ba60084d07/pyright-1.1.403-py3-none-any.whl", hash = "sha256:c0eeca5aa76cbef3fcc271259bbd785753c7ad7bcac99a9162b4c4c7daed23b3", size = 5684504 }, ] [[package]] @@ -2038,27 +2034,27 @@ 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" } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } 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" }, + { 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 }, ] [[package]] name = "python-dotenv" version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556 }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] [[package]] @@ -2066,38 +2062,38 @@ name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, - { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, - { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, - { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, - { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, - { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432 }, + { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103 }, + { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557 }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031 }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308 }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930 }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199, upload-time = "2024-08-06T20:31:40.178Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758, upload-time = "2024-08-06T20:31:42.173Z" }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463, upload-time = "2024-08-06T20:31:44.263Z" }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280, upload-time = "2024-08-06T20:31:50.199Z" }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239, upload-time = "2024-08-06T20:31:52.292Z" }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802, upload-time = "2024-08-06T20:31:53.836Z" }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527, upload-time = "2024-08-06T20:31:55.565Z" }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052, upload-time = "2024-08-06T20:31:56.914Z" }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774, upload-time = "2024-08-06T20:31:58.304Z" }, - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, + { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, + { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, + { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, + { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, + { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, + { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, + { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, + { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, ] [[package]] @@ -2107,48 +2103,48 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478, upload-time = "2025-06-13T14:09:07.087Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9c/09/1681d4b047626d352c083770618ac29655ab1f5c20eee31dc94c000b9b7b/pyzmq-27.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a", size = 1329291, upload-time = "2025-06-13T14:06:57.945Z" }, - { url = "https://files.pythonhosted.org/packages/9d/b2/9c9385225fdd54db9506ed8accbb9ea63ca813ba59d43d7f282a6a16a30b/pyzmq-27.0.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4", size = 905952, upload-time = "2025-06-13T14:07:03.232Z" }, - { url = "https://files.pythonhosted.org/packages/41/73/333c72c7ec182cdffe25649e3da1c3b9f3cf1cede63cfdc23d1384d4a601/pyzmq-27.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246", size = 666165, upload-time = "2025-06-13T14:07:04.667Z" }, - { url = "https://files.pythonhosted.org/packages/a5/fe/fc7b9c1a50981928e25635a926653cb755364316db59ccd6e79cfb9a0b4f/pyzmq-27.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb", size = 853755, upload-time = "2025-06-13T14:07:06.93Z" }, - { url = "https://files.pythonhosted.org/packages/8c/4c/740ed4b6e8fa160cd19dc5abec8db68f440564b2d5b79c1d697d9862a2f7/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d", size = 1654868, upload-time = "2025-06-13T14:07:08.224Z" }, - { url = "https://files.pythonhosted.org/packages/97/00/875b2ecfcfc78ab962a59bd384995186818524ea957dc8ad3144611fae12/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28", size = 2033443, upload-time = "2025-06-13T14:07:09.653Z" }, - { url = "https://files.pythonhosted.org/packages/60/55/6dd9c470c42d713297c5f2a56f7903dc1ebdb4ab2edda996445c21651900/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413", size = 1891288, upload-time = "2025-06-13T14:07:11.099Z" }, - { url = "https://files.pythonhosted.org/packages/28/5d/54b0ef50d40d7c65a627f4a4b4127024ba9820f2af8acd933a4d30ae192e/pyzmq-27.0.0-cp310-cp310-win32.whl", hash = "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b", size = 567936, upload-time = "2025-06-13T14:07:12.468Z" }, - { url = "https://files.pythonhosted.org/packages/18/ea/dedca4321de748ca48d3bcdb72274d4d54e8d84ea49088d3de174bd45d88/pyzmq-27.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c", size = 628686, upload-time = "2025-06-13T14:07:14.051Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a7/fcdeedc306e71e94ac262cba2d02337d885f5cdb7e8efced8e5ffe327808/pyzmq-27.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198", size = 559039, upload-time = "2025-06-13T14:07:15.289Z" }, - { url = "https://files.pythonhosted.org/packages/44/df/84c630654106d9bd9339cdb564aa941ed41b023a0264251d6743766bb50e/pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564", size = 1332718, upload-time = "2025-06-13T14:07:16.555Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8e/f6a5461a07654d9840d256476434ae0ff08340bba562a455f231969772cb/pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251", size = 908248, upload-time = "2025-06-13T14:07:18.033Z" }, - { url = "https://files.pythonhosted.org/packages/7c/93/82863e8d695a9a3ae424b63662733ae204a295a2627d52af2f62c2cd8af9/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa", size = 668647, upload-time = "2025-06-13T14:07:19.378Z" }, - { url = "https://files.pythonhosted.org/packages/f3/85/15278769b348121eacdbfcbd8c4d40f1102f32fa6af5be1ffc032ed684be/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f", size = 856600, upload-time = "2025-06-13T14:07:20.906Z" }, - { url = "https://files.pythonhosted.org/packages/d4/af/1c469b3d479bd095edb28e27f12eee10b8f00b356acbefa6aeb14dd295d1/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495", size = 1657748, upload-time = "2025-06-13T14:07:22.549Z" }, - { url = "https://files.pythonhosted.org/packages/8c/f4/17f965d0ee6380b1d6326da842a50e4b8b9699745161207945f3745e8cb5/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667", size = 2034311, upload-time = "2025-06-13T14:07:23.966Z" }, - { url = "https://files.pythonhosted.org/packages/e0/6e/7c391d81fa3149fd759de45d298003de6cfab343fb03e92c099821c448db/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e", size = 1893630, upload-time = "2025-06-13T14:07:25.899Z" }, - { url = "https://files.pythonhosted.org/packages/0e/e0/eaffe7a86f60e556399e224229e7769b717f72fec0706b70ab2c03aa04cb/pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff", size = 567706, upload-time = "2025-06-13T14:07:27.595Z" }, - { url = "https://files.pythonhosted.org/packages/c9/05/89354a8cffdcce6e547d48adaaf7be17007fc75572123ff4ca90a4ca04fc/pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed", size = 630322, upload-time = "2025-06-13T14:07:28.938Z" }, - { url = "https://files.pythonhosted.org/packages/fa/07/4ab976d5e1e63976719389cc4f3bfd248a7f5f2bb2ebe727542363c61b5f/pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38", size = 558435, upload-time = "2025-06-13T14:07:30.256Z" }, - { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438, upload-time = "2025-06-13T14:07:31.676Z" }, - { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095, upload-time = "2025-06-13T14:07:33.104Z" }, - { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826, upload-time = "2025-06-13T14:07:34.831Z" }, - { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750, upload-time = "2025-06-13T14:07:36.553Z" }, - { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357, upload-time = "2025-06-13T14:07:38.21Z" }, - { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281, upload-time = "2025-06-13T14:07:39.599Z" }, - { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110, upload-time = "2025-06-13T14:07:41.027Z" }, - { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297, upload-time = "2025-06-13T14:07:42.533Z" }, - { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203, upload-time = "2025-06-13T14:07:43.843Z" }, - { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927, upload-time = "2025-06-13T14:07:45.51Z" }, - { url = "https://files.pythonhosted.org/packages/09/6f/be6523a7f3821c0b5370912ef02822c028611360e0d206dd945bdbf9eaef/pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745", size = 835950, upload-time = "2025-06-13T14:08:35Z" }, - { url = "https://files.pythonhosted.org/packages/c6/1e/a50fdd5c15018de07ab82a61bc460841be967ee7bbe7abee3b714d66f7ac/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab", size = 799876, upload-time = "2025-06-13T14:08:36.849Z" }, - { url = "https://files.pythonhosted.org/packages/88/a1/89eb5b71f5a504f8f887aceb8e1eb3626e00c00aa8085381cdff475440dc/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb", size = 567400, upload-time = "2025-06-13T14:08:38.95Z" }, - { url = "https://files.pythonhosted.org/packages/56/aa/4571dbcff56cfb034bac73fde8294e123c975ce3eea89aff31bf6dc6382b/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551", size = 747031, upload-time = "2025-06-13T14:08:40.413Z" }, - { url = "https://files.pythonhosted.org/packages/46/e0/d25f30fe0991293c5b2f5ef3b070d35fa6d57c0c7428898c3ab4913d0297/pyzmq-27.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0", size = 544726, upload-time = "2025-06-13T14:08:41.997Z" }, - { url = "https://files.pythonhosted.org/packages/98/a6/92394373b8dbc1edc9d53c951e8d3989d518185174ee54492ec27711779d/pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae", size = 835948, upload-time = "2025-06-13T14:08:43.516Z" }, - { url = "https://files.pythonhosted.org/packages/56/f3/4dc38d75d9995bfc18773df3e41f2a2ca9b740b06f1a15dbf404077e7588/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7", size = 799874, upload-time = "2025-06-13T14:08:45.017Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ba/64af397e0f421453dc68e31d5e0784d554bf39013a2de0872056e96e58af/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174", size = 567400, upload-time = "2025-06-13T14:08:46.855Z" }, - { url = "https://files.pythonhosted.org/packages/63/87/ec956cbe98809270b59a22891d5758edae147a258e658bf3024a8254c855/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e", size = 747031, upload-time = "2025-06-13T14:08:48.419Z" }, - { url = "https://files.pythonhosted.org/packages/be/8a/4a3764a68abc02e2fbb0668d225b6fda5cd39586dd099cee8b2ed6ab0452/pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46", size = 544726, upload-time = "2025-06-13T14:08:49.903Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/09/1681d4b047626d352c083770618ac29655ab1f5c20eee31dc94c000b9b7b/pyzmq-27.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a", size = 1329291 }, + { url = "https://files.pythonhosted.org/packages/9d/b2/9c9385225fdd54db9506ed8accbb9ea63ca813ba59d43d7f282a6a16a30b/pyzmq-27.0.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4", size = 905952 }, + { url = "https://files.pythonhosted.org/packages/41/73/333c72c7ec182cdffe25649e3da1c3b9f3cf1cede63cfdc23d1384d4a601/pyzmq-27.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246", size = 666165 }, + { url = "https://files.pythonhosted.org/packages/a5/fe/fc7b9c1a50981928e25635a926653cb755364316db59ccd6e79cfb9a0b4f/pyzmq-27.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb", size = 853755 }, + { url = "https://files.pythonhosted.org/packages/8c/4c/740ed4b6e8fa160cd19dc5abec8db68f440564b2d5b79c1d697d9862a2f7/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d", size = 1654868 }, + { url = "https://files.pythonhosted.org/packages/97/00/875b2ecfcfc78ab962a59bd384995186818524ea957dc8ad3144611fae12/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28", size = 2033443 }, + { url = "https://files.pythonhosted.org/packages/60/55/6dd9c470c42d713297c5f2a56f7903dc1ebdb4ab2edda996445c21651900/pyzmq-27.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413", size = 1891288 }, + { url = "https://files.pythonhosted.org/packages/28/5d/54b0ef50d40d7c65a627f4a4b4127024ba9820f2af8acd933a4d30ae192e/pyzmq-27.0.0-cp310-cp310-win32.whl", hash = "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b", size = 567936 }, + { url = "https://files.pythonhosted.org/packages/18/ea/dedca4321de748ca48d3bcdb72274d4d54e8d84ea49088d3de174bd45d88/pyzmq-27.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c", size = 628686 }, + { url = "https://files.pythonhosted.org/packages/d4/a7/fcdeedc306e71e94ac262cba2d02337d885f5cdb7e8efced8e5ffe327808/pyzmq-27.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198", size = 559039 }, + { url = "https://files.pythonhosted.org/packages/44/df/84c630654106d9bd9339cdb564aa941ed41b023a0264251d6743766bb50e/pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564", size = 1332718 }, + { url = "https://files.pythonhosted.org/packages/c1/8e/f6a5461a07654d9840d256476434ae0ff08340bba562a455f231969772cb/pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251", size = 908248 }, + { url = "https://files.pythonhosted.org/packages/7c/93/82863e8d695a9a3ae424b63662733ae204a295a2627d52af2f62c2cd8af9/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa", size = 668647 }, + { url = "https://files.pythonhosted.org/packages/f3/85/15278769b348121eacdbfcbd8c4d40f1102f32fa6af5be1ffc032ed684be/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f", size = 856600 }, + { url = "https://files.pythonhosted.org/packages/d4/af/1c469b3d479bd095edb28e27f12eee10b8f00b356acbefa6aeb14dd295d1/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495", size = 1657748 }, + { url = "https://files.pythonhosted.org/packages/8c/f4/17f965d0ee6380b1d6326da842a50e4b8b9699745161207945f3745e8cb5/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667", size = 2034311 }, + { url = "https://files.pythonhosted.org/packages/e0/6e/7c391d81fa3149fd759de45d298003de6cfab343fb03e92c099821c448db/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e", size = 1893630 }, + { url = "https://files.pythonhosted.org/packages/0e/e0/eaffe7a86f60e556399e224229e7769b717f72fec0706b70ab2c03aa04cb/pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff", size = 567706 }, + { url = "https://files.pythonhosted.org/packages/c9/05/89354a8cffdcce6e547d48adaaf7be17007fc75572123ff4ca90a4ca04fc/pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed", size = 630322 }, + { url = "https://files.pythonhosted.org/packages/fa/07/4ab976d5e1e63976719389cc4f3bfd248a7f5f2bb2ebe727542363c61b5f/pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38", size = 558435 }, + { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438 }, + { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095 }, + { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826 }, + { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750 }, + { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357 }, + { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281 }, + { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110 }, + { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297 }, + { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203 }, + { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927 }, + { url = "https://files.pythonhosted.org/packages/09/6f/be6523a7f3821c0b5370912ef02822c028611360e0d206dd945bdbf9eaef/pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745", size = 835950 }, + { url = "https://files.pythonhosted.org/packages/c6/1e/a50fdd5c15018de07ab82a61bc460841be967ee7bbe7abee3b714d66f7ac/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab", size = 799876 }, + { url = "https://files.pythonhosted.org/packages/88/a1/89eb5b71f5a504f8f887aceb8e1eb3626e00c00aa8085381cdff475440dc/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb", size = 567400 }, + { url = "https://files.pythonhosted.org/packages/56/aa/4571dbcff56cfb034bac73fde8294e123c975ce3eea89aff31bf6dc6382b/pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551", size = 747031 }, + { url = "https://files.pythonhosted.org/packages/46/e0/d25f30fe0991293c5b2f5ef3b070d35fa6d57c0c7428898c3ab4913d0297/pyzmq-27.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0", size = 544726 }, + { url = "https://files.pythonhosted.org/packages/98/a6/92394373b8dbc1edc9d53c951e8d3989d518185174ee54492ec27711779d/pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae", size = 835948 }, + { url = "https://files.pythonhosted.org/packages/56/f3/4dc38d75d9995bfc18773df3e41f2a2ca9b740b06f1a15dbf404077e7588/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7", size = 799874 }, + { url = "https://files.pythonhosted.org/packages/ab/ba/64af397e0f421453dc68e31d5e0784d554bf39013a2de0872056e96e58af/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174", size = 567400 }, + { url = "https://files.pythonhosted.org/packages/63/87/ec956cbe98809270b59a22891d5758edae147a258e658bf3024a8254c855/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e", size = 747031 }, + { url = "https://files.pythonhosted.org/packages/be/8a/4a3764a68abc02e2fbb0668d225b6fda5cd39586dd099cee8b2ed6ab0452/pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46", size = 544726 }, ] [[package]] @@ -2159,9 +2155,9 @@ dependencies = [ { name = "isodate", marker = "python_full_version < '3.11'" }, { name = "pyparsing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/7e/cb2d74466bd8495051ebe2d241b1cb1d4acf9740d481126aef19ef2697f5/rdflib-7.1.4.tar.gz", hash = "sha256:fed46e24f26a788e2ab8e445f7077f00edcf95abb73bcef4b86cefa8b62dd174", size = 4692745, upload-time = "2025-03-29T02:23:02.386Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/7e/cb2d74466bd8495051ebe2d241b1cb1d4acf9740d481126aef19ef2697f5/rdflib-7.1.4.tar.gz", hash = "sha256:fed46e24f26a788e2ab8e445f7077f00edcf95abb73bcef4b86cefa8b62dd174", size = 4692745 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/31/e9b6f04288dcd3fa60cb3179260d6dad81b92aef3063d679ac7d80a827ea/rdflib-7.1.4-py3-none-any.whl", hash = "sha256:72f4adb1990fa5241abd22ddaf36d7cafa5d91d9ff2ba13f3086d339b213d997", size = 565051, upload-time = "2025-03-29T02:22:44.987Z" }, + { url = "https://files.pythonhosted.org/packages/f4/31/e9b6f04288dcd3fa60cb3179260d6dad81b92aef3063d679ac7d80a827ea/rdflib-7.1.4-py3-none-any.whl", hash = "sha256:72f4adb1990fa5241abd22ddaf36d7cafa5d91d9ff2ba13f3086d339b213d997", size = 565051 }, ] [[package]] @@ -2173,48 +2169,48 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, ] [[package]] name = "regex" version = "2024.11.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload-time = "2024-11-06T20:12:31.635Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/3c/4651f6b130c6842a8f3df82461a8950f923925db8b6961063e82744bddcc/regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91", size = 482674, upload-time = "2024-11-06T20:08:57.575Z" }, - { url = "https://files.pythonhosted.org/packages/15/51/9f35d12da8434b489c7b7bffc205c474a0a9432a889457026e9bc06a297a/regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0", size = 287684, upload-time = "2024-11-06T20:08:59.787Z" }, - { url = "https://files.pythonhosted.org/packages/bd/18/b731f5510d1b8fb63c6b6d3484bfa9a59b84cc578ac8b5172970e05ae07c/regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e", size = 284589, upload-time = "2024-11-06T20:09:01.896Z" }, - { url = "https://files.pythonhosted.org/packages/78/a2/6dd36e16341ab95e4c6073426561b9bfdeb1a9c9b63ab1b579c2e96cb105/regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde", size = 782511, upload-time = "2024-11-06T20:09:04.062Z" }, - { url = "https://files.pythonhosted.org/packages/1b/2b/323e72d5d2fd8de0d9baa443e1ed70363ed7e7b2fb526f5950c5cb99c364/regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e", size = 821149, upload-time = "2024-11-06T20:09:06.237Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/63373b9ea468fbef8a907fd273e5c329b8c9535fee36fc8dba5fecac475d/regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2", size = 809707, upload-time = "2024-11-06T20:09:07.715Z" }, - { url = "https://files.pythonhosted.org/packages/f2/98/26d3830875b53071f1f0ae6d547f1d98e964dd29ad35cbf94439120bb67a/regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf", size = 781702, upload-time = "2024-11-06T20:09:10.101Z" }, - { url = "https://files.pythonhosted.org/packages/87/55/eb2a068334274db86208ab9d5599ffa63631b9f0f67ed70ea7c82a69bbc8/regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c", size = 771976, upload-time = "2024-11-06T20:09:11.566Z" }, - { url = "https://files.pythonhosted.org/packages/74/c0/be707bcfe98254d8f9d2cff55d216e946f4ea48ad2fd8cf1428f8c5332ba/regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86", size = 697397, upload-time = "2024-11-06T20:09:13.119Z" }, - { url = "https://files.pythonhosted.org/packages/49/dc/bb45572ceb49e0f6509f7596e4ba7031f6819ecb26bc7610979af5a77f45/regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67", size = 768726, upload-time = "2024-11-06T20:09:14.85Z" }, - { url = "https://files.pythonhosted.org/packages/5a/db/f43fd75dc4c0c2d96d0881967897926942e935d700863666f3c844a72ce6/regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d", size = 775098, upload-time = "2024-11-06T20:09:16.504Z" }, - { url = "https://files.pythonhosted.org/packages/99/d7/f94154db29ab5a89d69ff893159b19ada89e76b915c1293e98603d39838c/regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2", size = 839325, upload-time = "2024-11-06T20:09:18.698Z" }, - { url = "https://files.pythonhosted.org/packages/f7/17/3cbfab1f23356fbbf07708220ab438a7efa1e0f34195bf857433f79f1788/regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008", size = 843277, upload-time = "2024-11-06T20:09:21.725Z" }, - { url = "https://files.pythonhosted.org/packages/7e/f2/48b393b51900456155de3ad001900f94298965e1cad1c772b87f9cfea011/regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62", size = 773197, upload-time = "2024-11-06T20:09:24.092Z" }, - { url = "https://files.pythonhosted.org/packages/45/3f/ef9589aba93e084cd3f8471fded352826dcae8489b650d0b9b27bc5bba8a/regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e", size = 261714, upload-time = "2024-11-06T20:09:26.36Z" }, - { url = "https://files.pythonhosted.org/packages/42/7e/5f1b92c8468290c465fd50c5318da64319133231415a8aa6ea5ab995a815/regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519", size = 274042, upload-time = "2024-11-06T20:09:28.762Z" }, - { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669, upload-time = "2024-11-06T20:09:31.064Z" }, - { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684, upload-time = "2024-11-06T20:09:32.915Z" }, - { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589, upload-time = "2024-11-06T20:09:35.504Z" }, - { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121, upload-time = "2024-11-06T20:09:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275, upload-time = "2024-11-06T20:09:40.371Z" }, - { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257, upload-time = "2024-11-06T20:09:43.059Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727, upload-time = "2024-11-06T20:09:48.19Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667, upload-time = "2024-11-06T20:09:49.828Z" }, - { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963, upload-time = "2024-11-06T20:09:51.819Z" }, - { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700, upload-time = "2024-11-06T20:09:53.982Z" }, - { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592, upload-time = "2024-11-06T20:09:56.222Z" }, - { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929, upload-time = "2024-11-06T20:09:58.642Z" }, - { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213, upload-time = "2024-11-06T20:10:00.867Z" }, - { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734, upload-time = "2024-11-06T20:10:03.361Z" }, - { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052, upload-time = "2024-11-06T20:10:05.179Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/3c/4651f6b130c6842a8f3df82461a8950f923925db8b6961063e82744bddcc/regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91", size = 482674 }, + { url = "https://files.pythonhosted.org/packages/15/51/9f35d12da8434b489c7b7bffc205c474a0a9432a889457026e9bc06a297a/regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0", size = 287684 }, + { url = "https://files.pythonhosted.org/packages/bd/18/b731f5510d1b8fb63c6b6d3484bfa9a59b84cc578ac8b5172970e05ae07c/regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e", size = 284589 }, + { url = "https://files.pythonhosted.org/packages/78/a2/6dd36e16341ab95e4c6073426561b9bfdeb1a9c9b63ab1b579c2e96cb105/regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde", size = 782511 }, + { url = "https://files.pythonhosted.org/packages/1b/2b/323e72d5d2fd8de0d9baa443e1ed70363ed7e7b2fb526f5950c5cb99c364/regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e", size = 821149 }, + { url = "https://files.pythonhosted.org/packages/90/30/63373b9ea468fbef8a907fd273e5c329b8c9535fee36fc8dba5fecac475d/regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2", size = 809707 }, + { url = "https://files.pythonhosted.org/packages/f2/98/26d3830875b53071f1f0ae6d547f1d98e964dd29ad35cbf94439120bb67a/regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf", size = 781702 }, + { url = "https://files.pythonhosted.org/packages/87/55/eb2a068334274db86208ab9d5599ffa63631b9f0f67ed70ea7c82a69bbc8/regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c", size = 771976 }, + { url = "https://files.pythonhosted.org/packages/74/c0/be707bcfe98254d8f9d2cff55d216e946f4ea48ad2fd8cf1428f8c5332ba/regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86", size = 697397 }, + { url = "https://files.pythonhosted.org/packages/49/dc/bb45572ceb49e0f6509f7596e4ba7031f6819ecb26bc7610979af5a77f45/regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67", size = 768726 }, + { url = "https://files.pythonhosted.org/packages/5a/db/f43fd75dc4c0c2d96d0881967897926942e935d700863666f3c844a72ce6/regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d", size = 775098 }, + { url = "https://files.pythonhosted.org/packages/99/d7/f94154db29ab5a89d69ff893159b19ada89e76b915c1293e98603d39838c/regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2", size = 839325 }, + { url = "https://files.pythonhosted.org/packages/f7/17/3cbfab1f23356fbbf07708220ab438a7efa1e0f34195bf857433f79f1788/regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008", size = 843277 }, + { url = "https://files.pythonhosted.org/packages/7e/f2/48b393b51900456155de3ad001900f94298965e1cad1c772b87f9cfea011/regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62", size = 773197 }, + { url = "https://files.pythonhosted.org/packages/45/3f/ef9589aba93e084cd3f8471fded352826dcae8489b650d0b9b27bc5bba8a/regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e", size = 261714 }, + { url = "https://files.pythonhosted.org/packages/42/7e/5f1b92c8468290c465fd50c5318da64319133231415a8aa6ea5ab995a815/regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519", size = 274042 }, + { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, + { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, + { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, + { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, + { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, + { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, + { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, + { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, + { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, + { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, + { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, + { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, + { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, + { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, + { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, ] [[package]] @@ -2227,9 +2223,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847 }, ] [[package]] @@ -2241,92 +2237,92 @@ dependencies = [ { name = "pygments" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149, upload-time = "2024-11-01T16:43:57.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424, upload-time = "2024-11-01T16:43:55.817Z" }, + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, ] [[package]] name = "rpds-py" version = "0.26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload-time = "2025-07-01T15:57:13.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/31/1459645f036c3dfeacef89e8e5825e430c77dde8489f3b99eaafcd4a60f5/rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37", size = 372466, upload-time = "2025-07-01T15:53:40.55Z" }, - { url = "https://files.pythonhosted.org/packages/dd/ff/3d0727f35836cc8773d3eeb9a46c40cc405854e36a8d2e951f3a8391c976/rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0", size = 357825, upload-time = "2025-07-01T15:53:42.247Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ce/badc5e06120a54099ae287fa96d82cbb650a5f85cf247ffe19c7b157fd1f/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec671691e72dff75817386aa02d81e708b5a7ec0dec6669ec05213ff6b77e1bd", size = 381530, upload-time = "2025-07-01T15:53:43.585Z" }, - { url = "https://files.pythonhosted.org/packages/1e/a5/fa5d96a66c95d06c62d7a30707b6a4cfec696ab8ae280ee7be14e961e118/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a1cb5d6ce81379401bbb7f6dbe3d56de537fb8235979843f0d53bc2e9815a79", size = 396933, upload-time = "2025-07-01T15:53:45.78Z" }, - { url = "https://files.pythonhosted.org/packages/00/a7/7049d66750f18605c591a9db47d4a059e112a0c9ff8de8daf8fa0f446bba/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f789e32fa1fb6a7bf890e0124e7b42d1e60d28ebff57fe806719abb75f0e9a3", size = 513973, upload-time = "2025-07-01T15:53:47.085Z" }, - { url = "https://files.pythonhosted.org/packages/0e/f1/528d02c7d6b29d29fac8fd784b354d3571cc2153f33f842599ef0cf20dd2/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c55b0a669976cf258afd718de3d9ad1b7d1fe0a91cd1ab36f38b03d4d4aeaaf", size = 402293, upload-time = "2025-07-01T15:53:48.117Z" }, - { url = "https://files.pythonhosted.org/packages/15/93/fde36cd6e4685df2cd08508f6c45a841e82f5bb98c8d5ecf05649522acb5/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70d9ec912802ecfd6cd390dadb34a9578b04f9bcb8e863d0a7598ba5e9e7ccc", size = 383787, upload-time = "2025-07-01T15:53:50.874Z" }, - { url = "https://files.pythonhosted.org/packages/69/f2/5007553aaba1dcae5d663143683c3dfd03d9395289f495f0aebc93e90f24/rpds_py-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3021933c2cb7def39d927b9862292e0f4c75a13d7de70eb0ab06efed4c508c19", size = 416312, upload-time = "2025-07-01T15:53:52.046Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a7/ce52c75c1e624a79e48a69e611f1c08844564e44c85db2b6f711d76d10ce/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a7898b6ca3b7d6659e55cdac825a2e58c638cbf335cde41f4619e290dd0ad11", size = 558403, upload-time = "2025-07-01T15:53:53.192Z" }, - { url = "https://files.pythonhosted.org/packages/79/d5/e119db99341cc75b538bf4cb80504129fa22ce216672fb2c28e4a101f4d9/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:12bff2ad9447188377f1b2794772f91fe68bb4bbfa5a39d7941fbebdbf8c500f", size = 588323, upload-time = "2025-07-01T15:53:54.336Z" }, - { url = "https://files.pythonhosted.org/packages/93/94/d28272a0b02f5fe24c78c20e13bbcb95f03dc1451b68e7830ca040c60bd6/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:191aa858f7d4902e975d4cf2f2d9243816c91e9605070aeb09c0a800d187e323", size = 554541, upload-time = "2025-07-01T15:53:55.469Z" }, - { url = "https://files.pythonhosted.org/packages/93/e0/8c41166602f1b791da892d976057eba30685486d2e2c061ce234679c922b/rpds_py-0.26.0-cp310-cp310-win32.whl", hash = "sha256:b37a04d9f52cb76b6b78f35109b513f6519efb481d8ca4c321f6a3b9580b3f45", size = 220442, upload-time = "2025-07-01T15:53:56.524Z" }, - { url = "https://files.pythonhosted.org/packages/87/f0/509736bb752a7ab50fb0270c2a4134d671a7b3038030837e5536c3de0e0b/rpds_py-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:38721d4c9edd3eb6670437d8d5e2070063f305bfa2d5aa4278c51cedcd508a84", size = 231314, upload-time = "2025-07-01T15:53:57.842Z" }, - { url = "https://files.pythonhosted.org/packages/09/4c/4ee8f7e512030ff79fda1df3243c88d70fc874634e2dbe5df13ba4210078/rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed", size = 372610, upload-time = "2025-07-01T15:53:58.844Z" }, - { url = "https://files.pythonhosted.org/packages/fa/9d/3dc16be00f14fc1f03c71b1d67c8df98263ab2710a2fbd65a6193214a527/rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0", size = 358032, upload-time = "2025-07-01T15:53:59.985Z" }, - { url = "https://files.pythonhosted.org/packages/e7/5a/7f1bf8f045da2866324a08ae80af63e64e7bfaf83bd31f865a7b91a58601/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1", size = 381525, upload-time = "2025-07-01T15:54:01.162Z" }, - { url = "https://files.pythonhosted.org/packages/45/8a/04479398c755a066ace10e3d158866beb600867cacae194c50ffa783abd0/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7", size = 397089, upload-time = "2025-07-01T15:54:02.319Z" }, - { url = "https://files.pythonhosted.org/packages/72/88/9203f47268db488a1b6d469d69c12201ede776bb728b9d9f29dbfd7df406/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6", size = 514255, upload-time = "2025-07-01T15:54:03.38Z" }, - { url = "https://files.pythonhosted.org/packages/f5/b4/01ce5d1e853ddf81fbbd4311ab1eff0b3cf162d559288d10fd127e2588b5/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e", size = 402283, upload-time = "2025-07-01T15:54:04.923Z" }, - { url = "https://files.pythonhosted.org/packages/34/a2/004c99936997bfc644d590a9defd9e9c93f8286568f9c16cdaf3e14429a7/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d", size = 383881, upload-time = "2025-07-01T15:54:06.482Z" }, - { url = "https://files.pythonhosted.org/packages/05/1b/ef5fba4a8f81ce04c427bfd96223f92f05e6cd72291ce9d7523db3b03a6c/rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3", size = 415822, upload-time = "2025-07-01T15:54:07.605Z" }, - { url = "https://files.pythonhosted.org/packages/16/80/5c54195aec456b292f7bd8aa61741c8232964063fd8a75fdde9c1e982328/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107", size = 558347, upload-time = "2025-07-01T15:54:08.591Z" }, - { url = "https://files.pythonhosted.org/packages/f2/1c/1845c1b1fd6d827187c43afe1841d91678d7241cbdb5420a4c6de180a538/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a", size = 587956, upload-time = "2025-07-01T15:54:09.963Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ff/9e979329dd131aa73a438c077252ddabd7df6d1a7ad7b9aacf6261f10faa/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318", size = 554363, upload-time = "2025-07-01T15:54:11.073Z" }, - { url = "https://files.pythonhosted.org/packages/00/8b/d78cfe034b71ffbe72873a136e71acc7a831a03e37771cfe59f33f6de8a2/rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a", size = 220123, upload-time = "2025-07-01T15:54:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/94/c1/3c8c94c7dd3905dbfde768381ce98778500a80db9924731d87ddcdb117e9/rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03", size = 231732, upload-time = "2025-07-01T15:54:13.434Z" }, - { url = "https://files.pythonhosted.org/packages/67/93/e936fbed1b734eabf36ccb5d93c6a2e9246fbb13c1da011624b7286fae3e/rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41", size = 221917, upload-time = "2025-07-01T15:54:14.559Z" }, - { url = "https://files.pythonhosted.org/packages/ef/9a/1f033b0b31253d03d785b0cd905bc127e555ab496ea6b4c7c2e1f951f2fd/rpds_py-0.26.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3c0909c5234543ada2515c05dc08595b08d621ba919629e94427e8e03539c958", size = 373226, upload-time = "2025-07-01T15:56:16.578Z" }, - { url = "https://files.pythonhosted.org/packages/58/29/5f88023fd6aaaa8ca3c4a6357ebb23f6f07da6079093ccf27c99efce87db/rpds_py-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c1fb0cda2abcc0ac62f64e2ea4b4e64c57dfd6b885e693095460c61bde7bb18e", size = 359230, upload-time = "2025-07-01T15:56:17.978Z" }, - { url = "https://files.pythonhosted.org/packages/6c/6c/13eaebd28b439da6964dde22712b52e53fe2824af0223b8e403249d10405/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d142d2d6cf9b31c12aa4878d82ed3b2324226270b89b676ac62ccd7df52d08", size = 382363, upload-time = "2025-07-01T15:56:19.977Z" }, - { url = "https://files.pythonhosted.org/packages/55/fc/3bb9c486b06da19448646f96147796de23c5811ef77cbfc26f17307b6a9d/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a547e21c5610b7e9093d870be50682a6a6cf180d6da0f42c47c306073bfdbbf6", size = 397146, upload-time = "2025-07-01T15:56:21.39Z" }, - { url = "https://files.pythonhosted.org/packages/15/18/9d1b79eb4d18e64ba8bba9e7dec6f9d6920b639f22f07ee9368ca35d4673/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35e9a70a0f335371275cdcd08bc5b8051ac494dd58bff3bbfb421038220dc871", size = 514804, upload-time = "2025-07-01T15:56:22.78Z" }, - { url = "https://files.pythonhosted.org/packages/4f/5a/175ad7191bdbcd28785204621b225ad70e85cdfd1e09cc414cb554633b21/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dfa6115c6def37905344d56fb54c03afc49104e2ca473d5dedec0f6606913b4", size = 402820, upload-time = "2025-07-01T15:56:24.584Z" }, - { url = "https://files.pythonhosted.org/packages/11/45/6a67ecf6d61c4d4aff4bc056e864eec4b2447787e11d1c2c9a0242c6e92a/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313cfcd6af1a55a286a3c9a25f64af6d0e46cf60bc5798f1db152d97a216ff6f", size = 384567, upload-time = "2025-07-01T15:56:26.064Z" }, - { url = "https://files.pythonhosted.org/packages/a1/ba/16589da828732b46454c61858950a78fe4c931ea4bf95f17432ffe64b241/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7bf2496fa563c046d05e4d232d7b7fd61346e2402052064b773e5c378bf6f73", size = 416520, upload-time = "2025-07-01T15:56:27.608Z" }, - { url = "https://files.pythonhosted.org/packages/81/4b/00092999fc7c0c266045e984d56b7314734cc400a6c6dc4d61a35f135a9d/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa81873e2c8c5aa616ab8e017a481a96742fdf9313c40f14338ca7dbf50cb55f", size = 559362, upload-time = "2025-07-01T15:56:29.078Z" }, - { url = "https://files.pythonhosted.org/packages/96/0c/43737053cde1f93ac4945157f7be1428724ab943e2132a0d235a7e161d4e/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:68ffcf982715f5b5b7686bdd349ff75d422e8f22551000c24b30eaa1b7f7ae84", size = 588113, upload-time = "2025-07-01T15:56:30.485Z" }, - { url = "https://files.pythonhosted.org/packages/46/46/8e38f6161466e60a997ed7e9951ae5de131dedc3cf778ad35994b4af823d/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6188de70e190847bb6db3dc3981cbadff87d27d6fe9b4f0e18726d55795cee9b", size = 555429, upload-time = "2025-07-01T15:56:31.956Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ac/65da605e9f1dd643ebe615d5bbd11b6efa1d69644fc4bf623ea5ae385a82/rpds_py-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1c962145c7473723df9722ba4c058de12eb5ebedcb4e27e7d902920aa3831ee8", size = 231950, upload-time = "2025-07-01T15:56:33.337Z" }, - { url = "https://files.pythonhosted.org/packages/51/f2/b5c85b758a00c513bb0389f8fc8e61eb5423050c91c958cdd21843faa3e6/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674", size = 373505, upload-time = "2025-07-01T15:56:34.716Z" }, - { url = "https://files.pythonhosted.org/packages/23/e0/25db45e391251118e915e541995bb5f5ac5691a3b98fb233020ba53afc9b/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696", size = 359468, upload-time = "2025-07-01T15:56:36.219Z" }, - { url = "https://files.pythonhosted.org/packages/0b/73/dd5ee6075bb6491be3a646b301dfd814f9486d924137a5098e61f0487e16/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb", size = 382680, upload-time = "2025-07-01T15:56:37.644Z" }, - { url = "https://files.pythonhosted.org/packages/2f/10/84b522ff58763a5c443f5bcedc1820240e454ce4e620e88520f04589e2ea/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88", size = 397035, upload-time = "2025-07-01T15:56:39.241Z" }, - { url = "https://files.pythonhosted.org/packages/06/ea/8667604229a10a520fcbf78b30ccc278977dcc0627beb7ea2c96b3becef0/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8", size = 514922, upload-time = "2025-07-01T15:56:40.645Z" }, - { url = "https://files.pythonhosted.org/packages/24/e6/9ed5b625c0661c4882fc8cdf302bf8e96c73c40de99c31e0b95ed37d508c/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5", size = 402822, upload-time = "2025-07-01T15:56:42.137Z" }, - { url = "https://files.pythonhosted.org/packages/8a/58/212c7b6fd51946047fb45d3733da27e2fa8f7384a13457c874186af691b1/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7", size = 384336, upload-time = "2025-07-01T15:56:44.239Z" }, - { url = "https://files.pythonhosted.org/packages/aa/f5/a40ba78748ae8ebf4934d4b88e77b98497378bc2c24ba55ebe87a4e87057/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b", size = 416871, upload-time = "2025-07-01T15:56:46.284Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a6/33b1fc0c9f7dcfcfc4a4353daa6308b3ece22496ceece348b3e7a7559a09/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb", size = 559439, upload-time = "2025-07-01T15:56:48.549Z" }, - { url = "https://files.pythonhosted.org/packages/71/2d/ceb3f9c12f8cfa56d34995097f6cd99da1325642c60d1b6680dd9df03ed8/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0", size = 588380, upload-time = "2025-07-01T15:56:50.086Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ed/9de62c2150ca8e2e5858acf3f4f4d0d180a38feef9fdab4078bea63d8dba/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c", size = 555334, upload-time = "2025-07-01T15:56:51.703Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/31/1459645f036c3dfeacef89e8e5825e430c77dde8489f3b99eaafcd4a60f5/rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37", size = 372466 }, + { url = "https://files.pythonhosted.org/packages/dd/ff/3d0727f35836cc8773d3eeb9a46c40cc405854e36a8d2e951f3a8391c976/rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0", size = 357825 }, + { url = "https://files.pythonhosted.org/packages/bf/ce/badc5e06120a54099ae287fa96d82cbb650a5f85cf247ffe19c7b157fd1f/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec671691e72dff75817386aa02d81e708b5a7ec0dec6669ec05213ff6b77e1bd", size = 381530 }, + { url = "https://files.pythonhosted.org/packages/1e/a5/fa5d96a66c95d06c62d7a30707b6a4cfec696ab8ae280ee7be14e961e118/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a1cb5d6ce81379401bbb7f6dbe3d56de537fb8235979843f0d53bc2e9815a79", size = 396933 }, + { url = "https://files.pythonhosted.org/packages/00/a7/7049d66750f18605c591a9db47d4a059e112a0c9ff8de8daf8fa0f446bba/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f789e32fa1fb6a7bf890e0124e7b42d1e60d28ebff57fe806719abb75f0e9a3", size = 513973 }, + { url = "https://files.pythonhosted.org/packages/0e/f1/528d02c7d6b29d29fac8fd784b354d3571cc2153f33f842599ef0cf20dd2/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c55b0a669976cf258afd718de3d9ad1b7d1fe0a91cd1ab36f38b03d4d4aeaaf", size = 402293 }, + { url = "https://files.pythonhosted.org/packages/15/93/fde36cd6e4685df2cd08508f6c45a841e82f5bb98c8d5ecf05649522acb5/rpds_py-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70d9ec912802ecfd6cd390dadb34a9578b04f9bcb8e863d0a7598ba5e9e7ccc", size = 383787 }, + { url = "https://files.pythonhosted.org/packages/69/f2/5007553aaba1dcae5d663143683c3dfd03d9395289f495f0aebc93e90f24/rpds_py-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3021933c2cb7def39d927b9862292e0f4c75a13d7de70eb0ab06efed4c508c19", size = 416312 }, + { url = "https://files.pythonhosted.org/packages/8f/a7/ce52c75c1e624a79e48a69e611f1c08844564e44c85db2b6f711d76d10ce/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a7898b6ca3b7d6659e55cdac825a2e58c638cbf335cde41f4619e290dd0ad11", size = 558403 }, + { url = "https://files.pythonhosted.org/packages/79/d5/e119db99341cc75b538bf4cb80504129fa22ce216672fb2c28e4a101f4d9/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:12bff2ad9447188377f1b2794772f91fe68bb4bbfa5a39d7941fbebdbf8c500f", size = 588323 }, + { url = "https://files.pythonhosted.org/packages/93/94/d28272a0b02f5fe24c78c20e13bbcb95f03dc1451b68e7830ca040c60bd6/rpds_py-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:191aa858f7d4902e975d4cf2f2d9243816c91e9605070aeb09c0a800d187e323", size = 554541 }, + { url = "https://files.pythonhosted.org/packages/93/e0/8c41166602f1b791da892d976057eba30685486d2e2c061ce234679c922b/rpds_py-0.26.0-cp310-cp310-win32.whl", hash = "sha256:b37a04d9f52cb76b6b78f35109b513f6519efb481d8ca4c321f6a3b9580b3f45", size = 220442 }, + { url = "https://files.pythonhosted.org/packages/87/f0/509736bb752a7ab50fb0270c2a4134d671a7b3038030837e5536c3de0e0b/rpds_py-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:38721d4c9edd3eb6670437d8d5e2070063f305bfa2d5aa4278c51cedcd508a84", size = 231314 }, + { url = "https://files.pythonhosted.org/packages/09/4c/4ee8f7e512030ff79fda1df3243c88d70fc874634e2dbe5df13ba4210078/rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed", size = 372610 }, + { url = "https://files.pythonhosted.org/packages/fa/9d/3dc16be00f14fc1f03c71b1d67c8df98263ab2710a2fbd65a6193214a527/rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0", size = 358032 }, + { url = "https://files.pythonhosted.org/packages/e7/5a/7f1bf8f045da2866324a08ae80af63e64e7bfaf83bd31f865a7b91a58601/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1", size = 381525 }, + { url = "https://files.pythonhosted.org/packages/45/8a/04479398c755a066ace10e3d158866beb600867cacae194c50ffa783abd0/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7", size = 397089 }, + { url = "https://files.pythonhosted.org/packages/72/88/9203f47268db488a1b6d469d69c12201ede776bb728b9d9f29dbfd7df406/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6", size = 514255 }, + { url = "https://files.pythonhosted.org/packages/f5/b4/01ce5d1e853ddf81fbbd4311ab1eff0b3cf162d559288d10fd127e2588b5/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e", size = 402283 }, + { url = "https://files.pythonhosted.org/packages/34/a2/004c99936997bfc644d590a9defd9e9c93f8286568f9c16cdaf3e14429a7/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d", size = 383881 }, + { url = "https://files.pythonhosted.org/packages/05/1b/ef5fba4a8f81ce04c427bfd96223f92f05e6cd72291ce9d7523db3b03a6c/rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3", size = 415822 }, + { url = "https://files.pythonhosted.org/packages/16/80/5c54195aec456b292f7bd8aa61741c8232964063fd8a75fdde9c1e982328/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107", size = 558347 }, + { url = "https://files.pythonhosted.org/packages/f2/1c/1845c1b1fd6d827187c43afe1841d91678d7241cbdb5420a4c6de180a538/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a", size = 587956 }, + { url = "https://files.pythonhosted.org/packages/2e/ff/9e979329dd131aa73a438c077252ddabd7df6d1a7ad7b9aacf6261f10faa/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318", size = 554363 }, + { url = "https://files.pythonhosted.org/packages/00/8b/d78cfe034b71ffbe72873a136e71acc7a831a03e37771cfe59f33f6de8a2/rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a", size = 220123 }, + { url = "https://files.pythonhosted.org/packages/94/c1/3c8c94c7dd3905dbfde768381ce98778500a80db9924731d87ddcdb117e9/rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03", size = 231732 }, + { url = "https://files.pythonhosted.org/packages/67/93/e936fbed1b734eabf36ccb5d93c6a2e9246fbb13c1da011624b7286fae3e/rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41", size = 221917 }, + { url = "https://files.pythonhosted.org/packages/ef/9a/1f033b0b31253d03d785b0cd905bc127e555ab496ea6b4c7c2e1f951f2fd/rpds_py-0.26.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3c0909c5234543ada2515c05dc08595b08d621ba919629e94427e8e03539c958", size = 373226 }, + { url = "https://files.pythonhosted.org/packages/58/29/5f88023fd6aaaa8ca3c4a6357ebb23f6f07da6079093ccf27c99efce87db/rpds_py-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c1fb0cda2abcc0ac62f64e2ea4b4e64c57dfd6b885e693095460c61bde7bb18e", size = 359230 }, + { url = "https://files.pythonhosted.org/packages/6c/6c/13eaebd28b439da6964dde22712b52e53fe2824af0223b8e403249d10405/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d142d2d6cf9b31c12aa4878d82ed3b2324226270b89b676ac62ccd7df52d08", size = 382363 }, + { url = "https://files.pythonhosted.org/packages/55/fc/3bb9c486b06da19448646f96147796de23c5811ef77cbfc26f17307b6a9d/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a547e21c5610b7e9093d870be50682a6a6cf180d6da0f42c47c306073bfdbbf6", size = 397146 }, + { url = "https://files.pythonhosted.org/packages/15/18/9d1b79eb4d18e64ba8bba9e7dec6f9d6920b639f22f07ee9368ca35d4673/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35e9a70a0f335371275cdcd08bc5b8051ac494dd58bff3bbfb421038220dc871", size = 514804 }, + { url = "https://files.pythonhosted.org/packages/4f/5a/175ad7191bdbcd28785204621b225ad70e85cdfd1e09cc414cb554633b21/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dfa6115c6def37905344d56fb54c03afc49104e2ca473d5dedec0f6606913b4", size = 402820 }, + { url = "https://files.pythonhosted.org/packages/11/45/6a67ecf6d61c4d4aff4bc056e864eec4b2447787e11d1c2c9a0242c6e92a/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313cfcd6af1a55a286a3c9a25f64af6d0e46cf60bc5798f1db152d97a216ff6f", size = 384567 }, + { url = "https://files.pythonhosted.org/packages/a1/ba/16589da828732b46454c61858950a78fe4c931ea4bf95f17432ffe64b241/rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7bf2496fa563c046d05e4d232d7b7fd61346e2402052064b773e5c378bf6f73", size = 416520 }, + { url = "https://files.pythonhosted.org/packages/81/4b/00092999fc7c0c266045e984d56b7314734cc400a6c6dc4d61a35f135a9d/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa81873e2c8c5aa616ab8e017a481a96742fdf9313c40f14338ca7dbf50cb55f", size = 559362 }, + { url = "https://files.pythonhosted.org/packages/96/0c/43737053cde1f93ac4945157f7be1428724ab943e2132a0d235a7e161d4e/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:68ffcf982715f5b5b7686bdd349ff75d422e8f22551000c24b30eaa1b7f7ae84", size = 588113 }, + { url = "https://files.pythonhosted.org/packages/46/46/8e38f6161466e60a997ed7e9951ae5de131dedc3cf778ad35994b4af823d/rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6188de70e190847bb6db3dc3981cbadff87d27d6fe9b4f0e18726d55795cee9b", size = 555429 }, + { url = "https://files.pythonhosted.org/packages/2c/ac/65da605e9f1dd643ebe615d5bbd11b6efa1d69644fc4bf623ea5ae385a82/rpds_py-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1c962145c7473723df9722ba4c058de12eb5ebedcb4e27e7d902920aa3831ee8", size = 231950 }, + { url = "https://files.pythonhosted.org/packages/51/f2/b5c85b758a00c513bb0389f8fc8e61eb5423050c91c958cdd21843faa3e6/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674", size = 373505 }, + { url = "https://files.pythonhosted.org/packages/23/e0/25db45e391251118e915e541995bb5f5ac5691a3b98fb233020ba53afc9b/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696", size = 359468 }, + { url = "https://files.pythonhosted.org/packages/0b/73/dd5ee6075bb6491be3a646b301dfd814f9486d924137a5098e61f0487e16/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb", size = 382680 }, + { url = "https://files.pythonhosted.org/packages/2f/10/84b522ff58763a5c443f5bcedc1820240e454ce4e620e88520f04589e2ea/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88", size = 397035 }, + { url = "https://files.pythonhosted.org/packages/06/ea/8667604229a10a520fcbf78b30ccc278977dcc0627beb7ea2c96b3becef0/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8", size = 514922 }, + { url = "https://files.pythonhosted.org/packages/24/e6/9ed5b625c0661c4882fc8cdf302bf8e96c73c40de99c31e0b95ed37d508c/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5", size = 402822 }, + { url = "https://files.pythonhosted.org/packages/8a/58/212c7b6fd51946047fb45d3733da27e2fa8f7384a13457c874186af691b1/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7", size = 384336 }, + { url = "https://files.pythonhosted.org/packages/aa/f5/a40ba78748ae8ebf4934d4b88e77b98497378bc2c24ba55ebe87a4e87057/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b", size = 416871 }, + { url = "https://files.pythonhosted.org/packages/d5/a6/33b1fc0c9f7dcfcfc4a4353daa6308b3ece22496ceece348b3e7a7559a09/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb", size = 559439 }, + { url = "https://files.pythonhosted.org/packages/71/2d/ceb3f9c12f8cfa56d34995097f6cd99da1325642c60d1b6680dd9df03ed8/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0", size = 588380 }, + { url = "https://files.pythonhosted.org/packages/c8/ed/9de62c2150ca8e2e5858acf3f4f4d0d180a38feef9fdab4078bea63d8dba/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c", size = 555334 }, ] [[package]] name = "ruff" version = "0.12.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/cd/01015eb5034605fd98d829c5839ec2c6b4582b479707f7c1c2af861e8258/ruff-0.12.5.tar.gz", hash = "sha256:b209db6102b66f13625940b7f8c7d0f18e20039bb7f6101fbdac935c9612057e", size = 5170722, upload-time = "2025-07-24T13:26:37.456Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/cd/01015eb5034605fd98d829c5839ec2c6b4582b479707f7c1c2af861e8258/ruff-0.12.5.tar.gz", hash = "sha256:b209db6102b66f13625940b7f8c7d0f18e20039bb7f6101fbdac935c9612057e", size = 5170722 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/de/ad2f68f0798ff15dd8c0bcc2889558970d9a685b3249565a937cd820ad34/ruff-0.12.5-py3-none-linux_armv6l.whl", hash = "sha256:1de2c887e9dec6cb31fcb9948299de5b2db38144e66403b9660c9548a67abd92", size = 11819133, upload-time = "2025-07-24T13:25:56.369Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fc/c6b65cd0e7fbe60f17e7ad619dca796aa49fbca34bb9bea5f8faf1ec2643/ruff-0.12.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d1ab65e7d8152f519e7dea4de892317c9da7a108da1c56b6a3c1d5e7cf4c5e9a", size = 12501114, upload-time = "2025-07-24T13:25:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/c5/de/c6bec1dce5ead9f9e6a946ea15e8d698c35f19edc508289d70a577921b30/ruff-0.12.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:962775ed5b27c7aa3fdc0d8f4d4433deae7659ef99ea20f783d666e77338b8cf", size = 11716873, upload-time = "2025-07-24T13:26:01.496Z" }, - { url = "https://files.pythonhosted.org/packages/a1/16/cf372d2ebe91e4eb5b82a2275c3acfa879e0566a7ac94d331ea37b765ac8/ruff-0.12.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b4cae449597e7195a49eb1cdca89fd9fbb16140c7579899e87f4c85bf82f73", size = 11958829, upload-time = "2025-07-24T13:26:03.721Z" }, - { url = "https://files.pythonhosted.org/packages/25/bf/cd07e8f6a3a6ec746c62556b4c4b79eeb9b0328b362bb8431b7b8afd3856/ruff-0.12.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b13489c3dc50de5e2d40110c0cce371e00186b880842e245186ca862bf9a1ac", size = 11626619, upload-time = "2025-07-24T13:26:06.118Z" }, - { url = "https://files.pythonhosted.org/packages/d8/c9/c2ccb3b8cbb5661ffda6925f81a13edbb786e623876141b04919d1128370/ruff-0.12.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1504fea81461cf4841778b3ef0a078757602a3b3ea4b008feb1308cb3f23e08", size = 13221894, upload-time = "2025-07-24T13:26:08.292Z" }, - { url = "https://files.pythonhosted.org/packages/6b/58/68a5be2c8e5590ecdad922b2bcd5583af19ba648f7648f95c51c3c1eca81/ruff-0.12.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c7da4129016ae26c32dfcbd5b671fe652b5ab7fc40095d80dcff78175e7eddd4", size = 14163909, upload-time = "2025-07-24T13:26:10.474Z" }, - { url = "https://files.pythonhosted.org/packages/bd/d1/ef6b19622009ba8386fdb792c0743f709cf917b0b2f1400589cbe4739a33/ruff-0.12.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca972c80f7ebcfd8af75a0f18b17c42d9f1ef203d163669150453f50ca98ab7b", size = 13583652, upload-time = "2025-07-24T13:26:13.381Z" }, - { url = "https://files.pythonhosted.org/packages/62/e3/1c98c566fe6809a0c83751d825a03727f242cdbe0d142c9e292725585521/ruff-0.12.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dbbf9f25dfb501f4237ae7501d6364b76a01341c6f1b2cd6764fe449124bb2a", size = 12700451, upload-time = "2025-07-24T13:26:15.488Z" }, - { url = "https://files.pythonhosted.org/packages/24/ff/96058f6506aac0fbc0d0fc0d60b0d0bd746240a0594657a2d94ad28033ba/ruff-0.12.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c47dea6ae39421851685141ba9734767f960113d51e83fd7bb9958d5be8763a", size = 12937465, upload-time = "2025-07-24T13:26:17.808Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d3/68bc5e7ab96c94b3589d1789f2dd6dd4b27b263310019529ac9be1e8f31b/ruff-0.12.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c5076aa0e61e30f848846f0265c873c249d4b558105b221be1828f9f79903dc5", size = 11771136, upload-time = "2025-07-24T13:26:20.422Z" }, - { url = "https://files.pythonhosted.org/packages/52/75/7356af30a14584981cabfefcf6106dea98cec9a7af4acb5daaf4b114845f/ruff-0.12.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a5a4c7830dadd3d8c39b1cc85386e2c1e62344f20766be6f173c22fb5f72f293", size = 11601644, upload-time = "2025-07-24T13:26:22.928Z" }, - { url = "https://files.pythonhosted.org/packages/c2/67/91c71d27205871737cae11025ee2b098f512104e26ffd8656fd93d0ada0a/ruff-0.12.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:46699f73c2b5b137b9dc0fc1a190b43e35b008b398c6066ea1350cce6326adcb", size = 12478068, upload-time = "2025-07-24T13:26:26.134Z" }, - { url = "https://files.pythonhosted.org/packages/34/04/b6b00383cf2f48e8e78e14eb258942fdf2a9bf0287fbf5cdd398b749193a/ruff-0.12.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5a655a0a0d396f0f072faafc18ebd59adde8ca85fb848dc1b0d9f024b9c4d3bb", size = 12991537, upload-time = "2025-07-24T13:26:28.533Z" }, - { url = "https://files.pythonhosted.org/packages/3e/b9/053d6445dc7544fb6594785056d8ece61daae7214859ada4a152ad56b6e0/ruff-0.12.5-py3-none-win32.whl", hash = "sha256:dfeb2627c459b0b78ca2bbdc38dd11cc9a0a88bf91db982058b26ce41714ffa9", size = 11751575, upload-time = "2025-07-24T13:26:30.835Z" }, - { url = "https://files.pythonhosted.org/packages/bc/0f/ab16e8259493137598b9149734fec2e06fdeda9837e6f634f5c4e35916da/ruff-0.12.5-py3-none-win_amd64.whl", hash = "sha256:ae0d90cf5f49466c954991b9d8b953bd093c32c27608e409ae3564c63c5306a5", size = 12882273, upload-time = "2025-07-24T13:26:32.929Z" }, - { url = "https://files.pythonhosted.org/packages/00/db/c376b0661c24cf770cb8815268190668ec1330eba8374a126ceef8c72d55/ruff-0.12.5-py3-none-win_arm64.whl", hash = "sha256:48cdbfc633de2c5c37d9f090ba3b352d1576b0015bfc3bc98eaf230275b7e805", size = 11951564, upload-time = "2025-07-24T13:26:34.994Z" }, + { url = "https://files.pythonhosted.org/packages/d4/de/ad2f68f0798ff15dd8c0bcc2889558970d9a685b3249565a937cd820ad34/ruff-0.12.5-py3-none-linux_armv6l.whl", hash = "sha256:1de2c887e9dec6cb31fcb9948299de5b2db38144e66403b9660c9548a67abd92", size = 11819133 }, + { url = "https://files.pythonhosted.org/packages/f8/fc/c6b65cd0e7fbe60f17e7ad619dca796aa49fbca34bb9bea5f8faf1ec2643/ruff-0.12.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d1ab65e7d8152f519e7dea4de892317c9da7a108da1c56b6a3c1d5e7cf4c5e9a", size = 12501114 }, + { url = "https://files.pythonhosted.org/packages/c5/de/c6bec1dce5ead9f9e6a946ea15e8d698c35f19edc508289d70a577921b30/ruff-0.12.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:962775ed5b27c7aa3fdc0d8f4d4433deae7659ef99ea20f783d666e77338b8cf", size = 11716873 }, + { url = "https://files.pythonhosted.org/packages/a1/16/cf372d2ebe91e4eb5b82a2275c3acfa879e0566a7ac94d331ea37b765ac8/ruff-0.12.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73b4cae449597e7195a49eb1cdca89fd9fbb16140c7579899e87f4c85bf82f73", size = 11958829 }, + { url = "https://files.pythonhosted.org/packages/25/bf/cd07e8f6a3a6ec746c62556b4c4b79eeb9b0328b362bb8431b7b8afd3856/ruff-0.12.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b13489c3dc50de5e2d40110c0cce371e00186b880842e245186ca862bf9a1ac", size = 11626619 }, + { url = "https://files.pythonhosted.org/packages/d8/c9/c2ccb3b8cbb5661ffda6925f81a13edbb786e623876141b04919d1128370/ruff-0.12.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f1504fea81461cf4841778b3ef0a078757602a3b3ea4b008feb1308cb3f23e08", size = 13221894 }, + { url = "https://files.pythonhosted.org/packages/6b/58/68a5be2c8e5590ecdad922b2bcd5583af19ba648f7648f95c51c3c1eca81/ruff-0.12.5-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c7da4129016ae26c32dfcbd5b671fe652b5ab7fc40095d80dcff78175e7eddd4", size = 14163909 }, + { url = "https://files.pythonhosted.org/packages/bd/d1/ef6b19622009ba8386fdb792c0743f709cf917b0b2f1400589cbe4739a33/ruff-0.12.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca972c80f7ebcfd8af75a0f18b17c42d9f1ef203d163669150453f50ca98ab7b", size = 13583652 }, + { url = "https://files.pythonhosted.org/packages/62/e3/1c98c566fe6809a0c83751d825a03727f242cdbe0d142c9e292725585521/ruff-0.12.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dbbf9f25dfb501f4237ae7501d6364b76a01341c6f1b2cd6764fe449124bb2a", size = 12700451 }, + { url = "https://files.pythonhosted.org/packages/24/ff/96058f6506aac0fbc0d0fc0d60b0d0bd746240a0594657a2d94ad28033ba/ruff-0.12.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c47dea6ae39421851685141ba9734767f960113d51e83fd7bb9958d5be8763a", size = 12937465 }, + { url = "https://files.pythonhosted.org/packages/eb/d3/68bc5e7ab96c94b3589d1789f2dd6dd4b27b263310019529ac9be1e8f31b/ruff-0.12.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c5076aa0e61e30f848846f0265c873c249d4b558105b221be1828f9f79903dc5", size = 11771136 }, + { url = "https://files.pythonhosted.org/packages/52/75/7356af30a14584981cabfefcf6106dea98cec9a7af4acb5daaf4b114845f/ruff-0.12.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a5a4c7830dadd3d8c39b1cc85386e2c1e62344f20766be6f173c22fb5f72f293", size = 11601644 }, + { url = "https://files.pythonhosted.org/packages/c2/67/91c71d27205871737cae11025ee2b098f512104e26ffd8656fd93d0ada0a/ruff-0.12.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:46699f73c2b5b137b9dc0fc1a190b43e35b008b398c6066ea1350cce6326adcb", size = 12478068 }, + { url = "https://files.pythonhosted.org/packages/34/04/b6b00383cf2f48e8e78e14eb258942fdf2a9bf0287fbf5cdd398b749193a/ruff-0.12.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5a655a0a0d396f0f072faafc18ebd59adde8ca85fb848dc1b0d9f024b9c4d3bb", size = 12991537 }, + { url = "https://files.pythonhosted.org/packages/3e/b9/053d6445dc7544fb6594785056d8ece61daae7214859ada4a152ad56b6e0/ruff-0.12.5-py3-none-win32.whl", hash = "sha256:dfeb2627c459b0b78ca2bbdc38dd11cc9a0a88bf91db982058b26ce41714ffa9", size = 11751575 }, + { url = "https://files.pythonhosted.org/packages/bc/0f/ab16e8259493137598b9149734fec2e06fdeda9837e6f634f5c4e35916da/ruff-0.12.5-py3-none-win_amd64.whl", hash = "sha256:ae0d90cf5f49466c954991b9d8b953bd093c32c27608e409ae3564c63c5306a5", size = 12882273 }, + { url = "https://files.pythonhosted.org/packages/00/db/c376b0661c24cf770cb8815268190668ec1330eba8374a126ceef8c72d55/ruff-0.12.5-py3-none-win_arm64.whl", hash = "sha256:48cdbfc633de2c5c37d9f090ba3b352d1576b0015bfc3bc98eaf230275b7e805", size = 11951564 }, ] [[package]] @@ -2339,18 +2335,18 @@ dependencies = [ { name = "scipy" }, { name = "threadpoolctl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/41/84/5f4af978fff619706b8961accac84780a6d298d82a8873446f72edb4ead0/scikit_learn-1.7.1.tar.gz", hash = "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802", size = 7190445, upload-time = "2025-07-18T08:01:54.5Z" } +sdist = { url = "https://files.pythonhosted.org/packages/41/84/5f4af978fff619706b8961accac84780a6d298d82a8873446f72edb4ead0/scikit_learn-1.7.1.tar.gz", hash = "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802", size = 7190445 } wheels = [ - { url = "https://files.pythonhosted.org/packages/74/88/0dd5be14ef19f2d80a77780be35a33aa94e8a3b3223d80bee8892a7832b4/scikit_learn-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:406204dd4004f0517f0b23cf4b28c6245cbd51ab1b6b78153bc784def214946d", size = 9338868, upload-time = "2025-07-18T08:01:00.25Z" }, - { url = "https://files.pythonhosted.org/packages/fd/52/3056b6adb1ac58a0bc335fc2ed2fcf599974d908855e8cb0ca55f797593c/scikit_learn-1.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:16af2e44164f05d04337fd1fc3ae7c4ea61fd9b0d527e22665346336920fe0e1", size = 8655943, upload-time = "2025-07-18T08:01:02.974Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a4/e488acdece6d413f370a9589a7193dac79cd486b2e418d3276d6ea0b9305/scikit_learn-1.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f2e78e56a40c7587dea9a28dc4a49500fa2ead366869418c66f0fd75b80885c", size = 9652056, upload-time = "2025-07-18T08:01:04.978Z" }, - { url = "https://files.pythonhosted.org/packages/18/41/bceacec1285b94eb9e4659b24db46c23346d7e22cf258d63419eb5dec6f7/scikit_learn-1.7.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b62b76ad408a821475b43b7bb90a9b1c9a4d8d125d505c2df0539f06d6e631b1", size = 9473691, upload-time = "2025-07-18T08:01:07.006Z" }, - { url = "https://files.pythonhosted.org/packages/12/7b/e1ae4b7e1dd85c4ca2694ff9cc4a9690970fd6150d81b975e6c5c6f8ee7c/scikit_learn-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:9963b065677a4ce295e8ccdee80a1dd62b37249e667095039adcd5bce6e90deb", size = 8900873, upload-time = "2025-07-18T08:01:09.332Z" }, - { url = "https://files.pythonhosted.org/packages/b4/bd/a23177930abd81b96daffa30ef9c54ddbf544d3226b8788ce4c3ef1067b4/scikit_learn-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90c8494ea23e24c0fb371afc474618c1019dc152ce4a10e4607e62196113851b", size = 9334838, upload-time = "2025-07-18T08:01:11.239Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a1/d3a7628630a711e2ac0d1a482910da174b629f44e7dd8cfcd6924a4ef81a/scikit_learn-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:bb870c0daf3bf3be145ec51df8ac84720d9972170786601039f024bf6d61a518", size = 8651241, upload-time = "2025-07-18T08:01:13.234Z" }, - { url = "https://files.pythonhosted.org/packages/26/92/85ec172418f39474c1cd0221d611345d4f433fc4ee2fc68e01f524ccc4e4/scikit_learn-1.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40daccd1b5623f39e8943ab39735cadf0bdce80e67cdca2adcb5426e987320a8", size = 9718677, upload-time = "2025-07-18T08:01:15.649Z" }, - { url = "https://files.pythonhosted.org/packages/df/ce/abdb1dcbb1d2b66168ec43b23ee0cee356b4cc4100ddee3943934ebf1480/scikit_learn-1.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30d1f413cfc0aa5a99132a554f1d80517563c34a9d3e7c118fde2d273c6fe0f7", size = 9511189, upload-time = "2025-07-18T08:01:18.013Z" }, - { url = "https://files.pythonhosted.org/packages/b2/3b/47b5eaee01ef2b5a80ba3f7f6ecf79587cb458690857d4777bfd77371c6f/scikit_learn-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c711d652829a1805a95d7fe96654604a8f16eab5a9e9ad87b3e60173415cb650", size = 8914794, upload-time = "2025-07-18T08:01:20.357Z" }, + { url = "https://files.pythonhosted.org/packages/74/88/0dd5be14ef19f2d80a77780be35a33aa94e8a3b3223d80bee8892a7832b4/scikit_learn-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:406204dd4004f0517f0b23cf4b28c6245cbd51ab1b6b78153bc784def214946d", size = 9338868 }, + { url = "https://files.pythonhosted.org/packages/fd/52/3056b6adb1ac58a0bc335fc2ed2fcf599974d908855e8cb0ca55f797593c/scikit_learn-1.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:16af2e44164f05d04337fd1fc3ae7c4ea61fd9b0d527e22665346336920fe0e1", size = 8655943 }, + { url = "https://files.pythonhosted.org/packages/fb/a4/e488acdece6d413f370a9589a7193dac79cd486b2e418d3276d6ea0b9305/scikit_learn-1.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f2e78e56a40c7587dea9a28dc4a49500fa2ead366869418c66f0fd75b80885c", size = 9652056 }, + { url = "https://files.pythonhosted.org/packages/18/41/bceacec1285b94eb9e4659b24db46c23346d7e22cf258d63419eb5dec6f7/scikit_learn-1.7.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b62b76ad408a821475b43b7bb90a9b1c9a4d8d125d505c2df0539f06d6e631b1", size = 9473691 }, + { url = "https://files.pythonhosted.org/packages/12/7b/e1ae4b7e1dd85c4ca2694ff9cc4a9690970fd6150d81b975e6c5c6f8ee7c/scikit_learn-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:9963b065677a4ce295e8ccdee80a1dd62b37249e667095039adcd5bce6e90deb", size = 8900873 }, + { url = "https://files.pythonhosted.org/packages/b4/bd/a23177930abd81b96daffa30ef9c54ddbf544d3226b8788ce4c3ef1067b4/scikit_learn-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90c8494ea23e24c0fb371afc474618c1019dc152ce4a10e4607e62196113851b", size = 9334838 }, + { url = "https://files.pythonhosted.org/packages/8d/a1/d3a7628630a711e2ac0d1a482910da174b629f44e7dd8cfcd6924a4ef81a/scikit_learn-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:bb870c0daf3bf3be145ec51df8ac84720d9972170786601039f024bf6d61a518", size = 8651241 }, + { url = "https://files.pythonhosted.org/packages/26/92/85ec172418f39474c1cd0221d611345d4f433fc4ee2fc68e01f524ccc4e4/scikit_learn-1.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40daccd1b5623f39e8943ab39735cadf0bdce80e67cdca2adcb5426e987320a8", size = 9718677 }, + { url = "https://files.pythonhosted.org/packages/df/ce/abdb1dcbb1d2b66168ec43b23ee0cee356b4cc4100ddee3943934ebf1480/scikit_learn-1.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30d1f413cfc0aa5a99132a554f1d80517563c34a9d3e7c118fde2d273c6fe0f7", size = 9511189 }, + { url = "https://files.pythonhosted.org/packages/b2/3b/47b5eaee01ef2b5a80ba3f7f6ecf79587cb458690857d4777bfd77371c6f/scikit_learn-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c711d652829a1805a95d7fe96654604a8f16eab5a9e9ad87b3e60173415cb650", size = 8914794 }, ] [[package]] @@ -2360,20 +2356,20 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/30/85/cdbf2c3c460fe5aae812917866392068a88d02f07de0fe31ce738734c477/scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3", size = 56811768, upload-time = "2024-01-20T21:13:43.442Z" } +sdist = { url = "https://files.pythonhosted.org/packages/30/85/cdbf2c3c460fe5aae812917866392068a88d02f07de0fe31ce738734c477/scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3", size = 56811768 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/d9/214971dae573bd7e9303b56d2612dae439decbfc0dae0f539a591c0562ce/scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b", size = 38900384, upload-time = "2024-01-20T21:10:31.498Z" }, - { url = "https://files.pythonhosted.org/packages/dd/14/549fd7066a112c4bdf1cc11228d11284bc784ea09124fc4d663f28815564/scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1", size = 31357553, upload-time = "2024-01-20T21:10:38.509Z" }, - { url = "https://files.pythonhosted.org/packages/69/1d/0582401b6d77865e080c90f39e52f65ca2bdc94e668e0bfbed8977dae3f4/scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563", size = 34789974, upload-time = "2024-01-20T21:10:45.054Z" }, - { url = "https://files.pythonhosted.org/packages/f5/aa/8e6071a5e4dca4ec68b5b22e4991ee74c59c5d372112b9c236ec1faff57d/scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c", size = 38441046, upload-time = "2024-01-20T21:10:51.285Z" }, - { url = "https://files.pythonhosted.org/packages/65/9e/43b86ec57ecdc9931b43aaf727f9d71743bfd06bdddfd441165bd3d8c6be/scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd", size = 38630107, upload-time = "2024-01-20T21:10:58.406Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a7/5f829b100d208c85163aecba93faf01d088d944fc91585338751d812f1e4/scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2", size = 46191228, upload-time = "2024-01-20T21:11:05.92Z" }, - { url = "https://files.pythonhosted.org/packages/c3/32/7915195ca4643508fe9730691eaed57b879646279572b10b02bdadf165c5/scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08", size = 38908720, upload-time = "2024-01-20T21:11:13.467Z" }, - { url = "https://files.pythonhosted.org/packages/21/d4/e6c57acc61e59cd46acca27af1f400094d5dee218e372cc604b8162b97cb/scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c", size = 31392892, upload-time = "2024-01-20T21:11:18.947Z" }, - { url = "https://files.pythonhosted.org/packages/e3/c5/d40abc1a857c1c6519e1a4e096d6aee86861eddac019fb736b6af8a58d25/scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467", size = 34733860, upload-time = "2024-01-20T21:11:26.666Z" }, - { url = "https://files.pythonhosted.org/packages/d4/b8/7169935f9a2ea9e274ad8c21d6133d492079e6ebc3fc69a915c2375616b0/scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a", size = 38418720, upload-time = "2024-01-20T21:11:33.479Z" }, - { url = "https://files.pythonhosted.org/packages/64/e7/4dbb779d09d1cb757ddbe42cae7c4fe8270497566bb902138d637b04d88c/scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba", size = 38652247, upload-time = "2024-01-20T21:11:40.229Z" }, - { url = "https://files.pythonhosted.org/packages/9a/25/5b30cb3efc9566f0ebeaeca1976150316353c17031ad7868ef46de5ab8dc/scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70", size = 46162940, upload-time = "2024-01-20T21:11:47.726Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d9/214971dae573bd7e9303b56d2612dae439decbfc0dae0f539a591c0562ce/scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b", size = 38900384 }, + { url = "https://files.pythonhosted.org/packages/dd/14/549fd7066a112c4bdf1cc11228d11284bc784ea09124fc4d663f28815564/scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1", size = 31357553 }, + { url = "https://files.pythonhosted.org/packages/69/1d/0582401b6d77865e080c90f39e52f65ca2bdc94e668e0bfbed8977dae3f4/scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563", size = 34789974 }, + { url = "https://files.pythonhosted.org/packages/f5/aa/8e6071a5e4dca4ec68b5b22e4991ee74c59c5d372112b9c236ec1faff57d/scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c", size = 38441046 }, + { url = "https://files.pythonhosted.org/packages/65/9e/43b86ec57ecdc9931b43aaf727f9d71743bfd06bdddfd441165bd3d8c6be/scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd", size = 38630107 }, + { url = "https://files.pythonhosted.org/packages/fd/a7/5f829b100d208c85163aecba93faf01d088d944fc91585338751d812f1e4/scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2", size = 46191228 }, + { url = "https://files.pythonhosted.org/packages/c3/32/7915195ca4643508fe9730691eaed57b879646279572b10b02bdadf165c5/scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08", size = 38908720 }, + { url = "https://files.pythonhosted.org/packages/21/d4/e6c57acc61e59cd46acca27af1f400094d5dee218e372cc604b8162b97cb/scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c", size = 31392892 }, + { url = "https://files.pythonhosted.org/packages/e3/c5/d40abc1a857c1c6519e1a4e096d6aee86861eddac019fb736b6af8a58d25/scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467", size = 34733860 }, + { url = "https://files.pythonhosted.org/packages/d4/b8/7169935f9a2ea9e274ad8c21d6133d492079e6ebc3fc69a915c2375616b0/scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a", size = 38418720 }, + { url = "https://files.pythonhosted.org/packages/64/e7/4dbb779d09d1cb757ddbe42cae7c4fe8270497566bb902138d637b04d88c/scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba", size = 38652247 }, + { url = "https://files.pythonhosted.org/packages/9a/25/5b30cb3efc9566f0ebeaeca1976150316353c17031ad7868ef46de5ab8dc/scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70", size = 46162940 }, ] [[package]] @@ -2385,36 +2381,36 @@ dependencies = [ { name = "numpy" }, { name = "pandas" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696 } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, + { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914 }, ] [[package]] name = "setuptools" version = "80.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } 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" }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] [[package]] @@ -2424,27 +2420,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/18/2b/5e7234c68ed5bc872ad6ae77b8a421c2ed70dcb1190b44dc1abdeed5e347/smart_open-7.3.0.post1.tar.gz", hash = "sha256:ce6a3d9bc1afbf6234ad13c010b77f8cd36d24636811e3c52c3b5160f5214d1e", size = 51557, upload-time = "2025-07-03T10:06:31.271Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/2b/5e7234c68ed5bc872ad6ae77b8a421c2ed70dcb1190b44dc1abdeed5e347/smart_open-7.3.0.post1.tar.gz", hash = "sha256:ce6a3d9bc1afbf6234ad13c010b77f8cd36d24636811e3c52c3b5160f5214d1e", size = 51557 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/5b/a2a3d4514c64818925f4e886d39981f1926eeb5288a4549c6b3c17ed66bb/smart_open-7.3.0.post1-py3-none-any.whl", hash = "sha256:c73661a2c24bf045c1e04e08fffc585b59af023fe783d57896f590489db66fb4", size = 61946, upload-time = "2025-07-03T10:06:29.599Z" }, + { url = "https://files.pythonhosted.org/packages/08/5b/a2a3d4514c64818925f4e886d39981f1926eeb5288a4549c6b3c17ed66bb/smart_open-7.3.0.post1-py3-none-any.whl", hash = "sha256:c73661a2c24bf045c1e04e08fffc585b59af023fe783d57896f590489db66fb4", size = 61946 }, ] [[package]] name = "smmap" version = "5.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } 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" }, + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, ] [[package]] @@ -2472,40 +2468,40 @@ dependencies = [ { name = "wasabi" }, { name = "weasel" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/9e/fb4e1cefe3fbd51ea6a243e5a3d2bc629baa9a28930bf4be6fe5672fa1ca/spacy-3.8.7.tar.gz", hash = "sha256:700fd174c6c552276be142c48e70bb53cae24c4dd86003c4432af9cb93e4c908", size = 1316143, upload-time = "2025-05-23T08:55:39.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/9e/fb4e1cefe3fbd51ea6a243e5a3d2bc629baa9a28930bf4be6fe5672fa1ca/spacy-3.8.7.tar.gz", hash = "sha256:700fd174c6c552276be142c48e70bb53cae24c4dd86003c4432af9cb93e4c908", size = 1316143 } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/2c/bbba614290492c169ee50777e44d3e4325a1e646272379988de8749b9dd4/spacy-3.8.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ec0368ce96cd775fb14906f04b771c912ea8393ba30f8b35f9c4dc47a420b8e", size = 6613435, upload-time = "2025-05-23T08:54:03.964Z" }, - { url = "https://files.pythonhosted.org/packages/39/a9/c1fdecc11d8855b3df601bbfb5fc4cdb98d79b6a5d166af974354ea658eb/spacy-3.8.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5672f8a0fe7a3847e925544890be60015fbf48a60a838803425f82e849dd4f18", size = 6261550, upload-time = "2025-05-23T08:54:06.984Z" }, - { url = "https://files.pythonhosted.org/packages/39/fe/e8b5a374f2517716f510f0dd6a0b68e88637e66db7c315d4002ba80b2bfe/spacy-3.8.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60cde9fe8b15be04eb1e634c353d9c160187115d825b368cc1975452dd54f264", size = 31215973, upload-time = "2025-05-23T08:54:09.46Z" }, - { url = "https://files.pythonhosted.org/packages/bb/e7/bd1df17add98a5ec3e0d2dd73d4e5884683ffd2e34d3c0e5828f48933787/spacy-3.8.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cac8e58fb92fb1c5e06328039595fa6589a9d1403681266f8f5e454d15319c", size = 31504596, upload-time = "2025-05-23T08:54:12.684Z" }, - { url = "https://files.pythonhosted.org/packages/b2/fa/5fd95749f390478a31a806500e829c5a8d97312ea18129494d255e231c00/spacy-3.8.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1456245a4ed04bc882db2d89a27ca1b6dc0b947b643bedaeaa5da11d9f7e22ec", size = 30527369, upload-time = "2025-05-23T08:54:15.467Z" }, - { url = "https://files.pythonhosted.org/packages/7a/74/f4708260fc135f8de15eb1d0ecfe00fd7b53f4b1d4927f90a33d48dff637/spacy-3.8.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bb98f85d467963d17c7c660884069ba948bde71c07280c91ee3235e554375308", size = 31357330, upload-time = "2025-05-23T08:54:18.342Z" }, - { url = "https://files.pythonhosted.org/packages/53/a6/3086859d2bfb5b6f97b17e19f51da0983eb11b07f63c24dced6506cdb370/spacy-3.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:b0df50d69e6691e97eae228733b321971607dbbb799e59d8470f2e70b8b27a8e", size = 14929267, upload-time = "2025-05-23T08:54:21.365Z" }, - { url = "https://files.pythonhosted.org/packages/29/c5/5fbb3a4e694d4855a5bab87af9664377c48b89691f180ad3cde4faeaf35c/spacy-3.8.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bdff8b9b556468a6dd527af17f0ddf9fb0b0bee92ee7703339ddf542361cff98", size = 6746140, upload-time = "2025-05-23T08:54:23.483Z" }, - { url = "https://files.pythonhosted.org/packages/03/2a/43afac516eb82409ca47d7206f982beaf265d2ba06a72ca07cf06b290c20/spacy-3.8.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9194b7cf015ed9b4450ffb162da49c8a9305e76b468de036b0948abdfc748a37", size = 6392440, upload-time = "2025-05-23T08:54:25.12Z" }, - { url = "https://files.pythonhosted.org/packages/6f/83/2ea68c18e2b1b9a6f6b30ef63eb9d07e979626b9595acfdb5394f18923c4/spacy-3.8.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7dc38b78d48b9c2a80a3eea95f776304993f63fc307f07cdd104441442f92f1e", size = 32699126, upload-time = "2025-05-23T08:54:27.385Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0a/bb90e9aa0b3c527876627567d82517aabab08006ccf63796c33b0242254d/spacy-3.8.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e43bd70772751b8fc7a14f338d087a3d297195d43d171832923ef66204b23ab", size = 33008865, upload-time = "2025-05-23T08:54:30.248Z" }, - { url = "https://files.pythonhosted.org/packages/39/dd/8e906ba378457107ab0394976ea9f7b12fdb2cad682ef1a2ccf473d61e5f/spacy-3.8.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c402bf5dcf345fd96d202378c54bc345219681e3531f911d99567d569328c45f", size = 31933169, upload-time = "2025-05-23T08:54:33.199Z" }, - { url = "https://files.pythonhosted.org/packages/c9/b5/42df07eb837a923fbb42509864d5c7c2072d010de933dccdfb3c655b3a76/spacy-3.8.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4234189861e486d86f1269e50542d87e8a6391a1ee190652479cf1a793db115f", size = 32776322, upload-time = "2025-05-23T08:54:36.891Z" }, - { url = "https://files.pythonhosted.org/packages/92/e7/8176484801c67dcd814f141991fe0a3c9b5b4a3583ea30c2062e93d1aa6b/spacy-3.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:e9d12e2eb7f36bc11dd9edae011032fe49ea100d63e83177290d3cbd80eaa650", size = 14938936, upload-time = "2025-05-23T08:54:40.322Z" }, + { url = "https://files.pythonhosted.org/packages/29/2c/bbba614290492c169ee50777e44d3e4325a1e646272379988de8749b9dd4/spacy-3.8.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ec0368ce96cd775fb14906f04b771c912ea8393ba30f8b35f9c4dc47a420b8e", size = 6613435 }, + { url = "https://files.pythonhosted.org/packages/39/a9/c1fdecc11d8855b3df601bbfb5fc4cdb98d79b6a5d166af974354ea658eb/spacy-3.8.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5672f8a0fe7a3847e925544890be60015fbf48a60a838803425f82e849dd4f18", size = 6261550 }, + { url = "https://files.pythonhosted.org/packages/39/fe/e8b5a374f2517716f510f0dd6a0b68e88637e66db7c315d4002ba80b2bfe/spacy-3.8.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60cde9fe8b15be04eb1e634c353d9c160187115d825b368cc1975452dd54f264", size = 31215973 }, + { url = "https://files.pythonhosted.org/packages/bb/e7/bd1df17add98a5ec3e0d2dd73d4e5884683ffd2e34d3c0e5828f48933787/spacy-3.8.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9cac8e58fb92fb1c5e06328039595fa6589a9d1403681266f8f5e454d15319c", size = 31504596 }, + { url = "https://files.pythonhosted.org/packages/b2/fa/5fd95749f390478a31a806500e829c5a8d97312ea18129494d255e231c00/spacy-3.8.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1456245a4ed04bc882db2d89a27ca1b6dc0b947b643bedaeaa5da11d9f7e22ec", size = 30527369 }, + { url = "https://files.pythonhosted.org/packages/7a/74/f4708260fc135f8de15eb1d0ecfe00fd7b53f4b1d4927f90a33d48dff637/spacy-3.8.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bb98f85d467963d17c7c660884069ba948bde71c07280c91ee3235e554375308", size = 31357330 }, + { url = "https://files.pythonhosted.org/packages/53/a6/3086859d2bfb5b6f97b17e19f51da0983eb11b07f63c24dced6506cdb370/spacy-3.8.7-cp310-cp310-win_amd64.whl", hash = "sha256:b0df50d69e6691e97eae228733b321971607dbbb799e59d8470f2e70b8b27a8e", size = 14929267 }, + { url = "https://files.pythonhosted.org/packages/29/c5/5fbb3a4e694d4855a5bab87af9664377c48b89691f180ad3cde4faeaf35c/spacy-3.8.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bdff8b9b556468a6dd527af17f0ddf9fb0b0bee92ee7703339ddf542361cff98", size = 6746140 }, + { url = "https://files.pythonhosted.org/packages/03/2a/43afac516eb82409ca47d7206f982beaf265d2ba06a72ca07cf06b290c20/spacy-3.8.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9194b7cf015ed9b4450ffb162da49c8a9305e76b468de036b0948abdfc748a37", size = 6392440 }, + { url = "https://files.pythonhosted.org/packages/6f/83/2ea68c18e2b1b9a6f6b30ef63eb9d07e979626b9595acfdb5394f18923c4/spacy-3.8.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7dc38b78d48b9c2a80a3eea95f776304993f63fc307f07cdd104441442f92f1e", size = 32699126 }, + { url = "https://files.pythonhosted.org/packages/0a/0a/bb90e9aa0b3c527876627567d82517aabab08006ccf63796c33b0242254d/spacy-3.8.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e43bd70772751b8fc7a14f338d087a3d297195d43d171832923ef66204b23ab", size = 33008865 }, + { url = "https://files.pythonhosted.org/packages/39/dd/8e906ba378457107ab0394976ea9f7b12fdb2cad682ef1a2ccf473d61e5f/spacy-3.8.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c402bf5dcf345fd96d202378c54bc345219681e3531f911d99567d569328c45f", size = 31933169 }, + { url = "https://files.pythonhosted.org/packages/c9/b5/42df07eb837a923fbb42509864d5c7c2072d010de933dccdfb3c655b3a76/spacy-3.8.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4234189861e486d86f1269e50542d87e8a6391a1ee190652479cf1a793db115f", size = 32776322 }, + { url = "https://files.pythonhosted.org/packages/92/e7/8176484801c67dcd814f141991fe0a3c9b5b4a3583ea30c2062e93d1aa6b/spacy-3.8.7-cp311-cp311-win_amd64.whl", hash = "sha256:e9d12e2eb7f36bc11dd9edae011032fe49ea100d63e83177290d3cbd80eaa650", size = 14938936 }, ] [[package]] name = "spacy-legacy" version = "3.0.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d9/79/91f9d7cc8db5642acad830dcc4b49ba65a7790152832c4eceb305e46d681/spacy-legacy-3.0.12.tar.gz", hash = "sha256:b37d6e0c9b6e1d7ca1cf5bc7152ab64a4c4671f59c85adaf7a3fcb870357a774", size = 23806, upload-time = "2023-01-23T09:04:15.104Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/79/91f9d7cc8db5642acad830dcc4b49ba65a7790152832c4eceb305e46d681/spacy-legacy-3.0.12.tar.gz", hash = "sha256:b37d6e0c9b6e1d7ca1cf5bc7152ab64a4c4671f59c85adaf7a3fcb870357a774", size = 23806 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/55/12e842c70ff8828e34e543a2c7176dac4da006ca6901c9e8b43efab8bc6b/spacy_legacy-3.0.12-py2.py3-none-any.whl", hash = "sha256:476e3bd0d05f8c339ed60f40986c07387c0a71479245d6d0f4298dbd52cda55f", size = 29971, upload-time = "2023-01-23T09:04:13.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/55/12e842c70ff8828e34e543a2c7176dac4da006ca6901c9e8b43efab8bc6b/spacy_legacy-3.0.12-py2.py3-none-any.whl", hash = "sha256:476e3bd0d05f8c339ed60f40986c07387c0a71479245d6d0f4298dbd52cda55f", size = 29971 }, ] [[package]] name = "spacy-loggers" version = "1.0.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/67/3d/926db774c9c98acf66cb4ed7faf6c377746f3e00b84b700d0868b95d0712/spacy-loggers-1.0.5.tar.gz", hash = "sha256:d60b0bdbf915a60e516cc2e653baeff946f0cfc461b452d11a4d5458c6fe5f24", size = 20811, upload-time = "2023-09-11T12:26:52.323Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/3d/926db774c9c98acf66cb4ed7faf6c377746f3e00b84b700d0868b95d0712/spacy-loggers-1.0.5.tar.gz", hash = "sha256:d60b0bdbf915a60e516cc2e653baeff946f0cfc461b452d11a4d5458c6fe5f24", size = 20811 } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/78/d1a1a026ef3af911159398c939b1509d5c36fe524c7b644f34a5146c4e16/spacy_loggers-1.0.5-py3-none-any.whl", hash = "sha256:196284c9c446cc0cdb944005384270d775fdeaf4f494d8e269466cfa497ef645", size = 22343, upload-time = "2023-09-11T12:26:50.586Z" }, + { url = "https://files.pythonhosted.org/packages/33/78/d1a1a026ef3af911159398c939b1509d5c36fe524c7b644f34a5146c4e16/spacy_loggers-1.0.5-py3-none-any.whl", hash = "sha256:196284c9c446cc0cdb944005384270d775fdeaf4f494d8e269466cfa497ef645", size = 22343 }, ] [[package]] @@ -2515,22 +2511,22 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "catalogue" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/e8/eb51b1349f50bac0222398af0942613fdc9d1453ae67cbe4bf9936a1a54b/srsly-2.5.1.tar.gz", hash = "sha256:ab1b4bf6cf3e29da23dae0493dd1517fb787075206512351421b89b4fc27c77e", size = 466464, upload-time = "2025-01-17T09:26:26.919Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/e8/eb51b1349f50bac0222398af0942613fdc9d1453ae67cbe4bf9936a1a54b/srsly-2.5.1.tar.gz", hash = "sha256:ab1b4bf6cf3e29da23dae0493dd1517fb787075206512351421b89b4fc27c77e", size = 466464 } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/08/448bcc87bb93bc19fccf70c2f0f993ac42aa41d5f44a19c60d00186aea09/srsly-2.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d0cda6f65cc0dd1daf47e856b0d6c5d51db8a9343c5007723ca06903dcfe367d", size = 636045, upload-time = "2025-01-17T09:25:04.605Z" }, - { url = "https://files.pythonhosted.org/packages/03/8a/379dd9014e56460e71346cf512632fb8cbc89aa6dfebe31dff21c9eb37ba/srsly-2.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf643e6f45c266cfacea54997a1f9cfe0113fadac1ac21a1ec5b200cfe477ba0", size = 634425, upload-time = "2025-01-17T09:25:07.957Z" }, - { url = "https://files.pythonhosted.org/packages/95/69/46e672941b5f4403b0e2b14918d8e1393ca48e3338e2c01e549113261cdf/srsly-2.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:467ed25ddab09ca9404fda92519a317c803b5ea0849f846e74ba8b7843557df5", size = 1085032, upload-time = "2025-01-17T09:25:11.291Z" }, - { url = "https://files.pythonhosted.org/packages/ce/d8/1039e663b87a06d2450148ebadc07eaf6f8b7dd7f7d5e2f4221050ce6702/srsly-2.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8113d202664b7d31025bdbe40b9d3536e8d7154d09520b6a1955818fa6d622", size = 1089469, upload-time = "2025-01-17T09:25:15.913Z" }, - { url = "https://files.pythonhosted.org/packages/e9/62/f819ac665ecca2659343a6c79174c582fe292829f481899f05e7a7301988/srsly-2.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:794d39fccd2b333d24f1b445acc78daf90f3f37d3c0f6f0167f25c56961804e7", size = 1052673, upload-time = "2025-01-17T09:25:17.658Z" }, - { url = "https://files.pythonhosted.org/packages/a8/69/321a41fe4d549b96dd010b6a77657e84eb181034f9d125e2feebcd8f2e5c/srsly-2.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df7fd77457c4d6c630f700b1019a8ad173e411e7cf7cfdea70e5ed86b608083b", size = 1062650, upload-time = "2025-01-17T09:25:20.704Z" }, - { url = "https://files.pythonhosted.org/packages/d5/b8/3dfed2db5c7ecf275aaddb775e2ae17c576b09c848873188fce91e410129/srsly-2.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:1a4dddb2edb8f7974c9aa5ec46dc687a75215b3bbdc815ce3fc9ea68fe1e94b5", size = 632267, upload-time = "2025-01-17T09:25:23.713Z" }, - { url = "https://files.pythonhosted.org/packages/df/9c/a248bb49de499fe0990e3cb0fb341c2373d8863ef9a8b5799353cade5731/srsly-2.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58f0736794ce00a71d62a39cbba1d62ea8d5be4751df956e802d147da20ecad7", size = 635917, upload-time = "2025-01-17T09:25:25.109Z" }, - { url = "https://files.pythonhosted.org/packages/41/47/1bdaad84502df973ecb8ca658117234cf7fb20e1dec60da71dce82de993f/srsly-2.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8269c40859806d71920396d185f4f38dc985cdb6a28d3a326a701e29a5f629", size = 634374, upload-time = "2025-01-17T09:25:26.609Z" }, - { url = "https://files.pythonhosted.org/packages/e5/2a/d73c71989fcf2a6d1fa518d75322aff4db01a8763f167f8c5e00aac11097/srsly-2.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889905900401fefc1032e22b73aecbed8b4251aa363f632b2d1f86fc16f1ad8e", size = 1108390, upload-time = "2025-01-17T09:25:29.32Z" }, - { url = "https://files.pythonhosted.org/packages/35/a3/9eda9997a8bd011caed18fdaa5ce606714eb06d8dab587ed0522b3e92ab1/srsly-2.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf454755f22589df49c25dc799d8af7b47dce3d861dded35baf0f0b6ceab4422", size = 1110712, upload-time = "2025-01-17T09:25:31.051Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ef/4b50bc05d06349f905b27f824cc23b652098efd4be19aead3af4981df647/srsly-2.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc0607c8a59013a51dde5c1b4e465558728e9e0a35dcfa73c7cbefa91a0aad50", size = 1081244, upload-time = "2025-01-17T09:25:32.611Z" }, - { url = "https://files.pythonhosted.org/packages/90/af/d4a2512d9a5048d2b18efead39d4c4404bddd4972935bbc68211292a736c/srsly-2.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d5421ba3ab3c790e8b41939c51a1d0f44326bfc052d7a0508860fb79a47aee7f", size = 1091692, upload-time = "2025-01-17T09:25:34.15Z" }, - { url = "https://files.pythonhosted.org/packages/bb/da/657a685f63028dcb00ccdc4ac125ed347c8bff6fa0dab6a9eb3dc45f3223/srsly-2.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:b96ea5a9a0d0379a79c46d255464a372fb14c30f59a8bc113e4316d131a530ab", size = 632627, upload-time = "2025-01-17T09:25:37.36Z" }, + { url = "https://files.pythonhosted.org/packages/37/08/448bcc87bb93bc19fccf70c2f0f993ac42aa41d5f44a19c60d00186aea09/srsly-2.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d0cda6f65cc0dd1daf47e856b0d6c5d51db8a9343c5007723ca06903dcfe367d", size = 636045 }, + { url = "https://files.pythonhosted.org/packages/03/8a/379dd9014e56460e71346cf512632fb8cbc89aa6dfebe31dff21c9eb37ba/srsly-2.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf643e6f45c266cfacea54997a1f9cfe0113fadac1ac21a1ec5b200cfe477ba0", size = 634425 }, + { url = "https://files.pythonhosted.org/packages/95/69/46e672941b5f4403b0e2b14918d8e1393ca48e3338e2c01e549113261cdf/srsly-2.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:467ed25ddab09ca9404fda92519a317c803b5ea0849f846e74ba8b7843557df5", size = 1085032 }, + { url = "https://files.pythonhosted.org/packages/ce/d8/1039e663b87a06d2450148ebadc07eaf6f8b7dd7f7d5e2f4221050ce6702/srsly-2.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f8113d202664b7d31025bdbe40b9d3536e8d7154d09520b6a1955818fa6d622", size = 1089469 }, + { url = "https://files.pythonhosted.org/packages/e9/62/f819ac665ecca2659343a6c79174c582fe292829f481899f05e7a7301988/srsly-2.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:794d39fccd2b333d24f1b445acc78daf90f3f37d3c0f6f0167f25c56961804e7", size = 1052673 }, + { url = "https://files.pythonhosted.org/packages/a8/69/321a41fe4d549b96dd010b6a77657e84eb181034f9d125e2feebcd8f2e5c/srsly-2.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:df7fd77457c4d6c630f700b1019a8ad173e411e7cf7cfdea70e5ed86b608083b", size = 1062650 }, + { url = "https://files.pythonhosted.org/packages/d5/b8/3dfed2db5c7ecf275aaddb775e2ae17c576b09c848873188fce91e410129/srsly-2.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:1a4dddb2edb8f7974c9aa5ec46dc687a75215b3bbdc815ce3fc9ea68fe1e94b5", size = 632267 }, + { url = "https://files.pythonhosted.org/packages/df/9c/a248bb49de499fe0990e3cb0fb341c2373d8863ef9a8b5799353cade5731/srsly-2.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58f0736794ce00a71d62a39cbba1d62ea8d5be4751df956e802d147da20ecad7", size = 635917 }, + { url = "https://files.pythonhosted.org/packages/41/47/1bdaad84502df973ecb8ca658117234cf7fb20e1dec60da71dce82de993f/srsly-2.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8269c40859806d71920396d185f4f38dc985cdb6a28d3a326a701e29a5f629", size = 634374 }, + { url = "https://files.pythonhosted.org/packages/e5/2a/d73c71989fcf2a6d1fa518d75322aff4db01a8763f167f8c5e00aac11097/srsly-2.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889905900401fefc1032e22b73aecbed8b4251aa363f632b2d1f86fc16f1ad8e", size = 1108390 }, + { url = "https://files.pythonhosted.org/packages/35/a3/9eda9997a8bd011caed18fdaa5ce606714eb06d8dab587ed0522b3e92ab1/srsly-2.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf454755f22589df49c25dc799d8af7b47dce3d861dded35baf0f0b6ceab4422", size = 1110712 }, + { url = "https://files.pythonhosted.org/packages/8a/ef/4b50bc05d06349f905b27f824cc23b652098efd4be19aead3af4981df647/srsly-2.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc0607c8a59013a51dde5c1b4e465558728e9e0a35dcfa73c7cbefa91a0aad50", size = 1081244 }, + { url = "https://files.pythonhosted.org/packages/90/af/d4a2512d9a5048d2b18efead39d4c4404bddd4972935bbc68211292a736c/srsly-2.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d5421ba3ab3c790e8b41939c51a1d0f44326bfc052d7a0508860fb79a47aee7f", size = 1091692 }, + { url = "https://files.pythonhosted.org/packages/bb/da/657a685f63028dcb00ccdc4ac125ed347c8bff6fa0dab6a9eb3dc45f3223/srsly-2.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:b96ea5a9a0d0379a79c46d255464a372fb14c30f59a8bc113e4316d131a530ab", size = 632627 }, ] [[package]] @@ -2540,9 +2536,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "streamlit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/b9/f2d0593b80991eddb5f73c113c1d9d090b4564dba984e65b8823b9d119cc/st_tabs-0.1.1.tar.gz", hash = "sha256:6bb090d9c09ffa7a621b284ecc9ba84c56f366f656c65501f36e9cf591e4fbb6", size = 621255, upload-time = "2023-09-07T13:39:54.42Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/b9/f2d0593b80991eddb5f73c113c1d9d090b4564dba984e65b8823b9d119cc/st_tabs-0.1.1.tar.gz", hash = "sha256:6bb090d9c09ffa7a621b284ecc9ba84c56f366f656c65501f36e9cf591e4fbb6", size = 621255 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/e1/53591389caea01689dc923bbb69426d0377e28dd3cb85bb1ab0ed365bd9a/st_tabs-0.1.1-py3-none-any.whl", hash = "sha256:a12c3cc6aeaf7a37f86239447349729a187d7e19047ddc20b69dfa154c57120a", size = 627441, upload-time = "2023-09-07T13:39:51.39Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e1/53591389caea01689dc923bbb69426d0377e28dd3cb85bb1ab0ed365bd9a/st_tabs-0.1.1-py3-none-any.whl", hash = "sha256:a12c3cc6aeaf7a37f86239447349729a187d7e19047ddc20b69dfa154c57120a", size = 627441 }, ] [[package]] @@ -2554,9 +2550,9 @@ dependencies = [ { 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" } +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } 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" }, + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, ] [[package]] @@ -2570,20 +2566,20 @@ dependencies = [ { name = "patsy" }, { name = "scipy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/64/cc/8c1bf59bf8203dea1bf2ea811cfe667d7bcc6909c83d8afb02b08e30f50b/statsmodels-0.14.5.tar.gz", hash = "sha256:de260e58cccfd2ceddf835b55a357233d6ca853a1aa4f90f7553a52cc71c6ddf", size = 20525016, upload-time = "2025-07-07T12:14:23.195Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/cc/8c1bf59bf8203dea1bf2ea811cfe667d7bcc6909c83d8afb02b08e30f50b/statsmodels-0.14.5.tar.gz", hash = "sha256:de260e58cccfd2ceddf835b55a357233d6ca853a1aa4f90f7553a52cc71c6ddf", size = 20525016 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/2c/55b2a5d10c1a211ecab3f792021d2581bbe1c5ca0a1059f6715dddc6899d/statsmodels-0.14.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9fc2b5cdc0c95cba894849651fec1fa1511d365e3eb72b0cc75caac44077cd48", size = 10058241, upload-time = "2025-07-07T12:13:16.286Z" }, - { url = "https://files.pythonhosted.org/packages/66/d9/6967475805de06691e951072d05e40e3f1c71b6221bb92401193ee19bd2a/statsmodels-0.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b8d96b0bbaeabd3a557c35cc7249baa9cfbc6dd305c32a9f2cbdd7f46c037e7f", size = 9734017, upload-time = "2025-07-07T12:05:08.498Z" }, - { url = "https://files.pythonhosted.org/packages/df/a8/803c280419a7312e2472969fe72cf461c1210a27770a662cbe3b5cd7c6fe/statsmodels-0.14.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:145bc39b2cb201efb6c83cc3f2163c269e63b0d4809801853dec6f440bd3bc37", size = 10459677, upload-time = "2025-07-07T14:21:51.809Z" }, - { url = "https://files.pythonhosted.org/packages/a1/25/edf20acbd670934b02cd9344e29c9a03ce040122324b3491bb075ae76b2d/statsmodels-0.14.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7c14fb2617bb819fb2532e1424e1da2b98a3419a80e95f33365a72d437d474e", size = 10678631, upload-time = "2025-07-07T14:22:05.496Z" }, - { url = "https://files.pythonhosted.org/packages/64/22/8b1e38310272e766abd6093607000a81827420a3348f09eff08a9e54cbaf/statsmodels-0.14.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1e9742d8a5ac38a3bfc4b7f4b0681903920f20cbbf466d72b1fd642033846108", size = 10699273, upload-time = "2025-07-07T14:22:19.487Z" }, - { url = "https://files.pythonhosted.org/packages/d1/6f/6de51f1077b7cef34611f1d6721392ea170153251b4d977efcf6d100f779/statsmodels-0.14.5-cp310-cp310-win_amd64.whl", hash = "sha256:1cab9e6fce97caf4239cdb2df375806937da5d0b7ba2699b13af33a07f438464", size = 9644785, upload-time = "2025-07-07T12:05:20.927Z" }, - { url = "https://files.pythonhosted.org/packages/14/30/fd49902b30416b828de763e161c0d6e2cc04d119ae4fbdd3f3b43dc8f1be/statsmodels-0.14.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b7091a8442076c708c926de3603653a160955e80a2b6d931475b7bb8ddc02e5", size = 10053330, upload-time = "2025-07-07T12:07:39.689Z" }, - { url = "https://files.pythonhosted.org/packages/ca/c1/2654541ff6f5790d01d1e5ba36405fde873f4a854f473e90b4fe56b37333/statsmodels-0.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:128872be8f3208f4446d91ea9e4261823902fc7997fee7e1a983eb62fd3b7c6e", size = 9735555, upload-time = "2025-07-07T12:13:28.935Z" }, - { url = "https://files.pythonhosted.org/packages/ce/da/6ebb64d0db4e86c0d2d9cde89e03247702da0ab191789f7813d4f9a348da/statsmodels-0.14.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f2ad5aee04ae7196c429df2174df232c057e478c5fa63193d01c8ec9aae04d31", size = 10307522, upload-time = "2025-07-07T14:22:32.853Z" }, - { url = "https://files.pythonhosted.org/packages/67/49/ac803ca093ec3845184a752a91cd84511245e1f97103b15cfe32794a3bb0/statsmodels-0.14.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f402fc793458dd6d96e099acb44cd1de1428565bf7ef3030878a8daff091f08a", size = 10474665, upload-time = "2025-07-07T14:22:46.011Z" }, - { url = "https://files.pythonhosted.org/packages/f0/c8/ae82feb00582f4814fac5d2cb3ec32f93866b413cf5878b2fe93688ec63c/statsmodels-0.14.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26c028832730aebfbfd4e7501694e1f9ad31ec8536e776716673f4e7afd4059a", size = 10713120, upload-time = "2025-07-07T14:23:00.067Z" }, - { url = "https://files.pythonhosted.org/packages/05/ac/4276459ea71aa46e2967ea283fc88ee5631c11f29a06787e16cf4aece1b8/statsmodels-0.14.5-cp311-cp311-win_amd64.whl", hash = "sha256:ec56f771d9529cdc17ed2fb2a950d100b6e83a7c5372aae8ac5bb065c474b856", size = 9640980, upload-time = "2025-07-07T12:05:33.085Z" }, + { url = "https://files.pythonhosted.org/packages/3a/2c/55b2a5d10c1a211ecab3f792021d2581bbe1c5ca0a1059f6715dddc6899d/statsmodels-0.14.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9fc2b5cdc0c95cba894849651fec1fa1511d365e3eb72b0cc75caac44077cd48", size = 10058241 }, + { url = "https://files.pythonhosted.org/packages/66/d9/6967475805de06691e951072d05e40e3f1c71b6221bb92401193ee19bd2a/statsmodels-0.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b8d96b0bbaeabd3a557c35cc7249baa9cfbc6dd305c32a9f2cbdd7f46c037e7f", size = 9734017 }, + { url = "https://files.pythonhosted.org/packages/df/a8/803c280419a7312e2472969fe72cf461c1210a27770a662cbe3b5cd7c6fe/statsmodels-0.14.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:145bc39b2cb201efb6c83cc3f2163c269e63b0d4809801853dec6f440bd3bc37", size = 10459677 }, + { url = "https://files.pythonhosted.org/packages/a1/25/edf20acbd670934b02cd9344e29c9a03ce040122324b3491bb075ae76b2d/statsmodels-0.14.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7c14fb2617bb819fb2532e1424e1da2b98a3419a80e95f33365a72d437d474e", size = 10678631 }, + { url = "https://files.pythonhosted.org/packages/64/22/8b1e38310272e766abd6093607000a81827420a3348f09eff08a9e54cbaf/statsmodels-0.14.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1e9742d8a5ac38a3bfc4b7f4b0681903920f20cbbf466d72b1fd642033846108", size = 10699273 }, + { url = "https://files.pythonhosted.org/packages/d1/6f/6de51f1077b7cef34611f1d6721392ea170153251b4d977efcf6d100f779/statsmodels-0.14.5-cp310-cp310-win_amd64.whl", hash = "sha256:1cab9e6fce97caf4239cdb2df375806937da5d0b7ba2699b13af33a07f438464", size = 9644785 }, + { url = "https://files.pythonhosted.org/packages/14/30/fd49902b30416b828de763e161c0d6e2cc04d119ae4fbdd3f3b43dc8f1be/statsmodels-0.14.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b7091a8442076c708c926de3603653a160955e80a2b6d931475b7bb8ddc02e5", size = 10053330 }, + { url = "https://files.pythonhosted.org/packages/ca/c1/2654541ff6f5790d01d1e5ba36405fde873f4a854f473e90b4fe56b37333/statsmodels-0.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:128872be8f3208f4446d91ea9e4261823902fc7997fee7e1a983eb62fd3b7c6e", size = 9735555 }, + { url = "https://files.pythonhosted.org/packages/ce/da/6ebb64d0db4e86c0d2d9cde89e03247702da0ab191789f7813d4f9a348da/statsmodels-0.14.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f2ad5aee04ae7196c429df2174df232c057e478c5fa63193d01c8ec9aae04d31", size = 10307522 }, + { url = "https://files.pythonhosted.org/packages/67/49/ac803ca093ec3845184a752a91cd84511245e1f97103b15cfe32794a3bb0/statsmodels-0.14.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f402fc793458dd6d96e099acb44cd1de1428565bf7ef3030878a8daff091f08a", size = 10474665 }, + { url = "https://files.pythonhosted.org/packages/f0/c8/ae82feb00582f4814fac5d2cb3ec32f93866b413cf5878b2fe93688ec63c/statsmodels-0.14.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:26c028832730aebfbfd4e7501694e1f9ad31ec8536e776716673f4e7afd4059a", size = 10713120 }, + { url = "https://files.pythonhosted.org/packages/05/ac/4276459ea71aa46e2967ea283fc88ee5631c11f29a06787e16cf4aece1b8/statsmodels-0.14.5-cp311-cp311-win_amd64.whl", hash = "sha256:ec56f771d9529cdc17ed2fb2a950d100b6e83a7c5372aae8ac5bb065c474b856", size = 9640980 }, ] [[package]] @@ -2610,9 +2606,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "watchdog", marker = "sys_platform != 'darwin'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/05/7b0a78beb4589fa056435fdf2243bc28ba3b320f4bc54b2cbf7680d7848b/streamlit-1.43.0.tar.gz", hash = "sha256:c10c09f9d1251fa7f975dd360572f03cabc82b174f080e323bf7e556103c22e0", size = 9344982, upload-time = "2025-03-04T20:28:23.127Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/05/7b0a78beb4589fa056435fdf2243bc28ba3b320f4bc54b2cbf7680d7848b/streamlit-1.43.0.tar.gz", hash = "sha256:c10c09f9d1251fa7f975dd360572f03cabc82b174f080e323bf7e556103c22e0", size = 9344982 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/37/6ae099cf3029990fb2b35420296e3066c649a9dc5c286fa74643b1d7074f/streamlit-1.43.0-py2.py3-none-any.whl", hash = "sha256:cf94b1e9f1de75e4e383df53745230feaac4ac7a7e1f14a3ea362df134db8510", size = 9734392, upload-time = "2025-03-04T20:28:19.189Z" }, + { url = "https://files.pythonhosted.org/packages/e9/37/6ae099cf3029990fb2b35420296e3066c649a9dc5c286fa74643b1d7074f/streamlit-1.43.0-py2.py3-none-any.whl", hash = "sha256:cf94b1e9f1de75e4e383df53745230feaac4ac7a7e1f14a3ea362df134db8510", size = 9734392 }, ] [[package]] @@ -2625,18 +2621,18 @@ dependencies = [ { name = "rdflib" }, { name = "streamlit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/63/00a16b1500cde32d43177bba1c16d12369ed7d1c8b45ab8162f6552d8519/streamlit-agraph-0.0.45.tar.gz", hash = "sha256:b2b7cf1ad0a40dc906de50792b27f2878b0e186603cb3bc958ed78ca7e469cdd", size = 1299483, upload-time = "2023-01-28T10:26:00.46Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/63/00a16b1500cde32d43177bba1c16d12369ed7d1c8b45ab8162f6552d8519/streamlit-agraph-0.0.45.tar.gz", hash = "sha256:b2b7cf1ad0a40dc906de50792b27f2878b0e186603cb3bc958ed78ca7e469cdd", size = 1299483 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/80/8a666e700332a9fe19e458678c95fab4d78340251d2f12da7d2ad915458a/streamlit_agraph-0.0.45-py3-none-any.whl", hash = "sha256:38e7271ffd76a6769968c2e9dfc16cbac7621d62be15af98b62598e1446bee2f", size = 1312064, upload-time = "2023-01-28T10:25:58.043Z" }, + { url = "https://files.pythonhosted.org/packages/b9/80/8a666e700332a9fe19e458678c95fab4d78340251d2f12da7d2ad915458a/streamlit_agraph-0.0.45-py3-none-any.whl", hash = "sha256:38e7271ffd76a6769968c2e9dfc16cbac7621d62be15af98b62598e1446bee2f", size = 1312064 }, ] [[package]] name = "tenacity" version = "9.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, ] [[package]] @@ -2646,9 +2642,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nltk" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/9b/8648f7ab89afb38de30aef9739a7f31491631635bd364042869162132bc4/textblob-0.18.0.post0.tar.gz", hash = "sha256:8131c52c630bcdf61d04c359f939c98d5b836a01fba224d9e7ae22fc274e0ccb", size = 639600, upload-time = "2024-02-15T20:39:50.452Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/9b/8648f7ab89afb38de30aef9739a7f31491631635bd364042869162132bc4/textblob-0.18.0.post0.tar.gz", hash = "sha256:8131c52c630bcdf61d04c359f939c98d5b836a01fba224d9e7ae22fc274e0ccb", size = 639600 } wheels = [ - { url = "https://files.pythonhosted.org/packages/02/07/5fd2945356dd839974d3a25de8a142dc37293c21315729a41e775b5f3569/textblob-0.18.0.post0-py3-none-any.whl", hash = "sha256:dd0c7ec4eb7b9346ec0a3f136a63eba13e0f59890d2a693d3d6aeb8371949dca", size = 626330, upload-time = "2024-02-15T20:39:47.971Z" }, + { url = "https://files.pythonhosted.org/packages/02/07/5fd2945356dd839974d3a25de8a142dc37293c21315729a41e775b5f3569/textblob-0.18.0.post0-py3-none-any.whl", hash = "sha256:dd0c7ec4eb7b9346ec0a3f136a63eba13e0f59890d2a693d3d6aeb8371949dca", size = 626330 }, ] [[package]] @@ -2669,98 +2665,98 @@ dependencies = [ { name = "srsly" }, { name = "wasabi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/ff/60c9bcfe28e56c905aac8e61a838c7afe5dc3073c9beed0b63a26ace0bb7/thinc-8.3.4.tar.gz", hash = "sha256:b5925482498bbb6dca0771e375b35c915818f735891e93d93a662dab15f6ffd8", size = 193903, upload-time = "2025-01-13T12:47:51.698Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/ff/60c9bcfe28e56c905aac8e61a838c7afe5dc3073c9beed0b63a26ace0bb7/thinc-8.3.4.tar.gz", hash = "sha256:b5925482498bbb6dca0771e375b35c915818f735891e93d93a662dab15f6ffd8", size = 193903 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/c8/13db2e346d2e199f679fc3f620da53af561ea74b43b38e5b4a0a79a12860/thinc-8.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:916ea79a7c7462664be9435679b7769b4fc1ecea3886db6da6118e4eb5cc8c8b", size = 843884, upload-time = "2025-01-13T12:46:58.876Z" }, - { url = "https://files.pythonhosted.org/packages/ff/32/c25d68b5030f91c8506dfbba706f24b1cd1d0d4950cb0e3de17d176a5411/thinc-8.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c985ce9cf82a611f4f348c721372d073537ca0e8b7bbb8bd865c1598ddd79d1", size = 779384, upload-time = "2025-01-13T12:47:02.35Z" }, - { url = "https://files.pythonhosted.org/packages/5d/5f/8a88959191f8c9f7eed61a7efec45f0222720c6318c09f9a058609810128/thinc-8.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fff4b30f8513832d13a31486e9074a7020de3d48f8a3d1527e369c242d6ebe9", size = 3673814, upload-time = "2025-01-13T12:47:04.317Z" }, - { url = "https://files.pythonhosted.org/packages/6f/4f/ea998b85cece6c2441a2416c795476776a5c11f7f2c7fb478a00d407d7f6/thinc-8.3.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a9ee46d19b9f4cac13a5539f97978c857338a31e4bf8d9b3a7741dcbc792220f", size = 4685083, upload-time = "2025-01-13T12:47:07.706Z" }, - { url = "https://files.pythonhosted.org/packages/0b/d0/295add6fcac8b633877a3a8d4b323e8cac4f4078f4f48910deb8c29666cb/thinc-8.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:d08529d53f8652e15e4f3c0f6953e73f85cc71d3b6e4750d2d9ace23616dbe8f", size = 1492082, upload-time = "2025-01-13T12:47:09.452Z" }, - { url = "https://files.pythonhosted.org/packages/85/47/68187c78a04cdc31cbd3ae393068f994b60476b5ecac6dfe7d04b124aacf/thinc-8.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8bb4b47358a1855803b375f4432cefdf373f46ef249b554418d2e77c7323040", size = 839320, upload-time = "2025-01-13T12:47:12.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/ea/066dd415e61fcef20083bbca41c2c02e640fea71326531f2619708efee1e/thinc-8.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:00ed92f9a34b9794f51fcd48467c863f4eb7c5b41559aef6ef3c980c21378fec", size = 774196, upload-time = "2025-01-13T12:47:15.315Z" }, - { url = "https://files.pythonhosted.org/packages/8c/68/36c1a92a374891e0d496677c59f5f9fdc1e57bbb214c487bb8bb3e9290c2/thinc-8.3.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85691fca84a6a1506f7ddbd2c1706a5524d56f65582e76b2e260a06d9e83e86d", size = 3922504, upload-time = "2025-01-13T12:47:22.07Z" }, - { url = "https://files.pythonhosted.org/packages/ec/8a/48e463240a586e91f83c87660986e520aa91fbd839f6631ee9bc0fbb3cbd/thinc-8.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eae1573fc19e514defc1bfd4f93f0b4bfc1dcefdb6d70bad1863825747f24800", size = 4932946, upload-time = "2025-01-13T12:47:24.177Z" }, - { url = "https://files.pythonhosted.org/packages/d9/98/f910b8d8113ab9b955a68e9bbf0d5bd0e828f22dd6d3c226af6ec3970817/thinc-8.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:81e8638f9bdc38e366674acc4b63cf7c6267266a15477963a5db21b3d9f1aa36", size = 1490133, upload-time = "2025-01-13T12:47:26.152Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c8/13db2e346d2e199f679fc3f620da53af561ea74b43b38e5b4a0a79a12860/thinc-8.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:916ea79a7c7462664be9435679b7769b4fc1ecea3886db6da6118e4eb5cc8c8b", size = 843884 }, + { url = "https://files.pythonhosted.org/packages/ff/32/c25d68b5030f91c8506dfbba706f24b1cd1d0d4950cb0e3de17d176a5411/thinc-8.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c985ce9cf82a611f4f348c721372d073537ca0e8b7bbb8bd865c1598ddd79d1", size = 779384 }, + { url = "https://files.pythonhosted.org/packages/5d/5f/8a88959191f8c9f7eed61a7efec45f0222720c6318c09f9a058609810128/thinc-8.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fff4b30f8513832d13a31486e9074a7020de3d48f8a3d1527e369c242d6ebe9", size = 3673814 }, + { url = "https://files.pythonhosted.org/packages/6f/4f/ea998b85cece6c2441a2416c795476776a5c11f7f2c7fb478a00d407d7f6/thinc-8.3.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a9ee46d19b9f4cac13a5539f97978c857338a31e4bf8d9b3a7741dcbc792220f", size = 4685083 }, + { url = "https://files.pythonhosted.org/packages/0b/d0/295add6fcac8b633877a3a8d4b323e8cac4f4078f4f48910deb8c29666cb/thinc-8.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:d08529d53f8652e15e4f3c0f6953e73f85cc71d3b6e4750d2d9ace23616dbe8f", size = 1492082 }, + { url = "https://files.pythonhosted.org/packages/85/47/68187c78a04cdc31cbd3ae393068f994b60476b5ecac6dfe7d04b124aacf/thinc-8.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8bb4b47358a1855803b375f4432cefdf373f46ef249b554418d2e77c7323040", size = 839320 }, + { url = "https://files.pythonhosted.org/packages/49/ea/066dd415e61fcef20083bbca41c2c02e640fea71326531f2619708efee1e/thinc-8.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:00ed92f9a34b9794f51fcd48467c863f4eb7c5b41559aef6ef3c980c21378fec", size = 774196 }, + { url = "https://files.pythonhosted.org/packages/8c/68/36c1a92a374891e0d496677c59f5f9fdc1e57bbb214c487bb8bb3e9290c2/thinc-8.3.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85691fca84a6a1506f7ddbd2c1706a5524d56f65582e76b2e260a06d9e83e86d", size = 3922504 }, + { url = "https://files.pythonhosted.org/packages/ec/8a/48e463240a586e91f83c87660986e520aa91fbd839f6631ee9bc0fbb3cbd/thinc-8.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:eae1573fc19e514defc1bfd4f93f0b4bfc1dcefdb6d70bad1863825747f24800", size = 4932946 }, + { url = "https://files.pythonhosted.org/packages/d9/98/f910b8d8113ab9b955a68e9bbf0d5bd0e828f22dd6d3c226af6ec3970817/thinc-8.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:81e8638f9bdc38e366674acc4b63cf7c6267266a15477963a5db21b3d9f1aa36", size = 1490133 }, ] [[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" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274 } 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" }, + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638 }, ] [[package]] name = "tiktoken" -version = "0.8.0" +version = "0.11.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/37/02/576ff3a6639e755c4f70997b2d315f56d6d71e0d046f4fb64cb81a3fb099/tiktoken-0.8.0.tar.gz", hash = "sha256:9ccbb2740f24542534369c5635cfd9b2b3c2490754a78ac8831d99f89f94eeb2", size = 35107, upload-time = "2024-10-03T22:44:04.196Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/86/ad0155a37c4f310935d5ac0b1ccf9bdb635dcb906e0a9a26b616dd55825a/tiktoken-0.11.0.tar.gz", hash = "sha256:3c518641aee1c52247c2b97e74d8d07d780092af79d5911a6ab5e79359d9b06a", size = 37648 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/ba/a35fad753bbca8ba0cc1b0f3402a70256a110ced7ac332cf84ba89fc87ab/tiktoken-0.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b07e33283463089c81ef1467180e3e00ab00d46c2c4bbcef0acab5f771d6695e", size = 1039905, upload-time = "2024-10-03T22:43:17.292Z" }, - { url = "https://files.pythonhosted.org/packages/91/05/13dab8fd7460391c387b3e69e14bf1e51ff71fe0a202cd2933cc3ea93fb6/tiktoken-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9269348cb650726f44dd3bbb3f9110ac19a8dcc8f54949ad3ef652ca22a38e21", size = 982417, upload-time = "2024-10-03T22:43:19.437Z" }, - { url = "https://files.pythonhosted.org/packages/e9/98/18ec4a8351a6cf4537e40cd6e19a422c10cce1ef00a2fcb716e0a96af58b/tiktoken-0.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e13f37bc4ef2d012731e93e0fef21dc3b7aea5bb9009618de9a4026844e560", size = 1144915, upload-time = "2024-10-03T22:43:21.385Z" }, - { url = "https://files.pythonhosted.org/packages/2e/28/cf3633018cbcc6deb7805b700ccd6085c9a5a7f72b38974ee0bffd56d311/tiktoken-0.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f13d13c981511331eac0d01a59b5df7c0d4060a8be1e378672822213da51e0a2", size = 1177221, upload-time = "2024-10-03T22:43:23.325Z" }, - { url = "https://files.pythonhosted.org/packages/57/81/8a5be305cbd39d4e83a794f9e80c7f2c84b524587b7feb27c797b2046d51/tiktoken-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:6b2ddbc79a22621ce8b1166afa9f9a888a664a579350dc7c09346a3b5de837d9", size = 1237398, upload-time = "2024-10-03T22:43:24.71Z" }, - { url = "https://files.pythonhosted.org/packages/dc/da/8d1cc3089a83f5cf11c2e489332752981435280285231924557350523a59/tiktoken-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d8c2d0e5ba6453a290b86cd65fc51fedf247e1ba170191715b049dac1f628005", size = 884215, upload-time = "2024-10-03T22:43:26.793Z" }, - { url = "https://files.pythonhosted.org/packages/f6/1e/ca48e7bfeeccaf76f3a501bd84db1fa28b3c22c9d1a1f41af9fb7579c5f6/tiktoken-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d622d8011e6d6f239297efa42a2657043aaed06c4f68833550cac9e9bc723ef1", size = 1039700, upload-time = "2024-10-03T22:43:28.315Z" }, - { url = "https://files.pythonhosted.org/packages/8c/f8/f0101d98d661b34534769c3818f5af631e59c36ac6d07268fbfc89e539ce/tiktoken-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2efaf6199717b4485031b4d6edb94075e4d79177a172f38dd934d911b588d54a", size = 982413, upload-time = "2024-10-03T22:43:29.807Z" }, - { url = "https://files.pythonhosted.org/packages/ac/3c/2b95391d9bd520a73830469f80a96e3790e6c0a5ac2444f80f20b4b31051/tiktoken-0.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5637e425ce1fc49cf716d88df3092048359a4b3bbb7da762840426e937ada06d", size = 1144242, upload-time = "2024-10-04T04:42:53.66Z" }, - { url = "https://files.pythonhosted.org/packages/01/c4/c4a4360de845217b6aa9709c15773484b50479f36bb50419c443204e5de9/tiktoken-0.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb0e352d1dbe15aba082883058b3cce9e48d33101bdaac1eccf66424feb5b47", size = 1176588, upload-time = "2024-10-03T22:43:31.136Z" }, - { url = "https://files.pythonhosted.org/packages/f8/a3/ef984e976822cd6c2227c854f74d2e60cf4cd6fbfca46251199914746f78/tiktoken-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56edfefe896c8f10aba372ab5706b9e3558e78db39dd497c940b47bf228bc419", size = 1237261, upload-time = "2024-10-03T22:43:32.75Z" }, - { url = "https://files.pythonhosted.org/packages/1e/86/eea2309dc258fb86c7d9b10db536434fc16420feaa3b6113df18b23db7c2/tiktoken-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:326624128590def898775b722ccc327e90b073714227175ea8febbc920ac0a99", size = 884537, upload-time = "2024-10-03T22:43:34.592Z" }, + { url = "https://files.pythonhosted.org/packages/8b/4d/c6a2e7dca2b4f2e9e0bfd62b3fe4f114322e2c028cfba905a72bc76ce479/tiktoken-0.11.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:8a9b517d6331d7103f8bef29ef93b3cca95fa766e293147fe7bacddf310d5917", size = 1059937 }, + { url = "https://files.pythonhosted.org/packages/41/54/3739d35b9f94cb8dc7b0db2edca7192d5571606aa2369a664fa27e811804/tiktoken-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b4ddb1849e6bf0afa6cc1c5d809fb980ca240a5fffe585a04e119519758788c0", size = 999230 }, + { url = "https://files.pythonhosted.org/packages/dd/f4/ec8d43338d28d53513004ebf4cd83732a135d11011433c58bf045890cc10/tiktoken-0.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10331d08b5ecf7a780b4fe4d0281328b23ab22cdb4ff65e68d56caeda9940ecc", size = 1130076 }, + { url = "https://files.pythonhosted.org/packages/94/80/fb0ada0a882cb453caf519a4bf0d117c2a3ee2e852c88775abff5413c176/tiktoken-0.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b062c82300341dc87e0258c69f79bed725f87e753c21887aea90d272816be882", size = 1183942 }, + { url = "https://files.pythonhosted.org/packages/2f/e9/6c104355b463601719582823f3ea658bc3aa7c73d1b3b7553ebdc48468ce/tiktoken-0.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:195d84bec46169af3b1349a1495c151d37a0ff4cba73fd08282736be7f92cc6c", size = 1244705 }, + { url = "https://files.pythonhosted.org/packages/94/75/eaa6068f47e8b3f0aab9e05177cce2cf5aa2cc0ca93981792e620d4d4117/tiktoken-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:fe91581b0ecdd8783ce8cb6e3178f2260a3912e8724d2f2d49552b98714641a1", size = 884152 }, + { url = "https://files.pythonhosted.org/packages/8a/91/912b459799a025d2842566fe1e902f7f50d54a1ce8a0f236ab36b5bd5846/tiktoken-0.11.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ae374c46afadad0f501046db3da1b36cd4dfbfa52af23c998773682446097cf", size = 1059743 }, + { url = "https://files.pythonhosted.org/packages/8c/e9/6faa6870489ce64f5f75dcf91512bf35af5864583aee8fcb0dcb593121f5/tiktoken-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25a512ff25dc6c85b58f5dd4f3d8c674dc05f96b02d66cdacf628d26a4e4866b", size = 999334 }, + { url = "https://files.pythonhosted.org/packages/a1/3e/a05d1547cf7db9dc75d1461cfa7b556a3b48e0516ec29dfc81d984a145f6/tiktoken-0.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2130127471e293d385179c1f3f9cd445070c0772be73cdafb7cec9a3684c0458", size = 1129402 }, + { url = "https://files.pythonhosted.org/packages/34/9a/db7a86b829e05a01fd4daa492086f708e0a8b53952e1dbc9d380d2b03677/tiktoken-0.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21e43022bf2c33f733ea9b54f6a3f6b4354b909f5a73388fb1b9347ca54a069c", size = 1184046 }, + { url = "https://files.pythonhosted.org/packages/9d/bb/52edc8e078cf062ed749248f1454e9e5cfd09979baadb830b3940e522015/tiktoken-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:adb4e308eb64380dc70fa30493e21c93475eaa11669dea313b6bbf8210bfd013", size = 1244691 }, + { url = "https://files.pythonhosted.org/packages/60/d9/884b6cd7ae2570ecdcaffa02b528522b18fef1cbbfdbcaa73799807d0d3b/tiktoken-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:ece6b76bfeeb61a125c44bbefdfccc279b5288e6007fbedc0d32bfec602df2f2", size = 884392 }, ] [[package]] name = "toml" version = "0.10.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253, upload-time = "2020-11-01T01:40:22.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253 } wheels = [ - { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588, upload-time = "2020-11-01T01:40:20.672Z" }, + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 }, ] [[package]] name = "tomli" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, ] [[package]] name = "tornado" version = "6.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload-time = "2025-05-22T18:15:38.788Z" } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934 } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload-time = "2025-05-22T18:15:20.862Z" }, - { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload-time = "2025-05-22T18:15:22.591Z" }, - { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload-time = "2025-05-22T18:15:24.027Z" }, - { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload-time = "2025-05-22T18:15:25.735Z" }, - { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload-time = "2025-05-22T18:15:27.499Z" }, - { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload-time = "2025-05-22T18:15:29.299Z" }, - { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload-time = "2025-05-22T18:15:31.038Z" }, - { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload-time = "2025-05-22T18:15:32.426Z" }, - { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload-time = "2025-05-22T18:15:34.205Z" }, - { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload-time = "2025-05-22T18:15:36.1Z" }, - { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload-time = "2025-05-22T18:15:37.433Z" }, + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948 }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112 }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672 }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019 }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252 }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930 }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351 }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328 }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396 }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840 }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596 }, ] [[package]] @@ -2770,23 +2766,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, ] [[package]] name = "typer" -version = "0.15.4" +version = "0.17.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -2794,18 +2790,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/89/c527e6c848739be8ceb5c44eb8208c52ea3515c6cf6406aa61932887bf58/typer-0.15.4.tar.gz", hash = "sha256:89507b104f9b6a0730354f27c39fae5b63ccd0c95b1ce1f1a6ba0cfd329997c3", size = 101559, upload-time = "2025-05-14T16:34:57.704Z" } +sdist = { url = "https://files.pythonhosted.org/packages/92/e8/2a73ccf9874ec4c7638f172efc8972ceab13a0e3480b389d6ed822f7a822/typer-0.17.4.tar.gz", hash = "sha256:b77dc07d849312fd2bb5e7f20a7af8985c7ec360c45b051ed5412f64d8dc1580", size = 103734 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/62/d4ba7afe2096d5659ec3db8b15d8665bdcb92a3c6ff0b95e99895b335a9c/typer-0.15.4-py3-none-any.whl", hash = "sha256:eb0651654dcdea706780c466cf06d8f174405a659ffff8f163cfbfee98c0e173", size = 45258, upload-time = "2025-05-14T16:34:55.583Z" }, + { url = "https://files.pythonhosted.org/packages/93/72/6b3e70d32e89a5cbb6a4513726c1ae8762165b027af569289e19ec08edd8/typer-0.17.4-py3-none-any.whl", hash = "sha256:015534a6edaa450e7007eba705d5c18c3349dcea50a6ad79a5ed530967575824", size = 46643 }, ] [[package]] name = "typing-extensions" version = "4.14.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906 }, ] [[package]] @@ -2815,18 +2811,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, ] [[package]] @@ -2841,9 +2837,9 @@ dependencies = [ { name = "scipy" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5f/ee/6bc65bd375c812026a7af63fe9d09d409382120aff25f2152f1ba12af5ec/umap_learn-0.5.9.post2.tar.gz", hash = "sha256:bdf60462d779bd074ce177a0714ced17e6d161285590fa487f3f9548dd3c31c9", size = 95441, upload-time = "2025-07-03T00:18:02.479Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/ee/6bc65bd375c812026a7af63fe9d09d409382120aff25f2152f1ba12af5ec/umap_learn-0.5.9.post2.tar.gz", hash = "sha256:bdf60462d779bd074ce177a0714ced17e6d161285590fa487f3f9548dd3c31c9", size = 95441 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/b1/c24deeda9baf1fd491aaad941ed89e0fed6c583a117fd7b79e0a33a1e6c0/umap_learn-0.5.9.post2-py3-none-any.whl", hash = "sha256:fbe51166561e0e7fab00ef3d516ac2621243b8d15cf4bef9f656d701736b16a0", size = 90146, upload-time = "2025-07-03T00:18:01.042Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b1/c24deeda9baf1fd491aaad941ed89e0fed6c583a117fd7b79e0a33a1e6c0/umap_learn-0.5.9.post2-py3-none-any.whl", hash = "sha256:fbe51166561e0e7fab00ef3d516ac2621243b8d15cf4bef9f656d701736b16a0", size = 90146 }, ] [[package]] @@ -2876,7 +2872,7 @@ requires-dist = [ { name = "azure-identity", specifier = ">=1.16.0" }, { name = "azure-search-documents", specifier = ">=11.4.0" }, { name = "azure-storage-blob", specifier = ">=12.20.0" }, - { name = "graphrag", specifier = "==2.0.0" }, + { name = "graphrag", specifier = "==2.5.0" }, { name = "ipykernel", marker = "extra == 'dev'", specifier = ">=6.29.4" }, { name = "poethepoet", marker = "extra == 'dev'", specifier = ">=0.26.1" }, { name = "pyright", marker = "extra == 'dev'", specifier = ">=1.1.349" }, @@ -2892,9 +2888,9 @@ provides-extras = ["dev"] name = "urllib3" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, ] [[package]] @@ -2904,36 +2900,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/f9/054e6e2f1071e963b5e746b48d1e3727470b2a490834d18ad92364929db3/wasabi-1.1.3.tar.gz", hash = "sha256:4bb3008f003809db0c3e28b4daf20906ea871a2bb43f9914197d540f4f2e0878", size = 30391, upload-time = "2024-05-31T16:56:18.99Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/f9/054e6e2f1071e963b5e746b48d1e3727470b2a490834d18ad92364929db3/wasabi-1.1.3.tar.gz", hash = "sha256:4bb3008f003809db0c3e28b4daf20906ea871a2bb43f9914197d540f4f2e0878", size = 30391 } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/7c/34330a89da55610daa5f245ddce5aab81244321101614751e7537f125133/wasabi-1.1.3-py3-none-any.whl", hash = "sha256:f76e16e8f7e79f8c4c8be49b4024ac725713ab10cd7f19350ad18a8e3f71728c", size = 27880, upload-time = "2024-05-31T16:56:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/06/7c/34330a89da55610daa5f245ddce5aab81244321101614751e7537f125133/wasabi-1.1.3-py3-none-any.whl", hash = "sha256:f76e16e8f7e79f8c4c8be49b4024ac725713ab10cd7f19350ad18a8e3f71728c", size = 27880 }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, - { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, - { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, - { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, - { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, - { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, - { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, - { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, ] [[package]] name = "wcwidth" version = "0.2.13" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" }, + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, ] [[package]] @@ -2951,38 +2947,38 @@ dependencies = [ { name = "typer" }, { name = "wasabi" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a7/1a/9c522dd61b52939c217925d3e55c95f9348b73a66a956f52608e1e59a2c0/weasel-0.4.1.tar.gz", hash = "sha256:aabc210f072e13f6744e5c3a28037f93702433405cd35673f7c6279147085aa9", size = 38417, upload-time = "2024-05-15T08:52:54.765Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/1a/9c522dd61b52939c217925d3e55c95f9348b73a66a956f52608e1e59a2c0/weasel-0.4.1.tar.gz", hash = "sha256:aabc210f072e13f6744e5c3a28037f93702433405cd35673f7c6279147085aa9", size = 38417 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/87/abd57374044e1f627f0a905ac33c1a7daab35a3a815abfea4e1bafd3fdb1/weasel-0.4.1-py3-none-any.whl", hash = "sha256:24140a090ea1ac512a2b2f479cc64192fd1d527a7f3627671268d08ed5ac418c", size = 50270, upload-time = "2024-05-15T08:52:52.977Z" }, + { url = "https://files.pythonhosted.org/packages/2a/87/abd57374044e1f627f0a905ac33c1a7daab35a3a815abfea4e1bafd3fdb1/weasel-0.4.1-py3-none-any.whl", hash = "sha256:24140a090ea1ac512a2b2f479cc64192fd1d527a7f3627671268d08ed5ac418c", size = 50270 }, ] [[package]] name = "wrapt" version = "1.17.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531, upload-time = "2025-01-14T10:35:45.465Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/d1/1daec934997e8b160040c78d7b31789f19b122110a75eca3d4e8da0049e1/wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984", size = 53307, upload-time = "2025-01-14T10:33:13.616Z" }, - { url = "https://files.pythonhosted.org/packages/1b/7b/13369d42651b809389c1a7153baa01d9700430576c81a2f5c5e460df0ed9/wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22", size = 38486, upload-time = "2025-01-14T10:33:15.947Z" }, - { url = "https://files.pythonhosted.org/packages/62/bf/e0105016f907c30b4bd9e377867c48c34dc9c6c0c104556c9c9126bd89ed/wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7", size = 38777, upload-time = "2025-01-14T10:33:17.462Z" }, - { url = "https://files.pythonhosted.org/packages/27/70/0f6e0679845cbf8b165e027d43402a55494779295c4b08414097b258ac87/wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c", size = 83314, upload-time = "2025-01-14T10:33:21.282Z" }, - { url = "https://files.pythonhosted.org/packages/0f/77/0576d841bf84af8579124a93d216f55d6f74374e4445264cb378a6ed33eb/wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72", size = 74947, upload-time = "2025-01-14T10:33:24.414Z" }, - { url = "https://files.pythonhosted.org/packages/90/ec/00759565518f268ed707dcc40f7eeec38637d46b098a1f5143bff488fe97/wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061", size = 82778, upload-time = "2025-01-14T10:33:26.152Z" }, - { url = "https://files.pythonhosted.org/packages/f8/5a/7cffd26b1c607b0b0c8a9ca9d75757ad7620c9c0a9b4a25d3f8a1480fafc/wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2", size = 81716, upload-time = "2025-01-14T10:33:27.372Z" }, - { url = "https://files.pythonhosted.org/packages/7e/09/dccf68fa98e862df7e6a60a61d43d644b7d095a5fc36dbb591bbd4a1c7b2/wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c", size = 74548, upload-time = "2025-01-14T10:33:28.52Z" }, - { url = "https://files.pythonhosted.org/packages/b7/8e/067021fa3c8814952c5e228d916963c1115b983e21393289de15128e867e/wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62", size = 81334, upload-time = "2025-01-14T10:33:29.643Z" }, - { url = "https://files.pythonhosted.org/packages/4b/0d/9d4b5219ae4393f718699ca1c05f5ebc0c40d076f7e65fd48f5f693294fb/wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563", size = 36427, upload-time = "2025-01-14T10:33:30.832Z" }, - { url = "https://files.pythonhosted.org/packages/72/6a/c5a83e8f61aec1e1aeef939807602fb880e5872371e95df2137142f5c58e/wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f", size = 38774, upload-time = "2025-01-14T10:33:32.897Z" }, - { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308, upload-time = "2025-01-14T10:33:33.992Z" }, - { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488, upload-time = "2025-01-14T10:33:35.264Z" }, - { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776, upload-time = "2025-01-14T10:33:38.28Z" }, - { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776, upload-time = "2025-01-14T10:33:40.678Z" }, - { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420, upload-time = "2025-01-14T10:33:41.868Z" }, - { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199, upload-time = "2025-01-14T10:33:43.598Z" }, - { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307, upload-time = "2025-01-14T10:33:48.499Z" }, - { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025, upload-time = "2025-01-14T10:33:51.191Z" }, - { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879, upload-time = "2025-01-14T10:33:52.328Z" }, - { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419, upload-time = "2025-01-14T10:33:53.551Z" }, - { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773, upload-time = "2025-01-14T10:33:56.323Z" }, - { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594, upload-time = "2025-01-14T10:35:44.018Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/d1/1daec934997e8b160040c78d7b31789f19b122110a75eca3d4e8da0049e1/wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984", size = 53307 }, + { url = "https://files.pythonhosted.org/packages/1b/7b/13369d42651b809389c1a7153baa01d9700430576c81a2f5c5e460df0ed9/wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22", size = 38486 }, + { url = "https://files.pythonhosted.org/packages/62/bf/e0105016f907c30b4bd9e377867c48c34dc9c6c0c104556c9c9126bd89ed/wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7", size = 38777 }, + { url = "https://files.pythonhosted.org/packages/27/70/0f6e0679845cbf8b165e027d43402a55494779295c4b08414097b258ac87/wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c", size = 83314 }, + { url = "https://files.pythonhosted.org/packages/0f/77/0576d841bf84af8579124a93d216f55d6f74374e4445264cb378a6ed33eb/wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72", size = 74947 }, + { url = "https://files.pythonhosted.org/packages/90/ec/00759565518f268ed707dcc40f7eeec38637d46b098a1f5143bff488fe97/wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061", size = 82778 }, + { url = "https://files.pythonhosted.org/packages/f8/5a/7cffd26b1c607b0b0c8a9ca9d75757ad7620c9c0a9b4a25d3f8a1480fafc/wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2", size = 81716 }, + { url = "https://files.pythonhosted.org/packages/7e/09/dccf68fa98e862df7e6a60a61d43d644b7d095a5fc36dbb591bbd4a1c7b2/wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c", size = 74548 }, + { url = "https://files.pythonhosted.org/packages/b7/8e/067021fa3c8814952c5e228d916963c1115b983e21393289de15128e867e/wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62", size = 81334 }, + { url = "https://files.pythonhosted.org/packages/4b/0d/9d4b5219ae4393f718699ca1c05f5ebc0c40d076f7e65fd48f5f693294fb/wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563", size = 36427 }, + { url = "https://files.pythonhosted.org/packages/72/6a/c5a83e8f61aec1e1aeef939807602fb880e5872371e95df2137142f5c58e/wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f", size = 38774 }, + { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308 }, + { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488 }, + { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776 }, + { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776 }, + { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420 }, + { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199 }, + { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307 }, + { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025 }, + { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879 }, + { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419 }, + { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773 }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, ] diff --git a/uv.lock b/uv.lock index 50e44c560c..b6e1a82c33 100644 --- a/uv.lock +++ b/uv.lock @@ -1,19 +1,35 @@ version = 1 revision = 3 -requires-python = ">=3.10, <3.13" +requires-python = ">=3.11, <3.13" resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version < '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform == 'emscripten'", + "python_full_version < '3.12' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version < '3.12' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] + +[manifest] +members = [ + "graphrag", + "graphrag-cache", + "graphrag-chunking", + "graphrag-common", + "graphrag-input", + "graphrag-llm", + "graphrag-monorepo", + "graphrag-storage", + "graphrag-vectors", ] [[package]] name = "aiofiles" -version = "25.1.0" +version = "24.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247, upload-time = "2024-06-24T11:02:03.584Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, + { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896, upload-time = "2024-06-24T11:02:01.529Z" }, ] [[package]] @@ -32,7 +48,6 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, @@ -41,23 +56,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/36/d6/5aec9313ee6ea9c7cde8b891b69f4ff4001416867104580670a31daeba5b/aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7", size = 738950, upload-time = "2026-01-03T17:29:13.002Z" }, - { url = "https://files.pythonhosted.org/packages/68/03/8fa90a7e6d11ff20a18837a8e2b5dd23db01aabc475aa9271c8ad33299f5/aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821", size = 496099, upload-time = "2026-01-03T17:29:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/d2/23/b81f744d402510a8366b74eb420fc0cc1170d0c43daca12d10814df85f10/aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845", size = 491072, upload-time = "2026-01-03T17:29:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e1/56d1d1c0dd334cd203dd97706ce004c1aa24b34a813b0b8daf3383039706/aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af", size = 1671588, upload-time = "2026-01-03T17:29:18.539Z" }, - { url = "https://files.pythonhosted.org/packages/5f/34/8d7f962604f4bc2b4e39eb1220dac7d4e4cba91fb9ba0474b4ecd67db165/aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940", size = 1640334, upload-time = "2026-01-03T17:29:21.028Z" }, - { url = "https://files.pythonhosted.org/packages/94/1d/fcccf2c668d87337ddeef9881537baee13c58d8f01f12ba8a24215f2b804/aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160", size = 1722656, upload-time = "2026-01-03T17:29:22.531Z" }, - { url = "https://files.pythonhosted.org/packages/aa/98/c6f3b081c4c606bc1e5f2ec102e87d6411c73a9ef3616fea6f2d5c98c062/aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7", size = 1817625, upload-time = "2026-01-03T17:29:24.276Z" }, - { url = "https://files.pythonhosted.org/packages/2c/c0/cfcc3d2e11b477f86e1af2863f3858c8850d751ce8dc39c4058a072c9e54/aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455", size = 1672604, upload-time = "2026-01-03T17:29:26.099Z" }, - { url = "https://files.pythonhosted.org/packages/1e/77/6b4ffcbcac4c6a5d041343a756f34a6dd26174ae07f977a64fe028dda5b0/aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279", size = 1554370, upload-time = "2026-01-03T17:29:28.121Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f0/e3ddfa93f17d689dbe014ba048f18e0c9f9b456033b70e94349a2e9048be/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e", size = 1642023, upload-time = "2026-01-03T17:29:30.002Z" }, - { url = "https://files.pythonhosted.org/packages/eb/45/c14019c9ec60a8e243d06d601b33dcc4fd92379424bde3021725859d7f99/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d", size = 1649680, upload-time = "2026-01-03T17:29:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fd/09c9451dae5aa5c5ed756df95ff9ef549d45d4be663bafd1e4954fd836f0/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808", size = 1692407, upload-time = "2026-01-03T17:29:33.392Z" }, - { url = "https://files.pythonhosted.org/packages/a6/81/938bc2ec33c10efd6637ccb3d22f9f3160d08e8f3aa2587a2c2d5ab578eb/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40", size = 1543047, upload-time = "2026-01-03T17:29:34.855Z" }, - { url = "https://files.pythonhosted.org/packages/f7/23/80488ee21c8d567c83045e412e1d9b7077d27171591a4eb7822586e8c06a/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29", size = 1715264, upload-time = "2026-01-03T17:29:36.389Z" }, - { url = "https://files.pythonhosted.org/packages/e2/83/259a8da6683182768200b368120ab3deff5370bed93880fb9a3a86299f34/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11", size = 1657275, upload-time = "2026-01-03T17:29:38.162Z" }, - { url = "https://files.pythonhosted.org/packages/3f/4f/2c41f800a0b560785c10fb316216ac058c105f9be50bdc6a285de88db625/aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd", size = 434053, upload-time = "2026-01-03T17:29:40.074Z" }, - { url = "https://files.pythonhosted.org/packages/80/df/29cd63c7ecfdb65ccc12f7d808cac4fa2a19544660c06c61a4a48462de0c/aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c", size = 456687, upload-time = "2026-01-03T17:29:41.819Z" }, { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, @@ -94,15 +92,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, ] -[[package]] -name = "aiolimiter" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/23/b52debf471f7a1e42e362d959a3982bdcb4fe13a5d46e63d28868807a79c/aiolimiter-1.2.1.tar.gz", hash = "sha256:e02a37ea1a855d9e832252a105420ad4d15011505512a1a1d814647451b5cca9", size = 7185, upload-time = "2024-12-08T15:31:51.496Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/ba/df6e8e1045aebc4778d19b8a3a9bc1808adb1619ba94ca354d9ba17d86c3/aiolimiter-1.2.1-py3-none-any.whl", hash = "sha256:d3f249e9059a20badcb56b61601a83556133655c11d1eb3dd3e04ff069e5f3c7", size = 6711, upload-time = "2024-12-08T15:31:49.874Z" }, -] - [[package]] name = "aiosignal" version = "1.4.0" @@ -130,7 +119,6 @@ name = "anyio" version = "4.12.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions" }, ] @@ -139,15 +127,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] -[[package]] -name = "anytree" -version = "2.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/a8/eb55fab589c56f9b6be2b3fd6997aa04bb6f3da93b01154ce6fc8e799db2/anytree-2.13.0.tar.gz", hash = "sha256:c9d3aa6825fdd06af7ebb05b4ef291d2db63e62bb1f9b7d9b71354be9d362714", size = 48389, upload-time = "2025-04-08T21:06:30.662Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/98/f6aa7fe0783e42be3093d8ef1b0ecdc22c34c0d69640dfb37f56925cb141/anytree-2.13.0-py3-none-any.whl", hash = "sha256:4cbcf10df36b1f1cba131b7e487ff3edafc9d6e932a3c70071b5b768bab901ff", size = 45077, upload-time = "2025-04-08T21:06:29.494Z" }, -] - [[package]] name = "appnope" version = "0.1.4" @@ -188,11 +167,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2", size = 27180, upload-time = "2025-07-30T10:01:57.759Z" }, { url = "https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98", size = 31715, upload-time = "2025-07-30T10:01:58.56Z" }, { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, - { url = "https://files.pythonhosted.org/packages/11/2d/ba4e4ca8d149f8dcc0d952ac0967089e1d759c7e5fcf0865a317eb680fbb/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6dca33a9859abf613e22733131fc9194091c1fa7cb3e131c143056b4856aa47e", size = 24549, upload-time = "2025-07-30T10:02:00.101Z" }, - { url = "https://files.pythonhosted.org/packages/5c/82/9b2386cc75ac0bd3210e12a44bfc7fd1632065ed8b80d573036eecb10442/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:21378b40e1b8d1655dd5310c84a40fc19a9aa5e6366e835ceb8576bf0fea716d", size = 25539, upload-time = "2025-07-30T10:02:00.929Z" }, - { url = "https://files.pythonhosted.org/packages/31/db/740de99a37aa727623730c90d92c22c9e12585b3c98c54b7960f7810289f/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d588dec224e2a83edbdc785a5e6f3c6cd736f46bfd4b441bbb5aa1f5085e584", size = 28467, upload-time = "2025-07-30T10:02:02.08Z" }, - { url = "https://files.pythonhosted.org/packages/71/7a/47c4509ea18d755f44e2b92b7178914f0c113946d11e16e626df8eaa2b0b/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5acb4e41090d53f17ca1110c3427f0a130f944b896fc8c83973219c97f57b690", size = 27355, upload-time = "2025-07-30T10:02:02.867Z" }, - { url = "https://files.pythonhosted.org/packages/ee/82/82745642d3c46e7cea25e1885b014b033f4693346ce46b7f47483cf5d448/argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:da0c79c23a63723aa5d782250fbf51b768abca630285262fb5144ba5ae01e520", size = 29187, upload-time = "2025-07-30T10:02:03.674Z" }, ] [[package]] @@ -224,23 +198,11 @@ wheels = [ name = "async-lru" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/ef/c3/bbf34f15ea88dfb649ab2c40f9d75081784a50573a9ea431563cab64adb8/async_lru-2.1.0.tar.gz", hash = "sha256:9eeb2fecd3fe42cc8a787fc32ead53a3a7158cc43d039c3c55ab3e4e5b2a80ed", size = 12041, upload-time = "2026-01-17T22:52:18.931Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2e/e9/eb6a5db5ac505d5d45715388e92bced7a5bb556facc4d0865d192823f2d2/async_lru-2.1.0-py3-none-any.whl", hash = "sha256:fa12dcf99a42ac1280bc16c634bbaf06883809790f6304d85cdab3f666f33a7e", size = 6933, upload-time = "2026-01-17T22:52:17.389Z" }, ] -[[package]] -name = "async-timeout" -version = "5.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, -] - [[package]] name = "attrs" version = "25.4.0" @@ -250,18 +212,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] -[[package]] -name = "autograd" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/67/1c/3c24ec03c8ba4decc742b1df5a10c52f98c84ca8797757f313e7bdcdf276/autograd-1.8.0.tar.gz", hash = "sha256:107374ded5b09fc8643ac925348c0369e7b0e73bbed9565ffd61b8fd04425683", size = 2562146, upload-time = "2025-05-05T12:49:02.502Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/ea/e16f0c423f7d83cf8b79cae9452040fb7b2e020c7439a167ee7c317de448/autograd-1.8.0-py3-none-any.whl", hash = "sha256:4ab9084294f814cf56c280adbe19612546a35574d67c574b04933c7d2ecb7d78", size = 51478, upload-time = "2025-05-05T12:49:00.585Z" }, -] - [[package]] name = "azure-common" version = "1.1.28" @@ -299,7 +249,7 @@ wheels = [ [[package]] name = "azure-identity" -version = "1.25.1" +version = "1.19.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "azure-core" }, @@ -308,9 +258,9 @@ dependencies = [ { name = "msal-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/8d/1a6c41c28a37eab26dc85ab6c86992c700cd3f4a597d9ed174b0e9c69489/azure_identity-1.25.1.tar.gz", hash = "sha256:87ca8328883de6036443e1c37b40e8dc8fb74898240f61071e09d2e369361456", size = 279826, upload-time = "2025-10-06T20:30:02.194Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/91/cbaeff9eb0b838f0d35b4607ac1c6195c735c8eb17db235f8f60e622934c/azure_identity-1.19.0.tar.gz", hash = "sha256:500144dc18197d7019b81501165d4fa92225f03778f17d7ca8a2a180129a9c83", size = 263058, upload-time = "2024-10-08T15:41:33.554Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/7b/5652771e24fff12da9dde4c20ecf4682e606b104f26419d139758cc935a6/azure_identity-1.25.1-py3-none-any.whl", hash = "sha256:e9edd720af03dff020223cd269fa3a61e8f345ea75443858273bcb44844ab651", size = 191317, upload-time = "2025-10-06T20:30:04.251Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d5/3995ed12f941f4a41a273d9b1709282e825ef87ed8eab3833038fee54d59/azure_identity-1.19.0-py3-none-any.whl", hash = "sha256:e3f6558c181692d7509f09de10cca527c7dce426776454fb97df512a46527e81", size = 187587, upload-time = "2024-10-08T15:41:36.423Z" }, ] [[package]] @@ -352,49 +302,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] -[[package]] -name = "backports-asyncio-runner" -version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload-time = "2025-07-02T02:27:15.685Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" }, -] - -[[package]] -name = "backports-datetime-fromisoformat" -version = "2.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/71/81/eff3184acb1d9dc3ce95a98b6f3c81a49b4be296e664db8e1c2eeabef3d9/backports_datetime_fromisoformat-2.0.3.tar.gz", hash = "sha256:b58edc8f517b66b397abc250ecc737969486703a66eb97e01e6d51291b1a139d", size = 23588, upload-time = "2024-12-28T20:18:15.017Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/4b/d6b051ca4b3d76f23c2c436a9669f3be616b8cf6461a7e8061c7c4269642/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f681f638f10588fa3c101ee9ae2b63d3734713202ddfcfb6ec6cea0778a29d4", size = 27561, upload-time = "2024-12-28T20:16:47.974Z" }, - { url = "https://files.pythonhosted.org/packages/6d/40/e39b0d471e55eb1b5c7c81edab605c02f71c786d59fb875f0a6f23318747/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:cd681460e9142f1249408e5aee6d178c6d89b49e06d44913c8fdfb6defda8d1c", size = 34448, upload-time = "2024-12-28T20:16:50.712Z" }, - { url = "https://files.pythonhosted.org/packages/f2/28/7a5c87c5561d14f1c9af979231fdf85d8f9fad7a95ff94e56d2205e2520a/backports_datetime_fromisoformat-2.0.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:ee68bc8735ae5058695b76d3bb2aee1d137c052a11c8303f1e966aa23b72b65b", size = 27093, upload-time = "2024-12-28T20:16:52.994Z" }, - { url = "https://files.pythonhosted.org/packages/80/ba/f00296c5c4536967c7d1136107fdb91c48404fe769a4a6fd5ab045629af8/backports_datetime_fromisoformat-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8273fe7932db65d952a43e238318966eab9e49e8dd546550a41df12175cc2be4", size = 52836, upload-time = "2024-12-28T20:16:55.283Z" }, - { url = "https://files.pythonhosted.org/packages/e3/92/bb1da57a069ddd601aee352a87262c7ae93467e66721d5762f59df5021a6/backports_datetime_fromisoformat-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39d57ea50aa5a524bb239688adc1d1d824c31b6094ebd39aa164d6cadb85de22", size = 52798, upload-time = "2024-12-28T20:16:56.64Z" }, - { url = "https://files.pythonhosted.org/packages/df/ef/b6cfd355982e817ccdb8d8d109f720cab6e06f900784b034b30efa8fa832/backports_datetime_fromisoformat-2.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ac6272f87693e78209dc72e84cf9ab58052027733cd0721c55356d3c881791cf", size = 52891, upload-time = "2024-12-28T20:16:58.887Z" }, - { url = "https://files.pythonhosted.org/packages/37/39/b13e3ae8a7c5d88b68a6e9248ffe7066534b0cfe504bf521963e61b6282d/backports_datetime_fromisoformat-2.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:44c497a71f80cd2bcfc26faae8857cf8e79388e3d5fbf79d2354b8c360547d58", size = 52955, upload-time = "2024-12-28T20:17:00.028Z" }, - { url = "https://files.pythonhosted.org/packages/1e/e4/70cffa3ce1eb4f2ff0c0d6f5d56285aacead6bd3879b27a2ba57ab261172/backports_datetime_fromisoformat-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:6335a4c9e8af329cb1ded5ab41a666e1448116161905a94e054f205aa6d263bc", size = 29323, upload-time = "2024-12-28T20:17:01.125Z" }, - { url = "https://files.pythonhosted.org/packages/62/f5/5bc92030deadf34c365d908d4533709341fb05d0082db318774fdf1b2bcb/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2e4b66e017253cdbe5a1de49e0eecff3f66cd72bcb1229d7db6e6b1832c0443", size = 27626, upload-time = "2024-12-28T20:17:03.448Z" }, - { url = "https://files.pythonhosted.org/packages/28/45/5885737d51f81dfcd0911dd5c16b510b249d4c4cf6f4a991176e0358a42a/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:43e2d648e150777e13bbc2549cc960373e37bf65bd8a5d2e0cef40e16e5d8dd0", size = 34588, upload-time = "2024-12-28T20:17:04.459Z" }, - { url = "https://files.pythonhosted.org/packages/bc/6d/bd74de70953f5dd3e768c8fc774af942af0ce9f211e7c38dd478fa7ea910/backports_datetime_fromisoformat-2.0.3-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:4ce6326fd86d5bae37813c7bf1543bae9e4c215ec6f5afe4c518be2635e2e005", size = 27162, upload-time = "2024-12-28T20:17:06.752Z" }, - { url = "https://files.pythonhosted.org/packages/47/ba/1d14b097f13cce45b2b35db9898957578b7fcc984e79af3b35189e0d332f/backports_datetime_fromisoformat-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7c8fac333bf860208fd522a5394369ee3c790d0aa4311f515fcc4b6c5ef8d75", size = 54482, upload-time = "2024-12-28T20:17:08.15Z" }, - { url = "https://files.pythonhosted.org/packages/25/e9/a2a7927d053b6fa148b64b5e13ca741ca254c13edca99d8251e9a8a09cfe/backports_datetime_fromisoformat-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4da5ab3aa0cc293dc0662a0c6d1da1a011dc1edcbc3122a288cfed13a0b45", size = 54362, upload-time = "2024-12-28T20:17:10.605Z" }, - { url = "https://files.pythonhosted.org/packages/c1/99/394fb5e80131a7d58c49b89e78a61733a9994885804a0bb582416dd10c6f/backports_datetime_fromisoformat-2.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58ea11e3bf912bd0a36b0519eae2c5b560b3cb972ea756e66b73fb9be460af01", size = 54162, upload-time = "2024-12-28T20:17:12.301Z" }, - { url = "https://files.pythonhosted.org/packages/88/25/1940369de573c752889646d70b3fe8645e77b9e17984e72a554b9b51ffc4/backports_datetime_fromisoformat-2.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8a375c7dbee4734318714a799b6c697223e4bbb57232af37fbfff88fb48a14c6", size = 54118, upload-time = "2024-12-28T20:17:13.609Z" }, - { url = "https://files.pythonhosted.org/packages/b7/46/f275bf6c61683414acaf42b2df7286d68cfef03e98b45c168323d7707778/backports_datetime_fromisoformat-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:ac677b1664c4585c2e014739f6678137c8336815406052349c85898206ec7061", size = 29329, upload-time = "2024-12-28T20:17:16.124Z" }, - { url = "https://files.pythonhosted.org/packages/a2/0f/69bbdde2e1e57c09b5f01788804c50e68b29890aada999f2b1a40519def9/backports_datetime_fromisoformat-2.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66ce47ee1ba91e146149cf40565c3d750ea1be94faf660ca733d8601e0848147", size = 27630, upload-time = "2024-12-28T20:17:19.442Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1d/1c84a50c673c87518b1adfeafcfd149991ed1f7aedc45d6e5eac2f7d19d7/backports_datetime_fromisoformat-2.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:8b7e069910a66b3bba61df35b5f879e5253ff0821a70375b9daf06444d046fa4", size = 34707, upload-time = "2024-12-28T20:17:21.79Z" }, - { url = "https://files.pythonhosted.org/packages/71/44/27eae384e7e045cda83f70b551d04b4a0b294f9822d32dea1cbf1592de59/backports_datetime_fromisoformat-2.0.3-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:a3b5d1d04a9e0f7b15aa1e647c750631a873b298cdd1255687bb68779fe8eb35", size = 27280, upload-time = "2024-12-28T20:17:24.503Z" }, - { url = "https://files.pythonhosted.org/packages/a7/7a/a4075187eb6bbb1ff6beb7229db5f66d1070e6968abeb61e056fa51afa5e/backports_datetime_fromisoformat-2.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec1b95986430e789c076610aea704db20874f0781b8624f648ca9fb6ef67c6e1", size = 55094, upload-time = "2024-12-28T20:17:25.546Z" }, - { url = "https://files.pythonhosted.org/packages/71/03/3fced4230c10af14aacadc195fe58e2ced91d011217b450c2e16a09a98c8/backports_datetime_fromisoformat-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffe5f793db59e2f1d45ec35a1cf51404fdd69df9f6952a0c87c3060af4c00e32", size = 55605, upload-time = "2024-12-28T20:17:29.208Z" }, - { url = "https://files.pythonhosted.org/packages/f6/0a/4b34a838c57bd16d3e5861ab963845e73a1041034651f7459e9935289cfd/backports_datetime_fromisoformat-2.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:620e8e73bd2595dfff1b4d256a12b67fce90ece3de87b38e1dde46b910f46f4d", size = 55353, upload-time = "2024-12-28T20:17:32.433Z" }, - { url = "https://files.pythonhosted.org/packages/d9/68/07d13c6e98e1cad85606a876367ede2de46af859833a1da12c413c201d78/backports_datetime_fromisoformat-2.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4cf9c0a985d68476c1cabd6385c691201dda2337d7453fb4da9679ce9f23f4e7", size = 55298, upload-time = "2024-12-28T20:17:34.919Z" }, - { url = "https://files.pythonhosted.org/packages/60/33/45b4d5311f42360f9b900dea53ab2bb20a3d61d7f9b7c37ddfcb3962f86f/backports_datetime_fromisoformat-2.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:d144868a73002e6e2e6fef72333e7b0129cecdd121aa8f1edba7107fd067255d", size = 29375, upload-time = "2024-12-28T20:17:36.018Z" }, - { url = "https://files.pythonhosted.org/packages/be/03/7eaa9f9bf290395d57fd30d7f1f2f9dff60c06a31c237dc2beb477e8f899/backports_datetime_fromisoformat-2.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90e202e72a3d5aae673fcc8c9a4267d56b2f532beeb9173361293625fe4d2039", size = 28980, upload-time = "2024-12-28T20:18:06.554Z" }, - { url = "https://files.pythonhosted.org/packages/47/80/a0ecf33446c7349e79f54cc532933780341d20cff0ee12b5bfdcaa47067e/backports_datetime_fromisoformat-2.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2df98ef1b76f5a58bb493dda552259ba60c3a37557d848e039524203951c9f06", size = 28449, upload-time = "2024-12-28T20:18:07.77Z" }, -] - [[package]] name = "backrefs" version = "6.1" @@ -407,15 +314,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/e3/a4fa1946722c4c7b063cc25043a12d9ce9b4323777f89643be74cef2993c/backrefs-6.1-py39-none-any.whl", hash = "sha256:a9e99b8a4867852cad177a6430e31b0f6e495d65f8c6c134b68c14c3c95bf4b0", size = 381058, upload-time = "2025-11-15T14:52:06.698Z" }, ] -[[package]] -name = "beartype" -version = "0.18.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/15/4e623478a9628ad4cee2391f19aba0b16c1dd6fedcb2a399f0928097b597/beartype-0.18.5.tar.gz", hash = "sha256:264ddc2f1da9ec94ff639141fbe33d22e12a9f75aa863b83b7046ffff1381927", size = 1193506, upload-time = "2024-04-21T07:25:58.64Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/43/7a1259741bd989723272ac7d381a43be932422abcff09a1d9f7ba212cb74/beartype-0.18.5-py3-none-any.whl", hash = "sha256:5301a14f2a9a5540fe47ec6d34d758e9cd8331d36c4760fc7a5499ab86310089", size = 917762, upload-time = "2024-04-21T07:25:55.758Z" }, -] - [[package]] name = "beautifulsoup4" version = "4.14.3" @@ -455,13 +353,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/d0/d0/d8cc8c9a4488a787e7fa430f6055e5bd1ddb22c340a751d9e901b82e2efe/blis-1.3.3.tar.gz", hash = "sha256:034d4560ff3cc43e8aa37e188451b0440e3261d989bb8a42ceee865607715ecd", size = 2644873, upload-time = "2025-11-17T12:28:30.511Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/db/d80daf6c060618c72acecf026410b806f620cdea62b2e72f3235d7389d05/blis-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:650f1d2b28e3c875927c63deebda463a6f9d237dff30e445bfe2127718c1a344", size = 6925724, upload-time = "2025-11-17T12:27:14.23Z" }, - { url = "https://files.pythonhosted.org/packages/06/cd/7ac854c92e33cfccc0eded48e979a9fc26a447952d07a9c7c7da7c1d6eec/blis-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b0d42420ddd543eec51ccb99d38364a0c0833b6895eced37127822de6ecacff", size = 1233606, upload-time = "2025-11-17T12:27:16.107Z" }, - { url = "https://files.pythonhosted.org/packages/c7/ae/ad3165fdbc4ef6afef585686a778c72cd67fb5aa16ab2fd2f4494186705e/blis-1.3.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f0628a030d44aa71cac5973e40c9e95ec767abaaf2fd366a094b9398885f82f2", size = 2769094, upload-time = "2025-11-17T12:27:17.883Z" }, - { url = "https://files.pythonhosted.org/packages/25/d4/7b0820f139b4ea67606d01b59ba6afbee4552ce7b2fd179f2fb7908e294f/blis-1.3.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0114cf2d8f19e0ed210f9ae92594cd0a12efa1bbbce444028b0fc365bbbb8af", size = 11300520, upload-time = "2025-11-17T12:27:20.058Z" }, - { url = "https://files.pythonhosted.org/packages/85/f3/865a4322bdbeb944744c1908e67fdabecd476613a17204956cff12d568c9/blis-1.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7e88181e9dd8430029ebaf22d41bf79e756e8c95363e9471717102c66beb4a6d", size = 2962083, upload-time = "2025-11-17T12:27:22.098Z" }, - { url = "https://files.pythonhosted.org/packages/65/a2/c2842fa1e2e6bd56eb93e41b34859a9af8b5b63669ee0442bea585d8f607/blis-1.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62fb8c731347b0f98f5f81d19d339049e61489798738467d156c66cc329b0754", size = 14177001, upload-time = "2025-11-17T12:27:24.345Z" }, - { url = "https://files.pythonhosted.org/packages/b5/9b/3b1532f23db8bdddf3a976e9acf51e8debd94c63be5dafb8ccbab3e62935/blis-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:631836d4f335e62c30aa50a1aa0170773265c73654d296361f95180006e88c04", size = 6184429, upload-time = "2025-11-17T12:27:27.054Z" }, { url = "https://files.pythonhosted.org/packages/a1/0a/a4c8736bc497d386b0ffc76d321f478c03f1a4725e52092f93b38beb3786/blis-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e10c8d3e892b1dbdff365b9d00e08291876fc336915bf1a5e9f188ed087e1a91", size = 6925522, upload-time = "2025-11-17T12:27:29.199Z" }, { url = "https://files.pythonhosted.org/packages/83/5a/3437009282f23684ecd3963a8b034f9307cdd2bf4484972e5a6b096bf9ac/blis-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66e6249564f1db22e8af1e0513ff64134041fa7e03c8dd73df74db3f4d8415a7", size = 1232787, upload-time = "2025-11-17T12:27:30.996Z" }, { url = "https://files.pythonhosted.org/packages/d1/0e/82221910d16259ce3017c1442c468a3f206a4143a96fbba9f5b5b81d62e8/blis-1.3.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7260da065958b4e5475f62f44895ef9d673b0f47dcf61b672b22b7dae1a18505", size = 2844596, upload-time = "2025-11-17T12:27:32.601Z" }, @@ -505,18 +396,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, - { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, - { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, - { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, @@ -550,22 +429,6 @@ version = "3.4.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, - { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, - { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, - { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, - { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, - { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, - { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, - { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, - { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, - { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, - { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, - { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, @@ -617,9 +480,6 @@ wheels = [ name = "cloudpathlib" version = "0.23.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/f4/18/2ac35d6b3015a0c74e923d94fc69baf8307f7c3233de015d69f99e17afa8/cloudpathlib-0.23.0.tar.gz", hash = "sha256:eb38a34c6b8a048ecfd2b2f60917f7cbad4a105b7c979196450c2f541f4d6b4b", size = 53126, upload-time = "2025-10-07T22:47:56.278Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ae/8a/c4bb04426d608be4a3171efa2e233d2c59a5c8937850c10d098e126df18e/cloudpathlib-0.23.0-py3-none-any.whl", hash = "sha256:8520b3b01468fee77de37ab5d50b1b524ea6b4a8731c35d1b7407ac0cd716002", size = 62755, upload-time = "2025-10-07T22:47:54.905Z" }, @@ -634,6 +494,18 @@ 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 = "coloredlogs" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "humanfriendly" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/c7/eed8f27100517e8c0e6b923d5f0845d0cb99763da6fdee00478f91db7325/coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0", size = 278520, upload-time = "2021-06-11T10:22:45.202Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/06/3d6badcf13db419e25b07041d9c7b4a2c331d3f4e7134445ec5df57714cd/coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", size = 46018, upload-time = "2021-06-11T10:22:42.561Z" }, +] + [[package]] name = "comm" version = "0.2.3" @@ -656,143 +528,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/00/3106b1854b45bd0474ced037dfe6b73b90fe68a68968cef47c23de3d43d2/confection-0.1.5-py3-none-any.whl", hash = "sha256:e29d3c3f8eac06b3f77eb9dfb4bf2fc6bcc9622a98ca00a698e3d019c6430b14", size = 35451, upload-time = "2024-05-31T16:16:59.075Z" }, ] -[[package]] -name = "contourpy" -version = "1.3.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "numpy", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, - { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, - { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, - { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, - { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, - { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, - { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, - { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, - { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, - { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, - { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, - { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, - { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, - { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, - { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, - { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, - { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, - { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, - { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, - { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, - { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, - { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, - { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, - { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, - { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, - { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, - { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, - { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, - { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, - { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, -] - -[[package]] -name = "contourpy" -version = "1.3.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", -] -dependencies = [ - { name = "numpy", marker = "python_full_version >= '3.11'" }, -] -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/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 = "coverage" -version = "7.13.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/f9/e92df5e07f3fc8d4c7f9a0f146ef75446bf870351cd37b788cf5897f8079/coverage-7.13.1.tar.gz", hash = "sha256:b7593fe7eb5feaa3fbb461ac79aac9f9fc0387a5ca8080b0c6fe2ca27b091afd", size = 825862, upload-time = "2025-12-28T15:42:56.969Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/9a/3742e58fd04b233df95c012ee9f3dfe04708a5e1d32613bd2d47d4e1be0d/coverage-7.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e1fa280b3ad78eea5be86f94f461c04943d942697e0dac889fa18fff8f5f9147", size = 218633, upload-time = "2025-12-28T15:40:10.165Z" }, - { url = "https://files.pythonhosted.org/packages/7e/45/7e6bdc94d89cd7c8017ce735cf50478ddfe765d4fbf0c24d71d30ea33d7a/coverage-7.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c3d8c679607220979434f494b139dfb00131ebf70bb406553d69c1ff01a5c33d", size = 219147, upload-time = "2025-12-28T15:40:12.069Z" }, - { url = "https://files.pythonhosted.org/packages/f7/38/0d6a258625fd7f10773fe94097dc16937a5f0e3e0cdf3adef67d3ac6baef/coverage-7.13.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:339dc63b3eba969067b00f41f15ad161bf2946613156fb131266d8debc8e44d0", size = 245894, upload-time = "2025-12-28T15:40:13.556Z" }, - { url = "https://files.pythonhosted.org/packages/27/58/409d15ea487986994cbd4d06376e9860e9b157cfbfd402b1236770ab8dd2/coverage-7.13.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db622b999ffe49cb891f2fff3b340cdc2f9797d01a0a202a0973ba2562501d90", size = 247721, upload-time = "2025-12-28T15:40:15.37Z" }, - { url = "https://files.pythonhosted.org/packages/da/bf/6e8056a83fd7a96c93341f1ffe10df636dd89f26d5e7b9ca511ce3bcf0df/coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d", size = 249585, upload-time = "2025-12-28T15:40:17.226Z" }, - { url = "https://files.pythonhosted.org/packages/f4/15/e1daff723f9f5959acb63cbe35b11203a9df77ee4b95b45fffd38b318390/coverage-7.13.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c832ec92c4499ac463186af72f9ed4d8daec15499b16f0a879b0d1c8e5cf4a3b", size = 246597, upload-time = "2025-12-28T15:40:19.028Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/1efd31c5433743a6ddbc9d37ac30c196bb07c7eab3d74fbb99b924c93174/coverage-7.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:562ec27dfa3f311e0db1ba243ec6e5f6ab96b1edfcfc6cf86f28038bc4961ce6", size = 247626, upload-time = "2025-12-28T15:40:20.846Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9f/1609267dd3e749f57fdd66ca6752567d1c13b58a20a809dc409b263d0b5f/coverage-7.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4de84e71173d4dada2897e5a0e1b7877e5eefbfe0d6a44edee6ce31d9b8ec09e", size = 245629, upload-time = "2025-12-28T15:40:22.397Z" }, - { url = "https://files.pythonhosted.org/packages/e2/f6/6815a220d5ec2466383d7cc36131b9fa6ecbe95c50ec52a631ba733f306a/coverage-7.13.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a5a68357f686f8c4d527a2dc04f52e669c2fc1cbde38f6f7eb6a0e58cbd17cae", size = 245901, upload-time = "2025-12-28T15:40:23.836Z" }, - { url = "https://files.pythonhosted.org/packages/ac/58/40576554cd12e0872faf6d2c0eb3bc85f71d78427946ddd19ad65201e2c0/coverage-7.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:77cc258aeb29a3417062758975521eae60af6f79e930d6993555eeac6a8eac29", size = 246505, upload-time = "2025-12-28T15:40:25.421Z" }, - { url = "https://files.pythonhosted.org/packages/3b/77/9233a90253fba576b0eee81707b5781d0e21d97478e5377b226c5b096c0f/coverage-7.13.1-cp310-cp310-win32.whl", hash = "sha256:bb4f8c3c9a9f34423dba193f241f617b08ffc63e27f67159f60ae6baf2dcfe0f", size = 221257, upload-time = "2025-12-28T15:40:27.217Z" }, - { url = "https://files.pythonhosted.org/packages/e0/43/e842ff30c1a0a623ec80db89befb84a3a7aad7bfe44a6ea77d5a3e61fedd/coverage-7.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:c8e2706ceb622bc63bac98ebb10ef5da80ed70fbd8a7999a5076de3afaef0fb1", size = 222191, upload-time = "2025-12-28T15:40:28.916Z" }, - { url = "https://files.pythonhosted.org/packages/b4/9b/77baf488516e9ced25fc215a6f75d803493fc3f6a1a1227ac35697910c2a/coverage-7.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a55d509a1dc5a5b708b5dad3b5334e07a16ad4c2185e27b40e4dba796ab7f88", size = 218755, upload-time = "2025-12-28T15:40:30.812Z" }, - { url = "https://files.pythonhosted.org/packages/d7/cd/7ab01154e6eb79ee2fab76bf4d89e94c6648116557307ee4ebbb85e5c1bf/coverage-7.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d010d080c4888371033baab27e47c9df7d6fb28d0b7b7adf85a4a49be9298b3", size = 219257, upload-time = "2025-12-28T15:40:32.333Z" }, - { url = "https://files.pythonhosted.org/packages/01/d5/b11ef7863ffbbdb509da0023fad1e9eda1c0eaea61a6d2ea5b17d4ac706e/coverage-7.13.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d938b4a840fb1523b9dfbbb454f652967f18e197569c32266d4d13f37244c3d9", size = 249657, upload-time = "2025-12-28T15:40:34.1Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7c/347280982982383621d29b8c544cf497ae07ac41e44b1ca4903024131f55/coverage-7.13.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bf100a3288f9bb7f919b87eb84f87101e197535b9bd0e2c2b5b3179633324fee", size = 251581, upload-time = "2025-12-28T15:40:36.131Z" }, - { url = "https://files.pythonhosted.org/packages/82/f6/ebcfed11036ade4c0d75fa4453a6282bdd225bc073862766eec184a4c643/coverage-7.13.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef6688db9bf91ba111ae734ba6ef1a063304a881749726e0d3575f5c10a9facf", size = 253691, upload-time = "2025-12-28T15:40:37.626Z" }, - { url = "https://files.pythonhosted.org/packages/02/92/af8f5582787f5d1a8b130b2dcba785fa5e9a7a8e121a0bb2220a6fdbdb8a/coverage-7.13.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b609fc9cdbd1f02e51f67f51e5aee60a841ef58a68d00d5ee2c0faf357481a3", size = 249799, upload-time = "2025-12-28T15:40:39.47Z" }, - { url = "https://files.pythonhosted.org/packages/24/aa/0e39a2a3b16eebf7f193863323edbff38b6daba711abaaf807d4290cf61a/coverage-7.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c43257717611ff5e9a1d79dce8e47566235ebda63328718d9b65dd640bc832ef", size = 251389, upload-time = "2025-12-28T15:40:40.954Z" }, - { url = "https://files.pythonhosted.org/packages/73/46/7f0c13111154dc5b978900c0ccee2e2ca239b910890e674a77f1363d483e/coverage-7.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e09fbecc007f7b6afdfb3b07ce5bd9f8494b6856dd4f577d26c66c391b829851", size = 249450, upload-time = "2025-12-28T15:40:42.489Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ca/e80da6769e8b669ec3695598c58eef7ad98b0e26e66333996aee6316db23/coverage-7.13.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a03a4f3a19a189919c7055098790285cc5c5b0b3976f8d227aea39dbf9f8bfdb", size = 249170, upload-time = "2025-12-28T15:40:44.279Z" }, - { url = "https://files.pythonhosted.org/packages/af/18/9e29baabdec1a8644157f572541079b4658199cfd372a578f84228e860de/coverage-7.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3820778ea1387c2b6a818caec01c63adc5b3750211af6447e8dcfb9b6f08dbba", size = 250081, upload-time = "2025-12-28T15:40:45.748Z" }, - { url = "https://files.pythonhosted.org/packages/00/f8/c3021625a71c3b2f516464d322e41636aea381018319050a8114105872ee/coverage-7.13.1-cp311-cp311-win32.whl", hash = "sha256:ff10896fa55167371960c5908150b434b71c876dfab97b69478f22c8b445ea19", size = 221281, upload-time = "2025-12-28T15:40:47.232Z" }, - { url = "https://files.pythonhosted.org/packages/27/56/c216625f453df6e0559ed666d246fcbaaa93f3aa99eaa5080cea1229aa3d/coverage-7.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:a998cc0aeeea4c6d5622a3754da5a493055d2d95186bad877b0a34ea6e6dbe0a", size = 222215, upload-time = "2025-12-28T15:40:49.19Z" }, - { url = "https://files.pythonhosted.org/packages/5c/9a/be342e76f6e531cae6406dc46af0d350586f24d9b67fdfa6daee02df71af/coverage-7.13.1-cp311-cp311-win_arm64.whl", hash = "sha256:fea07c1a39a22614acb762e3fbbb4011f65eedafcb2948feeef641ac78b4ee5c", size = 220886, upload-time = "2025-12-28T15:40:51.067Z" }, - { url = "https://files.pythonhosted.org/packages/ce/8a/87af46cccdfa78f53db747b09f5f9a21d5fc38d796834adac09b30a8ce74/coverage-7.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6f34591000f06e62085b1865c9bc5f7858df748834662a51edadfd2c3bfe0dd3", size = 218927, upload-time = "2025-12-28T15:40:52.814Z" }, - { url = "https://files.pythonhosted.org/packages/82/a8/6e22fdc67242a4a5a153f9438d05944553121c8f4ba70cb072af4c41362e/coverage-7.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b67e47c5595b9224599016e333f5ec25392597a89d5744658f837d204e16c63e", size = 219288, upload-time = "2025-12-28T15:40:54.262Z" }, - { url = "https://files.pythonhosted.org/packages/d0/0a/853a76e03b0f7c4375e2ca025df45c918beb367f3e20a0a8e91967f6e96c/coverage-7.13.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e7b8bd70c48ffb28461ebe092c2345536fb18bbbf19d287c8913699735f505c", size = 250786, upload-time = "2025-12-28T15:40:56.059Z" }, - { url = "https://files.pythonhosted.org/packages/ea/b4/694159c15c52b9f7ec7adf49d50e5f8ee71d3e9ef38adb4445d13dd56c20/coverage-7.13.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c223d078112e90dc0e5c4e35b98b9584164bea9fbbd221c0b21c5241f6d51b62", size = 253543, upload-time = "2025-12-28T15:40:57.585Z" }, - { url = "https://files.pythonhosted.org/packages/96/b2/7f1f0437a5c855f87e17cf5d0dc35920b6440ff2b58b1ba9788c059c26c8/coverage-7.13.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:794f7c05af0763b1bbd1b9e6eff0e52ad068be3b12cd96c87de037b01390c968", size = 254635, upload-time = "2025-12-28T15:40:59.443Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d1/73c3fdb8d7d3bddd9473c9c6a2e0682f09fc3dfbcb9c3f36412a7368bcab/coverage-7.13.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0642eae483cc8c2902e4af7298bf886d605e80f26382124cddc3967c2a3df09e", size = 251202, upload-time = "2025-12-28T15:41:01.328Z" }, - { url = "https://files.pythonhosted.org/packages/66/3c/f0edf75dcc152f145d5598329e864bbbe04ab78660fe3e8e395f9fff010f/coverage-7.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5e772ed5fef25b3de9f2008fe67b92d46831bd2bc5bdc5dd6bfd06b83b316f", size = 252566, upload-time = "2025-12-28T15:41:03.319Z" }, - { url = "https://files.pythonhosted.org/packages/17/b3/e64206d3c5f7dcbceafd14941345a754d3dbc78a823a6ed526e23b9cdaab/coverage-7.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:45980ea19277dc0a579e432aef6a504fe098ef3a9032ead15e446eb0f1191aee", size = 250711, upload-time = "2025-12-28T15:41:06.411Z" }, - { url = "https://files.pythonhosted.org/packages/dc/ad/28a3eb970a8ef5b479ee7f0c484a19c34e277479a5b70269dc652b730733/coverage-7.13.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f18eca6028ffa62adbd185a8f1e1dd242f2e68164dba5c2b74a5204850b4cf", size = 250278, upload-time = "2025-12-28T15:41:08.285Z" }, - { url = "https://files.pythonhosted.org/packages/54/e3/c8f0f1a93133e3e1291ca76cbb63565bd4b5c5df63b141f539d747fff348/coverage-7.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8dca5590fec7a89ed6826fce625595279e586ead52e9e958d3237821fbc750c", size = 252154, upload-time = "2025-12-28T15:41:09.969Z" }, - { url = "https://files.pythonhosted.org/packages/d0/bf/9939c5d6859c380e405b19e736321f1c7d402728792f4c752ad1adcce005/coverage-7.13.1-cp312-cp312-win32.whl", hash = "sha256:ff86d4e85188bba72cfb876df3e11fa243439882c55957184af44a35bd5880b7", size = 221487, upload-time = "2025-12-28T15:41:11.468Z" }, - { url = "https://files.pythonhosted.org/packages/fa/dc/7282856a407c621c2aad74021680a01b23010bb8ebf427cf5eacda2e876f/coverage-7.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:16cc1da46c04fb0fb128b4dc430b78fa2aba8a6c0c9f8eb391fd5103409a6ac6", size = 222299, upload-time = "2025-12-28T15:41:13.386Z" }, - { url = "https://files.pythonhosted.org/packages/10/79/176a11203412c350b3e9578620013af35bcdb79b651eb976f4a4b32044fa/coverage-7.13.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d9bc218650022a768f3775dd7fdac1886437325d8d295d923ebcfef4892ad5c", size = 220941, upload-time = "2025-12-28T15:41:14.975Z" }, - { url = "https://files.pythonhosted.org/packages/cc/48/d9f421cb8da5afaa1a64570d9989e00fb7955e6acddc5a12979f7666ef60/coverage-7.13.1-py3-none-any.whl", hash = "sha256:2016745cb3ba554469d02819d78958b571792bb68e31302610e898f80dd3a573", size = 210722, upload-time = "2025-12-28T15:42:54.901Z" }, +version = "7.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/49/349848445b0e53660e258acbcc9b0d014895b6739237920886672240f84b/coverage-7.13.2.tar.gz", hash = "sha256:044c6951ec37146b72a50cc81ef02217d27d4c3640efd2640311393cbbf143d3", size = 826523, upload-time = "2026-01-25T13:00:04.889Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/01/abca50583a8975bb6e1c59eff67ed8e48bb127c07dad5c28d9e96ccc09ec/coverage-7.13.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:060ebf6f2c51aff5ba38e1f43a2095e087389b1c69d559fde6049a4b0001320e", size = 218971, upload-time = "2026-01-25T12:57:36.953Z" }, + { url = "https://files.pythonhosted.org/packages/eb/0e/b6489f344d99cd1e5b4d5e1be52dfd3f8a3dc5112aa6c33948da8cabad4e/coverage-7.13.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1ea8ca9db5e7469cd364552985e15911548ea5b69c48a17291f0cac70484b2e", size = 219473, upload-time = "2026-01-25T12:57:38.934Z" }, + { url = "https://files.pythonhosted.org/packages/17/11/db2f414915a8e4ec53f60b17956c27f21fb68fcf20f8a455ce7c2ccec638/coverage-7.13.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b780090d15fd58f07cf2011943e25a5f0c1c894384b13a216b6c86c8a8a7c508", size = 249896, upload-time = "2026-01-25T12:57:40.365Z" }, + { url = "https://files.pythonhosted.org/packages/80/06/0823fe93913663c017e508e8810c998c8ebd3ec2a5a85d2c3754297bdede/coverage-7.13.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:88a800258d83acb803c38175b4495d293656d5fac48659c953c18e5f539a274b", size = 251810, upload-time = "2026-01-25T12:57:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/61/dc/b151c3cc41b28cdf7f0166c5fa1271cbc305a8ec0124cce4b04f74791a18/coverage-7.13.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6326e18e9a553e674d948536a04a80d850a5eeefe2aae2e6d7cf05d54046c01b", size = 253920, upload-time = "2026-01-25T12:57:44.026Z" }, + { url = "https://files.pythonhosted.org/packages/2d/35/e83de0556e54a4729a2b94ea816f74ce08732e81945024adee46851c2264/coverage-7.13.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:59562de3f797979e1ff07c587e2ac36ba60ca59d16c211eceaa579c266c5022f", size = 250025, upload-time = "2026-01-25T12:57:45.624Z" }, + { url = "https://files.pythonhosted.org/packages/39/67/af2eb9c3926ce3ea0d58a0d2516fcbdacf7a9fc9559fe63076beaf3f2596/coverage-7.13.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:27ba1ed6f66b0e2d61bfa78874dffd4f8c3a12f8e2b5410e515ab345ba7bc9c3", size = 251612, upload-time = "2026-01-25T12:57:47.713Z" }, + { url = "https://files.pythonhosted.org/packages/26/62/5be2e25f3d6c711d23b71296f8b44c978d4c8b4e5b26871abfc164297502/coverage-7.13.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8be48da4d47cc68754ce643ea50b3234557cbefe47c2f120495e7bd0a2756f2b", size = 249670, upload-time = "2026-01-25T12:57:49.378Z" }, + { url = "https://files.pythonhosted.org/packages/b3/51/400d1b09a8344199f9b6a6fc1868005d766b7ea95e7882e494fa862ca69c/coverage-7.13.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2a47a4223d3361b91176aedd9d4e05844ca67d7188456227b6bf5e436630c9a1", size = 249395, upload-time = "2026-01-25T12:57:50.86Z" }, + { url = "https://files.pythonhosted.org/packages/e0/36/f02234bc6e5230e2f0a63fd125d0a2093c73ef20fdf681c7af62a140e4e7/coverage-7.13.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c6f141b468740197d6bd38f2b26ade124363228cc3f9858bd9924ab059e00059", size = 250298, upload-time = "2026-01-25T12:57:52.287Z" }, + { url = "https://files.pythonhosted.org/packages/b0/06/713110d3dd3151b93611c9cbfc65c15b4156b44f927fced49ac0b20b32a4/coverage-7.13.2-cp311-cp311-win32.whl", hash = "sha256:89567798404af067604246e01a49ef907d112edf2b75ef814b1364d5ce267031", size = 221485, upload-time = "2026-01-25T12:57:53.876Z" }, + { url = "https://files.pythonhosted.org/packages/16/0c/3ae6255fa1ebcb7dec19c9a59e85ef5f34566d1265c70af5b2fc981da834/coverage-7.13.2-cp311-cp311-win_amd64.whl", hash = "sha256:21dd57941804ae2ac7e921771a5e21bbf9aabec317a041d164853ad0a96ce31e", size = 222421, upload-time = "2026-01-25T12:57:55.433Z" }, + { url = "https://files.pythonhosted.org/packages/b5/37/fabc3179af4d61d89ea47bd04333fec735cd5e8b59baad44fed9fc4170d7/coverage-7.13.2-cp311-cp311-win_arm64.whl", hash = "sha256:10758e0586c134a0bafa28f2d37dd2cdb5e4a90de25c0fc0c77dabbad46eca28", size = 221088, upload-time = "2026-01-25T12:57:57.41Z" }, + { url = "https://files.pythonhosted.org/packages/46/39/e92a35f7800222d3f7b2cbb7bbc3b65672ae8d501cb31801b2d2bd7acdf1/coverage-7.13.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f106b2af193f965d0d3234f3f83fc35278c7fb935dfbde56ae2da3dd2c03b84d", size = 219142, upload-time = "2026-01-25T12:58:00.448Z" }, + { url = "https://files.pythonhosted.org/packages/45/7a/8bf9e9309c4c996e65c52a7c5a112707ecdd9fbaf49e10b5a705a402bbb4/coverage-7.13.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f45d21dc4d5d6bd29323f0320089ef7eae16e4bef712dff79d184fa7330af3", size = 219503, upload-time = "2026-01-25T12:58:02.451Z" }, + { url = "https://files.pythonhosted.org/packages/87/93/17661e06b7b37580923f3f12406ac91d78aeed293fb6da0b69cc7957582f/coverage-7.13.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fae91dfecd816444c74531a9c3d6ded17a504767e97aa674d44f638107265b99", size = 251006, upload-time = "2026-01-25T12:58:04.059Z" }, + { url = "https://files.pythonhosted.org/packages/12/f0/f9e59fb8c310171497f379e25db060abef9fa605e09d63157eebec102676/coverage-7.13.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:264657171406c114787b441484de620e03d8f7202f113d62fcd3d9688baa3e6f", size = 253750, upload-time = "2026-01-25T12:58:05.574Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b1/1935e31add2232663cf7edd8269548b122a7d100047ff93475dbaaae673e/coverage-7.13.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae47d8dcd3ded0155afbb59c62bd8ab07ea0fd4902e1c40567439e6db9dcaf2f", size = 254862, upload-time = "2026-01-25T12:58:07.647Z" }, + { url = "https://files.pythonhosted.org/packages/af/59/b5e97071ec13df5f45da2b3391b6cdbec78ba20757bc92580a5b3d5fa53c/coverage-7.13.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8a0b33e9fd838220b007ce8f299114d406c1e8edb21336af4c97a26ecfd185aa", size = 251420, upload-time = "2026-01-25T12:58:09.309Z" }, + { url = "https://files.pythonhosted.org/packages/3f/75/9495932f87469d013dc515fb0ce1aac5fa97766f38f6b1a1deb1ee7b7f3a/coverage-7.13.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b3becbea7f3ce9a2d4d430f223ec15888e4deb31395840a79e916368d6004cce", size = 252786, upload-time = "2026-01-25T12:58:10.909Z" }, + { url = "https://files.pythonhosted.org/packages/6a/59/af550721f0eb62f46f7b8cb7e6f1860592189267b1c411a4e3a057caacee/coverage-7.13.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f819c727a6e6eeb8711e4ce63d78c620f69630a2e9d53bc95ca5379f57b6ba94", size = 250928, upload-time = "2026-01-25T12:58:12.449Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b1/21b4445709aae500be4ab43bbcfb4e53dc0811c3396dcb11bf9f23fd0226/coverage-7.13.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4f7b71757a3ab19f7ba286e04c181004c1d61be921795ee8ba6970fd0ec91da5", size = 250496, upload-time = "2026-01-25T12:58:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b1/0f5d89dfe0392990e4f3980adbde3eb34885bc1effb2dc369e0bf385e389/coverage-7.13.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b7fc50d2afd2e6b4f6f2f403b70103d280a8e0cb35320cbbe6debcda02a1030b", size = 252373, upload-time = "2026-01-25T12:58:15.976Z" }, + { url = "https://files.pythonhosted.org/packages/01/c9/0cf1a6a57a9968cc049a6b896693faa523c638a5314b1fc374eb2b2ac904/coverage-7.13.2-cp312-cp312-win32.whl", hash = "sha256:292250282cf9bcf206b543d7608bda17ca6fc151f4cbae949fc7e115112fbd41", size = 221696, upload-time = "2026-01-25T12:58:17.517Z" }, + { url = "https://files.pythonhosted.org/packages/4d/05/d7540bf983f09d32803911afed135524570f8c47bb394bf6206c1dc3a786/coverage-7.13.2-cp312-cp312-win_amd64.whl", hash = "sha256:eeea10169fac01549a7921d27a3e517194ae254b542102267bef7a93ed38c40e", size = 222504, upload-time = "2026-01-25T12:58:19.115Z" }, + { url = "https://files.pythonhosted.org/packages/15/8b/1a9f037a736ced0a12aacf6330cdaad5008081142a7070bc58b0f7930cbc/coverage-7.13.2-cp312-cp312-win_arm64.whl", hash = "sha256:2a5b567f0b635b592c917f96b9a9cb3dbd4c320d03f4bf94e9084e494f2e8894", size = 221120, upload-time = "2026-01-25T12:58:21.334Z" }, + { url = "https://files.pythonhosted.org/packages/d2/db/d291e30fdf7ea617a335531e72294e0c723356d7fdde8fba00610a76bda9/coverage-7.13.2-py3-none-any.whl", hash = "sha256:40ce1ea1e25125556d8e76bd0b61500839a07944cc287ac21d5626f3e620cad5", size = 210943, upload-time = "2026-01-25T13:00:02.388Z" }, ] [[package]] @@ -801,7 +569,6 @@ version = "46.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9f/33/c00162f49c0e2fe8064a62cb92b93e50c74a72bc370ab92f86112b33ff62/cryptography-46.0.3.tar.gz", hash = "sha256:a8b17438104fed022ce745b362294d9ce35b4c2e45c1d958ad4a4b019285f4a1", size = 749258, upload-time = "2025-10-15T23:18:31.74Z" } wheels = [ @@ -835,8 +602,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/6e/1c8331ddf91ca4730ab3086a0f1be19c65510a33b5a441cb334e7a2d2560/cryptography-46.0.3-cp38-abi3-win32.whl", hash = "sha256:6276eb85ef938dc035d59b87c8a7dc559a232f954962520137529d77b18ff1df", size = 3036695, upload-time = "2025-10-15T23:18:08.672Z" }, { url = "https://files.pythonhosted.org/packages/90/45/b0d691df20633eff80955a0fc7695ff9051ffce8b69741444bd9ed7bd0db/cryptography-46.0.3-cp38-abi3-win_amd64.whl", hash = "sha256:416260257577718c05135c55958b674000baef9a1c7d9e8f306ec60d71db850f", size = 3501720, upload-time = "2025-10-15T23:18:10.632Z" }, { url = "https://files.pythonhosted.org/packages/e8/cb/2da4cc83f5edb9c3257d09e1e7ab7b23f049c7962cae8d842bbef0a9cec9/cryptography-46.0.3-cp38-abi3-win_arm64.whl", hash = "sha256:d89c3468de4cdc4f08a57e214384d0471911a3830fcdaf7a8cc587e42a866372", size = 2918740, upload-time = "2025-10-15T23:18:12.277Z" }, - { url = "https://files.pythonhosted.org/packages/d9/cd/1a8633802d766a0fa46f382a77e096d7e209e0817892929655fe0586ae32/cryptography-46.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a23582810fedb8c0bc47524558fb6c56aac3fc252cb306072fd2815da2a47c32", size = 3689163, upload-time = "2025-10-15T23:18:13.821Z" }, - { url = "https://files.pythonhosted.org/packages/4c/59/6b26512964ace6480c3e54681a9859c974172fb141c38df11eadd8416947/cryptography-46.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e7aec276d68421f9574040c26e2a7c3771060bc0cff408bae1dcb19d3ab1e63c", size = 3429474, upload-time = "2025-10-15T23:18:15.477Z" }, { url = "https://files.pythonhosted.org/packages/06/8a/e60e46adab4362a682cf142c7dcb5bf79b782ab2199b0dcb81f55970807f/cryptography-46.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7ce938a99998ed3c8aa7e7272dca1a610401ede816d36d0693907d863b10d9ea", size = 3698132, upload-time = "2025-10-15T23:18:17.056Z" }, { url = "https://files.pythonhosted.org/packages/da/38/f59940ec4ee91e93d3311f7532671a5cef5570eb04a144bf203b58552d11/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:191bb60a7be5e6f54e30ba16fdfae78ad3a342a0599eb4193ba88e3f3d6e185b", size = 4243992, upload-time = "2025-10-15T23:18:18.695Z" }, { url = "https://files.pythonhosted.org/packages/b0/0c/35b3d92ddebfdfda76bb485738306545817253d0a3ded0bfe80ef8e67aa5/cryptography-46.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c70cc23f12726be8f8bc72e41d5065d77e4515efae3690326764ea1b07845cfb", size = 4409944, upload-time = "2025-10-15T23:18:20.597Z" }, @@ -845,29 +610,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0d/c3/e90f4a4feae6410f914f8ebac129b9ae7a8c92eb60a638012dde42030a9d/cryptography-46.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6b5063083824e5509fdba180721d55909ffacccc8adbec85268b48439423d78c", size = 3438528, upload-time = "2025-10-15T23:18:26.227Z" }, ] -[[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 = "cymem" version = "2.0.13" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/2f0fbb32535c3731b7c2974c569fb9325e0a38ed5565a08e1139a3b71e82/cymem-2.0.13.tar.gz", hash = "sha256:1c91a92ae8c7104275ac26bd4d29b08ccd3e7faff5893d3858cb6fadf1bc1588", size = 12320, upload-time = "2025-11-14T14:58:36.902Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/14/462018dd384ee1848ac9c1951534a813a325abbfc161a74e2cbcb38d2469/cymem-2.0.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8efc4f308169237aade0e82877a65a563833dec32eb7ab2326120253e0e9e918", size = 43747, upload-time = "2025-11-14T14:57:11.287Z" }, - { url = "https://files.pythonhosted.org/packages/4b/9b/c123ba65dddcd8a2bc0b3c9046766c15abe0e257c315b3040eed22cce1e2/cymem-2.0.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e03bb575a96c59bc210d7d59862747f0012696b0dac3427ce8af33c7afb3d4a2", size = 43328, upload-time = "2025-11-14T14:57:12.578Z" }, - { url = "https://files.pythonhosted.org/packages/bd/be/7b7a4cf9cd2d37e674612a86fc90b3d59bff12177f83430e62b25afaf7fc/cymem-2.0.13-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1775d3fd34cf099929b79c3e48469283642463f977af6801231f3c0e5d9c9369", size = 231539, upload-time = "2025-11-14T14:57:14.441Z" }, - { url = "https://files.pythonhosted.org/packages/79/6d/d165c38cd4caaaf60942e2cec9998b667008f2384047ccfe0b4b5f7a1ffe/cymem-2.0.13-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84e2976e38cd663f758e40b5497fa5cd183d7c5fb0d04ce81a4b42a1ba124ff0", size = 229674, upload-time = "2025-11-14T14:57:15.685Z" }, - { url = "https://files.pythonhosted.org/packages/95/c1/af83c03a93f890ca81149561b18a4a67a9aa36a1109f15e291dd2703ab12/cymem-2.0.13-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed9de1b9b042f76fe5c312e4359eab58bf52ac7dfdf6887368a760410d809440", size = 229805, upload-time = "2025-11-14T14:57:17.289Z" }, - { url = "https://files.pythonhosted.org/packages/03/2d/12900758b80345d9aed5892a9d61e8a5f6abbbe5837e4def373a53cd0da2/cymem-2.0.13-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1366c7437a209230f4b797fae10227a8206d4021d37c9f9c0d31fd97ea4feb35", size = 234018, upload-time = "2025-11-14T14:57:18.512Z" }, - { url = "https://files.pythonhosted.org/packages/a6/8b/5fcf5430fc81098aef58cc20340e51f37b49b9d8c15766e0d5d63e7288a3/cymem-2.0.13-cp310-cp310-win_amd64.whl", hash = "sha256:7700b116524b087e0169f10f267539223b48240ef2734c3a727a9e6b4db9a671", size = 40102, upload-time = "2025-11-14T14:57:19.972Z" }, - { url = "https://files.pythonhosted.org/packages/0d/d3/cb6c83758fe399443b858faafb7096b72535621a7af7dd9a54ff0989fa14/cymem-2.0.13-cp310-cp310-win_arm64.whl", hash = "sha256:c8dbfddfe5c604974e17c6f373cedd4d25cd67f84812ede7dea12128fa0c2015", size = 36282, upload-time = "2025-11-14T14:57:21.398Z" }, { url = "https://files.pythonhosted.org/packages/10/64/1db41f7576a6b69f70367e3c15e968fd775ba7419e12059c9966ceb826f8/cymem-2.0.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:673183466b0ff2e060d97ec5116711d44200b8f7be524323e080d215ee2d44a5", size = 43587, upload-time = "2025-11-14T14:57:22.39Z" }, { url = "https://files.pythonhosted.org/packages/81/13/57f936fc08551323aab3f92ff6b7f4d4b89d5b4e495c870a67cb8d279757/cymem-2.0.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bee2791b3f6fc034ce41268851462bf662ff87e8947e35fb6dd0115b4644a61f", size = 43139, upload-time = "2025-11-14T14:57:23.363Z" }, { url = "https://files.pythonhosted.org/packages/32/a6/9345754be51e0479aa387b7b6cffc289d0fd3201aaeb8dade4623abd1e02/cymem-2.0.13-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f3aee3adf16272bca81c5826eed55ba3c938add6d8c9e273f01c6b829ecfde22", size = 245063, upload-time = "2025-11-14T14:57:24.839Z" }, @@ -892,10 +640,6 @@ version = "1.8.19" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/73/75/9e12d4d42349b817cd545b89247696c67917aab907012ae5b64bbfea3199/debugpy-1.8.19.tar.gz", hash = "sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb", size = 1644590, upload-time = "2025-12-15T21:53:28.044Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/98/d57054371887f37d3c959a7a8dc3c76b763acb65f5e78d849d7db7cadc5b/debugpy-1.8.19-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:fce6da15d73be5935b4438435c53adb512326a3e11e4f90793ea87cd9f018254", size = 2098493, upload-time = "2025-12-15T21:53:30.149Z" }, - { url = "https://files.pythonhosted.org/packages/ee/dd/c517b9aa3500157a30e4f4c4f5149f880026bd039d2b940acd2383a85d8e/debugpy-1.8.19-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:e24b1652a1df1ab04d81e7ead446a91c226de704ff5dde6bd0a0dbaab07aa3f2", size = 3087875, upload-time = "2025-12-15T21:53:31.511Z" }, - { url = "https://files.pythonhosted.org/packages/d8/57/3d5a5b0da9b63445253107ead151eff29190c6ad7440c68d1a59d56613aa/debugpy-1.8.19-cp310-cp310-win32.whl", hash = "sha256:327cb28c3ad9e17bc925efc7f7018195fd4787c2fe4b7af1eec11f1d19bdec62", size = 5239378, upload-time = "2025-12-15T21:53:32.979Z" }, - { url = "https://files.pythonhosted.org/packages/a6/36/7f9053c4c549160c87ae7e43800138f2695578c8b65947114c97250983b6/debugpy-1.8.19-cp310-cp310-win_amd64.whl", hash = "sha256:b7dd275cf2c99e53adb9654f5ae015f70415bbe2bacbe24cfee30d54b6aa03c5", size = 5271129, upload-time = "2025-12-15T21:53:35.085Z" }, { url = "https://files.pythonhosted.org/packages/80/e2/48531a609b5a2aa94c6b6853afdfec8da05630ab9aaa96f1349e772119e9/debugpy-1.8.19-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:c5dcfa21de1f735a4f7ced4556339a109aa0f618d366ede9da0a3600f2516d8b", size = 2207620, upload-time = "2025-12-15T21:53:37.1Z" }, { url = "https://files.pythonhosted.org/packages/1b/d4/97775c01d56071969f57d93928899e5616a4cfbbf4c8cc75390d3a51c4a4/debugpy-1.8.19-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:806d6800246244004625d5222d7765874ab2d22f3ba5f615416cf1342d61c488", size = 3170796, upload-time = "2025-12-15T21:53:38.513Z" }, { url = "https://files.pythonhosted.org/packages/8d/7e/8c7681bdb05be9ec972bbb1245eb7c4c7b0679bb6a9e6408d808bc876d3d/debugpy-1.8.19-cp311-cp311-win32.whl", hash = "sha256:783a519e6dfb1f3cd773a9bda592f4887a65040cb0c7bd38dde410f4e53c40d4", size = 5164287, upload-time = "2025-12-15T21:53:40.857Z" }, @@ -946,7 +690,6 @@ dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "packaging" }, { name = "requirements-parser" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/aa/5cae0f25a2ac5334d5bd2782a6bcd80eecf184f433ff74b2fb0387cfbbb6/deptry-0.24.0.tar.gz", hash = "sha256:852e88af2087e03cdf9ece6916f3f58b74191ab51cc8074897951bd496ee7dbb", size = 440158, upload-time = "2025-11-09T00:31:44.637Z" } wheels = [ @@ -991,29 +734,12 @@ wheels = [ ] [[package]] -name = "environs" -version = "14.5.0" +name = "execnet" +version = "2.1.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "marshmallow" }, - { name = "python-dotenv" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/aa/75/06801d5beeb398ed3903167af9376bb81c4ac41c44a53d45193065ebb1a8/environs-14.5.0.tar.gz", hash = "sha256:f7b8f6fcf3301bc674bc9c03e39b5986d116126ffb96764efd34c339ed9464ee", size = 35426, upload-time = "2025-11-02T21:30:36.78Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/f3/6961beb9a1e77d01dee1dd48f00fb3064429c8abcfa26aa863eb7cb2b6dd/environs-14.5.0-py3-none-any.whl", hash = "sha256:1abd3e3a5721fb09797438d6c902bc2f35d4580dfaffe68b8ee588b67b504e13", size = 17202, upload-time = "2025-11-02T21:30:35.186Z" }, -] - -[[package]] -name = "exceptiongroup" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, ] [[package]] @@ -1040,17 +766,6 @@ version = "0.14.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/c3/7d/d9daedf0f2ebcacd20d599928f8913e9d2aea1d56d2d355a93bfa2b611d7/fastuuid-0.14.0.tar.gz", hash = "sha256:178947fc2f995b38497a74172adee64fdeb8b7ec18f2a5934d037641ba265d26", size = 18232, upload-time = "2025-10-19T22:19:22.402Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/b2/731a6696e37cd20eed353f69a09f37a984a43c9713764ee3f7ad5f57f7f9/fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6e6243d40f6c793c3e2ee14c13769e341b90be5ef0c23c82fa6515a96145181a", size = 516760, upload-time = "2025-10-19T22:25:21.509Z" }, - { url = "https://files.pythonhosted.org/packages/c5/79/c73c47be2a3b8734d16e628982653517f80bbe0570e27185d91af6096507/fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:13ec4f2c3b04271f62be2e1ce7e95ad2dd1cf97e94503a3760db739afbd48f00", size = 264748, upload-time = "2025-10-19T22:41:52.873Z" }, - { url = "https://files.pythonhosted.org/packages/24/c5/84c1eea05977c8ba5173555b0133e3558dc628bcf868d6bf1689ff14aedc/fastuuid-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b2fdd48b5e4236df145a149d7125badb28e0a383372add3fbaac9a6b7a394470", size = 254537, upload-time = "2025-10-19T22:33:55.603Z" }, - { url = "https://files.pythonhosted.org/packages/0e/23/4e362367b7fa17dbed646922f216b9921efb486e7abe02147e4b917359f8/fastuuid-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f74631b8322d2780ebcf2d2d75d58045c3e9378625ec51865fe0b5620800c39d", size = 278994, upload-time = "2025-10-19T22:26:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/b2/72/3985be633b5a428e9eaec4287ed4b873b7c4c53a9639a8b416637223c4cd/fastuuid-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cffc144dc93eb604b87b179837f2ce2af44871a7b323f2bfed40e8acb40ba8", size = 280003, upload-time = "2025-10-19T22:23:45.415Z" }, - { url = "https://files.pythonhosted.org/packages/b3/6d/6ef192a6df34e2266d5c9deb39cd3eea986df650cbcfeaf171aa52a059c3/fastuuid-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a771f135ab4523eb786e95493803942a5d1fc1610915f131b363f55af53b219", size = 303583, upload-time = "2025-10-19T22:26:00.756Z" }, - { url = "https://files.pythonhosted.org/packages/9d/11/8a2ea753c68d4fece29d5d7c6f3f903948cc6e82d1823bc9f7f7c0355db3/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4edc56b877d960b4eda2c4232f953a61490c3134da94f3c28af129fb9c62a4f6", size = 460955, upload-time = "2025-10-19T22:36:25.196Z" }, - { url = "https://files.pythonhosted.org/packages/23/42/7a32c93b6ce12642d9a152ee4753a078f372c9ebb893bc489d838dd4afd5/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bcc96ee819c282e7c09b2eed2b9bd13084e3b749fdb2faf58c318d498df2efbe", size = 480763, upload-time = "2025-10-19T22:24:28.451Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e9/a5f6f686b46e3ed4ed3b93770111c233baac87dd6586a411b4988018ef1d/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7a3c0bca61eacc1843ea97b288d6789fbad7400d16db24e36a66c28c268cfe3d", size = 452613, upload-time = "2025-10-19T22:25:06.827Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c9/18abc73c9c5b7fc0e476c1733b678783b2e8a35b0be9babd423571d44e98/fastuuid-0.14.0-cp310-cp310-win32.whl", hash = "sha256:7f2f3efade4937fae4e77efae1af571902263de7b78a0aee1a1653795a093b2a", size = 155045, upload-time = "2025-10-19T22:28:32.732Z" }, - { url = "https://files.pythonhosted.org/packages/5e/8a/d9e33f4eb4d4f6d9f2c5c7d7e96b5cdbb535c93f3b1ad6acce97ee9d4bf8/fastuuid-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ae64ba730d179f439b0736208b4c279b8bc9c089b102aec23f86512ea458c8a4", size = 156122, upload-time = "2025-10-19T22:23:15.59Z" }, { url = "https://files.pythonhosted.org/packages/98/f3/12481bda4e5b6d3e698fbf525df4443cc7dce746f246b86b6fcb2fba1844/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:73946cb950c8caf65127d4e9a325e2b6be0442a224fd51ba3b6ac44e1912ce34", size = 516386, upload-time = "2025-10-19T22:42:40.176Z" }, { url = "https://files.pythonhosted.org/packages/59/19/2fc58a1446e4d72b655648eb0879b04e88ed6fa70d474efcf550f640f6ec/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:12ac85024637586a5b69645e7ed986f7535106ed3013640a393a03e461740cb7", size = 264569, upload-time = "2025-10-19T22:25:50.977Z" }, { url = "https://files.pythonhosted.org/packages/78/29/3c74756e5b02c40cfcc8b1d8b5bac4edbd532b55917a6bcc9113550e99d1/fastuuid-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:05a8dde1f395e0c9b4be515b7a521403d1e8349443e7641761af07c7ad1624b1", size = 254366, upload-time = "2025-10-19T22:29:49.166Z" }, @@ -1085,62 +800,11 @@ wheels = [ ] [[package]] -name = "fnllm" -version = "0.4.1" +name = "flatbuffers" +version = "25.12.19" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiolimiter" }, - { name = "httpx" }, - { name = "json-repair" }, - { name = "pydantic" }, - { name = "tenacity" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/84/bc3d02134a46dd267afbed66a47dc281b252bd8171c94ad22bcc8f924f8b/fnllm-0.4.1.tar.gz", hash = "sha256:80a7450693691bf0832e12a2d70420647bfea35a43cb91c4a9cb5e2f39172b50", size = 93566, upload-time = "2025-08-21T15:24:44.101Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/6a/04db92a7e8d9cf9b73d3c29c38e16d5728069ec1be06a4723f74579499fa/fnllm-0.4.1-py3-none-any.whl", hash = "sha256:22f1b3316a90f29fde94bfe651e0e4963ff68cddb438035ef7c2161e39789ccf", size = 79273, upload-time = "2025-08-21T15:24:42.796Z" }, -] - -[package.optional-dependencies] -azure = [ - { name = "azure-identity" }, - { name = "azure-storage-blob" }, -] -openai = [ - { name = "openai" }, - { name = "tiktoken" }, -] - -[[package]] -name = "fonttools" -version = "4.61.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/94/8a28707adb00bed1bf22dac16ccafe60faf2ade353dcb32c3617ee917307/fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24", size = 2854799, upload-time = "2025-12-12T17:29:27.5Z" }, - { url = "https://files.pythonhosted.org/packages/94/93/c2e682faaa5ee92034818d8f8a8145ae73eb83619600495dcf8503fa7771/fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958", size = 2403032, upload-time = "2025-12-12T17:29:30.115Z" }, - { url = "https://files.pythonhosted.org/packages/f1/62/1748f7e7e1ee41aa52279fd2e3a6d0733dc42a673b16932bad8e5d0c8b28/fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da", size = 4897863, upload-time = "2025-12-12T17:29:32.535Z" }, - { url = "https://files.pythonhosted.org/packages/69/69/4ca02ee367d2c98edcaeb83fc278d20972502ee071214ad9d8ca85e06080/fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6", size = 4859076, upload-time = "2025-12-12T17:29:34.907Z" }, - { url = "https://files.pythonhosted.org/packages/8c/f5/660f9e3cefa078861a7f099107c6d203b568a6227eef163dd173bfc56bdc/fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1", size = 4875623, upload-time = "2025-12-12T17:29:37.33Z" }, - { url = "https://files.pythonhosted.org/packages/63/d1/9d7c5091d2276ed47795c131c1bf9316c3c1ab2789c22e2f59e0572ccd38/fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881", size = 4993327, upload-time = "2025-12-12T17:29:39.781Z" }, - { url = "https://files.pythonhosted.org/packages/6f/2d/28def73837885ae32260d07660a052b99f0aa00454867d33745dfe49dbf0/fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47", size = 1502180, upload-time = "2025-12-12T17:29:42.217Z" }, - { url = "https://files.pythonhosted.org/packages/63/fa/bfdc98abb4dd2bd491033e85e3ba69a2313c850e759a6daa014bc9433b0f/fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6", size = 1550654, upload-time = "2025-12-12T17:29:44.564Z" }, - { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" }, - { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" }, - { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" }, - { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" }, - { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" }, - { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" }, - { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" }, - { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" }, - { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, - { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, - { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, - { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, - { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, - { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, - { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, - { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, - { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl", hash = "sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", size = 26661, upload-time = "2025-12-19T23:16:13.622Z" }, ] [[package]] @@ -1158,22 +822,6 @@ version = "1.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, - { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, - { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, - { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, - { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, - { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, - { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, - { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, - { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, - { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, - { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, - { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, @@ -1218,44 +866,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/01/c9/97cc5aae1648dcb851958a3ddf73ccd7dbe5650d95203ecb4d7720b4cdbf/fsspec-2026.1.0-py3-none-any.whl", hash = "sha256:cb76aa913c2285a3b49bdd5fc55b1d7c708d7208126b60f2eb8194fe1b4cbdcc", size = 201838, upload-time = "2026-01-09T15:21:34.041Z" }, ] -[[package]] -name = "future" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/b2/4140c69c6a66432916b26158687e821ba631a4c9273c474343badf84d3ba/future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05", size = 1228490, upload-time = "2024-02-21T11:52:38.461Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/71/ae30dadffc90b9006d77af76b393cb9dfbfc9629f339fc1574a1c52e6806/future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", size = 491326, upload-time = "2024-02-21T11:52:35.956Z" }, -] - -[[package]] -name = "gensim" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "smart-open" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1a/80/fe9d2e1ace968041814dbcfce4e8499a643a36c41267fa4b6c4f54cce420/gensim-4.4.0.tar.gz", hash = "sha256:a3f5b626da5518e79a479140361c663089fe7998df8ba52d56e1ded71ac5bdf5", size = 23260095, upload-time = "2025-10-18T02:06:45.962Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/88/1e7c7abf79cf88faca3d713fbb7068f58c9f44c77a3e72031cb3e40e43c3/gensim-4.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e29a2109819fdf5ff59bef670c8c22c1690d52239fe172b43e408908871de5f6", size = 24455330, upload-time = "2025-10-18T01:47:12.563Z" }, - { url = "https://files.pythonhosted.org/packages/ab/2f/46a661db005730de7455090cb980b70147f04a3d162b49171582987d634e/gensim-4.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5c4d8f2a5e69bc246931dfd8e03d0ce3f3bcf82adbbdbcf20dfc35c43b8e1035", size = 24444343, upload-time = "2025-10-18T01:47:57.596Z" }, - { url = "https://files.pythonhosted.org/packages/a3/d8/ea8f98e198d8682c0d82cba04303d26f646ef2592a558739d812bfe02a3f/gensim-4.4.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f0977e5e5df03f829f322662e37ac973b93272c526f1432f865d214c0b573f98", size = 27591522, upload-time = "2025-10-18T01:48:48.543Z" }, - { url = "https://files.pythonhosted.org/packages/7a/6e/9b835483f776ad0ab6fd1197441000c4005b0a3219d456b25296966f0107/gensim-4.4.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d56613fcb77d4068c1be845843508dcd9d384ede34700a61bbeac32b947d1fc3", size = 27631604, upload-time = "2025-10-18T01:49:39.557Z" }, - { url = "https://files.pythonhosted.org/packages/53/fe/e483909cfbfa8cc4bfd30aa9fb5170c04316cc22f23c9906529f08fb9095/gensim-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:724b93c9b6e92cd15837048c71b7fdd38059276c85dd1f9c0375576f0aea153f", size = 24395966, upload-time = "2025-10-18T01:50:24.398Z" }, - { url = "https://files.pythonhosted.org/packages/52/7b/81b6c74b32700ee63f6720a60ca0c89ab59b12933257b47572c8af017658/gensim-4.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7590e7313848ca8f3ff064898bcd6ecf6ec71c752cf4d3ec83f7ac992bc7c088", size = 24463159, upload-time = "2025-10-18T01:51:09.7Z" }, - { url = "https://files.pythonhosted.org/packages/38/7c/18d40f341276a7461962512ca1fb716d5982db57615dfa272f651ecb96d7/gensim-4.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:05a027238b5eb544a17afe73ec227d6a7e0c6b4e2108b1131c0b8f291a0e0e2e", size = 24453170, upload-time = "2025-10-18T01:51:58.42Z" }, - { url = "https://files.pythonhosted.org/packages/68/88/6bd6919d31bdd473472ce1c18c24fcab5869b8b15166a424d11ce33a5eab/gensim-4.4.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e110e2d3533f5b35239850a96cb2016a586ecd85671d655079b3048332b7169", size = 27760793, upload-time = "2025-10-18T01:52:47.866Z" }, - { url = "https://files.pythonhosted.org/packages/d9/fa/85531b39c1beb5a4203929ba83d94d886cec40d0fb0bef8ca05fd1cc7a38/gensim-4.4.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:91a7fa5e814e7b1bad4b2dffa8d62c1e55410d5cbdf930714c1997ffb4404db8", size = 27809988, upload-time = "2025-10-18T01:53:36.978Z" }, - { url = "https://files.pythonhosted.org/packages/10/c3/7e22d6f7d88c4ea6a3a84481f00538252659d285713c3b7e2e1537b0e7e1/gensim-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:5e2c1d584d1c7d16b2a0fe7d2f6f59a451422df7b5edb7e3ca46c8e462782127", size = 24396172, upload-time = "2025-10-18T01:54:25.711Z" }, - { url = "https://files.pythonhosted.org/packages/4f/65/d5285865ca54b93d41ccd8683c2d79952434957c76b411283c7a6c66ca69/gensim-4.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0845b2fa039dbea5667fb278b5414e70f6d48fd208ef51f33e84a78444288d8d", size = 24467245, upload-time = "2025-10-18T01:55:09.924Z" }, - { url = "https://files.pythonhosted.org/packages/32/59/f0ea443cbfb3b06e1d2e060217bb91f954845f6df38cbc9c5468b6c9c638/gensim-4.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1853fc5be730f692c444a826041fef9a2fc8d74c73bb59748904b2e3221daa86", size = 24455775, upload-time = "2025-10-18T01:55:52.866Z" }, - { url = "https://files.pythonhosted.org/packages/f0/b8/9b0ba15756e41ccfdd852f9c65cd2b552f240c201dc3237ad8c178642e80/gensim-4.4.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23a2a4260f01c8f71bae5dd0e8a01bb247a2c789480c033e0eaba100b0ad4239", size = 27771345, upload-time = "2025-10-18T01:56:41.448Z" }, - { url = "https://files.pythonhosted.org/packages/97/2c/c29701826c963b04a43d5d7b87573a74040387ab9219e65b10f377d22b5b/gensim-4.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b73ff30af6ddd0d2ddf9473b1eb44603cd79ec14c87d93b75291802b991916c", size = 27864118, upload-time = "2025-10-18T01:57:32.428Z" }, - { url = "https://files.pythonhosted.org/packages/fd/f2/9ec6863143888bf390cdc5261f6d9e71d79bc95d98fb815679dba478d5f6/gensim-4.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3a3f9bc8d4178b01d114e1c58c5ab2333f131c7415fb3d8ec8f1ecfe4c5b544", size = 24400277, upload-time = "2025-10-18T01:58:17.629Z" }, -] - [[package]] name = "ghp-import" version = "2.1.0" @@ -1271,40 +881,158 @@ wheels = [ [[package]] name = "graphrag" version = "2.7.1" -source = { editable = "." } +source = { editable = "packages/graphrag" } dependencies = [ - { name = "aiofiles" }, - { name = "azure-cosmos" }, { name = "azure-identity" }, { name = "azure-search-documents" }, { name = "azure-storage-blob" }, + { name = "blis" }, { name = "devtools" }, - { name = "environs" }, - { name = "fnllm", extra = ["azure", "openai"] }, - { name = "future" }, - { name = "graspologic" }, + { name = "graphrag-cache" }, + { name = "graphrag-common" }, + { name = "graphrag-input" }, + { name = "graphrag-llm" }, + { name = "graphrag-storage" }, + { name = "graphrag-vectors" }, + { name = "graspologic-native" }, { name = "json-repair" }, - { name = "lancedb" }, - { name = "litellm" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "networkx" }, { name = "nltk" }, { name = "numpy" }, - { name = "openai" }, { name = "pandas" }, { name = "pyarrow" }, { name = "pydantic" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, { name = "spacy" }, { name = "textblob" }, - { name = "tiktoken" }, { name = "tqdm" }, { name = "typer" }, { name = "typing-extensions" }, - { name = "umap-learn" }, ] +[package.metadata] +requires-dist = [ + { name = "azure-identity", specifier = "~=1.19" }, + { name = "azure-search-documents", specifier = "~=11.5" }, + { name = "azure-storage-blob", specifier = "~=12.24" }, + { name = "blis", specifier = "~=1.0" }, + { name = "devtools", specifier = "~=0.12" }, + { name = "graphrag-cache", editable = "packages/graphrag-cache" }, + { name = "graphrag-common", editable = "packages/graphrag-common" }, + { name = "graphrag-input", editable = "packages/graphrag-input" }, + { name = "graphrag-llm", editable = "packages/graphrag-llm" }, + { name = "graphrag-storage", editable = "packages/graphrag-storage" }, + { name = "graphrag-vectors", editable = "packages/graphrag-vectors" }, + { name = "graspologic-native", specifier = "~=1.2" }, + { name = "json-repair", specifier = "~=0.30" }, + { name = "networkx", specifier = "~=3.4" }, + { name = "nltk", specifier = "==3.9.1" }, + { name = "numpy", specifier = "~=2.1" }, + { name = "pandas", specifier = "~=2.3" }, + { name = "pyarrow", specifier = "~=22.0" }, + { name = "pydantic", specifier = "~=2.10" }, + { name = "spacy", specifier = "~=3.8" }, + { name = "textblob", specifier = "~=0.18" }, + { name = "tqdm", specifier = "~=4.67" }, + { name = "typer", specifier = "~=0.16" }, + { name = "typing-extensions", specifier = "~=4.12" }, +] + +[[package]] +name = "graphrag-cache" +version = "2.7.1" +source = { editable = "packages/graphrag-cache" } +dependencies = [ + { name = "graphrag-common" }, + { name = "graphrag-storage" }, +] + +[package.metadata] +requires-dist = [ + { name = "graphrag-common", editable = "packages/graphrag-common" }, + { name = "graphrag-storage", editable = "packages/graphrag-storage" }, +] + +[[package]] +name = "graphrag-chunking" +version = "2.7.1" +source = { editable = "packages/graphrag-chunking" } +dependencies = [ + { name = "graphrag-common" }, + { name = "pydantic" }, +] + +[package.metadata] +requires-dist = [ + { name = "graphrag-common", editable = "packages/graphrag-common" }, + { name = "pydantic", specifier = "~=2.10" }, +] + +[[package]] +name = "graphrag-common" +version = "2.7.1" +source = { editable = "packages/graphrag-common" } +dependencies = [ + { name = "python-dotenv" }, + { name = "pyyaml" }, +] + +[package.metadata] +requires-dist = [ + { name = "python-dotenv", specifier = "~=1.0" }, + { name = "pyyaml", specifier = "~=6.0" }, +] + +[[package]] +name = "graphrag-input" +version = "2.7.1" +source = { editable = "packages/graphrag-input" } +dependencies = [ + { name = "graphrag-common" }, + { name = "graphrag-storage" }, + { name = "markitdown" }, + { name = "pydantic" }, +] + +[package.metadata] +requires-dist = [ + { name = "graphrag-common", editable = "packages/graphrag-common" }, + { name = "graphrag-storage", editable = "packages/graphrag-storage" }, + { name = "markitdown", specifier = "~=0.1.0" }, + { name = "pydantic", specifier = "~=2.10" }, +] + +[[package]] +name = "graphrag-llm" +version = "2.7.1" +source = { editable = "packages/graphrag-llm" } +dependencies = [ + { name = "azure-identity" }, + { name = "graphrag-cache" }, + { name = "graphrag-common" }, + { name = "jinja2" }, + { name = "litellm" }, + { name = "nest-asyncio2" }, + { name = "pydantic" }, + { name = "typing-extensions" }, +] + +[package.metadata] +requires-dist = [ + { name = "azure-identity", specifier = "~=1.19.0" }, + { name = "graphrag-cache", editable = "packages/graphrag-cache" }, + { name = "graphrag-common", editable = "packages/graphrag-common" }, + { name = "jinja2", specifier = "~=3.1" }, + { name = "litellm", specifier = "~=1.80" }, + { name = "nest-asyncio2", specifier = "~=1.7" }, + { name = "pydantic", specifier = "~=2.10" }, + { name = "typing-extensions", specifier = "~=4.12" }, +] + +[[package]] +name = "graphrag-monorepo" +version = "0.0.0" +source = { virtual = "." } + [package.dev-dependencies] dev = [ { name = "coverage" }, @@ -1323,96 +1051,90 @@ dev = [ { name = "pytest-asyncio" }, { name = "pytest-dotenv" }, { name = "pytest-timeout" }, + { name = "pytest-xdist", extra = ["psutil"] }, { name = "ruff" }, { name = "semversioner" }, { name = "update-toml" }, ] [package.metadata] -requires-dist = [ - { name = "aiofiles", specifier = ">=24.1.0" }, - { name = "azure-cosmos", specifier = ">=4.9.0" }, - { name = "azure-identity", specifier = ">=1.19.0" }, - { name = "azure-search-documents", specifier = ">=11.5.2" }, - { name = "azure-storage-blob", specifier = ">=12.24.0" }, - { name = "devtools", specifier = ">=0.12.2" }, - { name = "environs", specifier = ">=11.0.0" }, - { name = "fnllm", extras = ["azure", "openai"], specifier = ">=0.4.1" }, - { name = "future", specifier = ">=1.0.0" }, - { name = "graspologic", specifier = ">=3.4.1" }, - { name = "json-repair", specifier = ">=0.30.3" }, - { name = "lancedb", specifier = ">=0.17.0" }, - { name = "litellm", specifier = ">=1.77.1" }, - { name = "networkx", specifier = ">=3.4.2" }, - { name = "nltk", specifier = "==3.9.1" }, - { name = "numpy", specifier = ">=1.25.2" }, - { name = "openai", specifier = ">=1.68.0" }, - { name = "pandas", specifier = ">=2.2.3,<3" }, - { name = "pyarrow", specifier = ">=17.0.0" }, - { name = "pydantic", specifier = ">=2.10.3" }, - { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "pyyaml", specifier = ">=6.0.2" }, - { name = "spacy", specifier = ">=3.8.4" }, - { name = "textblob", specifier = ">=0.18.0.post0" }, - { name = "tiktoken", specifier = ">=0.11.0" }, - { name = "tqdm", specifier = ">=4.67.1" }, - { name = "typer", specifier = ">=0.16.0" }, - { name = "typing-extensions", specifier = ">=4.12.2" }, - { name = "umap-learn", specifier = ">=0.5.6" }, -] [package.metadata.requires-dev] dev = [ - { name = "coverage", specifier = ">=7.6.9" }, - { name = "deptry", specifier = ">=0.21.1" }, - { name = "ipykernel", specifier = ">=6.29.5" }, - { name = "jupyter", specifier = ">=1.1.1" }, - { name = "mkdocs-exclude-search", specifier = ">=0.6.6" }, - { name = "mkdocs-jupyter", specifier = ">=0.25.1" }, - { name = "mkdocs-material", specifier = ">=9.5.48" }, - { name = "mkdocs-typer", specifier = ">=0.0.3" }, - { name = "nbconvert", specifier = ">=7.16.4" }, - { name = "pandas-stubs", specifier = ">=2.3.0.250703" }, - { name = "poethepoet", specifier = ">=0.31.1" }, - { name = "pyright", specifier = ">=1.1.390" }, - { name = "pytest", specifier = ">=8.3.4" }, - { name = "pytest-asyncio", specifier = ">=0.24.0" }, - { name = "pytest-dotenv", specifier = ">=0.5.2" }, - { name = "pytest-timeout", specifier = ">=2.3.1" }, - { name = "ruff", specifier = ">=0.8.2" }, - { name = "semversioner", specifier = ">=2.0.5" }, - { name = "update-toml", specifier = ">=0.2.1" }, -] - -[[package]] -name = "graspologic" -version = "3.4.4" -source = { registry = "https://pypi.org/simple" } + { name = "coverage", specifier = "~=7.6" }, + { name = "deptry", specifier = "~=0.21" }, + { name = "ipykernel", specifier = "~=6.29" }, + { name = "jupyter", specifier = "~=1.1" }, + { name = "mkdocs-exclude-search", specifier = "~=0.6" }, + { name = "mkdocs-jupyter", specifier = "~=0.25" }, + { name = "mkdocs-material", specifier = "~=9.5" }, + { name = "mkdocs-typer", specifier = "~=0.0.3" }, + { name = "nbconvert", specifier = "~=7.16" }, + { name = "pandas-stubs", specifier = "~=2.3" }, + { name = "poethepoet", specifier = "~=0.31" }, + { name = "pyright", specifier = "~=1.1" }, + { name = "pytest", specifier = "~=8.3" }, + { name = "pytest-asyncio", specifier = "~=0.24" }, + { name = "pytest-dotenv", specifier = "~=0.5" }, + { name = "pytest-timeout", specifier = "~=2.3" }, + { name = "pytest-xdist", extras = ["psutil"], specifier = "~=3.8.0" }, + { name = "ruff", specifier = "~=0.8" }, + { name = "semversioner", specifier = "~=2.0" }, + { name = "update-toml", specifier = "~=0.2" }, +] + +[[package]] +name = "graphrag-storage" +version = "2.7.1" +source = { editable = "packages/graphrag-storage" } dependencies = [ - { name = "anytree" }, - { name = "beartype" }, - { name = "future" }, - { name = "gensim" }, - { name = "graspologic-native" }, - { name = "hyppo" }, - { name = "joblib" }, - { name = "matplotlib" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "aiofiles" }, + { name = "azure-cosmos" }, + { name = "azure-identity" }, + { name = "azure-storage-blob" }, + { name = "graphrag-common" }, + { name = "pandas" }, + { name = "pydantic" }, +] + +[package.metadata] +requires-dist = [ + { name = "aiofiles", specifier = "~=24.1" }, + { name = "azure-cosmos", specifier = "~=4.9" }, + { name = "azure-identity", specifier = "~=1.19" }, + { name = "azure-storage-blob", specifier = "~=12.24" }, + { name = "graphrag-common", editable = "packages/graphrag-common" }, + { name = "pandas", specifier = "~=2.3" }, + { name = "pydantic", specifier = "~=2.10" }, +] + +[[package]] +name = "graphrag-vectors" +version = "2.7.1" +source = { editable = "packages/graphrag-vectors" } +dependencies = [ + { name = "azure-core" }, + { name = "azure-cosmos" }, + { name = "azure-identity" }, + { name = "azure-search-documents" }, + { name = "graphrag-common" }, + { name = "lancedb" }, { name = "numpy" }, - { name = "pot" }, - { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "seaborn" }, - { name = "statsmodels" }, - { name = "typing-extensions" }, - { name = "umap-learn" }, + { name = "pyarrow" }, + { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/bb/0fe2ef85ea775e7b8416b2cf90097aa4b5e0c9c2271d7fe6789bab27d0ca/graspologic-3.4.4.tar.gz", hash = "sha256:79878caf367da3e89046a4ec94291c5b1a5da569f19fdd879d8b45c3563d7110", size = 5134258, upload-time = "2025-09-08T21:44:01.969Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/b0/e26eb8fc25f3093ad168fba4101bdcf43258b91672546d20a2b64283845c/graspologic-3.4.4-py3-none-any.whl", hash = "sha256:4ea5cd50f10eaff3fa90f18a8f66b1f5f42c724ac6aeb95e9f081632fc8d2d00", size = 5200993, upload-time = "2025-09-08T21:43:59.843Z" }, + +[package.metadata] +requires-dist = [ + { name = "azure-core", specifier = "~=1.32" }, + { name = "azure-cosmos", specifier = "~=4.9" }, + { name = "azure-identity", specifier = "~=1.19" }, + { name = "azure-search-documents", specifier = "~=11.6" }, + { name = "graphrag-common", editable = "packages/graphrag-common" }, + { name = "lancedb", specifier = "~=0.24.1" }, + { name = "numpy", specifier = "~=2.1" }, + { name = "pyarrow", specifier = "~=22.0" }, + { name = "pydantic", specifier = "~=2.10" }, ] [[package]] @@ -1427,47 +1149,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/51/21097af79f3d68626539ab829bdbf6cc42933f020e161972927d916e394c/graspologic_native-1.2.5-cp38-abi3-win_amd64.whl", hash = "sha256:c3ef2172d774083d7e2c8e77daccd218571ddeebeb2c1703cebb1a2cc4c56e07", size = 210438, upload-time = "2025-04-02T19:34:21.139Z" }, ] -[[package]] -name = "grpcio" -version = "1.76.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182, upload-time = "2025-10-21T16:23:12.106Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/17/ff4795dc9a34b6aee6ec379f1b66438a3789cd1315aac0cbab60d92f74b3/grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc", size = 5840037, upload-time = "2025-10-21T16:20:25.069Z" }, - { url = "https://files.pythonhosted.org/packages/4e/ff/35f9b96e3fa2f12e1dcd58a4513a2e2294a001d64dec81677361b7040c9a/grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde", size = 11836482, upload-time = "2025-10-21T16:20:30.113Z" }, - { url = "https://files.pythonhosted.org/packages/3e/1c/8374990f9545e99462caacea5413ed783014b3b66ace49e35c533f07507b/grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3", size = 6407178, upload-time = "2025-10-21T16:20:32.733Z" }, - { url = "https://files.pythonhosted.org/packages/1e/77/36fd7d7c75a6c12542c90a6d647a27935a1ecaad03e0ffdb7c42db6b04d2/grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990", size = 7075684, upload-time = "2025-10-21T16:20:35.435Z" }, - { url = "https://files.pythonhosted.org/packages/38/f7/e3cdb252492278e004722306c5a8935eae91e64ea11f0af3437a7de2e2b7/grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af", size = 6611133, upload-time = "2025-10-21T16:20:37.541Z" }, - { url = "https://files.pythonhosted.org/packages/7e/20/340db7af162ccd20a0893b5f3c4a5d676af7b71105517e62279b5b61d95a/grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2", size = 7195507, upload-time = "2025-10-21T16:20:39.643Z" }, - { url = "https://files.pythonhosted.org/packages/10/f0/b2160addc1487bd8fa4810857a27132fb4ce35c1b330c2f3ac45d697b106/grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6", size = 8160651, upload-time = "2025-10-21T16:20:42.492Z" }, - { url = "https://files.pythonhosted.org/packages/2c/2c/ac6f98aa113c6ef111b3f347854e99ebb7fb9d8f7bb3af1491d438f62af4/grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3", size = 7620568, upload-time = "2025-10-21T16:20:45.995Z" }, - { url = "https://files.pythonhosted.org/packages/90/84/7852f7e087285e3ac17a2703bc4129fafee52d77c6c82af97d905566857e/grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b", size = 3998879, upload-time = "2025-10-21T16:20:48.592Z" }, - { url = "https://files.pythonhosted.org/packages/10/30/d3d2adcbb6dd3ff59d6ac3df6ef830e02b437fb5c90990429fd180e52f30/grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b", size = 4706892, upload-time = "2025-10-21T16:20:50.697Z" }, - { url = "https://files.pythonhosted.org/packages/a0/00/8163a1beeb6971f66b4bbe6ac9457b97948beba8dd2fc8e1281dce7f79ec/grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a", size = 5843567, upload-time = "2025-10-21T16:20:52.829Z" }, - { url = "https://files.pythonhosted.org/packages/10/c1/934202f5cf335e6d852530ce14ddb0fef21be612ba9ecbbcbd4d748ca32d/grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c", size = 11848017, upload-time = "2025-10-21T16:20:56.705Z" }, - { url = "https://files.pythonhosted.org/packages/11/0b/8dec16b1863d74af6eb3543928600ec2195af49ca58b16334972f6775663/grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465", size = 6412027, upload-time = "2025-10-21T16:20:59.3Z" }, - { url = "https://files.pythonhosted.org/packages/d7/64/7b9e6e7ab910bea9d46f2c090380bab274a0b91fb0a2fe9b0cd399fffa12/grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48", size = 7075913, upload-time = "2025-10-21T16:21:01.645Z" }, - { url = "https://files.pythonhosted.org/packages/68/86/093c46e9546073cefa789bd76d44c5cb2abc824ca62af0c18be590ff13ba/grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da", size = 6615417, upload-time = "2025-10-21T16:21:03.844Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b6/5709a3a68500a9c03da6fb71740dcdd5ef245e39266461a03f31a57036d8/grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397", size = 7199683, upload-time = "2025-10-21T16:21:06.195Z" }, - { url = "https://files.pythonhosted.org/packages/91/d3/4b1f2bf16ed52ce0b508161df3a2d186e4935379a159a834cb4a7d687429/grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749", size = 8163109, upload-time = "2025-10-21T16:21:08.498Z" }, - { url = "https://files.pythonhosted.org/packages/5c/61/d9043f95f5f4cf085ac5dd6137b469d41befb04bd80280952ffa2a4c3f12/grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00", size = 7626676, upload-time = "2025-10-21T16:21:10.693Z" }, - { url = "https://files.pythonhosted.org/packages/36/95/fd9a5152ca02d8881e4dd419cdd790e11805979f499a2e5b96488b85cf27/grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054", size = 3997688, upload-time = "2025-10-21T16:21:12.746Z" }, - { url = "https://files.pythonhosted.org/packages/60/9c/5c359c8d4c9176cfa3c61ecd4efe5affe1f38d9bae81e81ac7186b4c9cc8/grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d", size = 4709315, upload-time = "2025-10-21T16:21:15.26Z" }, - { url = "https://files.pythonhosted.org/packages/bf/05/8e29121994b8d959ffa0afd28996d452f291b48cfc0875619de0bde2c50c/grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8", size = 5799718, upload-time = "2025-10-21T16:21:17.939Z" }, - { url = "https://files.pythonhosted.org/packages/d9/75/11d0e66b3cdf998c996489581bdad8900db79ebd83513e45c19548f1cba4/grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280", size = 11825627, upload-time = "2025-10-21T16:21:20.466Z" }, - { url = "https://files.pythonhosted.org/packages/28/50/2f0aa0498bc188048f5d9504dcc5c2c24f2eb1a9337cd0fa09a61a2e75f0/grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4", size = 6359167, upload-time = "2025-10-21T16:21:23.122Z" }, - { url = "https://files.pythonhosted.org/packages/66/e5/bbf0bb97d29ede1d59d6588af40018cfc345b17ce979b7b45424628dc8bb/grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11", size = 7044267, upload-time = "2025-10-21T16:21:25.995Z" }, - { url = "https://files.pythonhosted.org/packages/f5/86/f6ec2164f743d9609691115ae8ece098c76b894ebe4f7c94a655c6b03e98/grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6", size = 6573963, upload-time = "2025-10-21T16:21:28.631Z" }, - { url = "https://files.pythonhosted.org/packages/60/bc/8d9d0d8505feccfdf38a766d262c71e73639c165b311c9457208b56d92ae/grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8", size = 7164484, upload-time = "2025-10-21T16:21:30.837Z" }, - { url = "https://files.pythonhosted.org/packages/67/e6/5d6c2fc10b95edf6df9b8f19cf10a34263b7fd48493936fffd5085521292/grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980", size = 8127777, upload-time = "2025-10-21T16:21:33.577Z" }, - { url = "https://files.pythonhosted.org/packages/3f/c8/dce8ff21c86abe025efe304d9e31fdb0deaaa3b502b6a78141080f206da0/grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882", size = 7594014, upload-time = "2025-10-21T16:21:41.882Z" }, - { url = "https://files.pythonhosted.org/packages/e0/42/ad28191ebf983a5d0ecef90bab66baa5a6b18f2bfdef9d0a63b1973d9f75/grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958", size = 3984750, upload-time = "2025-10-21T16:21:44.006Z" }, - { url = "https://files.pythonhosted.org/packages/9e/00/7bd478cbb851c04a48baccaa49b75abaa8e4122f7d86da797500cccdd771/grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347", size = 4704003, upload-time = "2025-10-21T16:21:46.244Z" }, -] - [[package]] name = "h11" version = "0.16.0" @@ -1522,7 +1203,7 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "1.3.3" +version = "1.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, @@ -1536,31 +1217,21 @@ dependencies = [ { name = "typer-slim" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/02/c3/544cd4cdd4b3c6de8591b56bb69efc3682e9ac81e36135c02e909dd98c5b/huggingface_hub-1.3.3.tar.gz", hash = "sha256:f8be6f468da4470db48351e8c77d6d8115dff9b3daeb30276e568767b1ff7574", size = 627649, upload-time = "2026-01-22T13:59:46.931Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/25/74af9d16cd59ae15b12467a79a84aa0fe24be4aba68fc4da0c1864d49c17/huggingface_hub-1.3.4.tar.gz", hash = "sha256:c20d5484a611b7b7891d272e8fc9f77d5de025b0480bdacfa858efb3780b455f", size = 627683, upload-time = "2026-01-26T14:05:10.656Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/e8/0d032698916b9773b710c46e3b8e0154fc34cd017b151cc316c84c6c34fe/huggingface_hub-1.3.3-py3-none-any.whl", hash = "sha256:44af7b62380efc87c1c3bde7e1bf0661899b5bdfca1fc60975c61ee68410e10e", size = 536604, upload-time = "2026-01-22T13:59:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/55/07/3d0c34c345043c6a398a5882e196b2220dc5861adfa18322448b90908f26/huggingface_hub-1.3.4-py3-none-any.whl", hash = "sha256:a0c526e76eb316e96a91e8a1a7a93cf66b0dd210be1a17bd5fc5ae53cba76bfd", size = 536611, upload-time = "2026-01-26T14:05:08.549Z" }, ] [[package]] -name = "hyppo" -version = "0.5.2" +name = "humanfriendly" +version = "10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "autograd" }, - { name = "future" }, - { name = "numba" }, - { name = "numpy" }, - { name = "pandas" }, - { name = "patsy" }, - { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "statsmodels" }, + { name = "pyreadline3", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dd/a6/0d84fe8486a1447da8bdb8ebb249d525fd8c1d0fe038bceb003c6e0513f9/hyppo-0.5.2.tar.gz", hash = "sha256:4634d15516248a43d25c241ed18beeb79bb3210360f7253693b3f154fe8c9879", size = 125115, upload-time = "2025-05-24T18:33:27.418Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/3f/2c29224acb2e2df4d2046e4c73ee2662023c58ff5b113c4c1adac0886c43/humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc", size = 360702, upload-time = "2021-09-17T21:40:43.31Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/c4/d46858cfac3c0aad314a1fc378beae5c8cac499b677650a34b5a6a3d4328/hyppo-0.5.2-py3-none-any.whl", hash = "sha256:5cc18f9e158fe2cf1804c9a1e979e807118ee89a303f29dc5cb8891d92d44ef3", size = 192272, upload-time = "2025-05-24T18:33:25.904Z" }, + { url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" }, ] [[package]] @@ -1601,8 +1272,7 @@ dependencies = [ { name = "appnope", marker = "sys_platform == 'darwin'" }, { name = "comm" }, { name = "debugpy" }, - { name = "ipython", version = "8.38.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "ipython" }, { name = "jupyter-client" }, { name = "jupyter-core" }, { name = "matplotlib-inline" }, @@ -1618,51 +1288,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f6/d8/502954a4ec0efcf264f99b65b41c3c54e65a647d9f0d6f62cd02227d242c/ipykernel-6.31.0-py3-none-any.whl", hash = "sha256:abe5386f6ced727a70e0eb0cf1da801fa7c5fa6ff82147747d5a0406cd8c94af", size = 117003, upload-time = "2025-10-20T11:42:37.502Z" }, ] -[[package]] -name = "ipython" -version = "8.38.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "colorama", marker = "python_full_version < '3.11' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version < '3.11'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "jedi", marker = "python_full_version < '3.11'" }, - { name = "matplotlib-inline", marker = "python_full_version < '3.11'" }, - { name = "pexpect", marker = "python_full_version < '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version < '3.11'" }, - { name = "pygments", marker = "python_full_version < '3.11'" }, - { name = "stack-data", marker = "python_full_version < '3.11'" }, - { name = "traitlets", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e5/61/1810830e8b93c72dcd3c0f150c80a00c3deb229562d9423807ec92c3a539/ipython-8.38.0.tar.gz", hash = "sha256:9cfea8c903ce0867cc2f23199ed8545eb741f3a69420bfcf3743ad1cec856d39", size = 5513996, upload-time = "2026-01-05T10:59:06.901Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/df/db59624f4c71b39717c423409950ac3f2c8b2ce4b0aac843112c7fb3f721/ipython-8.38.0-py3-none-any.whl", hash = "sha256:750162629d800ac65bb3b543a14e7a74b0e88063eac9b92124d4b2aa3f6d8e86", size = 831813, upload-time = "2026-01-05T10:59:04.239Z" }, -] - [[package]] name = "ipython" version = "9.9.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", -] dependencies = [ - { name = "colorama", marker = "python_full_version >= '3.11' and sys_platform == 'win32'" }, - { name = "decorator", marker = "python_full_version >= '3.11'" }, - { name = "ipython-pygments-lexers", marker = "python_full_version >= '3.11'" }, - { name = "jedi", marker = "python_full_version >= '3.11'" }, - { name = "matplotlib-inline", marker = "python_full_version >= '3.11'" }, - { name = "pexpect", marker = "python_full_version >= '3.11' and sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit", marker = "python_full_version >= '3.11'" }, - { name = "pygments", marker = "python_full_version >= '3.11'" }, - { name = "stack-data", marker = "python_full_version >= '3.11'" }, - { name = "traitlets", marker = "python_full_version >= '3.11'" }, - { name = "typing-extensions", marker = "python_full_version == '3.11.*'" }, + { 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 = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/46/dd/fb08d22ec0c27e73c8bc8f71810709870d51cadaf27b7ddd3f011236c100/ipython-9.9.0.tar.gz", hash = "sha256:48fbed1b2de5e2c7177eefa144aba7fcb82dac514f09b57e2ac9da34ddb54220", size = 4425043, upload-time = "2026-01-05T12:36:46.233Z" } wheels = [ @@ -1674,7 +1315,7 @@ name = "ipython-pygments-lexers" version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pygments", marker = "python_full_version >= '3.11'" }, + { 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 = [ @@ -1687,8 +1328,7 @@ version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "comm" }, - { name = "ipython", version = "8.38.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "ipython" }, { name = "jupyterlab-widgets" }, { name = "traitlets" }, { name = "widgetsnbextension" }, @@ -1749,18 +1389,6 @@ version = "0.12.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/45/9d/e0660989c1370e25848bb4c52d061c71837239738ad937e83edca174c273/jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b", size = 168294, upload-time = "2025-11-09T20:49:23.302Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/91/13cb9505f7be74a933f37da3af22e029f6ba64f5669416cb8b2774bc9682/jiter-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65", size = 316652, upload-time = "2025-11-09T20:46:41.021Z" }, - { url = "https://files.pythonhosted.org/packages/4e/76/4e9185e5d9bb4e482cf6dec6410d5f78dfeb374cfcecbbe9888d07c52daa/jiter-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e", size = 319829, upload-time = "2025-11-09T20:46:43.281Z" }, - { url = "https://files.pythonhosted.org/packages/86/af/727de50995d3a153138139f259baae2379d8cb0522c0c00419957bc478a6/jiter-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62", size = 350568, upload-time = "2025-11-09T20:46:45.075Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c1/d6e9f4b7a3d5ac63bcbdfddeb50b2dcfbdc512c86cffc008584fdc350233/jiter-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8", size = 369052, upload-time = "2025-11-09T20:46:46.818Z" }, - { url = "https://files.pythonhosted.org/packages/eb/be/00824cd530f30ed73fa8a4f9f3890a705519e31ccb9e929f1e22062e7c76/jiter-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb", size = 481585, upload-time = "2025-11-09T20:46:48.319Z" }, - { url = "https://files.pythonhosted.org/packages/74/b6/2ad7990dff9504d4b5052eef64aa9574bd03d722dc7edced97aad0d47be7/jiter-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc", size = 380541, upload-time = "2025-11-09T20:46:49.643Z" }, - { url = "https://files.pythonhosted.org/packages/b5/c7/f3c26ecbc1adbf1db0d6bba99192143d8fe8504729d9594542ecc4445784/jiter-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74", size = 364423, upload-time = "2025-11-09T20:46:51.731Z" }, - { url = "https://files.pythonhosted.org/packages/18/51/eac547bf3a2d7f7e556927278e14c56a0604b8cddae75815d5739f65f81d/jiter-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2", size = 389958, upload-time = "2025-11-09T20:46:53.432Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1f/9ca592e67175f2db156cff035e0d817d6004e293ee0c1d73692d38fcb596/jiter-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025", size = 522084, upload-time = "2025-11-09T20:46:54.848Z" }, - { url = "https://files.pythonhosted.org/packages/83/ff/597d9cdc3028f28224f53e1a9d063628e28b7a5601433e3196edda578cdd/jiter-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca", size = 513054, upload-time = "2025-11-09T20:46:56.487Z" }, - { url = "https://files.pythonhosted.org/packages/24/6d/1970bce1351bd02e3afcc5f49e4f7ef3dabd7fb688f42be7e8091a5b809a/jiter-0.12.0-cp310-cp310-win32.whl", hash = "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4", size = 206368, upload-time = "2025-11-09T20:46:58.638Z" }, - { url = "https://files.pythonhosted.org/packages/e3/6b/eb1eb505b2d86709b59ec06681a2b14a94d0941db091f044b9f0e16badc0/jiter-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11", size = 204847, upload-time = "2025-11-09T20:47:00.295Z" }, { url = "https://files.pythonhosted.org/packages/32/f9/eaca4633486b527ebe7e681c431f529b63fe2709e7c5242fc0f43f77ce63/jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9", size = 316435, upload-time = "2025-11-09T20:47:02.087Z" }, { url = "https://files.pythonhosted.org/packages/10/c1/40c9f7c22f5e6ff715f28113ebaba27ab85f9af2660ad6e1dd6425d14c19/jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd", size = 320548, upload-time = "2025-11-09T20:47:03.409Z" }, { url = "https://files.pythonhosted.org/packages/6b/1b/efbb68fe87e7711b00d2cfd1f26bb4bfc25a10539aefeaa7727329ffb9cb/jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423", size = 351915, upload-time = "2025-11-09T20:47:05.171Z" }, @@ -1808,11 +1436,11 @@ wheels = [ [[package]] name = "json-repair" -version = "0.55.0" +version = "0.55.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/74/0f39677fa7c0127129c3f1a37c94d05c30a968ba3047200e54dea375b09a/json_repair-0.55.0.tar.gz", hash = "sha256:9fafb47d92582ef4bdd3520656bdb0fcb37b46cf6aa99c1926b7895abc0a3a4b", size = 38828, upload-time = "2026-01-01T20:29:02.684Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c0/de/71d6bb078d167c0d0959776cee6b6bb8d2ad843f512a5222d7151dde4955/json_repair-0.55.1.tar.gz", hash = "sha256:b27aa0f6bf2e5bf58554037468690446ef26f32ca79c8753282adb3df25fb888", size = 39231, upload-time = "2026-01-23T09:37:20.93Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/00/d7d6b6b3257f9b1f997a558b6f7087b8af7c0a2f525f4fbd864c267a88ab/json_repair-0.55.0-py3-none-any.whl", hash = "sha256:bcf4880f5e6ad21a0f70ab034e3d1d398c2ae9698dc5717d7015afbac77b8ed7", size = 29570, upload-time = "2026-01-01T20:29:01.042Z" }, + { url = "https://files.pythonhosted.org/packages/56/da/289ba9eb550ae420cfc457926f6c49b87cacf8083ee9927e96921888a665/json_repair-0.55.1-py3-none-any.whl", hash = "sha256:a1bcc151982a12bc3ef9e9528198229587b1074999cfe08921ab6333b0c8e206", size = 29743, upload-time = "2026-01-23T09:37:19.404Z" }, ] [[package]] @@ -1912,8 +1540,7 @@ version = "6.6.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ipykernel" }, - { name = "ipython", version = "8.38.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "ipython", version = "9.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "ipython" }, { name = "jupyter-client" }, { name = "jupyter-core" }, { name = "prompt-toolkit" }, @@ -2015,7 +1642,7 @@ wheels = [ [[package]] name = "jupyterlab" -version = "4.5.2" +version = "4.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-lru" }, @@ -2029,13 +1656,12 @@ dependencies = [ { name = "notebook-shim" }, { name = "packaging" }, { name = "setuptools" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/93/dc/2c8c4ff1aee27ac999ba04c373c5d0d7c6c181b391640d7b916b884d5985/jupyterlab-4.5.2.tar.gz", hash = "sha256:c80a6b9f6dace96a566d590c65ee2785f61e7cd4aac5b4d453dcc7d0d5e069b7", size = 23990371, upload-time = "2026-01-12T12:27:08.493Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/76/393eae3349f9a39bf21f8f5406e5244d36e2bfc932049b6070c271f92764/jupyterlab-4.5.3.tar.gz", hash = "sha256:4a159f71067cb38e4a82e86a42de8e7e926f384d7f2291964f282282096d27e8", size = 23939231, upload-time = "2026-01-23T15:04:25.768Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/78/7e455920f104ef2aa94a4c0d2b40e5b44334ee7057eae1aa1fb97b9631ad/jupyterlab-4.5.2-py3-none-any.whl", hash = "sha256:76466ebcfdb7a9bb7e2fbd6459c0e2c032ccf75be673634a84bee4b3e6b13ab6", size = 12385807, upload-time = "2026-01-12T12:27:03.923Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9a/0bf9a7a45f0006d7ff4fdc4fc313de4255acab02bf4db1887c65f0472c01/jupyterlab-4.5.3-py3-none-any.whl", hash = "sha256:63c9f3a48de72ba00df766ad6eed416394f5bb883829f11eeff0872302520ba7", size = 12391761, upload-time = "2026-01-23T15:04:21.214Z" }, ] [[package]] @@ -2076,7 +1702,7 @@ wheels = [ [[package]] name = "jupytext" -version = "1.19.0" +version = "1.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, @@ -2084,118 +1710,33 @@ dependencies = [ { name = "nbformat" }, { name = "packaging" }, { name = "pyyaml" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2b/84/79a28abd8e6a9376fa623670ab8ac7ebcf45b10f2974e0121bb5e8e086a2/jupytext-1.19.0.tar.gz", hash = "sha256:724c1f75c850a12892ccbcdff33004ede33965d0da8520ab9ea74b39ff51283a", size = 4306554, upload-time = "2026-01-18T17:41:58.959Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/8c/e27aaea0a3fbea002f0e138902432e64f35b39d942cfa13bdc5dd63ce310/jupytext-1.19.0-py3-none-any.whl", hash = "sha256:6e82527920600883088c5825f5d4a5bd06a2676d4958d4f3bc622bad2439c0ac", size = 169904, upload-time = "2026-01-18T17:41:57.467Z" }, -] - -[[package]] -name = "kiwisolver" -version = "1.4.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, - { url = "https://files.pythonhosted.org/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", size = 66578, upload-time = "2025-08-10T21:25:36.73Z" }, - { url = "https://files.pythonhosted.org/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", size = 65312, upload-time = "2025-08-10T21:25:37.658Z" }, - { url = "https://files.pythonhosted.org/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", size = 1628458, upload-time = "2025-08-10T21:25:39.067Z" }, - { url = "https://files.pythonhosted.org/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", size = 1225640, upload-time = "2025-08-10T21:25:40.489Z" }, - { url = "https://files.pythonhosted.org/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", size = 1244074, upload-time = "2025-08-10T21:25:42.221Z" }, - { url = "https://files.pythonhosted.org/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", size = 1293036, upload-time = "2025-08-10T21:25:43.801Z" }, - { url = "https://files.pythonhosted.org/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", size = 2175310, upload-time = "2025-08-10T21:25:45.045Z" }, - { url = "https://files.pythonhosted.org/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", size = 2270943, upload-time = "2025-08-10T21:25:46.393Z" }, - { url = "https://files.pythonhosted.org/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", size = 2440488, upload-time = "2025-08-10T21:25:48.074Z" }, - { url = "https://files.pythonhosted.org/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", size = 2246787, upload-time = "2025-08-10T21:25:49.442Z" }, - { url = "https://files.pythonhosted.org/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", size = 73730, upload-time = "2025-08-10T21:25:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", size = 65036, upload-time = "2025-08-10T21:25:52.063Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, - { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, - { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, - { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, - { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, - { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, - { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, - { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, - { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, - { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, - { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, - { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, - { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, - { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, - { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, - { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, - { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, - { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, - { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, - { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, - { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, - { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, - { url = "https://files.pythonhosted.org/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", size = 60183, upload-time = "2025-08-10T21:27:37.669Z" }, - { url = "https://files.pythonhosted.org/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", size = 58675, upload-time = "2025-08-10T21:27:39.031Z" }, - { url = "https://files.pythonhosted.org/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", size = 80277, upload-time = "2025-08-10T21:27:40.129Z" }, - { url = "https://files.pythonhosted.org/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", size = 77994, upload-time = "2025-08-10T21:27:41.181Z" }, - { url = "https://files.pythonhosted.org/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", size = 73744, upload-time = "2025-08-10T21:27:42.254Z" }, - { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, - { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, - { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, - { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, -] - -[[package]] -name = "lance-namespace" -version = "0.4.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "lance-namespace-urllib3-client" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b4/b5/0c3c55cf336b1e90392c2e24ac833551659e8bb3c61644b2d94825eb31bd/lance_namespace-0.4.5.tar.gz", hash = "sha256:0aee0abed3a1fa762c2955c7d12bb3004cea5c82ba28f6fcb9fe79d0cc19e317", size = 9827, upload-time = "2026-01-07T19:20:23.005Z" } +sdist = { url = "https://files.pythonhosted.org/packages/13/a5/80c02f307c8ce863cb33e27daf049315e9d96979e14eead700923b5ec9cc/jupytext-1.19.1.tar.gz", hash = "sha256:82587c07e299173c70ed5e8ec7e75183edf1be289ed518bab49ad0d4e3d5f433", size = 4307829, upload-time = "2026-01-25T21:35:13.276Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/88/173687dad72baf819223e3b506898e386bc88c26ff8da5e8013291e02daf/lance_namespace-0.4.5-py3-none-any.whl", hash = "sha256:cd1a4f789de03ba23a0c16f100b1464cca572a5d04e428917a54d09db912d548", size = 11703, upload-time = "2026-01-07T19:20:25.394Z" }, -] - -[[package]] -name = "lance-namespace-urllib3-client" -version = "0.4.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "python-dateutil" }, - { name = "typing-extensions" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/97/a9/4e527c2f05704565618b239b0965f829d1a194837f01234af3f8e2f33d92/lance_namespace_urllib3_client-0.4.5.tar.gz", hash = "sha256:184deda8cf8700926d994618187053c644eb1f2866a4479e7b80843cacc92b1c", size = 159726, upload-time = "2026-01-07T19:20:24.025Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/86/0adee7190408a28dcc5a0562c674537457e3de59ee51d1c724ecdc4a9930/lance_namespace_urllib3_client-0.4.5-py3-none-any.whl", hash = "sha256:2ee154d616ba4721f0bfdf043d33c4fef2e79d380653e2f263058ab00fb4adf4", size = 277969, upload-time = "2026-01-07T19:20:26.597Z" }, + { url = "https://files.pythonhosted.org/packages/16/5a/736dd2f4535dbf3bf26523f9158c011389ef88dd06ec2eef67fd744f1c7b/jupytext-1.19.1-py3-none-any.whl", hash = "sha256:d8975035155d034bdfde5c0c37891425314b7ea8d3a6c4b5d18c294348714cd9", size = 170478, upload-time = "2026-01-25T21:35:11.17Z" }, ] [[package]] name = "lancedb" -version = "0.27.0" +version = "0.24.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "deprecation" }, - { name = "lance-namespace" }, { name = "numpy" }, - { name = "overrides", marker = "python_full_version < '3.12'" }, + { name = "overrides" }, { name = "packaging" }, { name = "pyarrow" }, { name = "pydantic" }, { name = "tqdm" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/57/c6f557499f94c8ab4b3afe9af26510dfa4aeca9b5d30806e3dd4d25d14e3/lancedb-0.27.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:b0f2ad52fef7248056f8db1e6ca2b2c052807f1c8074e3e3e33a44f5082465b7", size = 43534233, upload-time = "2026-01-22T01:28:00.689Z" }, - { url = "https://files.pythonhosted.org/packages/f2/1b/dbb097f589fba64acf981161e0e42978b3a39ffe3c1680ac7bbf00edffa8/lancedb-0.27.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d643ee9d86e1250f0e63a68841c8f4da73a2c35fdc5e0d741e731ce30f4f0e41", size = 45411790, upload-time = "2026-01-22T01:36:03.829Z" }, - { url = "https://files.pythonhosted.org/packages/38/36/1e643e3b409416182cdb4c8df9fccf5101ef6b19580aaadc917739a7c8ec/lancedb-0.27.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b90c12d36be1362f7f9b9b897c80400389d9c81ba4f6c2297f374d0ec5facb3a", size = 48497419, upload-time = "2026-01-22T01:39:22.941Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f8/52fc37bb20d7cf43771d5251acc351223d8833afd4e330ee6ed2cc4bf312/lancedb-0.27.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:79422a916843c08435ff2f7f2e9778a4efda8a73c847ce21df80e548bae0f752", size = 45426994, upload-time = "2026-01-22T01:34:53.128Z" }, - { url = "https://files.pythonhosted.org/packages/ce/12/cbd8b634ad0d6e821fadd4fa63332c277b382d89860389341419b995222f/lancedb-0.27.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2d70eb1ec33a18d5afc1210e30870c3ca29ef562271253b6953f6c32208caa8c", size = 48542425, upload-time = "2026-01-22T01:40:15.522Z" }, - { url = "https://files.pythonhosted.org/packages/c9/3d/dc276a98e53a17a4c8d31c93852f2b69e23a9145bf9b616a0d813cb56aa8/lancedb-0.27.0-cp39-abi3-win_amd64.whl", hash = "sha256:3c36ba6941a69405e45750d3bbc94899d141fe68c7e24c3b92ecb7c4e4d84bc7", size = 53378515, upload-time = "2026-01-22T02:10:10.048Z" }, + { url = "https://files.pythonhosted.org/packages/73/41/6e51c15c0ea9dc19c6eb037a0c284ccae49fc2e8425b934a6a1ccdc0e6d6/lancedb-0.24.3-cp39-abi3-macosx_10_15_x86_64.whl", hash = "sha256:65b5aa6201d6f1d921694dce614a2686c1272e25926cc7809ad8eb89a8eb85fa", size = 33401550, upload-time = "2025-08-15T19:02:35.274Z" }, + { url = "https://files.pythonhosted.org/packages/1b/78/d020464db8f189923caba69eaa9281c8b0a6c5c6cef3841cca3a17feb00e/lancedb-0.24.3-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f2b86928b3175afde9507ca2e39f545df380ca52c415511ffd52fab8b09937ec", size = 30810069, upload-time = "2025-08-15T19:15:55.771Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/3317ebf9c6397591b9beccd091a87e23f7d8186ddaa7cd0c1aa318e09323/lancedb-0.24.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7756d020c2e6d22130d8f59f32b816fbfda5f65ecc80c5b1bbeb01bf55dc834", size = 31708034, upload-time = "2025-08-15T18:23:36.783Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/b91a7bfe0138cec86f2e9930160112f38da923333da16f2bfaac85649d45/lancedb-0.24.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c933d2680e7bb28d99cb32b2395e808593a845a2b5ab59030e7d840d97e91f2", size = 34916331, upload-time = "2025-08-15T18:26:11.104Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c6/b475d3addf841f803f7c54a64427ef0e973ce340295f59adbd0358097a69/lancedb-0.24.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:60ecfaabd1d33f435b498624f988e610cafacd5dfea26368e5582647730495e0", size = 31718200, upload-time = "2025-08-15T18:22:17.472Z" }, + { url = "https://files.pythonhosted.org/packages/9a/b9/3e0e25b7c6dcd4f6b0e977cb886965070ca05d7994819834484cbe8c8d00/lancedb-0.24.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:78632bd98e6c317609ce844eb737d1dd306786291ed2d98009e37377be13e1b4", size = 34963956, upload-time = "2025-08-15T18:25:47.58Z" }, + { url = "https://files.pythonhosted.org/packages/c4/3b/063e78eaf61ee8c1428e1063d9c29c5fab8b2d7f5d324a13716419a29a57/lancedb-0.24.3-cp39-abi3-win_amd64.whl", hash = "sha256:d5eb70b8a3b66d728c183f9b77ddfed13894c12880f647bf5cd85e477ad5368b", size = 36945181, upload-time = "2025-08-15T18:44:06.182Z" }, ] [[package]] @@ -2209,13 +1750,12 @@ wheels = [ [[package]] name = "litellm" -version = "1.81.1" +version = "1.81.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, { name = "click" }, { name = "fastuuid" }, - { name = "grpcio" }, { name = "httpx" }, { name = "importlib-metadata" }, { name = "jinja2" }, @@ -2226,29 +1766,27 @@ dependencies = [ { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c5/2b/299d54f95e02e9ed551c186e881a4ac0eaa5a948a6be93ecaa26a748f1be/litellm-1.81.1.tar.gz", hash = "sha256:9c758db8abff04a2f1f43582d042080e36f245fe34cfbafe2f8b7ca8f1de29b6", size = 13487469, upload-time = "2026-01-21T12:55:58.271Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/dd/d70835d5b231617761717cd5ba60342b677693093a71d5ce13ae9d254aee/litellm-1.81.3.tar.gz", hash = "sha256:a7688b429a88abfdd02f2a8c3158ebb5385689cfb7f9d4ac1473d018b2047e1b", size = 13612652, upload-time = "2026-01-25T02:45:58.888Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/59/73/8d100c4e48935f6a381df60f894ca9c063ea412ce354fbe7a17770ad4092/litellm-1.81.1-py3-none-any.whl", hash = "sha256:503512a8a7f3cddf9d8fed6182c14f1e77c5655635fe67b09efb09c75234bb87", size = 11795146, upload-time = "2026-01-21T12:55:55.613Z" }, + { url = "https://files.pythonhosted.org/packages/83/62/d3f53c665261fdd5bb2401246e005a4ea8194ad1c4d8c663318ae3d638bf/litellm-1.81.3-py3-none-any.whl", hash = "sha256:3f60fd8b727587952ad3dd18b68f5fed538d6f43d15bb0356f4c3a11bccb2b92", size = 11946995, upload-time = "2026-01-25T02:45:55.887Z" }, ] [[package]] -name = "llvmlite" -version = "0.46.0" +name = "magika" +version = "0.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/74/cd/08ae687ba099c7e3d21fe2ea536500563ef1943c5105bf6ab4ee3829f68e/llvmlite-0.46.0.tar.gz", hash = "sha256:227c9fd6d09dce2783c18b754b7cd9d9b3b3515210c46acc2d3c5badd9870ceb", size = 193456, upload-time = "2025-12-08T18:15:36.295Z" } +dependencies = [ + { name = "click" }, + { name = "numpy" }, + { name = "onnxruntime" }, + { name = "python-dotenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/f3/3d1dcdd7b9c41d589f5cff252d32ed91cdf86ba84391cfc81d9d8773571d/magika-0.6.3.tar.gz", hash = "sha256:7cc52aa7359af861957043e2bf7265ed4741067251c104532765cd668c0c0cb1", size = 3042784, upload-time = "2025-10-30T15:22:34.499Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/a4/3959e1c61c5ca9db7921e5fd115b344c29b9d57a5dadd87bef97963ca1a5/llvmlite-0.46.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4323177e936d61ae0f73e653e2e614284d97d14d5dd12579adc92b6c2b0597b0", size = 37232766, upload-time = "2025-12-08T18:14:34.765Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a5/a4d916f1015106e1da876028606a8e87fd5d5c840f98c87bc2d5153b6a2f/llvmlite-0.46.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a2d461cb89537b7c20feb04c46c32e12d5ad4f0896c9dfc0f60336219ff248e", size = 56275176, upload-time = "2025-12-08T18:14:37.944Z" }, - { url = "https://files.pythonhosted.org/packages/79/7f/a7f2028805dac8c1a6fae7bda4e739b7ebbcd45b29e15bf6d21556fcd3d5/llvmlite-0.46.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b1f6595a35b7b39c3518b85a28bf18f45e075264e4b2dce3f0c2a4f232b4a910", size = 55128629, upload-time = "2025-12-08T18:14:41.674Z" }, - { url = "https://files.pythonhosted.org/packages/b2/bc/4689e1ba0c073c196b594471eb21be0aa51d9e64b911728aa13cd85ef0ae/llvmlite-0.46.0-cp310-cp310-win_amd64.whl", hash = "sha256:e7a34d4aa6f9a97ee006b504be6d2b8cb7f755b80ab2f344dda1ef992f828559", size = 38138651, upload-time = "2025-12-08T18:14:45.845Z" }, - { url = "https://files.pythonhosted.org/packages/7a/a1/2ad4b2367915faeebe8447f0a057861f646dbf5fbbb3561db42c65659cf3/llvmlite-0.46.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82f3d39b16f19aa1a56d5fe625883a6ab600d5cc9ea8906cca70ce94cabba067", size = 37232766, upload-time = "2025-12-08T18:14:48.836Z" }, - { url = "https://files.pythonhosted.org/packages/12/b5/99cf8772fdd846c07da4fd70f07812a3c8fd17ea2409522c946bb0f2b277/llvmlite-0.46.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a3df43900119803bbc52720e758c76f316a9a0f34612a886862dfe0a5591a17e", size = 56275175, upload-time = "2025-12-08T18:14:51.604Z" }, - { url = "https://files.pythonhosted.org/packages/38/f2/ed806f9c003563732da156139c45d970ee435bd0bfa5ed8de87ba972b452/llvmlite-0.46.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de183fefc8022d21b0aa37fc3e90410bc3524aed8617f0ff76732fc6c3af5361", size = 55128630, upload-time = "2025-12-08T18:14:55.107Z" }, - { url = "https://files.pythonhosted.org/packages/19/0c/8f5a37a65fc9b7b17408508145edd5f86263ad69c19d3574e818f533a0eb/llvmlite-0.46.0-cp311-cp311-win_amd64.whl", hash = "sha256:e8b10bc585c58bdffec9e0c309bb7d51be1f2f15e169a4b4d42f2389e431eb93", size = 38138652, upload-time = "2025-12-08T18:14:58.171Z" }, - { url = "https://files.pythonhosted.org/packages/2b/f8/4db016a5e547d4e054ff2f3b99203d63a497465f81ab78ec8eb2ff7b2304/llvmlite-0.46.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b9588ad4c63b4f0175a3984b85494f0c927c6b001e3a246a3a7fb3920d9a137", size = 37232767, upload-time = "2025-12-08T18:15:00.737Z" }, - { url = "https://files.pythonhosted.org/packages/aa/85/4890a7c14b4fa54400945cb52ac3cd88545bbdb973c440f98ca41591cdc5/llvmlite-0.46.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3535bd2bb6a2d7ae4012681ac228e5132cdb75fefb1bcb24e33f2f3e0c865ed4", size = 56275176, upload-time = "2025-12-08T18:15:03.936Z" }, - { url = "https://files.pythonhosted.org/packages/6a/07/3d31d39c1a1a08cd5337e78299fca77e6aebc07c059fbd0033e3edfab45c/llvmlite-0.46.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cbfd366e60ff87ea6cc62f50bc4cd800ebb13ed4c149466f50cf2163a473d1e", size = 55128630, upload-time = "2025-12-08T18:15:07.196Z" }, - { url = "https://files.pythonhosted.org/packages/2a/6b/d139535d7590a1bba1ceb68751bef22fadaa5b815bbdf0e858e3875726b2/llvmlite-0.46.0-cp312-cp312-win_amd64.whl", hash = "sha256:398b39db462c39563a97b912d4f2866cd37cba60537975a09679b28fbbc0fb38", size = 38138940, upload-time = "2025-12-08T18:15:10.162Z" }, + { url = "https://files.pythonhosted.org/packages/a2/e4/35c323beb3280482c94299d61626116856ac2d4ec16ecef50afc4fdd4291/magika-0.6.3-py3-none-any.whl", hash = "sha256:eda443d08006ee495e02083b32e51b98cb3696ab595a7d13900d8e2ef506ec9d", size = 2969474, upload-time = "2025-10-30T15:22:25.298Z" }, + { url = "https://files.pythonhosted.org/packages/25/8f/132b0d7cd51c02c39fd52658a5896276c30c8cc2fd453270b19db8c40f7e/magika-0.6.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:86901e64b05dde5faff408c9b8245495b2e1fd4c226e3393d3d2a3fee65c504b", size = 13358841, upload-time = "2025-10-30T15:22:27.413Z" }, + { url = "https://files.pythonhosted.org/packages/c4/03/5ed859be502903a68b7b393b17ae0283bf34195cfcca79ce2dc25b9290e7/magika-0.6.3-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:3d9661eedbdf445ac9567e97e7ceefb93545d77a6a32858139ea966b5806fb64", size = 15367335, upload-time = "2025-10-30T15:22:29.907Z" }, + { url = "https://files.pythonhosted.org/packages/7b/9e/f8ee7d644affa3b80efdd623a3d75865c8f058f3950cb87fb0c48e3559bc/magika-0.6.3-py3-none-win_amd64.whl", hash = "sha256:e57f75674447b20cab4db928ae58ab264d7d8582b55183a0b876711c2b2787f3", size = 12692831, upload-time = "2025-10-30T15:22:32.063Z" }, ] [[package]] @@ -2272,23 +1810,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] +[[package]] +name = "markdownify" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3f/bc/c8c8eea5335341306b0fa7e1cb33c5e1c8d24ef70ddd684da65f41c49c92/markdownify-1.2.2.tar.gz", hash = "sha256:b274f1b5943180b031b699b199cbaeb1e2ac938b75851849a31fd0c3d6603d09", size = 18816, upload-time = "2025-11-16T19:21:18.565Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ce/f1e3e9d959db134cedf06825fae8d5b294bd368aacdd0831a3975b7c4d55/markdownify-1.2.2-py3-none-any.whl", hash = "sha256:3f02d3cc52714084d6e589f70397b6fc9f2f3a8531481bf35e8cc39f975e186a", size = 15724, upload-time = "2025-11-16T19:21:17.622Z" }, +] + +[[package]] +name = "markitdown" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "charset-normalizer" }, + { name = "defusedxml" }, + { name = "magika" }, + { name = "markdownify" }, + { name = "onnxruntime", marker = "sys_platform == 'win32'" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/4d/06567465c1886c2ea47bac24eab0c96bb6b4ecea47224323409dc9cbb614/markitdown-0.1.4.tar.gz", hash = "sha256:e72a481d1a50c82ff744e85e3289f79a940c5d0ad5ffa2b37c33de814c195bb1", size = 39951, upload-time = "2025-12-01T18:20:30.937Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/b3/6138d2b23d5b534b0fa3736987a2e11bcef5419cbc9286c8afd229d21558/markitdown-0.1.4-py3-none-any.whl", hash = "sha256:d7f3805716b22545f693d355e28e89584226c0614b3b80b7c4a3f825f068492d", size = 58314, upload-time = "2025-12-01T18:20:32.345Z" }, +] + [[package]] name = "markupsafe" version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, @@ -2313,65 +1871,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, ] -[[package]] -name = "marshmallow" -version = "4.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "backports-datetime-fromisoformat", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bc/34/55d47aab1ef03fb5aab96257a31acfc58791d274cf86c044e6e75e6d3bfe/marshmallow-4.2.0.tar.gz", hash = "sha256:908acabd5aa14741419d3678d3296bda6abe28a167b7dcd05969ceb8256943ac", size = 221225, upload-time = "2026-01-04T16:07:36.921Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/b6/0a907f92c2158c9841da0227c7074ce1490f578f34d67cbba82ba8f9146e/marshmallow-4.2.0-py3-none-any.whl", hash = "sha256:1dc369bd13a8708a9566d6f73d1db07d50142a7580f04fd81e1c29a4d2e10af4", size = 48448, upload-time = "2026-01-04T16:07:34.269Z" }, -] - -[[package]] -name = "matplotlib" -version = "3.10.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "cycler" }, - { name = "fonttools" }, - { name = "kiwisolver" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pillow" }, - { name = "pyparsing" }, - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/be/a30bd917018ad220c400169fba298f2bb7003c8ccbc0c3e24ae2aacad1e8/matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7", size = 8239828, upload-time = "2025-12-10T22:55:02.313Z" }, - { url = "https://files.pythonhosted.org/packages/58/27/ca01e043c4841078e82cf6e80a6993dfecd315c3d79f5f3153afbb8e1ec6/matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656", size = 8128050, upload-time = "2025-12-10T22:55:04.997Z" }, - { url = "https://files.pythonhosted.org/packages/cb/aa/7ab67f2b729ae6a91bcf9dcac0affb95fb8c56f7fd2b2af894ae0b0cf6fa/matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df", size = 8700452, upload-time = "2025-12-10T22:55:07.47Z" }, - { url = "https://files.pythonhosted.org/packages/73/ae/2d5817b0acee3c49b7e7ccfbf5b273f284957cc8e270adf36375db353190/matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17", size = 9534928, upload-time = "2025-12-10T22:55:10.566Z" }, - { url = "https://files.pythonhosted.org/packages/c9/5b/8e66653e9f7c39cb2e5cab25fce4810daffa2bff02cbf5f3077cea9e942c/matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933", size = 9586377, upload-time = "2025-12-10T22:55:12.362Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e2/fd0bbadf837f81edb0d208ba8f8cb552874c3b16e27cb91a31977d90875d/matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a", size = 8128127, upload-time = "2025-12-10T22:55:14.436Z" }, - { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" }, - { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" }, - { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" }, - { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, - { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, - { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, - { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, - { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, - { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, - { url = "https://files.pythonhosted.org/packages/f5/43/31d59500bb950b0d188e149a2e552040528c13d6e3d6e84d0cccac593dcd/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8", size = 8237252, upload-time = "2025-12-10T22:56:39.529Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2c/615c09984f3c5f907f51c886538ad785cf72e0e11a3225de2c0f9442aecc/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7", size = 8124693, upload-time = "2025-12-10T22:56:41.758Z" }, - { url = "https://files.pythonhosted.org/packages/91/e1/2757277a1c56041e1fc104b51a0f7b9a4afc8eb737865d63cababe30bc61/matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3", size = 8702205, upload-time = "2025-12-10T22:56:43.415Z" }, - { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" }, - { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" }, - { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" }, -] - [[package]] name = "matplotlib-inline" version = "0.2.1" @@ -2418,9 +1917,6 @@ wheels = [ name = "mistune" version = "3.2.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a", size = 95467, upload-time = "2025-12-23T11:36:34.994Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1", size = 53598, upload-time = "2025-12-23T11:36:33.211Z" }, @@ -2537,6 +2033,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/38/34/4d6722b7cdb5e37474272205df6f2080ad01aff74570820a83dedb314f1b/mkdocs_typer-0.0.3-py3-none-any.whl", hash = "sha256:b2a9a44da590a7100114fde4de9123fedfea692d229379984db20ee3b3f12d7c", size = 11564, upload-time = "2023-06-21T16:33:38.597Z" }, ] +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + [[package]] name = "msal" version = "1.34.0" @@ -2565,68 +2070,47 @@ wheels = [ [[package]] name = "multidict" -version = "6.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/80/1e/5492c365f222f907de1039b91f922b93fa4f764c713ee858d235495d8f50/multidict-6.7.0.tar.gz", hash = "sha256:c6e99d9a65ca282e578dfea819cfa9c0a62b2499d8677392e09feaf305e9e6f5", size = 101834, upload-time = "2025-10-06T14:52:30.657Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/63/7bdd4adc330abcca54c85728db2327130e49e52e8c3ce685cec44e0f2e9f/multidict-6.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f474ad5acda359c8758c8accc22032c6abe6dc87a8be2440d097785e27a9349", size = 77153, upload-time = "2025-10-06T14:48:26.409Z" }, - { url = "https://files.pythonhosted.org/packages/3f/bb/b6c35ff175ed1a3142222b78455ee31be71a8396ed3ab5280fbe3ebe4e85/multidict-6.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4b7a9db5a870f780220e931d0002bbfd88fb53aceb6293251e2c839415c1b20e", size = 44993, upload-time = "2025-10-06T14:48:28.4Z" }, - { url = "https://files.pythonhosted.org/packages/e0/1f/064c77877c5fa6df6d346e68075c0f6998547afe952d6471b4c5f6a7345d/multidict-6.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03ca744319864e92721195fa28c7a3b2bc7b686246b35e4078c1e4d0eb5466d3", size = 44607, upload-time = "2025-10-06T14:48:29.581Z" }, - { url = "https://files.pythonhosted.org/packages/04/7a/bf6aa92065dd47f287690000b3d7d332edfccb2277634cadf6a810463c6a/multidict-6.7.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f0e77e3c0008bc9316e662624535b88d360c3a5d3f81e15cf12c139a75250046", size = 241847, upload-time = "2025-10-06T14:48:32.107Z" }, - { url = "https://files.pythonhosted.org/packages/94/39/297a8de920f76eda343e4ce05f3b489f0ab3f9504f2576dfb37b7c08ca08/multidict-6.7.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08325c9e5367aa379a3496aa9a022fe8837ff22e00b94db256d3a1378c76ab32", size = 242616, upload-time = "2025-10-06T14:48:34.054Z" }, - { url = "https://files.pythonhosted.org/packages/39/3a/d0eee2898cfd9d654aea6cb8c4addc2f9756e9a7e09391cfe55541f917f7/multidict-6.7.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e2862408c99f84aa571ab462d25236ef9cb12a602ea959ba9c9009a54902fc73", size = 222333, upload-time = "2025-10-06T14:48:35.9Z" }, - { url = "https://files.pythonhosted.org/packages/05/48/3b328851193c7a4240815b71eea165b49248867bbb6153a0aee227a0bb47/multidict-6.7.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d72a9a2d885f5c208b0cb91ff2ed43636bb7e345ec839ff64708e04f69a13cc", size = 253239, upload-time = "2025-10-06T14:48:37.302Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ca/0706a98c8d126a89245413225ca4a3fefc8435014de309cf8b30acb68841/multidict-6.7.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:478cc36476687bac1514d651cbbaa94b86b0732fb6855c60c673794c7dd2da62", size = 251618, upload-time = "2025-10-06T14:48:38.963Z" }, - { url = "https://files.pythonhosted.org/packages/5e/4f/9c7992f245554d8b173f6f0a048ad24b3e645d883f096857ec2c0822b8bd/multidict-6.7.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6843b28b0364dc605f21481c90fadb5f60d9123b442eb8a726bb74feef588a84", size = 241655, upload-time = "2025-10-06T14:48:40.312Z" }, - { url = "https://files.pythonhosted.org/packages/31/79/26a85991ae67efd1c0b1fc2e0c275b8a6aceeb155a68861f63f87a798f16/multidict-6.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:23bfeee5316266e5ee2d625df2d2c602b829435fc3a235c2ba2131495706e4a0", size = 239245, upload-time = "2025-10-06T14:48:41.848Z" }, - { url = "https://files.pythonhosted.org/packages/14/1e/75fa96394478930b79d0302eaf9a6c69f34005a1a5251ac8b9c336486ec9/multidict-6.7.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:680878b9f3d45c31e1f730eef731f9b0bc1da456155688c6745ee84eb818e90e", size = 233523, upload-time = "2025-10-06T14:48:43.749Z" }, - { url = "https://files.pythonhosted.org/packages/b2/5e/085544cb9f9c4ad2b5d97467c15f856df8d9bac410cffd5c43991a5d878b/multidict-6.7.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:eb866162ef2f45063acc7a53a88ef6fe8bf121d45c30ea3c9cd87ce7e191a8d4", size = 243129, upload-time = "2025-10-06T14:48:45.225Z" }, - { url = "https://files.pythonhosted.org/packages/b9/c3/e9d9e2f20c9474e7a8fcef28f863c5cbd29bb5adce6b70cebe8bdad0039d/multidict-6.7.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:df0e3bf7993bdbeca5ac25aa859cf40d39019e015c9c91809ba7093967f7a648", size = 248999, upload-time = "2025-10-06T14:48:46.703Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3f/df171b6efa3239ae33b97b887e42671cd1d94d460614bfb2c30ffdab3b95/multidict-6.7.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:661709cdcd919a2ece2234f9bae7174e5220c80b034585d7d8a755632d3e2111", size = 243711, upload-time = "2025-10-06T14:48:48.146Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2f/9b5564888c4e14b9af64c54acf149263721a283aaf4aa0ae89b091d5d8c1/multidict-6.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:096f52730c3fb8ed419db2d44391932b63891b2c5ed14850a7e215c0ba9ade36", size = 237504, upload-time = "2025-10-06T14:48:49.447Z" }, - { url = "https://files.pythonhosted.org/packages/6c/3a/0bd6ca0f7d96d790542d591c8c3354c1e1b6bfd2024d4d92dc3d87485ec7/multidict-6.7.0-cp310-cp310-win32.whl", hash = "sha256:afa8a2978ec65d2336305550535c9c4ff50ee527914328c8677b3973ade52b85", size = 41422, upload-time = "2025-10-06T14:48:50.789Z" }, - { url = "https://files.pythonhosted.org/packages/00/35/f6a637ea2c75f0d3b7c7d41b1189189acff0d9deeb8b8f35536bb30f5e33/multidict-6.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:b15b3afff74f707b9275d5ba6a91ae8f6429c3ffb29bbfd216b0b375a56f13d7", size = 46050, upload-time = "2025-10-06T14:48:51.938Z" }, - { url = "https://files.pythonhosted.org/packages/e7/b8/f7bf8329b39893d02d9d95cf610c75885d12fc0f402b1c894e1c8e01c916/multidict-6.7.0-cp310-cp310-win_arm64.whl", hash = "sha256:4b73189894398d59131a66ff157837b1fafea9974be486d036bb3d32331fdbf0", size = 43153, upload-time = "2025-10-06T14:48:53.146Z" }, - { url = "https://files.pythonhosted.org/packages/34/9e/5c727587644d67b2ed479041e4b1c58e30afc011e3d45d25bbe35781217c/multidict-6.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4d409aa42a94c0b3fa617708ef5276dfe81012ba6753a0370fcc9d0195d0a1fc", size = 76604, upload-time = "2025-10-06T14:48:54.277Z" }, - { url = "https://files.pythonhosted.org/packages/17/e4/67b5c27bd17c085a5ea8f1ec05b8a3e5cba0ca734bfcad5560fb129e70ca/multidict-6.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:14c9e076eede3b54c636f8ce1c9c252b5f057c62131211f0ceeec273810c9721", size = 44715, upload-time = "2025-10-06T14:48:55.445Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e1/866a5d77be6ea435711bef2a4291eed11032679b6b28b56b4776ab06ba3e/multidict-6.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c09703000a9d0fa3c3404b27041e574cc7f4df4c6563873246d0e11812a94b6", size = 44332, upload-time = "2025-10-06T14:48:56.706Z" }, - { url = "https://files.pythonhosted.org/packages/31/61/0c2d50241ada71ff61a79518db85ada85fdabfcf395d5968dae1cbda04e5/multidict-6.7.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a265acbb7bb33a3a2d626afbe756371dce0279e7b17f4f4eda406459c2b5ff1c", size = 245212, upload-time = "2025-10-06T14:48:58.042Z" }, - { url = "https://files.pythonhosted.org/packages/ac/e0/919666a4e4b57fff1b57f279be1c9316e6cdc5de8a8b525d76f6598fefc7/multidict-6.7.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51cb455de290ae462593e5b1cb1118c5c22ea7f0d3620d9940bf695cea5a4bd7", size = 246671, upload-time = "2025-10-06T14:49:00.004Z" }, - { url = "https://files.pythonhosted.org/packages/a1/cc/d027d9c5a520f3321b65adea289b965e7bcbd2c34402663f482648c716ce/multidict-6.7.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:db99677b4457c7a5c5a949353e125ba72d62b35f74e26da141530fbb012218a7", size = 225491, upload-time = "2025-10-06T14:49:01.393Z" }, - { url = "https://files.pythonhosted.org/packages/75/c4/bbd633980ce6155a28ff04e6a6492dd3335858394d7bb752d8b108708558/multidict-6.7.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f470f68adc395e0183b92a2f4689264d1ea4b40504a24d9882c27375e6662bb9", size = 257322, upload-time = "2025-10-06T14:49:02.745Z" }, - { url = "https://files.pythonhosted.org/packages/4c/6d/d622322d344f1f053eae47e033b0b3f965af01212de21b10bcf91be991fb/multidict-6.7.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0db4956f82723cc1c270de9c6e799b4c341d327762ec78ef82bb962f79cc07d8", size = 254694, upload-time = "2025-10-06T14:49:04.15Z" }, - { url = "https://files.pythonhosted.org/packages/a8/9f/78f8761c2705d4c6d7516faed63c0ebdac569f6db1bef95e0d5218fdc146/multidict-6.7.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e56d780c238f9e1ae66a22d2adf8d16f485381878250db8d496623cd38b22bd", size = 246715, upload-time = "2025-10-06T14:49:05.967Z" }, - { url = "https://files.pythonhosted.org/packages/78/59/950818e04f91b9c2b95aab3d923d9eabd01689d0dcd889563988e9ea0fd8/multidict-6.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d14baca2ee12c1a64740d4531356ba50b82543017f3ad6de0deb943c5979abb", size = 243189, upload-time = "2025-10-06T14:49:07.37Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3d/77c79e1934cad2ee74991840f8a0110966d9599b3af95964c0cd79bb905b/multidict-6.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:295a92a76188917c7f99cda95858c822f9e4aae5824246bba9b6b44004ddd0a6", size = 237845, upload-time = "2025-10-06T14:49:08.759Z" }, - { url = "https://files.pythonhosted.org/packages/63/1b/834ce32a0a97a3b70f86437f685f880136677ac00d8bce0027e9fd9c2db7/multidict-6.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39f1719f57adbb767ef592a50ae5ebb794220d1188f9ca93de471336401c34d2", size = 246374, upload-time = "2025-10-06T14:49:10.574Z" }, - { url = "https://files.pythonhosted.org/packages/23/ef/43d1c3ba205b5dec93dc97f3fba179dfa47910fc73aaaea4f7ceb41cec2a/multidict-6.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0a13fb8e748dfc94749f622de065dd5c1def7e0d2216dba72b1d8069a389c6ff", size = 253345, upload-time = "2025-10-06T14:49:12.331Z" }, - { url = "https://files.pythonhosted.org/packages/6b/03/eaf95bcc2d19ead522001f6a650ef32811aa9e3624ff0ad37c445c7a588c/multidict-6.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e3aa16de190d29a0ea1b48253c57d99a68492c8dd8948638073ab9e74dc9410b", size = 246940, upload-time = "2025-10-06T14:49:13.821Z" }, - { url = "https://files.pythonhosted.org/packages/e8/df/ec8a5fd66ea6cd6f525b1fcbb23511b033c3e9bc42b81384834ffa484a62/multidict-6.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a048ce45dcdaaf1defb76b2e684f997fb5abf74437b6cb7b22ddad934a964e34", size = 242229, upload-time = "2025-10-06T14:49:15.603Z" }, - { url = "https://files.pythonhosted.org/packages/8a/a2/59b405d59fd39ec86d1142630e9049243015a5f5291ba49cadf3c090c541/multidict-6.7.0-cp311-cp311-win32.whl", hash = "sha256:a90af66facec4cebe4181b9e62a68be65e45ac9b52b67de9eec118701856e7ff", size = 41308, upload-time = "2025-10-06T14:49:16.871Z" }, - { url = "https://files.pythonhosted.org/packages/32/0f/13228f26f8b882c34da36efa776c3b7348455ec383bab4a66390e42963ae/multidict-6.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:95b5ffa4349df2887518bb839409bcf22caa72d82beec453216802f475b23c81", size = 46037, upload-time = "2025-10-06T14:49:18.457Z" }, - { url = "https://files.pythonhosted.org/packages/84/1f/68588e31b000535a3207fd3c909ebeec4fb36b52c442107499c18a896a2a/multidict-6.7.0-cp311-cp311-win_arm64.whl", hash = "sha256:329aa225b085b6f004a4955271a7ba9f1087e39dcb7e65f6284a988264a63912", size = 43023, upload-time = "2025-10-06T14:49:19.648Z" }, - { url = "https://files.pythonhosted.org/packages/c2/9e/9f61ac18d9c8b475889f32ccfa91c9f59363480613fc807b6e3023d6f60b/multidict-6.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8a3862568a36d26e650a19bb5cbbba14b71789032aebc0423f8cc5f150730184", size = 76877, upload-time = "2025-10-06T14:49:20.884Z" }, - { url = "https://files.pythonhosted.org/packages/38/6f/614f09a04e6184f8824268fce4bc925e9849edfa654ddd59f0b64508c595/multidict-6.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:960c60b5849b9b4f9dcc9bea6e3626143c252c74113df2c1540aebce70209b45", size = 45467, upload-time = "2025-10-06T14:49:22.054Z" }, - { url = "https://files.pythonhosted.org/packages/b3/93/c4f67a436dd026f2e780c433277fff72be79152894d9fc36f44569cab1a6/multidict-6.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2049be98fb57a31b4ccf870bf377af2504d4ae35646a19037ec271e4c07998aa", size = 43834, upload-time = "2025-10-06T14:49:23.566Z" }, - { url = "https://files.pythonhosted.org/packages/7f/f5/013798161ca665e4a422afbc5e2d9e4070142a9ff8905e482139cd09e4d0/multidict-6.7.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0934f3843a1860dd465d38895c17fce1f1cb37295149ab05cd1b9a03afacb2a7", size = 250545, upload-time = "2025-10-06T14:49:24.882Z" }, - { url = "https://files.pythonhosted.org/packages/71/2f/91dbac13e0ba94669ea5119ba267c9a832f0cb65419aca75549fcf09a3dc/multidict-6.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3e34f3a1b8131ba06f1a73adab24f30934d148afcd5f5de9a73565a4404384e", size = 258305, upload-time = "2025-10-06T14:49:26.778Z" }, - { url = "https://files.pythonhosted.org/packages/ef/b0/754038b26f6e04488b48ac621f779c341338d78503fb45403755af2df477/multidict-6.7.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:efbb54e98446892590dc2458c19c10344ee9a883a79b5cec4bc34d6656e8d546", size = 242363, upload-time = "2025-10-06T14:49:28.562Z" }, - { url = "https://files.pythonhosted.org/packages/87/15/9da40b9336a7c9fa606c4cf2ed80a649dffeb42b905d4f63a1d7eb17d746/multidict-6.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a35c5fc61d4f51eb045061e7967cfe3123d622cd500e8868e7c0c592a09fedc4", size = 268375, upload-time = "2025-10-06T14:49:29.96Z" }, - { url = "https://files.pythonhosted.org/packages/82/72/c53fcade0cc94dfaad583105fd92b3a783af2091eddcb41a6d5a52474000/multidict-6.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29fe6740ebccba4175af1b9b87bf553e9c15cd5868ee967e010efcf94e4fd0f1", size = 269346, upload-time = "2025-10-06T14:49:31.404Z" }, - { url = "https://files.pythonhosted.org/packages/0d/e2/9baffdae21a76f77ef8447f1a05a96ec4bc0a24dae08767abc0a2fe680b8/multidict-6.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:123e2a72e20537add2f33a79e605f6191fba2afda4cbb876e35c1a7074298a7d", size = 256107, upload-time = "2025-10-06T14:49:32.974Z" }, - { url = "https://files.pythonhosted.org/packages/3c/06/3f06f611087dc60d65ef775f1fb5aca7c6d61c6db4990e7cda0cef9b1651/multidict-6.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b284e319754366c1aee2267a2036248b24eeb17ecd5dc16022095e747f2f4304", size = 253592, upload-time = "2025-10-06T14:49:34.52Z" }, - { url = "https://files.pythonhosted.org/packages/20/24/54e804ec7945b6023b340c412ce9c3f81e91b3bf5fa5ce65558740141bee/multidict-6.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:803d685de7be4303b5a657b76e2f6d1240e7e0a8aa2968ad5811fa2285553a12", size = 251024, upload-time = "2025-10-06T14:49:35.956Z" }, - { url = "https://files.pythonhosted.org/packages/14/48/011cba467ea0b17ceb938315d219391d3e421dfd35928e5dbdc3f4ae76ef/multidict-6.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c04a328260dfd5db8c39538f999f02779012268f54614902d0afc775d44e0a62", size = 251484, upload-time = "2025-10-06T14:49:37.631Z" }, - { url = "https://files.pythonhosted.org/packages/0d/2f/919258b43bb35b99fa127435cfb2d91798eb3a943396631ef43e3720dcf4/multidict-6.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8a19cdb57cd3df4cd865849d93ee14920fb97224300c88501f16ecfa2604b4e0", size = 263579, upload-time = "2025-10-06T14:49:39.502Z" }, - { url = "https://files.pythonhosted.org/packages/31/22/a0e884d86b5242b5a74cf08e876bdf299e413016b66e55511f7a804a366e/multidict-6.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b2fd74c52accced7e75de26023b7dccee62511a600e62311b918ec5c168fc2a", size = 259654, upload-time = "2025-10-06T14:49:41.32Z" }, - { url = "https://files.pythonhosted.org/packages/b2/e5/17e10e1b5c5f5a40f2fcbb45953c9b215f8a4098003915e46a93f5fcaa8f/multidict-6.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e8bfdd0e487acf992407a140d2589fe598238eaeffa3da8448d63a63cd363f8", size = 251511, upload-time = "2025-10-06T14:49:46.021Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9a/201bb1e17e7af53139597069c375e7b0dcbd47594604f65c2d5359508566/multidict-6.7.0-cp312-cp312-win32.whl", hash = "sha256:dd32a49400a2c3d52088e120ee00c1e3576cbff7e10b98467962c74fdb762ed4", size = 41895, upload-time = "2025-10-06T14:49:48.718Z" }, - { url = "https://files.pythonhosted.org/packages/46/e2/348cd32faad84eaf1d20cce80e2bb0ef8d312c55bca1f7fa9865e7770aaf/multidict-6.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:92abb658ef2d7ef22ac9f8bb88e8b6c3e571671534e029359b6d9e845923eb1b", size = 46073, upload-time = "2025-10-06T14:49:50.28Z" }, - { url = "https://files.pythonhosted.org/packages/25/ec/aad2613c1910dce907480e0c3aa306905830f25df2e54ccc9dea450cb5aa/multidict-6.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:490dab541a6a642ce1a9d61a4781656b346a55c13038f0b1244653828e3a83ec", size = 43226, upload-time = "2025-10-06T14:49:52.304Z" }, - { url = "https://files.pythonhosted.org/packages/b7/da/7d22601b625e241d4f23ef1ebff8acfc60da633c9e7e7922e24d10f592b3/multidict-6.7.0-py3-none-any.whl", hash = "sha256:394fc5c42a333c9ffc3e421a4c85e08580d990e08b99f6bf35b4132114c5dcb3", size = 12317, upload-time = "2025-10-06T14:52:29.272Z" }, +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, + { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, + { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, + { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, + { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302, upload-time = "2026-01-26T02:43:48.753Z" }, + { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981, upload-time = "2026-01-26T02:43:49.921Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159, upload-time = "2026-01-26T02:43:51.635Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] [[package]] @@ -2635,14 +2119,6 @@ version = "1.0.15" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/23/2e/88c147931ea9725d634840d538622e94122bceaf346233349b7b5c62964b/murmurhash-1.0.15.tar.gz", hash = "sha256:58e2b27b7847f9e2a6edf10b47a8c8dd70a4705f45dccb7bf76aeadacf56ba01", size = 13291, upload-time = "2025-11-14T09:51:15.272Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/3c/5e59e29fe971365d27f191a5cbf8a5fb492746e458604fe5d39810da4668/murmurhash-1.0.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4989c16053a9a83b02c520dd00a31f0877d5fd2ab8a9b6b75ed9eba0e25c489", size = 27463, upload-time = "2025-11-14T09:49:53.158Z" }, - { url = "https://files.pythonhosted.org/packages/38/3d/ace00a9b82beaa99a8a7a52e98171cfbf13c0066d2f820e84a5d572e3bd0/murmurhash-1.0.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:899068ba3d7c371e7edd093852c634cce802fefd9aaddfcc0d2fda1d7433c7f9", size = 27714, upload-time = "2025-11-14T09:49:54.855Z" }, - { url = "https://files.pythonhosted.org/packages/10/0f/34f1c4f97424ea1bc72b1e3bdf61ac34f4c5555ec9163721f1e4cafe5b1d/murmurhash-1.0.15-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fe883982114de576c793fd1cf55945c8ee6453ad4c4785ac1a48f84e74fdc650", size = 122570, upload-time = "2025-11-14T09:49:55.977Z" }, - { url = "https://files.pythonhosted.org/packages/b9/75/0019717a16ce5a7b088fc50a3ecb513035e4196c5e569bf4a2e16bcc0414/murmurhash-1.0.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:342277d8d7f712d136507fb3ccdba26c076a34ca0f8d1b96f65f0daa556da2e9", size = 123194, upload-time = "2025-11-14T09:49:57.462Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a4/c1c95ce60b816c2255098164e424752779269c93f5d6dceaa213346789a2/murmurhash-1.0.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bc54facccb32fe1e97d6231edd4f3e2937467c35658b26aa35bbd6a87ebb7cb0", size = 122461, upload-time = "2025-11-14T09:49:58.686Z" }, - { url = "https://files.pythonhosted.org/packages/63/28/e1f79369a6e8d1a5901346ed2fd3a5c56e647d0b849044870c071cb64e1c/murmurhash-1.0.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e525bbd8e26e6b9ab1b56758a59b16c2fffd73bad2f7b8bf361c16f70ff1d980", size = 121676, upload-time = "2025-11-14T09:49:59.888Z" }, - { url = "https://files.pythonhosted.org/packages/1d/7c/e2be1f5387e5898f6551cf81c4220975858b9dbda4d471b133750945599a/murmurhash-1.0.15-cp310-cp310-win_amd64.whl", hash = "sha256:2224f30f7729717644745a6f513ea7662517dfe7b1867cf1588177f64c61df3c", size = 25156, upload-time = "2025-11-14T09:50:01.016Z" }, - { url = "https://files.pythonhosted.org/packages/74/07/0df6e1a753de68368662cbbb8f88558e2c877d3886ac12b30953fb8ed335/murmurhash-1.0.15-cp310-cp310-win_arm64.whl", hash = "sha256:8a181494b5f03ba831f9a13f2de3aab9ef591e508e57239043d65c5c592f5837", size = 23270, upload-time = "2025-11-14T09:50:01.99Z" }, { url = "https://files.pythonhosted.org/packages/6b/ca/77d3e69924a8eb4508bb4f0ad34e46adbeedeb93616a71080e61e53dad71/murmurhash-1.0.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f32307fb9347680bb4fe1cbef6362fb39bd994f1b59abd8c09ca174e44199081", size = 27397, upload-time = "2025-11-14T09:50:03.077Z" }, { url = "https://files.pythonhosted.org/packages/e6/53/a936f577d35b245d47b310f29e5e9f09fcac776c8c992f1ab51a9fb0cee2/murmurhash-1.0.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:539d8405885d1d19c005f3a2313b47e8e54b0ee89915eb8dfbb430b194328e6c", size = 27692, upload-time = "2025-11-14T09:50:04.144Z" }, { url = "https://files.pythonhosted.org/packages/4d/64/5f8cfd1fd9cbeb43fcff96672f5bd9e7e1598d1c970f808ecd915490dc20/murmurhash-1.0.15-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c4cd739a00f5a4602201b74568ddabae46ec304719d9be752fd8f534a9464b5e", size = 128396, upload-time = "2025-11-14T09:50:05.268Z" }, @@ -2726,25 +2202,18 @@ wheels = [ ] [[package]] -name = "networkx" -version = "3.4.2" +name = "nest-asyncio2" +version = "1.7.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/eb/ecf8bbf9d22a4e8f7be1628336fe0202da7660790053aa28abeb6c15eb14/nest_asyncio2-1.7.1.tar.gz", hash = "sha256:a1fe5bbbd20894dcceb1842322d74992c5834d5ab692af2c4f59a9a4fcf75fe8", size = 13797, upload-time = "2025-11-20T20:46:07.085Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, + { url = "https://files.pythonhosted.org/packages/8c/48/c1f1ddcfd04bba60470235c2f83733ecff43ebe068dc7715aab60bc92ad8/nest_asyncio2-1.7.1-py3-none-any.whl", hash = "sha256:f83bc1744c3cfa7d47fd29431e5e168db6cb76eda1bb20108955c32f60d7eddf", size = 7504, upload-time = "2025-11-20T20:46:05.704Z" }, ] [[package]] name = "networkx" version = "3.6.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, @@ -2776,7 +2245,7 @@ wheels = [ [[package]] name = "notebook" -version = "7.5.2" +version = "7.5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jupyter-server" }, @@ -2785,9 +2254,9 @@ dependencies = [ { name = "notebook-shim" }, { name = "tornado" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3b/b6/6b2c653570b02e4ec2a94c0646a4a25132be0749617776d0b72a2bcedb9b/notebook-7.5.2.tar.gz", hash = "sha256:83e82f93c199ca730313bea1bb24bc279ea96f74816d038a92d26b6b9d5f3e4a", size = 14059605, upload-time = "2026-01-12T14:56:53.483Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/cb/cc7f4df5cee315dd126a47eb60890690a0438d5e0dd40c32d60ce16de377/notebook-7.5.3.tar.gz", hash = "sha256:393ceb269cf9fdb02a3be607a57d7bd5c2c14604f1818a17dbeb38e04f98cbfa", size = 14073140, upload-time = "2026-01-26T07:28:36.605Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/55/b754cd51c6011d90ef03e3f06136f1ebd44658b9529dbcf0c15fc0d6a0b7/notebook-7.5.2-py3-none-any.whl", hash = "sha256:17d078a98603d70d62b6b4b3fcb67e87d7a68c398a7ae9b447eb2d7d9aec9979", size = 14468915, upload-time = "2026-01-12T14:56:47.87Z" }, + { url = "https://files.pythonhosted.org/packages/96/98/9286e7f35e5584ebb79f997f2fb0cb66745c86f6c5fccf15ba32aac5e908/notebook-7.5.3-py3-none-any.whl", hash = "sha256:c997bfa1a2a9eb58c9bbb7e77d50428befb1033dd6f02c482922e96851d67354", size = 14481744, upload-time = "2026-01-26T07:28:31.867Z" }, ] [[package]] @@ -2803,59 +2272,65 @@ wheels = [ ] [[package]] -name = "numba" -version = "0.63.1" +name = "numpy" +version = "2.4.1" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "llvmlite" }, +sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, + { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, + { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, + { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, + { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575, upload-time = "2026-01-10T06:42:33.872Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479, upload-time = "2026-01-10T06:42:35.778Z" }, + { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325, upload-time = "2026-01-10T06:42:38.518Z" }, + { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, + { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, + { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, + { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, + { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, + { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, + { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, + { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, + { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, + { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, + { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, + { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, + { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, +] + +[[package]] +name = "onnxruntime" +version = "1.20.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coloredlogs" }, + { name = "flatbuffers" }, { name = "numpy" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "sympy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/60/0145d479b2209bd8fdae5f44201eceb8ce5a23e0ed54c71f57db24618665/numba-0.63.1.tar.gz", hash = "sha256:b320aa675d0e3b17b40364935ea52a7b1c670c9037c39cf92c49502a75902f4b", size = 2761666, upload-time = "2025-12-10T02:57:39.002Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/ce/5283d4ffa568f795bb0fd61ee1f0efc0c6094b94209259167fc8d4276bde/numba-0.63.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6d6bf5bf00f7db629305caaec82a2ffb8abe2bf45eaad0d0738dc7de4113779", size = 2680810, upload-time = "2025-12-10T02:56:55.269Z" }, - { url = "https://files.pythonhosted.org/packages/0f/72/a8bda517e26d912633b32626333339b7c769ea73a5c688365ea5f88fd07e/numba-0.63.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08653d0dfc9cc9c4c9a8fba29ceb1f2d5340c3b86c4a7e5e07e42b643bc6a2f4", size = 3739735, upload-time = "2025-12-10T02:56:57.922Z" }, - { url = "https://files.pythonhosted.org/packages/ca/17/1913b7c1173b2db30fb7a9696892a7c4c59aeee777a9af6859e9e01bac51/numba-0.63.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f09eebf5650246ce2a4e9a8d38270e2d4b0b0ae978103bafb38ed7adc5ea906e", size = 3446707, upload-time = "2025-12-10T02:56:59.837Z" }, - { url = "https://files.pythonhosted.org/packages/b4/77/703db56c3061e9fdad5e79c91452947fdeb2ec0bdfe4affe9b144e7025e0/numba-0.63.1-cp310-cp310-win_amd64.whl", hash = "sha256:f8bba17421d865d8c0f7be2142754ebce53e009daba41c44cf6909207d1a8d7d", size = 2747374, upload-time = "2025-12-10T02:57:07.908Z" }, - { url = "https://files.pythonhosted.org/packages/70/90/5f8614c165d2e256fbc6c57028519db6f32e4982475a372bbe550ea0454c/numba-0.63.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b33db00f18ccc790ee9911ce03fcdfe9d5124637d1ecc266f5ae0df06e02fec3", size = 2680501, upload-time = "2025-12-10T02:57:09.797Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9d/d0afc4cf915edd8eadd9b2ab5b696242886ee4f97720d9322650d66a88c6/numba-0.63.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7d31ea186a78a7c0f6b1b2a3fe68057fdb291b045c52d86232b5383b6cf4fc25", size = 3744945, upload-time = "2025-12-10T02:57:11.697Z" }, - { url = "https://files.pythonhosted.org/packages/05/a9/d82f38f2ab73f3be6f838a826b545b80339762ee8969c16a8bf1d39395a8/numba-0.63.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed3bb2fbdb651d6aac394388130a7001aab6f4541837123a4b4ab8b02716530c", size = 3450827, upload-time = "2025-12-10T02:57:13.709Z" }, - { url = "https://files.pythonhosted.org/packages/18/3f/a9b106e93c5bd7434e65f044bae0d204e20aa7f7f85d72ceb872c7c04216/numba-0.63.1-cp311-cp311-win_amd64.whl", hash = "sha256:1ecbff7688f044b1601be70113e2fb1835367ee0b28ffa8f3adf3a05418c5c87", size = 2747262, upload-time = "2025-12-10T02:57:15.664Z" }, - { url = "https://files.pythonhosted.org/packages/14/9c/c0974cd3d00ff70d30e8ff90522ba5fbb2bcee168a867d2321d8d0457676/numba-0.63.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2819cd52afa5d8d04e057bdfd54367575105f8829350d8fb5e4066fb7591cc71", size = 2680981, upload-time = "2025-12-10T02:57:17.579Z" }, - { url = "https://files.pythonhosted.org/packages/cb/70/ea2bc45205f206b7a24ee68a159f5097c9ca7e6466806e7c213587e0c2b1/numba-0.63.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5cfd45dbd3d409e713b1ccfdc2ee72ca82006860254429f4ef01867fdba5845f", size = 3801656, upload-time = "2025-12-10T02:57:19.106Z" }, - { url = "https://files.pythonhosted.org/packages/0d/82/4f4ba4fd0f99825cbf3cdefd682ca3678be1702b63362011de6e5f71f831/numba-0.63.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69a599df6976c03b7ecf15d05302696f79f7e6d10d620367407517943355bcb0", size = 3501857, upload-time = "2025-12-10T02:57:20.721Z" }, - { url = "https://files.pythonhosted.org/packages/af/fd/6540456efa90b5f6604a86ff50dabefb187e43557e9081adcad3be44f048/numba-0.63.1-cp312-cp312-win_amd64.whl", hash = "sha256:bbad8c63e4fc7eb3cdb2c2da52178e180419f7969f9a685f283b313a70b92af3", size = 2750282, upload-time = "2025-12-10T02:57:22.474Z" }, -] - -[[package]] -name = "numpy" -version = "1.26.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129, upload-time = "2024-02-06T00:26:44.495Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468, upload-time = "2024-02-05T23:48:01.194Z" }, - { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411, upload-time = "2024-02-05T23:48:29.038Z" }, - { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016, upload-time = "2024-02-05T23:48:54.098Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889, upload-time = "2024-02-05T23:49:25.361Z" }, - { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746, upload-time = "2024-02-05T23:49:51.983Z" }, - { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620, upload-time = "2024-02-05T23:50:22.515Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659, upload-time = "2024-02-05T23:50:35.834Z" }, - { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905, upload-time = "2024-02-05T23:51:03.701Z" }, - { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554, upload-time = "2024-02-05T23:51:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127, upload-time = "2024-02-05T23:52:15.314Z" }, - { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994, upload-time = "2024-02-05T23:52:47.569Z" }, - { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005, upload-time = "2024-02-05T23:53:15.637Z" }, - { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297, upload-time = "2024-02-05T23:53:42.16Z" }, - { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567, upload-time = "2024-02-05T23:54:11.696Z" }, - { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812, upload-time = "2024-02-05T23:54:26.453Z" }, - { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913, upload-time = "2024-02-05T23:54:53.933Z" }, - { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901, upload-time = "2024-02-05T23:55:32.801Z" }, - { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868, upload-time = "2024-02-05T23:55:56.28Z" }, - { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109, upload-time = "2024-02-05T23:56:20.368Z" }, - { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613, upload-time = "2024-02-05T23:56:56.054Z" }, - { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172, upload-time = "2024-02-05T23:57:21.56Z" }, - { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643, upload-time = "2024-02-05T23:57:56.585Z" }, - { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803, upload-time = "2024-02-05T23:58:08.963Z" }, - { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754, upload-time = "2024-02-05T23:58:36.364Z" }, + { url = "https://files.pythonhosted.org/packages/95/8d/2634e2959b34aa8a0037989f4229e9abcfa484e9c228f99633b3241768a6/onnxruntime-1.20.1-cp311-cp311-macosx_13_0_universal2.whl", hash = "sha256:06bfbf02ca9ab5f28946e0f912a562a5f005301d0c419283dc57b3ed7969bb7b", size = 30998725, upload-time = "2024-11-21T00:48:51.013Z" }, + { url = "https://files.pythonhosted.org/packages/a5/da/c44bf9bd66cd6d9018a921f053f28d819445c4d84b4dd4777271b0fe52a2/onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6243e34d74423bdd1edf0ae9596dd61023b260f546ee17d701723915f06a9f7", size = 11955227, upload-time = "2024-11-21T00:48:54.556Z" }, + { url = "https://files.pythonhosted.org/packages/11/ac/4120dfb74c8e45cce1c664fc7f7ce010edd587ba67ac41489f7432eb9381/onnxruntime-1.20.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5eec64c0269dcdb8d9a9a53dc4d64f87b9e0c19801d9321246a53b7eb5a7d1bc", size = 13331703, upload-time = "2024-11-21T00:48:57.97Z" }, + { url = "https://files.pythonhosted.org/packages/12/f1/cefacac137f7bb7bfba57c50c478150fcd3c54aca72762ac2c05ce0532c1/onnxruntime-1.20.1-cp311-cp311-win32.whl", hash = "sha256:a19bc6e8c70e2485a1725b3d517a2319603acc14c1f1a017dda0afe6d4665b41", size = 9813977, upload-time = "2024-11-21T00:49:00.519Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2d/2d4d202c0bcfb3a4cc2b171abb9328672d7f91d7af9ea52572722c6d8d96/onnxruntime-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:8508887eb1c5f9537a4071768723ec7c30c28eb2518a00d0adcd32c89dea3221", size = 11329895, upload-time = "2024-11-21T00:49:03.845Z" }, + { url = "https://files.pythonhosted.org/packages/e5/39/9335e0874f68f7d27103cbffc0e235e32e26759202df6085716375c078bb/onnxruntime-1.20.1-cp312-cp312-macosx_13_0_universal2.whl", hash = "sha256:22b0655e2bf4f2161d52706e31f517a0e54939dc393e92577df51808a7edc8c9", size = 31007580, upload-time = "2024-11-21T00:49:07.029Z" }, + { url = "https://files.pythonhosted.org/packages/c5/9d/a42a84e10f1744dd27c6f2f9280cc3fb98f869dd19b7cd042e391ee2ab61/onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f56e898815963d6dc4ee1c35fc6c36506466eff6d16f3cb9848cea4e8c8172", size = 11952833, upload-time = "2024-11-21T00:49:10.563Z" }, + { url = "https://files.pythonhosted.org/packages/47/42/2f71f5680834688a9c81becbe5c5bb996fd33eaed5c66ae0606c3b1d6a02/onnxruntime-1.20.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bb71a814f66517a65628c9e4a2bb530a6edd2cd5d87ffa0af0f6f773a027d99e", size = 13333903, upload-time = "2024-11-21T00:49:12.984Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f1/aabfdf91d013320aa2fc46cf43c88ca0182860ff15df872b4552254a9680/onnxruntime-1.20.1-cp312-cp312-win32.whl", hash = "sha256:bd386cc9ee5f686ee8a75ba74037750aca55183085bf1941da8efcfe12d5b120", size = 9814562, upload-time = "2024-11-21T00:49:15.453Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/76979e0b744307d488c79e41051117634b956612cc731f1028eb17ee7294/onnxruntime-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:19c2d843eb074f385e8bbb753a40df780511061a63f9def1b216bf53860223fb", size = 11331482, upload-time = "2024-11-21T00:49:19.412Z" }, ] [[package]] @@ -2906,7 +2381,7 @@ wheels = [ [[package]] name = "pandas" -version = "2.2.3" +version = "2.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -2914,29 +2389,22 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213, upload-time = "2024-09-20T13:10:04.827Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/70/c853aec59839bceed032d52010ff5f1b8d87dc3114b762e4ba2727661a3b/pandas-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5", size = 12580827, upload-time = "2024-09-20T13:08:42.347Z" }, - { url = "https://files.pythonhosted.org/packages/99/f2/c4527768739ffa4469b2b4fff05aa3768a478aed89a2f271a79a40eee984/pandas-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348", size = 11303897, upload-time = "2024-09-20T13:08:45.807Z" }, - { url = "https://files.pythonhosted.org/packages/ed/12/86c1747ea27989d7a4064f806ce2bae2c6d575b950be087837bdfcabacc9/pandas-2.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed", size = 66480908, upload-time = "2024-09-20T18:37:13.513Z" }, - { url = "https://files.pythonhosted.org/packages/44/50/7db2cd5e6373ae796f0ddad3675268c8d59fb6076e66f0c339d61cea886b/pandas-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57", size = 13064210, upload-time = "2024-09-20T13:08:48.325Z" }, - { url = "https://files.pythonhosted.org/packages/61/61/a89015a6d5536cb0d6c3ba02cebed51a95538cf83472975275e28ebf7d0c/pandas-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42", size = 16754292, upload-time = "2024-09-20T19:01:54.443Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0d/4cc7b69ce37fac07645a94e1d4b0880b15999494372c1523508511b09e40/pandas-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f", size = 14416379, upload-time = "2024-09-20T13:08:50.882Z" }, - { url = "https://files.pythonhosted.org/packages/31/9e/6ebb433de864a6cd45716af52a4d7a8c3c9aaf3a98368e61db9e69e69a9c/pandas-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645", size = 11598471, upload-time = "2024-09-20T13:08:53.332Z" }, - { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222, upload-time = "2024-09-20T13:08:56.254Z" }, - { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274, upload-time = "2024-09-20T13:08:58.645Z" }, - { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836, upload-time = "2024-09-20T19:01:57.571Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505, upload-time = "2024-09-20T13:09:01.501Z" }, - { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420, upload-time = "2024-09-20T19:02:00.678Z" }, - { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457, upload-time = "2024-09-20T13:09:04.105Z" }, - { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166, upload-time = "2024-09-20T13:09:06.917Z" }, - { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893, upload-time = "2024-09-20T13:09:09.655Z" }, - { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475, upload-time = "2024-09-20T13:09:14.718Z" }, - { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645, upload-time = "2024-09-20T19:02:03.88Z" }, - { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445, upload-time = "2024-09-20T13:09:17.621Z" }, - { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235, upload-time = "2024-09-20T19:02:07.094Z" }, - { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756, upload-time = "2024-09-20T13:09:20.474Z" }, - { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248, upload-time = "2024-09-20T13:09:23.137Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, ] [[package]] @@ -2981,23 +2449,11 @@ wheels = [ [[package]] name = "pathspec" -version = "1.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/b2/bb8e495d5262bfec41ab5cb18f522f1012933347fb5d9e62452d446baca2/pathspec-1.0.3.tar.gz", hash = "sha256:bac5cf97ae2c2876e2d25ebb15078eb04d76e4b98921ee31c6f85ade8b59444d", size = 130841, upload-time = "2026-01-09T15:46:46.009Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/2b/121e912bd60eebd623f873fd090de0e84f322972ab25a7f9044c056804ed/pathspec-1.0.3-py3-none-any.whl", hash = "sha256:e80767021c1cc524aa3fb14bedda9c34406591343cc42797b386ce7b9354fb6c", size = 55021, upload-time = "2026-01-09T15:46:44.652Z" }, -] - -[[package]] -name = "patsy" -version = "1.0.2" +version = "1.0.4" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/be/44/ed13eccdd0519eff265f44b670d46fbb0ec813e2274932dc1c0e48520f7d/patsy-1.0.2.tar.gz", hash = "sha256:cdc995455f6233e90e22de72c37fcadb344e7586fb83f06696f54d92f8ce74c0", size = 399942, upload-time = "2025-10-20T16:17:37.535Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/70/ba4b949bdc0490ab78d545459acd7702b211dfccf7eb89bbc1060f52818d/patsy-1.0.2-py2.py3-none-any.whl", hash = "sha256:37bfddbc58fcf0362febb5f54f10743f8b21dd2aa73dec7e7ef59d1b02ae668a", size = 233301, upload-time = "2025-10-20T16:17:36.563Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] [[package]] @@ -3005,61 +2461,13 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess" }, + { 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.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/02/d52c733a2452ef1ffcc123b68e6606d07276b0e358db70eabad7e40042b7/pillow-12.1.0.tar.gz", hash = "sha256:5c5ae0a06e9ea030ab786b0251b32c7e4ce10e58d983c0d5c56029455180b5b9", size = 46977283, upload-time = "2026-01-02T09:13:29.892Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/41/f73d92b6b883a579e79600d391f2e21cb0df767b2714ecbd2952315dfeef/pillow-12.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:fb125d860738a09d363a88daa0f59c4533529a90e564785e20fe875b200b6dbd", size = 5304089, upload-time = "2026-01-02T09:10:24.953Z" }, - { url = "https://files.pythonhosted.org/packages/94/55/7aca2891560188656e4a91ed9adba305e914a4496800da6b5c0a15f09edf/pillow-12.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cad302dc10fac357d3467a74a9561c90609768a6f73a1923b0fd851b6486f8b0", size = 4657815, upload-time = "2026-01-02T09:10:27.063Z" }, - { url = "https://files.pythonhosted.org/packages/e9/d2/b28221abaa7b4c40b7dba948f0f6a708bd7342c4d47ce342f0ea39643974/pillow-12.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a40905599d8079e09f25027423aed94f2823adaf2868940de991e53a449e14a8", size = 6222593, upload-time = "2026-01-02T09:10:29.115Z" }, - { url = "https://files.pythonhosted.org/packages/71/b8/7a61fb234df6a9b0b479f69e66901209d89ff72a435b49933f9122f94cac/pillow-12.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:92a7fe4225365c5e3a8e598982269c6d6698d3e783b3b1ae979e7819f9cd55c1", size = 8027579, upload-time = "2026-01-02T09:10:31.182Z" }, - { url = "https://files.pythonhosted.org/packages/ea/51/55c751a57cc524a15a0e3db20e5cde517582359508d62305a627e77fd295/pillow-12.1.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f10c98f49227ed8383d28174ee95155a675c4ed7f85e2e573b04414f7e371bda", size = 6335760, upload-time = "2026-01-02T09:10:33.02Z" }, - { url = "https://files.pythonhosted.org/packages/dc/7c/60e3e6f5e5891a1a06b4c910f742ac862377a6fe842f7184df4a274ce7bf/pillow-12.1.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8637e29d13f478bc4f153d8daa9ffb16455f0a6cb287da1b432fdad2bfbd66c7", size = 7027127, upload-time = "2026-01-02T09:10:35.009Z" }, - { url = "https://files.pythonhosted.org/packages/06/37/49d47266ba50b00c27ba63a7c898f1bb41a29627ced8c09e25f19ebec0ff/pillow-12.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:21e686a21078b0f9cb8c8a961d99e6a4ddb88e0fc5ea6e130172ddddc2e5221a", size = 6449896, upload-time = "2026-01-02T09:10:36.793Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e5/67fd87d2913902462cd9b79c6211c25bfe95fcf5783d06e1367d6d9a741f/pillow-12.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2415373395a831f53933c23ce051021e79c8cd7979822d8cc478547a3f4da8ef", size = 7151345, upload-time = "2026-01-02T09:10:39.064Z" }, - { url = "https://files.pythonhosted.org/packages/bd/15/f8c7abf82af68b29f50d77c227e7a1f87ce02fdc66ded9bf603bc3b41180/pillow-12.1.0-cp310-cp310-win32.whl", hash = "sha256:e75d3dba8fc1ddfec0cd752108f93b83b4f8d6ab40e524a95d35f016b9683b09", size = 6325568, upload-time = "2026-01-02T09:10:41.035Z" }, - { url = "https://files.pythonhosted.org/packages/d4/24/7d1c0e160b6b5ac2605ef7d8be537e28753c0db5363d035948073f5513d7/pillow-12.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:64efdf00c09e31efd754448a383ea241f55a994fd079866b92d2bbff598aad91", size = 7032367, upload-time = "2026-01-02T09:10:43.09Z" }, - { url = "https://files.pythonhosted.org/packages/f4/03/41c038f0d7a06099254c60f618d0ec7be11e79620fc23b8e85e5b31d9a44/pillow-12.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:f188028b5af6b8fb2e9a76ac0f841a575bd1bd396e46ef0840d9b88a48fdbcea", size = 2452345, upload-time = "2026-01-02T09:10:44.795Z" }, - { url = "https://files.pythonhosted.org/packages/43/c4/bf8328039de6cc22182c3ef007a2abfbbdab153661c0a9aa78af8d706391/pillow-12.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:a83e0850cb8f5ac975291ebfc4170ba481f41a28065277f7f735c202cd8e0af3", size = 5304057, upload-time = "2026-01-02T09:10:46.627Z" }, - { url = "https://files.pythonhosted.org/packages/43/06/7264c0597e676104cc22ca73ee48f752767cd4b1fe084662620b17e10120/pillow-12.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6e53e82ec2db0717eabb276aa56cf4e500c9a7cec2c2e189b55c24f65a3e8c0", size = 4657811, upload-time = "2026-01-02T09:10:49.548Z" }, - { url = "https://files.pythonhosted.org/packages/72/64/f9189e44474610daf83da31145fa56710b627b5c4c0b9c235e34058f6b31/pillow-12.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:40a8e3b9e8773876d6e30daed22f016509e3987bab61b3b7fe309d7019a87451", size = 6232243, upload-time = "2026-01-02T09:10:51.62Z" }, - { url = "https://files.pythonhosted.org/packages/ef/30/0df458009be6a4caca4ca2c52975e6275c387d4e5c95544e34138b41dc86/pillow-12.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:800429ac32c9b72909c671aaf17ecd13110f823ddb7db4dfef412a5587c2c24e", size = 8037872, upload-time = "2026-01-02T09:10:53.446Z" }, - { url = "https://files.pythonhosted.org/packages/e4/86/95845d4eda4f4f9557e25381d70876aa213560243ac1a6d619c46caaedd9/pillow-12.1.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b022eaaf709541b391ee069f0022ee5b36c709df71986e3f7be312e46f42c84", size = 6345398, upload-time = "2026-01-02T09:10:55.426Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1f/8e66ab9be3aaf1435bc03edd1ebdf58ffcd17f7349c1d970cafe87af27d9/pillow-12.1.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f345e7bc9d7f368887c712aa5054558bad44d2a301ddf9248599f4161abc7c0", size = 7034667, upload-time = "2026-01-02T09:10:57.11Z" }, - { url = "https://files.pythonhosted.org/packages/f9/f6/683b83cb9b1db1fb52b87951b1c0b99bdcfceaa75febf11406c19f82cb5e/pillow-12.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d70347c8a5b7ccd803ec0c85c8709f036e6348f1e6a5bf048ecd9c64d3550b8b", size = 6458743, upload-time = "2026-01-02T09:10:59.331Z" }, - { url = "https://files.pythonhosted.org/packages/9a/7d/de833d63622538c1d58ce5395e7c6cb7e7dce80decdd8bde4a484e095d9f/pillow-12.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fcc52d86ce7a34fd17cb04e87cfdb164648a3662a6f20565910a99653d66c18", size = 7159342, upload-time = "2026-01-02T09:11:01.82Z" }, - { url = "https://files.pythonhosted.org/packages/8c/40/50d86571c9e5868c42b81fe7da0c76ca26373f3b95a8dd675425f4a92ec1/pillow-12.1.0-cp311-cp311-win32.whl", hash = "sha256:3ffaa2f0659e2f740473bcf03c702c39a8d4b2b7ffc629052028764324842c64", size = 6328655, upload-time = "2026-01-02T09:11:04.556Z" }, - { url = "https://files.pythonhosted.org/packages/6c/af/b1d7e301c4cd26cd45d4af884d9ee9b6fab893b0ad2450d4746d74a6968c/pillow-12.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:806f3987ffe10e867bab0ddad45df1148a2b98221798457fa097ad85d6e8bc75", size = 7031469, upload-time = "2026-01-02T09:11:06.538Z" }, - { url = "https://files.pythonhosted.org/packages/48/36/d5716586d887fb2a810a4a61518a327a1e21c8b7134c89283af272efe84b/pillow-12.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:9f5fefaca968e700ad1a4a9de98bf0869a94e397fe3524c4c9450c1445252304", size = 2452515, upload-time = "2026-01-02T09:11:08.226Z" }, - { url = "https://files.pythonhosted.org/packages/20/31/dc53fe21a2f2996e1b7d92bf671cdb157079385183ef7c1ae08b485db510/pillow-12.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a332ac4ccb84b6dde65dbace8431f3af08874bf9770719d32a635c4ef411b18b", size = 5262642, upload-time = "2026-01-02T09:11:10.138Z" }, - { url = "https://files.pythonhosted.org/packages/ab/c1/10e45ac9cc79419cedf5121b42dcca5a50ad2b601fa080f58c22fb27626e/pillow-12.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:907bfa8a9cb790748a9aa4513e37c88c59660da3bcfffbd24a7d9e6abf224551", size = 4657464, upload-time = "2026-01-02T09:11:12.319Z" }, - { url = "https://files.pythonhosted.org/packages/ad/26/7b82c0ab7ef40ebede7a97c72d473bda5950f609f8e0c77b04af574a0ddb/pillow-12.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:efdc140e7b63b8f739d09a99033aa430accce485ff78e6d311973a67b6bf3208", size = 6234878, upload-time = "2026-01-02T09:11:14.096Z" }, - { url = "https://files.pythonhosted.org/packages/76/25/27abc9792615b5e886ca9411ba6637b675f1b77af3104710ac7353fe5605/pillow-12.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bef9768cab184e7ae6e559c032e95ba8d07b3023c289f79a2bd36e8bf85605a5", size = 8044868, upload-time = "2026-01-02T09:11:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ea/f200a4c36d836100e7bc738fc48cd963d3ba6372ebc8298a889e0cfc3359/pillow-12.1.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:742aea052cf5ab5034a53c3846165bc3ce88d7c38e954120db0ab867ca242661", size = 6349468, upload-time = "2026-01-02T09:11:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/11/8f/48d0b77ab2200374c66d344459b8958c86693be99526450e7aee714e03e4/pillow-12.1.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6dfc2af5b082b635af6e08e0d1f9f1c4e04d17d4e2ca0ef96131e85eda6eb17", size = 7041518, upload-time = "2026-01-02T09:11:19.389Z" }, - { url = "https://files.pythonhosted.org/packages/1d/23/c281182eb986b5d31f0a76d2a2c8cd41722d6fb8ed07521e802f9bba52de/pillow-12.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:609e89d9f90b581c8d16358c9087df76024cf058fa693dd3e1e1620823f39670", size = 6462829, upload-time = "2026-01-02T09:11:21.28Z" }, - { url = "https://files.pythonhosted.org/packages/25/ef/7018273e0faac099d7b00982abdcc39142ae6f3bd9ceb06de09779c4a9d6/pillow-12.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43b4899cfd091a9693a1278c4982f3e50f7fb7cff5153b05174b4afc9593b616", size = 7166756, upload-time = "2026-01-02T09:11:23.559Z" }, - { url = "https://files.pythonhosted.org/packages/8f/c8/993d4b7ab2e341fe02ceef9576afcf5830cdec640be2ac5bee1820d693d4/pillow-12.1.0-cp312-cp312-win32.whl", hash = "sha256:aa0c9cc0b82b14766a99fbe6084409972266e82f459821cd26997a488a7261a7", size = 6328770, upload-time = "2026-01-02T09:11:25.661Z" }, - { url = "https://files.pythonhosted.org/packages/a7/87/90b358775a3f02765d87655237229ba64a997b87efa8ccaca7dd3e36e7a7/pillow-12.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:d70534cea9e7966169ad29a903b99fc507e932069a881d0965a1a84bb57f6c6d", size = 7033406, upload-time = "2026-01-02T09:11:27.474Z" }, - { url = "https://files.pythonhosted.org/packages/5d/cf/881b457eccacac9e5b2ddd97d5071fb6d668307c57cbf4e3b5278e06e536/pillow-12.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:65b80c1ee7e14a87d6a068dd3b0aea268ffcabfe0498d38661b00c5b4b22e74c", size = 2452612, upload-time = "2026-01-02T09:11:29.309Z" }, - { url = "https://files.pythonhosted.org/packages/8b/bc/224b1d98cffd7164b14707c91aac83c07b047fbd8f58eba4066a3e53746a/pillow-12.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ca94b6aac0d7af2a10ba08c0f888b3d5114439b6b3ef39968378723622fed377", size = 5228605, upload-time = "2026-01-02T09:13:14.084Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ca/49ca7769c4550107de049ed85208240ba0f330b3f2e316f24534795702ce/pillow-12.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:351889afef0f485b84078ea40fe33727a0492b9af3904661b0abbafee0355b72", size = 4622245, upload-time = "2026-01-02T09:13:15.964Z" }, - { url = "https://files.pythonhosted.org/packages/73/48/fac807ce82e5955bcc2718642b94b1bd22a82a6d452aea31cbb678cddf12/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb0984b30e973f7e2884362b7d23d0a348c7143ee559f38ef3eaab640144204c", size = 5247593, upload-time = "2026-01-02T09:13:17.913Z" }, - { url = "https://files.pythonhosted.org/packages/d2/95/3e0742fe358c4664aed4fd05d5f5373dcdad0b27af52aa0972568541e3f4/pillow-12.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:84cabc7095dd535ca934d57e9ce2a72ffd216e435a84acb06b2277b1de2689bd", size = 6989008, upload-time = "2026-01-02T09:13:20.083Z" }, - { url = "https://files.pythonhosted.org/packages/5a/74/fe2ac378e4e202e56d50540d92e1ef4ff34ed687f3c60f6a121bcf99437e/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53d8b764726d3af1a138dd353116f774e3862ec7e3794e0c8781e30db0f35dfc", size = 5313824, upload-time = "2026-01-02T09:13:22.405Z" }, - { url = "https://files.pythonhosted.org/packages/f3/77/2a60dee1adee4e2655ac328dd05c02a955c1cd683b9f1b82ec3feb44727c/pillow-12.1.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5da841d81b1a05ef940a8567da92decaa15bc4d7dedb540a8c219ad83d91808a", size = 5963278, upload-time = "2026-01-02T09:13:24.706Z" }, - { url = "https://files.pythonhosted.org/packages/2d/71/64e9b1c7f04ae0027f788a248e6297d7fcc29571371fe7d45495a78172c0/pillow-12.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:75af0b4c229ac519b155028fa1be632d812a519abba9b46b20e50c6caa184f19", size = 7029809, upload-time = "2026-01-02T09:13:26.541Z" }, -] - [[package]] name = "platformdirs" version = "4.5.1" @@ -3085,47 +2493,12 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pastel" }, { name = "pyyaml" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/38/9d/054c8435b03324ed9abd5d5ab8c45065b1f42c23952cd23f13a5921d8465/poethepoet-0.40.0.tar.gz", hash = "sha256:91835f00d03d6c4f0e146f80fa510e298ad865e7edd27fe4cb9c94fdc090791b", size = 81114, upload-time = "2026-01-05T19:09:13.116Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fb/bc/73327d12b176abea7a3c6c7d760e1a953992f7b59d72c0354e39d7a353b5/poethepoet-0.40.0-py3-none-any.whl", hash = "sha256:afd276ae31d5c53573c0c14898118d4848ccee3709b6b0be6a1c6cbe522bbc8a", size = 106672, upload-time = "2026-01-05T19:09:11.536Z" }, ] -[[package]] -name = "pot" -version = "0.9.6.post1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/8b/5f939eaf1fbeb7ff914fe540d659486951a056e5537b8f454362045b6c72/pot-0.9.6.post1.tar.gz", hash = "sha256:9b6cc14a8daecfe1268268168cf46548f9130976b22b24a9e8ec62a734be6c43", size = 604243, upload-time = "2025-09-22T12:51:14.894Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/65/3ed0362444818585d62521f9bf5e6166b8626a714354bc2c8ea5fbdbcbe6/pot-0.9.6.post1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2127b310a13f03951be450812e7dfdf62c5484bc6219bd0e0639f0347b3b60dd", size = 595401, upload-time = "2025-09-22T12:50:23.421Z" }, - { url = "https://files.pythonhosted.org/packages/07/9b/5145c4264953f03f054d4dc4ce1d8f337eb5827896f9e6a51267432ab86d/pot-0.9.6.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef7d50dbc851d8b69a6c5305fcad197f149047093e5f4555aed1ea77d1d7823b", size = 464517, upload-time = "2025-09-22T12:50:25.003Z" }, - { url = "https://files.pythonhosted.org/packages/83/23/9724a5a1ebfd4769377d5293208465ef8e803fbcf85350d5d38af349cbea/pot-0.9.6.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1de9cf2af8920c5902f1ee779cf2bf388d5677618735ce91f65d7f8e0ead629e", size = 450810, upload-time = "2025-09-22T12:50:26.28Z" }, - { url = "https://files.pythonhosted.org/packages/df/e9/f8f343588d2a18cd0c77fcf6b6f275642dea3cdf4f0e28e16c6e78198aec/pot-0.9.6.post1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b17c1373366f8ebd745d159793f415660ec45e69048305bb8597267d900145ab", size = 1459588, upload-time = "2025-09-22T12:50:27.739Z" }, - { url = "https://files.pythonhosted.org/packages/5b/7d/1529014aebb9d5fd54538115886d005d371a624b1ecaf5c2525b45ad0f77/pot-0.9.6.post1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48924f34d61b909e68651f3fe9fc1a892c69ae38d3c52bc832f95a28569c0e0e", size = 1478099, upload-time = "2025-09-22T12:50:29.201Z" }, - { url = "https://files.pythonhosted.org/packages/4e/87/84cfc49d4d0eb3e7b6cfc8352f0e73f62d456f6ce875da612b919a6bff6f/pot-0.9.6.post1-cp310-cp310-win32.whl", hash = "sha256:06e21b4dcebc2e8e318a96889243580ea64364830d05d53c4d038afedbe072cc", size = 443775, upload-time = "2025-09-22T12:50:30.84Z" }, - { url = "https://files.pythonhosted.org/packages/c4/21/9731ac0b125f755bb513a4ee081dca0ca5335e9059fb3332dd7c50d28415/pot-0.9.6.post1-cp310-cp310-win_amd64.whl", hash = "sha256:d35bb0169ef242fc2ce4f610572a5d11ac11d646698cbdf8cbb45d828f3c514b", size = 458481, upload-time = "2025-09-22T12:50:32.431Z" }, - { url = "https://files.pythonhosted.org/packages/f6/fc/3f4014bd6713c5b4c8a329b12c52842443b2284f52213a80e697b76b9f20/pot-0.9.6.post1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7fd8482a0262e5c875c05cf52e9c087e7c8bc473ef05d175887ad16e3c0443b7", size = 599499, upload-time = "2025-09-22T12:50:33.796Z" }, - { url = "https://files.pythonhosted.org/packages/e7/4e/b22b789ee3a81c11c6f39ff08ed6a2e797a2a75a831fae996f4057db4771/pot-0.9.6.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c0bfac9daec0095061279a709f52be740e09363a62fe4c7edc843a4a0f6144c6", size = 466484, upload-time = "2025-09-22T12:50:34.973Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ae/2b35b96562bd72baf6de9583458878738f4508eef70d6fa9dd5867760d6a/pot-0.9.6.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:703853f7ba0ae2afed8203ea3478e87ef5f39d55cd75b1a39bb622867d1d5628", size = 453014, upload-time = "2025-09-22T12:50:36.157Z" }, - { url = "https://files.pythonhosted.org/packages/44/7e/f49d0593338a3b7f2c88c4cd6f1285c084e8ce05d52d42ac6f89f4f7ec0c/pot-0.9.6.post1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:68268b4dd926976cf0604d466a57dff2ca44372e8ae9c879ba1f3d2a51e3be3d", size = 1494875, upload-time = "2025-09-22T12:50:37.903Z" }, - { url = "https://files.pythonhosted.org/packages/15/91/844c8437caaca6d6a71b38623df75c43642a116d399316adb1d0a9280c85/pot-0.9.6.post1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7568ddc957d3a16739bd24f9e07ce655166d27ebbc8786aad692cc5ba5d4c59", size = 1514551, upload-time = "2025-09-22T12:50:39.616Z" }, - { url = "https://files.pythonhosted.org/packages/ac/de/34a50565c37c0b71725a8075ff1ad2de62213d2e119276b546ef20356ac2/pot-0.9.6.post1-cp311-cp311-win32.whl", hash = "sha256:9649b736ea5dddad3a89d55a4a3bb0078610307ba64cac2efebe6bfcf8cfe785", size = 443490, upload-time = "2025-09-22T12:50:41.162Z" }, - { url = "https://files.pythonhosted.org/packages/a7/fa/453730c1b10094ab4d2ecd0b5fbfcdfe0305419cf01e32a2d31efd333559/pot-0.9.6.post1-cp311-cp311-win_amd64.whl", hash = "sha256:e161e49a22d5a925993baace4679f4e32fc2ade8f45ad73cf8417e13df5bd337", size = 458509, upload-time = "2025-09-22T12:50:43.597Z" }, - { url = "https://files.pythonhosted.org/packages/b9/28/13622807461f9f6082a8cd6768f9b4a810bc3a8fda474b81572da94b4d23/pot-0.9.6.post1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f7c542fc20662e35c24dd82eeff8a737220757434d7f0038664a7322221452f7", size = 599240, upload-time = "2025-09-22T12:50:44.848Z" }, - { url = "https://files.pythonhosted.org/packages/c6/5c/b4e017560531f53d06798c681b0d0a9488bb8116bc98da9d399a3d096391/pot-0.9.6.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c1755516a7354cbd6110ad2e5f341b98b9968240c2f0f67b0ff5e3ebcb3105bd", size = 464695, upload-time = "2025-09-22T12:50:46.341Z" }, - { url = "https://files.pythonhosted.org/packages/07/9f/57e49b3f7173359741053c5e2766a45dcf649d767c2e967ef93526c9045f/pot-0.9.6.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3207362d3e3b5aaa783f452aa85f66e83edbefb5764f34662860af54ac72ee6", size = 454726, upload-time = "2025-09-22T12:50:47.953Z" }, - { url = "https://files.pythonhosted.org/packages/30/60/fa72dd6094f7dbe6b38e2c6907af8cd0f18c6bd107e0cf4874deddaba883/pot-0.9.6.post1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f6659c5657e6d7e9f98f4a82e0ed64f88e9fce69b2e557416d156343919ba3", size = 1503391, upload-time = "2025-09-22T12:50:49.336Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3f/cc519c1176116271b6282268a705162fa042c16cc922bc56039445c9d697/pot-0.9.6.post1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f1b0148ae17bec0ed12264c6da3a05e13913b716e2a8c9043242b5d8349d8df", size = 1528170, upload-time = "2025-09-22T12:50:50.625Z" }, - { url = "https://files.pythonhosted.org/packages/f5/01/0132c94404cd0b1b2f21c4a49698db9dcd6107c47c02b22df1ed38206b2a/pot-0.9.6.post1-cp312-cp312-win32.whl", hash = "sha256:571e543cc2b0a462365002203595baf2b89c3d064cce4fce70fd1231e832c21f", size = 440577, upload-time = "2025-09-22T12:50:51.716Z" }, - { url = "https://files.pythonhosted.org/packages/c1/6d/23229c0e198a4f7fb27750b3ef8497e6ebed23fe531ed64b5194da8b2b02/pot-0.9.6.post1-cp312-cp312-win_amd64.whl", hash = "sha256:b1d8bd9a334c72baa37f9a2b268de5366c23c0f9c9e3d6dc25d150137ec2823c", size = 455404, upload-time = "2025-09-22T12:50:52.956Z" }, -] - [[package]] name = "preshed" version = "3.0.12" @@ -3136,14 +2509,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/bf/34/eb4f5f0f678e152a96e826da867d2f41c4b18a2d589e40e1dd3347219e91/preshed-3.0.12.tar.gz", hash = "sha256:b73f9a8b54ee1d44529cc6018356896cff93d48f755f29c134734d9371c0d685", size = 15027, upload-time = "2025-11-17T13:00:33.621Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/d0/1245d6d89b051dd5356ffaaa43da05408f37d2da4cfadcf77356ba46da4f/preshed-3.0.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d8f0bc207bb5bfe69e3a232367c264cac900dc14e9219cd061b98eaca9e7da61", size = 128866, upload-time = "2025-11-17T12:59:06.633Z" }, - { url = "https://files.pythonhosted.org/packages/24/24/f06650f22450888434a51b17971b650186d2e68f5eaf292e6e8e4be7974c/preshed-3.0.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0c8a8d571c044ddab5369d30d172c87545f44daa1510bde92b7e0144a8f4f92b", size = 124848, upload-time = "2025-11-17T12:59:08.641Z" }, - { url = "https://files.pythonhosted.org/packages/88/a1/78bdd4938c3286998c0609491c4a0a8aee2f4de4003364112c295a2f32b8/preshed-3.0.12-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6cca080ac9bbc978625c8f0c56ef17471162193c7c1a4622fbde7721da1bdd40", size = 780279, upload-time = "2025-11-17T12:59:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/8f/f8/6fbf083346a007927a9e4ce3686ae54ba74191e74fc3af34863ea7be9dea/preshed-3.0.12-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cfd3672007c7b7cac554a0e5f263d7bc94109dc508ee1ef43b2f6ec8c2e2e9e8", size = 781954, upload-time = "2025-11-17T12:59:11.574Z" }, - { url = "https://files.pythonhosted.org/packages/91/c3/f28c7a6cc03e85002780b75249c3557c0fe503792ac66a7b9c5379569999/preshed-3.0.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e01609074713aba93a8143480e67942fbe6898fe134b98d813819bec42a8cae7", size = 799772, upload-time = "2025-11-17T12:59:14.371Z" }, - { url = "https://files.pythonhosted.org/packages/46/25/ca22fa0db162e286db7a94a4f08c1ceb4872d3d64610b807148935ae084c/preshed-3.0.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:30d8a53015663b0d666012bc10d22e8bdd7359191d84a8980ae902e0b87caf24", size = 820532, upload-time = "2025-11-17T12:59:16.281Z" }, - { url = "https://files.pythonhosted.org/packages/0f/57/459a6eea7e15034756f4c2650a9aba6d023aa7976748b18476bd4c0b6fef/preshed-3.0.12-cp310-cp310-win_amd64.whl", hash = "sha256:bf2235bbe09b4862b914086f37a065cc84259e1b53c8ed996cbbd6519ea36b62", size = 117482, upload-time = "2025-11-17T12:59:18.36Z" }, - { url = "https://files.pythonhosted.org/packages/80/1f/a7b648a57d259891bd9b2c8ef1978622fa37b46a9368f054881488b9b4fe/preshed-3.0.12-cp310-cp310-win_arm64.whl", hash = "sha256:139d08b10693bfccb0ea000f47dcca5fc4a78fc1b96c1832c920be9b0a4c8f04", size = 105504, upload-time = "2025-11-17T12:59:19.562Z" }, { url = "https://files.pythonhosted.org/packages/1e/54/d1e02d0a0ea348fb6a769506166e366abfe87ee917c2f11f7139c7acbf10/preshed-3.0.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc45fda3fd4ae1ae15c37f18f0777cf389ce9184ef8884b39b18894416fd1341", size = 128439, upload-time = "2025-11-17T12:59:21.317Z" }, { url = "https://files.pythonhosted.org/packages/8c/cb/685ca57ca6e438345b3f6c20226705a0e056a3de399a5bf8a9ee89b3dd2b/preshed-3.0.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75d6e628bc78c022dbb9267242715718f862c3105927732d166076ff009d65de", size = 124544, upload-time = "2025-11-17T12:59:22.944Z" }, { url = "https://files.pythonhosted.org/packages/f8/07/018fcd3bf298304e1570065cf80601ac16acd29f799578fd47b715dd3ca2/preshed-3.0.12-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b901cff5c814facf7a864b0a4c14a16d45fa1379899a585b3fb48ee36a2dccdb", size = 824728, upload-time = "2025-11-17T12:59:24.614Z" }, @@ -3189,21 +2554,6 @@ version = "0.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, - { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, - { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, - { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, - { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, - { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, - { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, - { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, - { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, - { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, @@ -3237,6 +2587,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] +[[package]] +name = "protobuf" +version = "6.33.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/b8/cda15d9d46d03d4aa3a67cb6bffe05173440ccf86a9541afaf7ac59a1b6b/protobuf-6.33.4.tar.gz", hash = "sha256:dc2e61bca3b10470c1912d166fe0af67bfc20eb55971dcef8dfa48ce14f0ed91", size = 444346, upload-time = "2026-01-12T18:33:40.109Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/be/24ef9f3095bacdf95b458543334d0c4908ccdaee5130420bf064492c325f/protobuf-6.33.4-cp310-abi3-win32.whl", hash = "sha256:918966612c8232fc6c24c78e1cd89784307f5814ad7506c308ee3cf86662850d", size = 425612, upload-time = "2026-01-12T18:33:29.656Z" }, + { url = "https://files.pythonhosted.org/packages/31/ad/e5693e1974a28869e7cd244302911955c1cebc0161eb32dfa2b25b6e96f0/protobuf-6.33.4-cp310-abi3-win_amd64.whl", hash = "sha256:8f11ffae31ec67fc2554c2ef891dcb561dae9a2a3ed941f9e134c2db06657dbc", size = 436962, upload-time = "2026-01-12T18:33:31.345Z" }, + { url = "https://files.pythonhosted.org/packages/66/15/6ee23553b6bfd82670207ead921f4d8ef14c107e5e11443b04caeb5ab5ec/protobuf-6.33.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2fe67f6c014c84f655ee06f6f66213f9254b3a8b6bda6cda0ccd4232c73c06f0", size = 427612, upload-time = "2026-01-12T18:33:32.646Z" }, + { url = "https://files.pythonhosted.org/packages/2b/48/d301907ce6d0db75f959ca74f44b475a9caa8fcba102d098d3c3dd0f2d3f/protobuf-6.33.4-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:757c978f82e74d75cba88eddec479df9b99a42b31193313b75e492c06a51764e", size = 324484, upload-time = "2026-01-12T18:33:33.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/1c/e53078d3f7fe710572ab2dcffd993e1e3b438ae71cfc031b71bae44fcb2d/protobuf-6.33.4-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c7c64f259c618f0bef7bee042075e390debbf9682334be2b67408ec7c1c09ee6", size = 339256, upload-time = "2026-01-12T18:33:35.231Z" }, + { url = "https://files.pythonhosted.org/packages/e8/8e/971c0edd084914f7ee7c23aa70ba89e8903918adca179319ee94403701d5/protobuf-6.33.4-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:3df850c2f8db9934de4cf8f9152f8dc2558f49f298f37f90c517e8e5c84c30e9", size = 323311, upload-time = "2026-01-12T18:33:36.305Z" }, + { url = "https://files.pythonhosted.org/packages/75/b1/1dc83c2c661b4c62d56cc081706ee33a4fc2835bd90f965baa2663ef7676/protobuf-6.33.4-py3-none-any.whl", hash = "sha256:1fe3730068fcf2e595816a6c34fe66eeedd37d51d0400b72fabc848811fdc1bc", size = 170532, upload-time = "2026-01-12T18:33:39.199Z" }, +] + [[package]] name = "psutil" version = "7.2.1" @@ -3273,31 +2638,24 @@ wheels = [ [[package]] name = "pyarrow" -version = "23.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/33/ffd9c3eb087fa41dd79c3cf20c4c0ae3cdb877c4f8e1107a446006344924/pyarrow-23.0.0.tar.gz", hash = "sha256:180e3150e7edfcd182d3d9afba72f7cf19839a497cc76555a8dce998a8f67615", size = 1167185, upload-time = "2026-01-18T16:19:42.218Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/2f/23e042a5aa99bcb15e794e14030e8d065e00827e846e53a66faec73c7cd6/pyarrow-23.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cbdc2bf5947aa4d462adcf8453cf04aee2f7932653cb67a27acd96e5e8528a67", size = 34281861, upload-time = "2026-01-18T16:13:34.332Z" }, - { url = "https://files.pythonhosted.org/packages/8b/65/1651933f504b335ec9cd8f99463718421eb08d883ed84f0abd2835a16cad/pyarrow-23.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:4d38c836930ce15cd31dce20114b21ba082da231c884bdc0a7b53e1477fe7f07", size = 35825067, upload-time = "2026-01-18T16:13:42.549Z" }, - { url = "https://files.pythonhosted.org/packages/84/ec/d6fceaec050c893f4e35c0556b77d4cc9973fcc24b0a358a5781b1234582/pyarrow-23.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:4222ff8f76919ecf6c716175a0e5fddb5599faeed4c56d9ea41a2c42be4998b2", size = 44458539, upload-time = "2026-01-18T16:13:52.975Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d9/369f134d652b21db62fe3ec1c5c2357e695f79eb67394b8a93f3a2b2cffa/pyarrow-23.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:87f06159cbe38125852657716889296c83c37b4d09a5e58f3d10245fd1f69795", size = 47535889, upload-time = "2026-01-18T16:14:03.693Z" }, - { url = "https://files.pythonhosted.org/packages/a3/95/f37b6a252fdbf247a67a78fb3f61a529fe0600e304c4d07741763d3522b1/pyarrow-23.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1675c374570d8b91ea6d4edd4608fa55951acd44e0c31bd146e091b4005de24f", size = 48157777, upload-time = "2026-01-18T16:14:12.483Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ab/fb94923108c9c6415dab677cf1f066d3307798eafc03f9a65ab4abc61056/pyarrow-23.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:247374428fde4f668f138b04031a7e7077ba5fa0b5b1722fdf89a017bf0b7ee0", size = 50580441, upload-time = "2026-01-18T16:14:20.187Z" }, - { url = "https://files.pythonhosted.org/packages/ae/78/897ba6337b517fc8e914891e1bd918da1c4eb8e936a553e95862e67b80f6/pyarrow-23.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:de53b1bd3b88a2ee93c9af412c903e57e738c083be4f6392288294513cd8b2c1", size = 27530028, upload-time = "2026-01-18T16:14:27.353Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c0/57fe251102ca834fee0ef69a84ad33cc0ff9d5dfc50f50b466846356ecd7/pyarrow-23.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5574d541923efcbfdf1294a2746ae3b8c2498a2dc6cd477882f6f4e7b1ac08d3", size = 34276762, upload-time = "2026-01-18T16:14:34.128Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4e/24130286548a5bc250cbed0b6bbf289a2775378a6e0e6f086ae8c68fc098/pyarrow-23.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:2ef0075c2488932e9d3c2eb3482f9459c4be629aa673b725d5e3cf18f777f8e4", size = 35821420, upload-time = "2026-01-18T16:14:40.699Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/a869e8529d487aa2e842d6c8865eb1e2c9ec33ce2786eb91104d2c3e3f10/pyarrow-23.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:65666fc269669af1ef1c14478c52222a2aa5c907f28b68fb50a203c777e4f60c", size = 44457412, upload-time = "2026-01-18T16:14:49.051Z" }, - { url = "https://files.pythonhosted.org/packages/36/81/1de4f0edfa9a483bbdf0082a05790bd6a20ed2169ea12a65039753be3a01/pyarrow-23.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:4d85cb6177198f3812db4788e394b757223f60d9a9f5ad6634b3e32be1525803", size = 47534285, upload-time = "2026-01-18T16:14:56.748Z" }, - { url = "https://files.pythonhosted.org/packages/f2/04/464a052d673b5ece074518f27377861662449f3c1fdb39ce740d646fd098/pyarrow-23.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1a9ff6fa4141c24a03a1a434c63c8fa97ce70f8f36bccabc18ebba905ddf0f17", size = 48157913, upload-time = "2026-01-18T16:15:05.114Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1b/32a4de9856ee6688c670ca2def588382e573cce45241a965af04c2f61687/pyarrow-23.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:84839d060a54ae734eb60a756aeacb62885244aaa282f3c968f5972ecc7b1ecc", size = 50582529, upload-time = "2026-01-18T16:15:12.846Z" }, - { url = "https://files.pythonhosted.org/packages/db/c7/d6581f03e9b9e44ea60b52d1750ee1a7678c484c06f939f45365a45f7eef/pyarrow-23.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a149a647dbfe928ce8830a713612aa0b16e22c64feac9d1761529778e4d4eaa5", size = 27542646, upload-time = "2026-01-18T16:15:18.89Z" }, - { url = "https://files.pythonhosted.org/packages/3d/bd/c861d020831ee57609b73ea721a617985ece817684dc82415b0bc3e03ac3/pyarrow-23.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5961a9f646c232697c24f54d3419e69b4261ba8a8b66b0ac54a1851faffcbab8", size = 34189116, upload-time = "2026-01-18T16:15:28.054Z" }, - { url = "https://files.pythonhosted.org/packages/8c/23/7725ad6cdcbaf6346221391e7b3eecd113684c805b0a95f32014e6fa0736/pyarrow-23.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:632b3e7c3d232f41d64e1a4a043fb82d44f8a349f339a1188c6a0dd9d2d47d8a", size = 35803831, upload-time = "2026-01-18T16:15:33.798Z" }, - { url = "https://files.pythonhosted.org/packages/57/06/684a421543455cdc2944d6a0c2cc3425b028a4c6b90e34b35580c4899743/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:76242c846db1411f1d6c2cc3823be6b86b40567ee24493344f8226ba34a81333", size = 44436452, upload-time = "2026-01-18T16:15:41.598Z" }, - { url = "https://files.pythonhosted.org/packages/c6/6f/8f9eb40c2328d66e8b097777ddcf38494115ff9f1b5bc9754ba46991191e/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b73519f8b52ae28127000986bf228fda781e81d3095cd2d3ece76eb5cf760e1b", size = 47557396, upload-time = "2026-01-18T16:15:51.252Z" }, - { url = "https://files.pythonhosted.org/packages/10/6e/f08075f1472e5159553501fde2cc7bc6700944bdabe49a03f8a035ee6ccd/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:068701f6823449b1b6469120f399a1239766b117d211c5d2519d4ed5861f75de", size = 48147129, upload-time = "2026-01-18T16:16:00.299Z" }, - { url = "https://files.pythonhosted.org/packages/7d/82/d5a680cd507deed62d141cc7f07f7944a6766fc51019f7f118e4d8ad0fb8/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1801ba947015d10e23bca9dd6ef5d0e9064a81569a89b6e9a63b59224fd060df", size = 50596642, upload-time = "2026-01-18T16:16:08.502Z" }, - { url = "https://files.pythonhosted.org/packages/a9/26/4f29c61b3dce9fa7780303b86895ec6a0917c9af927101daaaf118fbe462/pyarrow-23.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:52265266201ec25b6839bf6bd4ea918ca6d50f31d13e1cf200b4261cd11dc25c", size = 27660628, upload-time = "2026-01-18T16:16:15.28Z" }, +version = "22.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/53/04a7fdc63e6056116c9ddc8b43bc28c12cdd181b85cbeadb79278475f3ae/pyarrow-22.0.0.tar.gz", hash = "sha256:3d600dc583260d845c7d8a6db540339dd883081925da2bd1c5cb808f720b3cd9", size = 1151151, upload-time = "2025-10-24T12:30:00.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/b7/18f611a8cdc43417f9394a3ccd3eace2f32183c08b9eddc3d17681819f37/pyarrow-22.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:3e294c5eadfb93d78b0763e859a0c16d4051fc1c5231ae8956d61cb0b5666f5a", size = 34272022, upload-time = "2025-10-24T10:04:28.973Z" }, + { url = "https://files.pythonhosted.org/packages/26/5c/f259e2526c67eb4b9e511741b19870a02363a47a35edbebc55c3178db22d/pyarrow-22.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:69763ab2445f632d90b504a815a2a033f74332997052b721002298ed6de40f2e", size = 35995834, upload-time = "2025-10-24T10:04:35.467Z" }, + { url = "https://files.pythonhosted.org/packages/50/8d/281f0f9b9376d4b7f146913b26fac0aa2829cd1ee7e997f53a27411bbb92/pyarrow-22.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:b41f37cabfe2463232684de44bad753d6be08a7a072f6a83447eeaf0e4d2a215", size = 45030348, upload-time = "2025-10-24T10:04:43.366Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e5/53c0a1c428f0976bf22f513d79c73000926cb00b9c138d8e02daf2102e18/pyarrow-22.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:35ad0f0378c9359b3f297299c3309778bb03b8612f987399a0333a560b43862d", size = 47699480, upload-time = "2025-10-24T10:04:51.486Z" }, + { url = "https://files.pythonhosted.org/packages/95/e1/9dbe4c465c3365959d183e6345d0a8d1dc5b02ca3f8db4760b3bc834cf25/pyarrow-22.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8382ad21458075c2e66a82a29d650f963ce51c7708c7c0ff313a8c206c4fd5e8", size = 48011148, upload-time = "2025-10-24T10:04:59.585Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b4/7caf5d21930061444c3cf4fa7535c82faf5263e22ce43af7c2759ceb5b8b/pyarrow-22.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1a812a5b727bc09c3d7ea072c4eebf657c2f7066155506ba31ebf4792f88f016", size = 50276964, upload-time = "2025-10-24T10:05:08.175Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f3/cec89bd99fa3abf826f14d4e53d3d11340ce6f6af4d14bdcd54cd83b6576/pyarrow-22.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:ec5d40dd494882704fb876c16fa7261a69791e784ae34e6b5992e977bd2e238c", size = 28106517, upload-time = "2025-10-24T10:05:14.314Z" }, + { url = "https://files.pythonhosted.org/packages/af/63/ba23862d69652f85b615ca14ad14f3bcfc5bf1b99ef3f0cd04ff93fdad5a/pyarrow-22.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bea79263d55c24a32b0d79c00a1c58bb2ee5f0757ed95656b01c0fb310c5af3d", size = 34211578, upload-time = "2025-10-24T10:05:21.583Z" }, + { url = "https://files.pythonhosted.org/packages/b1/d0/f9ad86fe809efd2bcc8be32032fa72e8b0d112b01ae56a053006376c5930/pyarrow-22.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:12fe549c9b10ac98c91cf791d2945e878875d95508e1a5d14091a7aaa66d9cf8", size = 35989906, upload-time = "2025-10-24T10:05:29.485Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a8/f910afcb14630e64d673f15904ec27dd31f1e009b77033c365c84e8c1e1d/pyarrow-22.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:334f900ff08ce0423407af97e6c26ad5d4e3b0763645559ece6fbf3747d6a8f5", size = 45021677, upload-time = "2025-10-24T10:05:38.274Z" }, + { url = "https://files.pythonhosted.org/packages/13/95/aec81f781c75cd10554dc17a25849c720d54feafb6f7847690478dcf5ef8/pyarrow-22.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:c6c791b09c57ed76a18b03f2631753a4960eefbbca80f846da8baefc6491fcfe", size = 47726315, upload-time = "2025-10-24T10:05:47.314Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d4/74ac9f7a54cfde12ee42734ea25d5a3c9a45db78f9def949307a92720d37/pyarrow-22.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c3200cb41cdbc65156e5f8c908d739b0dfed57e890329413da2748d1a2cd1a4e", size = 47990906, upload-time = "2025-10-24T10:05:58.254Z" }, + { url = "https://files.pythonhosted.org/packages/2e/71/fedf2499bf7a95062eafc989ace56572f3343432570e1c54e6599d5b88da/pyarrow-22.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ac93252226cf288753d8b46280f4edf3433bf9508b6977f8dd8526b521a1bbb9", size = 50306783, upload-time = "2025-10-24T10:06:08.08Z" }, + { url = "https://files.pythonhosted.org/packages/68/ed/b202abd5a5b78f519722f3d29063dda03c114711093c1995a33b8e2e0f4b/pyarrow-22.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:44729980b6c50a5f2bfcc2668d36c569ce17f8b17bccaf470c4313dcbbf13c9d", size = 27972883, upload-time = "2025-10-24T10:06:14.204Z" }, ] [[package]] @@ -3333,19 +2691,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, - { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, - { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, - { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, - { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, - { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, - { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, @@ -3382,14 +2727,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, - { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, - { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, - { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, - { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, - { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, @@ -3425,42 +2762,24 @@ crypto = [ [[package]] name = "pymdown-extensions" -version = "10.20" +version = "10.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3e/35/e3814a5b7df295df69d035cfb8aab78b2967cdf11fcfae7faed726b66664/pymdown_extensions-10.20.tar.gz", hash = "sha256:5c73566ab0cf38c6ba084cb7c5ea64a119ae0500cce754ccb682761dfea13a52", size = 852774, upload-time = "2025-12-31T19:59:42.211Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/6c/9e370934bfa30e889d12e61d0dae009991294f40055c238980066a7fbd83/pymdown_extensions-10.20.1.tar.gz", hash = "sha256:e7e39c865727338d434b55f1dd8da51febcffcaebd6e1a0b9c836243f660740a", size = 852860, upload-time = "2026-01-24T05:56:56.758Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/10/47caf89cbb52e5bb764696fd52a8c591a2f0e851a93270c05a17f36000b5/pymdown_extensions-10.20-py3-none-any.whl", hash = "sha256:ea9e62add865da80a271d00bfa1c0fa085b20d133fb3fc97afdc88e682f60b2f", size = 268733, upload-time = "2025-12-31T19:59:40.652Z" }, + { url = "https://files.pythonhosted.org/packages/40/6d/b6ee155462a0156b94312bdd82d2b92ea56e909740045a87ccb98bf52405/pymdown_extensions-10.20.1-py3-none-any.whl", hash = "sha256:24af7feacbca56504b313b7b418c4f5e1317bb5fea60f03d57be7fcc40912aa0", size = 268768, upload-time = "2026-01-24T05:56:54.537Z" }, ] [[package]] -name = "pynndescent" -version = "0.6.0" +name = "pyreadline3" +version = "3.5.4" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "joblib" }, - { name = "llvmlite" }, - { name = "numba" }, - { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4a/fb/7f58c397fb31666756457ee2ac4c0289ef2daad57f4ae4be8dec12f80b03/pynndescent-0.6.0.tar.gz", hash = "sha256:7ffde0fb5b400741e055a9f7d377e3702e02250616834231f6c209e39aac24f5", size = 2992987, upload-time = "2026-01-08T21:29:58.943Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/e6/94145d714402fd5ade00b5661f2d0ab981219e07f7db9bfa16786cdb9c04/pynndescent-0.6.0-py3-none-any.whl", hash = "sha256:dc8c74844e4c7f5cbd1e0cd6909da86fdc789e6ff4997336e344779c3d5538ef", size = 73511, upload-time = "2026-01-08T21:29:57.306Z" }, -] - -[[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" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/49/4cea918a08f02817aabae639e3d0ac046fef9f9180518a3ad394e22da148/pyreadline3-3.5.4.tar.gz", hash = "sha256:8d57d53039a1c75adba8e50dd3d992b28143480816187ea5efbd5c78e6c885b7", size = 99839, upload-time = "2024-09-19T02:40:10.062Z" } 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" }, + { url = "https://files.pythonhosted.org/packages/5a/dc/491b7661614ab97483abf2056be1deee4dc2490ecbf7bff9ab5cdbac86e1/pyreadline3-3.5.4-py3-none-any.whl", hash = "sha256:eaf8e6cc3c49bcccf145fc6067ba8643d1df34d604a1ec0eccbf7a18e6d3fae6", size = 83178, upload-time = "2024-09-19T02:40:08.598Z" }, ] [[package]] @@ -3478,34 +2797,30 @@ wheels = [ [[package]] name = "pytest" -version = "9.0.2" +version = "8.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" }, ] [[package]] name = "pytest-asyncio" -version = "1.3.0" +version = "0.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" }, { name = "pytest" }, - { name = "typing-extensions" }, ] -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" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156, upload-time = "2025-03-25T06:22:28.883Z" } 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" }, + { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694, upload-time = "2025-03-25T06:22:27.807Z" }, ] [[package]] @@ -3533,6 +2848,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/b6/3127540ecdf1464a00e5a01ee60a1b09175f6913f0644ac748494d9c4b21/pytest_timeout-2.4.0-py3-none-any.whl", hash = "sha256:c42667e5cdadb151aeb5b26d114aff6bdf5a907f176a007a30b940d3d865b5c2", size = 14382, upload-time = "2025-05-05T19:44:33.502Z" }, ] +[[package]] +name = "pytest-xdist" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, +] + +[package.optional-dependencies] +psutil = [ + { name = "psutil" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -3578,7 +2911,6 @@ version = "3.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f3/bb/a7cc2967c5c4eceb6cc49cfe39447d4bfc56e6c865e7c2249b6eb978935f/pywinpty-3.0.2.tar.gz", hash = "sha256:1505cc4cb248af42cb6285a65c9c2086ee9e7e574078ee60933d5d7fa86fb004", size = 30669, upload-time = "2025-10-03T21:16:29.205Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/f5/b17ae550841949c217ad557ee445b4a14e9c0b506ae51ee087eff53428a6/pywinpty-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:65db57fd3387d71e8372b6a54269cbcd0f6dfa6d4616a29e0af749ec19f5c558", size = 2050330, upload-time = "2025-10-03T21:20:15.656Z" }, { url = "https://files.pythonhosted.org/packages/a6/a1/409c1651c9f874d598c10f51ff586c416625601df4bca315d08baec4c3e3/pywinpty-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:327790d70e4c841ebd9d0f295a780177149aeb405bca44c7115a3de5c2054b23", size = 2050304, upload-time = "2025-10-03T21:19:29.466Z" }, { url = "https://files.pythonhosted.org/packages/02/4e/1098484e042c9485f56f16eb2b69b43b874bd526044ee401512234cf9e04/pywinpty-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:99fdd9b455f0ad6419aba6731a7a0d2f88ced83c3c94a80ff9533d95fa8d8a9e", size = 2050391, upload-time = "2025-10-03T21:19:01.642Z" }, ] @@ -3589,15 +2921,6 @@ 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/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, { 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" }, @@ -3640,16 +2963,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/b9/52aa9ec2867528b54f1e60846728d8b4d84726630874fee3a91e66c7df81/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4", size = 1329850, upload-time = "2025-09-08T23:07:26.274Z" }, - { url = "https://files.pythonhosted.org/packages/99/64/5653e7b7425b169f994835a2b2abf9486264401fdef18df91ddae47ce2cc/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556", size = 906380, upload-time = "2025-09-08T23:07:29.78Z" }, - { url = "https://files.pythonhosted.org/packages/73/78/7d713284dbe022f6440e391bd1f3c48d9185673878034cfb3939cdf333b2/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b", size = 666421, upload-time = "2025-09-08T23:07:31.263Z" }, - { url = "https://files.pythonhosted.org/packages/30/76/8f099f9d6482450428b17c4d6b241281af7ce6a9de8149ca8c1c649f6792/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e", size = 854149, upload-time = "2025-09-08T23:07:33.17Z" }, - { url = "https://files.pythonhosted.org/packages/59/f0/37fbfff06c68016019043897e4c969ceab18bde46cd2aca89821fcf4fb2e/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526", size = 1655070, upload-time = "2025-09-08T23:07:35.205Z" }, - { url = "https://files.pythonhosted.org/packages/47/14/7254be73f7a8edc3587609554fcaa7bfd30649bf89cd260e4487ca70fdaa/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1", size = 2033441, upload-time = "2025-09-08T23:07:37.432Z" }, - { url = "https://files.pythonhosted.org/packages/22/dc/49f2be26c6f86f347e796a4d99b19167fc94503f0af3fd010ad262158822/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386", size = 1891529, upload-time = "2025-09-08T23:07:39.047Z" }, - { url = "https://files.pythonhosted.org/packages/a3/3e/154fb963ae25be70c0064ce97776c937ecc7d8b0259f22858154a9999769/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda", size = 567276, upload-time = "2025-09-08T23:07:40.695Z" }, - { url = "https://files.pythonhosted.org/packages/62/b2/f4ab56c8c595abcb26b2be5fd9fa9e6899c1e5ad54964e93ae8bb35482be/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f", size = 632208, upload-time = "2025-09-08T23:07:42.298Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e3/be2cc7ab8332bdac0522fdb64c17b1b6241a795bee02e0196636ec5beb79/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32", size = 559766, upload-time = "2025-09-08T23:07:43.869Z" }, { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, @@ -3670,11 +2983,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, - { url = "https://files.pythonhosted.org/packages/f3/81/a65e71c1552f74dec9dff91d95bafb6e0d33338a8dfefbc88aa562a20c92/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6", size = 836266, upload-time = "2025-09-08T23:09:40.048Z" }, - { url = "https://files.pythonhosted.org/packages/58/ed/0202ca350f4f2b69faa95c6d931e3c05c3a397c184cacb84cb4f8f42f287/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90", size = 800206, upload-time = "2025-09-08T23:09:41.902Z" }, - { url = "https://files.pythonhosted.org/packages/47/42/1ff831fa87fe8f0a840ddb399054ca0009605d820e2b44ea43114f5459f4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62", size = 567747, upload-time = "2025-09-08T23:09:43.741Z" }, - { url = "https://files.pythonhosted.org/packages/d1/db/5c4d6807434751e3f21231bee98109aa57b9b9b55e058e450d0aef59b70f/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74", size = 747371, upload-time = "2025-09-08T23:09:45.575Z" }, - { url = "https://files.pythonhosted.org/packages/26/af/78ce193dbf03567eb8c0dc30e3df2b9e56f12a670bf7eb20f9fb532c7e8a/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba", size = 544862, upload-time = "2025-09-08T23:09:47.448Z" }, { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, @@ -3702,23 +3010,6 @@ version = "2026.1.15" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/0b/86/07d5056945f9ec4590b518171c4254a5925832eb727b56d3c38a7476f316/regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5", size = 414811, upload-time = "2026-01-14T23:18:02.775Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/d2/e6ee96b7dff201a83f650241c52db8e5bd080967cb93211f57aa448dc9d6/regex-2026.1.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e3dd93c8f9abe8aa4b6c652016da9a3afa190df5ad822907efe6b206c09896e", size = 488166, upload-time = "2026-01-14T23:13:46.408Z" }, - { url = "https://files.pythonhosted.org/packages/23/8a/819e9ce14c9f87af026d0690901b3931f3101160833e5d4c8061fa3a1b67/regex-2026.1.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97499ff7862e868b1977107873dd1a06e151467129159a6ffd07b66706ba3a9f", size = 290632, upload-time = "2026-01-14T23:13:48.688Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c3/23dfe15af25d1d45b07dfd4caa6003ad710dcdcb4c4b279909bdfe7a2de8/regex-2026.1.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bda75ebcac38d884240914c6c43d8ab5fb82e74cde6da94b43b17c411aa4c2b", size = 288500, upload-time = "2026-01-14T23:13:50.503Z" }, - { url = "https://files.pythonhosted.org/packages/c6/31/1adc33e2f717df30d2f4d973f8776d2ba6ecf939301efab29fca57505c95/regex-2026.1.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7dcc02368585334f5bc81fc73a2a6a0bbade60e7d83da21cead622faf408f32c", size = 781670, upload-time = "2026-01-14T23:13:52.453Z" }, - { url = "https://files.pythonhosted.org/packages/23/ce/21a8a22d13bc4adcb927c27b840c948f15fc973e21ed2346c1bd0eae22dc/regex-2026.1.15-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:693b465171707bbe882a7a05de5e866f33c76aa449750bee94a8d90463533cc9", size = 850820, upload-time = "2026-01-14T23:13:54.894Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/3eeacdf587a4705a44484cd0b30e9230a0e602811fb3e2cc32268c70d509/regex-2026.1.15-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0d190e6f013ea938623a58706d1469a62103fb2a241ce2873a9906e0386582c", size = 898777, upload-time = "2026-01-14T23:13:56.908Z" }, - { url = "https://files.pythonhosted.org/packages/79/a9/1898a077e2965c35fc22796488141a22676eed2d73701e37c73ad7c0b459/regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ff818702440a5878a81886f127b80127f5d50563753a28211482867f8318106", size = 791750, upload-time = "2026-01-14T23:13:58.527Z" }, - { url = "https://files.pythonhosted.org/packages/4c/84/e31f9d149a178889b3817212827f5e0e8c827a049ff31b4b381e76b26e2d/regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f052d1be37ef35a54e394de66136e30fa1191fab64f71fc06ac7bc98c9a84618", size = 782674, upload-time = "2026-01-14T23:13:59.874Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ff/adf60063db24532add6a1676943754a5654dcac8237af024ede38244fd12/regex-2026.1.15-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6bfc31a37fd1592f0c4fc4bfc674b5c42e52efe45b4b7a6a14f334cca4bcebe4", size = 767906, upload-time = "2026-01-14T23:14:01.298Z" }, - { url = "https://files.pythonhosted.org/packages/af/3e/e6a216cee1e2780fec11afe7fc47b6f3925d7264e8149c607ac389fd9b1a/regex-2026.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d6ce5ae80066b319ae3bc62fd55a557c9491baa5efd0d355f0de08c4ba54e79", size = 774798, upload-time = "2026-01-14T23:14:02.715Z" }, - { url = "https://files.pythonhosted.org/packages/0f/98/23a4a8378a9208514ed3efc7e7850c27fa01e00ed8557c958df0335edc4a/regex-2026.1.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1704d204bd42b6bb80167df0e4554f35c255b579ba99616def38f69e14a5ccb9", size = 845861, upload-time = "2026-01-14T23:14:04.824Z" }, - { url = "https://files.pythonhosted.org/packages/f8/57/d7605a9d53bd07421a8785d349cd29677fe660e13674fa4c6cbd624ae354/regex-2026.1.15-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3174a5ed4171570dc8318afada56373aa9289eb6dc0d96cceb48e7358b0e220", size = 755648, upload-time = "2026-01-14T23:14:06.371Z" }, - { url = "https://files.pythonhosted.org/packages/6f/76/6f2e24aa192da1e299cc1101674a60579d3912391867ce0b946ba83e2194/regex-2026.1.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87adf5bd6d72e3e17c9cb59ac4096b1faaf84b7eb3037a5ffa61c4b4370f0f13", size = 836250, upload-time = "2026-01-14T23:14:08.343Z" }, - { url = "https://files.pythonhosted.org/packages/11/3a/1f2a1d29453299a7858eab7759045fc3d9d1b429b088dec2dc85b6fa16a2/regex-2026.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e85dc94595f4d766bd7d872a9de5ede1ca8d3063f3bdf1e2c725f5eb411159e3", size = 779919, upload-time = "2026-01-14T23:14:09.954Z" }, - { url = "https://files.pythonhosted.org/packages/c0/67/eab9bc955c9dcc58e9b222c801e39cff7ca0b04261792a2149166ce7e792/regex-2026.1.15-cp310-cp310-win32.whl", hash = "sha256:21ca32c28c30d5d65fc9886ff576fc9b59bbca08933e844fa2363e530f4c8218", size = 265888, upload-time = "2026-01-14T23:14:11.35Z" }, - { url = "https://files.pythonhosted.org/packages/1d/62/31d16ae24e1f8803bddb0885508acecaec997fcdcde9c243787103119ae4/regex-2026.1.15-cp310-cp310-win_amd64.whl", hash = "sha256:3038a62fc7d6e5547b8915a3d927a0fbeef84cdbe0b1deb8c99bbd4a8961b52a", size = 277830, upload-time = "2026-01-14T23:14:12.908Z" }, - { url = "https://files.pythonhosted.org/packages/e5/36/5d9972bccd6417ecd5a8be319cebfd80b296875e7f116c37fb2a2deecebf/regex-2026.1.15-cp310-cp310-win_arm64.whl", hash = "sha256:505831646c945e3e63552cc1b1b9b514f0e93232972a2d5bedbcc32f15bc82e3", size = 270376, upload-time = "2026-01-14T23:14:14.782Z" }, { url = "https://files.pythonhosted.org/packages/d0/c9/0c80c96eab96948363d270143138d671d5731c3a692b417629bf3492a9d6/regex-2026.1.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ae6020fb311f68d753b7efa9d4b9a5d47a5d6466ea0d5e3b5a471a960ea6e4a", size = 488168, upload-time = "2026-01-14T23:14:16.129Z" }, { url = "https://files.pythonhosted.org/packages/17/f0/271c92f5389a552494c429e5cc38d76d1322eb142fb5db3c8ccc47751468/regex-2026.1.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eddf73f41225942c1f994914742afa53dc0d01a6e20fe14b878a1b1edc74151f", size = 290636, upload-time = "2026-01-14T23:14:17.715Z" }, { url = "https://files.pythonhosted.org/packages/a0/f9/5f1fd077d106ca5655a0f9ff8f25a1ab55b92128b5713a91ed7134ff688e/regex-2026.1.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e8cd52557603f5c66a548f69421310886b28b7066853089e1a71ee710e1cdc1", size = 288496, upload-time = "2026-01-14T23:14:19.326Z" }, @@ -3815,15 +3106,15 @@ wheels = [ [[package]] name = "rich" -version = "14.2.0" +version = "14.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/d2/8920e102050a0de7bfabeb4c4614a49248cf8d5d7a8d01885fbb24dc767a/rich-14.2.0.tar.gz", hash = "sha256:73ff50c7c0c1c77c8243079283f4edb376f0f6442433aecb8ce7e6d0b92d1fe4", size = 219990, upload-time = "2025-10-09T14:16:53.064Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125, upload-time = "2026-01-24T21:40:44.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/7a/b0178788f8dc6cafce37a212c99565fa1fe7872c70c6c9c1e1a372d9d88f/rich-14.2.0-py3-none-any.whl", hash = "sha256:76bc51fe2e57d2b1be1f96c524b890b816e334ab4c1e45888799bfaab0021edd", size = 243393, upload-time = "2025-10-09T14:16:51.245Z" }, + { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952, upload-time = "2026-01-24T21:40:42.969Z" }, ] [[package]] @@ -3832,20 +3123,6 @@ version = "0.30.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, - { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, - { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, - { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, - { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, - { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, - { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, - { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, - { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, - { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, - { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, - { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, @@ -3916,158 +3193,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, ] -[[package]] -name = "scikit-learn" -version = "1.7.2" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "joblib", marker = "python_full_version < '3.11'" }, - { name = "numpy", marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "threadpoolctl", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/3e/daed796fd69cce768b8788401cc464ea90b306fb196ae1ffed0b98182859/scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f", size = 9336221, upload-time = "2025-09-09T08:20:19.328Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ce/af9d99533b24c55ff4e18d9b7b4d9919bbc6cd8f22fe7a7be01519a347d5/scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c", size = 8653834, upload-time = "2025-09-09T08:20:22.073Z" }, - { url = "https://files.pythonhosted.org/packages/58/0e/8c2a03d518fb6bd0b6b0d4b114c63d5f1db01ff0f9925d8eb10960d01c01/scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8", size = 9660938, upload-time = "2025-09-09T08:20:24.327Z" }, - { url = "https://files.pythonhosted.org/packages/2b/75/4311605069b5d220e7cf5adabb38535bd96f0079313cdbb04b291479b22a/scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18", size = 9477818, upload-time = "2025-09-09T08:20:26.845Z" }, - { url = "https://files.pythonhosted.org/packages/7f/9b/87961813c34adbca21a6b3f6b2bea344c43b30217a6d24cc437c6147f3e8/scikit_learn-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:ca250e6836d10e6f402436d6463d6c0e4d8e0234cfb6a9a47835bd392b852ce5", size = 8886969, upload-time = "2025-09-09T08:20:29.329Z" }, - { url = "https://files.pythonhosted.org/packages/43/83/564e141eef908a5863a54da8ca342a137f45a0bfb71d1d79704c9894c9d1/scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e", size = 9331967, upload-time = "2025-09-09T08:20:32.421Z" }, - { url = "https://files.pythonhosted.org/packages/18/d6/ba863a4171ac9d7314c4d3fc251f015704a2caeee41ced89f321c049ed83/scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1", size = 8648645, upload-time = "2025-09-09T08:20:34.436Z" }, - { url = "https://files.pythonhosted.org/packages/ef/0e/97dbca66347b8cf0ea8b529e6bb9367e337ba2e8be0ef5c1a545232abfde/scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d", size = 9715424, upload-time = "2025-09-09T08:20:36.776Z" }, - { url = "https://files.pythonhosted.org/packages/f7/32/1f3b22e3207e1d2c883a7e09abb956362e7d1bd2f14458c7de258a26ac15/scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1", size = 9509234, upload-time = "2025-09-09T08:20:38.957Z" }, - { url = "https://files.pythonhosted.org/packages/9f/71/34ddbd21f1da67c7a768146968b4d0220ee6831e4bcbad3e03dd3eae88b6/scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1", size = 8894244, upload-time = "2025-09-09T08:20:41.166Z" }, - { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload-time = "2025-09-09T08:20:43.19Z" }, - { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload-time = "2025-09-09T08:20:45.468Z" }, - { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload-time = "2025-09-09T08:20:47.982Z" }, - { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296, upload-time = "2025-09-09T08:20:50.366Z" }, - { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256, upload-time = "2025-09-09T08:20:52.627Z" }, -] - -[[package]] -name = "scikit-learn" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", -] -dependencies = [ - { name = "joblib", marker = "python_full_version >= '3.11'" }, - { name = "numpy", marker = "python_full_version >= '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "threadpoolctl", marker = "python_full_version >= '3.11'" }, -] -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" }, -] - -[[package]] -name = "scipy" -version = "1.15.3" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "numpy", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, - { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, - { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, - { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, - { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, - { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, - { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, - { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201, upload-time = "2025-05-08T16:05:08.166Z" }, - { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, - { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, - { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, - { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, - { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, - { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, - { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504, upload-time = "2025-05-08T16:06:00.437Z" }, - { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, - { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, - { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, - { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, - { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, - { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, - { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, -] - -[[package]] -name = "scipy" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.12'", - "python_full_version == '3.11.*'", -] -dependencies = [ - { name = "numpy", marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/56/3e/9cca699f3486ce6bc12ff46dc2031f1ec8eb9ccc9a320fdaf925f1417426/scipy-1.17.0.tar.gz", hash = "sha256:2591060c8e648d8b96439e111ac41fd8342fdeff1876be2e19dea3fe8930454e", size = 30396830, upload-time = "2026-01-10T21:34:23.009Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/4b/c89c131aa87cad2b77a54eb0fb94d633a842420fa7e919dc2f922037c3d8/scipy-1.17.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:2abd71643797bd8a106dff97894ff7869eeeb0af0f7a5ce02e4227c6a2e9d6fd", size = 31381316, upload-time = "2026-01-10T21:24:33.42Z" }, - { url = "https://files.pythonhosted.org/packages/5e/5f/a6b38f79a07d74989224d5f11b55267714707582908a5f1ae854cf9a9b84/scipy-1.17.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:ef28d815f4d2686503e5f4f00edc387ae58dfd7a2f42e348bb53359538f01558", size = 27966760, upload-time = "2026-01-10T21:24:38.911Z" }, - { url = "https://files.pythonhosted.org/packages/c1/20/095ad24e031ee8ed3c5975954d816b8e7e2abd731e04f8be573de8740885/scipy-1.17.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:272a9f16d6bb4667e8b50d25d71eddcc2158a214df1b566319298de0939d2ab7", size = 20138701, upload-time = "2026-01-10T21:24:43.249Z" }, - { url = "https://files.pythonhosted.org/packages/89/11/4aad2b3858d0337756f3323f8960755704e530b27eb2a94386c970c32cbe/scipy-1.17.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:7204fddcbec2fe6598f1c5fdf027e9f259106d05202a959a9f1aecf036adc9f6", size = 22480574, upload-time = "2026-01-10T21:24:47.266Z" }, - { url = "https://files.pythonhosted.org/packages/85/bd/f5af70c28c6da2227e510875cadf64879855193a687fb19951f0f44cfd6b/scipy-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc02c37a5639ee67d8fb646ffded6d793c06c5622d36b35cfa8fe5ececb8f042", size = 32862414, upload-time = "2026-01-10T21:24:52.566Z" }, - { url = "https://files.pythonhosted.org/packages/ef/df/df1457c4df3826e908879fe3d76bc5b6e60aae45f4ee42539512438cfd5d/scipy-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dac97a27520d66c12a34fd90a4fe65f43766c18c0d6e1c0a80f114d2260080e4", size = 35112380, upload-time = "2026-01-10T21:24:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/5f/bb/88e2c16bd1dd4de19d80d7c5e238387182993c2fb13b4b8111e3927ad422/scipy-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ebb7446a39b3ae0fe8f416a9a3fdc6fba3f11c634f680f16a239c5187bc487c0", size = 34922676, upload-time = "2026-01-10T21:25:04.287Z" }, - { url = "https://files.pythonhosted.org/packages/02/ba/5120242cc735f71fc002cff0303d536af4405eb265f7c60742851e7ccfe9/scipy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:474da16199f6af66601a01546144922ce402cb17362e07d82f5a6cf8f963e449", size = 37507599, upload-time = "2026-01-10T21:25:09.851Z" }, - { url = "https://files.pythonhosted.org/packages/52/c8/08629657ac6c0da198487ce8cd3de78e02cfde42b7f34117d56a3fe249dc/scipy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:255c0da161bd7b32a6c898e7891509e8a9289f0b1c6c7d96142ee0d2b114c2ea", size = 36380284, upload-time = "2026-01-10T21:25:15.632Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4a/465f96d42c6f33ad324a40049dfd63269891db9324aa66c4a1c108c6f994/scipy-1.17.0-cp311-cp311-win_arm64.whl", hash = "sha256:85b0ac3ad17fa3be50abd7e69d583d98792d7edc08367e01445a1e2076005379", size = 24370427, upload-time = "2026-01-10T21:25:20.514Z" }, - { url = "https://files.pythonhosted.org/packages/0b/11/7241a63e73ba5a516f1930ac8d5b44cbbfabd35ac73a2d08ca206df007c4/scipy-1.17.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:0d5018a57c24cb1dd828bcf51d7b10e65986d549f52ef5adb6b4d1ded3e32a57", size = 31364580, upload-time = "2026-01-10T21:25:25.717Z" }, - { url = "https://files.pythonhosted.org/packages/ed/1d/5057f812d4f6adc91a20a2d6f2ebcdb517fdbc87ae3acc5633c9b97c8ba5/scipy-1.17.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:88c22af9e5d5a4f9e027e26772cc7b5922fab8bcc839edb3ae33de404feebd9e", size = 27969012, upload-time = "2026-01-10T21:25:30.921Z" }, - { url = "https://files.pythonhosted.org/packages/e3/21/f6ec556c1e3b6ec4e088da667d9987bb77cc3ab3026511f427dc8451187d/scipy-1.17.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:f3cd947f20fe17013d401b64e857c6b2da83cae567adbb75b9dcba865abc66d8", size = 20140691, upload-time = "2026-01-10T21:25:34.802Z" }, - { url = "https://files.pythonhosted.org/packages/7a/fe/5e5ad04784964ba964a96f16c8d4676aa1b51357199014dce58ab7ec5670/scipy-1.17.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e8c0b331c2c1f531eb51f1b4fc9ba709521a712cce58f1aa627bc007421a5306", size = 22463015, upload-time = "2026-01-10T21:25:39.277Z" }, - { url = "https://files.pythonhosted.org/packages/4a/69/7c347e857224fcaf32a34a05183b9d8a7aca25f8f2d10b8a698b8388561a/scipy-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5194c445d0a1c7a6c1a4a4681b6b7c71baad98ff66d96b949097e7513c9d6742", size = 32724197, upload-time = "2026-01-10T21:25:44.084Z" }, - { url = "https://files.pythonhosted.org/packages/d1/fe/66d73b76d378ba8cc2fe605920c0c75092e3a65ae746e1e767d9d020a75a/scipy-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9eeb9b5f5997f75507814ed9d298ab23f62cf79f5a3ef90031b1ee2506abdb5b", size = 35009148, upload-time = "2026-01-10T21:25:50.591Z" }, - { url = "https://files.pythonhosted.org/packages/af/07/07dec27d9dc41c18d8c43c69e9e413431d20c53a0339c388bcf72f353c4b/scipy-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40052543f7bbe921df4408f46003d6f01c6af109b9e2c8a66dd1cf6cf57f7d5d", size = 34798766, upload-time = "2026-01-10T21:25:59.41Z" }, - { url = "https://files.pythonhosted.org/packages/81/61/0470810c8a093cdacd4ba7504b8a218fd49ca070d79eca23a615f5d9a0b0/scipy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0cf46c8013fec9d3694dc572f0b54100c28405d55d3e2cb15e2895b25057996e", size = 37405953, upload-time = "2026-01-10T21:26:07.75Z" }, - { url = "https://files.pythonhosted.org/packages/92/ce/672ed546f96d5d41ae78c4b9b02006cedd0b3d6f2bf5bb76ea455c320c28/scipy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:0937a0b0d8d593a198cededd4c439a0ea216a3f36653901ea1f3e4be949056f8", size = 36328121, upload-time = "2026-01-10T21:26:16.509Z" }, - { url = "https://files.pythonhosted.org/packages/9d/21/38165845392cae67b61843a52c6455d47d0cc2a40dd495c89f4362944654/scipy-1.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:f603d8a5518c7426414d1d8f82e253e454471de682ce5e39c29adb0df1efb86b", size = 24314368, upload-time = "2026-01-10T21:26:23.087Z" }, -] - -[[package]] -name = "seaborn" -version = "0.13.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "matplotlib" }, - { name = "numpy" }, - { name = "pandas" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, -] - [[package]] name = "semversioner" version = "2.0.8" @@ -4093,11 +3218,11 @@ wheels = [ [[package]] name = "setuptools" -version = "80.10.1" +version = "80.10.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/86/ff/f75651350db3cf2ef767371307eb163f3cc1ac03e16fdf3ac347607f7edb/setuptools-80.10.1.tar.gz", hash = "sha256:bf2e513eb8144c3298a3bd28ab1a5edb739131ec5c22e045ff93cd7f5319703a", size = 1229650, upload-time = "2026-01-21T09:42:03.061Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/95/faf61eb8363f26aa7e1d762267a8d602a1b26d4f3a1e758e92cb3cb8b054/setuptools-80.10.2.tar.gz", hash = "sha256:8b0e9d10c784bf7d262c4e5ec5d4ec94127ce206e8738f29a437945fbc219b70", size = 1200343, upload-time = "2026-01-25T22:38:17.252Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/76/f963c61683a39084aa575f98089253e1e852a4417cb8a3a8a422923a5246/setuptools-80.10.1-py3-none-any.whl", hash = "sha256:fc30c51cbcb8199a219c12cc9c281b5925a4978d212f84229c909636d9f6984e", size = 1099859, upload-time = "2026-01-21T09:42:00.688Z" }, + { url = "https://files.pythonhosted.org/packages/94/b8/f1f62a5e3c0ad2ff1d189590bfa4c46b4f3b6e49cef6f26c6ee4e575394d/setuptools-80.10.2-py3-none-any.whl", hash = "sha256:95b30ddfb717250edb492926c92b5221f7ef3fbcc2b07579bcd4a27da21d0173", size = 1064234, upload-time = "2026-01-25T22:38:15.216Z" }, ] [[package]] @@ -4174,13 +3299,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/59/9f/424244b0e2656afc9ff82fb7a96931a47397bfce5ba382213827b198312a/spacy-3.8.11.tar.gz", hash = "sha256:54e1e87b74a2f9ea807ffd606166bf29ac45e2bd81ff7f608eadc7b05787d90d", size = 1326804, upload-time = "2025-11-17T20:40:03.079Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/63/f23db7119e0bb7740d74eff4583543824be84e7c0aad1c87683b8f40a17e/spacy-3.8.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9cc7f775cfc41ccb8be63bd6258a1ec4613d4ad3859f2ba2c079f34240b21f6", size = 6499016, upload-time = "2025-11-17T20:38:22.359Z" }, - { url = "https://files.pythonhosted.org/packages/5d/e4/e8c0f0561e8b29b4f38ba3d491fca427faa750765df3e27850036af28762/spacy-3.8.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be9d665be8581926fba4303543ba189d34e8517803052551b000cf1a1af33b87", size = 6159121, upload-time = "2025-11-17T20:38:24.85Z" }, - { url = "https://files.pythonhosted.org/packages/15/7a/7ce7320f2a384023240fad0e6b7ffb2e3717ae4cc09ec0770706fd20c419/spacy-3.8.11-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:06e46ad776a1b20cc6296fe04890dea8a7b4e4653d7e8c143dd4a707f7ae2670", size = 30763429, upload-time = "2025-11-17T20:38:27.001Z" }, - { url = "https://files.pythonhosted.org/packages/db/36/b16df8f5ba8d5fc3d2b23f004eb55f3edf4f3345e743efdd560b6b20faf8/spacy-3.8.11-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e1b91199926eb9de507f7bfc63090b17ee9a12663bcfc76357560c2c7ef4750a", size = 31002535, upload-time = "2025-11-17T20:38:30.115Z" }, - { url = "https://files.pythonhosted.org/packages/6e/be/58183313f1401fff896d3dd8f8da977847fb1c205a2c2a8a7030e81da265/spacy-3.8.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1d4c506adcbefd19ead59daca2e0e61ce669ff35372cc9c23aae1b292c57f94", size = 31033341, upload-time = "2025-11-17T20:38:33.06Z" }, - { url = "https://files.pythonhosted.org/packages/94/08/d490ed3a4ea070734c58cf1f2e3e6081a20630067bca2c58d5dbcfb36558/spacy-3.8.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d885a2bf427c854c5a5f1dda7451924a1f2c036aefaa2946c741201ff05a915a", size = 31882346, upload-time = "2025-11-17T20:38:35.596Z" }, - { url = "https://files.pythonhosted.org/packages/79/38/e64856b3f768754def0f5dc4c5fb3f692d96a193eec7e2eee03d37c233b6/spacy-3.8.11-cp310-cp310-win_amd64.whl", hash = "sha256:909d12ff2365c2e7ebf0258ddc566d2b361ef1fd2e7684ce1af5f7022111e366", size = 15346864, upload-time = "2025-11-17T20:38:37.95Z" }, { url = "https://files.pythonhosted.org/packages/74/d3/0c795e6f31ee3535b6e70d08e89fc22247b95b61f94fc8334a01d39bf871/spacy-3.8.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a12d83e8bfba07563300ae5e0086548e41aa4bfe3734c97dda87e0eec813df0d", size = 6487958, upload-time = "2025-11-17T20:38:40.378Z" }, { url = "https://files.pythonhosted.org/packages/4e/2a/83ca9b4d0a2b31adcf0ced49fa667212d12958f75d4e238618a60eb50b10/spacy-3.8.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e07a50b69500ef376326545353a470f00d1ed7203c76341b97242af976e3681a", size = 6148078, upload-time = "2025-11-17T20:38:42.524Z" }, { url = "https://files.pythonhosted.org/packages/2c/f0/ff520df18a6152ba2dbf808c964014308e71a48feb4c7563f2a6cd6e668d/spacy-3.8.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:718b7bb5e83c76cb841ed6e407f7b40255d0b46af7101a426c20e04af3afd64e", size = 32056451, upload-time = "2025-11-17T20:38:44.92Z" }, @@ -4226,13 +3344,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/cf/77/5633c4ba65e3421b72b5b4bd93aa328360b351b3a1e5bf3c90eb224668e5/srsly-2.5.2.tar.gz", hash = "sha256:4092bc843c71b7595c6c90a0302a197858c5b9fe43067f62ae6a45bc3baa1c19", size = 492055, upload-time = "2025-11-17T14:11:02.543Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/58/ff9fd981b6e0fae261c48a3a941aeca5735eace4a137de883c8d69029bc7/srsly-2.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5491fe0683da900cd0c563538510c70a007380e1f6b29ebbb5225e7590981e2a", size = 655635, upload-time = "2025-11-17T14:09:41.167Z" }, - { url = "https://files.pythonhosted.org/packages/fd/a6/5b03c2a3b407caec3e7a5df61523154de3c5d36dc2f9328be91d3df368d5/srsly-2.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7375c2955935b73a6cad3851fe819c2f4ec506504afe7ca92b917555e6850fae", size = 653395, upload-time = "2025-11-17T14:09:42.827Z" }, - { url = "https://files.pythonhosted.org/packages/62/5d/1829a208d6d291c1ab3b81acd6e7a9f11984afc674ba2778e57984eee1a7/srsly-2.5.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0709a97ca463c1e85b03432c7d8028c82439f0248816707bafc553ffe66ec6f9", size = 1121898, upload-time = "2025-11-17T14:09:44.461Z" }, - { url = "https://files.pythonhosted.org/packages/c6/ce/71766be1488ce4058dc5eded6f5c0ce7cbb18ff7263f3cc718fe8b1033ad/srsly-2.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea2ee0122312802ed531fee6de679d74ce99ce8addce49aff8d52ee670d810f8", size = 1122831, upload-time = "2025-11-17T14:09:46.011Z" }, - { url = "https://files.pythonhosted.org/packages/ab/5c/259e5b0e70c22c5bbd1327a79bb4b2d75efb38295475229e9310251c240e/srsly-2.5.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2e9fc418585832c7ce01bfc7fe85b96afe11165eb9a31ff0ed52aa3e32ec08b", size = 1080719, upload-time = "2025-11-17T14:09:47.685Z" }, - { url = "https://files.pythonhosted.org/packages/32/c4/20face1113cfa436434c7c152b374edae1631177d0d44dd60103297ffe03/srsly-2.5.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3df0ef22d571e733b181ac488823b01f4dd13da23497f46956839c718e48f36b", size = 1092783, upload-time = "2025-11-17T14:09:49.295Z" }, - { url = "https://files.pythonhosted.org/packages/c1/aa/16c405cf830bf3d843a631d62681403eb44563e27a42648f417f40209045/srsly-2.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:a116b926dd24702f5474f6367d8083412f218ddf82d5c7b5831a7b2ba3d8bd55", size = 654041, upload-time = "2025-11-17T14:09:51.056Z" }, { url = "https://files.pythonhosted.org/packages/59/6e/2e3d07b38c1c2e98487f0af92f93b392c6741062d85c65cdc18c7b77448a/srsly-2.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e07babdcece2405b32c9eea25ef415749f214c889545e38965622bb66837ce", size = 655286, upload-time = "2025-11-17T14:09:52.468Z" }, { url = "https://files.pythonhosted.org/packages/a1/e7/587bcade6b72f919133e587edf60e06039d88049aef9015cd0bdea8df189/srsly-2.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1718fe40b73e5cc73b14625233f57e15fb23643d146f53193e8fe653a49e9a0f", size = 653094, upload-time = "2025-11-17T14:09:53.837Z" }, { url = "https://files.pythonhosted.org/packages/8d/24/5c3aabe292cb4eb906c828f2866624e3a65603ef0a73e964e486ff146b84/srsly-2.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7b07e6103db7dd3199c0321935b0c8b9297fd6e018a66de97dc836068440111", size = 1141286, upload-time = "2025-11-17T14:09:55.535Z" }, @@ -4264,46 +3375,15 @@ wheels = [ ] [[package]] -name = "statsmodels" -version = "0.14.6" +name = "sympy" +version = "1.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, - { name = "packaging" }, - { name = "pandas" }, - { name = "patsy" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0d/81/e8d74b34f85285f7335d30c5e3c2d7c0346997af9f3debf9a0a9a63de184/statsmodels-0.14.6.tar.gz", hash = "sha256:4d17873d3e607d398b85126cd4ed7aad89e4e9d89fc744cdab1af3189a996c2a", size = 20689085, upload-time = "2025-12-05T23:08:39.522Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/6d/9ec309a175956f88eb8420ac564297f37cf9b1f73f89db74da861052dc29/statsmodels-0.14.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4ff0649a2df674c7ffb6fa1a06bffdb82a6adf09a48e90e000a15a6aaa734b0", size = 10142419, upload-time = "2025-12-05T19:27:35.625Z" }, - { url = "https://files.pythonhosted.org/packages/86/8f/338c5568315ec5bf3ac7cd4b71e34b98cb3b0f834919c0c04a0762f878a1/statsmodels-0.14.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:109012088b3e370080846ab053c76d125268631410142daad2f8c10770e8e8d9", size = 10022819, upload-time = "2025-12-05T19:27:49.385Z" }, - { url = "https://files.pythonhosted.org/packages/b0/77/5fc4cbc2d608f9b483b0675f82704a8bcd672962c379fe4d82100d388dbf/statsmodels-0.14.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93bd5d220f3cb6fc5fc1bffd5b094966cab8ee99f6c57c02e95710513d6ac3f", size = 10118927, upload-time = "2025-12-05T23:07:51.256Z" }, - { url = "https://files.pythonhosted.org/packages/94/55/b86c861c32186403fe121d9ab27bc16d05839b170d92a978beb33abb995e/statsmodels-0.14.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:06eec42d682fdb09fe5d70a05930857efb141754ec5a5056a03304c1b5e32fd9", size = 10413015, upload-time = "2025-12-05T23:08:53.95Z" }, - { url = "https://files.pythonhosted.org/packages/f9/be/daf0dba729ccdc4176605f4a0fd5cfe71cdda671749dca10e74a732b8b1c/statsmodels-0.14.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0444e88557df735eda7db330806fe09d51c9f888bb1f5906cb3a61fb1a3ed4a8", size = 10441248, upload-time = "2025-12-05T23:09:09.353Z" }, - { url = "https://files.pythonhosted.org/packages/9a/1c/2e10b7c7cc44fa418272996bf0427b8016718fd62f995d9c1f7ab37adf35/statsmodels-0.14.6-cp310-cp310-win_amd64.whl", hash = "sha256:e83a9abe653835da3b37fb6ae04b45480c1de11b3134bd40b09717192a1456ea", size = 9583410, upload-time = "2025-12-05T19:28:02.086Z" }, - { url = "https://files.pythonhosted.org/packages/a9/4d/df4dd089b406accfc3bb5ee53ba29bb3bdf5ae61643f86f8f604baa57656/statsmodels-0.14.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ad5c2810fc6c684254a7792bf1cbaf1606cdee2a253f8bd259c43135d87cfb4", size = 10121514, upload-time = "2025-12-05T19:28:16.521Z" }, - { url = "https://files.pythonhosted.org/packages/82/af/ec48daa7f861f993b91a0dcc791d66e1cf56510a235c5cbd2ab991a31d5c/statsmodels-0.14.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:341fa68a7403e10a95c7b6e41134b0da3a7b835ecff1eb266294408535a06eb6", size = 10003346, upload-time = "2025-12-05T19:28:29.568Z" }, - { url = "https://files.pythonhosted.org/packages/a9/2c/c8f7aa24cd729970728f3f98822fb45149adc216f445a9301e441f7ac760/statsmodels-0.14.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdf1dfe2a3ca56f5529118baf33a13efed2783c528f4a36409b46bbd2d9d48eb", size = 10129872, upload-time = "2025-12-05T23:09:25.724Z" }, - { url = "https://files.pythonhosted.org/packages/40/c6/9ae8e9b0721e9b6eb5f340c3a0ce8cd7cce4f66e03dd81f80d60f111987f/statsmodels-0.14.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3764ba8195c9baf0925a96da0743ff218067a269f01d155ca3558deed2658ca", size = 10381964, upload-time = "2025-12-05T23:09:41.326Z" }, - { url = "https://files.pythonhosted.org/packages/28/8c/cf3d30c8c2da78e2ad1f50ade8b7fabec3ff4cdfc56fbc02e097c4577f90/statsmodels-0.14.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e8d2e519852adb1b420e018f5ac6e6684b2b877478adf7fda2cfdb58f5acb5d", size = 10409611, upload-time = "2025-12-05T23:09:57.131Z" }, - { url = "https://files.pythonhosted.org/packages/bf/cc/018f14ecb58c6cb89de9d52695740b7d1f5a982aa9ea312483ea3c3d5f77/statsmodels-0.14.6-cp311-cp311-win_amd64.whl", hash = "sha256:2738a00fca51196f5a7d44b06970ace6b8b30289839e4808d656f8a98e35faa7", size = 9580385, upload-time = "2025-12-05T19:28:42.778Z" }, - { url = "https://files.pythonhosted.org/packages/25/ce/308e5e5da57515dd7cab3ec37ea2d5b8ff50bef1fcc8e6d31456f9fae08e/statsmodels-0.14.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe76140ae7adc5ff0e60a3f0d56f4fffef484efa803c3efebf2fcd734d72ecb5", size = 10091932, upload-time = "2025-12-05T19:28:55.446Z" }, - { url = "https://files.pythonhosted.org/packages/05/30/affbabf3c27fb501ec7b5808230c619d4d1a4525c07301074eb4bda92fa9/statsmodels-0.14.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26d4f0ed3b31f3c86f83a92f5c1f5cbe63fc992cd8915daf28ca49be14463a1c", size = 9997345, upload-time = "2025-12-05T19:29:10.278Z" }, - { url = "https://files.pythonhosted.org/packages/48/f5/3a73b51e6450c31652c53a8e12e24eac64e3824be816c0c2316e7dbdcb7d/statsmodels-0.14.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c00a42863e4f4733ac9d078bbfad816249c01451740e6f5053ecc7db6d6368", size = 10058649, upload-time = "2025-12-05T23:10:12.775Z" }, - { url = "https://files.pythonhosted.org/packages/81/68/dddd76117df2ef14c943c6bbb6618be5c9401280046f4ddfc9fb4596a1b8/statsmodels-0.14.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:19b58cf7474aa9e7e3b0771a66537148b2df9b5884fbf156096c0e6c1ff0469d", size = 10339446, upload-time = "2025-12-05T23:10:28.503Z" }, - { url = "https://files.pythonhosted.org/packages/56/4a/dce451c74c4050535fac1ec0c14b80706d8fc134c9da22db3c8a0ec62c33/statsmodels-0.14.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:81e7dcc5e9587f2567e52deaff5220b175bf2f648951549eae5fc9383b62bc37", size = 10368705, upload-time = "2025-12-05T23:10:44.339Z" }, - { url = "https://files.pythonhosted.org/packages/60/15/3daba2df40be8b8a9a027d7f54c8dedf24f0d81b96e54b52293f5f7e3418/statsmodels-0.14.6-cp312-cp312-win_amd64.whl", hash = "sha256:b5eb07acd115aa6208b4058211138393a7e6c2cf12b6f213ede10f658f6a714f", size = 9543991, upload-time = "2025-12-05T23:10:58.536Z" }, + { name = "mpmath" }, ] - -[[package]] -name = "tenacity" -version = "9.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] [[package]] @@ -4352,13 +3432,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/2f/3a/2d0f0be132b9faaa6d56f04565ae122684273e4bf4eab8dee5f48dc00f68/thinc-8.3.10.tar.gz", hash = "sha256:5a75109f4ee1c968fc055ce651a17cb44b23b000d9e95f04a4d047ab3cb3e34e", size = 194196, upload-time = "2025-11-17T17:21:46.435Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/bc/d3c364c0278e420e0e3d328cbae7cd7aac8d2cfe4d9b8022a12e99f03755/thinc-8.3.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fbe0313cb3c898f4e6a3f13b704af51f4bf8f927078deb0fe2d6eaf3c6c5b31b", size = 821615, upload-time = "2025-11-17T17:20:31.257Z" }, - { url = "https://files.pythonhosted.org/packages/0e/97/70fe96d86fe5d024882fd96f054be94f87828da67862749aa439de33d452/thinc-8.3.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:892ac91cf7cc8d3ac9a4527c68ead37a96e87132c9f589de56b057b50358e895", size = 772280, upload-time = "2025-11-17T17:20:34.408Z" }, - { url = "https://files.pythonhosted.org/packages/08/a8/a6906490a756a4ad09781bcd02490e5427d942a918abed8424f639d317c3/thinc-8.3.10-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0fbf142050feb5490f6366e251d48e0429315abe487faa7d371fac4d043efd1e", size = 3881222, upload-time = "2025-11-17T17:20:36.525Z" }, - { url = "https://files.pythonhosted.org/packages/e6/bf/bebeddbab816c4d909455499f7e1b0a88cec9497fd737412e1189971d193/thinc-8.3.10-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:470b05fd1af4024cf183f387f71270943f652dd711304d1fa8b672d268052af8", size = 3905534, upload-time = "2025-11-17T17:20:38.901Z" }, - { url = "https://files.pythonhosted.org/packages/fd/c4/c78f1e1091b73dbeee8623f856e2dd25888aab600ded5fa9944dfbe38efb/thinc-8.3.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06ebf4aa642991b8dc5c2a6db4c0aedf6d5589a361c93531ec3721d76eabe859", size = 4888188, upload-time = "2025-11-17T17:20:41.394Z" }, - { url = "https://files.pythonhosted.org/packages/ca/bc/36297efade38e0f3e56795f49094d19fbe560bda60a42ce134bbfc1796da/thinc-8.3.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:026999d749075c890fbb1df47d75389a81b712afccea519a5c7bb86783d0cd73", size = 5033361, upload-time = "2025-11-17T17:20:45.332Z" }, - { url = "https://files.pythonhosted.org/packages/a8/bf/70d97758b5b1c7ee06afca8240b6e02bdf5b18d18eb59b873e319b3e01b2/thinc-8.3.10-cp310-cp310-win_amd64.whl", hash = "sha256:8d5ae7d96ff3ea2e4f23bd4005c773f4765f41b11dfb79598a81e5feb1437b91", size = 1792397, upload-time = "2025-11-17T17:20:47.014Z" }, { url = "https://files.pythonhosted.org/packages/38/43/01b662540888140b5e9f76c957c7118c203cb91f17867ce78fc4f2d3800f/thinc-8.3.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:72793e0bd3f0f391ca36ab0996b3c21db7045409bd3740840e7d6fcd9a044d81", size = 818632, upload-time = "2025-11-17T17:20:49.123Z" }, { url = "https://files.pythonhosted.org/packages/f0/ba/e0edcc84014bdde1bc9a082408279616a061566a82b5e3b90b9e64f33c1b/thinc-8.3.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4b13311acb061e04e3a0c4bd677b85ec2971e3a3674558252443b5446e378256", size = 770622, upload-time = "2025-11-17T17:20:50.467Z" }, { url = "https://files.pythonhosted.org/packages/f3/51/0558f8cb69c13e1114428726a3fb36fe1adc5821a62ccd3fa7b7c1a5bd9a/thinc-8.3.10-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ffddcf311fb7c998eb8988d22c618dc0f33b26303853c0445edb8a69819ac60", size = 4094652, upload-time = "2025-11-17T17:20:52.104Z" }, @@ -4377,15 +3450,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/44/32e2a5018a1165a304d25eb9b1c74e5310da19a533a35331e8d824dc6a88/thinc-8.3.10-cp312-cp312-win_arm64.whl", hash = "sha256:234b7e57a6ef4e0260d99f4e8fdc328ed12d0ba9bbd98fdaa567294a17700d1c", size = 1642224, upload-time = "2025-11-17T17:21:14.371Z" }, ] -[[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 = "tiktoken" version = "0.12.0" @@ -4396,13 +3460,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/4d017d0f76ec3171d469d80fc03dfbb4e48a4bcaddaa831b31d526f05edc/tiktoken-0.12.0.tar.gz", hash = "sha256:b18ba7ee2b093863978fcb14f74b3707cdc8d4d4d3836853ce7ec60772139931", size = 37806, upload-time = "2025-10-06T20:22:45.419Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/89/b3/2cb7c17b6c4cf8ca983204255d3f1d95eda7213e247e6947a0ee2c747a2c/tiktoken-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3de02f5a491cfd179aec916eddb70331814bd6bf764075d39e21d5862e533970", size = 1051991, upload-time = "2025-10-06T20:21:34.098Z" }, - { url = "https://files.pythonhosted.org/packages/27/0f/df139f1df5f6167194ee5ab24634582ba9a1b62c6b996472b0277ec80f66/tiktoken-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b6cfb6d9b7b54d20af21a912bfe63a2727d9cfa8fbda642fd8322c70340aad16", size = 995798, upload-time = "2025-10-06T20:21:35.579Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5d/26a691f28ab220d5edc09b9b787399b130f24327ef824de15e5d85ef21aa/tiktoken-0.12.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:cde24cdb1b8a08368f709124f15b36ab5524aac5fa830cc3fdce9c03d4fb8030", size = 1129865, upload-time = "2025-10-06T20:21:36.675Z" }, - { url = "https://files.pythonhosted.org/packages/b2/94/443fab3d4e5ebecac895712abd3849b8da93b7b7dec61c7db5c9c7ebe40c/tiktoken-0.12.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6de0da39f605992649b9cfa6f84071e3f9ef2cec458d08c5feb1b6f0ff62e134", size = 1152856, upload-time = "2025-10-06T20:21:37.873Z" }, - { url = "https://files.pythonhosted.org/packages/54/35/388f941251b2521c70dd4c5958e598ea6d2c88e28445d2fb8189eecc1dfc/tiktoken-0.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6faa0534e0eefbcafaccb75927a4a380463a2eaa7e26000f0173b920e98b720a", size = 1195308, upload-time = "2025-10-06T20:21:39.577Z" }, - { url = "https://files.pythonhosted.org/packages/f8/00/c6681c7f833dd410576183715a530437a9873fa910265817081f65f9105f/tiktoken-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:82991e04fc860afb933efb63957affc7ad54f83e2216fe7d319007dab1ba5892", size = 1255697, upload-time = "2025-10-06T20:21:41.154Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d2/82e795a6a9bafa034bf26a58e68fe9a89eeaaa610d51dbeb22106ba04f0a/tiktoken-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:6fb2995b487c2e31acf0a9e17647e3b242235a20832642bb7a9d1a181c0c1bb1", size = 879375, upload-time = "2025-10-06T20:21:43.201Z" }, { url = "https://files.pythonhosted.org/packages/de/46/21ea696b21f1d6d1efec8639c204bdf20fde8bafb351e1355c72c5d7de52/tiktoken-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e227c7f96925003487c33b1b32265fad2fbcec2b7cf4817afb76d416f40f6bb", size = 1051565, upload-time = "2025-10-06T20:21:44.566Z" }, { url = "https://files.pythonhosted.org/packages/c9/d9/35c5d2d9e22bb2a5f74ba48266fb56c63d76ae6f66e02feb628671c0283e/tiktoken-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c06cf0fcc24c2cb2adb5e185c7082a82cba29c17575e828518c2f11a01f445aa", size = 995284, upload-time = "2025-10-06T20:21:45.622Z" }, { url = "https://files.pythonhosted.org/packages/01/84/961106c37b8e49b9fdcf33fe007bb3a8fdcc380c528b20cc7fbba80578b8/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f18f249b041851954217e9fd8e5c00b024ab2315ffda5ed77665a05fa91f42dc", size = 1129201, upload-time = "2025-10-06T20:21:47.074Z" }, @@ -4455,37 +3512,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" }, - { url = "https://files.pythonhosted.org/packages/84/04/655b79dbcc9b3ac5f1479f18e931a344af67e5b7d3b251d2dcdcd7558592/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753d47ebd4542742ef9261d9da92cd545b2cacbb48349a1225466745bb866ec4", size = 3282301, upload-time = "2026-01-05T10:40:34.858Z" }, - { url = "https://files.pythonhosted.org/packages/46/cd/e4851401f3d8f6f45d8480262ab6a5c8cb9c4302a790a35aa14eeed6d2fd/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e10bf9113d209be7cd046d40fbabbaf3278ff6d18eb4da4c500443185dc1896c", size = 3161308, upload-time = "2026-01-05T10:40:40.737Z" }, - { url = "https://files.pythonhosted.org/packages/6f/6e/55553992a89982cd12d4a66dddb5e02126c58677ea3931efcbe601d419db/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d94e84f6660764e64e7e0b22baa72f6cd942279fdbb21d46abd70d179f0195", size = 3718964, upload-time = "2026-01-05T10:40:46.56Z" }, - { url = "https://files.pythonhosted.org/packages/59/8c/b1c87148aa15e099243ec9f0cf9d0e970cc2234c3257d558c25a2c5304e6/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f01a9c019878532f98927d2bacb79bbb404b43d3437455522a00a30718cdedb5", size = 3373542, upload-time = "2026-01-05T10:40:52.803Z" }, -] - -[[package]] -name = "tomli" -version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, - { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, - { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, - { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, - { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, - { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, - { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, - { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, - { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, - { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, - { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, - { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, - { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, - { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, - { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, ] [[package]] @@ -4604,25 +3630,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] -[[package]] -name = "umap-learn" -version = "0.5.11" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numba" }, - { name = "numpy" }, - { name = "pynndescent" }, - { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scikit-learn", version = "1.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "scipy", version = "1.17.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/94/9a/a1e4a257a9aa979dac4f6d5781dac929cbb0949959e2003ed82657d10b0f/umap_learn-0.5.11.tar.gz", hash = "sha256:31566ffd495fbf05d7ab3efcba703861c0f5e6fc6998a838d0e2becdd00e54f5", size = 96409, upload-time = "2026-01-12T20:44:47.553Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/d2/fcf7192dd1cd8c090b6cfd53fa223c4fb2887a17c47e06bc356d44f40dfb/umap_learn-0.5.11-py3-none-any.whl", hash = "sha256:cb17adbde9d544ba79481b3ab4d81ac222e940f3d9219307bea6044f869af3cc", size = 90890, upload-time = "2026-01-12T20:44:46.511Z" }, -] - [[package]] name = "update-toml" version = "0.2.1" @@ -4671,17 +3678,12 @@ version = "6.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, - { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, - { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, - { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, @@ -4696,11 +3698,11 @@ wheels = [ [[package]] name = "wcwidth" -version = "0.3.1" +version = "0.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/6f/e1ea6dcb21da43d581284d8d5a715c2affb906aa3ed301f77f7f5ae0e7d5/wcwidth-0.3.1.tar.gz", hash = "sha256:5aedb626a9c0d941b990cfebda848d538d45c9493a3384d080aff809143bd3be", size = 233057, upload-time = "2026-01-22T22:08:25.231Z" } +sdist = { url = "https://files.pythonhosted.org/packages/64/6e/62daec357285b927e82263a81f3b4c1790215bc77c42530ce4a69d501a43/wcwidth-0.5.0.tar.gz", hash = "sha256:f89c103c949a693bf563377b2153082bf58e309919dfb7f27b04d862a0089333", size = 246585, upload-time = "2026-01-27T01:31:44.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/9c/9d951691bf1224772f6082d3b2e8c110edfd9622627908ad75bb0f691979/wcwidth-0.3.1-py3-none-any.whl", hash = "sha256:b2d355df3ec5d51bfc973a22fb4ea9a03b12fdcbf00d0abd22a2c78b12ccc177", size = 85746, upload-time = "2026-01-22T22:08:23.564Z" }, + { url = "https://files.pythonhosted.org/packages/f2/3e/45583b67c2ff08ad5a582d316fcb2f11d6cf0a50c7707ac09d212d25bc98/wcwidth-0.5.0-py3-none-any.whl", hash = "sha256:1efe1361b83b0ff7877b81ba57c8562c99cf812158b778988ce17ec061095695", size = 93772, upload-time = "2026-01-27T01:31:43.432Z" }, ] [[package]] @@ -4765,18 +3767,6 @@ version = "2.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/49/2a/6de8a50cb435b7f42c46126cf1a54b2aab81784e74c8595c8e025e8f36d3/wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f", size = 82040, upload-time = "2025-11-07T00:45:33.312Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/0d/12d8c803ed2ce4e5e7d5b9f5f602721f9dfef82c95959f3ce97fa584bb5c/wrapt-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64b103acdaa53b7caf409e8d45d39a8442fe6dcfec6ba3f3d141e0cc2b5b4dbd", size = 77481, upload-time = "2025-11-07T00:43:11.103Z" }, - { url = "https://files.pythonhosted.org/packages/05/3e/4364ebe221ebf2a44d9fc8695a19324692f7dd2795e64bd59090856ebf12/wrapt-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91bcc576260a274b169c3098e9a3519fb01f2989f6d3d386ef9cbf8653de1374", size = 60692, upload-time = "2025-11-07T00:43:13.697Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ff/ae2a210022b521f86a8ddcdd6058d137c051003812b0388a5e9a03d3fe10/wrapt-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab594f346517010050126fcd822697b25a7031d815bb4fbc238ccbe568216489", size = 61574, upload-time = "2025-11-07T00:43:14.967Z" }, - { url = "https://files.pythonhosted.org/packages/c6/93/5cf92edd99617095592af919cb81d4bff61c5dbbb70d3c92099425a8ec34/wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31", size = 113688, upload-time = "2025-11-07T00:43:18.275Z" }, - { url = "https://files.pythonhosted.org/packages/a0/0a/e38fc0cee1f146c9fb266d8ef96ca39fb14a9eef165383004019aa53f88a/wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef", size = 115698, upload-time = "2025-11-07T00:43:19.407Z" }, - { url = "https://files.pythonhosted.org/packages/b0/85/bef44ea018b3925fb0bcbe9112715f665e4d5309bd945191da814c314fd1/wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013", size = 112096, upload-time = "2025-11-07T00:43:16.5Z" }, - { url = "https://files.pythonhosted.org/packages/7c/0b/733a2376e413117e497aa1a5b1b78e8f3a28c0e9537d26569f67d724c7c5/wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38", size = 114878, upload-time = "2025-11-07T00:43:20.81Z" }, - { url = "https://files.pythonhosted.org/packages/da/03/d81dcb21bbf678fcda656495792b059f9d56677d119ca022169a12542bd0/wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1", size = 111298, upload-time = "2025-11-07T00:43:22.229Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d5/5e623040e8056e1108b787020d56b9be93dbbf083bf2324d42cde80f3a19/wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25", size = 113361, upload-time = "2025-11-07T00:43:24.301Z" }, - { url = "https://files.pythonhosted.org/packages/a1/f3/de535ccecede6960e28c7b722e5744846258111d6c9f071aa7578ea37ad3/wrapt-2.0.1-cp310-cp310-win32.whl", hash = "sha256:8330b42d769965e96e01fa14034b28a2a7600fbf7e8f0cc90ebb36d492c993e4", size = 58035, upload-time = "2025-11-07T00:43:28.96Z" }, - { url = "https://files.pythonhosted.org/packages/21/15/39d3ca5428a70032c2ec8b1f1c9d24c32e497e7ed81aed887a4998905fcc/wrapt-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:1218573502a8235bb8a7ecaed12736213b22dcde9feab115fa2989d42b5ded45", size = 60383, upload-time = "2025-11-07T00:43:25.804Z" }, - { url = "https://files.pythonhosted.org/packages/43/c2/dfd23754b7f7a4dce07e08f4309c4e10a40046a83e9ae1800f2e6b18d7c1/wrapt-2.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:eda8e4ecd662d48c28bb86be9e837c13e45c58b8300e43ba3c9b4fa9900302f7", size = 58894, upload-time = "2025-11-07T00:43:27.074Z" }, { url = "https://files.pythonhosted.org/packages/98/60/553997acf3939079dab022e37b67b1904b5b0cc235503226898ba573b10c/wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590", size = 77480, upload-time = "2025-11-07T00:43:30.573Z" }, { url = "https://files.pythonhosted.org/packages/2d/50/e5b3d30895d77c52105c6d5cbf94d5b38e2a3dd4a53d22d246670da98f7c/wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6", size = 60690, upload-time = "2025-11-07T00:43:31.594Z" }, { url = "https://files.pythonhosted.org/packages/f0/40/660b2898703e5cbbb43db10cdefcc294274458c3ca4c68637c2b99371507/wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7", size = 61578, upload-time = "2025-11-07T00:43:32.918Z" }, @@ -4815,22 +3805,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/43/a2204825342f37c337f5edb6637040fa14e365b2fcc2346960201d457579/yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e", size = 140517, upload-time = "2025-10-06T14:08:42.494Z" }, - { url = "https://files.pythonhosted.org/packages/44/6f/674f3e6f02266428c56f704cd2501c22f78e8b2eeb23f153117cc86fb28a/yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f", size = 93495, upload-time = "2025-10-06T14:08:46.2Z" }, - { url = "https://files.pythonhosted.org/packages/b8/12/5b274d8a0f30c07b91b2f02cba69152600b47830fcfb465c108880fcee9c/yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf", size = 94400, upload-time = "2025-10-06T14:08:47.855Z" }, - { url = "https://files.pythonhosted.org/packages/e2/7f/df1b6949b1fa1aa9ff6de6e2631876ad4b73c4437822026e85d8acb56bb1/yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a", size = 347545, upload-time = "2025-10-06T14:08:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/84/09/f92ed93bd6cd77872ab6c3462df45ca45cd058d8f1d0c9b4f54c1704429f/yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c", size = 319598, upload-time = "2025-10-06T14:08:51.215Z" }, - { url = "https://files.pythonhosted.org/packages/c3/97/ac3f3feae7d522cf7ccec3d340bb0b2b61c56cb9767923df62a135092c6b/yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147", size = 363893, upload-time = "2025-10-06T14:08:53.144Z" }, - { url = "https://files.pythonhosted.org/packages/06/49/f3219097403b9c84a4d079b1d7bda62dd9b86d0d6e4428c02d46ab2c77fc/yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb", size = 371240, upload-time = "2025-10-06T14:08:55.036Z" }, - { url = "https://files.pythonhosted.org/packages/35/9f/06b765d45c0e44e8ecf0fe15c9eacbbde342bb5b7561c46944f107bfb6c3/yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6", size = 346965, upload-time = "2025-10-06T14:08:56.722Z" }, - { url = "https://files.pythonhosted.org/packages/c5/69/599e7cea8d0fcb1694323b0db0dda317fa3162f7b90166faddecf532166f/yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0", size = 342026, upload-time = "2025-10-06T14:08:58.563Z" }, - { url = "https://files.pythonhosted.org/packages/95/6f/9dfd12c8bc90fea9eab39832ee32ea48f8e53d1256252a77b710c065c89f/yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda", size = 335637, upload-time = "2025-10-06T14:09:00.506Z" }, - { url = "https://files.pythonhosted.org/packages/57/2e/34c5b4eb9b07e16e873db5b182c71e5f06f9b5af388cdaa97736d79dd9a6/yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc", size = 359082, upload-time = "2025-10-06T14:09:01.936Z" }, - { url = "https://files.pythonhosted.org/packages/31/71/fa7e10fb772d273aa1f096ecb8ab8594117822f683bab7d2c5a89914c92a/yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737", size = 357811, upload-time = "2025-10-06T14:09:03.445Z" }, - { url = "https://files.pythonhosted.org/packages/26/da/11374c04e8e1184a6a03cf9c8f5688d3e5cec83ed6f31ad3481b3207f709/yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467", size = 351223, upload-time = "2025-10-06T14:09:05.401Z" }, - { url = "https://files.pythonhosted.org/packages/82/8f/e2d01f161b0c034a30410e375e191a5d27608c1f8693bab1a08b089ca096/yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea", size = 82118, upload-time = "2025-10-06T14:09:11.148Z" }, - { url = "https://files.pythonhosted.org/packages/62/46/94c76196642dbeae634c7a61ba3da88cd77bed875bf6e4a8bed037505aa6/yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca", size = 86852, upload-time = "2025-10-06T14:09:12.958Z" }, - { url = "https://files.pythonhosted.org/packages/af/af/7df4f179d3b1a6dcb9a4bd2ffbc67642746fcafdb62580e66876ce83fff4/yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b", size = 82012, upload-time = "2025-10-06T14:09:14.664Z" }, { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607, upload-time = "2025-10-06T14:09:16.298Z" }, { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027, upload-time = "2025-10-06T14:09:17.786Z" }, { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963, upload-time = "2025-10-06T14:09:19.662Z" }, From 1add9a5a8d21aca2e3c4b00b8cfd76aa4998e2b2 Mon Sep 17 00:00:00 2001 From: Derek Worthen Date: Tue, 27 Jan 2026 13:58:33 -0800 Subject: [PATCH 2/3] Release v3.0.0 (#2191) --- .semversioner/3.0.0.json | 10 ++++++++++ .../major-20260123143225940955.json | 4 ---- CHANGELOG.md | 17 ++++++++++++++++- packages/graphrag-cache/pyproject.toml | 6 +++--- packages/graphrag-chunking/pyproject.toml | 4 ++-- packages/graphrag-common/pyproject.toml | 2 +- packages/graphrag-input/pyproject.toml | 6 +++--- packages/graphrag-llm/pyproject.toml | 6 +++--- packages/graphrag-storage/pyproject.toml | 4 ++-- packages/graphrag-vectors/pyproject.toml | 4 ++-- packages/graphrag/pyproject.toml | 14 +++++++------- uv.lock | 16 ++++++++-------- 12 files changed, 57 insertions(+), 36 deletions(-) create mode 100644 .semversioner/3.0.0.json delete mode 100644 .semversioner/next-release/major-20260123143225940955.json diff --git a/.semversioner/3.0.0.json b/.semversioner/3.0.0.json new file mode 100644 index 0000000000..47063938c5 --- /dev/null +++ b/.semversioner/3.0.0.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "description": "Monorepo restructure\n\n New Packages:\n - graphrag-cache\n - graphrag-chunking\n - graphrag-common\n - graphrag-input\n - graphrag-llm\n - graphrag-storage\n - graphrag-vectors\n\n Changes:\n - New config: run graphrag init --force to reinitialize config with new layout and options.", + "type": "major" + } + ], + "created_at": "2026-01-27T18:50:37+00:00", + "version": "3.0.0" +} \ No newline at end of file diff --git a/.semversioner/next-release/major-20260123143225940955.json b/.semversioner/next-release/major-20260123143225940955.json deleted file mode 100644 index 76089e1e50..0000000000 --- a/.semversioner/next-release/major-20260123143225940955.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "type": "major", - "description": "Monorepo restructure\n\n New Packages:\n - graphrag-cache\n - graphrag-chunking\n - graphrag-common\n - graphrag-input\n - graphrag-llm\n - graphrag-storage\n - graphrag-vectors\n\n Changes:\n - New config: run graphrag init --force to reinitialize config with new layout and options." -} diff --git a/CHANGELOG.md b/CHANGELOG.md index e8a3f5468d..1b349201c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,22 @@ # Changelog - Note: version releases in the 0.x.y range may introduce breaking changes. +## 3.0.0 + +- major: Monorepo restructure + + New Packages: + - graphrag-cache + - graphrag-chunking + - graphrag-common + - graphrag-input + - graphrag-llm + - graphrag-storage + - graphrag-vectors + + Changes: + - New config: run graphrag init --force to reinitialize config with new layout and options. + ## 2.7.1 - patch: Pin pandas==2.3.3. diff --git a/packages/graphrag-cache/pyproject.toml b/packages/graphrag-cache/pyproject.toml index 65bed4921f..9f5e0f75ab 100644 --- a/packages/graphrag-cache/pyproject.toml +++ b/packages/graphrag-cache/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "graphrag-cache" -version = "2.7.1" +version = "3.0.0" description = "GraphRAG cache package." authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, @@ -31,8 +31,8 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "graphrag-common==2.7.1", - "graphrag-storage==2.7.1", + "graphrag-common==3.0.0", + "graphrag-storage==3.0.0", ] [project.urls] diff --git a/packages/graphrag-chunking/pyproject.toml b/packages/graphrag-chunking/pyproject.toml index da2b5fab7b..730656d940 100644 --- a/packages/graphrag-chunking/pyproject.toml +++ b/packages/graphrag-chunking/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "graphrag-chunking" -version = "2.7.1" +version = "3.0.0" description = "Chunking utilities for GraphRAG" authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, @@ -30,7 +30,7 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "graphrag-common==2.7.1", + "graphrag-common==3.0.0", "pydantic~=2.10", ] diff --git a/packages/graphrag-common/pyproject.toml b/packages/graphrag-common/pyproject.toml index c8d221f76a..679259d9be 100644 --- a/packages/graphrag-common/pyproject.toml +++ b/packages/graphrag-common/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "graphrag-common" -version = "2.7.1" +version = "3.0.0" description = "Common utilities and types for GraphRAG" authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, diff --git a/packages/graphrag-input/pyproject.toml b/packages/graphrag-input/pyproject.toml index 54ea11b85c..ff26698dfe 100644 --- a/packages/graphrag-input/pyproject.toml +++ b/packages/graphrag-input/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "graphrag-input" -version = "2.7.1" +version = "3.0.0" description = "Input document loading utilities for GraphRAG" authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, @@ -30,8 +30,8 @@ classifiers = [ "Programming Language :: Python :: 3.13", ] dependencies = [ - "graphrag-common==2.7.1", - "graphrag-storage==2.7.1 ", + "graphrag-common==3.0.0", + "graphrag-storage==3.0.0 ", "pydantic~=2.10", "markitdown~=0.1.0" ] diff --git a/packages/graphrag-llm/pyproject.toml b/packages/graphrag-llm/pyproject.toml index b10639a702..6ffef39494 100644 --- a/packages/graphrag-llm/pyproject.toml +++ b/packages/graphrag-llm/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "graphrag-llm" -version = "2.7.1" +version = "3.0.0" description = "GraphRAG LLM package." authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, @@ -32,8 +32,8 @@ classifiers = [ ] dependencies = [ "azure-identity~=1.19.0", - "graphrag-cache==2.7.1", - "graphrag-common==2.7.1", + "graphrag-cache==3.0.0", + "graphrag-common==3.0.0", "jinja2~=3.1", "litellm~=1.80", "nest-asyncio2~=1.7", diff --git a/packages/graphrag-storage/pyproject.toml b/packages/graphrag-storage/pyproject.toml index e21020061f..5d349cc94c 100644 --- a/packages/graphrag-storage/pyproject.toml +++ b/packages/graphrag-storage/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "graphrag-storage" -version = "2.7.1" +version = "3.0.0" description = "GraphRAG storage package." authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, @@ -34,7 +34,7 @@ dependencies = [ "azure-cosmos~=4.9", "azure-identity~=1.19", "azure-storage-blob~=12.24", - "graphrag-common==2.7.1", + "graphrag-common==3.0.0", "pandas~=2.3", "pydantic~=2.10", ] diff --git a/packages/graphrag-vectors/pyproject.toml b/packages/graphrag-vectors/pyproject.toml index 8dedf25f99..50a0c3ff82 100644 --- a/packages/graphrag-vectors/pyproject.toml +++ b/packages/graphrag-vectors/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "graphrag-vectors" -version = "2.7.1" +version = "3.0.0" description = "GraphRAG vector store package." authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, @@ -34,7 +34,7 @@ dependencies = [ "azure-cosmos~=4.9", "azure-identity~=1.19", "azure-search-documents~=11.6", - "graphrag-common==2.7.1", + "graphrag-common==3.0.0", "lancedb~=0.24.1", "numpy~=2.1", "pyarrow~=22.0", diff --git a/packages/graphrag/pyproject.toml b/packages/graphrag/pyproject.toml index efa1a3fd39..598732f050 100644 --- a/packages/graphrag/pyproject.toml +++ b/packages/graphrag/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "graphrag" # Maintainers: do not change the version here manually -version = "2.7.1" +version = "3.0.0" description = "GraphRAG: A graph-based retrieval-augmented generation (RAG) system." authors = [ {name = "Alonso Guevara Fernández", email = "alonsog@microsoft.com"}, @@ -36,12 +36,12 @@ dependencies = [ "azure-search-documents~=11.5", "azure-storage-blob~=12.24", "devtools~=0.12", - "graphrag-cache==2.7.1", - "graphrag-common==2.7.1", - "graphrag-input==2.7.1", - "graphrag-llm==2.7.1", - "graphrag-storage==2.7.1", - "graphrag-vectors==2.7.1", + "graphrag-cache==3.0.0", + "graphrag-common==3.0.0", + "graphrag-input==3.0.0", + "graphrag-llm==3.0.0", + "graphrag-storage==3.0.0", + "graphrag-vectors==3.0.0", "graspologic-native~=1.2", "json-repair~=0.30", "networkx~=3.4", diff --git a/uv.lock b/uv.lock index b6e1a82c33..4d169181e0 100644 --- a/uv.lock +++ b/uv.lock @@ -880,7 +880,7 @@ wheels = [ [[package]] name = "graphrag" -version = "2.7.1" +version = "3.0.0" source = { editable = "packages/graphrag" } dependencies = [ { name = "azure-identity" }, @@ -939,7 +939,7 @@ requires-dist = [ [[package]] name = "graphrag-cache" -version = "2.7.1" +version = "3.0.0" source = { editable = "packages/graphrag-cache" } dependencies = [ { name = "graphrag-common" }, @@ -954,7 +954,7 @@ requires-dist = [ [[package]] name = "graphrag-chunking" -version = "2.7.1" +version = "3.0.0" source = { editable = "packages/graphrag-chunking" } dependencies = [ { name = "graphrag-common" }, @@ -969,7 +969,7 @@ requires-dist = [ [[package]] name = "graphrag-common" -version = "2.7.1" +version = "3.0.0" source = { editable = "packages/graphrag-common" } dependencies = [ { name = "python-dotenv" }, @@ -984,7 +984,7 @@ requires-dist = [ [[package]] name = "graphrag-input" -version = "2.7.1" +version = "3.0.0" source = { editable = "packages/graphrag-input" } dependencies = [ { name = "graphrag-common" }, @@ -1003,7 +1003,7 @@ requires-dist = [ [[package]] name = "graphrag-llm" -version = "2.7.1" +version = "3.0.0" source = { editable = "packages/graphrag-llm" } dependencies = [ { name = "azure-identity" }, @@ -1085,7 +1085,7 @@ dev = [ [[package]] name = "graphrag-storage" -version = "2.7.1" +version = "3.0.0" source = { editable = "packages/graphrag-storage" } dependencies = [ { name = "aiofiles" }, @@ -1110,7 +1110,7 @@ requires-dist = [ [[package]] name = "graphrag-vectors" -version = "2.7.1" +version = "3.0.0" source = { editable = "packages/graphrag-vectors" } dependencies = [ { name = "azure-core" }, From d39ebed61ec4cd85d1491fbe1ccc71904371c61d Mon Sep 17 00:00:00 2001 From: Derek Worthen Date: Tue, 27 Jan 2026 15:03:19 -0800 Subject: [PATCH 3/3] Fix deps (#2193) * fix missing project urls * fix missing deps. --- packages/graphrag-llm/pyproject.toml | 3 +++ packages/graphrag/pyproject.toml | 1 + uv.lock | 2 ++ 3 files changed, 6 insertions(+) diff --git a/packages/graphrag-llm/pyproject.toml b/packages/graphrag-llm/pyproject.toml index 6ffef39494..730cf9c6a1 100644 --- a/packages/graphrag-llm/pyproject.toml +++ b/packages/graphrag-llm/pyproject.toml @@ -41,6 +41,9 @@ dependencies = [ "typing-extensions~=4.12" ] +[project.urls] +Source = "https://github.com/microsoft/graphrag" + [build-system] requires = ["hatchling>=1.27.0,<2.0.0"] build-backend = "hatchling.build" diff --git a/packages/graphrag/pyproject.toml b/packages/graphrag/pyproject.toml index 598732f050..a6c77025e5 100644 --- a/packages/graphrag/pyproject.toml +++ b/packages/graphrag/pyproject.toml @@ -37,6 +37,7 @@ dependencies = [ "azure-storage-blob~=12.24", "devtools~=0.12", "graphrag-cache==3.0.0", + "graphrag-chunking==3.0.0", "graphrag-common==3.0.0", "graphrag-input==3.0.0", "graphrag-llm==3.0.0", diff --git a/uv.lock b/uv.lock index 4d169181e0..3a59e113b7 100644 --- a/uv.lock +++ b/uv.lock @@ -889,6 +889,7 @@ dependencies = [ { name = "blis" }, { name = "devtools" }, { name = "graphrag-cache" }, + { name = "graphrag-chunking" }, { name = "graphrag-common" }, { name = "graphrag-input" }, { name = "graphrag-llm" }, @@ -917,6 +918,7 @@ requires-dist = [ { name = "blis", specifier = "~=1.0" }, { name = "devtools", specifier = "~=0.12" }, { name = "graphrag-cache", editable = "packages/graphrag-cache" }, + { name = "graphrag-chunking", editable = "packages/graphrag-chunking" }, { name = "graphrag-common", editable = "packages/graphrag-common" }, { name = "graphrag-input", editable = "packages/graphrag-input" }, { name = "graphrag-llm", editable = "packages/graphrag-llm" },

    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 literal 148830 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

    6y(#ngW(e_H2FNL$pL41UzGlu=Sik#$ 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 z z`iF}quhG=s^%-twZUw4cPPoBaEqzKg>nmcx#dS-*o@ZSzU6R(!+YMQI1A#sR`yX1u zui$qA(_vT}4HDPF_{Qzw)HoZdahn6^p&wgY&j;F7;j{7{cPX z{?Q(m%>K*!bps$Alr)k)*yQ&H+o|QSxA6s>>_g{{eLWA7k6x7~@~qP8(>+Cv8e zhoVPPCQnMb5BV8dI4h3cEoqQ~q*3ru3tv@lPXO&pnTaM{k~!f3t8ciClb%EOe~n=F z41cXnC*Sj(_Ww{cKbKgsY^ zD`&6qv*c$z&1B*#p<{TD-4?+82655@?0=HZJ1(d9jpK?ESy47wA(8Al_jP2GO+?vy zuk1}CQdB5S387?$I`?(5_ukoi@BOuZpZod!;q`s-?RlPa?)$nvpZDkLJm;)A5kyZf z?ck=Bw{gzYegVoq6Vpmx-)+ z^!C>LysoXSakXv%BzClul5o^c}4759y; z(U!qLGAO{FU47a}crBg0=}NAz9xF|we+l!zAkmC{Aovzf2+c5_2A-3Vy(8rNA2&4h z`D#Dvg+_`-0`v2%Gzq;X>eYwg2f{A7xZd^ULhUl1AJn1LR%&8XO#i*Bg1&W@7lE5e zpA$-@*kH9Z&>|J~ZZ{T6Wc5SG* z&|?du$K-&ec+PRVG@Vg#7Wioi=7xBHg^dPj)EfYLuw!!jDhYATT^{nbt_a7sZxq zxW*}P16|m^f=gU%fpZ-$(PKP&PAcKE#1i{#IoIVZ4R~%#v-|v#U_wUzP|T_7R9KJk zrDkI$(Bk}!6i>^Jvx;)(L1Q_ob2xo*kKsE0e!MHrAAIg<(eK}#_p@UEjmJU=wavlF zr|Islq5{1uvdY{M3;jZb{kxl@sPh^+`28TidU`~{!(?e2YZJ%8Emz}vNJ)3OcF)VI z->}YUT(Lr&RD7j0uGGR0@FF*hCywkioI+>0iT;nR^&a9JA#Z3$NAIVGxxHnT^C!SB zYw1sSA;IR^Z{Btg(Px&Z{6o73rh@tW40twOE!>|1%HDo+$XP?N(Z}9nS)lVYdWz#4&tOu3r(%Qs2 z;@sjX@A+&|x9Vm}N$AlO=ftILf@t4`(t4%fU>=stgxb%BpL^9C_ev@a1TWF787ZP- zg|g(?_KZZ%0sk*&WC-(`djT^ktQCjeEG$aiIjb z`~pu|d|Y4X_l<1So_w=oH8>@bpac8S`*eO!s9bS&8cpx;8acBR_xKSht~))G2mEl) z@X37`Ie|;8$WM!h<2g8%z!O+2c^9*Zuc zzNuT?L;PxUA?2S^>vBaVy-ub5Qw+8DRQ;c|d2jD3YLo14D&74&_B<(O+S77A_e^Ra zUg5cVX?LCJT-}*UUj^zw!cWEIAI|8B>N4SRMZNKZ2LiPw73YA3Xe*vq1n;62^_am+ zBBg&KA*)K2Bkp7@xBOStq0jh5Dt|KS8`B#Q_GZ0HYy*jp;D3ewdnqNoO44F%VS9?H* zqxp|xFuqga!yl4nayy?MCb$sCNTf27nlq?5Mu3xh&gPvX6~hqb5_}@_CxH)T){Gp* zUKHT8ouT8JTDyrC$I2A_6Js`^GL?b6FIvt1r+l7DC6%HLxF@(z(aNN13Tr5!35L?T z>1pS1Tz`aP16Li#rdU$zT(uEnZ_U*Vg7hFun?gSrTxcT;)8KTU$^ z1oA%Zh`J;e^iSz+3^0T8#HtwGzsI)E+_u81o^CtjGQn!^GY*xLyui4+gr!PxD3d4H$XYi5wH`4puCvc9M{ZMdnds0~f zx*+QwJ<5?^w}PX}=u-xU3e+Lh8#kK&eC{p6g7#2Ek1$nlx__64vRA6)_9ZqM$7(O2 zG2ELM505dC(^Q{O?wpJ0|KVcx?WMHpPdzf*$Iz}H!n8VGPsf^T*mq8DG+OzXn6dqm z`Z;6$_uU3^125UqUCnU_e!yKueZidSsm1RyM{XC##tSW`%O9?H_N?eLV>N|8jg>nZ zyqC30;a)Mv4-k5f4<$Te%sc4Z4qH|%g7cJanGKcaieZCoaDV24I=ljVz76bW&B}k! zD|(*888l;JoQ3hurUw~KY$7=8MlzRkSV2D948Agw!7Z@_#%1URpX->6{VW9ksgC)L zkHG%Rq6c@2G_p3;+Kk-RPW%fvg1J{4wLdy|L+LDq@-rUR{FX${gf>*?E7cbgW`Ybh z;elZ_EneQ~U}rwv%u&rGR9@o3-v$wSP6kYg;Ahh=(cH%oYVIc5XC78OryVPLQ@(7L z!pJ4rYE~AVb{o99fT7(2^Gy?bqOZNOf>*ft%O|yqaET&6wU_Ji>56fY|Bw+6;uzO4 zSPFBmX>!KIvZm%x-bCGVXt`6CEQFk-@}orkqaIrz^S7Z{H}dHl23O{=s@=flA!6|}d~NA2uL*Qc~oSu9)i4|*EB{FljSPFOF@+Rn?+S?OwC z%dcE)4RKJ|^o`Un%Q+4f?MnR%$=sL`*Yhd5Eh`)XZ7{?9X$u(46%nja7=n1g1 zE6?ha}x8iE2NlO)u!^@@EX^|zU^%o6D^oxWy%Ly-wGCW9>xOiA`xDIwRz@W%W^?Ap~J>1`=sd`V5*k-W+ zhe&lk^IR`dtF@_oqSQmJ#-rQN)HA#+v%ktRV&&V)`mVky609MhpK5+7hW<-}M#s^c zj@zMiheg95dG&eE9hK&btj2jwH4Csyj>1*3?M-;0^r(@J{M-OD@db>1CKO44&cGCwsHcw!SQ@uR3d3y?V?W+GyM&Z7Th} zj{DVY*(cXLKPvO#_eI_2#M9x~>2%A^k+b*Sl4lyflW$#a^ZXgr^qRX?%b~+Ac?BJK zFKY%)<>NCF$iCyqY<{$a9Kt$_h*wvPDwEuey5a6-VullanBGuUT@WSSH9Vl*taAvz zbKA;36~}Q%T?g~Q&hnaf-7-9|PyhhZ{e^d(Tm}pZL*&K|E$b zLGHJ#iRoLT0sDTg%#S`tO2@bM^z}|#$~~4O)?VvI_44iItG{!^kC|>CtBg3aXzh=dO55r|Xy2|2+-ojoa@SC8jOLd4^GibF*b~SdNx= z%`cIfXCJ56%feo+;}7?*^L?+9be?-lhXxVSoM({7NGn-%?khQeTORxB6w@{11GCyvTLVySudM(reYuB zX#Isfbgw_Ii%7i5GZOIJs?U|l|H})bzsqY<>vOdF5nk5fjF|l24c=ey2%GaX4vg4K zCD&G^7@NZ8p7M<;q47$~o(1GRM|xIqniJ4hUt3^^Kz$pN$1J7kUr+M7r@txqZWGEV z_Rz5Z?5Yo~*NivJ>cEFEi&`wSJ#+ z<_oKSs|}m^yJ>BK$433DGiAQqiF~itZkqIEA(gB0L^dfFO5;yl<2{+Hw5gAZh&QIE zjPJwbyni=m-0317AGyvK{+(0j%cD2#$MdKv@OjQP{Ajj=vspQZo>a}Y!|0?fp-kBdK&Q;n(IBsou_9b4s{vhS}hf|N0 zJsIyy?=OC$hfgxZw%7o#IXPSSjCDV(`$_(LeJj0;kJHe*d@;4CK)q4QnCCR3-)p&g z&mNh4unTQF_ZqD6TmDTctta9dJk&3DKJ1L%3FM`zr3jipCC!Wcx1c0_=4ZJ+K833; zC~nT*wwKh;x3O=aefm?8Z;=bV8Z&^=OTsvsV?50W=kTE~v$0;X@7qOk&7%M0=Av;t zWx_q}`sV9m%7p%y)tzD-H$_CQp+i?+8qh&LGqo_kFIt?l7Wzn~FCX7&{4}F5Z(O#+ za$I)fygB_(b#C_WuIzFtuU_X-G+ipPn_qnC&CnPlx|SxDo|Kv1k&+%(r~5yr(X|_q zUh6&-#CN*yFf`X-(V9>T5dSy8_r&f6*1~btZ8`7KV7b-UC4DNsrME79NcCBfnX3ufW;y5SU)!(GI0A1?K zuhxCwVO!d;>Q(J;w8SxMVU@qo(AV=&<9+gz-RHb z*i9O;rjWU;MF*JH*hW@XSLrx`<@!y54fF}LbUU1F1ix}EZiX|qGv7-}? zUAbGkP@Y(32bW#qfmzsQI&L$T?smD)2fj9w8%zEp$60+SPiGJH?_BcZAZppI3IG1S z0Q=y<%138<=8$@i^L3X|%<;Ec!%v6A(R2Bzi1t+*|Ld8mH~3OXt{M2%>%@Z`iab`G zKcpX%_RI6@YgR0wO+&3steg4#Ly%nAIoUuzh{E6J8}MSY!nt2~=0p!}+qtGWX6hV5 zz03TUmU~t5ea7G%a7iSW#P#o={O)r75@iUVA(sX&Q9m!Up00s!<*MF>cD96WtyD}w zIA&fjXO^@LSWI%Ag9+^xzq1B0e2+5U%wlL7dLWrXUlyX<9SVp%g52J+9 z$#l@Ou{@g2ltF<36@&POVgdbsF@=$u{H->fy*M&E|2DWU# z>iwZx7XJqi^2v||6kW^U&~7_$eAPsfj}KStdP9^hn#NlFng)7{hfUclE-%hv#f_*F z6Xz?Y&1<29+sL=Z9t&%>uXD+3@VoXB`(>auE%hz%y`o4GYbFUllN$EhIjsxY$koOePFQ2)s5U$-=RztUW zewAKcaHD%Ri!Cfu`u190y{7@gJLK0^qsixow}o^5oHz#7cqD`G?&mw@&Wjo;JMkRT zUF5pZpHl9{$ei#bD*Ns-HH(q5>6;BgF=oqbe+Ku8M0_Ve4EHjp?e-PmJ^ozJgO6E7 z(~B>;yu$Encn`cMq==-Ai9!{}E-R{eiU-o-aDrYC&7lJ8|rs66ABt zo#3H5GzT|QdJaZ+BJ3lb{yal`vHD6Cx11M>A;1U(9^>@TX%ehxqUXVfxF*o)q!`=v z0<}JA^5ROkuPM$Wt5X)Q?hwhg-?DgVgXdoGT2>k0ztcTLNX#DafvaLJq1Yy+iJ#~@ z>xwwBErXZz$dQx2Sn>E1J!R)E@A-i1Wuxz-sXQwB3WrX+L(%;^aLAdX+|#x%&$X(^ zCGORrU6U$usfIUXrJptQ+*fDhjDBO}@k;^71bNKMi#_S%lG5e~=T1t8v@?yz^Mz`& z1=i3wc6ge_$J)K>BmBR-$i}&e<+Xz>$9HPEA3yKy!a?;bQIEzkT)L$sZ+;58q$!NhLiNa=Rce=-d{?r~(;4 z_FJ}}5;N8)y;f_km-N83{Rc`j{FOWsifieooGAQ8EdBX)-D}Cx3&tvt_>h-n7H3<%9#X_%&SJr<8cWnwjG^V)( z%SKk!_1z1CME$Ejly8ZuH@o6^9?A*Vy<~31yM(MD73YDmwMA3c2)Co>dGl>MQ>{gt z8|#Iq;{#Ti&?mA2BbUMBmU4sHlE4lEzC*j44`KKXS142tukEb#mOD&5PF=706W#Tu zBRP1Ml3tj_`92KRBIiZxReuxmB&iGwE#l1YONHX|Z?Dq@*h8JOJalywoqS)#1YZ)E zPau0s)QLc*(RaGL>VXlB=uWxL>X>w73HfJLL#nm+l{gqVg@zU?K{JyF(gInA9{0(V zU_uF9k_C4*6wpIiJnuCLHsRlHQG9OZV~)p6A=Up2<#hfh!cOj`yWc7)J`uL%p2XW=u#RL~CPmrrS;93rRZk0{m;?FNX+=sX_W&{C>^^wywIsd_Nin>}*tq&bL{0+=D zhOzd1yp_F<`2v0SJujdktb9B1@?j45$W_c{$;NA*x1uJk$}!G`XO8V+fMKcI&f2v5 zW;3BY-{ay20v}80ukvj!pIbnj`n$x-c11~j)5lAOPrpLu%;X0`y*Jj&D+S*h7&G;^ z#9TsqF=82gDYS@v`y3Tr`ulQ5u|Whr$N3MD(7wi)L&y^MHq*}N4qEt)G7=e1VvZr; zGg=g7NTnyeJ`|UzJ2|cFG%k|iB9*2mIc4z>zqdTjErp%;*JqD}C;_cua0=D+$1}V! z#|ry>oIOS^GRnB+(ElH?NH1>xl86#WSvv;*NX(~Su%t1$lTpQ)ue^9@&q-f z&WG30s@w;x^c{7r<_-dVrZSosrLQ5(WmNs~*6u55n!l5V+(BC=Nob#e;}+l{V`|A{nWzl|0|qg8L*_Jml{*zzU-ND#!KGa0{&>Qy!x&m zNTNWN6Qd`k5*VGvkH@n~8$@u%lsfvWbrUW6Sh}Sku#nr!uBxgS^mfBzbdz(f4I~0j?m1-;%1%Z zjF}2wN_#42m5B7r4DK!92h?_QPd@9=99gplVb;U`Uq;fd(|rki#f#2gftQqJBchH3 zn;2kzQgfeLHRH)Fxt8o}2>xhn<$|SeF!qwFpTM&is%_NZ0diikAU=NSmdfh9!ke(h zwaoIl%hcMEUq&LA?e3gC{?~9$tI`8m?7KjwH7dJjYtV1=(Ac(kuE}yaXh}_IbseF! z1sPg%cPZr6%jXg@ZYv2*XXGi=gRQP=1-fW<*w~Bb1l$oh{)Kr_^L(bC(?MLHb%sz6 zVBIq29#vyWXr3^w&#EfMK!LQ{Lx0&eM5h@$V1#^B{ zYGQDezNm%gM$gObF)JF$*?kjuf8a1n9YJ^K%Iflj`q07f60rU_Ym3e0w9F8*eq0z*$1;)l<8BxF}UD zHi;Tl_svGeRUAgP0XC+?!TXl}LSKsGi9Uq6msZwjt~IT+mn+^GfZ0W=P(O=(HjXEr zqG|IEqt`rj*!{|K`^5G-3TD?upS$TnDZ;7lx z!CO4{+6+7p2OcYECs?v*pfRCa5`?h26op)GV+Fxf}^m zoMS3ISF_`1r}xF){_a<8qa-X~_<4$K~wSn|Kpz$$tL z36J2-4cl^T$8UyzS={4li!1I$Hc~!27{ig@-_vxzyt3}3+tT?#gs?G2bD5=SWb^Tl z=HI-C;8AnrlX)fR$5bbC_m6yfn>SD8Efv-Ov|JoV^SzGMB98%4Q`4Fw%}VCFD^ z_m`9YCdmF5L+JdRN}@WhUwZI9mfOzrrj^u#7rn~hpi8ffn3Ln^Le56=2(7>^?d%xG ziF;to;vLs6$zW}faQfjvkMWB2JI-;`!8@XQ`D>bu@rn=Z`zZ2t*(kQv3}N?nv26U^ zOW~Ia8~3mGlHJ`4>2^&qcNx%tm)@Mi*H%{1JDNjSl(@lO3+HM@8s}sC!PRNO+rnZ? z;7`uu)q)##O%pAqZ72F_!|q$gbC`ESF{+BY`D)2V@#{wg+9IBdD)|0tPJAA^)waK^ zv(KCISH*XVSk`2-)lu!sK@&BLDeH}Ih7)tuU^0QY)!g3cZa zrhf-&@%%oS{Ic-{&1!ZVtnW;|&^nx&H%#M7L8A%pFE6={;hcCpOQgURQtwqIypI?l zIwRNbq&9DcX*H+Ei^z(L_~xBb^zdOj_PM#3OMkn_SYv(GSxpXGmC2%ZEcux>=Bt{2 z>A|{IeD2k8S?}u*(QU;bJj2YDPukDm?JfV437he&yzLJtct~sdSqk^Fy}AU?vOP!g zL<&!@`$0_lTb?>MA4^fi>T}#MPmW9IK<#1{%3*!ibM{kQGuz+MEZ=CV+!I({+r4#% zsPOk8y_mg6JaNy-{#>ChV?F7IOEaD|=PAuto8N3X@-9_&JgS*NIrP1O1Gn#9f!+Gd zzG^ou1zB|T&&>L*G zq8-0zRf&c#e#|$1j^vZ+De`*nqWZnnSES##ot)?88!GeSAHAD8nF?$U#WR$SQj?PV zsq*WEa>M9R>X>Qaa2FouFjp_Mu@+UhwodqcDXlv$h~*JUE_^@3N&gsIo!(xFrL8?& zO*$Va7thI0LzcEApPM!mH88*4W3V@)ZurpJWU)5j1Z6r-quo{7(!%@1iLtLK|FPS2 zwNnzm9QTOkr!PZK;JFE7bonsLmS3OTLN#l&LEp`iuewC??dNv-@;^IxNyS05q2OvR z{=1m@v($T1eK(B18Ix+<_d=a$p$(6aZzW0VDoo)MWqk1d6~#&W|3t*R-n<|&3-52r z>KjZAHKA>K_fh7(9)^3o&R}({=ofvz=T=SZS!f*VpW$gW`?wZU`iS=Zv0&MGIo&PC z!sg>#d1n3srA7FRFH|bCBXfZo)cWT>`S+VH=S7{6X>D?8$}cizhBl@z&v0+4|4Q-5 zh#tazaH@E*@hh(`S5?1aUsi@Z@5JLKR5cfLdQ2_tmeQtUbtzcOYvwqv6(7L~tGYL) zPi}cc*Q)WH9$iQEXZFX~RL%`+!M|U3Wb}+tA*m3*bE-%KUeDm2?^aRjiUgYe-yID# z$VGO<8%{n;#J$zN9DL^vcbYMuca3o4TBA-|YI6F8IJwy;i*c^m)yLM-rv$mETHs#M zf&8dyC*p{ea?Xu(V@PgkTGMZ{49OE=q^$q#b;UkTzWz8`n^R*U&x>j+58Ta1s1rsF zXj3{w8OOE<@z>nb_2$6Xao5psh9C-`8A%%YgudmN~l^a zRc9zJGk2l(v+vW|hdV^sS(qtz^APAiJ?pf!__|{$g=KY+&`yHZ$*()?=~!cEB}{asHv!h7 z!Hp>4;frfMdPE5I?|Vc6v1I%{S!BR*ajRkii#tcCdikDoWP^j!Oj76KQY#hyQyYEv znOh&Js-M3zl>?_|@+H^T8gz*VdyePf*F5Ea+iG&xE62Q+x?YAxjF-?8Q8@Z0Wfuye zT^^-r{GiJ;+79*ZMREoDMRfS`O=J%3z^DW5SpPco zqE#|Dq!uZEjEM}uzFeR?uHlqyRx}%St))ZD#reF;#N9K`ke@cvgwN@6xJwb;dfZp7 z-0AI>8moBXyo9gI%Td<)fY<*SO7|QZRHIqti<#&*{vEhiz23n7v(jOB4y!d)pE;!4 zPF~*0hEzSSm^>nTWV3%pNzsTJSF6JItne0}D!;tscJ&n)|} zyUGcXJ+?1_9n3L9>+|awz62en2P1dU!+J^5b9fm2!SjG|4)D`~bb5G>aH&4rKm$|u^SCRf{9^vn=A%d-5J$?>)n`M`vTaI7%B3@F@P^SZ*|y+8 zhHo2_3#{OYjXbzQ=lx2Ty?PXX#i(tI@0DMSXAoN5Ho!m1*LfIE<0X7C5XWp`>iv#}>JcPFw8YYhTlK!vFD$%@QE%~u{QwDqLU^Z!9UM1r1 zUGRLdaVpIT@nf7LAHj2#>V17Ip;_X=`!YPQ41Sk2D}!to-4LJL7Erm7laJ$Ni!DO4T2nOSs)qP)RC7L=h{7()zypN9fGVix4$*50ybmhCnE7g9K zDOy7Js$5gw^`HfTr{Oy#^w=x?MV!-P`M&7``aXIiW!1`M{2b{q0|dNNs5O{1XBc~b z+9Z4{2?h(`zJ}en@VHXAHv2pnf2*ps?E76Ncs(_~O8M^49s|7M8(lD6LIz zI@9~Dm~TJ8$jnUU+ImgsgExUCBsiFUdDP?IheIuF?-80vhaIv6{0bgij-OU~OTXj4 zi!bBy(UG&h!t;Jru4B7~;JxzvoMfJ{HU#~%SbX~!#+6+c{WfNcH#UO`>;8unPK98mgP z5fk+(LW9?eVTC$MeS9Kq?6{WO#aM|@dn>Bh-(UP%UQ3kpS$Sxz zP(A-==o9!`mU<5c$3i0uD_`bIr`8bGO|S9v5W~wv$9^j;wY_(4IIo{!FnF0de3?eg zWR&#kEfm9Z=hA7KVtwQaUeIX>EC1_x8{hToSlZkpmWeB}6(gT<@)CQx6|+a$UfD+N zzWd3T_jx#YPaHkBP9SiG(hY8FQCDaa@$d^mhGcx696Vs5C98tPj9n3L`TOW87_K!B5%34=A*Pm1b*e{>v)E2uL2S|O2D78v8P_pM-BN|$MN#BWx-soY(6sUza&+|%6q<* zy+AkGH>Cl^!?^AF)haKW5%Y2h`(U8{^ovbcz()zaE>Tm80g(}33&mAiio5XM)C-KP zWjJ~qwQwx%F`;ArAWJ`kZ*=4p zflRJ6pTIs`sfrUT7E!Fwp&#rRt~Z5 zV_@)1`m&6@+so%yx{; z7b{uT0D8>Gg^au>!9xtj)0F>$(=54uQvXj%=O}yZ9q}%~HXAjf<}@lRNq8!&Ia8N{ zH$_O34FY`zZ48x4U%_BPd$n3Z<4NVMb`!_T4;Qlycn;Y8xx94BNe^F`#dpsP&wf)d zgR#F9*sQX^tcQ0+jLXLRa8>8M42GBJO&PYbfO#bEbMdq-u0a_WL*piFpew<iucJ26HK0K(fuDt9^G_G5RAE71$G@pZdUlranS708sR9E`Y(i_iI7&_gkaLt*D z=Jr$B+Zc)4C|Ju2l%`OBrXN2K3@CSEO2NKNSNBGwe{F44zenrKp4rR$Z}0_!JKE}o`0C(I2^l?S0M zV8VY!!Ae!kZce8a4=LW|=<1G)S|IcxZ+~1xV0OmvPWfzEJ~ac`uf=(@L*HlIuuP2H zv2CT&dFr|G2&dzB*%QaM6zB(nFUWRnw^7RaIhZTDV!m~fFk=wtFU+#$3GAiFbo{0@ zxKUir8?_jm^i4Pgo>W;?X}1Z^)+1~V31oeV`3PnM<-nR1M3Kh91a?t#0OW-TR;)BF zyrfhX|eS?vsC3-~*WOw;_V+=U` z8n<|V44G&{w$ks@Z&MjeBrwBK+RR1Qw?fhniX7_u;o_Y04;p*)~|}vA{kGa40RRd`LoDypSJsl_NG7P4%KR_mG+?Mhy%x zs;xb%W)g;X_t{*&?^3ou{7X#gA864bcmQ`SoK16XxY47k=b$6cIJ;1O+)wT--M@ZA zLQ6z{A7{SieNOcl`xJ{cnrAeZNxL%`nk5S?oXySG+?Q`0+_Vu{N!%ZEnt=Re^m(iL z(z$Ylx%jqaA~a70-qC9^d1c%bdi~Wj-qprzvF|^vQJ){&KHnaiP^uM|81YW>?oYzC zr8T?cv?Yg64~?$xI%ruz3q`3GJEZrNHZuLtIZj>ZF1kCHV5iC@@eJmo=DA}_#QW2~ zIeDnys25e_kq`4|*|`>U?wGAi&0NZ5f(Oa$<8A2dq!P5D>j*jN(RH?-=7VP;b(SH^ ziU-c?o^*5J~MX^%h@_U*`r#4)T*L6}iacWxQzaSGnY2Nvan$lQPk16*`E7!CD)!nG^>C^>W#YfWD=kMi%8?88HjkW&mdm>F3cRFj|n)&=b z+d=Uf?f)f4xBeh^q=*(GfWT_5>T6b*3Y>Ge0#oyAY2O+^nqw@Mk>xabhCdkd}E>nYPp z^)ORjFXehsKh)as(W?H2+igRe{ramo^5L)ia@>!rR$ocRhBy)ERF6ye<)vAhcXCka z7;&sYi0IL5o1C*LQKV+t>HfHv=GRWuDE-T3t)q1%9mgfgG)s^Z59!>+;Xm=*sT)tu z7^RM#3oQIaY8{5&?Z+Mqi|D)m-DK<~UCUd7pF3R=I0mxm7D{*5MDhD2`!&~MHMvU3 zht%%MYg&WfwPYO7#DKP0lrQEH)hQIj&phYytXl9x6Y)oj^kSCl9}AVm%;j{BO9El8@4#(zuW+P{58mptJV{q;H3fA)qi z?W#}H9G1)8xb~%=&l%Zx#~XPtpD*Wl9b~Js7sRc%Ze0GyIQq9Nk;II#Ja5$3RyHdoHD@n#JqZ{S97eVWr zucSfo>6&BQNj^0D6Ag)7%NJ@5le^E(=N%=sGxm{MJwL!s(-Rmq!CU6XQ^oJ9$-`$?Et{X8)C+gCb@57uI}v zg{{8C<&N+j(pye#*aXjuZ*S=v+cjOdNc-6o(9hZ2{m-9ka6^IplNa-Q$<&40*?Ij{ zaoIBu`f(-2=R9Y}b1BllR%>onu^HQ6dq-vVOR_rKg^O*+eMmkYqGf(n^`pze$$5Pb z9$sXVfx409Yo8RhYcB9f=RLfq=u+*>pkc<3v9;J|r#Dx`{XFX(yCSQU9K@yG)TG6i zM$&%w6`~cMzguKyU2f`IN48y=%C)-(h+Z$E#QW?>=yEeTvQU)#lT%QydN4q&Gn$L} znP2f|DzDv9l>5x{)PuvTs$=3;ZAu#>2A9^RrTd9B>!%1hd!PGPch>poSutQ%aq9J= zxVg(Ao@xy(hdr50VQa6+Y4>*0mmfQ&%kptl|C$w7xPFNLjKp;t!Gi>JO#Pf3_;DAn zUT`}LIv~rwT0=zx@cf~b(KIdnI*EJ9_)d0LzOd(*$e!3tlpKcN2d$#)lW%gNBZ7NH zg(>Z%j?42{dbDQjQZau+L48*`zE5GD%q6P2a+Ntw^6A{Q#`8-zcVLraLHf;uY=ABzIriBu((3M@(sbd9;Bwe8MG~Fy{P>41cm)AK(!Y) z)Nf4-6Xk!rrQq-l68$S4*@e-hBnNslVJ=%O4W)UyAMMW#$r@NKjL;u^*>iyy7Gq;p zu9-qv<M6cStX?XWn@{O#9?+co=X`mA;FIZV2g6`s;PtZT%{inKYv%5RpyV;A- zuXG^10WERqOC|68G}gV17nfHo;a1PRxzU&WEU#Z35-nDU^dUbjxXfFFq_PV2qe*xjUcAtStwE-TD6^ZcZS$*X1a zli3pID`Q7bVgChZ40VoJd*150hRP0Vq~SP3L+ybWd9w*$zI=vp?lNd)W9URBv)bsZ z%Gb7GU0f>Ck~8`Bh93H5<=oEA?iJ*PxNz2zqPrhpYZ&cy5ZfcL-kX!TagvoNka>--`p1HW2GFQ|_7WP-GygO;$Ns1D?HCtk;cL-^9{AnH=T&of z!_5NTJ~w+~;%W(O-XuWzEbY?I24tqzMdS8;#u zre(F&?ebfqZX|qy!7J3@TO2sb}xUv(Y1Vh z?Ni~I_W@Wcl7@!#;$eTkk?KGAvI)QA8m-q*+La>unG>-D_9L}k_XloLuTg8OZF4## zD-sVIU|gs;fuVwzwtB& zFB=WNFD#~%NRo<`))|L5V)YJz9@V=Idrhbrc_AW}>kPKj!D}qPhih$1hsa?ui)n6o zlgkut0gqWLn;eLf?XHaBHS52~%j<9-_R%ra{G``@uoCaC-;k76ws?7&YrMyEm>!?v zGbhRrG*0CE6V2d16Kf|rCcIWG!JTFvP+H0BTBh(N%<5u4UscCIiXnqb=F=<9tEr<_ zsOsm2#`OBt^tZz*Qcw3W+5gTB7NZ9)7Fd7oO-tmi^x=eBC4FlHRr~Bw?v~K3&WV|) z?|}O@s$-DD{!Zh5Hnw_UuVPa1H#Cslia438C|drV`Cj6+@@A|j9rfFTdz<{EKRKbK zjabMXd#9@UG}aes#Ld0^3CttghnL{jR)56DUq{63;9$bBK>vzxWbPLl)wLH}w|tK^ z=+0j@)G`k|_CoD66c?U3t2JYIj!>+R_Y_C{pr;Q@n$cfJFtPxLG%9Fs~X?{*lb{H-t*{{?{_XmD_n+V#WCl8f;pvFJt z3)C@TjPg1GU1KmGftSSL3s1@F{cJ+bdih50R$hb57LNNc?`8c?Vd!%hTlL&Y3!f4x zrco@?{MRaiH(PWZ%%Pz_IKEnWb6+>yKYu`dWRT`UeGb-~#{OsG-*$^Y|7m>W{wfX3 zXyh+nf#Lglzd4(@;`dtwZ|1QR?ka8&-uN!S{g;dBR?GTg!npQ|o9RaU88H;s8Xj&G z$0>EsgWK&z*B%QreDufy+~ zDyBph5-G3kbZC%NwK0F92R-ckM5r3VxyUXKGZZILvx*1BvoSY}L%6Qd_T*L`HZ+|B zKLw*#s|Y{)19Inwg<$X>5`R~HWxjmySQP3@6nAlp>^H}S(^q^pE<9Vu4>Q*?>I9kf zluU>h$X0^kkK*6CM^f#zA?wv);M^HB~|{m5t{Xp;jLhT*uC}_Ijm%se$aCM5srtx%W+3|Jp)1?wW&% z9+dk7edYZ+XK?-OW$Mwawmh@?fb{C+t1=ubeo@{N|FJp4m+Ab3JUY%-HcrB98Vqt~ z&{JyrbQ|YZiG@ZNw0JG*l6n`Y%}v4%3h1#h%OjGoZW^)*fvXJVUC3+FXXgQOyRC_> z<8HBHxd9hT>sV{vmQ-10`kv!P?TctT+AQUz_w#~n|7nTu-Pw0YF1I|6`^lGlXq=0x zP3U2>PU<;J26d_&ZLAA<&Wpx|%JJW7X`YA^-&?ky)# zi>en0^^SbGL{qbr-!5|qnM}u=K|{6|pWKsJ3#~)5D|R)fj)){=XGYDDV_ZAx@X%J@ zdn-<${spuW+0f2}UYYnzWep9y zV+NHjC8Gx5cj1^u5RQYgWQ~1Ol zF=WyBFay`vqH7!Tq_xz#F~0>t+@@J74}kyLN;NY=zY?^Kpg(HPq$}LnAB>E4@tD7aQdrTiln^f^ z=0Y6nUqI;c^hqf$^V|po|BceCHAN{?917oJ8G)vX5 z_Gy#OS>-#Cnk|AcrLm!`j=ZJbPp&wXK#_Y-s-IWdV1hNF< zzA%h$8J8$;r6c_9dj*C+n$JA{VD8sm+$@&6zf_C5wDdPzdw4t zo`;V!uJIn%=bZbtlF1)PF$=$tw*M=Ue&keBYF26iVcc#}7f3imIJyYzZ$+TciQms0 zm%e$bK$@7X{pTusp1q3WaxRK%74tAI^-RqpA105FXr&Ubin$b&z815a0uZw(nxm>T z7eJbQsH6#zbT9<8b=3&05%EkLUI=vUK=;D#Mx}7GYFg`qw0pU&GrRV*0fv?Yz|_sT zxOMjhOi8|@tgdrkqH6%DryWjkijfFE@Ot8Mcu&uTh% zuTr^fK8pDb)iDy6FfmsoJq0aq_66cK%=U?ZQDxoPuw$Kp<~c}ORK7ZFvohDnM%mKr z5UZ*F zCG$-H{+fLbN48%Ch1YZNVE8&dazr6CoqUV!YI6%Mv=bpe;|wm;DPw1P^n@2N27KvN z12rS1m6SND2(}vdaxdj_51- zC)wrglwa|K-G8%1E-O*F)C)Ycj_}Mk25L@QPkc)2Blst!f>VDhUT^0e?)WbP^UI^9 zwSD}tIO`m1<-QIs_8E_1!RG2>?YBHx$w0b3?B{%sHC*2SD+-^yTcJk{Rgne`!x94Z%Mf-4_9>= z07p+>Wj!YyL;p?Jz=NK%5%)?t;e!X~Bi#JWmo+#Jx%S~)+n`igf8CY)Y-=oU`(w=m z_YGn{T&}QN18IGYbH03U*Qr>yvoqd$s=~WmWNqo06}Ei`bav~kdMzIT$&-6P(}(Gj zhmAM$JU0hK&DfaesA0iT_-d**bO?)ptXFALlc?#~>|7LN4YiS1*r%}iHO+9w#HVa@ zWDvM3eX;xU8E7K4gLrd8ywT29y{M*Qh=DC1Fl!8a*GWfT~ zbLXQ^yu*{(z@8>)XcNN}2gPuvac(?@^-%f>% z&CI|tAsXIIEI{LsU*J#3*afhc1-*dWe4BS`DF8wIu_MN`g##;O7N=bWRF?+Dg6z4w4#ma4u zc)tLB`P_tb-pr;6)n+yH-ShO}bRIfxCY;Zl4gPhLG3U&3Sg~lBdM2+Po?k1&%-IHb z)1Zl*cq@t1|6_vLA^xc#5h&*vWxEcHz!zH&D8ZDP@!-+DOIB!4}INotmw#L)m z^#i5aYife0xbeD9c*E-t`t|KZpQm^4-TYb2;~xCXq(Izwb-rf!s3e#-pck~Kbv&qU zc>BWxG2MJ24)1sgsjlQLw3eveiVk?y*%9>K-c;)CoFa~m?-OZXQSDZ;{*4qq>31L& zeZGi63C}=pMLMHvVe~n4%dI1SzO|Gu-Qf-ww{62H<22l~p%Hu>yO~9{pDaGlsP3@a zyCvZDWf`l~(k@}MMu6JSej(1~ppN#UUc71;tvl2IQr~dR^ zYRx=Iaq-Ueo4XB1mQ?eYhJ&FA_Qd4LnMk?A^+!MF4K}m{Q3F}8+CzNV1Bv1evpm|f z7}q77@Q4%6V5-x8&>r}KoAvXNhXlqbVMVy9)u$Xm6d3X;?A1x$M$c<%HqV5QAI{o;jV>DLa52 z8uXJ-zq`OUh0(JJUYls&m<@P$?qzOzI+73T{|Ck#xmWwUF-NB1z?TQ;=Vns7z!RF; zdoP2xW(Z6;m5+qc(5+81I5yw_Ol|a&cb^i%)@78lzf1JF(cU_IkZ&=(SkE5B?~Ks%l_FIQ{;5!J66QaF*=?=i#@Te*7u5l}MK^`-58Z$`PcCO`=sXX& zdGpaoeaa6%^W%XVKH$6shR}0TS2d<#3H8f7bY0j})S@zYu^Ecq@4cZdn!DJlHT43) zw|@h9{q+kh<=Q`m`W;rkN4~*m8P$j<`#AP5&EV2;q7=qNZm-dt{z~02C}HMujAws5 z`?WK6$!wq3bCVAzOl8DD{Lq;&-ktB1;<^DVSk48fqKVmME_i_Wml3Z>E9`ApuV!}e zb-->+ni@fSl-|Xrn~&n>xC?Nts6J4iz>NK&=%eQ0_stV9;&=lmz24iE@8`V<3$Fp? znpf>Uh+1tn;Eemdao6Iya@!7BLNBoF!}|e#xiMS+tBmr-!bh1fx?hM~;me+%ROp?m zBYeDhOHQ>U;=roLZ-oUxTY+j>4IMa~lNMlcYb?{q5M^OXc|B1@#1miKwz_6=m}H3)rr1;^Cr%Ng}rAjO>R?i>f_!bT}nqnLyy z@=T{pX4X#+S1h_H>NM|WS`<#HxWPspQ{l69JW>y`z&dBec}NpXQ;x(<6}iHxQ*G6s z`!C{z+mX2XJ)q6ADG0oW`qaq#+@JRy5Dxfu?Y}5@DdQO0$m6H z@m~smpSV+SAG4-?)VzA7YVIG4LAlQl(7o{3G5MjcO1%aF&ZT_Wkeht>MJq;_j(LNg zur#e$jBFG@vDRYqAK!v2NoJxCm9C}Vd9|em2n(>l#F^IYS_{OH%1zpbaFFjH-m^y~ zig@E_JAqZaTc221y#GD*ejKhHISDH}2k`5&jtZRN#dn&)yZd2y;=pNz@Ly?rU>3KE z`$ubXI6%v1hjGS62?=M}Slr z?qr_>-&)>*ti<1p@RIF|i37q}NH>4YUVm?g9mfUZaNQbQTs#og{m=rc3u&fP59)1q zp(B}helwXcj3;jn;G`c|O-e&mYw$Hp>V29tjTlirp_DaC5O~+!RTgA0lPqoC~Yx!f^-To@^IP_|k%61h_!3kr}f_vl}PWoC} zJUkjmm*r7@fV3hUmSzxsjh3@_Tm&^}1X30c@gO=lw-xEp0%!bydzvNLpv3DDrs#~&dD#RPu!NCF=e8~e5i|Nfz z^CnRbKxjx27pet~$2nbkw$~Tf^y5gHo13gDMV*t4l-?T-pnu*sNnmgd-X|S+5Q{F; zI$ky&X!NO)J155~Y3u17rJM`sWHkf{E7%S`iFCqY9O$|ayYK16<90iu9Q_rxt-XSA z<4u9Eh`pJ-pHXci>2p@6>prBIs9J@8q4Hu7?j3sq2OXmM&O42u@J$oA;`ePc{%z1eU4A(Yz8~leKedPOL+hS1vz8}-FqG4^Xo6gK(cVWf zaBHCn)yfU*UvvyJhwosb_k=$xUMfLooh}JKGI`Z4;@Ss{@?Wc`G=;&WZ!O@T z&m?f(G60(Np2c#`d=y#*iT^P6iZj1J>(ta8V@7MpH>~Z&D#LOx+Ph60n{;G19yRPT zP@EKl$OI%lsr6N@7qsN2?v^ODWRXQ1^}m9%NZtx_eO`0YnJDySMH^a=kY-$ITFqpk z8*1v+r@XWV!bj481~PdQNd5AKdky~v|Lp6?p-)F)L9a->pvk8H-zNM3P+yS`jIY(^ zN36T5@9vv&x+cO}Gd^y7GRo>OIPg6iNej_8T$7Z94`YQkR$ThZq+eBD?wiEuc*K*Y zxmDc`vEj)ypCYdl*~ox>JhdKgB#b4$d7P0SWzro^k31b9OUp}Ot~}{?ec?aI zw={tSNsIi<0MZb$B((OS+q2MHb6$B{bCwaV!rrkCs{M%);>DXdvQcw^by#^Y8&2pj z)W1PH!4kI7`Jqj}xfp$9C|s*^LU=2_A>s_%a;Gz`Io(htoP!ewoS@=4y^A~5oANo4 zo5bzo+9B}@)dkN@cfsI8fwh>tYw%Itd961HPkd#QvqFBB7c6J^)6PnsU#h1L3r@$} z^a39HB@zVQ2DQsob`9<#3w_i1(qz#~jPw8o-g^se-|gb3P4~gcz~EY~N3rD>Vo&l0 zUo;rEc$Uzu68R*BFiG?mAKLjSY6=^wbZ()gG!$>)Sv161+&lK1^mO4;s7VPXJ#-!E z{*cZu^sCU5dE~Wu%XDA9gVs@7_Tn~P`Y{4cS1sT{{~iO?E-XBMknrmgJ}}-RJP`){ z^MHk$*TcGuaV%_pVePD82t60nCMZn!8cvvxq$j00K6}aEO~K^I+X`t$@S9slrrOLS zFT#61*b0Qr5{^!lt~}sK8W^+&kAYV!t}}tdLqF`mU;eT5{0hB)t$m(!KYedg7|cmy z!S2q@;mM~qiujq}lz?Vm*pRZ_e8-mV;A!(%=ud84&jpA}L3k6282bnPl;U$3`ABr1T;xcY06M`82_wm$g`n;Q4^Ey1Ttfo!#=k3~CaK=GV%76aqK2ry zJDetrkVzM?#dc?~{na?SpB$k-D*?_B7lFQ-qFmfZtMy`5+#&{%cm zueqCNg+zVBbw{0op?VXs?}LZbOFziV9423LoaMY2%+j*ovGbWv7}Xx1Gh;B{-Z~1Z zx^)DHAEt~j6=v@p$!n%Q<}|NRi|s!F)rs&2H2a8R?wgy-#4pm<6EutzlG)xGcGqM=@CPw;&>U}W^KSTI0_!~(#NK;yEFB<0nX&8xgt^72k2!uWsen#jg z{bQr#59XDG!ROfR{*&QF^&?G_t-Hi542TajBX$mv>Aae}`n1Q{f}I-TWQk@eNY|%! zUaO7d9dS=U1y@fTki;D8x?f!oUPbVe@E@k`F;ZTru}Xan{&{P0vs_d zpHU)qz!y~VvPbd6#Sch_JfQa}=i>ZMK0+fA@0Y=yj_u{R-MRei)th2QC1yjC+eBTJ zaJn|`gzb##4oCM4rFW)B@Ol+HFubF}O5z*K8p9O#6lpQpjIC24dgA5Fa`Qp6bqll$#($tq#EREgkpw9GeB_W3%SSL z3ZU5zj0$)m?XT#|H|6vp9Jq#iZ`1QlIvg6_^=F|A+o)c{*Ge;TXF>_R>zg$+g|JFj z6&mK*#W%ud)#gR`9qM03y~wC9B*J(8#c?qc^OqKFdvNl|jC3Okyd~ekh--!SqBwj& z(gBR(&O_2VDAb!c;gqwOdBMH6t(ov}gvko|3GlV*%?SgzcYZ8hm>z^yzke~B;o-NI zQ$&wI%*$o`#OSOEr309ws0{oBY(#C#WdHD zCR1&eYsoa{kjdw9p~vVx$(Qd`<~)m``RX>oi!|5jSUYQ^nAQ3sn%yy)39_AjW-{Rj z5O;9l2gUF88qs?@Z8LGP_F_KjM!3LhF6Io6!u|NzE7#zS(oz=nBs`|j8-$O+oVRSq1j2KDAWcKRYertg7RWcr3pfAdVpc;swKn%O+d}GXBz;9Q z=9RqLyLbFQ>jEqe^#t-|!Y|4Z$Aj{0kJ<{Yj_QfFs@I#JjJyQ|(bw$4D}KK9Uix?0 zM|c!8b?guJH(TPmz|FX2+#L;RZASCnKCf?#q)I2i&Pj71`F+^h@fiBXFTqk}Hg99S4?f)JC!PKi21P??&$~raagEzv z%x2?M&7p9>)O*Zjg#kMkdsN9-Vkbw>yTUe~H-OVykKx6Ke%#yG6XWA|;mBK-pm(Pk zgFfMC{h=Z5DBB{Hba~32B%Z@B`rZ)zv^W_fTAOr4AhI9}I89 zXkAJpOYwXB=(mhbxVoSBo9K!*)Q@DO;X|3BI&pI}UK>-w=JYzr|2@CJT))g_m5uB5 zq4P<>k4t#^)gW~A+6G4r>&oF@jp4%fX0lBu9kyj-4!gYWD{o~E+$hNegJ1mBWSRT` zX?h`e8|2{r-3u^8&VsmVb9u@gU8s7~6nB)Ir}dx5;82@2nwo_N@ei+t4vQUN0zGe9 zlDr#RUtGYRj$rt0|56z6PhUyWH&-=1=CXL=CPFpU;e;X9UvdoxhdE=HZtGdI6AN+M zgS&9|$V!Y)+lVdsNZ9ftPIG=zJ~mxgPa3zXC#P7*q4Q1nmNi>p^6W{Notq0Y2JM2d ztBW8dt_;V0y8>sNT;PnO0d#mj9CdEKV-Ga6Zu`Ce@={kN!i9R-P!aZpec4^k>GNh&?*o;8}^6LRe$+{{R%AFdKO9!4Uyz$ z2Jm6Dol4h}cd6+$$^FAEnA|ypeVFioX8e=+`tVX_7~Pql8Ssr|rtL+ev=WSTf5UXf zUdIQ=N%OAViD_;2utfVJX1U%PkGMC$>;F_9(*G@^V=Bk`U6S_b9_HHLNHdz+F04Bih&u*!fx*!= z{JQsTY+Eq`N>6o`M&2I{;p;ld?dTor_2ENtV7EBh(}v!?eDRmJ3;4x{xMb%|?raQ0 zZEBQV4Gz$KEC#!#8(_wjnK*JvuiBpR`L7-PH#3-9|Ng}*j3>k56XU@Qjd8;{;se?@ zv-#wX(7b9ReRj99WU?7jovRK#?O2b-$8l}Fi?EdE@!x^8XT$w^nqg(VFyr-3T6-*j z`Bdp+x4MxyJ~4#8lhqMDAt%2`uN|qa@x7w~ z2}_{)3=dfTJOck_^#Q6?d3Nv$OwybfgJ(iV9+VE(SvNmpn$b$jZ)@K+i&3wQgcE@7G$3w`Z*|t~yHT>14_zav~{}$vdo~yRK(v*uHos{*MnK>WE;Tt+*^Qzx${^$O1cIkC|VH=E9p55tv z1|8VctTFZEd;aiocg_1&ksxYZ*XJpxe#WoP!@y))3_1@!hX2>YuNYxWZG2?Ud-V4{ zSlM_7erfUn7g!|%~gnEdqVRqd*t}-z?}k1KU1Gb*0YU=EJXDK8zyw6kq7L zm!6%sO5}@se&omUyWtA+RMt2BIva8FE3N6>T8*W5fDO%dGs0I$u{a5zpSZJ9*XP!Jo8f>ipu7Z^FQC%m`0l=sC*BRfbB_};SClIXpU+w$<^-aDR&tj`9tKe+!Q`#%7kuL;wi4|N5krPkh$+d>+YP)`r ze)B94{|KB{dRV@|q9T9D^0P(DZ@Tj10tVi7wfJk8!36$gvvO`p%Q%>9vy@jS(;gtE zq2TiCE++gv$=YdkfVoi`a+iQw>$r4H4c;CO`vD|B|g+rAE}3V z>iP*1UBA-AC`RCHZOn)NEg_z6EO47w(@em2+8*9AD+-$(&Xj+TZ7f^<0lW|}28buI z;TKE1{-d5+?A2Rvk}PASrs(xBo*k-_NW76s zy!IJC*&nBx>yNa0x5ybMUJ)7s8*X|lxRX&V^A>kil*e*w6nZ82t_f*~7~EU753gPB zq+Zw_%T1rC7(1vErzc#-cPn*Hq%3W6cdyL>A z>9<~AB#t4x{f$rBJYu9jkZQSB??m1ig@U)zuQp(WSuj4O7{0|hvNubXQ#`-bYOT1n z3!(de8eV$p2=ia+58Z<1se|S{WqXJEQe8$d2WdJIFA``v?MPYN zl6&1))L1+++Or2Ul3PU9) z?IT=xDUvkQ2d3*YhYK9Y-Mfx2<(gW|YN59ucW!A5DORso+Tr=wGRs`lqxAgO36MRf zaq4A$ZOmX^{qq9~T)#N$0MKW6epee9qBg6=NNdvVmrP<&#K@@AY?U~T^hHnXeegLL zb$S9X9(@FJt5ZNY!*aVoOzhEV*q_uk(teFmbur)>fX3aUb)9w4X^W;ACK0Sr}pz8tUpQf zqHNUN+(rJVQ^6w+?7*5A^*P}#6kW{6vrF9|th6V^^*H}z-;ERB5~huoNHcM?s*k-} zM&NhX3@EON1>#oh{*v~S2+~&<)qRK}*VNzzTNu(=952@Y% z%VWelob&>y*ZV-w@hng;X~}$9ID6f@J?e~g6WqYGLJY7+XcGv&8w!o1-e`;`oaQS= zF5`sfc-*>zJzv*UwKF*fe;mj1I`UR_@u8kdIupAY3`eSCSl;phCygyfzg{S?Tow1G zIbMqA_C4iMd6OWwnLEYcs6zJ-pQr2uswv#v;&dKi6TS^Ilc`3qZ159aFe8Uk9}wm| z=e<5Tvh;iFVe8Qgg2Pxw%@3Zi?J~>V`<>_WZZwB0qH>$TFkd`bAjVRo1*Qk5!`g{ZJ~iM zZtZLIurcR(O>E`P8!r(L>ek|8OMV#>bY7$FLkH3!bFkoEbJ|yNAN*|Z2t!*rgYB#` zcv_lBdl%ki)L(p$cL+B8IhqOm?M?f63eEV%C{O$yih4?GUxuga4rQh@lb|x5-i1e?G>DKQ-hlz{GDftlgf$f8BeAW}k^qFD`(kP8C3Y5&B%~%L#`-&pn&; zZYk-*CMsz+?6q_+t}JQ^A&MmvJx}}!r*7M0Bl}Rn{aku{j}ynT2ecfC_NogY@SAv| zwswt2`{A9{9Wf@_13IjDNw}b+5|1;_(CJRcqrG#jSEjQ%{d2(TdAdY7gZsWkwC>^} zsx3#XQ_vhwZtBO#2e3|24e;(klt_~bUf|?mFyIz_XJnAX|7L8(i*Hsl+7^?Ce+@yZ zb1e6m1zz))N=plu;mUs6!fOca4x;abzH42%=s67q~ z15F|6%r8zn$Om}0W28N~@K!=^kr&4|uPex7)yE%y?$!3mkw>Y7Wv5`#pH$IPtcT@1 zJgM~niC@^KlNYh*8oj%@f%X}9oUaIP(s0vaY5y%BY1?=M%+Fbi+k1xbIk{!j|Jt~6 zNFER;asRg2=v;aM+#(M%;mI4F?1ZFGL{H}K{Ow2khRlayqsIVW)|g$KMbEyG_D!ev zj2a9&AiODmrMri1+ItMzpH|?_Q!AN#KO-+K2|Z36kHQn0eV&94>JQ;(WaPLnA!i!cix%?W9-e&@+{h*UCCroQ8xy=)EIO@CJ}R#Stf0!@EIek@T1F*qnMn zLvcj%)^LU=W0Nz3@Nm{8e(zco9rvLm{IJkuq%|S=MJq;FC-3negz0133$27=RzW%! z>ZR+$v7#5aam83DY-f1L$Zvv=X;6{o2l-*D2eaz)rG!2zmyoCWrqcmaqrS;4(HytBarCqG|V zJA0_KRFU+9OkO}C&adT7F;fx8p3|#)t#_%{Ihp6YD#glHtKhtwzAAdE)8z^zKZrdC z^rN-)_OM5$MNm+6ou7I*mxZp{4AjRG%`s%ETX?Maz>jY!(BFS5(98k5SM3ElCTy#0 zrx5Ql;XOz%g3G!B6!80om-&2ImNw+{+DrPZ1yZgM)&yq6(34M-npx@+wNl13yKLFv0+&+E5l=GK2gR1wgt(p}7=Le}ew5^C-MZsOMld z=0#7;r?riYj{PNnUB8wWs0J0n8cuawtF3noeTt-6^N5@9Kz1o(HkozQDXnBECjINvfVmQ!@3#d;WNl%Cw zgV5cKya%p65n1RpT!L%4U%97z*`;6hO|yG-xkyfY3`3m;zyogd0aYfck}{|6S=A7lHzH~FGJ zcD1_o?mpV*%V;*?uL&1AM$A@v4)tQQZUp1|q;Be?kaQ%yExa*4YG5R^8dJ{1gXlY& zH3%(6bAqo(ea)zLDE1BEa7H99NL`K}w`o-BNz@7nfSBfg_`~T@q_OGU^XIhRX=ns< zi>pGy1ZluOe;|*5Ig6hIX>gVFCJH@4d4g3do1nl;p-)CTuZEjaPg*9|i4|12kx%am zVs2D+ZZOTU9x&2Kd}Tjxcy~6H@a_dC|DoZZyMo{>n)x8%hDx;vjM?$k7%y)rC=x@}zG-|Vi~>r-y+jN;*(%OGa0501A6 z@|tXw*D$1W?!@8Jq+aKh=V)Q49yS{H$<_lV0STJ zVdQI&=9!$dC29^emWk(7rxrJmW}_hdqR1W1+%+^WM)Fjg_yE#UPGIg_du24<7MN74 z&x9=w-&sO z)z#i``mQyejNgMj3?H$Nk3wjRRGT`eI-^zG`Cu|1J!2C#s%wNj{D#BWF87tcar(H*=_4QS zPiyx--Nomx>;%i_FXX>n#zGt82N+E+HtL&AMg4$%Xm-96UJAa&H_8pws?sO?epnnv z4t~H|cQAmDbCT)1d3vwi_d7ou^@j}zGU3xwOId@FPIxA5E^L2PnRf@9$T_1gqWs}1 zE)Ar|rgd}i^>~Gw_ppZ>DRtqHfu%aVekyiIx{HVP|Kd{{OBuK6$zQU~!J*4ZZ1-#q zB<)zh8k8Pls}y%|n$uJ+Z(RWuJ1ZHTAExAHVxOyIKw@|gBg zV0qZ2(hJs@g|q&xSFrsdokYy|r-xs$RaSq2ev~B zCB>?fY*VoZ+SZiekwsImY*PSyeA!3!40|Gl9QekQ{Cx1AQIEX-tv@M_1sM<;ca<-# zmyTWUIzd9=FwCLvYGQvM$mTwyvGiV9Cx;;Yji%f$ht@8Nx zN(Xtt^9sIvfv!CB5q+OFdo(P#>4$$#Me~6xwIJf&6y|)z60C;0Nb0&GaZG%Y_Y)@F ze$5u)JvP838SHQen6$7`tIiLg|n}uyxNHDC`uDnTAo#Drd&(d_?bZ~x98~Ito9_JkV|Nc-yXm37~==$o_v7vm%4;BBm zipR6j(P-XDA2Nm>fc%le(T=~t_0wq&#_CfV%8BANub#a3&Qw^_Qh_~vOltpTp=)>c zb5;sI_nQI(|0!(UZ*R!H-&%g4I|xjF(lhIBiEKy(t?_+6kDh_w3z|-uP(k0l9=w{x zI&EtQUFQ8@8O6pdrol$#ZKuBc=PVl*xbh~iTRvJn`l1-4x?W~CQntg^`fm8p%TO*T z&BgBwOW<4uG%gALoa6>9kFX5)n$&MYv8seJ$BVh1@?O+me z9_p;`jWbpsVgtW529K#*l=@%V%0n*w;|)qX!s8n@;vaq*%ke^isY*FO>MPJ>41zhw zf_Y1~7i{u{7SLtJbxzmMRv$8k|Mn&`vjG;U#G2#iQ5j0>g!4o7;WDaEf1`PYs$qOYLZ}F^i0@s zu#uc|sSi3|iD8XjRpG+2fn3Cd>Yj&rZRUi9FxRIEznkd>=f|yr`R}86lgb~A>Qts) zFl z%P}-OT}f}#L8UmrU3+JB!j{ppxZj|gC)uS&Z}4rWLd7VrP-^S^YJv7Bno}t1l`yi2G=Jq`B(8w7Esk))TJ$$r z4}|?nX+}Ess@leW4_Qw&Qw{+eqjBTFQ;Ke%F7n@2E#&#tzggSAtE7zL5Q%UYdeqJ1 zCoSr#qh>}U;fP9c!+zGmIPud@Wu8_Y^!`a<&7@pB;;q|z@*ajW;o8uVFz=fad`;=f z4(o4*`HOVe6UB@*(q74qK1{@t@gYFDlqrvz_L&0&FR8ueM#7kj&9P&^FbJ#B1;Qn9 zPuy4f%$}YYizT<)KwqgPl+c{yOLi1%v;BZLE)u5anSN@=ha06JaRXd=86@hW_S(dM z7YwrDV+QNvAN$u#d%*}+RZ9EU>nHqki53o_cT~HM(t!zU)6wd*FYhx#m)*17gaTLT zKDelF!U@G`_Akwhk4@DxY0s5g3$39hVj%pnUkER@WJ**|k~rSRfjxov3<=v|(sWC; zY5ptCwB{zV&@h)8E#iZoca*nn`i)Y8J3i^HtqOh|wD7dDFO3Tv1L|G;rfnn>Dm1{?9dN8SKi%^*?VAz}00|@{+g|q<+L73y1UOtMYhAau^Vv zVp*NNY++du?|Sz%VbnCLI~};S;yhcvz?TV)lDV^sYTn5o1HStR&W8!VXgOZu?)G+p zKslp&`^zgUk|DTnZ%l9I%}X;nVDggNTx(}5W^K`0CG94=q5}^67Eb+B2js=FdfXu# z`o}*YoQOc7M@W0IL&2TZ)rUg3&|2d|H5lNNPnfKyhMLQ0Ml*w}Q~RKO>3EFQ8PAC) z)Zaz4PE71W4P6VEu5lzCcpKmLn9p9+Ex`fXN21HHdJ_E|ge|`XBmU63^xkinUTgq& zDV~U?pORTd(HFicce>h8uFwQ%9f3j54?(??^xSquJFN7W!NY2N`H5ti=l0ho6&YBWVGob28!)xyE8L4xVL>T00Y2(H4Dmcvvp}YdQs^TR!8W z{tf3{M$%kJcmhLQ{lMz9E_~_kgH($$^@7Mnt&aNs?>tN%aUA1k)W?{B?MU^--FheD zI-QO{|M&$qhf!}blNJfQUx!mL>Yfj~^01T^%u_fwdqucztM2x8ffbYDMJ=J>j8q^^ zs5C9`!RFtG!-{(uwAPHu2uo=1%bwh3@*$w}0C5;l&&V%5heEMuB6gifbAm>1V4>?t zfkQy~!+Iw-Vd(G_R=_Ryw3q9z8;IDl~{1m1$Hv-7bAS& z#h*@UNYimq=Phs1_dKL+&$PS2sn=wo!3eW~aE36*0!d@jwj_H*??5BNUO<`$Z`Mr3 z*sXm<&SB-nV%k$639=SUWt)!Yz+YN}PhbFH1$_r`1ik0Hh2KSW@LP}-v^p9uIFkwf zP1-@%`|d3DYz&T?@66|Pn8BT=mScHDEH=1424?kJ3gUW?-Mo)mqU;#)A(mTo6@G=e zDczyLL@g#XC1C&tzKDa=oD?Ju0@4#Ic?s5F!ha}YY)<<~klqoz${*+!^S^fe;mD#p z@GSZ)HXQhyclr|wCyqRoeDn9S(wwXOz~+8xQ#Juwx2Ac)hX-uyj?=YT%-*RvBR+z# zzen)H>R>o{eiu4V9mh!vaQY14Mk)I1k7X@pU**}8R&bYLI|P4{R|u1u)iK7|r>7EL zw+HL^OeFov-)4;C#G{-rg+KUXrIHp=Nn4=%E=6b;xSM$$$Y-fO{d;k79TS&&BWZW8 zz76CJ&uoWrEsf<-Pdfo&H`2Wm$7!Jc(y#C)m%dZDRF33T7~v`6?@DNJ{hCBIj^f_Q zM{v?bY;A)voU|XLxErdX-bIaX-Sw=NQ{$iP#eONRnN`0SgiQx|mw8_J8=dh~&2fp2 z&u%T;57Y-}9nnDEJ}v=Ed&s$t1I{wHlZNWp{Yj)NVySm3IAJosZ=^44zk9@t+ZEx) z3nk28>jToswHOA^{qB%&(xAYQZ$SwVV|H5TCl+OEr>?en3_9nu)j27{n7}sjlxk4f zhgy7|r?rg*yWWTM!^`mfrk=2`T^iHn1=6D#kNDgm#$wksQ+4|sMe?NZ@sWw>IjPGG zHz%h@v+<^ZHG zk?M|ek%j4&^H{mXF+9^H5{S!y@`FO7lfMJ2ewIw&Mz+T(tk^k8=tg<#W^-=QrWl2e zCC$ND@GAazVjkP22_el;En>l5{7QtP&F}J(UllQdQPkr+t2%(ZTq6k3>Wq)?UgB|I zcJx_rQ%@$ns0yvN?zcAi=-046(TnXlI}~m`4<XY>&qLHG%T zjr_PnV-$Mec-BE6ZOI5%xV~;M2!Bs{hp=R&Byyn1S%SmtddV)uw=@sG+=F2U_Cp7& z^L)aVtDNG&pEWry2~Xe%EpXYpXrY%B@*2D@y$9wWTnDS`*XN{X1@|#gQ%m}=R`omn=zue7Zhf$n=AgWujO zN|W*1IAJl4TsBt`#}l69!;jYNH|BHKbCvvJLV@ymSOiiJ$O$s7(PXg?V;cNc^kNP8 zi(jpPY7oQenHkbuTzEy>@(qLouOM)d{b}k!*`isZBx>(|!zD^gKwVDtE@#sF_oUs` z!1rfBV8@=brL5B*6IE!!$>S%|_evfxJj{`kHjvxs^XnD&FbVF|9+mf&e1O`;J#sv`U!7k&CAYa=WwO5j49O#HMS^A2wndIN;dA+1Ka_Yk;4UbUS( zcvh5#bSIP4#M^9EV($+v&0|QrX#hUoVKwK%2UqQFttz^eseVVCkm8nKa zhqS^!-F%twXT*iLcfxsfR=@X}UuEslV_Gwbe3WCOsh%s6IjDBYSeN z(CBz5@&=rYZ;I^}hBNZ*BL9qLZQSXRx8(KuFXR^7x!|ZS8!9^36Lo zrF~s3UudW&NxLSCJWJlMngMw~ToZFp_&1!ZpGI>MFBl%!hzWm6{vWHGRg%wG!D%*y zi@UWU->V}F|M5+Kr_lW>=@a(piXC*?mMs1bw|y)Wex8wUpqT9e;hR5~Y(>%vV!i<) zCd9?6(8UxJAid0l2W6&hYdx-*UAA)Q22{)P9mj3x88#b||D!#yW3HiHpUOO%p$W~; zBS+IS@&o8O;cmJzX$1WKZ9fucskY~i3VvYe31;#hegK6Qrye3L_XtT7QcpL>uSYBJ zj!PO}(^9JS^HxI(K;&TInA;M~6LDONFTD3{XEv^72rT=WFYttu7gT7@2m-GOcRd?kx?Lp6>S*_lOab28;QEm}|kxv#q$8>kiFa%1DnWq%$R&Cny4s2xr7R zL)mbx8p)%^OYOc^B4(SOBaUu#YM{@xb{6OBCk!O@e zz3e!aE4(`EceF(GFL^IBm9#Ez{=r7ww=V*1Jm|Uq0u`zTjRu-W)M`;TQKx-rrz zG$XW-$rqsTVky%;NW@Px2fso5bpi>KaC&_^$e#2`;1SpIb_aoVbbRIT#{RG`jZv(u zknmp2YT<65=aSIZS8p9a;xmQ%75w#Yu-C)C1KJPj zCwP#Pe&K{OD(NfucBC`EvgiOlnl_Ig>~;c=)-hLe5?(Ri?w=$-+jD4Lr3ZDU+Tza% zHf+L%y3pO+NOfqLg1vs`;^ez+82ugmr2X-Vqy%I-V@Mx-R7Uo2;e(I#U}pzi;vpYR zG2(m(DnqK+iV@Q=cGojSWAaZaEt>@WDzZ_(a}a*FSkH5tPshrnd}aA#Bec!aQI9|E z3lone;C+`sh-nioeVoMU{M&KQx1-v1$Trty}=BcIwH#1;OZg zI|pxq0lF3c#ISM|&s>5*C_q+zRM~WG|4t|RV3>NX814qTaR zAV>b{i1T_xg5#7*JaDxUGYmQ`jwQ`+aZ54k-42br1%qqb-E2@z5DzqXk4~$j;7|5B zC|f%QH-zZR_8o2j)rC57FRkk~Yb=bduR_m~y=>z^d(7faxrLTP;78l~@*Vv(NOiv3<92PNa6lS5JOr7N$T^c*6jFPJ%AAJ|3m9aIB4v`*`!W^cKE)k%Dn5RNaF)85?_ zhk99E*+SR5pyPB6PYzv2_h8PiU7L&(96Iu$A=B9z_dtxunJ-Sjb=CKe z-7&j*G7j>J=Fhv7!A%H2pW=3^?ms`c5f;ji_3REKHpRf|(@E@&Uj-cTNuqn1i}YEZ zzGoiS%ZLJx%NrTRlpWaND34bz!OqeYWPbNpVmj@OS3C;5#@vT#`l+n!%RqVNGl_4; zpxpgo&qaR+JyhT9cW z;NI^Nkpn4eg+HVowGsD8u|0(CpX;mNBdbyUbO&a}d5GBI)tBb*^>+(akspEVq7`KQ z+X@4>WbokiS$Ixwd*1TLyLjsCOZ;Z1SvWU)9|T@SKK`!}EB||6x!|!=)CIOMG?ec) z-ofJ?r?Z&EAehvtv20!Chs#>iTBYAdP+Z3&otHl;JIW{DO+t#1lxJ3gCP(W)^@~+V zz0MB@YB2CBunGq+G+vMo)Z6@HD+8J87q!|Ovi+^Sagj+nE+6|DhT|;wGCWwiIJ6A3 zOIAYh!8dRvxdJU?2jKCig}7yL3)T7Y9Hh^&BR*|d(#6;sYbn%`R@H~s3yNNfiaV(cLnM(+JEk$@?rXQMsYyhe|l`= z=EsU>pFJ2I@f$B{t>SLM=fP{1jw))&^ulylesvzZF#0Lm-&Ub~c~mdCBEN}5e@_@{K|L7=o_(6a&k&kfW?F#roMpUl574@(&)A3QZUS#e z%f~?Qxm_Us{(MVUoZTP|V-g$42|psFo1g4?kD=+roy&RqR-B)0*i0pyW2F(c>Wv|N z*3`jEKc}J7_aq4S86mI&RvI-{i8lmR;$7{Byt&o}XnpIOW?m07bh~AZ6a)Oa zB@JFT_viK>TI1iJ_2f}cu0Y(Vc%In#ICxC6fU7T~;8(pYPJOPn*t8Tc6?Rl@^5Zzw z6;4XiBOIu&Zug!gdQpnVdCC50S;61qU7%NCJ(;eX-MP}Adf*)!uMCG%PNlrzCl9{3 z{{R%2v*Emgxt)EP*5Rfo`uBI4Hn*6U4ySZ2fcjQ&6wvjtsP-9LZm|zquNaHtb`BLi1Cx*Hp>Ok2 z_9SE!5+7n(HLW=uktd5fARgj`R}%F-yX|>{T@Cq%!_K-Z-lL3R{i`ObRB{F(_!7*X zYyu^Z*Rzu?A2GY$bHTjfRxE1S3#aFM!Zz19?*G9X!{%&87}AXY+HwItd$)(U+lSGr zWHMV}w;l*bP~gQIZ8wFE3BRvz;Ktdpb$UbeCXEwo>M;k(x;wF~PS4ZU zOoheGyQ*t``M~E=8jetdBx4>zuHXT+gM{Y&@h!Zynr2v5FZiCGrn z=Izk2+bgJCl8W7S1VfMhJC#*2iJa<|dC|K^)Ehak5}M()pjn(SNZB50UtQ zfBU_Un@rh7nrn|jT89xn!^?4AFm7iN5KjZ~77I7s4SmiohghRU%%-ZA#`F~JlNgR? z7R>;?$G!0Gr3{oWg~F|bzLIudFVt#i50g$M;`P3XocJG=UA#`GEG+v=e0h(KRf9d- zfzTB&Y1Uws`WgZnG?l3*>uQ1KLTER&YU*0*`)xSBbSrLiHI+k#_Ef1}G0e9LyJ`C4 z%vYQ@etXrawxXvx{^C=i8x^MnQ?_zeJdPhwfgT|}QQ+5t)8V|>$c&LDV~z)H;op-X z;&+Kd`zu#o_rT-UWHa(De$c(Z9A?KB6V|+7gKmG72z#ng#4LCm1g&&q)X&6Q4ePjR$RTr8^n=HBeN|{? zy>ty0^zA(N{JEWX-Mtrt)}`|?$45_~>rFQlx=F8lBOvYo8ZUW9NPWdHYcChNYuT~Y zKpF>5WEjc=xBB6doe88_Pr!ezEkN*@bCF)%IF$al4C60OXT;;Ob&Uh|pIE`eM-BlR z3+M<rW_xz7WLS6kCe{>h)NOk(MPGkN!)IuH=dJ?7<&Op~^GjPO_)>wJ8oRe0R zFHB3uJ{ltw>Lo_JO*ME*YB}!$nCIDwIR?@)c=LTG?PX&F>Fu>pa82mK{Z7QGlIis- zJ}dFD6X7hHMHoxL{`FI-r8B%(6e%zX zr$%N;Yw}ZQU-WQJdQtRlUEdKWDXo&mi?QYcFRA`{H_hiB8v`7Qaydo5N|Q(vXNCZBbH34cWT zl)Zd30duo%vN4xnul(UMj~lEc5gOiLybJ@@Q|<@Zk2z;gkDz|aVBaxzm$?X z#yUkF&LLfK28{f6;z-)(VN9k4Cw+izth``)zXGb2{p`jf1&%IR&7-BIl7W`KtaB!l zBRzYS`X`3C;SE-|v%?+t?+RQa&*FtwL)KyX{d7ovn2UsSFr?}R_MGq@1Q&gnJ{#``09~=DH1l zI778xaSVHhJV5`{TJ|9=15e$Hf`!vfLDiylK~0T`*P@71@3H851KG6E!RWAPcU?^p zKA`CRBX^t9-1L{oFR_}yoeJTQQ=Cth(4&}=`|aoC|%;q0hxCel5z-q-uE z%UxDrYR(<IkUtzRCFNAnej0M7Z!siB{oA9v?)AuaaQ@ZV_r;2-e=G;(ri>##HxetEl z&H`aACtQHtD=j&VE2sW}86lhS(vn;3@bfY3N0($aXWRxH-XooB`b6@wWt@KJ8#mC} zB5D+Fjr$F={7(q3!7rO~8Syo)Ps}Es*OaNZ2rEKR*J=$+_`VKC4q5>H9}MHq8MpXXtHk{ zJ$NtyP8nT>yO+9Qa>{ncnJ2cO*SKTwwWyx(73}6gA5LBtg#HpevvzToxMxm28p$im zk6VT^;dKS4^avcp$YZnl3+cTKt2OxL=3ev(HWeP6t(bobd)+C94$JaUcq($mIK$~E zHvkUuYHL;0sefu9{0>R4%S$r6LSar+pYy{sQiYCS@%0B0799qfw;aMj_>JR%w24aI z6Rb+AMJ)i;JFO{l2D2L4aKd&V%;2V#I&yxqlZ^18&ab^3SAx$^jD;8%?K&(GTHbX@ zFc6-=gQD&d;Ro-1{WNh+IMvlinKTPL4N`@-L-G@R;eHR$o6%Py564EIw!=D3t8n0= zcU~Sm;z&B0aJY}~l_)ftpXLsMkMR9jB|2+zM&6Pwcn5WVPru&)nLs7RPS4j7>6Z66;H{f9@ zj^GtlC6RZ9d$SEd;HtR)|7kf+T7mK$58PCni<)lhV8mo+2#L~{k7di~%-(??%jdOC zr%B{1kTfhGU)oTn>20F$Y_z7To$x96$mR**ia+G+z0F^n z=>chD99U`(z2ag8Mlyl5Q>xlQeluHv6D;j;1d`6?Co8)`_rYn>y3XUUCeTRHyz+&U zcgL&IhlJLa-Y;vS>OVA7DPurU)09J;qZ|n6-q}RE3|O`C2cx`1rSVg#rZ{O1`DdeR z=)UC&e>m8R-*61W`rJjOYh^8@REW~85crSjerFirwUXO&GmH4%MK$s>B46JF#x*|A zDVLDx59wP=E_j1{4_uk&}Cv5%^_(fxc>DL65jyTkHB8EUUC$(oTuQ1 z;jW;+*B3V!$56%;z+XOk2%2vHIANI3ysGf~lxGNS2IN<8xc>trY-4IpXXtBN%A<6B zp?LwV2S<1){2g(>+RVU86+V@IPoX@IGCz7&-_M9J{XC^J=*=2gc4{TxJXl14)@CI_{S zDM#+^!lCVqka`*~>>G*ZKcDb-e|rgE52^M;fU*%FPtHg`sd?T%Ie8JvpxOdupp+qw zl7^ivrtI+oyQHSW<2c&qKI8;gI7TW)Cc`NQ+KQCVaLQ-N&(kv)0sHuxwNp^=4B-~1 zu@P7clryrto9`LTJJLBAc>*T9I`I>RY(yi9Wn) zUSp*En0G#KnS4rU&Yj|X=)Yh+>HpTU$QIjrmU7C77~uwGy@!x8UUho@4bq1zRmzI$ zbOdE7lFs|dbRF~QJ4zSQq9+CK@oNn?g2bq?G(^Xojd1^F0e0K8 zNcgBaO-MY3lz~$1T_x?akQFA~MV(&lcy&@2v{vh@0c)1SnqQ@C|G#dO7j0#$n?}n{ zRvl%+JO1fFbHQ(%yeidW4kN7uQ(p6eQ{EsG1_-RgS61{~oNrZ~=Az6& zrEIv)(~&L{`4g+ES`3ugp;NgBxNmV4nWiLaS7^sZ`bks|9_(>TUA1MO2+AobJNs+16wR9hm+$iVQgBcRIln#Z5 z!4ctTG36Vs{4flLh7I7GTO7lO9xrl+Hpsz?|Cz(-8gKA1e}}p?T~WujKjj3+nNi*v z(ES;U?Bx*bqPK%b%`f1(*@sxg$SsoVnx(W}D)! zfz2&?s5LG%*sKxlb@cETChzDiH!idQ*W8&b=*J73l-r6OYFWnZENG4C%VT-(JO9Dr zSsCC}Z6=xb(3GWQf3&?H0@DZ69!}|7*ooRr(Ea=>fNp@rOSj>P6^-QcZ9a~`}mEc?|HUM6wsK#(~dd(>iZ6Oc6}Q78@9m78$%%Qdj@{F z5y`_6HEEt_@)5B)tbRZ#H`y~uXO_yP()kk5{!$lx&Q;V)uIUSw*Rad{PNUJ3j}$B*OxpFA9fUFCVg% zy#~-2YH`!nmsz$;GwEHwNa&vbN^!rl3l=}`%?42}5%D4k%JO`e-_k31q+30;=(#I4 zZnz7ZHBsTm9fjXqR>35R=+0hb~5 zFus0U73N$3s}pA+(Pb)YteXOFejMe7hQW|Gd^UfUb^`e+z-;|3%4gt*DUsJXjVU6?J7|07v=2Ab|Vp?*B;+$_vz55&3 z(+U)Qy4B|${d+f2o1(@U^@fx7>ql&;jvE{rJq~KiyKwJR9ni78Kx=dR!`t8Spp)gm zv#&Ie{XX9meZXJQ`i}C~7OL+zO*Qj~3((v{UP(27nHmHxp__Qx#B;d!+cVAw--PW4 zd+^zf9%Jgx1w1I{314A-n@_ti3acJ(0qPwL{N9Z}ebI*F;`n%M+7so)mwGIozC&NR$VH4P*GgFpq9ztkM^3fH zhHSjejUR17$#MaFRGuokRV|s0hbg|>In5cGPIkf}1F9hDiZ6I2w`BJs65xbmI6RwY z22-W?NPp*#MqNUUBdyg%i6!FvIooH@*!XK=(DIL1|M(D$UE#-ROwggD5mJvsVai?H zceN3^ZR-iW?@S@?=!l|bnSV)6ZFxF-m#33suqlJ5w`&Lgl5_cuuHU7k;vvkx8NK)O z^c13J4{Yi>4T76!su$bufS*;mU^cxoPk(73&uDlEU(K1tN0`~F)>{i;pS}@4eySb* zqgP-&%InDk&t7Lki~B%9oC4kZFJ?75i($o^N-(V)0QZ{gW`zCB%DS(Uu9F4sJ++vy zTH;-bwzAF}x*+v5=C>+9(eu;(jfF$rb2;@3e6DX#e4!^WQEf54G0>RNbv2P`ys_LB zq4~%YDEK4D;Vq~Bk%sSl02;57`Q(jS5MTcQ)@=OAZvD!XVplxk4qY|mI2fWV982F< z(cT1fUTCUU#pg}h2?M{CAiQ+|!cDy3z6uZD^8%_tD4OouT3_duO;1F%K(E zdMXFXTgZgnvcL`E1LzU*jOKVcb8otbkIihO4s^U!H%FESXNj@KA3LsapEeIs(VBp1 zQxCHqp?CSJpk1(UNDMqGqemaV{!oT{mosrK)Z3ulWhy5O#I@`Jr#E$R?nq}OZlkfx zlS0R~f$9|M$Ad4K8Ljzzz}OUOT$b1I&VW8;ygb|nA6)$)>IWX)sDz=#rG0F9 zi8}h(VB!$u!|!^+BCDZzA>v)m6N?8@)1q-WeCK$y`j8{pPw7bC``qV^ewD(us(coa zX3i%pyvMwf_b|6@C(!cATOf{L0w0P0I9)poTGt8V`a1~BV5|Bz#_sEuQ+?-vxBmvX zcl`hoCh_k5KSSpY>Ad-_)8Mr~4K1pIQ2e*(^;ucq1N}QAUZdLE0EBZ)aMYQrTlDxMD|pm{#fO@}r~HBN&|n(wnllQ9>RiRGz7JV(jTY1t ztfl=b_1PDLXuS13mv}4&r|V|3vJGCU+pz91r%4GeO7y~lgf4Qy__H811znRocjQIE z&;0uA)p%gXElOI+&m66ECogmAiLSZdgC(t8h2G z+pvKp-*k{G<2wn?P+Tr=Vd6L?7h-|1f(JK>s>7|GW4A%(yK@rNBWpggCwvY)CfP(K zvk~`X^@rCW!Ep%3vRJ)$J8<3sZS_Xi6_927QWDtZ?A%nMy2m$XoRG8>FZs70NgL2R zdbI-gL1+Y_W4_!ll#{kOt8c!_Z0JxGy4QP;uDLIuQP414XhQpr(Rup#_+shW$HZ%G zWR1D8sP{Jv#aK{pp}UtEI&@vn9~pV8S?`w;?iKRLqg&yE`%fC@Uzn&<$*%S|f?4ms za;p<|Lf^1#9YgX%vfxSxHQA?-PQmVf{xZTrym+9M>hEcSq^;!Y>A`To#{!0Ej>njs zXrSZe%-FtPYF6S14?=%)!cp9_;GfWekQ7!*ddm-l-rH6+5aXbb`6Nu2J37$X5LyN} zV@oCvctqNOuw`NEaeTt@2^c`n!`%wZ#z<=|)nT@_EP8Fk=)v&UtOC!s)RptcTtV{y z9m39GoU|$sXA8XrXA9!-je{-H9OAu_olaD9qNiEq{cfo4OkxIu55w(&MoPWzEm*4O zZ?yKvMZy7fWv@IZ(gN7Ww-Dd5HXv|=_=6R_wud#n|KOYmUnET;u!B>r!;FRB<-Xa|tg>?JgpS0q3-p$$f9q!pV}m59Lm`mN3_!Yk)LAy7HAY?xCD;gWea} zjdADu!TEa|Kxo+qLw+FXAdH-+s}f%btYS8|Q`yZ$6@1k{efe`}5B2Z3M_~5cl2bn` z^)o62CNr<7VM$Dv%9W9;%>opq!(uaofl8k z)>jK29fNW`N50L%6`F2-!KnAJz2IwF+OmW&_m=aZeHk2Bt8&XFlSd%16a5<4^o1VNa7VMi{{>$DSr^ zuEF(1mIBZ4YJjy&+%B!l%R}k~>bcrFEvzxKE8$57U574^E&zuYjlfm@$o^FqKzUJ? zLRdiS$3I5Wm%`7{m?Y9YeupKm4=~Xik=7y7kO7kf$JAjcHk4$)tYUl^IS#9=8k67B zh3jeSaMiCkX=>nSCjS1fT{d^FXNjb}*uZa;)xYn+>9|4*N$$ov^7o<7sJ41w)Z1b< zD()LHJ{=E^+iIku77c3B&Vehvi*>1@QfGeCZmuAA02?RJZe zs;I5&73-_6K$ujA*JIxu1k&r6Jya8lI(YQ0HMW*kez?vE@8ucWTdVoIiv{N~;&f){ zxe20sTjS6MPUIKpz1UI>>fJcu+t};*T`7mrkBnm94^|ivK zwwvJ1SCw~l523zq$w=?@fncLXMG*Eu(_>{Bh{7g zx#X*#3%th>w5Hmbp99FVO$348^2b9w`lLO)TiZFDS@h?#+1;V@S_K*gR+1MsXScrh!>xO(fv^>Ce3(N1ItxhGapD)Kn%q=f(>n-B zbBfG_>W;qiZM7C}Z_*ZCQ28GAiaeP&Tx^rfN#_gABawfF;W2K6onNR2yMWik_PDpt zYvC<~j{~3apRjppC+xJUnATq#!M_(z5PZ$(+Ib)2QWo*XP!+mU`}usK%M{(3BSMox z;p8dG%`YRkc84V(xSF&J`NLz(>tT2D6F~a@9j9@u!za^3nevci2;Fl~x;H$IpH%9p z|15_PXB8lMUyg7EKD z2i#iU1FU-W5ZXle3Lso#uU;-BPrVwK1jHfX7*4TYN7osFhweUB+u;Vu=g}*9r9ZZLNUJN6OepV9Vby{Lp+sE+F~aV=8FEt=3^3>>TQmTrvpy>c??e5jloHp zjhMIw%5jh~4C1btyhi6UwrCX(K|f{+U&A))Plg{i-I3}FMzkD=eV1>CK>MCRnO>dm zxg}*Of`=);Bi(j}k*5|O5sxo8A@VjZG8U01QTBj`M&G9#OkZtQat=3njHH@u&V@cn zZ>l)k&7*8p%BGaqv;XnK5Bn=ZGX$Oa%AXz_fIls^A!Usqf9!}+$6Tpb z%0ToS<$#0}+kifYq+5YsEEkyzl7_^8mW3$%ov1CUTfXAWL=?K|P49syvOt=9RrJZ* zRR<~8q`mn%6Yee zIHwDPdl44Gzi`UGnBe00kRx^c(zq}|a0q*S(hceNa7hniq?{93x-;H7$Hj5$@`cc` zNtm~50(8z381O@QO%y*{H;CRLBmN}(RLI}(tc3w6e6Glps3+?9gnAhM#!eCQihuWy zfYaHYr1P$mM%)af!}#f%+oboe)B8|I8RBK@r2999WUu4=Rr*^ddV%sZW)gn`%Zqx$h3lUL2QtdU zK*#PlP(J`^P0B1@Qof-r#*8XPtiQLfawSEGs_2kbXeZ{eXaD|PT+XJb`fiheAzFu1v z893$1s#ULJKps=7-=hS2mNi$YUQ`+@iLMJRXFOGWzioha(pJ1-?a#?4Qtvga^X8NT zNIy;K-Q-|UC_7Q<-jKMGn_AgPl)nidk9HPW{?6J3Mj~+u&YPwIPm;XZ zo8I|KyFf#A$VP8&$@ZeNdmprDxfS}lJivR8IG%NKh3eseJJwG^KSLYzQ2U^%uLnN< z5eh{!9`l(FgSg%kXB_hR7;hgu8CKv^Ub?6`yJ#85w>)s5Ju0`ekG|&g+{9+5`$w8% z_vd?YPpe!wy6r1E?KEMje~tK{m^NUN;)vsx1@WrpbI>h!GvBdf5B}Mm!Y}HT^7j^3 zAy@W9BcDsK`rCAF+{T0Lx7drdeknLD0NHqpB5rxMLP`zTibqqNq)C_ZVUf3?Jm&Xy z%=ga2qOqp9c)2-trtdBXu6@Av-tY!F>n^r-JB6B$=Hl^=hv@zLxpLFM+Z_9~fu=k5 z;9ai4N4xsj zFuwaPKh*F(#!mKyC5IP5pVn94@W`)N@YIzh_rJqk=Pf`zuk-wB<4k^_<~fvUnaRCM zyQ^Ow>aqJ^27|#=F1|Q`J^rDq?%!r4U2m5R!>;~D$I-61acx)Zx%@hB{wxrzLVB@v zSt)R+Z6Z$W4LH~LFAVLWfxgb2)t7+>l)qPg@U?UG!7Wz@j8hw^o0{0do%NYO|HiiN zbeEoVdBiJPMZlZi5%At<0~6PU$`rPzRX={jp($2=eCX(7a|X&{l9}V^EBNTza7Z!z zin>xQv%B0B?k&hyXr5u;lS@#o+NqguM&feXZ)VehY)B0p3GGHS#P&LgIN5;KxiYAP z`$MN8%@6y!%N(Y(Z;SsbWnA#Z27TaQ+J zY)p>8TB&qi2pXy)8YU<3WBUydT&9sm~31HxPBoCMMhAxn{Gl z@NzSBT6NdyOh^_zW8RJSVlt3*bF-P>8!NT>JzLm%W-O%5$&sFg0j!HO#$&$Mp|;qZ z)?qn`p8o4uyT?ZS_q%c!*kmd@o;;IXcy1!E{`M3a4iCV6x_7{u{o?r-6j*U5U2j%$Qw?UfNqbIJbd1HpnHSF|CXQ_d+E#}9;s@9sIwV^{ls|i1FsU`js6&lyqTFVx;l=W{;b zyz%X^{OR=LNb?6~3ymQ8k`dCJ!0V9(IUnpIsU|aVo{1p_CT+mS;f>W-HujQv$5ggq z`$bMQgw)$e7|KT$7(nQPCTc6AURb6TPgsgLDCZdWJ~{+G{+L5pbeli#JA#EJ&A_|{ zhuQm|h|IMI?gbC{8Qc?Fj<>+pV^*P#etWv6dpveU0`B;)343}w4HNxOK}g|l7!_#6 z1CL#$y6A$`vrNNu2fqIa&}&dfFbncUqx)J|`ym~a#a9%%F6r>;RE2sRW>rT(6Weo8 z)%-QAsHX3ZG*@Gervk0kWhe{29Ebn>gC)b&?V-l!2eycCLFyx1u*trzCUxSwqHINL z`FS`HjxEKa?nP745;=9AAhddh}(nSiq}n6J8Mh&M*nFki2QFzKN#zRE*s zomFc!V|*gJ(nLd<77~n>L#knnei;@lzu`1cD-NV~Z4~M+*l*Da=0)GaH}QUuFff%p zG^R%}J|BbRF|Bf*WX20zl0F5cV~x*BSTP_47JqugGiJSj=`F%wZG*Ac?(t60&~gVF zM{zGaNd8Ay)DWX;wA9jZRR3X!=I1h4ia~dQv;2$O2E}E;09gDq21b3I3gPtq=w18# zoXj_OSnS5<%(OBb^1TP}F~1FPt8q9Ib|~YP{ZYmn1%q!{CSF*X#8dBUtDXB~G(7|2GhM&+Li;s`#2*Nf*D1Z1{zBqetk|q8U#?ZKA=1TxkgRcNgF-jPPCz&hx6l*g3v|8MVBkUAKJg$>?aCqc zP4M#LZ%o@pOC`(}b;}-`w}6Sgk>|=c`14z%;mX!LHgN5D$id#K^@SYbyl_mL<3v5u zOC~O5^*Y_7vDB1_&ynsUhcF0r;*Y@SXG4HE6=jnml2I4WPHISo-qn7B9IPheG4@Kd3;9Qr|JEK@>PpfAT#hwM*g~PI__6blQ8|e5JIh zPhW@*Yas8mr#0#_gW&Y1qma3f_QJ^DiuIovt5lO{H`WBJ9aqp=a>j5xI+1E42Hus~ zAoT-JQ2k-f?zVhpo3*@fKq+Phje~_PRS><_@7H`Ved8_g0vlNDA#89}m+5#(XiK!-*B!pDF6T2-5en}-P)@aM1QQ09r$$RQi2PN$iE%N1SDwr|mtOc%bK!LWnqY9?zbyFB5Mv;s?do>m%3N?7-D;z43d9Cd+a7#yWI8 z3dX0r;a4iX0)PA;C(cB!?Fn>TXm+~2kJ12O3XB_^*4MH!#45t`Q z9)#@?QYBKc%686fKPoi0T?l};++wMb!)O?Pk=mpTHwdU4Y&yYxO!<8oM zam&z?xS?rC4rx#JwB`(J=XZyb<`KFV+Byy9?D;PU%9nYs5%ZDwjNT33O=}jdV>2BJ z*g>Dc`2Fu7Mf6MQ+J~g?cHw-t=~Bh!P$o3D|L>22=h@}Q%Q($3Bkn@#MOoCvhm~-YwppQ97NKZjBuC*CTXfdTh^y%8Ab0_ z>9)lb+E1B|A)VT^iTb}iYSpV{Voo%|^l@|^N5VPYhVr&amj=RDjool7vXFngOYdAd zT>;`nwJJ7EXlg0zdZILWeq(jZ#n0S%>~CIp+>@Stb|Ve78e3VcLNR|fvo~?7S2%pH z7aBY4#H!fNjC6-`@2dtI_mj~Yo+t6;{^PLuvNPo7H)0KkzlBCWvc>0sw3&4H-YIx8 zjP}h;)KK3<#IQqcEs;Ja6}?U(T^qzK+uxCHZCIZ}`WMIcm}qmr`lz7 zKB2w&#qN*!V!afcQ5>IhY0zQRF%AIIdR*wf-=4H?!Pm!>OC-XHbKTWPY59EP%x8|| zuh{CB`*=ftTNbs*g$*clMbe-A?1)A{K9R1~UuZG@>d1E}@6;JLU%m*TYsU5^oq(h% zMa{@YFN(40-yQJHb}kfspM~TNAi9$;o0k#8J67iso_xd^_oi{`IS|_FxosGF#2&^8 zcPFsL%lGkSZ4*FX*4~jjvDxW^xU_gJjHvp+Y0M;=FPz~2M9ejfbu%^h<|tZ!ZVCvW zJ;RAIi56jwH+s$%KSQe)PT0uY1@TxcJn9k5ZD!Z!-AC=>du_CZ4-;CC2UTdQV$3VO zB7iVb?X>$2d1N1c`tMgTcJ{>&1IwZJ($!)vfb}+ABK>2DdVxd?pcQ6%|2L z)%kOTNsKf&k|*L*huGlm1z&jYtrx(u{YciQ&o&&s$4AnL@!~X>lHly{m;V$KyM92| z<3#)=aE}qEVV9B)g8Rr<2Fk=SP+GOUu09v+T1#H*B^z!YO`3lVJGyNtkZyra+SfUG zUi!>fq-(+5Q@cq*V|@Jan$PvHm*qp-kbDtP-y!KOPM#KoXMAtrhBR)ZKN{eFONN5O zvDLIUdcGKc!8<}fk@uNGzI7`T+L7)F3=J|c`@=YX#S6h zrdtee+L$xf8%dmeFDE}G@&>8>(!JpKCYcj&L(!VU==5(FX{tDJtUBx{cehi|o8)mZ z_D72L3Y~$m&-OsRb)WOs|3$GGwEkoEQWKsr-clw$=BY0{VE?wA=cpz`ZIf1CMA?0k z&_-%ShtaqsE}fC5p!=*v;&9>5B)bOGvH6xu}i%5AQb zIO!F_?^a0nC6hL00pIG$q!W;G306ApCU5!fASXVBlk+dIRilk%(FcUzlE@OsUovCo z3g)tTGYeg?1D4f>p{d74i8QE6*%2M%D4*HP9>~)`%kc?7m<}RSa(qxP))FQdwI37X?Pq9P>rY4Fyk+YS>vJkH*z$$GGqY0*k1wuy6Sk>aTh#u_x1)XnVS6HI-fG9s7GEdbbej#&j3e#v0jzfX zJSXNsw}-9J{dM&_o!+Mt+JyK}a2@}AsX*YT;6d5;WFiw9+h>0!dMB=@Jngi=B=z2c zf%tHv9frOxVItp3IFUeE%@#&_l^vK~jY1a-y<2}|6WY^qJUjh&sqnTiVtOWe)tu(h zVd4Dt>{pyL2IMv9B=DC#-b3qLz3+%w_h0be)sc+y3>0%Ke2MUsb9NtKRU4qnuKaV{GFNlUgLz1Ao^yG-6DR_Hb)}gMB_RLUL9G1tVKcwi%7MnKm1@jjH&8Z@A z;(Ef=x{NQga;wy%<$F%N49T>{dF0h%g>(s9etaMNUc8&Q<|RE36;4_r7R{n9aM7eO zSh*}7Y3xyW2BGh-v@QgTUDxp1%Nv}04JS^8(AQp|`L(A^e5O(ssgkx9y@)M~_F&}j z1|YcG@xi7X@^j36SsaYGeV9|`2b3jp@*cvgDFW|`dvUmGwp^hslTl_ySzu$CGy`RE zbNK#l)lyRCHBLOngjfCBxvTJjqUPzD#sqY!SBP|6k?Zi9`)3s!@BZKw#%UAQS#WM| zMFgS%ZVo!pi7h|AG2aO7-YID2Mcn^TiIZG z>ejk!sQhvbWHA#t?RPGaHepm}%$?pPAj}b-OBL4;9pkN%M^vl39ao57fv_+~clmlw`ku0#1EMFmL2?L0LN6Yz?cRnZIu?z)=P$sR2{CmZKb}DI4PB>XtE7`&SIf)GJV%!6ocPkj0mghwI z5@G&Zq+E|vpNKy!QVqc-1?Mrz{4y>q)&iW;0$Z(X!p7c<#P+K%p#7HnF!r7y=5JGZ zgQzaBG5G|VRGeU+Tv}kqt}XEUpdL8*`z988B$fRCdB~yfs1{%7h=mD<(Qu`fD(h!s z8{1dRZqPQ?YTXW}dFID?&8tQdcUpw+ny=vvU0>tv+ZW-hXE?0#&BLQ+5!nA(JRUs# zfqQ?k!<>ZoTs!k7^liOGF$`J&i~M!ivV9G4Z2dNT^_AXSv)M2nT7HK6+%#3UMZZDg zSAo!b{WIn=Ap{Ojb5yjX zTz9a!qs-ZnO)HS~xQ(W!Q4kb)nOkk%&vNI4!_grL*uP{b6jkZ-Pm5FGoUfEPFS(&;X zm$w5it^<7PCk5?P$no47r%c?HCE84ljoZ zqoz4MwW4Q>yZ(VW-GAWB1}+e_eGj*oUB<@j=|StfT;y~w5dCWlzT7w(bLhF*4IaPw z=q?-_t^!|N@sx>qXm00(?L1FV7I6SGj+udzM?Iy??mpaX_Ys#HzJ~mq>umniAeIxm zfn9B6iUFC3d{_ZqY^*77^V|=WMPbZmU?9tAvkKGxUUu4eMpORM@i~1*|ChbCtjM7; z<21f7JI4f?dw!Q*?d_a9Yv(r{sjG+EqUYiYhX`n~JRT&CeDH3x6!xz0gVnSr;faha z^!TqBxYH+|pSl|VweE^Dh{va`vSd3d^ZA$RmeAyOJKnPELtJ~SGn9VV3jQI@@#dps zrd-|y0S~T0r~O~}>(7PUw)Ql;8yt(~VfE$A-xHz!hm+XFV~G6W_*#|~x|hGItN~{; zD_-#2PhK@I3fCEJ#k^jvmFq1GSH!%M-O>vd)@=sf*0c}V`7_oyzH!o!W^zVVF{Z1!c=vm$bZZTpn>~Xsep+`Dk z#{CQou4s*pjyCdC|LcmuJ`4Qsp8?)`nhD!WujAPr2J+8cADQOQ2n9kHVjO<1^SkCfE@DjW2E z2M$}~iQ!qMY|G+vR96j=aFEfp^KnTBkb0KyYB90*>gMl!;0Zra-m zHV4Jv!2w2cRZtNuNU6e{SWS88+cYE$V6N?V>EDA8vX$A*cbCRM@{+~U$%TDv?9&wOhje>k#>FLf>Fg^OCk-2PW# z+TC2}Q)&V?A6elp4?8)oHW}7DsE_t%U$d7R%b4x6sn9G_PpbVKjK@d+gQc!xIMpM+ zR!=JJ7~k zI^1_sf9#<7Ng_@|;vBk$p0p;h8xp4RqT*~+szykJ8JsnbMy*jcaOPV$`#$Ixzul}8 zChr1t^qL2)4ej~C0Xu>BsSi|}Ilu1EdQ9{^#h@>1;Lm_d{9Mbv#6LH%v4fQ~o!3Kw z<<|7P4B-QIyYmCbJX#G@laSHoC-v(Sg!!lW=GlXI#Gw9Qsa=7yRyyE-e#rHHbc8Pk zX`HwjUsr@k2M%@WtGy` z{tCvH1mRWhSrDaB!>_%24WZ?BpdDjGW3UKoG>chFqXeK@D&>mbaDX5ADYq)-%VFmF+<*xF6KpW=>k*42s$a*MMB&Wmv(NigC=IV~|&WI|hFq&j~BRe&Ie$Ui+Hk-7g^c z^-t$e^loz*3FqOD&mJHygA;4p@iKFB*l$)Ua9_>eCaYHT9*|#tX&tAF>p4IA9Io$6 z&wXz%M&H4jOz@MznTJ>yUdq0eDvU5wHu~2ae|ofKvFCD?2d1YPaUl=WzRY#}4#I+P zD=>H*fL4j)@zEK3{%v&}j$5(|M-D5)3k_;nO#Baas@HTpcAzheOKQsrGdN)aw3>S! zMl4zc4emBXQKtg`mRg&rRL9a$U91}up;5H+lX=kUrEp_ku5xKsTXa9oC`&2DGs82O zz+%GdI*eQ4&=?y;r9*AQ{sLp*2YJ#~wD#NmC@m0}SmAAjG%n0jJppHCy&}!p2j}+; z7P`f0(3jt^YqGAoAY~G+d9X=fCqA=_!tsq;fblKHbc=T*aRiTRTFth&q(PJOUMPB9 zuR}I!c1jfdM&B0_wl4;q>$H%-Wx5w`)M_y+Ue$<^E>WqbsJ|!50{^LQgcios;~|jxuo+T40`;aO zbl=eWFVJs|E(Uf#i5EwWfP<$Oh`C{w=fgp0&sFo90qF~Po4g;0w;5ppzu12*`|&H~U zRewodV(N;dO~7@|Q??-cB%|7cNj(dR&vtRbQtq_tCJVD2EiheapLPpf4wS$sUWnHE zYne{?X@z=$i=OS`SR)aqL&rfQfv|zi?bJvuN$o@HbB_V4UDQAN0<_}(aN=C2_db<8 zdcZwC_(_&RJj)KeeaK_a^&>qo3+roXgPChPCUn@K`{xBOfzZ95Cf=RPgz_CEu z1>Xb)LN`U>sSl$tH>8li39RL1kw5EvMTE_JPFPJ?dR%a+axmUj;1!bQ1FwKhXw>R6 z8y)h1hb&D(^T!?J&YwF8ZKG=bYz%}OZ2W&431f2c@53v+x#tS_8AxmD#hqn4Ejvh= zXLpF+0nx7l&$@0u!b#Vt!4>=Qy7hG+zd*cdf9}UdLzOh3s0TFMnFoTOorj#nzOD6z z7a`wJgqb&Qz&t%a>61&0Byf4ElZ?cPklr*_^mmhqs+5S7;zX@bTE=X zYWIeI>UUf^KAk-ZJA^ckxNCA~PLJJ|!XL3cZo^>y)IZR=9qkK#&KuPhWm1gK5vs>p zPI$&$wlo8wi9ZBwAbuJ8l8(zo>-yDwW@0Kv; zqKdOD_9!*Rt-1BbexTE{Ia2MwxNWo_5j`WP?{9*gD@&E>FL&nr_&yJOSN_Gt71L=> zxA3@HD^8dp-M{n?$?KdGzGUyjL=YI>T(67h^S<3XAH)5cErD=A(U?wIU0F1E#kPQjUNJW9qT&T6sc}lbG>xp4Q}IsFcAvD{2;Cz0+p{;mkT725f$KF0$ny+To@9AK zF9Tiqsa}X8#yY%q7LYc@tZ{nslqz#{TjDEn1GqCvAB0|i>@oof|7bq0Fw({2CE z4&gLZ%&p?PcQ>ljF0U$=BXJ@>7=IEcE$Rv-D-SZESK747fcbt#!fWuvtLaFeWu#%G zkfrq8Kl!-C?@lz1Td-_7pwLuQ-~63n6K3O9&EITy#~=HL;mLc0D98AKeC20J|UFZcy{!HK~_IW>s_N5&KGX|al!dbSkLwj`c z2$lq|>^Jj~NMo_d2@*c;o`C;H(sjr6^u2K*B@K#D_Q*;S8uvUm%ARG1jO<-@MoQXL zl%ymhGa5?kp64p5P@ew8FHu}?UO`XZeP1BI z@-P_4^U?FGj~MB*x=e_0sV=WdUqjzzyDmfWE9m~m8#{MA#J(CIsPoI@<3!%V>Ac}e zi4E!H!$@_7#22h0CxE=35fERKKUf26En+z7XobcFC>uas_b^6Yng4E{0mQSQ*(M)M z*Y=Yshq7B6ltcIW?to`=6F~H$*&jbR@BS5t>lxJ!h6L!yq!}gB)w0mWW3B6{SGv0J zTg`HT{0n*5!zyV*)%#C2g!l9%y^(7p@)N30?qGNZssBmqt&z*mug28qN5l_f`KR6+h!7fa*dI|$+FA-4-`uFScrpJsh+IlnQM#qZU7juC6I=dChyKD)|1s8(g z;fDDgIboyVaG^cfuj7uYz;)^+?5uYU?KbXatGtIGoi|XQAdM3jxdmk>oN_^0$32-- zZXn-@+zz7W2m^3eu?Kn$IL-y<65sK{{CtRc=7i~`3rR!Ts545f*xDdFB+RDlXDPpD z(FonTE<@6NxFjbA{`huN8!Xn4i9duM0mq49B8QX-6GV@ZUOWcmmB7c|6a|)vo-vqz z)=ubI(U0u2N;d5j zuSLOkq{sQTeT<&F93s;gGEvJS+aL`Dzh86_xdMn%&k z^D;zD?#alfL5_c_LN!BshQ#qPmqU>4;l$&*Qh5sb7aYoC~nlju3HR}A+k1JVl; zX;ei_U-6H{lAcMy)W47MKNsr*MT|4+=GC< zl>+ZMWw%I~1t-5OIk@~3Sv047gK+CF6Z!EMDO+UTcFR^wm#Kyn%Dp-HE|$`?FA`Uv zbFa?SABOULjWVjgd^Ddd*UjIM{<9g?EsVAH;Tz_+!=bJXWSehSfifyq`)LFoclso} zItV_X>;ovbM7n1FdJcVOvrtlqXF%|#&~)N8sY}PJ}{cfjM=an*20ql^Dwc z&tFb0!fSNz7kO1$|K~8Sd23A>58XrNS}fg2KBe$`Yq4zvJ-_GK3vy^b;z}*rQ>xo{ zHvfwyX08swe^xE*k|#g1OETKapAnXS9&-YvZnGGD`_Igrce1$j0!TR5k#&8%8CGry zgv7glSlERIa(8aW{+u=ij|SUV-s}=2xKzu7?iiyYup-Hr;mN&WUUA!OvtEK6@89 zmBeD7nSi>N?4fG)E%?)UHcOa$AA7hyM1S*Wc5q$?u=u3U=i1~##p_vMT2+D`XF<_e zS0nv7y&t`zd&(MPwjx~+&veP5I+U8sG*yll(Z`!3orU|9<6|60MnCfc*;W8)!} zWw4`LdjO4z=J1Ly;_%p7z-zjNH7}o5G&-)*xrfO5`4z)} zJ-gB1{Y+_l+eiFIUt65gdzp7k&a~P+Z-sTSD+sYpoPK1#E?jjG3WX0wC_`e!w z7`hQTjgv&@0kP>SsF zXiNANew{C|ZG-i9o6CAi_qurr3b6puN1uETqS~=D8Xn9+Gr9+A&Zbh3Qesi3Uka=` zdK`S3h4D{XKVW{zIJ~rG8@|+f$cG+j$9A>fPkU!hMU%*SVhnLmU=%cZoP^@Nbj=VE zG6H8A9D?j~RfGwibv>SQVjy=vKLLu%ThTt!H*x802e|Se8B$jDhJ`_Sn09=w>Yeb1 zw@+>??~neTU2U`#m(ce;%dVb=PDw>&X_ZyG~P9c22S|_m(2nH!OHz0?zc^Hox};ZO1zwhe8P~iCQ@XpOTe_bbb1?iIzqYQ@J5*7-GQyGf1dlI%pEp2FvWQjckq#I>chXr>8$5r zJ=yk3Q5{xXUC2=VT&e=z&Qzh_`=x_;9cf7 zm~itgjt)!#WyCY-MtPbfI6-_?Qf)t#`atgDFoiEVs+;XpVuJ3&43Myu+hHnv8Mqs$ zm$A%Z1tgv0Nc}A438k4+V2!~fIQe}i=HDNWP8+LXM2}Y7WNEx)_skH|ItF91xi?FH z-IT4nS_tp7Y1xx=95%Y|puVh!R7ZII;SQKj_gdukUXPmZFT&dc`tq%^_k7mSeemqm zaG<_~?~5#9yZbSGNPC)yu?{$ThmE*diMKlSmpnB#1D!Vz*RjPb_we-ByP#-l22fqd z%Ecz|zDp3h>ob}OoS(k@4x``Uu@QZ7d2S1-_@p(woYommq(8u6%a21l|8DBUHgQ08 z0XO@MLc$XmTH*tHJlZI)$`|7G&`Y!*LT_k0=!f7Y6x=c-r9XCYsD{mVvQcotvj0Mn zdJC)v*oYqDghgzI^<1RSrstK~(p)x?X9v#1b2~GM|4g8Gq$_vZ8^d0^)IjflN4clQ zFD`oAXvqaw`DGMRU*ypH;ZdLY*m3tJ>}Im34liflK7lifKccLc21XGHNVut-+2@Yu zGFov1ha-4BvxiJvqO1r$ATW?HWh|Ry&`4EBX{r$+mpPbR#v9)6P~h}4p9SDPEF4}e z%;7_w@4z&T-kd&1c`%LE{?%E;O(K18Sd=!SuN3gws?Bi!!DCu`KS+vW8Y*!yBP@Vv z8$F=o?w`2EHj~{6eFToC$8r|0Y>tGNb^{zsLC?<;*QWkpp0t1bm`$x&%Bm#s8X#Pz zy%P-8ngy6Bgu`3!7XRkr!;ttI9R+xW- z46rqA0>6FjV92e#G{!$A(l4OCP89WzdQU=_&^N@%*&}-FW5-`r^Xx_@*z!pi=wBQR zgz?;C_IIw|wVMBp_qPkZ7Q+Sh(0K5dzW&gvT3^Da=lg{pQ;5Iu>deJlko zv*k9^NDo=a)kc3YC6+RUDsPw__=F!m_8RW3$w2)iLq^yJb8QAPyZ&D|=`Vml7E zwt&7S7HV^UJ=l2u4Nwg!gw=KL-4;9^SC%YBft?)(Y)2Q$0q8t9%^PrsDHm>&W{Fi{O}vRoogZN?Hz{2Co>6$b|G;qFJEKI zO#2_NtA)cIBG`>`D<0L%5l8JA3Tn(kMYG6FTCn^J5@(X$q-VeM!|6V%S=jlCp=!k| z*~jn!D6YY6MHWoxVTI%9KJ~h;~?w*UIT=tY{|*!Qd7PQD>ae5iXO~V~=-fAz z0T|xkI^p#V%-MRM2Syi2gP)yYQ-?4-_H{XQ)IDt1p>-DM?k=KnjKzxl-;6keHTxS$ zTJN2-dZh(+yX;iQA=Hy-)BP|A{X_rHZrj%*t!D(JVfe1nDMjMHttmPCJn1V!yNd$``;KiNjdar442JEKc>T5}&}^78Rs%TdA%=$D#G1 zz1aRwEuQ?Y%fx4d?`Q(uOqvV4MWNTGu4oIS$0X9{NZy6-O7iMR!;1yvLk+AdS(gk`f4jpTIPi}=)0G%EDlJ3d z-NW0|L)#f)w{kD8B^tCEgpDH_!^5|&P`qF0up*z9IL0&=;i;3jCcHiWABy=RuI6no zX8>I{QtvX-B(l>HTlHVoO4O=~CJg(fP@Qw~HmKven+qT4m8T269MeJj@;2P_-+#(1 zgAU-G;FV3hjC(xd!1Aw~{hr}UUEN*TSqt51?UR7^+aRO&Jw>l7=_2~B4PF=fO8j5!y` z!{{Dp`a2A_PF4mkyMm$yeoQxki(5A^($ws4ye1c8x7_A-j(xp0gkeU!)Wr}=%c@X# zs~_6cq`#*EX#xJeVlZbPpW&O)#rWGdhYcHCK;Q4hE2NS5J8h7=9bAD_i^QpOf%uku z;&^WRiPma;S;!07D}ilD-U$rHu4ANAVBy(LaO8pwTIsa{;miO0+ycg}4{*{-NP3xj z8N9;=etU7{7A?X(eISoR$89XrSmKj6RcvCLHsmpO;5;oM=; zH^YU;0O5D_{8HKZ=Apc4&H|X6dYTcB=g|By(nh#w!ew3)b{@B-^^=9q7yM8D20a>R zKs(+ZJN?s<1qY;*1;QFzYYeWxn#niqVET~>NIs88(s!^Q-h~5cJf=U+Rt{-rkJStE z*^7mCq8@Un9wEYQVb+Jj-ng=D5+giN*vAER*hSa`g!y)57H`4X<&VT;O#s6wDQRvqWA8t@?fjMp~Y=E@n`I;JE zk&_S}lYWoal<9bMoy&!fW5P=Xr8k9h^CrQDwAM(NN*M1hd>4=Rum;kb7?GX`J#P9- zgiYe#b@&rp{}U75;z!?Xq5Zgd(j2V6xERPAtG^!^Q9tG()d$b~_5>(D!2|cqWEx98 zy`(?7=nq!5tQ;ZyD~ODu#h)?|-rN691?kp9ys97$eJ4(nsOEudPL(trg3$Pq3$BiC zstS)5$LQH#yGUs7l)}jKaT+5?+!+UAJWiy~!k5z$sF#fR_AgtJaIMbg6ub#U;%_!P zwGhesFp>479e<2ek9^Ye1fk<3i^%@W`|3mC?`87Ec(3^kp|?@sweWpZXH*vk=<;li z;8#w1MDP8&#-t~|LFE#vqTWC_jk#eP_o_uujaJX9$4vCTr_2)Mx`sh(2<%)@2 zz*=`Q2ppkIKzJV3D(MV_o1dku;3VZxpQ-lGDknm=2=0)nPPoW$M8A;+LBc4g4(lQ` zf=t;Kqr3xq_+P;2Z&CQ{*ACo}7Ne5pqU$o`CJsosnHN3V9}85PbzYVDhd9BKyxK5E zy{J-cqL*75-tG7i-d9{i@)wM1l%MXMPaJjtV&+~X{!CChA4;wB0NMAmkgiK$G&VbP zUDOv)4`8a{L{54Y$*VKVjX`zCB)(w6caD8F49|?zCv0AdHsiPRpB49kvIxBKv$;yz z2^J4c!>WQdNLdC9b)KG0ngxZ1B;Sa|9e(1X&55vOBC&1|Jk5f>EiR$sVfek*7T1eLlD^>dE7!Ed_(VcM}fu>NyoE0nHM?L z75S5Wup!ung}UeB@Tad(_%zZNiVJQ9^6D~aX-4yaq@9?K&R9|ZT=YEQjzSrPz+q1H zLAh5wwc~&WNHqeKF%UmILee_KBRf^n{iI`tDdeR&=~eQ|wSuE5BW#BwJbx%hYUz1s z%F><}MvC|Gc^bo!atuDeaV*=^^ejKK?>#4N38XPW^bp|&(Amwfq6C)b>^iy@H{Y>k<)d7%D36G1E z0mwrCi8{}!EoG#OIAx36N^hUg|45ocWC$wdEjay11@ZMjfsGPrONsm~OR)RJEV~s@ zkHt{kHf1#TKv_VY?japX``llm>pw=iZw2rx(+V@LWB zN($=B8{M18fh*_MjkCxJ1-}vxGs>dy_aoXn>(vLo>ZqAa-W|y!B6$obWJ{pf`v%+{ zHBsmQsil%Hyr7-o<^5b7pL&oBJfw30>L*UP#Ee_FMZ#RU$fA-B{H#gy{|yKSxu~6` zsSnxz{p==e(D(!PNbU@0Ee_VbMr3qhb9=zqsoMnh*X0@HUsQ+cuPClxYx*kEZD+vu zSX;`!OQ?qp>;%^dKDae{FQ;ok$~ai7882-~kK;`jb8hapwXPS6>0W2O8P^DVHUppE zH|OxRv2|lY-jcG~2@2sAb2RPB?`Ug_jD@)WH#REz$m3sYs!RJh!s@pJ_{G01(AFs* zo=l#`R-HVGx31~X-V|ea@1#Put<6q|u2+PA9>wCKs=I9N?NGX>j`kMM4#tfqPT6g# zb%QO(%A~*(JK=iI0gCH5J@Bbm%6oKpgK5Tz@Fb&^+WylT7QgPKRFn3I85K=J<0WIH z|9q$5yQxuJZW4~w2V27DD|!6)w`^Ab!D2RJ{%II~dpI1f)aQ$;X5hbAOMEod3f5KG zgUwB&bcRzxpNGY{w2X}*&9~Pi^K~< zeel1>Q9LvhG4|y(7-H=VA*1}5+k(buVe?W+QsQuD!gTC^e=js|vJhzdcqOQB3SVJb z0*gL0#y9qPIpVzmYER7Bp$lCnHiO~qrs0!}edzGHCG5CyoSB?$&NBxOL63Izp>$Py zoN)?yw?$LHoYtIv^-Bx;cRC4uicD0~nm{%vIe=AW>C1mpuYp74EflY5w9FB-{aUK& zL)&7jPIK8!za`)udKKbbptDX5gS<(WZM?7sUcXg?vH`&85_0~Y15?aF6q)yXa} zB54O!tauAF7ql0ADz3~km5-JWP;Gp|pqJeRJiNvU56;$s-6qEHJ9=Z?xpv<>5;vTx zFPr%`ln?$Zrg?S48xDQp}kH6Ijg-2A70=WF-e?@PGf!Mymn`r26N!DH`fE|M}eFUN-G*xCI7{yM#yne1xp5 z%V4#{5HhAc=2LB&ah-klz*8NLYa2Der0FwROZ@|A5#0@zYX!iAA0+9svCLg&GAZS?^1SW`D&Qn-UL!#WP;z(D&^wf z6a43oWzm7_`9mDy5 z2O9FM)i(0koq=f8xKg6|u%p_7f3c}t^nld4k(fvDn>~d8d1N95n>JHF#+HKpfYs<^ zt4p;p3nN}#5%X%-d|6l6*j7t@Z7`MvmAmtWqwNUOS}@Pb1?)yZK3CU7Q9b%_wD1F} zH?&zW2YN0IrExos;m4a{r_|Q4(CsD@$JT0Uq|)(`um(R3jHmT9xte`S&u(Z9%YNm=@0K)i^NQlx?_7eM-2yoHtJ1 zgy!1+u~zafyOp%|2=%V4H^mo@@|Li-yaHlw1Y`Tf7dGk+iw5jR z`Lq+8G13dy?dmPNdVT=v9kkn;0V|KK5Irq=3NQYR;*;BfY9G~C9$TQL+O=Cx^I(Z@ zepn#Q6<+gy%AOA7kg_HX^Nd4brDktcUDE=4f2!ukLrU;M$ZlwGc@+NAo2o3h*&l4b zM8J6Ke$Z)IkmUP%APRh@`J~T$3*m0{xsLdethqvl=}|6S{PXM~i#5&~KkV-`~52 zKQ75c;wxpqnPMP51cA%h4$JtgG5z7px+dT{E)<^rJjLQITSC2>3oLHKHr_KO9zQ*N z0Lc~|#Tc^L)_d{F5KaE(M>37=1lIq)F|>PN0sXZ$;lu^Uv7q}8+*P)gC+s{5Hv$|{ z%+K2=yTn{cO?=NIah*c7&fnM%5*&g%ay;Rv@o-qywhO+!{1{?qnM;BXMc>faLypG- zMjXf%=c+g+s<|9^LKjx-K8g0u9n?*I$M6-KL-=O?4)*oQ0pf0Km}ZVWb*?GXPPY(z zA;v*nP3x;rO|zw*6CpXcjQZ9W1*X$@$VX?m!08>QfUq4h{-)s{GjsgBvYD#=un6h( zEb5I9o~npMjp77ov@9R)W*XrZ&8D)X?E>qMuI5zdEaR^g;o)yCc>hcK5nOwGG)%o& z&i2)wV3#~D(0T8{_IgJMPiW1s?z#9Obs6=_PPqNpi648m2?cK%7_?#=!fvq2sn>;7+yHcnssl>LEXf2F_U#PmgU=^k2 zjCz!MV?CTHqdlu#W3ZyTD_^(nAI{M%X4E_Km^)o@(#B=bQok*B|M(p@SI6a?KcbCO zwA&GOj^(6*u(fYTAWp+!PRAH=Bqp{z#%u}?;)8P%E}2i?!FRpJg5I~^BX|g7a_+*UJu!H^RtGfW^Z|{gAYriN;3cVpKiXs9@KV8xa?hoDKzsx)Zfmi_ zy($=65Xh{?&4>AKD+Dg1=sTlrgL#V48i{J0#@`G^eu@L3I~HCrhFj_Ppx2i^c2yYz zxcP(Kpm9!9-P_lY6&lXKdV@6Z+Mx)zNc-;6PdxGWI_y#Pq*TY}Tzg=Evc6%O_&iKJ zd`TRe<}e64eA|vqE;;eYY%e6OMLJj)2I%U@({t}ooqqzVEm{Zs6!!PJ2{hi|Joh~l zS~l>=Z=_yFyLMj*>o+3t8a{j41g>`5O1!5)ZY#jvoD)*0Aj< zZ_%W+NghW*(-=kBk@KAkEfI38AI#Z&0z5XJ6?n)jqE86^5IhYfe_|!lGV0pnCHUyk zBv?DT4QVecc=am~g$5=q1LAd2Z|Xr07R$@7Ybx&V^#vDWWYp zi@4^a_85kJ@Lcopgtzb5iuIeA`0S;(BB&oWO4J{0@R{E5c-c2b+6-D=X#y|LJ_o8@ z41M`pB5leB7IdL~2a{mU&6fBuo^nIqhP-Xe0UW*XFh=dXz-pKNhUYF#i8mv0%%+7r ztG5|8o>+o~Q#9JmX!#+>8n&+dbM;a5!iwHb-C zq+HtTX6lwB*y_HswDY_+kj_P_G5Ao@8hh*cquKp_NP3j*9}x!6dK|zT&$nUo)J&in zmENTlaDk;_ZoYk;PP%ObCv1@%weC|br6BPnY1(j{_%lEO$xEf4&F%ie_e$2>E5vE^d9{mp?^$HZPd`UQ1!_+@EAn;P) zM`czR(Dk6GBWvpwV6^Qb@y1*xbYP>@N+eAocmUpS`_6Z-E0j)!)|bV35qBVIL`GVP z6ILVX8+N~EE8%}ss$cHazX9+5Rhz9a9gSP&3>4Z2+I1cz^crkU*g*H=Hd9~izYH|* zNOb|E#TEasEYU9@H~PmmyrcW}!ftRHQwXj%PvE6QeiFhe#tQ$bho7Q(;KM%DO!%#-G|u{Pmm63h=j93pXLyz;w29UOg%#Pd3GGd zzwBEp#tbQ_N^$-TF&#Rk{tAQ#;hQ;y??~L$gOa&vqEPMx}nnO_! z-S6HZtvr_9pY)5>kGY8+{X3}kcN~Fy4Ac9X&*}OFp8{bUzc(n8Q@wLbXO#&ZLO2ej zZL?R+GlEqOCeicRR-EP^n|7WFpI7c?VODyo%R;|8{TTcA4Yd6HjtdQ{yZjJ1k0~de ze41-b?m{|VAB>k=6`UeGBz@Lo99mdkZkaq2b~Z3!1Eu<;j~ekyWj>5*gs{mOspdH8 zd?f9Uvp@PV!fJS6f1m10S0?Yp4buz=H~q+uwHIDPZ82F38|y0qQ$!yjX&#~5K)<*V zmYthgryYrN;rxpjAbnql&ooCERQ{fY534}(5wh^Y*PkW8fnfuLmg7yg$FW{9^~eL& zO0!PPgKzs!v!dtm%Asq28DXMAyd{n=>JKP;V4diGgY%A8u&XUS*R-z_mbes4EwAhV zuN#9Qnx9inj`L>NC=h;`l%q$OM-+jQ-2$ zoY}f{-fa1pmcpxpXTM|0nHFP^j#0xzt888vIsPs;Ed#ZB;rmGJf`#A z6iM^cVGiMn(DF!FX!~wOI`p$G!ky=X6skRFInm<$)`V}2aspoca~RwkWGxH-K)#r@ zDZDLk1Kq=&gy)0^+E=%Hu#QT{sna9$H=sV}9_@U=E&L5LU);aWZ#XWB6PksEYdCQ7 zwld`qXz*nTeqC-0_534nZ2K&!>*sQjWhjJ)u)d)c9DDYYy^lN2-^ZCD>2JK$%aW4^ z75yP{3F6FPWLWsru#=P76~uU376{fC9T*2)c@bPz!U0SymGKVWhv3zeDOJ? z?1DY|U0)TSH*MD2m zgGoJ*`h)aJsNi5mT8{ndu33kB`$OBad;XWQN&D0L*3%kEK2%RdyuSTObnMhbuGh6v z59N;G3ODpPw@15JEbw3p5u_c2ApyY5Zp}fSIHBL`opD> zw2q`yUmiPu1Q1^lA6`cCVrqPgS4f^7R;>TYgh!rTJq1dqtP=W&G=B*veU4)6JkICm z5ckySqk4n3@xALitDpS(An9zGG^<3oLpV|a7@UqY?kr?fLzTFaL9~w0xhOn9_q)^4 z=#ej$KN*FW2d;zvx}B)=jj4Zb0Pze6-FN7ysUrNU=wr&t>N1)7Kj=Bt*it66vhWt` zOv)%DbQM@B&wo1s+br!VxKE{P0`fYXY70dEbhuRq;{V2?_SuBIDp)-GFHkRGK~Oeq zseQ!BACkAcK)I-il9{mGZgH**?+hD4#H*1C`7gW3>_3b=H1WuD7_}vrSN?78I!|k+G^1p0pq=rm-4&^2Wa!sj$N_>JL$I^4W z!qYhERNQT{S9liu?jI_VpA`HCKVv4a>6=Cpr=7>Au}ej^gEk$U>b#Henbc=>8j}2w zz&*;*8UtNFkS673zJ6dIbruQt_`d5up#BeImGl7W$fDQ$SnZ$~p-FRuzAT$|lDS64 z1Jw=oU?!~FqH3`>t;j`H%H4pn2@qNqdwd};x)Majv%kU;jLb-LBzdz9r+jUbls2S! z6A7QSrPsxb_Dz^d`oEX#S@{fzvxuJ_^ChPa!kxels;CQ*^IaP>QT>tf0Vy}*+m$u6 zjm|NlMS$iCh|dVq(l}uNh`j2~)xN?@)s0hny*gh6>4&Z|Iu}*cGVu^=RJ01HN6F96 zg44tHLH6N9h2{a@eXAmEc@pmg9zybQQr7A$q+Cd{zAI-_<|EU!$TUAZ>cs~s+|37x z6WFb5As}*Ex;C2QcSzcUUz@QFbDnd`Q5}T8}1&fqYOk=~GSob-55I6K5hH zpjrUIAG@m>irke=o>wXn-w7;Zlp}DeG5+GQl`6(@bwq$&WSEK2d_rTZ1HB```(z-H zzUP{8VPJnJA8Y-4B56phZ{M9;b=iiw&AgEGtNK{~qVj0;Biw1_&keVhqS5(1{LtG_ z_&#|EFKU~BKib_@dW<&2DMwC&PDvS@_Ux|?-B^b8t9;n2b^2JPXv+WU>*5h_4h#Mb zgC=2Vd|Of^9PwtDDGlK>CwMEjBT_J;wIf*l)mN*F+_7U-IyxLa&bHo-$KJI5MDKaq zG1Qap+jzDO7y5@l#j?}*(P9vbubr=qnv?)7M(KguQV*q#)E$GL^u*H{6%f$On%8dg z#FK|~*tYZ$kWiQf+;j|fUH=7RiW;kytM_7#;YuFdVI(dyD`5vrTgyFyQqk>beH<^o ztEN5l=-MDJryk_dJ^Sa9OZdv~15w*9f#3Mn87t48fO|`CLzqJ=)^oQ$+&%FP239>6 z$A)DKBXW{QokH5~0xpiWkStdlyd`kk^dDIMT7cJ$ zOzh7E!F%_;htYOWp+KBOhyp1{hQcXj?-EJp#FT4gP zI&6Wgfd6oP_aiiq9Hstd^xbqrUewtIn=~6s&&QTabp6u9oPN0FY7?AQ5ekkyzrwE2 zD@^x>1&;3g9wHZfhJxsacBeDw{=k@6P<0rjJDXv~hVuBidE$9g-S+Ik(^^GpLTJ-5U0 zLuifrj%iR6 zQr&Hk#-;6o_9N*TAT|<{3Z6lDffW<)r{h4+Yvyq9L^EtrdIB$AyNuLdFfTm{Jch?2 z^&-=~GY`ZV@9A_1X#Vla`<7@GI19svkA-d<4}i6CJ!aR}3ogHThhG~T$)cxs-~P!y zcHe=sTZJIin>=#2gUt7xMT5@4P}H_F)TjIQ-p3irIl6WX4;%1LYXPXH@$`SKRT?Yx zZR9z^yc$|3&Xhfk<@|c}Bp4VG38$7EX2XZl`huP>cwAK+OH6621~l1*a}M98`aFR9 z)YDkrwGSg~QF8mKTxk&vd%rZ7yXD4YoAv7mgcbbnzqu^^S${_J2K&Q1pcCCYPPm}h z%6NSkW{Rs~zoogc>Vz~+R} zA+Y0(Hg@Xx45&X9>;mk^vNq+|A?gil z(R4GLuC$Tq^I(DRBRJcp9aO$6=n{EvK{UT(zl8pl*Lp-m!z2> z_~Ye(OH7P0aSC`U*RkKIJSOm)IEgZ&n>nM~N=P`%f(}^lhDWbLqWO0I{>UY0tjD)EI1W$O{&<=znSF&pp74{IWDWRSks`ziFfw}x|U{7A9_;bPt zEPu8LcYde!yANi|ziMN_U;7s8eS8Y!2VLbyOWyF2(O>Z|hNBs+K`r`x?uULzJT0yh zwpk`Cc76ZA?=`fy#L9R!DW(*Q4ynxD9+3Ei(fQ(-n*Fr?{$DnsSOZo!?W^veP@jvQ z7(G)1Pn}td9)7ksZ_PNM{=@|X!;t2IaBT$B2yY1MUpIg)5gQ@s4m|@JcaOz7-DW=@ zVa^t(dNz10K4an{+*9Fs$T|xXHjQNm;?tS9 zK4n4%dT32lh&$9o_bJ?UOfk%iDB|ji9T0bSymCDH3~8r#$^u_EB;Lku-W9Ct`nBk6 zAIxGJ-$#M5)H@ixAtk5k&n?_;r;Fy(kAcHsGoT*EvoQ@=s?i|PGnlD9!0LLwKsu1> zbpW&7Ql!yIUD)z{^Z%n&oH0pnr&#Y`4sSYQ$A=1RUAe zNWI-+6cQJ*=ELW6(qi)GO&{^>G{BYLbHSun6gafg#eoq<@Zse}_+~HyFV*;g(}2^= z*}k!C`sFmPKl_oF>YYcQ6=S&I376B2Wudo>cLhUfNM{)Dr-}C0&oaOK89@3GEZpBB zail_HL^#+HZJw3j@u|;nLWq(xZEXj^<5D$w`Il*DkT@Shf0@dat7=3o)@j+m8!hFV zjk3UXSPS^x$_!&ic7bLYnXutwHr(qL0E6Paa77=&uxY`x-)|UcgDW|y69emhN0`Rw z^BM6b^c+7Nb;i9GILqmGAaua4rt?V`Ug6vSZDfR1nC~0SZM#Nd&)s6|0zsVD;NI;e zn}>Tv4=}<&wzqFO>oGcl4Nh#R_DMM>RV?cT)Yo-&ra=n74j_zQg`G^P^mHDAmjS5FiuyGm(4fh|$cxV{AE z`aUO(asUGNl+|Im=&R{}+<~~5ryAwqvzZ6DNpc?)e0i1bMJFt+({THI^yv7S>LYD^ zIM8vNsCPTUTK=YNf_y!48)^Q%((!0>oD{haBOklidHB)(iG>YSi#HP>_NqPd8Afs~ z*8#!=l{BCfs~f-!&bX-b89A#XM~qE(pTW2(M}#&u8s3^MuC{KIrC`` zH+2?&tp!34a;kqMpNFKKK4mE1}uZ7Hx!Y1(HE&+}eMdHsG&*>#KytxI*H zzU&jh`WsEH!+EM5$*tP~(gw}s+Yx;*ZEh?yOW7v=tx}BxjUx`D`x5WAI|*HSUQ~L7 zEr50na#=<4R@6_Ryk)^4z(rm_7!MUEuRtf$RPrrzIq3uX`%g~V2J4N~R(eGbM&Xf2 ze@LWr;nswgqPDPQwWhl1VsFA}LumS@JqGS^#@sc2=sskXVt>6a>4zGa>`MFI_U3qG z;1||mLhEePRn62r#}qjKc91>ka-U5i{c%!7Aq$#&cCp!FQTV4F5aqp8!C)Ki;qF`|yj65jraPKT1@;E8{C#ScH|+6|t~Y|9tqcW3l@@_)n5*7?$l zmm?Lzb1r-o^^Gz((GS}P`yyc=C;u)L%~?+xxE_+GLE}nSp(Q!#b2dG1Je^B|@O_Lj z4170bFN_~zkEC~m&SC;DbV{6I`TIwh;`{&_S#M%LUwmX#cer$Bf2x<~oV+$$@kvKy z95Q(^KB>)O(T{{}6OnX^;`Cit)yfRQ{e~RM=a%BjY&Rr-0weXiop11HDTsce=b;fG)hVY;hS;MAK|%G^~4Z<_i(<@fQ&q?-1bi}6B?(N$t=?P zS)_|iSuGFY=1w%1+*q=KIG+Mz0r| zloK|f$Ua)etwE996;8i^G%4W%M~IKq7t2#2CLkXZ3T^6eXx`VwNSIE(W+@}x zK4xEqDbQJ8pvwee21Tc>vWZlE#q9 z%Mpfe!co(232lK>o^8dAKlgHxF^(8Lw2q&)OukF{;1<(dlnkO);;Pz+ECi?LmE(xZ ziLkzVCy^sy-tUP(K7b3)r?uVzUiL8*US04BBW_Yf?wa?z5@+u}isTPT19o5z4~9qs zTUY?`47jY?0OSD#HUsHr@=}q|a@rxhY^DJZtXs<~*L77Xd*kGpFn#fLM%ffUF=sG1 z&JPl~V4V-`?${sApL|h72B&ouzbTZPXTd?@A&Mt64S+WDU#y9gNZ2BWM8<6N>JqklMPu6P0;E%Nx1*a@mh zuNE@t040=9f~KD)p~xRddqRWwmRLW^jxyZVY*9%77qv9v+CwJvm(WW>i~6qbDGUF+ zKm3q#L)rk*QZwoMr6{@MDj5{8MxU_{9#!>w90Zvi^We2eVtSKbjF3ftC+ke8-}>vgjG)m;)D_-wcV?FYU!3NVA)RG$;c5d zyqd?pE-{w-eXvxQboRi4TPbXuWeBYkSqkCfE!Z5LuH4SDhjeL|1_mcwz+>aXxkcCC zY}cRHto3Sr?DerFvYXfMpJs$&-DBHUfE73XQ**X8w7<#iwZ3e-b z0dH7UBR#e9Gwne-ek>1Ie}+A56)Z`*5jewrKkz?E;P3SdyG;p$73Vji<~UGXTK0^mll90GvZ-9?NQn@nvR>68V8Kr)w_36r(OV0c=f3ofv-vR9* zXIW0VvzTY3>u0ArM`Ha_(sfT_Q6pVfp?YDfgOhRov1FDfo8>kgT#WA@=E3Q;x%gxD zS%_cWUHZjh;WXV#(08$p>TtjsQV!ohUE=|eM}4O^HihO;AB#S@VfN5_IN0$R4w~bhC^xTe z!B;)~@m|#??BA^y+&H)hR(5TVp=DFx-@#LGY1cOVweblHUVcgZoz}O#!2d2zfsQ8+ zL-l57J~XmiiQIY-Q@v!l=2xD$cHU|1E_`)x1X3N#wR*Bl*T*AnPXg)(wmoYHL_e;8 zZ-;iF+w)L#=#vliOV49G?afPAq8eElPyi0IGI0R zoo?r8vp=V^pN{(NP*Zd-cV)dx>!~!)?03uU%|uNvM^0$N*`NSE za!(ZPwd9Yz2hPC6OSBg6C|8{OpraaHmzRmmP1%a7T&6i}i3dX3D`TpEvg3a7 zaN@hE{Ot2IsnO*90PP2}-i@9qgkd?e)SSnjt1maOzs88uU}RAhpGnJ>(Yf>ZgR;E7 z-y3N2CJ<)qcoV z^NYgV=!bPVWkK;yxCmo(?}J7sT+v#@Bqg*rFUmfi65mNq=l#a9<* zF*+`H)u{&dv4|B~HDJ{2_AE=W2`y> z&imEFf-Q%sPHF$2Hx1y$%W5`!y#wL!IV&5*arnS~IJi|4(5qJl)2n9Ij)PO3OPV=a zdEDXW30%|2SBxLkOJbIOa-QUPe;XfnWgmOCIf9ECb6zIFuW)3E;K99NAPh)H8I8>~zBk;w1t6HP?hx&pa6{8vdG2%89 z+}f}Lz@uys5LXDSsWnY@vX+&L(Jy!=)dxL~_VE?}9@q_6C%EC#4@WdZKZP*A;D@~H z{QKD-dV2Fmfg>O=G!T+qQjuy2TbE=h&$as_U0+|)2u^y2#J!lcrXdO~Jh$*Gza{&@ zp7)1=uwFY)#6N7$wI_?Zc81n+(7iS=A^m2z}W^#|7!KW+HgSqq3S&14rBaZY&W z#3h_~5<}we@#ZUo=z1q<(wd)ugLCK!cs+fXRo+=S?Y0K_$`wdh!O}~{IY{%uyUq%L*6XXqF{pmmV!8cS5ME1Y z6lpScytqT)g-`sq4zB#31>_x+p)(uMF_JL)?-^-nS6Z8Wj0@0t;GhjLQfsLjPOsd{ zPtMU(EeD5U7bRLT95hU#rysFS6%wS2KyyN;S{|9p#QQ)K}}SA{2YlxLFi)2J97wc zJ`$-Gq_YY2@L%IrGI=P)>}rg_94yzFjHdH9;y>dh{EqY)lScgn(hB%C=?ri6={kS% z@Q3goK$=JXdNOD^nS;H3FjBn<{{f$Veqmd5W0=LVA1u<~6`Qv94d}Lx#Lgp9c*_b) z5bwRzX}TmlVW_Sa=E+Anc{{eTML7>|eibrC50nKCL*iYj#&>eped!Y6f)lp!^OppO zF@M3=47rZm`<#`M;u)$q3WV=#d%m0e$>BV$vbLu;E`u7K=^7$y)Gzn&B@4}d_&qyg*+LrYSU1*KU$8b z&SnB}qC}XHW?SmW)_d;aznD(wTHFy8v$9_!Z zI=iEb~PoZV?#awZb7hQ}y zWoJ1}NAjpVVa-uq`lkt;woc>4qpcw+p6qhw0{j!;tdZ*;r+jH93mzEpA`M7qrS88> z*zMN+S@PB+K>iEy@jR*hX)B>CXgRp4$VS+^~eakD+X;<~*#A3HP(G zU`IU%0@V(#v{2~UgRo`gJLUM8WbB#UM|G*R#V$YQgO)Olk^jMiajQgr&7t~-R9d&{ zhxZUPzO5~boROT-3Md!y=T}9}Kbb{7UeI8LGk1dPZQ` z*c?6kj2H7rKEesA!iveqFtwj138vNQfd0Kls%KNn=-4Gd8HiDTh4PyzZY3?i<|#Td`ALVdbC;6m^+md7xtZoUPz@Bw=Ro^$n`}{&Glu&BalFV2DtR*Us@)j%s-R@y1i10|5+ff9qKD&J zoF?>}lkb*EHyQaR;XfUOp0SM$RL7y;)B)Z;D7;E=bxZ8I18P0X_J7&D^N3C~Uj{1m zrDWk9HsAeRr@PlU+Ki#92uFH<2|sc@3bP1vMrU1lDS6m-3Dz z^w(6OYb30UJa1Clzo5PdPu^;yQr4j!j4e=($)>!6gXrFA;y&Ks*La{Fph|g^Z%EwB z*4bon^0BoUXI*F-C;h@b+foJZi@JwiGZVqtArC0esSUpR0A+3rJ2r)Cx)>;TNDEJN zRjCeHAE^oTlDd&kt*Z(jB=k&RD?lw%=OcRTVw z-QZ#Be#*eUwdW9Z+z-juLVpuO6n`gPgjYLF)ord@`p>oe>#@Q@*I}`HFrVd1+jH#6?^ets~eL7VSQe z?baxfi+(Tl7DXn+iTSqh_S0%09#e@USer){@~EGCamUc`+FamuB$@h#fsAq?r}F?B zYe<c|DpEec&mJBs@dsWs{mH4P z!W{M}Kv@!~m%>S-P||OT0q#!)x1sHZekigD^&+6rWaCpRH3ZZEut zEckH94oha*@pP?kqa3DE-&hK8cULIW;rTJT!VgFy>pZ^b4AdW!FZ9e8eH-dUY^v>1 zpPxL1?#IxP#j(lf*7nlcziLkTswp!P2UMex&Un~f_!%|9d*Pb)QoPwk zTaB~vWSU?D9uZqdjhp9hkReoDVT7+0M-X5u~(ff`LAK==w#*$CG&Um-L`cbu1rl4uch<6j4iHC z!1ci$l(b37w9eg5aQV`b8?ODpTlQ1Y_k$l#T;3Va(3(fzsw1GRUJ#^1dm5JyJm5|` zIGJ5S6TQ|v^7B=ue>NMlmtA1>-Zp~R^22D*E*{MiXR^nwCxLj)Qu@BfIA=SY_nM2n zLzW?3H(T!eSP2f3Sl5fq+sf*TZNnjw80}%@;Ymhj}-7T-RRe zQFSQ)H2bBp_H+Wvjr0Ytmw{mZVGQjfo-DPp%;)bn?t+(x=0V?#Ec7Yv2kmm`nXpM6 zW%WuqRih68rZ5j(Yln#yYIM{D8G z`}ylUTX|f^hV09=cw|}iYR|*WPl!t9rmX zUxT=L_2ikBcbOC2U^;h15wrMgDfcdG2z@Ggp@L6Y_E{Z>?9+^=yk3mShw9(T6*O7k7f_xzd0XdKi-H@9MorY+!W#b%a1pd22b2;^?GZf#IzADn9XNV7RS z4i}6zB}|5(PcwVWi+>Cw_a&C@{bc7+qJd6RuIm`>?WYjFQ#qcab4!X<2p8YLU|s#aoKhVcCE z<}%e4-0b25+b#@-Z^zr?ArmuMT^S5{@oqThTwgGYvj_9dI(+6y6({I9@O9aLpy!Ex z@aE!u)+k^QdsKc7JU3-y@t;*-9a@3Chit)vvtBa|wSUiLEPzF}Eztf-ATCL;Lyz_E zVB&;SY&y1p3EbUKqVV0j8$dNB)A*r9au=TM8OG)>ZwmI;6;WTj*m*vmUJ?K_$J}}D zbKE=BLcKQh3_7@2%4UfVS+wP69O1YNT$3-b?9N-!bK88jDX&K02Gx~@>OWflWQDmC z#+J8I^_P8l}A0GK6%@=aHQ=Xh+B9HFIE49jMJQN9`^v=*_&}a>s#<*bS>AR<6&>4 zx{_^_5+HmC9s@cD4DC7s#5EUE-%)VYdwN!daETUaQ=nCIW8#ESNOjC@lo4?AX$Y7` z`_$sSp<688Zu%7E@Ll}b0Z;B9unG!3STTX; z-5NKLuiPnyL0cNaqURl8_U)c*+{>j%{LMald9z`6H=?Xt27=elJFJAV^J`#IVl~?} zCmJ3k?c=Kka8Vzq8NCjvj$qn%cN|=Nlzp}Os2Hya;_HXIW51X=Y?56anRJl#F7p%P zBRCYCEmjeaG>`=sWL3@-c)`*~gW;{wZ}$6vDLBS=$Cu;3O2a&QU`ZPlR9=?}ZLoBF z17CJ_hdb{b;Pkxzc*h3%>huzQusIh4^fQ*#Yr<%JHN^j7{PBB#J?J-S1)F&+n4Psq z<)#K#S!_$AY}I}}`*39<^bT}{cdu;ZO~dMPZHH7Co!JV~Vj`i#Q(CWY#7_{lnZKbC z8m`R8;IZHNbiYEpnAnXIrkLHQK1f{4o7~v}oyK>O=)G7$YpG={u7*q18^E`EHu-=R zxYMna6K1*jW`DW;n3>@1;Hsf9mIY=>&oNj3Ix4F^@mT}ofwTZm8rD;n$xEdXe+J2u z;);YG%EYmt*-!VQIFG`X--`*$BXInh_CUH%{GKQ<2XRX(fpi%Ym#6Y=TmM1Bl%{;U z;atJb>d;#wpWZ#S~Ax;aX=S>0V8t6W=vzpm$BjB`VRkh~ZFqaDc4{W^{>8ccxWNp%0ec0c&( zTwf*5mEvsPYT{bwu*O;QF=86x@pl?r_U*SKxbmTII5;&s2(EMf;uT9nRp=&-fh7Ej z6tNI({)NC`uU^o2Z!n&ndx*QIH&UMlhTsRos9H_V3<#y;>;&Rg6!;EZlS5@=y}a=$Y5ww1F8t2AUncUnX9F=fG?3XQm_h3wW~%oV zEA&|1pNn}}`so_nH?dRiZi^N*58@nzhuwF61`fT^T3);0Gg9!7=2Y zt?1sT(YT?~StVZ$Ev5w!A2A$xrv==OJ&4V^9>RfzcOfFy3keV8U;cweH~fWeL&&qK zeD>`#^ji8(c5g@Uz7#?}Y9HvFUW@|Yj#G2^1idT}T1~!EEk9_bwh2msHvhObRDtqIyV;KK$Ad)`grR~~qG4VK~u>%*j7XlZV zang9myyYYKNNQe`1dZ$5#pwBSs5atjUx$yofRBMTj9+t<^&avEHjg@q8?!9&;q_g_ zgFE1YK}%?|PetN=ZacF~`nF&;df08m8f##}%h3Fx)yYJ(ERCz3gAQFX93o8Dk>>o> z?4PnsTsK}1ZAbm&W0KH{{9aDAezx1?0T{MkPoBAGJw7V$!~Oi7aoykZ!pEspgWT4& z9S|2_x03gyWzKlyo;fCVa6r-z@@qvvUQ+0h@;0hI>5DfTXjsB0*?Do|ZgtMT6nGio zz;<-s4mt~d!GRY?aryOeOyH5ulXT|;c~d?0#)?j?=e!Z<6+Z;#-P=wc>LjnoKY#@( z_jpFNmO8a5t?@E&HT2G@Zpxk4dV=4PybtJm7Hal5#z7tZhVsf26}5WN!~8hBjY(%#^Upw$ z$5Y|Ag%<$fo5pV#PjfbvHw|l~ZtZr4J!;tru4axB<4>RA2b=QN;l=4p5}Iz@Yppcv z$4MT#rXLIG7~?=(srvPwpbXmLhdR~vLPwE2G7NfaEq8uyfPwAGfb@hDo@&oo%oXK7 zAPs`an`80ez%uCa8WqYWnSaN26*-9a{OS#B7eAE9D?=NnzBr>)16_KY#J@Tc@O=S7 zPvBd%IR@;_Bb~J3bR16H0IK~DTds8jH z=>D21Fs4wQD|YX6Rm!5^zQn0tMI--OKB4!@DRjRK)+xNCv;}} z4>pudF5Tm&j_zl@cO3xIXOUCzc+xjcTE~~f)WxE-B-S%E1V5U8=Y)}3uDSW5A5tCx z(oIGl3`!qegv%{1AZe>QyLEfvnVHA>#R_FiP8efDTkOkzWn0Wm&L3AqjTvv?+-dqA z5cyi<1ezP=)QosuV=Y?Y7C^pLB5$bH_d0~B>uktx&x67nV?;(`t!`ced6bz<`oaaT zT)%Hde=CKDzGmvitZ3Nsc%NqX_c}6NpQc>z71tefgD*FZU?y7@zzF9)te|gG{5tn6 zBi-QtRecir2F;5)kVbcc;(h_OIl;jt8X5&$z?R-S_^?)aH1>C}uJIF~%%PAUB7MkV z`wg}*QQt=%7BD02qnxrTqw8U*d10_5W(Rz=T1Ip8OX}1p8-GV_m1|nS z-2(cVct2cv8fb*Vf00hIf)6pAv=gd2l;V?gi8wM=vD`Bq$Qz*F)jc8yE2OFTqy1~C z&Cn_(esDuLrmG7c>S>^3B6%9>O9WF^YsHBtXA$-G*n@vCv`|;fXr%hza1h**y|lNn$hL%;XE5$rK6AGz2P2(w zY|zY$E!)~aWOPU$FdimOxvdEP7QXX#(K2r7XII=hQoo)u4#uU&OVkI! zM?otX^;B3JtuJuDbRqw;^AywE^@1Y@%Gu$Q6Y;B?pR#O6PawYt`w#jd@g4oWj!Iq` z-i&L8yMNlk%kis#dKu*9UP;-@22p?ECtjYVBl;_<@Zj&>jm6cwy1}|Z{#=ax&p%CN zF^Ab_{dvI6ouURPZx|7WFCpG-0|ra?YlOauOtz!DmP)wAq~TuZzAys(Z#~aG@9>2+ zx|P9AqqUjPpqGc9bHXa_%ju3H(=2`026HYvkVGGZ@GIT}s~`vihW%zEoX@doX`d94 z6VH29G2+|o4ehhx)$_?9IDj}#_`+H}s~2ysQhn1L&&4Y@qeV}QGRGG#`XX<1<5*^J zfAqd&B;Ss0F3o@HDr2X^tauOUWN{AXqY9<2o8s_L=?#^xRiV02NPnq6;?Kmn3SUN9 zL}0$Qw&>hhVwdMgny=72vZ{xbkl#H*=noyMjp&6@el8H4%N845QAB@(dNU%Aa>~`> zygBg=rEK!@9 zOZ^wuj{lCg3JU+mvUbXePgjcT!S@?=Rq_eyhr(o>{Na^m^EkQ(eePAE6(D*J#Id-b z(O9IO2hw$uH_Df&Uj>64&hy{xbb&mHx-O$sct6j8lIJercgggraUE|zm!tjk85Q)5XeIy)iA$2%bzqQ zg7~xssUHU)&DY?k*&eliZ@A|y;oTtqw{dN6ka|C=WBe(oceDV>QxnH{;nn~4Vfh4C zcyxOXP$uE&a1`#(j6=}_IsLUKC(kE(iAe8b@3;0rt#^x{U(7R!JTRa1q6z+fJcxQN zub}4cQ2Eox!+hkvTOj(LBJbEHgws6-Nw}#_Fnl{*j$d|F;!yi7T<|woxJvAbAiVZ!Gc^d!2UzdbGU9C~vBw-tHOg zKzdNOe;_P(Kk`{;Xldzg%h`Cu)hF89BzucgmD|N$1{??mZ!{rhEPy1c+V$Ry5K9 z>XRv=hbVexTW5 zodp}!(VbpmbDyW0-;Xaa;!WzET?6W43T>k1eb^k{rWQBWt((;LS*h+h^-R?6J1nTzUC8N}I893CqL-k5O25|U z(@l^vc|+K`Hj%p?38TJjN409P2`s-}CbBN&RUIrJbDUe>zswwsH=to=1DUP|pVv)7 z>U$9e4DhY%dl0>1Jr7!sF!2C1XP?-bx!N*$E*Rha2~xHdTme4UJT+5IXQ8Osb$=aU zh>w>Ry&+B3=wobbcN|I=J!Cfy&> zr^GLNy%fdQ+jW7ucj~KmR;FOTHRIvTvm?CtPYN1!|IJ$+o5K8J%+b8&kVLCdC>I@C zW5A3b+{MHNpTCm;w$<>@>ssKgfYCgp=NO!@Ya{fZ^_7{|v}F3TN5VSIbxxlLNptI{ z-7K8pqWxNSqFEQ7{$W2Z^C`qB3#;*n&rYoAa|sU>Sz%||(_*!23~aws%`clDf)vMj zaJg9{d~6+qDe`!(^#Lo6FP3|Jw&Y_j=|IZRy}0G;D;5*K0y?`i zK$E5hIJ{~#ZuzlM+N|9dH#U0@uM2Ik$>bEsIzE6e-_{$%we{uMP*lB58a%L}x?*(! zYqx@))oI}X9mYIFdE-3x`sxnUdT<4gby&qcPkhXtI(IHiS#}fVeQ%>W4nM{|@7SGv zxoJPS>ObT!o(xm(&c2U{8xDYu?=!w^*HkogJiznDZiIUIQ^h!Ie9k;(zl~1eqFhyK zKR*YqzB<6_RGO&=UnlT-S54Gb=Y~LNua=;#?!y{5qI71((7gez1G7XIT2z$qtTTsU z_4qaL@@W{~+~@#ekPeiGePs}0q&fZNo-*6uGNixigXu5d;GBO2icV+@4(@#gs{Z&> z9@J8OBbGub-U8jg#;Tp(MgCAWg0zmg@YTZ{*4xfvv^j%V+jg&*zK zvx|LiDuHw3G2%l8|GcA-JaFRmY{G*?<01Zru;&ceSD%!+Kp3<-cNscNZ-JjSJy!P0 z-?;4C23fEZT8E?q&6WD9(g(6n1fXd{TDv7BiZymW$bu%sV#KS-w9eOGP8i}eXW(zGT&LhC&@6%+l_ zToYT!y6XqSZ@n@YPS3#5LovMPi{qSLqtvMkXR~Y`@E7kJ;PMT$f9_NAb0w2;*sq&P z%1{G&)cr#WVL+Xyh}HP)=8m!j$U2){uFQi?*+q(9mjz7 z09D4Ge85+a|IUI3w}MdH9H1rW*r;1MSX|Ga^?au%PdLy=vNMW@tIxdopWmbT+e~ZT zqI4-#1V%xxCl+dSjvb5m)=ZuM+)C#ATG00>26SKSI!@Qlcb;q^6TSr=CBg)>KCqtM zoAeg8)Te!obQ|JD`)W;UzZf{y;VUN`5qFg1ua>dI6)oj2D|Ptgra1yjEZD&vnvA`I znHO5atFrxo{;8O|R2!$x>&_RJ>Seb+@Ix{C?*t~gF9dbn13qa_Q{Fc}96V1fgU-F* zao<#b(8Rjn;p}LbF`xzb2NlzO7I$&}^B6ojCxiCc0sQx_IV4Xtl0?02GS22(KUCn1 z{@0Y8#qX%z13=z>f%o^c!}g00VNv5W7)pcKrLPZ58Dy{KZ1v^DdjeC~tD=kiKJGj$ z+uIlQm+XS7>Y0pi1T%WgtmUSqu{&{T&|3_4c*J7B_GUGrG4`zl)Ud;I9aeUMT3g1x#;xk&3Nn{d>J*1<_<)dSurmW8J5k;QlR zeMEa4`Izq0ojF*uB+(2#PjY;~e)5dM`QY)G)_z^&2pxxyfUzlCF8sv~P>W=Ogvyk3pD$FA#otq0tw7dwMX2=_a#?r$2!oZX~bRn7{?T8jsn==F~r; zIJZB*S1f(WZ$?|HVFnH4$-Y|HCTuXAXnYmFPMeO`%e}Z$A2SHioPhn!JJZ^Dx;(hw z0F`)MiaXdGjk>&6Mpx_x!LMS@Cx-1{FYdo%=f{V#7f*_5ZnRbU93Z~qPb?dw*R^r5 zeAQ28(x4nPF|?+C#2ysd;GHuDIt`ePj$?PhPrCo9Pu_4o^xyp2>!MnMZQr$&{F!yt z>BDk(aXlTi%^_>W>rrd$Kso*PmV?CYOHj;<-ipz5&u=pEke!%6y4PoSCTWO7+=e?( zTobh>3CwpI@BlOJZs)#7I&&I#g$E+~#YE7)h}!D(F^3?3+$C_=eZ%PeG{@Sq$ITnH z+7cRZ=XIS*Ja@TnMeS%?|s z)@q95bD%ke(#s)23xRY3=4yq)Wqmi;*!&8=>!Fc}%kgT(Z>e&KmqdC7m5vFxplCKE zF1ZT=Z->r*=cJ2F@Ml}!^GJHh6E~R1p|<^SUn>9_SKMfof)C{oY}O$`F1>6dSskV4 zkdEF2Tf+*4YL(Vw`hj|$pR+u!t>VOGG=~eZ*OMq1mpV-74D~e%V1o@~f)9IN;ry4W zBi!}KmflCr<#cYM_Q1rfjZ8HpI9}bE0wBiB#iAXayJm>QS3q?H-^cl2Bf1xo>WsT} z@dd(y^1J?O2-gl{Cz~{v$TP4l|7@VeQypfrc7RG_NBetgtEv60kjh%{Y3-Qbn_(h1 zJahrSx%;xnsu1!9{{e9U`w-qrCLV;gYgVIWeipvEF$7o5Gf+t*Kqu4+9VbQAj>CDE zNi62XaolJAkdH0^aBp-D78OJxaVMsXii3a8KhkwXVxPP#R1-G%WpOGa&XI_daOwUc z)@1k+mOo+v8ue{g%VR^0yx_seefXRY1u7e6zva`Fdjdccx>TWUR2 z$FZIH%4I#->QT=)=^GlG-V(3RHvgQ%zj{PK>A7`iFd~~c>LJ%eE~NKYL4VJag8MmP z4?R;VS+57X;BdC3IwA5h3^AqqtEl%p_d^X39?(1M3nQ%q&y0h3agd?hv!10KUueuk>}yU zzqz#W24ia@HPQVwkKeI`6UXu6mZRZO2YVhgHC>z!ICY+e&0k#8JZpFyf0>@gmk%6J z>uD#Mg(X0*TeE;T7`wLkB{0uQ-X{sJ2J$cL%eEc@UZ*vE-+T&c9P9G2C#O># zh2dU#HTxKjii~ZV)IDimrQhSZ-Vjr{iG0$EhC;}AGfa*{tVNsXUks}cUE?9 z+m9C=VljTld+0R6TqT?X>9$7u*iYWg;u6-m@`s)JGYlQhb->nfy)b3aY3MLczfoYwAr2EBam0nlPo3kGWNtJx{gnT3o#V;%Unb4Xy=R;ZBHQ$H_ z8mLqoSutnzWb)#|m&)XcG!4T~L*5)?nQ)5tr_@u0M|hp@43ABpv4?%n0O1|Umt&mY zKjP$mrjf?Lrb>i3bw8mL(NkvUs=g7Dble8st+sdNVOw~wX%D*{n?H^F<`USH&= z|C-i%5~uDOFgC2oj(Bw&rp~QmVjjmI3uC%oH`uzKE6}XE6ud8f@(1B%Nb3~eBdLf_xWm|#zqB{rC`R*uyVoyb#eXXDIZD42X(S3SJ|VWfO8yKMpYr23vJB)t$`VGN9uqw_;m;mgj4-b9fKRM`dRxq0 z;y}K(p)CBdl5j{N4Ofz;I8n|R4v$;XcfYi*H+gFIF0BXNAD0NfTDFFrXS?D)n@Cpg zd}6jvKt58Y;0ufCIjhZAdEHBIrHg}tk?N9f`xuYJ`Ru{SW}N)0x_iSp_U3$3;>*KG zz5~nS?eM$PW^g!F#Fy{f2jm;EENwg|9|m2z-^0H(yO`kXoyu-Jvc8BJLMBWbx)RSk zvq7)B=Nb8R6yrvE%QMr$u{;9l??5>Otiv+n=9GyDUnkha;3L96lc%2`u+%T>cwQ|> z+O}*eQ|_Xg-U36kf6_YjU-+XQw0@Cxn50DKP)=LMW=JTq7o$34)20O=>9P1s9Hw=K zdE6X}dG41%%uS_ZTbvNJAHR>yg2*Z(soz>FqKV#0yVNhta5?e=2 z;^uGNK=3?yRove^l}A48$tX9#-a%!IxXK|m`cbwf=C`uGw=OhD>WRCzUPj^5T9)|= zPpWFtyp_BKM>**lG$ZxX6G%TfgA35m$l6fPBtFTC;FHbR3(i zkS~$?T*Mw@XfnA| zEe1cYy@sTxY-XnqoU$K0>SjQ%ufqgCc5QzSss1FL-B95N}Q*Iq8}pax8b2dc=f?uMq{Qf3$7>d00ZVn z3y2ZT8ezW!WNw%r+PTlxv}3xV=hVn2|G5TU-Ty%CM-@V(15jQHkw)_Vd950Ho;e~DWB^n9C@!4NxzYD0ZZ624Tpc~&ggjAm3=($HGjop6J&u;mbhf9z!{Htx&g??a(C@J zNO?vTxRYX>fLk}yEtpgSCV-4;HE(sPXDn-iBN;?WtmCDKNungg4)c_RPR z);VPZ7?YPO@Xcs$k$f9c{{nj6`wV@Q_rwjRa7+^j0uRJToO}sd+%{JzgNwWZgINln zZR`q!GbBI6C;M&((qSZ@A(O9y1=std_(%SvC zaOcU$T5OBC3!E~aU%S&xC9PtM@^q0hG|cL(@VUQwGU@^GpFOtYhYn)h_!%WL@Vj9kBV!NbL1MSMGIR=I^7bs4ox+M@kl(fHA$iV zDfQmA1LX)gXhLh1yeJX|nDC2j{hFwhHTdThK>2DDzu-8SQQZj4@>`+Z;6%fZe8lrS z>UVSn=XOJ-;lE?q)yj4X@hu~52kJY>7v*%pIXrJhA13^ys2lPaXlJ&aJGah+=U*Z) zX|5M9=-CACEWQF0B8Nccg;-8r9(Y6={{4Im_E|2c8Z*Mvf5U)!dBnGz`Y{K=+3GD! zS-4i{kwV-l^aY5sCCW~`df++onREG~T$#qV9`4#32CH4IK={9JlZMG6cWySR&n<38 zFd8RW^d#-{2CH7z%4&5`ifg8>nsu5Py3lhA?#<~~o-poQ1Ja1yA`?r*MI!eq=^u=1 z`!+5nh4B2vbVm9CBI^r}K9lKyyWxJee8X)R{<}5O+%nPc8eN(O!UK@M68wOa@j3Ne z81V~`S0MZ)VbH8#nX)5@UK{Zohz#+pZWIWt5dVvuFMKU&f-HKz;yUGfGY(+sdAdLL zT$0o}si{QXnXMUpvi5gVJ)6knVOVU$NboKWfXxO;!l%>Rgu|v5W^CTa3(C!qC+zdu zQIhEER1fT@+<~M%UWI0+vQ&E^4X>Zp%vsONKN9CSV!LgxZNg$K1)v>T)A5l8oh~Yl0S=UlPBsMW6i09Qf!tB46kYhWk+(E zzh^t}>O;@^FPH&K98Yt@L9~BB!6)`-S6gOT*PCmHWU?O*6BIfYyz@T-T_!5ntC6X? zvZ4!nR(=`kHf#=y|FltydaZ(wODAJq-Dv*$!eq8L_5w@nEyMKxtmV&njnMCjFZ}%v znD0$@d2nSTu)5J*ofaF!*6FFR5~BKu_e;mztoqg=>Rzg=fd(yA8_!= z?O3zJK$c2cz~bv>ieL8{R&#Jatk`G zy;&~q{yqpiS9yafm!jGFg|tsqQ|VFEQy4Kh3!dR1STuhYPg^t%&bYpTI>)rxlOFB( zT>eP9bichcVyVm?P8yHVUpIpJ&c;ypZV(2UCh~b&AK9}vw70>v2tMp;bC8S1!S63_ z7-1MJ*)FV68ZOc0fl4smT=kw=XU;)~jW5Cazb|}T_wzJg{aNuqGuEt+wd%1j36tJG zr|YuAw00%%uX7=%v13#FPU3oc&tcx>dTO<-1YZ2qG?5GJ6sMI0U58*Ytj2(k3tNVT#N!-C7W_lJ`Z z5YPb6&~rs+J(|Fo70Xza`4oA5M0ePrHwrB9VFjV1^u%Z2ys|2MfAtLf8(0FrE>_@omnY!4+n>&5ExyuZ!?Butd}ZAW zi`}<~dSy54kHY-M`vg82L|x|Id5J*tjHyw_ah3Kt2)uEC$Ni~*X|YY@Z*NDizt1ya zQ1+ATZRdu9=CC2HQ)Gt%e=BJnA;T3Dq4Uo~x+in1x}bn7IR~qNYL{hvru)7eV&Q!i zt%+1MUTRW$n(3SGf)pcK-}{k{>JYM+)(^VCzOFxmvkcvM_?7LnrpHhWf4Y;KtLwS- z^CeJkV-LLAZ?w`($6TGd`MHvr=gO)BK0%*j*_bxIg6-PT8LQ>({L+_WoN7RtI`1+5 z_fK2%g4URPRz3t$CLP8$D{n&YEhqW9CQZSgzAKus3}K$xYM63ApT`+bR|~?z(fYrY zjOtzdjU8Nkgtc#Qoi+X3l<(UYNo(}^z=`r^xH&!m=^SxE0aO3$X23${(OMPs_j)5b z;)kXeM13f`PMwuDT3^TNfaOfgQQc3?knqCVr7DO|crDL9AK!rOx6H<|Z_|0g=tkJL z_Z{|Oz(^QkHBQtAz8zVOk9=luKbOr=Ri|93d$$P?meHnf9PBF0<~veixqtgG+W*6q zaFWG5SJeZmPwu3N;mJML;HIr}XpS4xItC~4Htlb*GUO0ASx1VxlLcq_^z091d@x(> zR*cENb^%=v8+=krrt9MyF442gw?dT16~QRRENa|s2+q6=wk;Z}`qppY*1`bZWunB| zteima)y3~K=c{dEXM!eottKgX65H_YqOyA3b$-D8GOzP&8R)i4hy8at;kiBtB|rP) zk@E?d*E}Be$E=37x@O=o#~sDE-*=?FH_jPL7Z)_f|MMai|JRVMi2B37y)9wiyFUQ; z76?AW27}X>BbYwuInEj448CtYU_hcxZGCQU`VdYzAJ@EdZ2^RNiL?nG*Q_NBrQ@m| zc}%n1moGi+#7L8Hdb5sjsdXP{ILU|K8s`Tu7VY7Mqw=7^(8sXp!b-VX`Narxux@;u z(!w(jY`1TQljaG0j{QLVGW!H;g|@2lF(I|ehRWU}lkZzedq z`H!P;tSFOx>1l%jYrJsKOHb%HWe413v=+kOSR6CV06%mZLfn4}iEl6|cN)q~+`-V5 z*5U1H$e(CiK%+(Zw8qj)T4%3>6CP#aEfk;8xx*=T?}ZmXHKPaX8aWh9Ti#L@(6hS( zuoLF0jb$+=7o~bq$a^OFq5xaX#(iUp)30g>GjresPHZT;NF0 z)4Jo9uE(&ftO$Cwu^@ciqdD0Rq(`ji<1>6~qNhHtFhs4xkFlu1Yf-!SL^}$;)h%N* zw`^4V7hs+Fj2{iTpywE^O5+4tsCY1(s3b^GrrU|^CD z&HBWH-nU0su62_Weri8s%S#JM=B+iz^aaO(W4)a+wD+^TU zy!NpAJ?`_{jZWc$6Mbaj1H7}Ph%Yftg5qX@cxJ^%!p%jj_G|e&AWv>pJAnFMxAJ2rHN2h@Mtu$N^ei|!{E;8bA z_|J4VOnkVD5l`d9LLZ>o2l5y~uY}LwE9Qh^pSu^BTQ6M*8f*u*vi{?(|0xn_AEf`C z$RYhI|1+&Q5N|1dF8?XSgQN?-wVs3YM((j{JP1y>-Ke|Tv%r_;Hjv*vKSkM>ZzF0J zX*E8mo={)iyHbNWrxx$Ajd15qnu9z$AZ`kWPEu%#7#3e{56+KoWM6wBOn z1=l|IgI2T-jlO0X+v=JDykrIP>X5*7fu?`tL0uj#0v|Xraf#4l31@v~>`z zsW!ATn4~bYZ0?Vw9l~cZ!X<0BxjQa1n#Eo3{3JZz7rYMkPDN;TbQRp3zJN==Xn(7r zzxX(pLQFTAh88=VRGLFx^n8crQTj{rYQ5pd_hfE5Y!*@t!WG~4ka59UY1`}vBRyu$ zY4jWqeV0^o;~&q^NrxG}19AVI6#i~S3=k(lmGjf=>CKXHUuq2aJ!v338q&FNF*YaP zm;;@Ul-OIvwz}b*{D4fF2+?b|BY9Jv1~=e|MQinJnx*X4YZp2nI0I{ocA&|JVyWi| zFY-!`_$bPqlV_tn-Y#f_$6R9EfmeJb4N`td#0#8o#mJkf(SbWL<3cHFvhWhcgwC+Kjk~e$}eTPn*2;^I73_HOat9KgVi9@C=W^xnSuOfK`A2RX* zqk7=B+y4`Fjx^4qKA6`?eewoDoW_b7kEC^Vh?|Lz@r{lLZaVNvdcAcBT#4=ibJmUl z;y6sUSPrX)7NAa%B@SId`-V-q0nsNsc{De`V@1@JXd1*^?`#klW_~|t??w6?&$vL; zuDHYm_WX*ypm_Lt__?i+-x$(`{9_ZDd^Ii_eNR*V`Wj^a_J@+Qr)qucDho~-;TaOQ zgPZ$449j^ydh?Bmf5b10c$bf+^@BIZ>&wYQ>3*didMM`iMT7~G4<-JY1Ab}{IE`m_YKAVK3z^77 z8!B@pd)tdloagFwqp`B&EC|l0S|#r|m%mOMhdox6qsKUF*mdxvLf5ZWmh^(scVWCN zP?9LuVD8PPkgNX}rs$54Vw`Lt=wA#j=|cO6_$0%zCWW}Xl{c&Wl|%j_7k{+v$%v16 zO<^nM=H3k3<>&I^;Xk-*{x_jrlIuzzq>M*(YK5ZKg@3%Bqc2lt!24Z7fV2&JeKmyC zC2eKmd`wEN;5$O2q{C(VmC>GS9JCJ8bGr8WY-z?YEFKsRqycau$Om0hKT6+czK}?l z$oJ0^cmuk=e&j>3;%h1-Yrh4`f!wF10<$-m1Mw>UkEZL6%kg{vB(tJYR;aA(9d)1U z&fc=g%-)-iJxfs%kyK<0$tLPP*KMUlMmC}Bz4!KepXdAf{n5+kBhT}k`<&}~ujjtc zfnO6Z3q2FZRxIM3)?-QaE;w33+mQOZ+HF@#<;O~{n845?3`~;BYgoOHRO_ZVTYKp` zj;}BMXebSLW3LPNx+5uFsc^PxZ!6ShUFCtPf3t(~h;K9WYz48(EkNsOyPE84wkH3~ zES@y}lK^M3np<^!;C5DC0=Uc2twQ;4;HR2HtwCA={adUPPkhvaP;YwQT@wj-E~6Uy z5NgCw^SuARqil1pFEGrC-~KWc_X_AkdCF)7pBDw6V-F8dT&iA!4&YIDPw@7Rr+DPT z-2z^~`%WJhLhtGJEjn=L9`6M-6GIy_`kMb$Z^Oz5sQSdZ!*jo-;K64F^d@h+U6tU? zCHRN1hQ`TdLi4c>Fm~Ly&*lB2rCRF`H;d`HXUBnCu$Q=Z3io!qER=U$|LG@9t>2VZ zzuRl{d$L|GDLsXuRYc+L#Ag~yuhd$(bZFxbyw{smdueLtnEDZqD` zfS%*f*g6E<6D|KvvUsAA-L_cjs>QQcG|?effcNO$Pamblpyk#G_-JrrGjN%$-tS^5 z+RMv{f>P;U@#ft4eFg_&uc%%XOM`nBFz}l1IN2(VEZ_}gmzl9fudZ9^V}orBePQ7! z#r?oV&E{SmU(K|M6z~DzN6&%hPk)63^dN5UvOd@qn z@Px9;t!vf*Z|#@8 zyRCz%e1vb@8TLKY(FD)%hAU2bjL%vLy=l=?)8hMZqt%BsWJtm}L5ieo54EN`G=oHL z#QCi+EB#9F56EJ+h;@}N5HctUuO^To(8EFd_-l_~sdO(eh!&goz`X~B@{FSDJ}R2B zn`0LxaEOjQY(F|+FWmgP@&)KCrAg(p&((NshL`?z>ofr$r#MwKe&3c=esX!>ev7}x z=a?6I_P`ln!wEG+VcJ#U-6w$N>>e-kI?N`ewHKYJtOLI(q)G`B-jtEMu-(WXbfT^Y zx89vBYT4mAq4ntu+#uuvwBbdpxW3Q<-+LcWdJ-HwDn;ctd*egt;v#?1^UHFs6OO&g zTMbRFzqGd)yrTl%GoJ}eQ+h~_yA-YFO+4@7!&onwP<1uU&7J{I@Q|MdL=dtCwQe#* zchL`|v=(!-zp>-)eCC=RH+e2eFunWaRhghfmSU-s-zAC|@Ph(t zE1~r@mNZ02{ zVg{8(w)ahg4uVcjrs?07@n^HS@{)>M8JU^b8()~wFQhOX^RFZOBg{J?i`8ZnU1jl{ zLtY=?oF*6Lhx}#qNljj`d%sHzU8-<|@Vk`dwW@<_t*MmxU8tNhD1Q=o=$bdOWIb(9 zS+c7758Pf5&)T@@cC906&GiQ==cOgzZIlO5o-jq_g_ox%DGp{W$r-w2E;5ccQh9oX zW$;%@Hz7lKCyRz{5nrdh`d|M0&`qy$tEFj7s9@es?5@0~tiSo5fbXZip`jFU(O3Be zPTLblbkLWf(}c=^u;v1q$Xj{A;)P=PiagCua}Fro44!&Ih0d;LWVFT>_k{v^mA3g( zN5yr@$H;z1aSnFaO@aJFAnRph+8|QL_TSW8_P!mdVGZ zfCzB4VwIaAvq-_(2zWAfE74Rad{@2rqpNPgC1eDY-?}TQEJ*bpJO^~a@+7qwy@G;JYU!z&tmDnUsGV^e` zkvNMk-sE>xG7Q_p+46hEbPi~LpH_d^%Eeu8@SxTavU`yX{!qRw-(71P?4bGys7+XZBT1_iE+`jm4yla#(b7Kld65akNXODQBKt( zd}iBFZa*=~zza>=&8_snG-=)s=F3E+Rrt`^l zTk$N!P0|}*6?iXEzh@b;Z{CJplnbFQbNlg|Ru%O^cLobr`&I1r<-A-lTF~1&lD>P~ z^`0GZ3fFFL{+IyHTVF}MKk-#7b9*X>l#C|)u-EAtLUb!7moMH){Z4e2o{tLXD=uu{ zH8*m!d<7Qp^%}`EIDE03-RcP2j=m@{SE9VrPX5xmG3Qot?q(WrK$?29v* zux31G*=~M+VmdW=*VZx~D>+5xD;+}xn;jCygJ3@JxS;fVc7td7KBR%a^3nUrc;=u` zwn%<)zzEIrTqK^35f!~^@wNGr#L1Uw@=18!JuA$^V6igp>kbfGrH2gxH;iS z5^YTl;%$A(aaO@Y6n&*F6~39tFUD0To>88DAE-}zdbyA-p3TJdQIc&%>J;s!pY@I6 z!+ZaTw)X6!KE&z?AK+BlsbcDYRDN*$wS_8qxfYFD~&`id5sXB4d(xLMXoElGFl zKBRZkUeewsuVv(q&JzDEi|vf@s#~-YO=_FWhlYNj>iSJ_-$)icH{GWZNt@;5$kRAK zr5cB|$e=b4Vno`2@$~YLo4|Paza>^Q-snJ){lfU`%G4CpIOBa}_J&+-?9}U+!wjw2 z$!f=6#bMus!FNT8J;8#r(d)L3(y$r95n(Lb=B}agU?L zOqa!i`%T`%HC}FzN4uBif?v1G?lPX-wpTZex>e=dJ3_49l2_FPWp!&J#Ac0D&6mLb zCUdLwlieKuW3Oq2^@abs3pJ+uV@v2fHAI$fl4kk5YCDb@^}cyqc=oMc{kE!aOCXi%@I*X}F{5;B$b(MOiu*<4#q7ewDjV1k(Gf z#rVmJb(oJp@0wR9@-4s7!rP{Txli=s)!R#&Nw^otGwTh9cKA%Iw**l29tF7I4r_MD z*|&ol%)ox_xP`Il_XVYZVPf0B2xWU(OIBdy;WMH}93X0^_k1BxA%$!i@V zE%ohc@2J22S%Np0xoUaMHS9NlJ`g9ml+@czbur(pZpGgIeW`=tU@p#b6TUBd%ixN) zdH(pWgkIND8v2O7(^9#@n@u!$Wm)lQ{|0I_FNy89SyB4&s^s8Pk1#ITc1AtwZ_}Sf zwb>^3;NIV=cJ?&x*kC!f(jhANF@hr_|B6`W1f2a)Lb?RTvtzJ_`7+TL#YahO56fjUQxdGn?CZ<@k3pTL2XzVnBXVO7{1alnT5*sLI% zOB)6Hg(m%oGWIQ$Kanf;8o2x5 zxJXO&(SeQT`^h~R^~+d?WQ>h}nE%nw6o2Dn#{k;2u#%~MYL)*jyG<%hkADObIDmTj z?xf*kqIgWrTv^<;7dM+ykkRAhbvluOO+2B;Pb1d38l760Bd{JKx}h~=4au+mP%&X- zB!%A|MCWIv)3L(t;)iQp!h6fi+>%tV)mbrTSxs+XFWKh%lY$37K?BT|G-`Q|cnUVqYKi|VoG;z%pF zjIulIphcfn%DhXW_(_gV;7UrUy^y7e!c09(=bd2i-a^F^{Y`YuY57>wBUz4>NtGZ$~FF>4!5#yT1a4l-H8Iu8B+I zgJk$pAL-j=S4viL1l0(6q$x}t*nT^=ur4A?>DE|KYYrs;y%cmra@L0ZTRHNR_xyNHdjr&MjO0qQ*+x! zbbWeD9_Ct@cVhqWz}Dw<@D?!eO0w^|BSP^dYML)jUaK%b^3+1&b-NVqS8NJ_XQ|<{ zII6ev3V1hIj$XB2`}FSwTb0|(E#LH&i9-gk!iJt!W#viFD-@D+ht5~8Bo#l{mf4N@ zb$^FnIffg>`j zU;}80&TJlAEt^eQLKu%6TqDzH*yy+{`YVecz5FLCx&M{_`@A)r`Dl+wa~w=XD%_H< zf36YlLh@1farw-@pI0%)BW5KQr2YldNuIkQd^eugz>EB;(@=AFvC7;#qL8`{g<~|$ zy&kXM>P(79%>I3h$1PWg{+uF96kp9&lb(vdEj;D9fRFSxVjlzZEm&61q+)=nD;Ns(OMSKfKDHcZU$x zMt=FW8vCN{kZ-H!h-J%rXz@Ll@WE0~2tPdGh$o+G^pxgK`y;?Z0vsqm;oeKpErxwA zjAj3SvHUBkEzjJyUQVrcPp&+8n-(>1NZ0R1k!_ip&}9|HIJfn(a_KAbOVn*D7;#-> z*6%{;MUwd3vsCTg@`C#D9<}&XJ@N*h7$y5I6$77-p_*6Usaj;zB?6^w?7Oj}cYC{Y z0vd$AJf1^74Ro_w@3ORO)-qZVxQf9?e7qgkv98CICgR{CFSA9v~Y<)^j7V#+XIoz;#9ozf+|6aJPROxw>gOmGIw0s^)5ErV3oYv~q8$H#vJeIcb7uns(g6vuz%fQW_$q z@`A0h@|u2>7cpjW0tSwD#LPwW20cLKw=qA`>(7C zeqv}>Rd=}7esp4E3Pbzz+hwJB@cmX2INV46G%^ z-I#k;I{NU*H59)sL3GSt9=fIjo=;yZc4lRZ&^`NDIzQsN$Mf=xt~0eYOPH~)0y;@L zyeq2j_CF)O`Gj%%V>^(C9MP<RYQ*mh2vkFyYubtR|T{LYA}J5mrSQ? zXXmo7_b&-<5U3loZTeN{LwmW@-;VJ*-k~+Oc%1Qt-)fitEvA-)JyzWR8mLKL?3yaC zHh3&TJN(BlMmbS-9v2gOm7$qL@qm?L#f9<=KPLv?-6_CL+MPBl#dVJg(#|mt*0;D& z9!B+%-|7u`?K;`N?|gzTr}1SA!ef1H4Bbnm;!AMtxtlE*?hxLc`&Mzcj6Eo{I$2E` zVexmZ)^34UoQXN?t$j>xFJ~n#A$T4B{A(8jlezmi+`G2kfxxwtc;KJJI%&W_)azjI z`Dvc~aD>HADi5-}(i?cE`U)R?;N|fCFT~L|XXw$NQjDGyz)4c;p>QAkL(m8`{b)Oa z2ZO)aC82YrlgkOlIKU_Sq|^Cw4DAKYUyIHOjz$h%%!^VM4HB7;Y7y3&@wxDa zf}&`@!d;Fq!US*XGfRvvtqYpC)(tn`@jS!zz8tt5Jy zl@1K@cn9rP#Qd*v8==-Y6nngM$tl5DdkJpUuburZfH?rd5xg_2FFy?nru>7J8>mg? zTlm=x2O9n0ik#8)JC%98jI4)kW0%WqXi{`GfAg{7ec}eW{=t4)ryesjr&g|%56PO2 zI=mu*?~L(&&2iF*%~yZMejtrkL8+A z3z5g5wmQ~a4(N78EMHtzKo={{SNd2lx_d7zzub`aKQAYzkMdCbN^z~;D-9?s-k8k5 zJuy7xC=Z*ED4~xG*S)dKwp$#ya7*cSp|mQrD?P;?6xnOr zG5m(H-0h~;szV-gYpS(gr$m;9ALx*Na>@B368I$FtWKk3uO8xM*C!0_OR2b|GxaLE9+(Aq(s$4*9vlkyki$0jg5EkU31^wRltXb)1F z&FxD^g2$woay>b|`CIN&{ix{n-#&N?!+VHF5;WLHZ-pzsc*DJY-pbiR@iDZ& zguc`wzof`^Q`ZU94?%Zw*$W34K1E{Az(KDJoARdwyqh*JD33X5Z()MR#(C{$C@uAv z09WdY>yX8W9B6)2wQ*op6 zxEG5J$d@#`6I?0&ei^)xDu@ zPSd5nuUO?+(N{85?Te9X?{ckr&N}#%l-8QP`j!E#hi>jj&~irGIc)@dxWXX@zVpQs ztb75Zm(`rA{6)04YtNHgZZQ__uV;=gyTsD_@H*PvRpkt1R|0(@q1Tm;)NIBNv*Zog zzk^h-%AqHR^5ylJ4DDyp(o4o%V)!>P?$`rloLb7d#FK>I<2>Xm8u-c^bEfUh}MjZ+0GFkoYVM}J!vU3UkyXq!=j-5#0QNs1B zEKqp^rGY8*K$--0lV|+|0bQYTAaD3q`qSY7IQ1#xdS&5|YBcJ}C`MMGdPQJPDXw=Y zO`Z8qObv^nh*F6HwIhN&CbIG;gX;{|zC8XVfR)hX6P3469#7?0a!2Sef)8Q5&R9P2 zhiv3BThtlcpRxlv03%`E7J0H`ULEfv(8IV#^RJwp`+q%^&hEG3sshrSMiIic&c}9bzZcx7a`Blk+Yk_ z%nQ&Ju5|BS0`slr{G%H7<{J>f zXKbac`QG5l`|No7gMXBKZHH{S^B+&%=g#A5?c!^fE2oq%Zmp+2apfL`|KkhID^tm! zMXb5BqSdR9u$S#u>C<>URq8fY7V0^kS~%9==J~g1-C|bCg-_mcnQw{WLepH_TN0;L z>h=onS)JdVzsIL;tuYP_m@0KoKYp?1lZ?&C7JphvnQ@{P?oV^z^aD8*p1+ZLU&Gz2 z4|e^^#@eO#X3jyT4F%~wi)t4%z*c#O=< zK2BNv8_NQ1AM?RY`Lwl@i}27IIK%ToQT@u;#iI7UNyb|D4|3N4d#Y390$*I8m#59E zLa`+y=Nag^VO#)YQOuf zcGjf`-H}$>u72le2KDFa^@6#Awvh&O+T%5^bX~ErBlfEc_|9cEIEyi9r;T;ladRrA{2QM_J1D^jD+AMG1{0QdTIKr&ix#BS2alFdE8ja&?cb`+yhD+2Mi?dU*Wxk5VC^vKo zz3Nz#eJ9rC`)lk8*Drj>zm(-?4B+zP%IJ%}E~3u0M{tW2C;dx8J=1UUZSwBFLgKTf zm+f@&$yqF#b{@?yV^U=F-nLx)a5DYou(mvzM!mYvL5`j6^Mx2bUn%SzF1m-xhgjkFD{gi;M0Vdx225j5!vU zcAl2;3yB*nozInimEndsqvQ1ZA)?ZjApY1WRJ5s`Pj{=ehPOAFLiH;RM1P0NNqhQ9 zr!u!RtBiwG@$E{!ogaGx44BGgI?bg~1y=C6TR*(!W%d`c-5Pe-QAdv$@1omIwc#7y zVYKCVQ$in$57qMMi#nHK^oN1k&|-$=_lRFB9Ib3+mBEI@9LQF)BRK!#rP8lVVROgx%{Zsv&ZX!Ls{w+meL*Vu?s1bX! zS-!h8bITmMwy2xvjr(1HEe@vVVf*=Sx0ckT<#sN4FP0t;a~7CyqoXwWZ<_#7I<7O{ zb?wj7LtY511pzBqU;akJ*!fryN7^%E3m0uzkOJ535Vn=QOxIZzS*?%v$Sc~+Ex%IQ zzWT^jCxyyf?+K#u&N!|%Z!M99xddyFE20NY<6$owsWI^Qki|mH zdG!9GRCs?oiY^>4H#8|mfz2HZQ7()Ntiid^4+>G(`Y!U~=dK*S+m$?*7ZKO+)m!iL zo;v>9Y_p^^wM<{nz-xJ8&VO=~-yL3%U4tL~t|K?&`MQyb2Px#T1F710UVklh*n60O zC!+7uGZeMC3Hwd%Lz8~hmi;@9q;74$%hv}x&|{~$T(5LlapcSfetWVE`t=p%ah%N+ z+w7zQYZ~*U9%<70W?r*n;gwV&($fsw{*t18UgvIYXVO@=%~+Sl{Kn>?L|xEVYn*fb z0QZ;AXhg|%tW9&DCve@Lhqt&O?_iJUhS??AuS_UE?Ae;W9x*7rcLpgA3AwzIi-xbK z3+tq4^f`fkzs#X6c20U+{l$dO6DKNF;x)h5(e$PJNO2U#P7&z`D5rL!EK=fyoOXl7 z<Gx6+y}~{bhs1}#5~j`MRuuJam0Z+$ttc{affq197K$$*AGFU$=c@RMdQ%S4 znw|$qOy4Ye*)0?v{x~UrnKZ zdp1#Mu(i?%CO%&-DYubQpKR2?(-NPBoYk6ABJWA`D{3r2^(OT^Sdpfl8BdBEfmt%R zXczkY#Rq)8C>g&q2bVoaCGVBy{0~p7&!g-V7N`+c+`o46Qt6#knTm`E)Oz*_XAkE+ zw6}({&e#iUdw803=~l=D|1+?ZXSRDnd1W=8Uaz$2@Wsl!b~&EM&N|BKGZkk+L&(Q+ zI2SRm@Y(;s51SLo?&f1d{+LULtnbM-_xDlfx!yFnkQb-@87s3>h@ev#b0)TyDMt!l zNG-Bgm(w)K=vzjo6VZmIRY zTJDg9RumnjPA_A;B{U1wi1OzRO;&Kt=xs9cehc1pco1a|+Ai{4okm4Uj3#JDf;ORN zH%(dkWd-Wn(1m7gJIS+qHx%G2`Ec)D!>jLEf}S2QoRynxI`Om=Argc5AwLhC&bSh3A8HsnH)JFmouvt=ie(c zxW=P;a@F-b^k0Sca`VBX{5sD@-ta+qM|$^VXnWb?Z(Z3eUw@1@DMfuA^ciDLq-)kx z+PL*OuDPOFX^S=Wk6S2$`VL^|EdlMsPE#lFy7`fcpGnPSy(#tC*IdN856jVx6*f9J zfuWy;(xWxseikJgj*+wft!HpMg;d{Zsa&S19_uzrJkF(Lb zNDdx3g8FxShU>daz*;J^A&OPM$W2cr^p=@;a9-M_ zlp=xW-27-KTIgAb;V%?+8qg3X>X8}*1bBJ(FGjWhwBS|O7n0JT7uE@Gx48y^d*qQb z8sSKuh+dcXBnx&%IK08u=blA%yv}Htf5%}4(%yY~1atc=^ zG^e>^?L{N;$o7=KKWfpg!}n9Z9{w!g^|-mem)!6{(h8^iX0PMB*?r|Z?duWjVc+Q_ zLl=m=PAACK%}%c}G!MfcYqvJ;5`Po3X|xf*z;{(660f0*ktG{rt~IPB!4vS_8c_tE zNa@#X8_(L-%sbz8$-rd3H`@!mV9zHe3VNN{7UC_5mNgY8T3gP$){ zKXIiWJ-FVaapZjQoCdw8Jc0B$bK8Iy6!4#@>yb)N0l&tveaG$;QuQIDrgZQwDg8eE zmX!(5t*sA>6H)IR^=XytWpTSp0{>oQHt5AEA!P)#fWj0}yH_@yf0jX>vAz;>W$}?y z26v*qPunm&4pk4iZovZZ2E!xEyRLUdtQk!`3V-Hf&ey3~*L^&#QUoC%fKRek9!5ZK zQT;0Mir-Z|$ytB=2$_W!{0m{NwHi@5#_!0YyxhMd!RHYA*@EjzpSKmZoPYIX>9Av; zh~Ar_^e`7bhQoZh00QbXdUW31}GZHDZlidv22e#~%YP5VWUeQ>u9ELZ>?=^_LVK~& zjPPLw_<;ZIaf9!yKz)fl`Lw#!b~WyCo`h%QJ+^a+EPH|vHD_;M zLNnV9hZk8u4xM5t*_^wh<{vn|0eaSz|GeJDRP~~GY}Vk8PCev{r^~2~ zcRDm&OD|Wqa4`jY1@&#XPF9=eXe#ZJacrdMbk5eyDEU{wt8{`!>mv**PS(A7-^^81YD=4v;ZY1P+3!nTD{SYmS#oRaG5fx`L zv>JTUUf}IQsjk~^>PCy_g$6L*99~JtxwJQj9n4RkzB8_$Ta2EAOkld=O7y~LQkhD% zT0b~n#T69LG*e9O6{dTS?1pjp%a*5a%BqtJBlEDs_z#$_SMdC|o@6*$Efes46l<0w zNqWAQ$ph{)010pC-k5@EP9FDyEKSjwToQNV7WBVB{yPc)eu9 zm&kKU82!JLFlRh!CCe83E?>nrmmluzCZ$h{hL-~dPE>Pb(KJ~}7myLYQZ+`wBcIA% z$7>RJRONUIn@DAH&4gO;%)S$*}L+2`nxHbpOh+u z+zWfOe{wcfI5q*_+9=(s< ziHBQbDPsIO0=62ZzdRw8QHBJ}hSLCS)t9o2^pKA+#^vvx~*kPG4Gw3&k&%XNGsB;&z?czuyrx?}WKD6%I`< zFoo+5uSW0#O8aT{YpYmt0yQ6)N1j@;pvn(u;D}jDtEw!G;A?c~2$j94oP}bB;PH&7 zheTG5F>;{svfd03P6lP+AapEk|^@L8DXW%YFBnS-h+2d1L|9dC6}& zutAs5`6jXorO^a379F}s-uyaSU|k4)6*yrsFv5VZ;0cjud0$Wsf`;b(FWW0G$o-y& z!#7Dne{%m%SrYzRX>AR2NHyDamFQ^(@0*Hy6qaEPRqb&|)gdYe@Gf2~Dn;cLs!vtF z&&PQq&>TWs_@MkSK`S!6DIqTvc?Mk&|4mvi;Y(Ou1M(AzEW|`l!@Jy&xK2jK$dCMN zO_gy0*J#X{BJfn#sd}B`;O5sFGBn;@wzX*N+f*t~fn1#%7VatLj=jKUQhl+qa&NA^ zE=kspjiA7DGh{35o6@L6WggTmMjo=-EM`{eN0-yi8aEoekO8+}i`qRl7-t-lX}QfN z&Yv^KxPr6cXLx3Di!&?9InGN|EdEujZI63VZzb}BhzYnqFu(aXIS&Pw&*eYY2C$E7 zs`t#8nzCf$#vI$HuFTtNsWb+6putNuZnwjVB7f#*w}ad1aWQ*+`kz{Sx$!!=`H>Tk z8MT=9_Prv{w@u(=m?ed{T>U1{CxL=2_&`^?8H&oEYnG?cq%5*Jx~j-RcIr6F(D z(70RYWQ(3BSbfIO=%w<=<0E8qz?zmdnnK4pCj?yMoC*9 zbzzBIzhMiVd{u`Y_wo?y&VEk8>v){&Lz*$D2zB3_XdL*`h25R==@q}l$hU`f)Ahr3 zFm`;0fbSav`X1u#Rb~s<*+Ja)Pf=Na`*&*M_kmw)Tl!-?nU)Sk9&#}Kev%z#7a(Vx;AD1qJLDqSWQv*?hTo2 z_gGum#gV^c9;a}RdA#>d3}aj}a@KKL$F{Wg)@a^p+ng8CS&^RYtXq3*;&QLY^WYX0 zy|E@-rsWbbx#vJR;Akuj#rMTi6Vg>Jkb_@q^Y6cCnwA#EjV^_Aw>sI$dn(kWK5gD` zx6z^W_g_hFJ;Yu=S^o?TST<0WI`Urn&fY58JUC152e|2l2CUZ_HY`R@)5ns{jGk1t z(P3`f=?oo&J|22#q-Cz(8gIFj?|pR*4ey*47V-Qp|DKEFYR^1zGAxtiGfm0iJ*}H6EdIa&* z>fvJG;BfqDr}qgc%f{6>foqU~=f0tLO6z_%tD^t*$oC~e#ffG_yVg`eUo4|t_e}XP zU{*@!i%ThOhBvi8{8A==C}8@}8^e9_+@Sjoo_uuqE*_OVQO&Qs-rQfNy;v$xGvqn$ z09Wb#9P3d7=OlLJg%wtEuG=n*`8a(a;bTIq3F7cxL(p5 zIc_C#he?6@%-mGeOG=9GNkgh@K+VZ@yo|P2`N@2G2YG$hXhPoa;$K1-qxWe`_uIyX za(6BBbnMMF3r00OWg0cwT;!9pa+n;aa#*X8j5(7H=Tt!*2Fg_-hlP9pGTMsYyF_ZI zWjv+z7_s^NZ*62nC$pVrJ&yN$CyEAD=ENljIIzPp9-l9mbEY@q;!|zRKx+^BRJR!= z{s@$-Uqxu!CT^gTX~Q+toJ=|D$7>cBGlL`Q8rq9Ao@Tq%yF!JrWWBwQ44brB9_+nG ze0D!Czq@+y>H`l%wc*L!#@5=bTB`*0x2wXp4;JA~)obd7>ObOkZ%dO)kz2sjd!n{o zK^kNez&#h8v|yk8v%HKoCyY(p^xrCe;JMc+tzUZedb(b=41Y+#5ZOHOJgIs0ZD4Es zIJ=fZ9+wmWeH&oT+6$M|raY%X4c+rlTYXFSKKOon8C4!RKm^}xBTDa>!&rZMR6f7y z+;cO{uZOd?ZQN)`!@azD$VEBNxfwU}{zbzJUZR`+6*P#oLOH^eUte+crh(cYTp`3|vSF{?=T2ZE-pj(OImo*_9H;z9zd-_bGZt z8U1vVl9X1r0>_Msr)S9Q%4bE$H*=O!z^d!OyJf6!XYI->RQFvRVXX2)r$kj>ta+bFWmE_#pj2618ldDc{u}!A;w~$C zR$+Bb$#%o2)WqAg@cCd7wOzb;jqKf8AXhKBLtj4OO#uQxCY=X82l3t%=)Nfsu0l@-5awT{rQ zb?r|3&Al|?^9uSC-kSI9&ynNvJ@(Gn#SeEMqKl6XiKXd#7`17h*)#%t{f%BGU6wm%Kd@jZ z>9uHl`#90^-y!ILKyBI1R64aSM*BInsJ?I2XHmg7o;M|D)A+MJx!?7CcPgxU`I zsC=-*yb*et;@{pBO;)bvr(Pxu2kL5&_C?pTFI=v&QmnFT%QZfDJY-?sH@KtK*-^l;2EfjsdW^(V0Lv(vd7Xo+SvuauNK-!EH%UVEh z32>r!@w|rkmAGI0j*|pU!`rGBG!}iSNB1{Al1l&dN%1i|jor(tXX8sda-?k=w5IQ)XxJdIsc->y2&obody1% zyYAm4MqMbV|D3v9UaX!;f7708U;4b2OYK^*&4D247vW$&_|Jg`|F$vYvi$TwV*me5 zPg79m>^j?8UitG1b5V)US$W2IIQ_|V){ z>AKLI@|e&M^3#h1`r_zkwo4tzP9IM*`bjqiXEy%bbDOC9t}H+6VWk7NwECsa36Dh; z6qbl#+ddlSTnllz-2D9hZXd$jh>08W=~qkFQ#yrit!YJ1Qu4{J=l@9Hr34R~;bo#k z#o#jnuMsPwtC92MzwG>|v#j;uB>kJ;Rq+h>+E{?z%qaq$bzQ~}sz&HFXrwnHcVsgj zFv*Jj$~VQn#ZgpqN{F|b=NnZ5P;36QZDM(HuQ!M*tY(4tq%)3Ql%5^Mm8M_8^U@AH zykKV*`NL9xn_MGfwFHMSbhYY9jMv6Y?e`xmjXPvc8ZR#PlCX~SpGzsd(6)vO^NekO z&f{~P33^O~d;C!tN>AF zy~auxw3NP9OuX>D&lc?)k-${NG9MkPrV1#XB>{f24r(K?bl2^|?w5y}pHBzRRNn zGti?MO83ear_&id!>T@2KPj$N+En$T!bosEqZSFhB-Z=c@cfzU8T_l()KGJ9-dIe) zRfQ>{Q>Bu+^P@`~vVNiF`7>7o7Ln>@#T`#~6-`-cmzDxvQ1!vpZiXst$@tcQpm`~M zR7>veHk?l{u1(PQ*jvMjCohbZPjKJ*d7}W2TiHNq0BE~g^m_Tl=P^zrv~& zkuQIbGBY?|$lDKW4Zd+{U?xQ#krETXPY zgH{mATm8&y^1-Kfcw5V11pQB2aX%0=xTbIizvpYIcm^l)Cl5byRGXRGf>R!@BzOc` z93bV)@l(jfbCuHf#sjOS1ij4jwoYV)EkU(cYS#rPFA7*j)`APT4c> zh~uXMsfTqT3;zR)&2lAoD$ccx8F;RpUc6TvZ4=4R^Q>ygdyK76zN(rwpYGf_s%6?2 zm*;Ohk{AzdT~T}9rg-({6MfrrUFkLG zdN25dAq;$>uIJ|wv@tiEy2}V|7t0lW>I!I4f;N-D5A99PU$*PGi07~V$>mB`CHPS; z#%DzT9wsXd1>c!+t5CFhAI?(^&$!kfLGZ5@p367kC>8C4^Eezz@P#vPX_o&V0evk- zIc+q6m$Lf$zEq*Wa(VUbbi?brAyE&a+0^RFo21xoDQ3cx2=oxNz++Zx3C@=A3j}{F z6~AvRihDOk7uE~@Y^rs+GeykG>LiS-Wp(#@_a$%%er6ay#lGDw;`}7E2`L?C^W8$WMVC7t1#~(7&1$84;a}@= zblrS<_uIZ)to>J|>nP=+gFx>o+|>Srr}L(NlWEhx4=KPEJeS>$Zgt)(fB3bd4l#Bn zxJCCK11+@jgTglD@kF11IO(|JIenehz}Q}7y(k=YT-w(4A;tTB+KgxDW8Szh8QN;C z;#z32jihwM=TSo$^CYk~5iV4I8d7pu6=E2bvqmAQ)Oz zD(?r*F>2;%%#Vi0$(QdIlJc=hH7-h(U;HT=&fq)(r&uzDa`87rTHP)D;J=ju8co2z z9fMvqK4&*1%%4$Jw$#(zYjKy=ccf9~um*o3KX)u(@w2EycC@b}fCD_w`6QmLUZ%7G zV~*&@*)q_B1&w00OVbCZ-zxJkp7jWn@bUDZou7cOwD7QlUpm`-UniT@jO2SA<}z@P zs;3S6rk~2KJkkSswO-Sh> z&1s>unztL8!J6O`Em_FhX8mY;Ob7a^uM`%)pX1K`*Y&XIguFZFi$x|=`*?DUhRWsiBQCX4(ZON*R{Tp2sVXdA4EBleklzt71WsIBA6SB~&O!@q( zfX=8T;&+@7m}j}Lf`jq_ta=?-OedliWo9X7)G*QarpiE| zgOOuxCZ%ugZycI(y5j=ATfDEKIQ7jbcY=q&pPLDJilMYi)&FXl(3&PZ#2dflCN|tV8pP z4L4dEZEUfp>*0OS@Y^({>-e;X@=*fZC2my7%kev!s@k_?l}%PU>EL;zL&-BD;*BRf z&^x+Vy#xO=Dl=*(S?ODavDJ2WmZOiY5_SGM=p$yi@g3~*sqn~WQ(^wsSVJ~3UP2cU z#*92MQ2Z%s$E%vH*TA_F`3Ln$IY#Im0Y489eUIOci;}Jac8tDcqfA3O@Fk1j@wBp4%IU~XOr;<3c?8|Y8$T8{;k5`kh^01^7e>FS{xNPj zFQ7};jxn-M`j-s3DBA0jBL{z-c_Psq21y{$of2t^~3YS)fw3jffse)F2NsioWP!T?}QGH zBxnht`X}v05eeNObNAj7$TJD~oKW0&XY>fdIur0tfUoILJ1=mK0Zy+-vRf~eB`AEx zLy`|vRw>uEmzGQrn&2q3DZ$%{3yHXH_(G)zYaj(Z&5j;9D3-PbdF2LIYjvx85(kxIa2i{GD^l6 zw8;8ZS@lJWqBw^lE?HB&)bqVV&XXgBUBm9Y@ErD!X?K#s zgVM$AmJ2AYfCmqBS}5+8S;=lm`{kRi%kZ4%V(~7h4NpBVS!NA7WEj2yl##ZQJItNK zt`CapRdz0?+}%&4?W?NXt;HPv>UoO~PR!;yTiVIk9+5mOyA5|}7%H@oV9LUN&m+?8 zsq~6ys(sPJRPS~4^*8Bz_dLIe{mTymn$UviJ)+9aqRAZ!;tbNazxZ`pf4S~=FPbsg zi9gT4ev-={P*{3#)5~WoXCC<{GAGzkT-JB-?7#I?($Kx5KR4sq@k_XQ#T^{bWHME1 zYtpSJPw44CC%wjx3);r*z@WV^q;tzZTH-Y?{?Wa^nDh1k-B~`ET7J)CZo(Nsg(lb- zpTk#^wfB87XI3@&^WZcZQr}t>KI$pwry@VsU(qk0cp8>{h6et%r^}HOsMf^gtgm=T zm{aNF;%IL1$`vtV0;zk7FdOM(E%V}h=`$~K>Oh%4toe4o?X)LyD_6Yon{V}F_HSDr1I_O}*A33Hw_Vo2~qH@u@DRRa(%3U*EU_NNc|FLx40X=>1zobcp$f^(` z6s4$po@|$uiWQtn z+Qa7_NCz6Pi(h6Mc54=lA^p~2iYM)7*bz-QIqI{hr=@I_(ceOx;$a}Z?ry+N9-oNEgUh+z)_&ko>5nwGsJF0_VrN+)cb@NN8I9urBcQUQ8XY~B_WBAu?C^~O;;jaee zvX@irq0a1HU{_1e&L>u2Wa}8d=65~py*?S18QROeTJGT$6F*448S6B)nR#@$7zehy z?Sx96p-f}MkN%fMa50lJj~4TVt9){T3-7}v*BRJxWC;f9Eu&t2z;bP~u`_+& zI_b(G7&{}2U;XLNKQ0~*Imu6e)>n!*b_J?=*qG;u8$$QPP^&0r;ZaA8NZyBW*43=r zw2l1l@@CMw&v7<1S4+KY0wD0{YTq^RMSHe7dTB$Xx&p8;H3oa11~Tm%Xlp zH44?b2g_0yA**_0MRSm5HXU zqB)J*RokL5I3=4yhdoEI;Nxc8SdoX*6TI-W$$!nbxcSExOB{5y=MU| znz|mS{#dJpdNTDUCZD?ubPw?M{#AaAsBcLFfTEH0d}G>Gu<;b{W+d zjM}CJ{=xOs|2(#WuCyOtPDx?r-to9`rozJP`f2!J>PsIqcXyT_Mb^N$VMWr+-Insr zY2DGVOE126dM1i%U--Kl1E!pU2AiC@Tb~th=T|9?yOYb0y6%%q!{fQOqmDecT_-H_ z(UNJ6RJupy#jE%1TEEl0udBH{zV&=%?E4f9F7&3cIkA>)-a-13iBwbmDq#pb9Da>( zvppMJ+7pUS$1&S>U!lF@bu`*B4tsX^4bA9raE(ux;9|9rtJz1yJqtM>s5zo?T1=Mp~PB4V<6OW)p#RU``I%!M<9OxAfH7BNF ziL)`bPb{ZeeuDbf7D_EeljMuRU^WeQfzK4WxqcSwH^L) z>&aiU)m|TSW*3ad>>1fIjT744&cMism{ja*8%ut^?Tk+w=LcKb2hsFFL0*4{V!H$LCJrcxzFOAaQB5J z7rbk=zys$kDupdochES=8)9_hLG_x#-hNVW>fbO(tqj1Go?(2@s>59OKpKeo(Mq@t zGxcoHFm?cD-#O3UZgeDmUVv_6pGfPE>0{^;Q?8y#@r zs@GWDr4Jt6_k+)NozDLJ9w)F7GM>}fWmk_N^*Pk0e}kxw&LG!)iy1eP+0m3%_;GOs z^Xp@){<<8^RN!8;z*;kT^j0P#9|-)=Q)^l)2_ zz##i<7bGnSK^xY=zONVH*!Ro$c)>_1Y2{1ac-s)6KZGVBTrI%Ae?oD5o`Fm~Bh#7# z={ZQ+VZyGS-AsKrM)WCL6|JDCp&bwWFy5~(Y*}yvx-2f&XixXPopG&qd!b)&QPUtO z`1p_grt>`Ojts;I!*y6<@Lki-cisN6(o54-(uh(?D=XPyOFoVwc^J^Y{nh=Zs^`v){Nt23R67xo8T};+602S>#KGXTFKA< zP6E=oO08F8_57a+NO~Qus>)&GOo{sD5aec@=0zj7BmIu}J$`lZE+kzG17ZpUZ@}QG zU19$CL+srH9Z6SerqNH-LvV1}BNo&>Q0RT=*zNsf>x&+Oqef z>T5VC`2G;WiGMt-zk^KojPklKNMlCfL8wOXz~zIu|B(?!(DUZo=j4eRVZLMc&Ef5?mY;j`(fn=N7gLlk?dG^{w_N)`f5pWm{&i>&SXP;+_-`c98mPq$Oq>%$At(?nOJk(do-wA)kga&Rf zZvbS)2MGMZ)Ju^HVG6IfQGqqyLzw7$Pf3D% zXKk?OE8sPwo`Sgiv9w=fL&EbAIO0$T+Xe^Y0`rmbnO}x7^*19=1#a}cmhjoclk(Sh zb};z&!W)KAAjC}PZQce!_jwWPY6AElXZLCTys%yC<@(hEh~#T z4lTr#xrLZCWi1*k-XU@TcFHMOWExEP-DR8TJ^B3lY9E(}3e`0yFU#UwrXsBol7{06 zKeT~7DUv1vr-%+f{zUMy^1XE%S!i>@EWFpX2=|t&NcxG>oPepJo!a6OD-KgGX;pmBRnjW0`@-4Zr9b=d-`PKd8EG49k$(W^k~tdOVTwMDb=H|>42@Xa#vh>xLg zLs!CrixB-M1PXMQz=EtEIK$B&_CE@y`EJ1}6Jg}71-Ak5fWT(86K?1tW5V zN4ALk$^|acS|NEBCbWCnK^Nj5LzQqvu5{3oe?8MPC>r0sUmz`roB77eBEB?Q{l%sc|cs&ik^%9sRMLvHG26z zT8BnJzYANB6z!y#G%5z2< zsE2NK<4IF~An7U`888TFosn>WZK)b3a7P)sXFla^^quvaWzw;QB`(5q^zkUhHNST- zv5vRD^ak=Z!Urp)Lm=Ow7$3Fy09148^X*>B+;%6Fl>ajLt)$7K_UYW(1mQ_I>0cH% zLXT0VMEb@MUzGgiC$#qAgKk?uaGK~Zq4B0Cl#JRSMtYOUy z3!Gv$2z$)eR-cYNAb67ah{1v`y*Y6OPUzWC75b>f@GFwtGjkw+sE{_JoTjeOcZ$fI z`W6@iWjd4{Me%lOA*_m)NVi|a`|&q%#HA+kvBwiR)weA2I>Ks*8?lYk@6xk}k=V~T zn~5IY<~RZ}meP40A&noM@K|&P>UbcJkG~rY1oHN5W@3Fl zemFhhhq#z`jw`3hWNQ_CpJ zl!UIhyw!~n2Z^kLvalv7eERwp4fwjQ1IeRi3Qf;FUioJ2ashO&&+8oflA zs^(^N1iUXFMVNp}eCtP-c;+d27^W6c2J(Wk9w4%ADk$k#|KGq**C zvdEhv2{!H(_g;9$wnHkH2YD2Zj_imQG)| z10j>=qDfFRE8DT3l||Dtps~JS5opQgWjXdxm5s9?!zB{6lOv$({loCkOobt|$Ign3 z9r*hCW!PXi2S)Zb#btYTV{A+FpGdW-c z#%}anc`n16j|M>F=Cm$Ql(L&C3u@T5?}stbI~2FZ-Glr=ZQ+I53Llx>XP(O=SiL!Q z<=5JcS;p55c--|CR}XK5pcf1AejPJz>#$ZiJ|s8m(53=7`t2NKx@0i1_JQA#TPy#e zx+{rDrv6H0&TP+qb#Ez)^}9G>IO;^rMBg*@q1WXb zJT%Nfk?*y_8NJ@na~e(L#{bMA<$^2oFKd_kqoIy^M)#T&n!ZbUr#%w9rn|E!dJZX7 zw*fnKB$r#iPlCR`%XmbM3{Tf}M*Az>)UjK8gM9A@ryAvDJ`?fMgtzeO(E*rLn}apQ zC*j9OH>TInU+KIJpv$aHuEXg&{=r!`xUTaygv2rI*}?YMC1)Evo9B(rCYxDU*a*1} z#=-$|;hpwP?74C;pA~N**B|2qF=@Z7@o)4K0wyXBA>$HFK-#M|8 zZ`@(TTSoHgm%H&sV^D%R1p=)XJ>y~_>Pz;pjKC=t8JwR^;a!gJhby_3GF=Bn%^j3J z0QDNgf189^gCAnyhI-PyPkQqCCrkNg%OyA{g3g{_L3^-TenjtjM*Q}`JlNPd4`cFN zROgxc_{(iOH>*_ew_67smNf(9x4XFii$?G@*%4n}?<}`>u)^epa=G~?rrxk7mU3fAq4hh}WFwrIOeOAbr#OkB`|XSr0P+YAF)tPRyU-#4_5 z8k0xo5lJt17XB^?AJ90I`lh% z)~0$nHh-7F#Mhzxp_$B6Qm^tpR^h0ge#5K+Ctyg}US7}bqNWbqyVhp)7@ft(Z{5HM zi@3>wVCK1%&fLD$Q5C(jyHp>?On=H^(_TUKS`%DV=nPAyCSlC&1lH)9J*PfITZbRg z{5uah%^BDK=+5WA8irq^+*qx(olJEE-R>jrYwQMkq-|)da<9uH@V)k8DEC>*E9=~l zGAB}AO8ZebcJt+NdZu!sx2fFi&wkYZSO~rEd5im2ZZ)0=?M&ObZXhlF@k-(@b3fGa7*jD8;)oXEh9Q|hxumC>C3oP(!_5!PDasy%P{ z(Qm!LFAjNCySbP+B$mB;)Es|z&vEq{IZpB0eH{j68OZ9BNcfgKQXX-4J)2r@7RIK{ z1E;>bfaVHUmmdYeOBS=I!u_fqbe32X+2^N)Jej<`z~5yaYiNyjp{SLNufOPd_ER~; zN6_VXGpSBgp|p8-BiCMUlVL=Cci03Afq04CXpF9Feps@U3#7LKIkRygef)^4!deXyLUC#*F+X#*8!fhEZQ!hIdX;c)Q1PfpJKj26_$a%GyyK zct_73*k#p1Y4eh^G^h8K9g~gW+GkzDKogAKWCLpoJ>hMm7~X3CY+h$O?b{gTCJERm zzWE$C4nGV69|$|J+IiygY<~jFquZh2kVnp0e5zd^rr$6Q({=5s zH+MjO&rDv>USV={Xk$F8cZ$8Q{wI2b z2@E)Qz5)&1j8vLK=(6e^Hssa_+5KUC=XmHbx+jk6Z3om#^!Ijnro(Y8rkt?a{Rs|^ zxWZCP3US`W5;%A3BFz6Ov4Ar#@WPjeV6lG(WDbtwBi_8i^Gz)2zGuO6`i@HQ7jY&E zO+Xk6x*t0LX%WKecr=}}5%h>rzeFWK%hg>~F-GEKJe+32S7ls+@fA9(w{Z~OS^ok^ zf8e<%P73J-SGqS|`|$}>))@gtVZk7kT&mFsL@C3Fj3dz{JAN@n7o()J4RvP$@k zv;7{@?`|a>V@vxg2Er@Vn}3P2;nXugTm$ExWPt6gJlZED5bsh3BJkg^dozN|_p%sC|1vvDL38VFb?;jIzJKM{R#+Yk*ruHM@-{mw&dwMIUd4vDh z!j{g^TDhPQcB9#~Vd~Ds2T;E3z`D%(%R^&Z!Qz&ma8Oo|rpAch`Ioh?;J@LBg5O)r zZj02Lu-~=-np9SB;%+v+Vk>62m?Qlz9&>G?`kvV-O?o|4o>Kdb3l1iJn-9DRe;3?dbG4=iC=-+?ziJ zgeDdJWu@rCiT@J8!6Z=B1768Jgj!>lNI$JZVX|FaaBj5-8eL0)U7Op(F}6(g;Hq_uExf{QxRvOA8l?~NNF6=(WcDBNiV9Krkr5(bD*!~1m)|C(0EOX(9?W>vvQ#um{>Ey86>@n0s$6wISRerc4nkm zghs;_Ue1tPcQ@~KPiCaQ*`Y;andl9dnfcJaYcHH(w~>V`F5`z6tz^ZNGx=?q2Hv$T zbBHHl#E7_}&h(fGOPoZm?EhVx%t1A&>7DkgKGg^52I zjgS9sxPkn^K>o}6DuizC&s-vR;m5hHg`SqWcRK=9tFZpZ1SEc9fn|T;r`8#v@0H4` z&&=Un5$#eHtHEIRKCjpS|JG`J)0WUW>9)WhT0cwP(u>|{(hU=O1n*WgL*iy2{KA*2 zjGv-{(6QBC9NqgWCk?F79H7wZG-pUUSa2{W-UPfAEIl2!2p?2=aYL=8{C9U(@OfpA zgw-hOg6>JN`TGe;t3$Yc2)aZX18I8F(S;!H)5ZaWzU7~`x4dq}Nwb;5y+Td|G=_p}N3|8#{s4oxgcBhE4Bv4f_1bKzX)qFl>NEs_>eF{U`NWaAzYf^|&i~M+~$<*l>-e zCw&2(wpjt`ZRotO6W?2!&j{Pan1MKh4=Wl8&ki2T>V0_;u*57*+#!+npk6-5XD-WN z|8<@wI0VDelfnPHmRe=D4$1ETVJzrdhXHwS=szloksea|boEncesPIhjO29{(sJ_2 z)KE0Ew&$$^zmq0d$l6>j=2Xi$-n9ocb+V+(BQR)q9%lPZLGlP()LZvfX~GxF17^5E zph0KK8|tao8(RsUVO}He!1hkZIO#b_c-tRZO-MI7!Muy3F=}WpramzTs&^Q6w-?g= z%9JC}z6XmK`5jGv|C`erKDxU}t&%b|987(R{c~T^f==i>`T*({4~22Za(FE57f1Na+-D@< zy!h4RX+Lq}Ieo~#-GHij+TcO^dr=0WlGZ`e_pDWtvubyx5xA^ONGXcKP9(De4 zKS0#p8FPisryPrxN&7hIJ6L&?i_ej%CY2BFHsZ68#;okE@r6yv zO`UgiJtrVN$V5$%heXnj@~s|cHJK1$78cmdW~<6|jai?!d?*mYoBd`@XvG~E%4r{g>bBC4*YD`277e7FR%yi-6+EKhJ!$O z0rH!&-M%7t8cch=cDaCJ9ooF#LEgVirGBJZbK+EA>?`dv_VVCk*!JBD$qPt?)!6&( zU^%hrH|{*Txk|boDR05Up(BC3A5zZ3?$h}nS93WMW|0m(CV0*D!KXaDwBZsb9WHVz zHef|M3hgX3x8OICGYHnz|y7r1W&S< z+cqe&%&^Um@x+m>NLa;uC zo0G2sttdl`nsicwNu(WlXu2_@Ig-dfF~U8{44u?Y1 z+3@;?@{5ycNL+|D52NsR!(ZgnH^ca|9WvEzQ;*Vl zh_-CjveDF^W-?{HAaucls#1l<3zqwBN%wY8AAIVED>CZI#N+A=yWe;?rWdwry@!+M z$Ds);IpsV+pUI5eI?9AU*kblkr0h|ycKXV?9{)_^+Q2AJ(_r<*4M_@Rc5LX~7=ADM zFQ=RWeD3to!_4L ziF{F|yiZN<5X}AK*22R9`iwXU%A)mP(-u9_*>S|7_en$MGt!Rmr~5d3+tx&O?50g# z_PVB?n)Of8)Y{2ZQx=<74z&JAy()T!Q@#p9vr|qa_<#|g3*QBWgB~e_oA9pDIV253 zKBK)%e2#navp{GA%0-~<)wi0QdFN)zwydur>3{YtxF;tKN;$_JpQ)Fl^o~)E{+; zX`7veXX(*6_4GEb?-ax)gg8NHgb(|ikjmYhFX5D)O|W&V&hSb9JN_CLi58bu;M%Nt z5VR=<>I{s*affg5@HRVm)lb@2q^FhmITrAy^fC76dj_7GJ;k&q^C4kuvZAMDg$a$? zVGHG!(rRWp^jmn6UwxKM&kvvG^z+QSCJ1)yp9KRaG*+w64oAmpfP+4`Vds!!3^VqI zH%`v7`1#<03@`ZIb4l_{#d&8P<$LwBu<5!&W|=h>4=p^$_umVG?A%Od*tZj0S$K)v zU84sco>nNXIkeFpF6L$G7h}jjpo<1C*1$<#7seJIz`Qo$xbIDS*k~F9lWv@c#F@o> z8M`3*AQqf;Q0$ZdGMSbIOpOB_2{jp z*!$&vI&a_!7MHffw8CT@C)b0_M;{@#{4c%7cMVqb`;0Xk7opAbA+r0YTy`#izJpyG zD}`Sij{|%hV9D2fCEvaW9-L|+4Z5W(N7Ux=P5=C`o{>B1-7Nz*+IR70ljD3-g#_6T zzVZ>KP1&qJq>t#kx|t_;K#u?gW_vuuMxC3&)CTmNbYK*{D^~`||8}6U_XnvU{{=gf zX`)iSC`;Yn^RqQk(4ogySah@n-sQ&1INwHc;s6u*)JSLkYC#KF{%H_y3z4~FP$tk? z@!GIMFmB=%Sb3-&RM&dJ_QhM#{gewxO_##Y7zuXwEu=Z7_a@V(aZxKTHe}(2i_>v_ zLIk*%ZsDUU(%}2v{TLa#f)|$_WR1uCV5hUU^D`yIc&%AmspIYh@Uf3)ZtFaN#-$co z9bmPk@ob;|Y{}t^zhr$?4{m3zhov3uVd^z^aKcvDGpAkd_@6pz^S|RY*X}bl7)0G7 zD(sE%d*1(A3Ce|}I5v0ocI@A=J*WE5dDX!T zUjsN)$YjPpZuCq9 z-^tfu;Gu)Oy0#SW$G+q?vHAQ*$II-OPZ=JIa%5HJ57{q+P!RRFq<8~}d3igp6~qjy zizQJU;|Ckcuh)Vc7BCEB!glawF-MfLRwJa=FdyDKD17nMy=ZTi3xrqL*QFnroxg-{ z+wF&&O**1-?T%|fLI-i5vhVLe$>YacsUq+wYOVauV}|*2%ZG!i$ljY$0MbCa8v(a z?iqUxTf-Y{oO%MLYjsn_zZ1^EbnFN*KKZ=&&KJru^&$26LGJg?SOCJa-`Gd4rb#`k>O#35XNttph8j}W}XV|Jk8#Tf| zO&pN$l^?%<4)(rpP1ov7g#`$;|D1hVP-^bTcqO!NcIKUl38 z0SmsLbNz9tj=Feb2?XXP(*BNz(c7#D#5(snlY;qY3*eEj9sGB-89eJ0!oa?zns0wr z+_So!_D&)k#o6WWxLY#=d?Y6*c=so}d8;+rcl!(dW6XI$LL!^LxtMoMc@CCY<*c5= zF7|uN78qiE8nXr#;Lxt4q%h4gC!)J0aM~v27Q_s{3gv%l5T)my2n->Z0CYwoT z9A;Ecf@9Q8|LUl_I`~3++Y;97R9AKElL{`lhaa9FU8a$$B$KJ2=Yx_>k6CGl}R{G4>6>7vXH>`*Pc>7|zqiFfj>B-LSEWS! z$OdeyhGEx(`Lo3lEWrF4(1r%0r%8Ww7McKU4fl)MCR`YX51QZQUzgDP#m!Fgqqp`+ zuNFkHS5J3ffE>>MewZgX5{~^^%dhMWh0mMmoZkRR8dc#ydg~SHUhA&T7%(^8+4Q}v z+|w0{!@}WCmrt1Ug}$3N@_?32>T;?D_R6gUokxuX!Y6#>dx{Y+!k-B)T>IU7jfSFs zSE|gX@K;ak;nI#N5H`%I*UfJ?|5?nXf21Qek0b#V_>A#D2*GlAczvz6@4{ci336y&7nedBkmC=-RQ%q7x@66G&bz* zVEA@46Gu+#Bj#9|cYB$*Hnw$LqUql;Wj!=}d8lI+`&ijT{0xdd5&Gd{8%x(G2S1Vi z>xq*eP#*GfKaf_?Xeq;hG)DSBHqGy+`q;OF#6&MH^mK>j&g$s!6O1$hd^HI`*NX#y zYLYOvj(S-8BZHw6nb4X><@ZP*?ZBv)C!nqCM?Rj8iYhw4fQQlECOf?*ySh0K#h@5>!~!ie2eWY;f1)Z%^gPCL29_f3eMKFpy$u-(YTD5 zz+glP{SQy1T3HIzqhM3CL--U}?mRL_^p$CT9=5gUrq&tQn$0d>2+^s95NUrZNBAJ} zP54}A0MiZXqINQu_ZcVW zf8u&-WG3}`0S?~!jddK}iv0dw>a#-_xB58{rg8UE*<8Im2?i{QzCOsxF24Pd8#* zlU7K5!Wu9qteI+$U(S>;Q~fKPa2OWS*$<>kp^aw*CQmC7xW!`IgL-gkG_2|Uoj-rE z4OX8RfcI=`K=k?J*V<}9{v0Gt%EcTuy!nhb>1aW?Z7AwM_(tBY;y6^5jO8?kwC)!* zeuM5;b)CJ1dJB3r^Er+}d#;(23mdyU5*`Xj^8@)3PIV5g3VyI>H@s2!NSZ%Pc|IG; z2JC}Q6EEQQ#X3lMizT}C1ZUFu*`BcQOiv`wi|9oAo_Jhiq+$4=CcARzb2woltZPJP zFRa&AX%2)x7P!jUSz8VM2+t|-n)E)s>oSga(X)i&u*N*Z@&~8d<%F5c|L{E^oMj*V zp5oZ~FPXuM@8szxs@2N}fX5FyPh;G8nd*_J`L-jR_(-0^5>j{fg$)^tAZh7GcEU6X z=yzFU=oh$jNgC6+oUJr%kUBz8yDByNuL}{8Ui_&Bt0; zcYQCAH9r1=)`$x~EBfn5vnX1#t()G*o-$#52-|xc{DkOj@3a`?2-i&Pmgt z1Lds$F4R|vzuCf@HQ?egMiIVrvQ9FdU*$qM-*JuJAwGr`J`(dw`40U%9)qkMS6PsB z0LOg(h9j0v=As9mrCTUn+D_8wJHkY4M(3J~dY^f+o|rREKg-Bh(f-D6KpsZm1n+K1 z=S8GVgIk05AYrcPB~IMT!>SK5x&{i3T0JI^QLk{@!Z1AVQB9t<6BySfGFQLeg7@Kb zLN^p%qRqZ&ByB6^4(Aw+&x@(EdQ$ zUk=uB0?I~2&LgKx9tV#@MzDkxZz#8jBHy`J_*^923FJwTIEM=@{K>vIY3`>;UR4!E??c&7Dehi%CnD zVCry%{N~*(;RBA)cM9aSY0tC*@i}tW;~)9a59LT$NLkTGMR2&`l-DTy#qce)oaPhz zHms#QtP3o>xtcj%LuNKr8z`GX@&&*<7^yK~_2e<1S83`ps_q+37>e0CvP6CpFGdFA zGIff`Xt=;^k$(u>ow6aCw{*_GU83%bw{e}tiH&%-xy4~{D3C668>QQfB;<8#9R@117!)6S(ssnd+kyNLP^JW)Md3)^N)f%5ZazknM|js5z@QHW?DblNfQg=hQ>fNch0pXvby(1CL)nOod`oPW~ynX$>qPHcXy@gk(qjNxD z1&n<%USKU;8dS@+)IUc38bq4fQLW5wpi6#hTAN?+g_TkLX`n^ zBrAYdpF$s#|X9$&ZKiOv#@HlA&z?(Ej|3m&}@|_1HF5{1h+c`ZVjIDos;du_XuuM0f$Buo6d{Zaz zc2F=WY?|`l=K&Zoe+%3>eqS+f`I0~TT#3@yGM>=w4m5m1=h-Dh9q)!?chhgY?8Xrc%9{&6jZEa{{SDM{Z|QyMwlVyv^LyOW-Ciz8 zPUr8sl(0q1mgBu7BRuk7D!cz{EztGhuW>4vJpL@@)V<8kJv;-8bx-2!Yele>&PH*X zb_5gY{B`&0(eQXrDPDV?fb=jSj4vo)cQ(hf#H+TWDtMXX*gPb_IWaFXkJhK_TEfU-c(BlZK`lx*)YC&Dxgbn0OZ`? z4d?V1z&w{zP#lqrbF{s=<;GU><$fW2X6!8-e=F7X^4c_RLwg6O%pZy!9p|BW%enks z$p!fDaws|v7>F~&pJ&Hq_(AZ`94OjjNN2QWF#3EZwNB3&Y+Q_!n$A%CB28fBhi~l8 z!%dj?>l9ekY{BWDuED`hd!c2WbG*rO?EA;XD0S(%xp~u&@@crTq9A#z1 z&-A<^?v>H_k;aP34s+>#XgcU#7|XJP=R%k6P1S-+e^@WM3)Hg?#m;@U0^KLu_8=E# zn+$}KjdiG|gT!a%j$BO7X*ybha={hp_i*XvUA#PVAS}1G!9MR(apKC$%<+Yctr`u3 z;nU`$ej{HTwCx`jI&PugKZ@y7Oz=VzJ$deET^@MjHd6lp-J6v0Rf1}>Bp%YXwKC7W zx!j{cJQfw5#G&dfwyf(O9QEHbMs+GZYW9U0yahR-wmWQE7tY_LF9qre);wquvzfCW zD!L}IMXl<}!FmaBKhzO#chLv2Ht%XuQ1r?*lZW_Ybt#{e9mtwYS&ej$Fyqcw*ww8* zr=OR7-JkK9&h_y3OMUf~g)(fXjLT%?AYN`14A`aQGVf2i6@)!n}6RMXl5R&Mnl2eSbsg zrf;kpy#u+*uPc9)vmZ{k7>T>L+Jemre`#*oR7`TvQ+Lhjiirgc@X)=cbT)VZX1=_x zXva@twjV3lfTwfd+prHnwSjwlZb4{O7~i=ikTB{5SmfHv;xjU|J0SH0cl?sXzh4|d z&vh$|{vZDucN6!-2?xMvxsiIfW(E{ry^c5Qw2{)n9hm*)e4zS4pKq2hPF{ocd);Hy zll-o=igVK*f$v>QxI4Z|GFl!Cfx6$>td?is=*?pMz1IT;4$)lUpUIsuX6AS{w#`Y! z-!+jh`H_o91{&k~Ju-b~_Z>&vqxZD4U%OV7J*7I?jN+PvJIpkB1o@bq(!ptG2{SEF z;0pC6YuDrh+qAARE~objeP0;jg zT4y@fyd6-@V9An5K5F0v-YaQ2PA_UA>Jn(a`1GO(skBu~7`P?|sJ~@4*hlm$)R{h< zxs~ek<>Lp#5Ut0qYMcJhv3Ds;rSIkAX9XhR3HCMI$lYyfz^LE{-29dydH@WM+hL3p zi{lUO!cks!{Q77MbyM6>`S%(f)&JOgc7CWWpK)iU(!ymr{!$vjo<4MbaPPM$=J2B( z?bSNr9&wH@ZhO$1aO^&`{5Fa(!WYdycZK$khQREef2BrcnQV$ui$>%@3wKZCT|d_{ zlWY#eOW<)%3+$e@MEWyY54Mt9Cj>CNr*xLR&pa4;{tM8(;Q66Rfb1YpKf>ux``PS@ zqiA~gDc?O@PhDGYDWmm9hlLL~^*mOU%_MA`O`KE*+S17jeZG_ZA|!DkAE)S z23sMy)Cy{C?sCE&lxALl@wIc|Y<#YU7yECm#L-e2d%VYs6Ruz#djHIO;xe|mhc3|l zF?Gm#=(es1MX!4QGKc0C<}&p;+xciZ3{Xx(#J~R-ts553Yb(>Zq=8NiQ7fn+efDm6 z(mW3T*=_*p5yCk?BwoR?2Rk5ga${I*|CG4t7>fDIxqb|1E=X}DZsW172jkJG6R5sD zBDaNfwsm_P^fmm=2s2^R>7MlNzm_WcH0+{F&RF|qs<_t|JuCz_!khH!o?aO}K;Zw` z_}M&rkwi)4n*hSwne;^)l)y8*KP-7p{!fhsTo~sFoNsxAlXOiv#de*Ohoc zJ%n3d{m!{y5C!d;EM}sIsh%*n>tuX}3ZLhGfZ6^ofS%_&LZSZ$e9?pUc1*A4LMK?{ zrtmw1wPnH;KES^|VYELOm+VD>30*(02M2n`#^U}upmie7KEk8cn@DyeW}rcvX$)tL z#x=jgxVZk;(EpVF?Q~#ra!c9#^JzYE`T^R@?mY!LP*D5#s>9iSSZw zc5XAH-U8BDNID1Vjd$dvPjF7$7RAA~mlPgniC%ZTwow6|X5 zF-F*r!~ukJJ|KGi&45mdz{iId{h|BaTj-!=j-)l<`MPB3`=Ms?=? z!=YXC-Z0?l3&BCSU+WZ3=eF{P1DC)hSQi^ME5wR}OTbapL(dCwjOLWR)oBS2CWLA* z_JC>$>wUJ-dZrP6O(*>A4ReEz!?6`F;N0;B?2L&Sy#BUXa2T3*^mMJYnZN^Tn&QR2 zkJ#!}`J#8x9P7)=4p#6U_q1GlEcwfKSbu^ZuJ@6!9{i6jf-{TW!|dmw0wZY6o`{+z zO$$it2clNO!Xm)-Vyw%i(^+VAurK`6DxkdpPcosA&&AGq|ssrVQd#dO+pt-|=^D~fY2>*M253&bV5EjkF4gK=aj8{qvXY7S> zZ~w>9RmWAaL}3*a8x;&x5Jf@7#Dbl(SQuajb_a^x`fL;tL=XcD0~1kfiMw+a13M5~ zY{kID?s(tuhrjpG%iWnX=X`N?cP5m6?RCu^Q>98NLggm(B#lnblu8?7{RlWh%R7X~ zQzN&r=V3DJJFSr}1(q4W4gJlra0X`+t|OFAgWfPu(*pRJ%S&oLGb}+y|4sX;X+V}x znqpehSk7?2EvxpLLq8gv;?Du6x!TnMVo<|-w0LJl#6@Rtf>+F-##|?MDW|mQC9HSg zTo{|z+VO(r&5XgnIHhDFAL>$tQk*I)O)eB3j2U95E6oONtWCHwON7n4t$}OIs#W@^ zf2U9LH?h)EsxF|37;7m_zn_NE6%!Kc;miu0e>&=dxIT9((Rw>7pILyCm%L!#@)l7j zaUE(ph`e@Y(2zw1%(ycDsA#*>a_SyD`!H-gpM5%Aakf-?*6&sg{?V+yRO8s-7$=}n zEeXbH-nHA4GJh=Mue*b(-KzDZ)pnxGo+k;Kfq*4?y|{aN{xmq+^<)2p?mYDsnkeQj8Mf#y8;Q1nZ&A>})| zIsf7FjjE7)pkW!>C|rP7#MG3l{9i&emHPXJ{@q&2?GP)LNM@_J|;CM{F_spSi++&G=j#FzW zp-1Rr#1ie@lRkLtu0<*b`4IP2dz=#lT@LiNU8z*2c~(`iF_FQwQ-=D;2|vnBXAudZifcd%|>y`tfpH`%2*Zslvtevhuoh3XdfGuxK;g*;0M# zH~A^vUwLxET2NeaRbJ6-J-gIBEiXm8)4=9!&F0s7G2$&zLwXmdB@8TskBpFs2lr5( zgKf!cLTv(97|2ChpP4P;E6BEKA%>o!5*`~h|6#aYcl(w&^S2XOwV6ubL~cK}2g5sy z)8%$?V(J?0i%YV?H3}Z@r@l{*?48C1=C+|5mn)gd`;5MON~Z3LV&VIet{g2XGkXn^ z@ZmIVYD)qCV8PrC#nYZI9}4gsyH9h~^`6#L^~Y9dY+bDrPxol3uWg(`yE|N=mVI{O z{TFXlYjUI2WpRG=DF&9p6Ni)10KgNW^c6fR?=PQ0efxZ%qNQCpVnbJba%m0x>_Ar8 z>yy7?FJv!m3Hi2sFJ4}3D-Ukji1Q79$jJ7$G^N3Sr=)c0spWUzgT46C=4RyR6{QV- zW~=;b?sY#V9XIBOelku~v-g5$643Aj>=fIRz9^qUhq~Zh#XIeCbpx=D!Ou$TV;)^l z^C>jHYiDlTzb%)GZi^nnKC$3pec872Jr1*5AyL1%{Q~$fx%Jf!f-g-yJa(+o9NhfT zNrB#l-tk4U;!tf#2F|_ie3Zd$!mW2LK2Yqb05&Pjro6H0ebDRik1eYlZj$EgLH@#8 z`CT16Y(k4G&7^t|dgT+HIdZ{F;E=V~%P;@9t=kTs{IHCP+Lhz-*V3V@4ESvoGx?&T zkA#Nh(v6zt`heO0JOsu-$|pcS=k|#1Zg66yw@1#xBSgI(k@|l89fAKCdYOw|wS%w1 zJ>22#sg|odAr9m;bxX_oN8^?fK#Huf%1AvcOPx)vKSgN1Lvb( ziy-hCovOAmtBV{IJpMqv{<=cr582s2SiGiS=dF znBrLU(jJku^>ZrGw>v`%OXy6-_vPlZp617=`ZgipI=`C`1>bx?>m9j;4?L|U!R^$y zD)ugh*JDvZVFiOzxJb~;Ts;atHiPo{oA3v~jIyTry@<&CkzYs8M)g{h&yh_o*_&4m z?EqIym#BXo->ba17MO2|^6uuyah=V2olEBOG`Ji7Yb)nCN0Z`Lc)XN$U5c3ShNSvV z3$tg-nTxv6jGU@;b7_>qa>aFcxBHe}|^#IVx^^?_q-fXz$)T!uc{O-71F{KLgx( zB9NmJbt0B8jHmjIz4*?UrSNwfv&fL3`?ce=NcKP=_Xm2|P^b|55#73mCXys=h=6+o|Z8 zEm67V6|v!}u?1({!5=8Drcv1k4R|T6@fU?rVpfY5+|(vaD$YQ>P4s2atDVg1chFyB z_)kVm$#MK)0~(ItDGaQYwrI!$LhnNR_o*kR&$>qNFv@#UaBDk8{}VkyZ}cX!CHi7s z=y3{g4*zX=O)QO1mG^qvsyY_HM!opE2ei3Ogz9g}UDw7N&?a>BN*l&nnb6(Bx8(#= z^&{XT`O2YcgjyHqDUjk5a5?&BW5k&oYiXS5L{;A;2^Z`Or?e0JF#%u6r|_O8<4;sH z(Nm$9gBA$%xW!7>7L4%;^q5KYW4g~>$@`ky8}Rc|`A5}TJ$mx41Rv)1U(*MMVm;jS zz6Gsv{TBF2A_l5YMauU>^Gns!oz}}L^K{h7o0s4+GHIiybpw5?r5Orr71nxBFa~mDw4^^f-dsmCVu$* zTn${wEz6cQ(Pt-UHi3F4Xe3HrbB)oX;e<1XH050yjtxh@;xRmcwOOc5V>%b~ntz2p z(B`FV7pOpMnSx*Yp+p{)VKVr zotL<3f1fY!WVX4M#~e1h6(6!J;D;-oinUEr`9$?bRBGb_uDM|rJ^eYJ26bP;QBN!K zy%(E=x_0)EU&hTvySPmL;_|}WAPOFoM>iJ+i-_89Sbgu1@bcn%yRqElQ9*fac~|+M z^mr;i>K!kge8sZjMjLMWpDi!$vPa7~`9XG%+GtoxS-4B)7_RqsqOrYs6#wT?NFP}< zi3Y?5Q&$I_miM|!{WoUv%=1}P#PhLCt{ll{GNQbejfkWEF1Dr`pW}#NI`4fDpY19R zH|W52*H?&uPdj+4jlWp`c_G!@@Jpmsno9X^j-n687mN9amKk4Ow&2o>-qO$IPWmlQ z;qckZdDf-k9G3qeCv7js_>6q#7w6^BU;vGn5JN>$%jmZ8wS;5kN^(>0VKgQN`-slm z!c83Oh~AAliWv7*RL!WS;>MXt+c;!R3ElT}jF+v;H_@qjDPGbludcplpuHj8D{hd7 zCwvr5KlNtBng;gSEXJL?LhFtk7Ud6gV-cQCDo*oKs#2*tZghW`y@t=r(Klw%^1&;3 z)#XDHYi2liT`y*2rcm#xP6G3ye}{eKwXy~E&``lnzO;&g#poO z9(Z~@nMYN4Y^3ejO(SbI7D09M(;Vx~6qIv>W^7o=1tVf)*K4;pIIFPy96w16YZ^-~ z3rm|#la2_Fsa@HwWD3=_IVApCGG$h?8~o+v3Et*CT+EEXS*P<>;<>Z?v^AozS)kh> znK-tfe(T45W8ke-Gxrw5FolbfR{q-0;l&vMBE*P}77(^L+NpUXG#oVkJE-=Esn z!g=U{(|&T>)0sO}Um>P#p2Nih?}@QjOCq;IdHM_*jC z`KYmqjx{Mvvo7I2?9Bxt?u|e8YwxKqPLJh;?vLe~v`~tVy~`C}71y^O&yoEC&WW#C zwRPuZN2Lhw$j$bCrka~~QpWxEwDI0MftX9S!v2>hKZr(w)w!2jfYaBi7J*eO%kq==k*R&Q6k1%sME;sBb{FPd@i7!|*q@$+XxNWwC3UP5M+dPN_@}86 zB08)Cqo(-KS2yz#-T|Gl!H)mVK9XD8f4|P9S~ru}znC2bjD1f>zgcMUg{i!>aV@H! z*OB7T&vftIoL7_@OIw4_^V61j*wV|1S9UdJ*#!&5rNrgZ_W2cl)$chq+dGBJ9^FN= zg6Hy6?HD=V*zWnf;U1dM%!3Op4x!gQuApA*sq>Qr&T0Na1je}w)EfVL|B_B@1rHUB zlCDiE@YyAM=&9C>6t*N>xhWhU;~v1D^?WIz3mt7Zkp9kYh&?|?@Xqm%_|T`{ye;oB z=CE~KCSR7qKK_Dxud^4|;Jqc|#On=7UWea~VC0dg)^Gxky&S;Q*53TRz?Z7OcGlkc zx$)LuKjg2SniFTu`6+rd|88I&V#QjV^;qz*(Av$VkF%<9zpPZk_;C+h@S3!O5}1G* zUByR6-Iv~cPJ8Izl&&~#7evy2wj?3f$hf}hv-Q>aT z&daqwabIXrKXx2&lG8@!H!PhVkbWu*Sle5k*gB7wZ%P*XE*#gY>hO8rX5MWo=28}SJ3k9DzEa5p3dJvhzWgl z?#7oq7L(qzyHGjv>PZX@Z#;;XEZ9lc%7${?^Go^0g<|ql?|L-)2A)A@Pg*c^6#1X2 zE!%%9V~#JhmHK>KDZUNb#;7HMxbozET@}VyzU~aA?Cg4s`BDCLtyDhb;?Bu?1{=%v zQTIzN_;7)p8Ylu8wr7|XV| z_i{T@f|Dy3=Z}p{nelw7bUPBoUuvwB-d;x)w(7_Oni=6u!C6b>B@Y{OPLMqfxF4@~ z9Nk|03NJ*~y}t;>#b-d zZmBkBzMQ{*nA|Y%KN0veLrm}2k`-?pZTL`lbx);<^YfXX$8-?=oSzyu3O1l0k(1eb z-geIO*`5x4jnn+Cy9tk9i`n_&Fy44?oOo+jmbaeY53ZjtBHeBY=Td%@^w<#1Tt@@*5G~#2Q>y_{?7t*b1_jQe#YI{h%OBWie)AiP zgyO&DoxNFFtJ`-BthIr>m#N7w$!qygig$S~#;#}%9Z+B2e=323YV{HSrd2YLt9<1B z3O0|$Q&8PSY}4Ta@X4JDophHTo_jgF&T30&s8l*d{3^bR5qn_zK@pVGkSe~4^ip#H z9&>Bk(JVUF;Az7bitbU4dTMeYG*_a8K2Usbo{nm!4ZLMfFW$9c=qNfqZoP3mT<4Z< zdBCTSH1NBe)7*zpui{d|71^voO|D&LF-->lvuucdzzbN`0%hzS)q zHp9ngw6g;>xqqLbD|t?;Ma({#uIi2^Hu)$IzkR`ln{QD(N8opbt8}Ecr}#9rm{}mh zpBlb7gtdPqb~|~_%yag{dpTP9HBI{00@jTp@5Y_^D% zrPorUotMPNMmm8TXz77zJoMjXsq|^@LuuUiYg;R6=4?UG%v-S#?0?st1^hL_v6HdLnBNgTVXLIQJxBLtp$lzkKTpdZ4 z8+JP4CE6?BDN=EKkzc|z|D^BMbUmRe1D>T8;7lNdTYc_WE}K7{%w=oY zCHTNxJlp2|OiX@~JEzi8|0D(k3yr|ZPY#p%wu zas1c#vIJ*P%#HzyS9q1}LI&ni)nkTyytI?VXAOm$m=9mSQbj0Tx^~Vs`QB%RNPKaX zKIPm}o=JIY?y}*G$T>NYp3RJsd)BvB+E@VN82Km<9$h0;oWtoj6)L=3^gO`Hpl z>SO)M)^#ge-J3@}|C*ZeChA(2=rnHnDU-6S>gm&l+-9Xq+E08;Yi7=%$a-a!-VxwE z173&}$3p{Br|jmy#>zV4Adl}kian91DZfj*YPm{i2j#<*re~m7hn?h19%JN2Z5o zZC02w$GQ@<&{O4wjK(f$hI6U&;K%8t=GSH5RssGN&yo`fHDzWDT_9Ri_2+?oD$(Hs zEm-Lv_y@w6<=QD(&>DqI=un<8r>B0#udfWZBq@!d{EAS1tFmt&ZT8}LrQ>Kv>LO}h zJDQ$P>`X!sZ1!#+$ig#p|lrtCaGT0v}%XN%j$VWH@oV&Jr3Z%-ct-EtfgLH zCEj;K-=gKPYFq`+s693Ply@`Bzn#H>Rq@VD#!0Huevt(=BB13p)lXaCdMa02s@|4X zJd>wC>;Mg(Pr8kB&-KTs75Vbv1WjxA*8tyOzd(zDeu?;DA8&E)TAuMaqrl2~UbUmH z)V7qG6py%_;{Ql^EJa zT0gAGe=WV0FQP3=2FkX}@cvsTp>Rnm?+CvMeYJ?T`uwz9@3@u`UsCllEjz+6men!Q zf8b7A?@6T-R4)a+9f3OI+rLBAAGP+f;Q3=zyITUax|^TW8YthV;)``4co4#z#q>%} zW-I^Bx%s;F_;}QAH*VHow_97}Z3a{~?MXjP}VKKw?j z+Y-2Ksp!^_I_;^*Rk4S}j@0~=cVb})-NzokY#R5ly+pQ+PvC{y42BL;9*>|o z^twJhRgXb(0qno9wQ9fPuXwhR5?Z2%S0{c26-V7|GTI)*crOI{?0q8M!FK&K42xQ~SxPf3WvEdNA;)!qRJ#HhJGw<>@I^ufzvhR54NS&_BoM zXL?I&5%-YL`(>;<;(m@)pAo$)^f;_oc{HV|W|r_J)Q=fBDnvf$+g)OuqS*fCV#(2V z@bRn3dtO!Lwe%rpkCO8Isy~G|DsIf>9%x-{{bwsPWK9&KC!xHxfgT@q?OjY{oi5DD zx92F`C#SfdRh-Yz9Prk?X&27*P#E@Z@kN4$K;JrtRgYv)`gQc8t##BSFh`@yJBf!i zbvEIDl>V^5S854m33xD9u38a64{rOC;%>}K_x`<(Q5)jY_yko8^81>@{NQmI!xQnz z@^)OTa)fN@(}!*jiRMKk?aekB+v!bEb*|#NoL{^x%^`M|<<4OR$ZR{5_JsNHo|tgs zVcuJ!Ma_27u}}=J_? zwl_WBKhPdr!d@?X2g&i(KH+S=M|=y#MeU{8W(ZK$}|AZMq+T_t^W3Vpmv;@Ga9TGc7ude&s@;qk~-RA|4B&n&o14acpdd_MbVThTt!<`vFF zJKdI+4_qK)@%&2%+eus~E=-*2Sf95H-fXDxEt+tTmTk?WS4tm7g9C;6^K?r~Xq&Oz zH*K)K>(F83aAosSixl>Y9!Ev)#<7aknIEsU@jHuigMJsq>+e4FYvNpyvHLUYv*Tsc z6Okl;CdzC1Dw|hFd=>ia8vN__5}G))g#5FyJKrvrkzC4qA>H0IOS2nvM|Ae@$xcVG z|Ib5fzB~4$oH%DQXT7RJTW8hb%l|AApBJq+gwQsp%KUH4Mm{ukA!pm{;PYL|=^u|x z6;to8mEA? z+ERI~D|HFlD;rMhOWy`87S-pCrK2J9`N`mRjIr{>C!eML(gUK`(@;_GcTZ#9E_Z4_ ztcmFB0ln6?2!EPdm#t^C=N(;}()Fs}c}98zYF+~GMIb(#D;Tu0Vz4DUDwO{uXUShb zA4|;FK+YJ4-fR{a8+U6xow2Uk*?rYS?II~+;hq(;#g-9NBFtB~o*2#NlHMA{*48*$ z@3XC$y*5MOI$Sa)N*m|62m5?oC*-BJ!6%+qyx&Vf?@AcRZK@W#is@4;K3t$KPp;mF zUp+|VS0`P)^7+)!ucj~X%Ch!0y$`gZkRmqvitkhDM%w~FB3_Sh5Ftxm%Za0V8MfmMs&L;&i%m^np8+prPu~YrefR@;^v?!bv#AsB zUp3hawPrl3@LW#t#U75~)@FvoId)#?WPWhVryr{?%(`d22zjWD9r;1_O?yncDu+^9 zo?y0`5KJ8_TWDaTjWo`xqJCyUC-GnQ37V09m>OJ&<(DFjyPYXz-mZk_!2YJuy>j!Y z%XeRX>eRtFTdjrh@z@u>@cXLBU%LQBcdjB14JCH|X?UqT9&_uIocXhmxcfDZe%&t2 zPkLLi&x`itQ2e(zR$l^xI+5ppEkwV7>tgH2^YX!fVLEVxpLZS2AwP~%^*n{xugntq zq*q? z>2NBNmBXk59#Q{|Sn}J|9Cog*7#t{#4L&st^;s1^)STQU%8K-7HKo-6lP`~pG%EEx z%L8?Ac9(N>^YMQQH)Q{uCUm7$B{T8D3`SiryDpWvaX>y*&HqZ9X}?Zb(jQV@j~7PA zwKr(|&PcvkZ=$U9$esIaDa<1d*>IU->9phSR>o(wOBZ6O=-l%3?b}aEy5Ces{OM$s zyOgKgZOeSGo}!TJJLAiiMdI|xW^`buLBJjMUwThIoZ!xx2U_THv2W;9!z$eF_(?Lb zSEtR#PRS20r66xM(I}iRKcS1SK55N9)+#olNt?g2ZU0Zw{nk2(SaOM=y!y%VD|x7= zHC5iYmz$m_PO~ZwmWl^r%3Y(Ot~xhpVM^c0=+VxZPUo70(Tc(*4W6}trF|>Pnba0P z>%gJ4VyI^@)~p7N9XXMo`?-i(GmFyVYOB>BF=xnW8rJ77b=+N1yboSRP0!yHT?&`f zYbE73ycd}@Ufib$Mvc?2kLw8ECs60q zebgcXwlZoemrp-zaw41C$EZU0!J=bjFPi#os~q5RQ@EeH$|(s2$zjby^vCkC=ZIOd zN}b+PVfq*Chc>Bz71duPcQ*Cw65iElr93F@8Crb574yvA=J3Rea%U? z$o9jM>0HuS9@(-10gxKsls=P?(Q z7|GQ_7D?c>{(b%f@I9tcXvCaXXyk(Eg zegwQ^)QAC$*1^ZJYW`8V^Fuu{zJnDmk9Z)Fj;|H&41Hwln%{Sptn#jFkRCE=b^v9I#@yVd;r;7gqk^ zsrT)ugH27&QzDACbh=H7tBS3S=Yq2i%jegykA}lcy!%waT(uYPi;Swz^D3R?$Em&O z^vGjsUJ7G@eH9paMAhFl_nNl8wD~OV0AtN1w19c~!!`oH@V_hz_iVnJ&ri-_@FF+* z=PlyaR?YqUC%0c<&xS`zM@hH-tD&?0P#(N1a(xG$``Ngc=3fsIFuv5pukmbV?{j&=t}zE>X6< zJ%*coO%SVtk5O#GGuiB(qkwkguB9?XT*!TzR?>qn9W2VjzbvxMT|JDw(9a!~mCA@G z#rGdazz|c-|H7ii`sO8(qDJ|0)FvsKH|1oJ&EW0adV5E*&U+xa)sK}_lg7)b->Ptd zHqr7@3s1)Nz0`VCe|Mbrl-i~Kh$$D^)0)*by26|NR%hj-?Y=zOxs<7L@5Pt?GQ&Lz zuX?Ox)E(uMeyWx=NAv-+X5q{YpFT?4lE2jtfjZEk7ez~-JG6UzBmHapW(L-rq0#i! zpH>n0jxrCNAZRfed}<4yf0E|8C+wtfIk%899DJ#hILi@lTT@gADccUt&^G0D=eORw zp@*CBub+bnJSqe8Bzk#RdgtO5#wD_C-_n2z#m#Y68wmP9Jd3L*+}d>_rz8HdPdPWn zI`Y_=p1ipB0NT!B8%CoPOXQg=-EMF+W0ct#~>Y__fZ9diUAosgb9ei^_ruM0+w1D`& zqMEsUU_R(Q=Eq4T=tTeJRPXmK+0@IOTU4>qF?ZfO=mtR_TTsua%hjxOM}G7Kjld=B zec%lA&`CM3zODHt?7c)i8?N<_ks8O|UJ**$Qk|wfG{jFl81PhKq6xo4$`7c#2R`Ww ztL*1sN>$o1Hz$!-@FZav_w(d!u7Psrn2t(Qz;C#72iuR*l0J};lMF3K0k)-id=rgr zUfIColxFa4F3x+q4debZVhq%)Y-P8N=dOMV9XghOP5jG8JQk7G*oR6bZsvuD`zY>^ z@LD)CdAXE78*#?gTE@WCJo>?7z68$T>eF|qoRHAu@FR72*P#YXkLQwW{bu~Q_FnpX zt|p#UJ}==l$aivCg$)w8!;b4uQ$g!Ba@p4TV$f|{vykgJ*(h`?&nr7W#ePy{*_e+h zO~pw$1sFKaXJ#(u9K4SWZB9qxD=UvhV?SKyH(?W?8;(IUdGd~PeZ_}On{shR>7H{< zyAalpT~EB`!10ABvHdD8H>b0BoD`MI;qXfgTxZ3z<5r!K&@KWz&2r&7O3f-}Do=*` zM?IZm#6u$Y#QV}x`!-`WfdhEP&0kW6KW5agtdlfJ1e3RT@iv-K;|!b?4c~s_o0;`h zJ$pm%O6WD=Yu!>G{PQ^jw`s+DoHJ{)TNFq=sI3leM$qoSt@&ErE*rH0Ec8U|wm|EGP%^7-ur=(dE za)iKJ@Y&8h;ZA~dblI)681!Yl3~joDJ~m%2q1i=Y&qNLD%H2oh7tMwTc{!{ZNXely zY2fLz^1an(xvuXOcvm~2yc_fewd?wxS2bSAG4XS0cISUQLl5P5m;H6RlFY=Ny?i;b7&=Nv8Lu)y7a0hSJU&+t{R=;&1Nt-R32}ck4E-CA>q>`_?v*S zba$+e-Xwi7{Vp0WQJY5c{6ma!>G0^PmI%6!=XVRB#kC(mn@Re;@RS#@Q=3e@}G1Gy6w5BQYTZwr<2NqoKblwa_%JISTYOqewczaqXqLw zo?TT&c~CA>*M)#FX8-v^37S_R*Qrrx6>7abUBVNI?Z@rR3IV&+ylBOL%Z07~9@@O3 z2M^uvEHDl^zuhKMI=)}~Q>;99pJizh|F0?C0PJV1B>_(vo{s};qdBp?J-M8-qR|bn zamT0#VIKWQ>)!mvwF3By$3gO_UMKZT5$xxQT)f%2qeN~~je=Lij8+*++Y4wf=)eD{ zP3nDtn280;t+2=IURn5fIkxCWL_o+vmigw=5od43Q`j$|KEY#gY$IQhKVg&zm z(x6ATBzT;Q)wn@NBhM0YRV+Mw2OhaQyI^lRV81!e(VZjzMNt25^TgM*djdXE=^vr= z@$f&`V_-m0W7xU0Odk992IGI6;`F#Cidzq&PIEor<^gd_Mrs)LkdwxBMNwRC!iL zu9MOU$4>;1s^Nxjr^{81?Nkq=iR$Zgn0s2~rSkf`_tr!Lmf>uLa4J{eNJ@?JYYF;K zaU`@rY4hUdQv%pds)quvB^56x7h0Wy-jsv}7r;*e9Mh|X zHGjOyX4x)3jp}*AI3Tu}EIN0+Xn!qSz;g)z8j$&I~VeYJok2!D6O0=Lvwq<6% zu9TQ|K*iIu$0ipB2FMp*?h`x?cig=JoP9&oX?m04S(Nr>z1R(gE~C6PHxoQ2ICCL& z^RBDrXsESnd;5(j+hwNkjc`@@k&EfZ#IEokzr>w;Ybg!;Pj))#4qv|ly5+oV&>edT zPP~=t1&2==#k(pOl;}k;)|*tnuU*#(G%&%7{`I*@eYLrAPfQW?iQeX7ShJ_kNUh~* zJnN7;#bOz{KbBW{_ci}bdB$s-pAcVfxR}UI#QlR*oS|?{^-<8L^MprH93d}OuYsKM ziTn+sK{Z{@^@~gKF{jx}W?_F`R-Up2y{}nsOq!TnW)!fq(H9Jjd z4245nAhkYk-oBCTtuE2b@I(Wg#HUVmFyXD>AvYMR7p8gu;Clo4nd{BEwf?3pu2x3B z`S=HXPgNbU)qq=!x>hy7LHEvyrriu_HNjd3HWPF@$%PI$?>L;Gq4fKQo&8}Kn~6= zWv!8|yjt107(+H@dZ}Cjc2UB%YfAge!d-n-KT7$3g?$3G!ph^9^0rc#E}uqJW|yo| zQmvPYHF#Nfp4c;&7rfn`3e~^5PsPk%A05o^D|Sfq4UlvH(62eHLBoPOQ^o2}_K0bO z)-&Z0LC+BCpWhZbW6?MbI$86=2+j_Cp3ug{(TFp?{KEIt4aywi{j?(I1{oohd38h!S+3*il zRj->ahdLT}zq%<-q+8C=N(RujCg=ydUusIzZ3kKPuCUQls@-`8H9 z+^MyHyPn{aIXW{x9lXsE{Tcd zYjV!iKk`TMqUPeA^C=`xYg)MfI)(kx`ToPLJmA495uA|1BWj$GV=8Z=cat4yy{E02 zRJtAC){pVLehc|$z%#nh^1D%OUMb#wa~{M6T4Ejcc6jt4fI5E3ps`N*bjPKs^x>4Z>5!dcsXwU?mtFIhcGQgHmR1&yyMlWz zuGZWnHH{w!SLQ}#;`vUKf>IykN}WCg%QY_?=~cD1yd$VHA1;4Q+#;N1mhTT2`g1{U zx*x$F^gcO|)9zf6B{#=(s@>2zzQmsjiV*dyMhu=>2# zYvo*>a2S9*}`$8ed} zvnth`{R(HR&69^5T#S>wy7PP+oP`uzS#;dwMirkVQ~aD6a$2bZeEMIimj1Dn${R8N zKoreNwl=X=l<(jZ`QcPMX(wKI!!G_?+X<>i!e-V$-8 zrS13A^IIQ9&Do>8?3~(lVI89uMGMHSnC0$5>HqA^PJLcvi%7pT zv3{8+mwUcU+{n%+2G=cM2FwlT=ht=`_rgo-YgRR*KZSx-&hh88s}eC5vr-z$VL@@! z{u`Os)*k29fA9{@?F{xjaX{`wJ1^2X5Lrj8;_r~j7z;;NbP>!mNQJ|+ff_2*j7KncbR8* z##2)p>}7>|*7z1bT+&;u4dI3AC*kIX@VvNTPeb7`E>f=Y`R5t6-r8^p`N^Im&(no(?ueb(}2%b%Q$WXe{itN5*QNgpm_%7>EEf;@<)%xEfhCDpB9$9QxatXg@;$cX! z+}wV4vxQL~dk447SBMXnv7ri{2YKs)rNFsmwBlV!z8w3EtoE+f);&9jz8v}r6;d=U zrHHxXmand`%%{g{0jxC}oPHt0JGEoaqmwOp3V){$C-F{G*AcX;Whb-WqxtM|I}SOp zSvrRl(5q)Gkw{w6zYY02$lSBluslfvzK zCpkL38T~uBNe25bqf#IL$*l{DiX+F0>2n5FB4C(d7Lnw6^piwB(ym$MWD|RnzXV1Y z3-YJ4n#YSdwMB^yD}=??P8R*1#=nNFqp0=4G^gkZdVFU+)jQjby1lK1c-@fG%3RfW zP%x?7!x$L2FK3KMYks13cliA7!g18Oo?Txv_zbuwRSgQ4p7xICEjsr3t%i&cx>|XAX0d4;$1IjmCC0K9@P5 zffGeP&psT|ZJW6Btd9U^%d#)`Q0I>gxpI9|fGb7crx(SDtL4mx_d;lENH12n_r82V z9q~|jDl3K;*ST;w_h|8oD?R=tQO~+z_)?1k{xord3-uBUz_-C#skc^U%+d{P42`7~ zImbEn?iQtU7(61BHW*raJs&CCgwMtGrUJW)GsbIx$0c%0M}DTfx|~jLrWR5)4=r*U z8h^DoIKHBcSz3{11laMlcbZi5xF7LFu2{QP@v^qw6Z`9yjpPbVf`pfJBfm~n7#d8J zT{BnJ8X3kpx~(^(pD8P(_hIZoI;{lOCk#EK%Zfh`<9)e#-NSnm`M*9Uf&Ca`GR0(_ zV*8vd`Fq$8*(a(g{lZC?it_P6Ck z`wIH3!QlkVqG3U9yZ;t1XEhhNj(C6ePOc`!zv-x3iS@(UWOA2Q zrKolHnmRNit9p^cG9-9Sy3g38=FCxTd(x0QMEIQ9$E%DN#;qrgJ_)`0TeRsC$-n|i z4(!Di%Q{*YSuj`2+<#a_R=X)>a;drud|_~;0N;sId+MvarelTwX{cE`R-l0%P-{T$ z`nQR*0X{rs_1(WLCq!oUG>*T#gX^EP(T88R7SM0dikIl|-SZ56#K3H-aisx`o$9XF zJL4kNcQ5YVO+UFGd*<*1rIYk`c;>rM=XlyVCzurfzCE{^o0uy_P@l5A%4Z(ki99Hw zIr0Dh2zA8JFa(_AYipKcPwN8=9VFc5xT=`by``r(VfrzCT8m`U#4M_nF`dB?^rvt` zg8nCHI?-k0YXjWMiZeTYjukV9K`(qQYAP+GG!^oa4vya-MTy~r{HC*iuF@?kVSqyv z2BR+5;*His+7NM3_FO%k9@Voqf%zh>=XMU9`%m=nb`pPZzQopg1Nrx`|2T8`C0@I{ zs>E7I)QND2S}osP^e`2+fM*zaEWwomILBB+PH--(V|^7S65?%w7ew~VlIAFvB{Xg9 zEVk~|fuWzM?v&G<m2{(yvlo2G z4w`&wkkSp}z`4h?s;QL;9uvKu71Sr3u1Lr7TPeP0=s~6XRF2Vs3d?x$pLh-YMyUhw z-b=erj9Q^hOX`WmJM);}PXYX8#j~|5g&Dgu{AIt$Zd7*VA>KbR6u4EyM2*w05^s1% zO*j2@#$Su7G58r1I+lms?u`4vTZGD&V(qrzdbT>^n~Srvhe*2F?4I0rCNE7azguAg zpWm*N-;Z6q?rC1V!HF1wx`H-H6c0S|(43*8z2NsG=Ai>Kp&i=g)*i50VUDnC)n9<4 zp-q1=>W#k-TSTjyXDMIAt#)ryxFc%J(zx;QhXVX66=y4+RqV zEu(Ns96Rjqjo8bx-7bn*#rFYUUP|B=C6BDG&l&n!z-I|{%_7^AsPU*I`L};b6P`o{ z=Q||7+S!{*i=ob;ow7xjPs3OYSwWY+)S*)AU3tx_V~m)<@0K+#bUZ1cC!xVZXw{n? zlEmAlhwrh}7x;Hk|hq|?NrAH5*lj5~eSMC`lH%(&rB(`tSocl(& z(3s2bx!d~7@PC~||L`WL(XQBsav82aMwS;Hy!<+&ufKQ|^w3^b^_)7OoT)rDY9^PL z;hzbbKq8;T`sa^n%5i)CTzbAZlol_Q##MEC%HNaV<=A&e1;*SZFhoSJxhD(ltio@m zh9Tcxiz}Oc(8ts7Xwlx068P@r-`rs69=-6-y3B(c%9}3_adyTM5q(Bl_jIJN?W+{0DE&g!YCq$a3AO~Dw;&fNqQgK27Sj9jp`uv(F1UYN z)fjp0thW2VTD-DFC4x5ub~O~^Cm+qlQ|0fWs|m5ypl!r}r7r}0hVtDw)9L~NM|n=- zT54Dx?>~P0mjaE%{>?Q5`dKT`<1sYFD4CjgoEwe3DpjnP```?pf6)RlW6Tx$c`+l8 zkb^e*`-unPIgXOzpOE+sJbrT1T&)YQoZ9{yQ$Cw}1YMbnC8!CZbmFphlg001opHZ; z7W{T8#Sg5owB65M{I|$3UbHt`CXQOg@aqKcNwudP(#E>{r4(+2oX?-j5zr>&u)H-x z$7;}C61XN%w^DgG?<0rh@dFlUzjIXY%r^RJ@1yb>+6H^&b||L76ES#~Ys@UHZ)~ub z4xAe->~n_FkKu^|^-M`)rWn8!=*x6GvvifPR%Te&7Xm#4y3-_-;AtrN=oPyB>4bnT z=8*V`{O){fhUO7N>IW#V0zb8cp(XJiXuO8&(8=9-O?WFh|0_WG8aZ{$1*x#S*RxQv zTT@uny67%}fABK<1lAHYzn%L;9hKJmr}33Goq68jTG+P){xWHz!anS4*Nl)i3{4_N zryt|xK1E1z2{fe26ZEEjV~@WBBKF}}LcHbbR~A0MEdqU(jSR1*e2|ztE;(1@PC4O2 z(43@vah>x=S$SV@2lQfd#edpcXFS(Ke+*!TQT*#Ia-DyI?>>&y!J}HI&9_*^<@3=H zA%}J56|JNR|IOeLZDB9>T%JZ=DvngSCr|GG!}xpM%^hbY|7)WBCaD~|uwyL2%b@?z zMQqJ%B%!~6e>HUU<^&fmqK`WpDz3g=!q;20C1a?w^4VsyzD_vXI-j0sAERN-)Vvw^ zO{!<0^b&lEOc`DjKCdXlN0Z`B<-g&{#gyZ#puY}sx0X8z@s`Lj-d_p*q6V{MpR9`f zY~DJhm88=5Be9=T!QU|iok~OMKUeXV^9tYO5}zciUKhqH1~s_KgYVzY^>pwV=Dw-j z%@VEGF?tY|hanNU-fU=aO9D3Mda@j+?&g{JR_tD-8dEV}hF3IN>~~jq$;e;STWNtF z5x4B~grMa#aGeF$RCsP28Z)15;=L8uP_LDJRecJluquq7y`q~PmdIW1wt6AA=sy>+ zij^*PyRdV^-e%a(2!b|YqvT{d|Fbc4(LsiPrLA@MGdz_T_~^4Zd@_?UE_jaHmZ5dd zOW+JX6A6y1Ae$GO$PLR+rRM$8sSfr6f`;c&m!hb{_b~*nmm^(W;T6Idep#Si#gK(| zCiFUbc_rWv7fAGeRQ*Al^hf`)1;4m{6MapS(AS_|FRv@EG*4Kq5#W1ve(+Gjujcj+ zt7i73878TonNS+8v0VhAzsJXWmoVWg`U?0mnj=>KF8skn4%KU4KRbfpKO1H=T! z(+1X7T+4YS(1(%0DFIDQ=ykH{;(U&&`O8vQlL4l@T(2*(HURh87}8l8mH!?|H6}mWq%alAXObzvuLaPkMXb`=0SU z-|^gY&$$A^gNV5~^?*3TYNVdw$THvO>$w!26NOMupg$htA)i6=i<9h zS!k?3oh@skfuNpqz;l?bdfR6!4w$hD=ye#V?*;#DK8BNK>#FM}r%0Z|viPgNjNkZI z7ar_$X5+&RRQ=J-z~$&Y-t_$q(QnZvP;Y(ZL$<%gW~aCCgxy8l$#S0EM8^q?Pdvh^ z!V6i9u^$iI@dQ?$=!0_n8oqnsZ5|r)5T{g)g%|Gzf;Q?X@920Q)sbu2`4q}_Pgicyz6HZK zM=LX9M&hI!y0T51v#ia_LNRxEzGDJB8$OtQzm|$LXE^M33=BE=hB=RV%*vnE!-2yN zvH`C@@!O4RV->9n>{5t8W5G^dJtOfQKfv z0>2+wt7ETB2Thp`W{mHJyS7jbedT-<^Cx0t!cRR}^s!fZ2GhS6Yu9Q)DMr&8+zY|) zq3N8PIP$a^R=yg+bCW$4+l;@=@#ZUjap4<&KEo!WsyQCGwy{^R^ek}t{=r1tceh0K}>-nU2I=HdlVTIa{?%n->wdw?uX8U5> zHN#~?zbZB^t0BcE$h`g! z2DhbJE9KUhPL*^fKu7As5xmyEfof=6#VMvBZIK2}*x2&hKDFg3Zdaio-a-}Fa&Kxa z_EY~T-=kkkrFlT>Z4T1;XDeu}@<4oTLFe#wiNUbAAV%}6ylj^Pbr)Kqe?S}`{OFzH zQO90cSeCG<%QHbQWT8pfLlxWVm(L4}D+l$NyrxpxV0w46EP`qBe z1A-DCGpEB(_}#%iG;cCc{2(pfSN`2R2t#oRP@DP9bK6*6|GgsSafsPlKJ09)G`a99 zUHgQ#$%!4D@*HY?NZ?+Nd*Ox4t>N7kTXy`bofPt+5@eUdP=DHPkW$uRIcaN}XY>e@ z;bLe@e6<2FcBn6iIjXm}DaEykyyT$-UPbA+yqxYo<@)ng%TMuZ?E^8?*@)A%RU4*) zziAxy8+`%_%3k7!L1%bo!f|xfZ08db==`sBn<$SB<+tsVWWqQ<<&cT z!u6eZaZlb@ByIt-#{n9O3;3_$F{GFhI4^aYd5*Y5SN^j-iP87N)%QVYTC|<#^=~0l z{Bim|I>&V!%uUV%8cP;ieVu!sw!vNL(;?^6L5woGg(FKNrLC>wu^H{pb_GMA6`cWW zl2*YkE3@deYkWYrM2XrWCoa#I26SsDs}|PKD7z9&(xyV`uU+iQ!B99lnf9g&UY_0j z-&j7F*5MWS#j-VLyW{Uihoy}1r!aeVS5W7!fjxFt`SSAq(DbYyqd8$YcM?%>#K|F< zV6r|Ct{gPtgsIpldnPMf`vPdZx$I&M)Mkpox=Q)V?R@jrL`L|b$j0Be$J(=u<$7bo zR1*;W?&1cpe^xOcI%0|9Gb91i#wbuyV8RAjeZ;_%k@&g)DToNZhmoQ6a8l%W{Cn^a z4lGaLhIz&{@#DJq4pxN^N9Pa|`Sh`LMz{r(LyEIbge0)@?in5X(LS@}StW%?_y~1^ z_X2UL#La(Te792C`|c&You7>l_LXqrM0lL4l+pLZH!-UC{DwDMp^31fwtPfZ6Z}b>@^=6+jc6A7f}8p?FfS-VxxeC9Raz^S3aj% zK71c~40lHD=8)PEi^3MbxFHR3>(0!ma^ffqJj`Rm^U)k#x=l(h$BV z+B4~fuV_Ez`*I{K))3c#;M*|6U=3j$6MgH~x2IGw=8E*bW2VH${s77ip>wcsXj4oX zm?H_^C0^zf)#f;*HlMcXN(h)#)Ez4aU&jT+t!3j(K1y?f4HThi0N~oTw@}|A? zV7AvVAnrkm4^wbz?(SaKzLdSI}YEJLWZ^H+#^y6lvah_+{E#l;)541&ggB zVTlXJvN?t-;X6$DxlP2smSP`CSMmJ4i?u>0hI>`8I$ry*p~oB+sk=j&uvA~hzlWK~ z<>Zg&(Q5D|R^Dq85buKPvF$Z@%AX`Fh1D-mGwmp73xAQ0jAMio3=_Ze$KxF_H~AgV zm@=aSA?#CVZy?^lgA)p{$A|uG%-0YkEuuIS?Zf_Y|2Szzc~iw9TvwXHXKZpJJrN87 zQ{!gnh&IERts!vt3Z2~*RK|xzza*|{1>dueaqInqVfx5Yu$!`xc|E2x`5dBv@(^Zr zxWobyESa-T6E<*G0>-tvR>Kzpm-EIpSA!--D3PJtd4WSU;XnhC_ceVaypkH^KA|zJ zFL!#ABX|jBrH_z(U$utAP7dS)&l3;ED#K4L1iCIzyl~=tUP@>DMZDO-z;7*KD(wg5 zYoX3f9!mAN)e31e%s#$>bipkiF=Zzov&e`iopsPG>t+X(7wEF90{ISa=01EYllrgY zG_Ug5eZk^7P-|{mI6UtHF17xT!zkx7R03A=yElX;_xmbU5j^0uY)PwuM}L-;kyIg z?4u72Qs|t`A9L6XgL4|gZ&f1JmFhJLd__=jrQ z9-W>?0AVZIUjBnN$5r7cYJQSVfLBit=YJUtV{L+AXVpA7Lv>eQz1A{$ErntSPao^e zh1a4n6k1wodG4}A8XgH(G3jhBCtk3-5fp%_Ix;KmHXHKyzT$6^6b;2X3T=KZI*|O; z4z&H!4RUo`3Gc=o-+KtZD32bq3nN=>=SvtG73rH+y;&TJ*VslaITA*MxL2 z_MEtq6Q<+v%}s%{A?(R3)9h?#hV`eJ0p*GPojtTJASnqn4yj6U8lAUDI*5FP;0iYC z?rdz`sTiLITvRT+h=-yXQN)?;srGw{&Fwo>=tq2c@+{Ww zO4QF9PxHgu28C9$Z_=KVe`SPU&^P!Lu3yzjC2nA27KJj>YVhupt@6}#2)7@)8g71^ z0OX&rdZNq;0~ONLNP0=?u=pZzk`HN%<2Bw#=v?y3P>0r5h(6NzNjd3W;QzB3bLU$X zfqA4K#oQoqkRrU)saF}&`sYXRSU)Crj0$bOl?(Z4}*MM^{1!0Ugrp0 z%9}^NDNrJ<2;{Z+8mHsL4W39CuMrws_@*yoPl9Np&)BZ@BH3G;pB( z8A=b#=JS0ouz?XD+0z6EX5LhvlXho>i`ZyMV-zt)-jY!s$OUDKAaKWAB>pEIYo?k# zt}E{!R>Flgq}l^aaT^B#39(q>8jcgMyYb=nFX$|#wP4fcYe$W9Roh*C_&^17K%@0#Dgx2T8 zC7iIClWxUvYo-a!&Q*)U!ej6)``Y5@3VIgx^(XS3MS^RYSr2z?JS>;S%cw61mZ5cE{Cz^&4s zk&mS3Gd5z-3KPie-W@6~jKPmDP74pEOwdk%9&^cwFVeDr?y+3NR_4rqY+=~|5P2ZH zo6svaoZQuRwvG_xdrN3#7Vb5bG;k*HCmo^v#i3f#s8qjsAZifY+d7pG?eT^ahBDHI zJS1rsE}BMXw;CF%POF*#aUdt26FyxE>)4PB4dj=CUFyKs_^{+V+C&Do#!q|$zVGwK)h8L!^R;3o}+3kVlaIaq( z@#05Tzic;9`?%n!js2|UbiE8lUQxdCc81Wf>cti<1qO4Wd!L$KRK?E`?$4=a+JLPVj8X}wW%3AW?)hbCkZDfeGZtA`C(?rj+yPo4c_Fkcc0sD)$^NFz zxVQ%CA1&#BE^1$5e5rOKFpcuwTqaK|YD*y6w|eJExNcvcbTi@cFhl4*(hkTU2=55z zNV^~%j*fB!b+qjXbL+>(=>q*#S3a`dvj_Pz_^#w zB;sQct3cj@uq3DklN$X91%BxW>FD>2>VH%}E5ow352*H-B76wd3$*l{)OV!o$%LPZ z)tQk%e4xH{)+%Llf*HlL)X?K`7WsV?I*;&(a%?4x`us>}1iAE47?2-@u2uBBA;t6E zGd_Z2L1?Y8jzL;cbD{VXH6KmGu}>6r?pIDe4UOLh0_C`u)Z;;hDE9wf?b zJF3yBZr^W%hynW_^t>y!1HyV{Y;~VeO%zGv;O55d)UH(&MuZ1c4-~ltrOU!7zii2~ zg+oGH+M~(u8}U*A)m3bP>UBt*ibAtejR1$@YhI99Ei@8whXYW(hKYKMRGlLHGZVZ= z94HsHT7cvaRjSt#ho4aV#_xqOXC5-=bB}RxD_M9RrPyU2-*};eOn6Q_y;yigwaK!{ zNSYX(g62Wt+J*fICqQU>`|K~m_enHvZ1M&lR`*K`5ca``LH%H6gJNdBQ(t~(XiGJr zIJ{OgmD=bbYG33bUo+BPv^V<@;*F+~?|=Ihq2Y#~dLilqxMFt(QtU9&$3R|9)QdTM zTgxbZgq{ZK7m)uX&l=9+yN#04Dl|ZN$f$nHo(;bs5#GyDx#R^_bQCoOg+3!+n@}NY z5$eIB0!F!{ig-CUzzal;f?|VFeHgx9>%zzn0BKO#v;Mm9m_T(JZqy`{_j%S^)M4SW z*{&L`^JQ#LbzD{uP+by;i)GTzY*u=aLU={`-v`D{eSlPJ6rM`>8J_*F3lP@Q{((+4 zI7~iQexGrMe3TbbjA`lGg6nJWxYnjNGSxDqGXXs~)wiXB_!#oZUm^SWZ>p_r!e+5P zT+~&syYB$1dDUo1@*_3ch-xNO*V_Z?$Ztq^%SfxpR0HAH-3_ST7Qh5%Y75sBXUnR< z3i)9Yr}*ZCOPsWIO-*58<~i^lcoa#`Gs0UYYAvFs|4H{W6ZsR86N>oP8dlK$gv)yc zqHfMs{^0IL9ME_i&RBi`ZqJpNSQGdlV>fKvd;xde84iZ4_Ol@^tg!ErY=9xhcuTnDfRL-|2K<)|)teCTq&&)Wc3~6xy^eeNZ)_Yno&5oTs zGuVyp>*ldlq}kmovN86{a5RkS02`gPz}L2t>9cASJv-)jD4QJ{a|Lg`Im90%hO>fj zXBfSqE7Warp4~a(h~E#=b1{u3fuC+NSajxaf7>#AkZ2-1ciD_SbRG|@WhJ+-Mf)%Q z&VsB@&uJe#NlxMmctm71o&C8JN6fg(>pEUy78cpubD|eMv6+OAJhRYB=LGaSKTM-Z zZ47@qkA!J2>Z;q?cVp(uETyEQbe7PnSJIx5wC{-TZ44hf9Zp~CgUd*VE?G1jLU)6D zq-6{{aX}Z9KH>PL{dMgrO$?qHQG~awj^jhOO3BrYFkWpS8%8DJH@}Ap^$W+=$>TAnK(w3D{P9ud%|Nt$ zl}irm)2S=7dY?+?6w1<;&a>eC`?ajufiiZr%mrxN6{lvu@&0Jq*VSVqh;cHr3C22$ z+RDy)O}T_k2!A0LuS#L z!HWXe*>I?KKMwnKVxV1WDVzHGCI4yDLU!eT(EoFpm@m9v z^b_g~+sih5OW_^)CKmf-C~mHM59dsG!lh~D+~R95>@Z{z`@Ok~{3+R%eI0n6JzK9Y z_mFhJ`0xZyG0W-w(CBV2IVWHYbiPAp3vO$h6Z!H7_M-K@Fh3n1KXZn{o9kh_A zlr!qf{zt&#>nS!dptBqknu#r&_<>dHiK4%(%uL-zY-ynP(n! z7PQlOmft)JkF{`w;;^4!QTGh2@NcGyx#+up5MHk82!HEdl)PH^htZR*Ipv>3^TM6Z z@5JQl5Im`G1pBBiwfU(l<=y^{$nQ` zE$FYlQEq_f6a7dk4HV&gA6mQy66bCa_6D$ zqa7@{upXze<;ZPdi!>K@w7bU%dtpeoc69FZPSCbBf_KMWDdwA7C|-X~z^CLa!k9$x z{HvpOoE;3s=C$ESL$ew@DLt2fOV8et1jZ9S@oBBSIE}xY+5bb0mH*|@$rM!aO>5Xt=Ojo|a@+1@2y!z;dz+~K=8>Te>G6Omtj-_>Qv=6Gm zY<#UdiW7zbk8O`Dj~vh(8PH1J{Ph+;wEY3S=L)ln_av--!%SDM7xT@i{jfDH8f;qj z;Kd#F<@r@U*>)3js9k>;;UW-LNg{XFd4|Ci+boQh=uE|iFB#rH2`?U5!0cu@jJ^k^ z{#hchPZF3zePIpm)z%8^>|EUe7wu~&eWr6lN;d4q<=#KA@aAn8H+&pKB)tLqwD2fkGs;`RtrGHGsc)QZ;Qr&*T zpe)D{(l;JrDP!BnhI97vV=eMwxwkjXRU$qQ+JQ7?Xt}h2Em>F0>H8IzbHu*J=Q+%WEg$>ZE-%fnlA&H6H_oe%IQ!hQn znTefo$vP**k~Dm~a~>q5X3AEVJ3w_{7AM{lJcu6}wcroJLj{)Od!1j>Tkk3)M#EpM zwVnUOOx~@mhx=jimH3K~3r|E->0>YBk$>wwdhq zHW&gf7xRZVn``c@R;eE;a4|m_CeIzm6RAFw{Xkc)vo49falC_W|L9rBL(_rv>5P{@ z9c72yZt%#0Pi)Lp&J{NcwPEYVYJgf;)2@=qq0sC4UW}fahMNBZpxnV9M~z6N^ExJr z_{Gw5ZRoj57kT&7Xt*&ih~2$Z0v+6z@WGJ*(!Zs&pVKVPJME6bhj}raFcl9>NQUhX zN25+%s-J#PXsnAhLD`Y8==foQ8;X@q51`z|3*8#3hws0Ei2*6>t@mt3pJ#-tY{BqI z46AlhS)UXx=DF7?bGX!HA$ol5&Ap+Xe8oCL%rg`$r#(HquOndwi2S6O2BF=|w*Hmk zG;TE**jjC?xE}Qpx&xb*r-I)=!4YW}VRQ zN=pztk@aZ-pRwEu$XG^r?iI|Gxl-4z)tkM!ZIN3h}G*dVET{xT(hIT zYBtRriDx7lKUCae=z0NY`mHwWcXEhqyn8%v^bDN!-Huzg^5GNa zwUZqRXg%%NFF3)0&T+9h%@*aP0O1pB7k3HXI8I_6`aF}SyKGRhANW%4=HrXntUI!_nF z2Ae+2SuYy@ZMuWmbru8hHjh~OM4EMzxQDd$0_zZkbS+ZCsakziQfkuXP3M zGcsM$ockg)Eq7Uemp@@sG3I~ceX@^f1*T;TRK~^zeIvhH$V( z`(3L&6(b@&G;_9Gg#~o3&hDp8Wzw{`dKH~7w*M%rrZvzns7`a@f-hdu+X8EfT)}6m z2f8ci^s`!e5Ki~LNaJP(-$0=w3A2DW8ZWdkAdQgE#!V_`nen%QFsepNk^aU5L)*iL zKNcuGuv9fw>!H=e#{BU8rKoKi3a`!%#8%#P7UP^QFr>jgP8bC~pJr&$~aQ}r`Jl1W5O1=vnZbz`rzmC*!i0z1(Ow50W zwsQ!>=Lqa(#50-^K9$5-TjBC28yvmi7}!pJ%sl`4An9#BGVe9`t_$H#Cj&5}V=ml? z*^L{%b(RSK=zDdL<_0JRMO6>K)*rCsS+?90!Pkw0tr#kH>?5bwlO>T42=vvApg}I(ICM-34tp^KR;+G{@3jr(3G)(_@L7*w?!k%nw~V^*);lfP zfdxmIr;(nB9}x4kdQ~16dyPWU_eh!#2;%u9G|%ouE!I!Y^IlJp1? zw{X$~+;qT4F1)gcXVN@yyH_uIU#T>~)rw-UwoKk!ZrMHn1&3#R*5J|1({TQ$u1fz0 z;yb(;5f7Wvi@ETqq$T0vp#(Vmb~&_vcZW@P`HceeNq;fI7KN?{i)jh1cG5a-QdmJ_ zX2__mNFE6ae2TCm|I2S#b(ba?U649gC!te_4|p1F!>&ogAWm}wC?+{+GvZ7)nDzXO z@CD=@kMbb|S)f0gD3pVY_gDL*EK;#K&ZnkcVDaC3x zBrcI}7PpdHc}LacHR(K7)a)rlzVs#ycLFJPYCQGjs$@=nn~~PwglUZMl#@>9&vU{_ zXTD||ry=olH}=Hlj_?yTIXx|32TW)EN4nBjB|XAOH=u}#&qcB%usCAnTp%4NxR*`Q zRwDUr;v5U%gX#RU2>v~6i-^ zt!Yh>>J${efoy?U1LBaroN`0$t#6H=UpcUeYpm6Ke{MjiSEkTySZ7!ZTyC{pwEOJz zu90AHtb)<+d^DYLOZmb`&jaaG5S(lOZxx~qHp}#i@&CEqVPe0B?8aL7yRWt8tH6+a;n-ork#^VaGFwYH&x2)xaIXJ}ru<$07>*rxsUJv03dB<^d9dFGw6_M*X_ zNjTFdkx?7j$DRi%k0V*@WBY6L_IsW6Nc=$ieHW|rH++A|i1@^vk@tnt_&qiCv*}$; z*|bLQx#%0^0#Ayag`{)w^vP~mJR*pV{WOSgWSK%wOXn)43%w$EMtDY=hmQ*R7V@8d zY|oS_TB12^^XqIEdY$fZe8l0hD?Kx}AH@7n{7~%g zL()auDMUwIH3*f-gPl0lIXLNcNnrEgtZhu>*NW(UNdL#JXX8-#%apA)!k@$D@~gbd zN_&-bnyTCRI}>=|dteP|=)170rv_4QYZ<*?y;;#lJ=U!Vg0f9j@@c|{@U#f3=WMyE zynp|V_A5vSk$1!$iq7#`^2C%LYVH29n0%*!Ds%?nE1f_8P}CZs?SB^;>0UrQ;A8S`!V63CQF|1cpRg3-)j%ZOD)~?BuYT!K2BaHQ@f^&NmKG@L zqEufYjk6x}UZkO8#2KJ5=VI(gQ-F~n1N)MT#66ucq*X@|vo$<&yVohU&G9s5U3~+xi0t?c3hC5~v;_ zu7|Y}X29E>Pm$(I5?+=1pbD>eujdSC`n0>;W+-Ee-G?&aZ`XxI3p}R!&n_g53$<(S z!YR>r>1>^0NO3I-JxjGIKGwRJlLm$Lr}yCn`%vr>IRu0r(|u&19#~+bl0Rdl)tT#2 z9V9&0Pz|L&)m0^G1EYEy-dQbEtty4lSaYhsl0L8k@`{@KQ7cG))*&rId!by&;p7!* zU)I{H;Dv54$D>c^Cq>l1M173(yYS{*j4^#5tiNc5R6hjL$gD8$27VmWK^6E$H5T>7 z$L8p?zm8L@xtt9&7&x&k_VU(H?b*GGL_ds%qb zElvvrPjJc|25Zm2uW22?WeF| z6{7d3210`}>MLmC42AYo0=ES+8XHl&z)8J^lP7Q%Ttl^Dj<0UyA~69s3`9*}qfG99)?sL!V*m`P{rw z7{0H7{rW;@x^-}6m*`xmdc!)y_sl|U;~x(GU%aueNpFZ5Yb;MGuaBKPo^T944x3}| zW4_%Q=vUGo({6j>l=7W?OL13t&@YK^r85dHX87PI$1NLc}s-wPFcxCS9;^w_v-X7c#7ET+xR zW)8Qepcs=az4Nfm8ynnM#}>EV-iHTfe~OP7%D@@5Z=u&1dGdE(l8el3{MwXS^ZRnH=mtV~gNYm__FTyL{@c>R)e- z7sk%vJKvtgF&Q6ubgK)>pi9;G=#mp#)ounHr@hx2-!O$^QT_1R@m1jJxF70nSc$va z)>gvJ!tr#Vmc1y`QFUK6L{Ec1-1|%*jg14Y9i)r@F zp9(`>1T*(BR}}5@8~pOE2sS+DEeko5!TY7gLebC#nEI!bWoirfqu+7Z@#=5rnX3;S z&xi3zGktJ;2VFS1X*jg_JP#<2SYi#h5yGKGOH# z)7-`~es<)o-2KpL-Y^)Gv646W_+H9R+N1r+{NQ)|J)rpk-B&?;`p(g4o4u1!-yq_O zIfPwE!Uk`2s z<~xqnq1ycqjYk^~95rqa_MaCIPibv1#fmceP+g@pWuhcRZGwzB;2>dN>JIVLndRjpgx89GT^e9CX~+7w1IKdEL6PEUmB( zn>15LU1M|_rj?C=PnY|#1Z_NQpql0GVmFz_2Qmk3qJzx$O2O!`EyIz$~6~78?>XB!Ikel;p@G_ z6chF3|5~)it55v+pAQAB+@uM1X)Hs`isK@m)#6KS;Rb)oYB#jOhO2GWHPH*1cE$l% zbA--LZD*(k1{`L$2DXvC58Z*G>3?_!+OJ-3OCQ)-+6FxSYszXz&VWJpS|}Yy6lhM_ zje-OheK{@b8b2(>ir8nS6KH?AJITtdo*ntuRgEC`Qn^440XuUS_o~K#3>7hIL`OvfFX|_zX zYtPc9@}~a!C@_OCj{5iob-e~7#kbPQW3Jrj_Of#fAl=~1bfGKf_6XmaHqfBk;WU&IecW-at@2R!;~ z8=YRXzx#)HfxmLE>nm`><5&$Gww_XdGT5PY;4_bT&MFj>%OMkvLoNzIlXE zJ8`0+nK~x#5TxCH$6Ds>Rl=swy#oFe&sE$}^6kFL!~ulug~}fN8{BDL0j}yBhEEI{ z@*&F|L`?Ci=0jC#6TVDMgq*f+jOI_1)Aoi$`3I@1EqKuELVV%vD)<2J@0IzMeqnM`H9U%*CQ*nL|?zQpAWsjW*0Srb}tt}b;&^1Z-@@Oj9UTCEQdg*RVB4y05ctWpAl}<#1DSX zN6Jlg&ejMG=`VrVaBbLBwsN@2LRyTH3v1IpFYb+i^aiJR#lpR&K>fzznDLA-N2dH_ z@+Sijd|4hh9A_7W@LFrP3T*;Wb5*7BjmVn(>f@fq%i{`>Ur)g$+qPry)_F)=15Yf! z)x?L{+GE5)=QXV=HCQouD-xD+;w_Asxd9h;NL7{|?ttBI^#;Lrx-Lni)vVO#Iahe_ z)~7hUjMfbuG*JmFwXNLiz?CoyW%{CCJfrjzo_iCBq#Kp=N!8HbpVOF}gTnTg@ay0l zP8=eguIhn{y; zhNf@C*l;J@KfgCVdy+=`K76(d{kDwLT&jzUYYQFB4oj9uI11OSbCd;j8X;*gNE<8B z{wO6tcup}D4KLhn<#E?`6W?xCNSg@01sZ=EBM+eXV^)0*D}}Ywr2F*j3~{h@gU{n8 z9vn#zP)>WIgZ(N_e-ru#6I}e!qfIrxck(4C4Z;-5B%zU|_nq$J+S#q)@hz;;PF{;9 z!`X#p%AE`w_%OLE&h0uMOIwB#A7ryBx$ZDDw+Fszv>pa5h)^y<7I}joBJcV4?oEKk z29EV;$xk@{5aY#09}0k?39&$9OSPNE+^BhDb*N1tqqeZ&?i1kEoBND-Or?HcPugeo zZ@Xw*tX$PntY?Zo6YikH7;F5L7Q^+^bydPLPH_eYtZYel`XXTyM7>^#LOX>$zMv64 zVPwfedPcv5k#69VUSwj-ZAV$?o3tz!iL@#Ttz71`j|trswe7BANBi1QU)U_8o$&5i zTkW8GdoinF24B6VnD2kPfcPX6{-u`Smo{xNe8W-FPK}f!6Ia959|{gTL3?uj8O4QG zRCd$_eK5v&FsMb*;@A1E1{!%ON1iax| zO1hI{sHavrA2pqLat8z&O|9`2#6@^Mc^6LIcpu3Zaf($wG^`RHOt?_`*Imr+jxwQG z=%8k(boOwY7$7~tVs7UP4+iCZda8o!Q&-2J^T0)%yd2?Au$D{{(V&wZiK>CxqfqRk;^a1h~@F~rLIC~n>7y{{F818-(wa?vfbb|xLC6%y3 zzcvQlH390Ytb2Ddn{((S^y@Q*x6iN=*vV$J%OuUMVJp6jg(Ze(VKQq6f?GWg&gBIj zdA!Q64Bs|?%}G;n*99O^eygN`YCK7D@HVaRI`wzV0qP^{*|cBaE|C9%#!vrA8~4Qv zO$fxxjQkb4#WoNe33Oa1627x7#mBTZ@Ad=fJy=jD1lH|J1N*cP6c{h^hx!f%I^ApP z2b3Rb{WvpD9vE*nx&}*LAFx|uXpcd&hhzM)G%UD!pC=4*WffI+jAET_pJV}qjkKpk zSAl&sx;SR$Z{bH2;y|{uGy#Gmqsc?O!~H|eH2WTXWzRO6aneAF;A!W9FPR;!T{RAk z6@CUP`sBN*jK|}qzh;s^1;z*9)9~xwV;P5fH;8>*5aQJ!#LF(REkkr z=P-!3^BqSypIxIR$otiB)RNa$#JNXE&l#)4Met*JDUCrRr2dg#q`j`k^gK)c9&8>g zWz&Y6@>6!DFlKrX2woOg)oS58K77%3sCWE4)oOkzXZ~Hl2Ci{JSMax8JK0hr-=9$S~z2e&R^TM%(6RmGP;JRbboyl zW6h~X1G{$JM4^`{{)A>gQQM#z2uw04XQc6%=V^0BF$SbHfG|kZ2}FGZ%wvj>xD5x* zaZyQEv1;05=eVzdOx_yC9mogYR zH(s{yO3zw^l6Uom%9P{$r3ql5QH9Xhly_kQLpb>o6#b?)a`G8$h(W4CH6v&ec$-6~ z@km-sJMR1(B<$gzE}!9oH;YsBvdANXrhSKYgu>!fiw5&HdSr5*Of)x?DKX7P1R)f=u$B&ad9W@v7R*E3l^Q#nPNXy_#`k& z%;O_d2a|tIV8kORG`h%1!3X4@AVaMu-*}Tj9^*8KIvZ(g&FNz|u|dTcT-osewe6tL zf-Gv=((+bEkRV{4sTDC&F^ z2eNIlyQn8h0!sBZT#_wXalfr~gIx9;*Q{yTA-KTq?q(N@_@5LMrGHF$jr!Xe3 zJqT>ktM^iw+)N)xTg(0-v*1kwAHw_>q-ma!2ibypmV20mUrVG~l6<~V3Vy7;8EI@( z@)t7cNvw?dtrR^NP3`ci;ruMG5}x1mj?~kpHN0x{iw6x#1yO^uDlz1Q3*^N;aG3dC zMd&3OKhCGj;H2%;QPsWzKcy@$XV90jQRFjeUGi(&S#b3qe4N=@rTQZOwmX#z4fN~F zb|9Uo4!5QC?G7smudBi7zAu*A(2i`g@evUxGI?)Cb5?Wh`6G7#`7Ji&g&`1b z!si7onb7alMif4ae5$A^F>m=iy|y37x52a%T^VU}QBzZ<#;;?fIi!1?`l=MWobX=6 zHm4lK*Rwi5r7GftJe@=_3FHq&eToZiUEg^(qZs7m`>C!o1w}pex_1|#@fGzf zMjBuECwX|86(bFaqV{ZWI+f<8soX`O3*@sgy%c z@qOrO&6kvkAi+QAlQWbr?S7Ao+TI5`U-97V53FCGD?r?f+1h|1s?FqUT!bfw#J!cgpm!NBj&p@oFXrNdWed^!-)ZPf^~UePrRe(CkdIhO_bb9W zKvlAi%mZ?HOt<|!YNQL~l>WgMZ)oobLsQ(|tdY{H{}-uoL@#`sm<#E5{MfsmLm9ysikpwT))2BI{$x&DL5e; z7H;y<;;fW7Oj!5;t1DmnH93D-K$>34|iEmVB{Q2Y7w%t8{ACGMu4ni9eD@b0-H+9@F3km^#0L z6N|F2DXqI2_i!~{o^lKHD(T$H8~W<8A1{^9yZ*6YT>SdnBlsdJ@kRt%Sm5dob~=4ZiQR9v#mw0>{Uv z70eC6>S_c0(8O47F|!`5?~@5)-WOXXfoaQH@N}Uclk$@B&E2&ixf~I5%LfcggK_QZ zt6iU2uzj^AW5+8al<`fzGd}MJWUmh7{s-4$(fn)d_m^>C<*}AInbv_P^*wRSy8y^f zx&mVjcHqOKr+J`b0ff1Yf;#z=af7E1Qaj1beyC3nR_T z@I|DGNgt0v>#=Jj8Y5ep6Z}eRFnjKIferCXH1?YwX`0ckp3Ff8>I?Ueti4aZ=$||! zcmcou&pN07w01ag)-Sfvd@K7jEQ0NMo4}gue$txR`XIFjUb)fPs20Asr4!d=KK4TD z6Xwhw#!p)4s^Z_*XT@x{dX?YoG83lfm*S4|Ml9>t0O(BX)+mQy4!>qM<-d{g!KNvo ztsKOAY`Y3wFJ8t=2V2Uw7Ic9{-tDlO4Uk9A4#0$a({Qd|Jam~9!`D~U!u4*o@XLBL zq~DosoemKA#h6j!4&Yt~L4M++7cjcYDogj$v$+feJrT@cCYSmD(weQzbOL+xUFS;QQ7`SBHk*Nwp8<9!H!*1#}LEhunphTFD(RRmtO4jKd> z8w|%e9{ZU8I9iXEq>CYSN1|4j_P{qgiUJS3gEBz%*v085?^|~wr|V;)Q6;CiK#CAl^8a!gdvwWa+%Rsf?sGU4%n?%BvAj z9kfcx^)^>dHP%3r-X6GZQUmzs;07S2@K)f9)v!Rqi}$eOYfDfY45-64d3&u}W$ zo2E^P=7cNU^1Z@qPiYTBih8rQqb~9fa~w?Vz!PJ-7I!c{z)w}6Y!`d>UR zzDG+j%Z4Ay#3YB=*zrRIh#a#S5KZ};h`W1^gPmO+ajPrUfO>oI^HD|2ZyD_Y_2d~I zYu;Bqbh`_@T3cVH-}&SBOZjWhL4v0sA~hCUwD`;ghv}_O!Y#M9v6u#KAjXmM0Rk5q z%k#6X)TayU$i9*nocT}2BVqHPeNU=={OOBhC)=~Tow|$p#kZgTLp652Ho}gcLm87R z?X8!{Xa2mxm7fuo8HBiR20Cezc!u_JAJz>lFTa<2 zEo>$K?d*yz?9XZ_PgGq!ccj<(h)N&ay<{(Vk9~=r+dHGc1o7Evt({p9lWUN?b}saC zbR~@ZgsT<|iBgfIh!i2AI(wbW$qV3gXpH}{ z3k6?Y+M6uu=w$GRa2mr-{Iknba1ahy{1j$(-ot%2CjxN>D_xVyJq?%h-8Jd#xlII~ ze)d=CX_LyzmR7>VBY&~Z&QwnKbMBdM2|4RevZyeDJw=Q(4-m(~paZj6&R0iP*qq+c zbE^-xPTSy$jXhOMhqI^^WWk*tPXry$dwh!L2x)5X*7AwAeK17&#Qgm;z`V8)cRj7t z^hcvxz9;V1e*&FeTmsS(be)5|t;biSIbl>2DD;ZJ1DbPQwsbr^q3?+bKFzh2aBIDm z%*@3FN$;^;ar-d-b~!HZ{TvtW&E$Lc+u$?(`a&Bjm(g6JxHqh6#tllx>(|>RpgJ+ec_jm1+QO+qh%9-!X8hn>nNU zg_}?|F`2f=Mf%v;Z<9ftLVVGk-JiYp& zVzqCJ(49!wiPtvYaVqs5rwF}E&jzg%5XAp?j;iA0rmhk_!y>fw@GYGUFY1(kBJE(P4fHWWo zEWTHE1c+lf)q(s-ON(^RL?9gl&9)zfBUQaM`sst=R#@9Tl#w2D-kg0IsUP?>4>LI0 zgY;qDPnb3%3wzpFidtp@f9Cg?Omm!qBkA0=p+7?uXD4ge@-iMf*8eO09C3{cTq*wR z&O#bTGNI=PpBQNr-XP*WY$$NW&_2;@Lfjgb8r@0W+2=Ov)Yu3~PjfML(iJD88~r9t zorc~ewT>U#3htN5Jiz>2^_*B_u z-U@3A3XtwW&tuIBr(MA8zgo=5$Wh=e{wylP*IPFbE^bBQJXo?On~yxSSWy#yp;2T$ zEHj(MP3U`8eLB=Y?UztYfex%`&J!u=ttF%Dve`Me(eWakD-gZ~XiX$~F4oY)hGoSZ zL$@z;PqqvTMY@KVZz;y61rMtKflcZcPx?O!jDzO0o9P)yni=~}?J9VH3vD1cTD!D8 zkbcB50h@41qa!foVJVPj;O~FvgUQafj5Iy0zIy_){|2FXgGSi>UNZ6F3;ws#T%CJ3 zO|fWo2Ae&Z3G*(bL)+{PIDU9@p=Izfovmh+sfB-srD!}C`6&$Uk5JmE9T0A^&R0yh zz`Rza3x!v}kj4$Ee@-YX$_$vJiZ<^x=TGww8c6j6b9`_*t523(|zxiW? z7hqH~oJS1cV%~^9g|0>7Ff8yaV#EcUxC@5OC;;P8buoY2DX6<`Ja%>*0cWPfaWRIs z#hYNxlL>g(@D(Hd2zuq&^j()IBppT?YZ)6l>?Hau-9b8kGibM+AT{XSNhbUezK?vB z0r`p1LfbHx#*bn10II7f+Rx$K2s{@+Ui8cvE^vxC1&ODb;O*XQ0{dH;g2eMemvf)< z?o@{hkX2{klIKrY&~e5Vm(~y;%ypSQrwt4p<^;rVvZyEOL7;vnZAAO1tdod?B2SDt z)1Q%!m%Odx$VautH&OjzLF7R^5cov%^Sz`cq_4A6l2)}7+{}k}4a0yTSx940^7JBD z$J++*q)UNh`FIm2?axyG9N@;?oJdc$p?$-@Fj1GQPUk~to6|h^gv4oV%mkfCV_rh) z8S=L?>GQ@DPGOmSVeH_aQ26cwCk@CyDF#fvzgg51k~YSn5$i$rd#Le2!&B?YYs=q) zxE5(~q*|5kG_^y)`=6H4XDsFZApGO6d)I(4UZT2S4O;l{^&NDHOZFi7X!>&$HtB4q z5Zf)Zf|A&0w_XeIOo0;xBq03m7qt-s_M2ij*zjtH5ZD-XpwmZrnTzXl;luny4;& zI%CJ%+c03~BiMW`4y}S+Vdb2c&~>f{77dC;(#nkTl2eqCh}wg>8}4z^x2&S`L)gNG zvoEXSkocZcO|ax6R zoJEEpygBi?m~$X~h2;Ac;<%G-Rz|_*>|wMIVrLkY6Rp9Lv*U&nj`UGmRyfP2zBR+c z8RU@?e-TIJ!b)5!J>Aq-jv5C;+jDDmjgJQ1oVr7HtVB9leGOM_o$%*4| zM)Te5@qu9Sr<=gx%`M6hUIS?YI8^-{2RjE*&g6`g8IV6M1^WAv!!8Tx*T)Y>$D9_P zj6K}@vfx%=aNnv&j`0@jC9ufj!5X!VLHEd zw7s-tay*hJ7G4&J_f;B$&{A+FXQ<*o+(&pQzM8vGfHF1|+J^MM&{;^B%swq!%dd~`fYDvf zbJB>MaFCI9MZz z7@JsV8Ak8e2Yx`e{k=7u5q)n9&MLQ*BP)JL@2X=sWgrDlZ%CBaoaVa^++*Y;WEum_ zdnLM^50V~i>46!2b2xcyY@Gl|zEu`FqQlT_NEogP+$CPr@G0SlGH1ILo_rq7guf%RgtUGoWS5ed2HCn0w7H0#BY=fC5n7Qlcz3ov6s6QnL)?n zZuGpgU&xT%aL-}}KU6(iDyDZl7v((`7!BmF*qtOh*lS`VdS8?4taf)q;i)4lR@XWB8^o6zKQsE_k#o-?>2kGOPcwP#K5ZtlZt~EavI{l!k2RdzZX!G! z$RB)B+{brwE156{R;Kr2l=EPF<1I)!5$Sj3p_M230MDNucO)e05E2GR=WWcCb-c@Ks zsI${jgZtQZ5M>I}k@7eExTm=$Z=^m(%65@*SB(D8pIvo)iT*>Uz#@}Y_}9-D8^z6F z-(G%U4fpLt?-Nbg=lkP0^*JCyb9?4KC+bGS8k0e|xK| zY-rmQov$?mAAXn*NTdCk_a0)({zUkp(-X~hAI7jcm2BD7WAN{4JLzF+G`?wnjE#P5 zjJ=LJ@TUeF_zL?&(vddl5M6Q}GQT{)3!Cdf3NFAY^KImlFOEULh`+euo+-vQ2xfaM zo?+7X@BHwzzR+!S1Ycgb7Q{1{^bLl&$zAcym4WzZyBB=-bi#l0hpMAm{nk9!v;a34 z<*b8-w)DNBzdw~P;eUay2@X@5;eii*=sB|KY_xk|8v2gL)R_Bitj}ZOwUk9Bi7YGU z9L+@u9N0PwT3Ree%fEN%eS1T71)Z1O)9nM>+k;8pQV}9%jAWCvF5ih35L#xJlnS zsGrv#&n!G3>JGZ@*#M49*Tb>s2J*m||8V$-n-3J3hqAf%|0pJbPw{2jSPY)Ll`q7`VD>c$#2Q`*--)qvutE80;1naHnKri$9b3+G?3fb0skb)PP5*?JuMbd#C=ep`BmnJl~U zXzc7@s}78LL74KEAG1B8d3Lk-v)J(NI%u)_s3iKFeqctgmJl~#KmN69j+-NgajG|7 z?oOX~Yz)U=CXs;u()ow}&6w8hjUf7(?uXOw(zyx?>HSiJ4bbNKQ$ESpLT;aP3-`aV zK%L&s@VwqwUeP`nmPaPCf}|rzYXj7y*mQ0bqn=g&d({JIjil_kw$S>`Q6wyrKR$MZ zO?IbP!=DY+S=KcyXqb$nLr&r7$MJBqER{Cna^kTrGuf1@!EEM(gAn`d8|u});C#n= zkJFuncW~1tW2_SusT596QC_d#fZK+*R?nRoiUudA;=s2>7@$+kBRT|$KES#6*I>Vw zd%^PW1b*P>L0)#y7>iCF!u*70eEXLyTphQUyXpqP^1{EI#!F|qYvD16L_Y6GUD&iK zo>#7I3ZdWMU_jbyn47*sU<~dH^??>Qc4K|FO)RHlGyI(101{`~A=MdSBAxH&^@8y0 zrxJ9?2xfJ6hhek3K##*MWIomiDkwJ-z2>IZmIqchkO^Pm`oP8D<=T{@x-)R>QU%g{ z@^{Zdknm7`lCT6sO@__c39UEX;SGOA@*R0c@n{+4N<*5cEvj_o4Lzc8yO$0S{$ren z!vD>`ggxAmo;4mmK0d+4d>fffP*cJh(O4stIwiOHM4j!>vBgz(x791D?;|H5%ocnE zQGxBndZ|=bFnwjN@?7sU8?KbW*Bzr_$)b)h(cqZM7B-orQ_cH)C`M>y^EABg92Z@-O?b(+8gzO9tvVBFBd+_R^|9=vO+ zes=8!O*}3`&Ur`5B@c&qSBFf?GY>d(dbnTdeDc zbRCGF))a3xJc|=11tZlidR+{a60tMcmZC1v9W*5sHm!!ej70sd17Zu`vTo(ApspeI>4qoWkA7ZKtke(SI zY|aN-d(C{6(tfCaa{VAZqdxbh&&PkAZUxQDf`q=n1;;FLu4`XuM3YY-_?_xR-Mnrp z5-&o>B^~g`?-Fi%X_h24^A%&}%iE3vF+W!m`UCNGLDESN-ge(`5ImKF@1*qSx0tK0 z7I<8!#3G*?F!O;8e*aW0_#Uz^*M)(OztA?ir5sumDR>*dj7&ti&3{1Hz*cQ^f`(Eh z(|!_%wwIpql73q1o`(rS*MQg4UMSX>owb<_d1 zw~@F<^4fd>hFz>DI0jxdpTZwS&xN8>ol%>GqE=u}6#PB+PdGZxO9XNK(mh>(o{=~x zN1^%SORd^5&sYQL_R{@|Rl5+SCYwISG)q{TtUryeSa%I%I4mtM%2F{kmjh_T>;DeIPwa_>A+%x8Q_pNSL9D8X+Bp)bl9r z7v~`fU8wG{m{s7i*+>-}cy8Jvpt^Lv_N#ykEf@PN5PqcH!%mgEkj4T1w&(G|NsGYE zZ155ljYsPok+O_)JT2?8sU zC9AqCU|ro%+;zzcQ;H|>W;0Kb7EEJsc@VQpumr+eMmkm=Bk#wuTrDKt1Y%bAJ5YJ@90<3R)5nY0n!zb3 zIG}#yBuqMajb-fPPDz&A=^f5&h%DU-(Ak{$y-K-J7$tZaMl@M04H%SzqW-2`-$VV; z8?)zT3hczs$!)+t^8~jaIGT8?0ET6(!m`nw`0eALz{A=ehZyV1)*Vx!PbIzcyUALH zo82TQub=#COeMU!zL{{l6F8kh*ifFMkRHHJWjz$CN9vabn0<)$Y$D7RS}{MSBj(Jk zW?O5EuoQ*7A}u$h0o4~BWWIP7vqRObnHjC_DIjSU<9J%Gb5(*EPL4rc$tu-W-|Y17piydbF?l6DfcpyUQ8 z^OsYmW5b=@iHGWFbQa+}3rL$M5!Q3kHQ4=EOPTzFD)g<_)8lMT&)4knZxfX;2YrpX zv+x!>mj`RcM16$YQ%=!`ig76POjfgGNv!kMeNp_c_cB)Uvbm@eSg)_AW=*JoS=W|8 zZ|!mLrc1KmMSS$>ux8$9j_9-BDuJU&n9YudA?ATL{4!~%!8hU&c6~pc%d$sSMa>eI zN~A-e|E?5;>YS1O;nV2zl=!;&jQEPH4Vz1*p$oA0*#>H!*-HL={~GKzx`8b8^5|Du zD%BPLx}%((nwW<|j}HFm%Uzyo1Mwjc#=t_{z=YP#qw^n4pIj(NXuJohKJnMMafB<| zFrwHRYTiB;yox^Fw}7;*(1h5tA?c0W<}ztNp(A)&pMkv2fB%@MQSt&O{(66vx_|7d zQlE=j;p0EK2;axY?l{Uutr!D3efD9~z5YNr!bKfr6=Z|>XI#!U@)ipqDo794xbzf! z56zFz>6K4Hk>(bOwPX1@84aq{T7Kw4Mm zS@`%W6|$GKPzg_*eOiZeF*ia(Ty!$#O%ILdgtxrW7n!>rv}VC$tQGR4*w1zmUlTE( zQO%?1Rq9CsX}g`TI?mz0b#FMgcBg&u@~@-Kqj1P>Tuy$X z1tZ@5i=+zTY4zJg6lw;O&9+zW)S*_@uwDTuuE#IQ&&8d*?)>S2chtW1|Wzok4 zY#b1$!iCMD!ry>L_ax$5%%K$uAMkp8WB4&?FX31Q`<9u`Vyc}<>$Zce31dmG z?2$6P=pE6qM)Jbn6G8N~`6wF=?#0k&KUF;s!gD{dmp~D^=57V~exfqvY8_c{y`xcQ zAk8chXJc17uXFm{Xud;D;zJ8ff#w+W3iR;v{nzlvKqbB3i!|Frq`o5zi-EG-ASHWA zETc7o`8#Ta$0HxSllJbt%)8!xkLNn;0qG>Za7Hq__c#pxdwdbdGxH;DI--B3BTHUw zL3{Fq^80J1LCpvz>IX*{-6x+H#)KxPI>P;S3vs7@A-*+Q%Y^@>dco1Oe}&+c4s#g_ z4@({tX5kXp~wFB`;!s%JNhrAm1$fs<^-0aGxpP(V~$odTYm+ zI~or$NXuAc1@L;MC28#_B#vNIukd7C2PEwxKlkejq*u5$y;~x%g!~=zh|m>!SH6E= z;zk_?;QMRSfjko@Oyc>st1`@?yh^Vtk4 zPu*u0lzmfX1?SrBL!sR=y-r}gt6zx|>f@^QrA*ZM%x8vTZZS8wjr5G0F{*7IzBm;2 zvNZbLWkP%4T)6@S#&lXRQ6UcouwA`HHcgW-ou!Z3QjnAm{-Hc9N zE9sq{B9+!pnQ|@xM=gA*6yG#Q%GjVuPJ29kydO|qqVDi6a!f^;bDgM$D)AI~RToLW zMH1oZH`=YMloK9NopDb5BNN`i!=Yy6m3l}9miv+T8XDgHr|}oW)iU{F==W(O?{PR* zTHslNOII~xC65l^)|yJ8r5QaxJ3wb(s7LoQp?OK8amoyss1f2QmGGJSw62e>l49^- zY9kqXHWc1K{nqb^&`P+xQxWB#dcv!cPY&cSFQ$bcMJi628 zHIy|LFFB8&VjWbGISLOUysJ@I5)$4CtfaG@TTmStt6uNgvL-qEG=6j6Kz$&;#zp4# zb^Lm94a$-{zY@V}EH{uzo2dScwg~Snv?ed@I|hZG z-4l3=k+($3Mp5`=^6ofu?R5-aTo2YfD;All6#RLFOgN9ki+D3*4kxdmkjJE&??RX| z2M-Rv%IIE9zeQ^x59B0r0?NYFZLiOu@UkMK5xE=-X~J4>ngFC-p#JkbAaBGdi(m!Y z1_}J7{9%jmFr4sFBJCxUP7%*fI&uPEX4gdE3+dkGlE4$Kz&tLvoO%~2E8|q7Fs$KC z(vbS9;H8TTR#Ao(0voNy6bP@>rM3faH_HrCitmt?uoro)6m%$#{YdksJp1}1o_A;}LhvguSH3?Tds2Qjbjx3myB z8TD;5LeexEPk!*YzD)U}a(S1YN?Kg-0uvsSxE+_TJ3`s#ccIZ? zSb(uQqt_06J3@sNQ5m&dX93vO40>c(r0;)m}8Cq zrmP6bCqePtNt7!Y%Xw9{lo3W!M)Zi8-kZ!s)e!D9{}d3mAFsm|?zG9sW}$BSh* zgccU_4fO1k&DSag>^5ug!JKjk16AawghO25dWXw~NYAg5ZiXIT-T&XmO}hd40HnN` z<*hDfD{DGx{5a*F*s0qFv@a}_^aC>SzS~Lmot;s<&+f&KBbGx|{pRSkcE1wfor>2^ zam|0rJ8lJY`m5xXbg}r^aaf==1#dpCBRfygQmg5GG({oU|+7AmR7tnVUD!6{~K-Bk6M!N;oIN$LedQxVUc*Ycb=bqrv z1A_RpWsiBXixD)Q9ss>+!hm;_IgJg~v+1C1=mx{o&RA#YIh^ohE9kA>C}$4$g{;mW zFgXZtLbEK%J$DEer!__Q@FTp#uxrpE@Fhb0AlyCVG?>=c#d#&IpW7g3IEzX0ltqa zBheOw;hTP;t5E_By!MCg4lIT>kaheUsp39< z+yn|iC-3=1i z*OW@09qxeri}N8V^$-*rdf|n7e8;5S)3N{mT<@^_ux2mRXy2sj~|L>*^;sW8y{<^jGE|!!NWEv#k@5d zKkg6i3-{9d>U;UHek%)hHz2Ru)`eyEzQJj%XlLhyTb-UM+h%QstQ){`U+-b#26rm# zJLfa5@HB>LzFz!iz4LIQZXnRJfZOK-Y~+m7{O-CuNTTnkLC{I=y1tUn3{Aq|sXK5~ zU0Vz?n~wC~3c_^{L$S?$ChB_k6nB>Sxij-MT+dg?QJC4=lius^AiuXejW@qHMf+JB z#2nI}W5CIE1{6$oMyvZx<&60wmE<|yF!1qtD4NSrt13kKSNWO0UoeYTm&L-1Et{mz zYxZ#S9iH8E?GGR)|q z^Uc-wsYV_t4k_30{e+1)t*SoM{tXlLi=$eeK&m6r^KxGMr`)3K7KZHW17>n5==ytV z=FdI11UmE@fYd8^ZDxejOMeemw7P(O=Pcng_wX$6BRaX(vgA$;p>SCnS-a1)g7l}0 zl+@q(yyF%fEdFx_YHD9X=EdeJ%@s~-XbE2*{!`4)*)kpTPu%zHE1bCYjp7@8PAT48 zNA#k)c-vFjb0m<9diVQt%Gn|?Rf$_9al$_cDY$~J|8()BPMDZqi|1 zdTa}wv-gx|em*1xxvfE}Cn!#ffmJ;Y;Dw!C@GZWV3^Ep=P1ru%IHI#^U*{RinQ;yc z-&m=0UN(fxEMD>VF zzr+WvE(Egz``x_C%v_8MqA!fVUbDui6H4nrXIf{AeH^3?Ut!>IL-cz_XT9F?pxTK6 z`!#evo$Cyov-1ObM%71)=6{&+p4R+D`cC*>vkCoIH zpt_)eS~~p)T=Dm&chB|$VHSpt%}4!i+N#Tk2pIOFm|Zho$jx_bVTqHzV&xKD==QKH zk9;n(yvs-77e_l{YPSdgZhFgWfh~kp2KvdlJ+T#1m3JW4E+5I?k_0^fu9pP zI)i#Rku|vfg4=ITWAtq7O8=jy1dj2kOf6qLq<2yVo4LV^Jd->=jt>F>e=Uy%-{JhB++i4O$=d;rsSwqV`y4r=9%Ogy!%u zlHP~vR8PKiJwV)FT9v;PPPR6HHUGWF%m?OjFQ$O@bqjQ95XY<6{b9Nq2SiS((ACL-9(9MRrTMN45MC~$-ilDs@ikEkm`kfzZxWw2Eg9i-}2BF zo7qjNH@}cm00OTFw;|B#EoOBN5c4cJ4t%|A)#_i_P!xQTu-QpkN{3XQZI}inmQi9| zfp}Rl4_VJ5(~U_h(D!MpE|Z?nk?U-n3)W+Q;cQDC(YvCbF#LiJSkyjNiten&SkrKP zf!6r@$8=WW7>{C}R^0Z3%Ey;b^zXRclOUlcN+N!NYI&^UpOGo<#}nW71gLz?MO}yd z`lRrm?Npi{PV=rzs|rV|MYgmk21_l=na{Gsg8M#$oIlUn&gprjqQj3t)QG6xYcIW! z){_ywa?(a@`>V;S%ZBNK4~gR+pIp#o1rMlxr`YH&g57P>v2d>=@1MAf(cDO+J%Df< z*JaawaK_JBg|-5ANh{zAeXoZwP2f8JeYFH=J}|3K^f~|13O2HRE2`t}u;o$*I;%V# zKHnOHukKd^%`FfnqrkYEGd%4=6ga4?G z33F);a%K#KznwNRp#w=Hi}fhTkL|^2ei>BGlR8YDEctBgh!aNNpi0>dF<}c??m#b^ zH#(1ZNgXU4x*j2`9L4$&XW@nMI^dsSTacf5hW`F*AT6yDS0U*?N%YU}rABha?Y7W= zehB=Y5~-M#ZR9#RN9oz&Au#0w?@5CyU$~% zpQbm&e9^p50WUfig|wp7Eu{fG8#W&Ie;C6^gYy@EOOft_bH-nS_UAr<(1674NZg10 z@113CpRLj6{%ve$OWA74Om>Cdv9Wu#g*TV7@vM0+BivImj9N<>|MW0b(U+r-7NN_D zHKd<))p;fK($H)_Y+2+fJcOt@mF8O}+{7#Wi-f*cU5|WZ-5zFhp(Ckx#ke7N;Q|!n z^k2ONm%hnBnnwr;Ov4;?Is1H2VV}1j#=D-T*zHm(;X@b{9Dl=2udGGr6bkJ^uJGpH z>&rp!-9T_#yB3YH*N<&XVB>85kP$8*tsk%1ln>bto`KNkMTQX=kbIE`4{NMaEh@S> zD;3fTgwgHj_j&_eL)N~&M`#(GcdQAz_B)ECiB-4UATbA$;APUXFndJ-bC_fU`LV}O zP<`+iJAiIYN|0&?TWIG>;cX?-%MA2hy0Zqn3OAPj;H%7bLUd9dyD&bC)!JIfk+BD^5hj+HbuOS%h+`dC8hH8Yv8ll)(h z7@xeoZ~%^5+#iybZl!m)+B&6n8YR2}B*zcIfwU`iT*^%dA9hn{V4AaVX9v@|(D+y+ zY4vs(n*EZIuEC;UH_&}qPs1aE2k(0Blt^2_IGte8x16+;^Xz9o`I=w0NVh}-$^4r_t@jSJx-pY6Dfk+uS=RV1Ay3w`1Bx|Rn< zZ{sv4aI>iyw19oi2vDG#jL(z|}WqcJ*D#P5vW|2$m=`Xvuw+DAh! z)r=q?L1+Kic(LNm!KA+*!O}y)&W1(NKyxB}Z07^yl~{~PH+fWrJ~}MQ2jUK)KZMp~ zZn;`2;RkofyU(`dwG{pUh3_F>O?dE-5qHahk6m$94{PR|FiIj_#%XLSaS0E#-38aS zr83F|IAI46u1iAC`jlR!dFxFYvpo~{r}Y8d{?0%c%LwoJ#u0~vPKDCyOt6?5%UT|C z<>akcXbXMO2XcAx6?Sv=WF~5|!HVMocNJ5!c&yyB4-&KVgfC2Vgtbx1F8^=wC##*d^u*`(Iv;L(njNLdBwopMmg@4?xI9VkI~PWw0fZFR$SyK1 zPod+$E7qQQjgEFMHoV63={+>k2e9DfbryGtgkbDnAe}@$^aj%jO(>w}QeJG)lTCe8 zCi-1?m-hqQk?_QMR7*#Zb1<4~@*pV?xJ1X9=Ej*YkMv7R;du&Z-kr&J^Mb)$)Y_1n z+~q?9wR})Z;YlE~Q2_`&@u>bp+MBVZ@UYPLX&NIQN1;nsX#Znps~V|<Xy4eQlZv9%ZIWhBDHK=v6VEbaP|b^N}L7E?s9mYI8%41~K#WW`b*mZfy>9 z3k1cMpw_ISi#*h?e>vu_+LoLHQ#dZ}C)vb3k)} zv)$Xm=TY@hcpJhcB#weo%h9MmXbW18UBxK>LhHY-Kv*es3wVAT%m{}Cw=o*G$TQGW z&kL)6btU}X&S{R7R|7&R=SpNV8_of**(N~w0CwCGhF>Fx0cko-pMG_oDd9=SzV79N4thLgSkQy*F6gqqxrvLYwp9R!|J z7Ri?0PU2Jp&cta2LSz5T+6p3rvM=nTh@47qbra~87t6?_6o?FGm;xZbj%kk?h}pJ75{sjd@{VcFq(XGUCLAHAn}}R zyeA0+pN%~5jB?b+sAX;|+YJ~b&HLg239~AZbUCMc@Nv7V1W!=C)TQ2e$>{o+zT6%N zHx$A_xGCk6pKdG*zkAclMj$TIFowhBmlxVMvF?8G~tKKZFYI2G1xH!xarfI88(t_YkeU?_y2B6z;pDu}aS)*Nhm8S%wwTjIp11>Zk53HlFrSZhk{~5&m4g$)2`z0ZZ$rY(Rk)7#RfPfky^va#&zG@;*$Dp#lOS(%BN7A+(LCze=^VR`@rInr`&gUI1Z@N zRX33CToMRO#2G=DX5Xkw1>mx>kZNBmpkliwi%yZf5k%%-hq_-!&ot~ z1nYVxp;>t=XybDV3dm>Y^iie+pGwJQY%Z>JemaMp!+iMi_wZ^`l z>|dUVGaOz5jSVgI+d$_B3*h~Xd2Db~ceL4;j6W-C@Z|VjG*^)@Ceei%x+HQ@v#$<> zGKYx=_?h)P*&CgQ&f_Zj!Ic-+VKx7z(DNy`O05cqu4tuNJ6%_ne;mn7+;1pG26g1# zODyFsJ7aL_*Qb2MjG@qefel6`aG<)TYniHJJhSj%pSSEsJv$uY5WzqGtt0O){mPnn zII700c0ulgY-fkky1caMMix-g8ncZeAhw`6Hru3N_PIP36PC>9AF+g|vprx+yLI4q zX@u-s#~Q4iM&YNu@7RthIef|KjqtBb2Q5wwg$*%XWV#Q#lW+xf{la1G&bDCvY%QG; zRK}0D?!kOKF2Zcvdy1$J%lXS;uzdwYbhSX;-YVR~aGp1>9(qr>&278&2Zs+E*n^57 zw96eQEiXHdVS6rtB$uF8@gNvAiLv6Ej-s~U*w=56RET`7ngJWWU0@NT4nm+sBK+>x z9gS@-aox-vkkBfHJsorbOUiEJoJA=(XJi~)+x(ur@n3~iM_obm%ftx!ZrT=c4$)5N z8MgxOEIEr!p0%dy*@zlNAG<6eII%Nf;y3+oFii1pZgKIku1nLo%vamI@ z-?1B&Xwj` zUQq&Pc813j;`x=Je0K5A9&t_jyvA8gZlEOT+89g z#`W`{s>5F7y0I8%G9SgW2KRM2S^tOOIc{ZLznRyz&Zo&0UJ`+umhu zF5H2EQY}jB?ZuIDyP0=&u{Dk$NwHF@>mQz>&ac{oxOmPBgUt<;OU0ybZeA2xF*j>5|b?H2YkB7Tq;gMXn;b()a=aXqvj z|CQ0YgD-D^bUnD$UrQFxf3I#UuzxoZ?5|vhcebWTy@it-^%gyY4y7SL^QscIvf|Up z7<_v#-;vgz>qcyb`L5w$yYwd1?Y<2PzYG-p3xo@70DU)h%@{qbX?PBIzyVxtG=b4v zW5=j{gb8%!AmPuEXENS(T}k)b2{z}`x!|ZZ_Mz};?*hSX{P@&!IP`H(c=|67T&J{U zPyh8)>gq)y;WA7#*C7ts#sZScm3{-3i1}hK(r&PRv94GWRm|T1zQ*=nXvwdfzX)^U z4q$-SX)u0r0&w6=2zYIU^#A13`xiM2zRsw(3lC)~+%$SD7Wp<8^#=>nw-so+-D6Sz zePns_LV?x|tEZ*m(WQp+)EkpgaQ@!C5Aem;G)dp8E!FNsS^VDl?w{w-w`J$*_`M?F%oM52Cz ztoOq?^&2Dp;In$QhTq2lKVw&CL_fjUS`a@o}vLTRS6~96u}2qkMkj%3=u9oymG9*g|NFj_@b*GQDFs5O%j6 zB2i!RAJ+LW?#ECT^Y$d0nsbwBcPMxE-#-<4p6!qH`{>$gljP&!M(>jt!tnzY;JERn zM12p0^-vagfUTUoOCfw$O|Q+?VCdS8=a|ht+Gp_E52V_K(1|D6-r`wA*O4$|>|#7* zZp_@dH$iyxPTh-Nf=#$K_Qrm9$1|OwcnL>Mfzl2~J~SbmZ)EJ)}(sj5Re z@W1d9#eL7v_d~1Z_GA@~r*UGY4Lzf!(3`A#c%ejNllSk}S5F>nz=*G5aN1EkeygqA zCU`K2o+52dy4H=;eBq~cPpLnB*gN<3a46y^Nb9}1m|MaurZ*@MrVcKk^<0fvy{pm0 z-4llHYR9*ocnG8RUd5Q^XE38;G$*|Uq|4Z}R_}4#&^EBV%oU9r6yZOk9nkO3Bc&$x zIqA{%P};N!Xmy=Rymv*ipz~+n-?<>3mkV7+<3rLWtkB07Nf)q=7Lo9?Vmc5WkcapL z*-l$XE6r4Fq!0*uTE+7(O#!NFbeL$3bYD*QrO)h72p$FMdnPnM#l#^3f7qzvvC5`C zjTPc9<&WVrv94@j_G$dSydhBE;Fv_xwqMS{t4o`tW^?RunExGkP@$y?%uTql0m*N$ z`diFZ;wDL}@pv5H=f2=sh@bqA6BpyVClR=0fx<4{O`!FegS6%-beY4R0_ljy1Qs~+ z5P6#vg?bl69}zaeTD6m0VEY;)o|6xm+*sU`_3hl5&lzb%-eL~aG#tnY7r;V48JC=H z!fuuB7v2P^E>wN4Eib8wLxF>Yt;&FZ23%aPr-%9`gF|+%L1*{ekaN# zfq7LoN6N>)ccQu8P1ul*p{0gE{6QMOH7=_67E=}`LEMImK)s`owp0?nwt)J_4zPez z-aywt@&y8y1<&AQ?}qZI#{YqN_oYaBmy=Edc_r2P=1n-RqKI(#IVaC0{WEHbp^it` zKkrQEtknUWv<~0@(o!WJVfz~YOdpRzQwaa&skalU{^7j& z56l>v&C)z&p${;)&2eZ3vw<`i8ywP!^xgoVxpD4$W;1J+bJkgCl--ej>|MSK9_rVY zId{-f^%kF|x>zfGAP|S+p$L0+rpHCt`9??OU6MKZG4dXkR0Ddv-pzlKbaX!xp5w~C zLZ{%oMChWLpkw=yIHp65bMuguK>8U;Z!&E+Zq-r~ZOkvHMCFX;R&qn9YK*zrDak56sIv*YW+tIm&C@1}pcOM=Hqb0GO^ z6dYD}nU&gN>|-R42`{D;QO$3Ft-DQRT3cqfc?A37(^RFkmMZq#L&62peJgVlE$HcJl@aOp*`&@P;3c z_6bdkq%FYOd!nd4ARbY2>o{@pTkx(yb2NV9DEx~?vyhJDa~7F{*_XZSds1^*&WOWV ztLz}Q$`rHSUtv_MLcj8~>PO7DS2U+uXI~Q^LU3Ly3|mtKcScD_nhD4w2yBG=>;G{7 zmb7P_<$Xq415fY&$W9)N09t!4JQ+*(W45C&W7!yUBp(KDfzJibQ*N<~4IWdCLKlm< zrJBVeIZ|^UnlDcMLFdqoAZ@mTQ_ZR(L(#X|Erp%E!3D1hk4p7$%6dE1tW#fe(mpah2L!k2MVU>p@R1<6lk|b`66l`4OYjL7m?w1QAH!Kv%(ND` z*I3~b`^7NwA(FG3uE+tze8RrQD{;WTZA^I5`dd=ijlLt{<1#<^q z;-obQzbE6=!Ons|QM>LCO)Zihr~WSEVht%bP-ness1k3oPjn{kral`K(rMge;Url8 zv5e=^Sqz^(6#?~vLIkztaKxSAley)MILB0RS(RIi5)cx^FLnu;KsF29W zO6s1^jS?zk%Sf{Ke(X?DNlQtKWHeEcRrh?Z%*ZICP}!U8?D>4o_mAiG`#n$Jaqc;v z&wG9EJx5M{8w{icq)NLUIP0l9h`FX()x3x1Sa3D=OVy{dr^C4DbMh}t^!`DI$v~P9 z_nv=Ic;IS(mGralhuFP!nsnsrN+fKcdEY5Gjq2eSKio}QZu?{tdHRX)ebr{1RuRRc zy~}YzsFhepO%5t>lYAd!=+toX*VthA38+{1GnCNtdqol1FuXREYEU0V{wilRQCl0$ z=TA;7LD^nHs!0uZdpe^b?l=+oML?l zj$e9!5q?jcR$8@SLett7+i3WpPsCjAkg#89H5B|R{0DIW`MOD(eOPoWlCiWVh_FWjkqr>PFp)nHZlI`L(m4Wq zMJ}Q74o>X@WXkeDaOwM@`=G%dLz%pcI&aGh^3pz{mQ>26H8?qCt}8^g(m}UoK6GD? zIUH-555&Jbc1bBzY;FwKJL+q2>v!lGk>9cP$*GiK9$~^4KJmH*lwYwkB?n2nS&Om2 z%CMts;N;Xo%7=vq?_;xz;%l!{r{%oR>w?opYFsP6-wG0_Skz z)51-q+kmn(oS6DbAzy$&@8?P8Zs$Z6t=>BO6hjxaRvtYJ!!1W*_(od;_0+Y6XjVe! z(YjmWU4zdoqncr;v%BgT@ei~umh%(62Cx{p6+6(gOlk8*#cP`>Z`s>Ioftg@em9H8 z4#DlPWg4B2)<2%5zmDexA!ce@I=A5NoL%rJ`Yswzk)h*?i&&@Md+1iS4)#w8;&b)d z;OmrdjA<~4*);ymN^;y`Pns4~53(*ydSwNZ&Wyv!U+DL$Mitoo<2S5)a+{5wrLE@7 z7^pUwyaOkkjDshSJInpT4zr*OckyuY1HAR2k*v4r35$Mx1^Mb~mKvllkDe8XJ$iXU zuY{&xy;PU#;yb^wr7d+#uZsi5_x}>3BpSG&?lu-WJ{2pJS-we-B$QdV&KrK8EDt94$g==hUrPK@cz7h_`KNwy1v&uCw>RFpgo{yE%~8r z1=25_MCY**X$^kkuyH<;<$-5p}^^6216g+A>{!_vuRGRJqe;NSWu|2JO?MvvVDQ7r=a$#>Q` z`P@$_H?z6CZ0{v__oNN)f4^m<@ znoj%sJUYhj+^B+eegEUVFGYe^LBzvrKEb4&vL zJKejzZ;R7|oW`o_T`l?B?tSPS+R$mY>sZO#ww7sId|^9k&S1SR*4ViwrZD99a`o>(yD0blHhs z=V5D?RHRzQ(lLhe>Q22>>Orm(V96Is3eAx&WWTF|fgfF9WS!pXu&8QorwR`QLM=W(>l11Cb$vDr zy#5NQp75$$0~}-un3!40qg(F9xL6}~Qf&_AmC!ldIe&5cQ3Lf|{tz&$y2O7!cj6oN z^^X&SK?_um-p7@$Z;v?9daB3UUW74& zY^ip2F?85@T+u8Jpxs&cy55#WJl~9o7c#ijrL%DRQE%ziHQM{5(^K|pZ45KHrLXG5 zv|@i-^uT=~mpJ`5SU9gCw(mJwUc8_O*cK#n>!q7u%`f86ITkY2E7ko6M!n5f6w`g4 z6{q>T{3}ped!HXG`wn^)Tfyh>M5G!A`d((#_bk(YZiM^BeBp;L9~C$zpM00b&LA+ce8GfRuxacM&-L!vK)UB%$;K_L`sU9KFzzAaPTnbKWpA*-OXU(4A zm5&IfcRGUjd*kl`=x*%x4bEIRiT^m00+Vgp^Qm~inZrXDAjc+A!du8%wSlz%D;5g5t1)>|3;rN`1>+4je#}TOn}# z<0mA%hBNI>!ueHsyw4j0PFP6w(FUkL*dSBHg!F^(dj4^zbD{M#YfXI4Uvxafh#OeH zY(v!lwgs5B2NK?CI81N`&4)7o#ax~+dV|xq-R2)dMtQc27kMC zBt5TVEA#^!X}^U<)~zEy$cdGfM0dvA75({BT^n`3OD8qOxiK%vxrj4zjie6rOi!zf zOunnz3BemkxW);4;Dx(6u3PNEYN8JDs1{l>;Tbgevlzmb^u;y5HXwX@%f9)JfWWVG zM!0bh?7aIzU_6dEGy{mcP~gpnrb#%a>1ar}6^N%BpXM}vNUl21NsBRG-2))7?3k7p z#&{($!etFtjvu^0{aySBSG70}W{IodR~ns5@x&XljE}&cUccxZw%LNWSbCugf4sYr z6Ib98+P~MM$$e?v);*wjPa*7@1Kq3+@J8ni@yw^$IRC|K=$P4BZa19H;vQ5H{omM>k;;c zVaZi1d3;VY(r24shw_#OevQV;vl}ol{V`N`xKeO$%?_+z{gruoAL4E88p)3j--7M? z>cPZQ$0g!R;(+zAY_BJrZtTJ)oHWynlXNV1%3Y0i@5caE2b0#ZLVOd1RC`D|7B0^F z$~)Mv5E@YF{5wjT)@crodg23({_`O%dJ#sq&tpq>cSOC4Mk;9-zV%lLn_8F7WvrbB zVx7kf%H~~+A{fmZ_%*vEa22UufHX6Ad!NcKm7PJVW65>iFC-lb&Hv8irMf;?;C4nc zub*B#`jW&2KY(2JwYIW)SE@Byy0Z7g>jyI48?ajED% zFz<1neH~iPwgol{_X}O1RCJ(!NqcBT?-Y zZj^LY!Mhzsd%;HAP^UeVb*yPQj-QNJgQV>s#X?eQCQam2TTJMJM<4ZN;v$?fey8YH zp~>XsUy^`06sSfyaS#0cF^+W8C)OgUJ_Kxhi4XkgzUU!Oj=RoV3qSUr7qwgHa-cJD zrWXtAH&z<%;)+MiFi(|9ftLLjZgNj#ql`_P;2W5qs;OJw(*+W zx}<>*aj{li@IDZ);e3xK&~T}OMcU*j&9m#Halsdw4LPksFEoKln4^8?}7?8}6q+l!o8z z*O95$N&A(u@QQGFyn8&5&)~6>o5J(w?-}(he)n4juh;cLS_>fDMygqy>gfXcMxoS; z=~&o%7Si}U1G?`g|~*@g^dVX!!){mddgOObEp&C z*s>RCUI=Ss;Y(RUdKXdqN`adz3Y-=7LgT=)nfj2s;w*f4)*sEM9s%MBXR)R!&awFX z`69xTsaW;whZOO=u1r`rk0Q8D^g7iVyR4PSR(XbF=gWoo1-$X>07rgt zC+*LZ=LE#JjP$4QtT@(SHIS!aR=*PQ$mnmq2;xmhr;V2zR=7$0mz>rwCm4XEHRc3OtY3PF7Ckt^qg3)-fy^F zKf33EG$89~LEO`wjX3lSBDPm6n_k@#`VWi)w?mwZAJ0E|U&F5g*r`}8EVSos;n+KRqAa&@dkH3d}P;P?DL zdN$&|6X6*XV;B0Eco>TQwPEC~sGkgE!aPRal`y^zx2W8O!jcdE}t zN_6Egg#J6Q*Gw0A%J^1rx@QY`b1jIIx8~#rcvp)sIAWoTbp5QujKL^!g$?D~8Q~5J z4QKEDoRL0f0t*EGE{nO!i?cUzQRh$2+{CGKTcGg%OuGa(2PE?=ZDR}HPF^SaldouI zrYt?2j>3nHw6CX<7DVzlNPGeZrloP>8Qk=9l#{o|VBrx6Q?}!d8dre_5Ki}`3lB?p zFOjdoODE40cGC00=ZryUG5z9W0z0AN!8VlIv_aAwYW?aJnDlBl7yL>ZADsSWNZXh8 zR_XOfzD&&3$yH8K(x6^(#A911tDxWT=2S|8VX z&J-t^>Qf$ZA6B(+pd4Wn5>L?h!nv4m2u^G|P19tC#P-y!-K&U|{w$=kE$ zekP2xgDkYV)MgKP+TK9=On5gC{nPT84v^O4KW-+|x(vmpMrWkQ*K>Kzq-rIpfX)m! zRT5UMTVjE6a&KE7f3uO zI0pp|zPph|z1xH`rk4<0wU(2{qAVm2MGiCjhAr0n<%NrPg#dXtkxxiz7k6^;`X#5d zc)-Tle4&4Yct8F+*O!SN5Ixz~VJc6tP&C*+Zl}2-{Ln3JWAeaeY~K0BB9qZ%F|=mn zYproxAf0VF-5iB4>!*ZZTGlxrAI`{I!~61q>a!;8uv|^jjGZ(s5#|M6N2lj+jGKa!j1-T$37TEo_nV{-FkF{eqlZ2u)T3yVDhsj z`vl+04}VpFdekZdDEm@O?_|-LiTNmW`uRasEcVYl%6*3le4(7>v_d%)U*%*hlTRT% zUxTC})x|@{ua=W$Me0p?SZPZj9iyp_)%B`1`d;L2 zJ>3S;87n=ZNzDZ(s#knD*9uk3EOQ%77K!#$lEfi1(Cz?SM)Qu=&_5~PNvTx zUbMi(_z`T0^Iw+v#!>d)kVd@mlT)4IRZ}`|eeePxKhL(0oWu?5b;5HiB1N8w>W&Id zxr;=)oBFj8abgqo{Hku6Oo2QER*!4L^^ZC7a}IP)S4Dl9_>Qe+-6^9Ri6b6KY746= zFudp#Tbx%%CA~)aXEn_CPviO@7Gj2X04BDIq_eOau$o5>@>1JxQjtq3|JdA|x8e2F zZ|C2zYln9-yQpE@#CC$y4eER)BYO1$(;uA^%7ByucMwjunF64?gR7OuY!1Q z>FF?>YqkPUcy)u@fn(UuzK!r^g}!W&uv=QR+gKg*eH_oZ{*PBI@w(B z&lyyL+x9$zy_aY41|CNt{k|W(cwh&{pVu=(v+=NP>wj=?LIgJ5)<}K$cAGLka=REa z_^pV*qu)L%#j{SKZBa5?KJ*bgZaxl=FbDMQeu|$Ob(UW**8#65w_(nl15ml-CG@OF z1*x(d@3IRd`c8g6Y%ffi(Nex~HU?jR>VPZLEDCcTf57D9GwGbUJo?V9yvlDSzR^v= zr`%2Mee^Vj*BYz0Z%4tEUF~4ow_O-|@T4+hY(93qVG5^~w^yc(u>-eu4U`TiJc;#^~Clh{e*#~%if+bCq5ku*!_V2TD3=|ae>1$cWzEq4?o@zz1b(x)@ zMXMjQW-+w)Rclb=H)6q$)v#&iQgQw0@WT+gM~}kl%BJwrG(>zhl&o=rmQx47o7w}6 z{w~k*c7SPaGCO7bi@xVS=sb4@yxQ^uIiHq-kcgm=IDOlW=(MLpKWG?U+4co&Ba4q;E<@4%+=Z5VfZ4PK9yu=G$O z`24p?O8Ak%i^mQF`|og5XGyUOc z-D!B()&(av7z>-rtg-vE26AeTC}v5&`AiSfQ>}WefkO-Q?-w|# zJvTh(b$aC~o_!4Eid$Rw!6t63{=9gWJ&1I`V@0vq(Osr_!{i25%>IQLA8_CUPJF#g zb6ri-wADU~*MaEI{p0Jh3j=&r|4rxEiJ%a0y;90t+H7L%;z{Yry$rBjbAumkQI6w> zo71_KCQw^Gh7GjdijP8Gv5(D@QRm%r2vFLg|0Xvmi*mprk8c9?3UAVRDoz}+i+|~C zN^A3zTZb`p4*rYo4#DEJSaa<>e!F!~U=OGM;k7Mx@sgb_Wup!wVQ-^DxH!5s60YI> zssB)Kc0G09y}QclmXa^r z#@A+Bq^~bZrEgtmA2QmTY`Cp8Vfi~LJhxbR{BJY6Ur?Z&nr_e6jaY&UQtQdP8y-Zx zc4wd{Bp&|$9>!g1j}Rlh4>-6ruj($7uJouF8xIpxKgK794g5?4rt;L*P5MdG;EZx>+0SZ|%d51J^3zn!+EqmOmNT z79N&*GP_jD4)775AK3)yb((oQq+boK`aQwvtKy(2!2ter+XvYXXLA#SRbaSwBd7TS ziv%lJv^$Dl%56j#vKn_8XB8e=5bSh$t%`HTNvtZp2*R z<=-Agbu0y3He((+-+^#J)D+UV(9oG*y0nIh1YvAomH$u{@LV@X=`h(6p zs*4^utDrJyJSMz6M%YfzQXh+kzL$zQw;KZi%d4@++5K?A{w-zuI@rAHYpLg+i;|9; z73Mr%jJqt8p#7{$c%$1Il74nl^E^|**y#dJuyYi6f-iNN0KEpoc8;LmxlG|oUL3kK zGF92{?MQuvwJj{Ld3rE6(p${Owk*O(y-l#N>0fR}=R%*5PoluqR+&bSJ3o+B-igIL zCp+S`0Qhy`v)s2~Ls_ho&X^duzTN{@JAa4u|J}w3%V@v9>Rl}QkQdseo{|VFk#>-S z5ocE8r>}irO8-LMA*Vg=DtUmvTHC?>sT=S{z7@=E|AIU0yT&%%j|Azp6$U8#@O7Oe zFtM!ywcB{~Up5Nsm|TU(yi1(0R=ILYkG0`j@YeYj^jVYXT;IQaNLK*W5g+%mhW#BG zMr%KfpBa5Y)D-ON)f8zBlwr;Cz_9%#(4zY{d@L?QlgUm%dpJuKKU!H&(wkfP!I1Q1sO;-$lx(Z{_&w!ha~R(7?2UyMIKCKYAYp zu8(VVR#`UW9^Bk86jm*{48;fQVynzZM%sycemcdR-((3~hc~%TkZRT`wnZT6jTq&h z@c{Pg&J4}kQJ-QqnF6W}*m<#9nK8fx3jETP*Pk-^&%RqFT0@EI30?2?Wy8Jj_ZTnHS?_o$KvYry_`5pU?uJxE(uC z8QCcdsb|>j;uL&)>JAWw%6?Wik@N{W?>0eGr~185z=XcGjOLzGZPH%3d+9yXaO=&Z zbd5%;s5ingd~m5N`nvR>YuQeC9t`ad?&0PcVfgCgHBFr^j7q|P-7_Jtql_LWU%_(U z8)&k@R6gWmh6mgeSnb)ToShg-J@OrAjO~dhx?F_=eKMF;Vw%umjC7@9vSAy>p1nZ# z+Lw?B--^qnEk(-O6N zb_UWoTxgiaF`F^V6dCmxt?^1;uTNiibayWhPGT4TDk)r7OQt%A49lq07OU4hc+{=L%W${*ow|{Z|d*uY@eHfsBunxfqjmh$GnazOg8o{ zoHyQ?FFzWN#NSM;`2qK4LYMM^9}3u-js1k)raEaW)(>cn@M>gFp{x0;veU%FMU1YE zGT34U) zpL7gQ8AJPX&{=b(byz!$!pm!AtZ!4wJ714xG*@gnd_aBehmuM2IYPtp{7H#Y^~Omo z!&{3J_Y$sM#|!O#6VLCa{*GtV*C_C%ZBiCrJ!}qWH!4BWfYAARL)F8q9nNg`fb@(t zX(U~cGySm8`HUDNzaM{#v|XIE#OIPkng@hd+q7~T6TEh)*%1E4d@ma-x4}MXqmi@( zi@(*6kE&bD5@LTlbvW5nCGMf$407SYn}+;@emYpYEmODNv{xpMun_eIgG^JgPTP|h zbT3S~weJKD>`iB+zc>tnhpvpTma-l8f-apskZczOJ@TE{@7GmGIM1iKsVMN6J`=ZG z%fj>l;Yc0=NL#Se^o;U`tX!(4KrUxKM6Zs!ap>oZoU}gSWn~}XOHLWD1@aw2oAT%A zE_xE)cG!rni7Uyod?sC!49&aF#f-)USbecQ*zdg}a1o}rorpiW?hqQ6O*XzS>X)Up zZ4U{t{u-@K-T;W}v1wW$8a185g$5GWy6I{wT(~Zaxm_JeygdwP4H$8ZOqv+p-xx|B zY6k4-8H=4F266Hb@axVqIGfavKf2rl`Yiqf+HEAfzP^MB%&6ynNLjuwnK(BVg}0de z<`-WVUkG)2b>r_(`+!UKOZKB{OW1VZ2uQD^zIPHAUW+sYHw|cpTK#tlz2ijVbE0+C z_(AecYIwwS?(z;=BNQUT8F$55Gpf>^Ucnf?5_pbAA!T+!8(l z=|)&zt&ODNf&7(NL!jPPJ3ZD?zQ4R7u#~Q8w(tT>^nvhnlczT$|8bCh!=}A~7VHA= zdR|x&aGjIS0$MLQf1#l&{LGUpy)kQ?t{fim6s?oHfa|;N%&*5ex`(-()8E+39dn7# z{;+!P-IW22TO!Rhk}g$>x=+IU@neN9U?a}_fT2wfpy#7uU$oseWM5#DPFMT=`>kn$KOkn>1q}VuNKY z>U3XB_+f)q+1sJ=PGjD3*>PN7XvxV>37w$9**$+1Hn6w0+APQt3V!^+(dG=>tFeU- zvj#hEE=!Y$o7BwS7D#%SQ(xhzZ=+#V5I`fJ9EtvptNp4(9W&xgByTC^n3MnE&Ew2) z@dBn2E|FGC!Mi7pB56Frm?yY&LwBKRutlrYY)O6{p@T5BhcRzm7{thXp4@NNk8QfT z6UcudX#i*y--;2|iMeKbFTbFD2=x?t4Ui^h+h6ohiJR%1z3-GIrV{=);Z(Ei_lRK9 zS^t=AuC4sf(gDpkb>Qcdw^8p!gU~yd9li*^uF>!fJnS+3{zE?Wvpdc4dmvoqt1jru z4nM*ak(aETe2Y=uf-zssf%uq3tgRJ(5Estx1KoGK!Gt*~w_VkTe{h=RQ>9 zVUt_O@aG>=`2@QHq`sD{lMf1vLc&>2+D9dR;DdFKi>wQ7F7y%JU+4r@xy=)`X9n?A zO9u0=FTD8JF5Qv%j_}_fNL$J?w}gS!sJpb^=3NbT3cUZ;(neq{i2SBH&WkkUX0RA} zhtWTHbWtR{Nm+|EVK76q%20gH0U}0t6IQT6l=-Z4`0$55UZf~ zQ5U+#ME3IFM5LOMN#_%Ozb2hFj&(jo`);(*WJnrN%H{ZGQ#^x#}}KBrw$X|6lTrNBoDPk>5!9-79+=@(*=c(8fq-x z+;COYKZHKquF<~adDMb>^SIFQ;g3_0@Rjbzih@bgwn>C78vROmf@8d5(Tna!5k4X? zJ0D2DL+OMEXdT8$M;!q2)SR$^XJ`*nntHiY@2uhC@8n6j^??*P?K%>REayxAx_1D= zSb_II`W;C_a(a#MMqK1KYcAGR$Jf7sb5eBF)p0$5G%Q|N-CHJ2tHBxa3WVQBVB!1| z%EN>zwrt2GIr>XH2;buQs7#`qiIe7rsVlc4y&p{%Wx$TtDi>I)|6rXe=1X`u>N|+d zAIqY@G)2NPcC#V`cN$rPz$eNx@lsJBh*}X^H7(WfF~k$;cS1HvSstATt5G#_?FW+3jo4&+kVkc8R*;=mOWD@w7M4*-HJU-vwn!VH8L*wrclnZdG4gS|9QRID8 zZ+C>=qPf!HQe_?|U%*5@7o6+?(T7U;vLgmEc?i~PA?=ms5G?XpAnlE$C$Mi}g+lcy zuu_u+>{V6>f9@#OoIE0<+<~-wD*5Rk`rai1!%!|cgCcjWWm>Y?P&ZDQ94lz)L)p-M zM%N-!e*tA$s_-6P%-dqa1r|Ww6`{r&gFootP(1~Uy5EBfTQY` zwzOFITT#DG#?e}uafj}>%0!N^Y;RNUVYW|r0cmc83D7uIsv#v>zb=T(kGv19%O+e= z93cDvKn!OMc>3rcyq6I%acI`D?&1D0UkTKfNx{*>qi?SsG;S?F6p{h8)+ zv)7lTMa7k972}M3TsGi?8nVUfOA424Z3Ny0 z0r|;B8G?dDx=%;5N4f*Qs&9p(c@7=c@wE4&g{_@{a<#60n1a+)GirkKOQf=O^kv8Z4K2JmsZ@YgEz-- zy`Z4%Db7nD%3bqqanq*V@XfI==#3r)N9rEpbRF=$|5;9J3iO%$3FRqbzLIWTglqeb z@JrUweDI*LY>ZZn@;xOPPMv&-llr8CyJHOZOZv-)H7Vup;q8IefZHcD;j2wo;A}Vy zQycApl~X;~n}-%)cW@-6^rhd{t6He4P679Q9|u2w<+BqTx4|zzW3|h#bm{IMe+<5D z&v!&Q7WVas#4lADFsxM!o;Fzr$5%C!JzuGO{}iD8jSP_HP+SZ2de9!qoX4Tvzvm#G zP3N(xM@6kb&+;}%>xHhnr!rlSVN@rBAZu&^&Ak?ls}0=q%VX(*>)hSm8h z;je=a_-Fqpc(u4Mm>21(QR_PvHFtl4Ix&;E`~5*v?v0>>PiIxeP6( zZNO77JNpVG`+wvH=klSE{$T7-wq41Ki-v^4b$B+Ao}UWRhkiTTC_|^WkzE^TnD(oZ4G?%zyyd{s1CKd^)ydianZT@a3mm))TJ zvW}Ymb_ZL>&hy*~9}uCfGwj5AaV4oG)#XcY8R~_n+qq$%cXRRD@Kh*Z zb<~m;^`YPP`^wCvKhg7*jH*vGtQ!%c7O@y6Y%kxRZRTdD8&wb zpUgnl$=h+x=iOLMXJkFT==iUS)SN_CsxLu5Vg%Cmsv}Dn?J%yTb!Vz z=m^uD7>_TCVp)gf&azoKVReV&oa!9bC*1?LX=7Q)<|*7VL}3-@ikO~uUuAvLBza_T z4i?w~x9pVx19iNLy-FJiD&$U2fU^jC6;JoQt0>AN*T?ah4J`~)v3kTJMt1tQg0{^~|3nvty=5@#EzFu;R~K$y;}%G-N!TTWS27 zw;Q^M>U0l^KD%$?gVeLis{gj)KRbOn=AD7k(624Lb?$@n>t$o&s_q(IxLq}f(byd6 ze?dEBBGxwRg@vJ`fv}(E;59vml)~B#eb0|fH2}hQApAwG(i;AZa@ZJ`ov^cZ8$_+o z;yGdU;gjBcDcX7jG>Pa5$+q{f`LGOFyCqTd6U4j=g=rTXL7>kFrOf#b%naAX^Mg$x zuq8d~wR15xak4;q4b~5s25{jyo0oo-Pn~v*5jWvVwBoPl`17G7Cy2U+!GmsblX*6f z(|Uol-?$@oFG+!a<+*I+_4VLgzX|pqcSGP1$|3Z7|Di*Q!1kLBhGV>Wb2M18i%;`e z%EUaGE}F%t&-kqP&BQ%T)fZY1+3<2Ld819;Lc$wPm@H9W!|cbEm^t_;3@;C0sbd!K zWpN{LWy52NuWL4pymMNtgIHHJCoG)syapz$?r`CIr+7&|JR+q-FN zw2Z(lp>Iw#KZQ`5jh#~>abKs7Nc@WBlb;gjn)Cff>HhcCJ5gu@pBp98q>W!eaA<9_ zBS0LWwm2Gy&0c$Qlje=Zc!0DL+zvgW;p2xTgGDX#feWj6FVb&;I%|ON9GC8hQz{+( zfa;sK>GJ}5^;9%{^5kQ(l(f+vwsx!F4ZW%f=RH(`v7yOXyhGdlAl5~2O69Z5oH&GE zoU#L-eW_+ti=sZTWx*K?8$1SyGa2h5+O@)=jIOR7&p)yOkhqfH8<5}=!joow05 zhP~f8jB2WiHD1vPAC(W|&%R7V(lPw_<$XZfLp_>%hyOR^G!FJkLbi50C*9-tLHhvC zJ-Ah=&I^)$9h@w9f;7}KR-V5Kte)P$Uw%QN@e(Gr^R=yP%m>9 zZX0lqeaLMp69>VUiw}66eHlW3GJo5@ke+M+Ehg;8-LvfRsaqbG&bEhf-p~2yFAaEV zo*R3zOJ6-i``Y^7nj_yVWD32X^>g*aB~Q{=(5x}o<<)&4eSo#k}LkDgtjUbh>65=leRb$^v&hwR39y2q4sB8+x# zqbA%ikcpQ#aTllW0{-j`)~iyKXW3i8)@B~txVn{0*em##37mdZUIxC~RVB{bTF$w2 z2L`S71(%Zi>gmRts*gGrO1==qzb+nm6Btz_2W zHVTaQY3~ciX1a5$rz2si8iAAUU1h5lT;;7h?&V4M>eC(xM-=h{Z1ca3XqBj~()!@H zXPrRQ`H%S9g=f$@Q(dqDgUO~^rReczSVqNHSNq0X0!e}_YWC)ydy242-lP*09eftcA=?e>S z%)1gUG|?^F9au6yRS`VUDpj4@KUV~oLAR4FnDLlhr16Ged%ejh>W91nDgzB< zHm4MXP79xH1r}`{aMB16BULIZ8}_Cee!;$b>Qg^Vz}mSNh}*v?v^K;=y8%<~a)&QD z*!SK$I@8;aWv16xi(h|d#0kvAqzu}49oddQ_f!MbA4};wgU?v4 z0`Uwivg#plkPm2COm*!mG>o#u`V(Jxbtlr=$a6khA?X-SH7vBF=pRPh&Ri!q0h&LS zXfYnd8q&Nl@&`QNct@c(S?dZTY30-sPFN13cl0LzI79l<@-t~218fqJ&q+5c77t_S z8eb|GCya9@Ev1llM(SO5PyY^Pe)K6MUBqlxZy?$P;hvwOJNH6Ks4&_4cGqE1JW>r<&ws~ z(7f~F*Q=Ok^mFX|p^cRJ-I9FwbFSZ@KR-Ws8|!v53H-OW!d2!@TzIJI0RcdG5486D zN0tRnKRpyTk8Cbm)ihBFZ}89bGEO|tgdRP;ZimLN9K5~**F{w_@{*WtH%Ig`Cryoy zpEs4$9w%^TXG3{*?}hl_S`>(0BYx&*dWWO%p>^k0u*pSW`o^atjd^%^L zS#RoBg)oUt+|U~dSF!DT%7Ij z6i%#cpnmo@R)rpL997JE%g*HEbnxB2SgEY0zoy6LpNQi$c33#&FQ?1^XstDxVr1uA zsE)aUr#pp8llrs=@(;A%cP2MEsc3XH@f7}DbQ4MUBJ~Z=cz%ZqT^HHnDy!GE3~czR87-x#!nSKAd=sya%H1%Mp0F^$*6k#53oEqm2ZBfM{<;Zz+C^-^ndY*? zFg+*XBOcjha^fclGIJ5SUo+3Q%K9Vu2e!nakThpvA>lpH+_2bGd)e+t6Lk2}m6ulf zvpIVrfV?E(!V!3(gx})El2B^q1aG3_|_FT;cnfW5xv9XW5lC^xI3?-4+5G z1@M;jy@9-i)cbWdTr@bx%>r{7%@s6pqI*~x9s}V4M6N&>rqVjW@D5E>!WBl>N?cY0 zG=3yKz-V2N=3E-0Zzvgkpd9yi45wb@y&ec37QpY%JEGV$nuh+i>tSaSU`D_0q+=_2 z%flOx^swkR)iI+ANOv;IHmI+kv&)O=9_-Ly(h$daqa(*T;RRpaMGLL-FKO}=(#v!n z@EG1-&sj2xufZ!FhqKoe<|<_Xobn9Hr=p?V=zLfjc9qu;c;Xm3$V`LVb#0?WUc~d_ z8sdMc6)ZLH93!tJJfQrds4>uY!IKA6Gn*}iw-Y=dcoOb6w}gGSw?S131M|koNIpv@ zKhD*>eX9c0i$36!X>Vfk8;p8T=s6|t#Xd%wABlf}@Sjl* zz;jlfW2uHaCGyc=qn5HBt$M<%mDC4cZB)uifOHcItx3Gdr~IvCu|L9rFh`+z7O#;h zcabT#5PuV1S$gYC=i_8O#C1a>*vVO@*k;QwC;yj+3YWSEI63T1!rP&}P|R<>_eOqd z-e`4{+!{m2|KY)_*?^BKb=! zX%S95vlI!}@K}S7Y;~6aPX3zfB+~O-bq^uUF}_+{gflE>lHSVKWLU&+tjn+V>NKBE zoH!q6M-M>fr#;yE-Md8}BjthU*60kYxD`U#U7E<$1@J( zJ!JA||K^Z zn1CV!^Y+b_Iyv^FbEB?dvD-B$nQsZlPFVtFSzP#N%6>JyOSuGP7tLgG-8n1WNJ~U= z@>(D~C3zW<-NBDBTZF%&`DldXw`Iz!SZ})Doct${&IWf+9Y!K2s0dWQ+&d_8Tv_|Cn!xj2FP=2D)x?;kOP)1r4&+p1a zpZ519!U-VGl1FwP3zYA${S$t$=EH2%%PaQ*VX!7IC7+L^`$SGAuvj|X?i|y4n2*Lf zTZAs5y<<0OxX2T3I1$D&%HiN;<4i`mhT7m;FnOFtDq*9*9NOo1AM>i`NqS(h{9i_* z(BzV+?*WDzoJ7A8K5_CUnp|le8z8a*sjj*RMQ(RhYDQl0Dv}RjHzu}&CJzP*&p^4* zBMj8}$y_qqi@ugA0}?u)GMoVNlCeTxVV&WzeD2#xxF?;^^p3%Ss49$Rv;3^y}F_tjAN0x*zm5} zs)Jh@%HjKQbhQKjd}k8s5a;v_e~OoWX5g%5lQ2-Lq5O6SXOpV5;7*-g7%tC4*~tbo zS51U}^-|ad%UxJ6jrOhZZ2?&}x5azeJC75XQTs^IniYpB2e0sn*CHWu@k8EsdkT(w zzZ2#CwWyOEhVyk?A&=CxYAxrzM^Z+X>7dDO>O!0jzE|_x;_Lh@xlF4 z9XWAzYy53{kj;3v8|ixC_WCq6dFTe`ofp&S*0br;OfYO za_eCuvr;8`Uj>cB5033GhXK}ZYD$F{zcyDFZfxr(&nh#4Rods#m-dWBr(ZD6?=|*m zdG$mCt=U+$-WSau-lcu3ta0dtc)Gqmm?Oz}?#N(hym$aF9eYR27w=dbf$0fzq1*Vw z?6B9q!Y|HIJfplhJ9g9vUisdX=5#j1$Pvxt5TAamI1a&U-gq42M`vrUaOc_6^w=$z zuPoxsQ@-%Y;lffs6HMxmgw;=@kgi+qY6EbyIqgl>J_I&=-2u~^wNsZWbFgH24x6*A z94=?=1xK$loW7ra>#kuFa0>jOefIKcKjF&F3ELkbkokuBq>M z!fZ_em%}?@x=m|PPAZJn6w0=RKuwH0xc&;os9TM2oZnn58PXYDiK}LP--empw}N`| zKkQsP5SDj}giZ^ua+)jrX<4X;o-QOxUplR)^KSIv95ZO1UPZqWaR9`r66!?t!D zri{t@#m1*3Dy>XM;*bxCSTDFk5udsaSA^*DvvEQE?E_$ckQc6;q@(`#_C8ZrWP{=D1CqM^ z6SxHg;?@(|@`kT1acA8vSd_hs-AP%%A9)^u#lD|dz}oH1YPck`ZoT03lPk1e+bPIs z^^`?iNl~bNpki=0u<0=a>ZQ@S$UnnblYfVSK9_w8vE(1E-tz^%1*mKwn6RuVtzX_1L{B8h4g+# zb;0Ug{RC}V|HCRH6A(Bx%=I>JF{71SR(%~}axQXx_afMwyB@}NT@FiQUZALpgAu2( zhtw9Sc9F&nOFecf6Mr;>R;D+wW$XIt$SfDoOYX1Id|{gojv(Lsg7ziGSkEUNsD{w( z;uVGJjqt;oA9o66LwA{B&Fo^v!#B_v2V&J2A3l3@IK0rgi-WuivEb+h6k{0wY#Qo* z)sjm$On}O3j}=W{miNIAJC^gAZQ_yELtvtlq2)J){?5Jg-_iPg=C*t4LP7Wd$ZKgw z&)jc=_S3E8m|LFG>~%&!IL4~GRI!CmdSGp*$CCSz?yS)1G~~Q2!0cm&f*WvLb4$4( z{5OCNt~;Kq?vGm;k+h_YgtXBR-+Mln(4I83Xix2}U9?a}l#)`3q(vd_`CMs}7L`g% zL(wih?eY5@zdxQ=&-29h-uoHv@%f&6PAUlewgNgMV5=_BbMl3r&skCqt@Zk1k0y63 z8DS(^6aK)LX=d_8_ny>?Ct>^R4AE1tdcGZwGJT2Kfn)G$M=P~Uk0y*TkiT?| z=cD#m;F-0Fj4%N7-dmLg9JP!k5B({ye!OuS&h&4mW zpMLBD#7*pz?OdSV$AkNm;Ys)I7)1NY3;sLUa6U6S-c}m(BTA~u7{R}J6iUR$jQ&LW zf9&Dr5;&0agY8_lhj}HLajHK)SLYXq9wFYMy+_X=)i`*JoXgu>p>>5*OQGj4FOb)L zQtn=wE2Rw{Mf`gKM+XIB(5AIOdE-WXe!!o*hj8#uV|>=K6J{<=k?C`xe_TsWz0N%J zXCn2mvhZ6|)hu}}+I?9G9?r8-+|!C@*-YHu!^~T3Xe0MXi!iH3D@1-$^jMX{q|IqKH;gWBD+;ILc7@oEQE`;}G zPqy`tqdFU^6&E!aR`)9g>V~pciWyIOauxzE4PzBe^Le-5p-9(Pn?V96Edv+p`(S;W zP1xJ%G!m9@)gc9m8*zK1Q@D3@9~8Cc_@n~qni6rH=nHk!rRLysI8@pbdIipg*Ov+$ z#&OaEEV1=aez0H`{+KTVeTGE159uzn7I2Ccie5YLWQE8d;c+(Ov$`pdny$yM&wRlo z*9z!4B&uhmyz!My+Jp50J#}bD&PCiu=+yvfRw$7+0i-*$VCb4N>_%l>=uYdzsrK=J z;a|n5#ZrEz@DIR`-`NWeC(e+Y{Od&T zExaLK*@dwcD){?}dk+GM0B*_lr>2s0lOqhv|o3m1B>+n~*g-Iw2NT!%A?(3>M-Q_$e6 z!WS&CkqO^~ZX#S+22{H&W8Wd5d}H;y4ZPDN2kIML(j)^wyp>uKWEYbH452v-ScEvxX?@f9E#S2J-DwJ=T`~c4!WDlZuJ`PP69E^mcN}cmPS>%8B z(RycprB5AK{BU8Z(AR{6A$k4OWca%w86LbaRY{k#ZDTG7ea`D%TR=Kd!a???XuRTm zZH);Y6k3tAmNe`^4wB{t!a1ZI;l{cM3%|t+&c$7K0;H3WVuW$@_JhH}ZaA)kCp4|FLzgY7ieq&%ez5wz z^z&;s$u88Hb^EQ0m(+X_8zk-k>SxjgdtV%~etzeqic!}K(erN0de>X`H8fq-oXuV(_|=51O8d1hzO z^i2$X2g4+hv(i{vS7=Q8=)4Mn3llCQ;kPXAfq0wiz3okU^Bp5E!6T-=Bb}=w7w)AO zvwtr|{N#*;5nN~$585+^G$S)yk%gqMNy`;*${{}LHjsDOv5N@~Tc;I;&Mqf_bf@G# z$QvkT5@EMW9*~h{fwl!DT-2xF&1k<8zB|-R9chuoh@Vu4JG0TJbOR7~idy1cOH9>v zJ&S?34@>bJ53L)5UVI3dMbJ-FWf_TX+kdX7q{%Sl|6dDPMYufQPK9;ra95W1x3vy{=LabZwWm|-a8o+Ti@b~ zR>pwfOVadtV}JBzqJFwID3=D8gb7YZ(c^-*Nw-414HNi>l}B;beGe|4zec-)g>2ZI zM>qxHyV|J4m%>A8DAzdSKCL1A=0}<>L-;4yEN8MSB@R6G$PQ`I?s6;(3I?I8$YU_l z-t4@pCvchDFI$2$TKaOKyGT1J7Lhj4X7Xq-IsP0-FU##~F422AH`$mE{tEeH!aPrz zG@u+lFBO`Uoj~0dp|JBn643L*zR6sf*7T7?7{<=I8>@3;ItmUYjc^$qJ5_Rf!^3a` z4OPN2!U=os@oGP~74^ZX{Vc#KqzhDT+AR^cQH&b!M#%~zJuGk>DeeNhk)ElxhhHht zTzFUF9Y+2S-d<3V@PZLmk{;}h4o^~rcg31#<}keE4^MaL2lJ*MfxVqB;po^WY~l1u zfqPu=|ENm|NL~rT&e7hznrZz)->VvnZq`se}tFhL7TMH!6ioU!F(m%_jsx18STI5cASy_L()LPU*X~f z_r&Z5Xnw-$+Ze#|t_nJAJ&=3*QZ|yOfo+}7xi9YPFReWoFElaUFSk?#?ve&o>dEG^ z;O9dwX0qMrjzSlRd5T0DT*QHTfX*4*uoroWOlwHBFfS-9ZZvpB`T#He2*=Y^}bdc;N9JS*@Fg=>^=34G08BbU z{dkad*zZj`GLdF*S7AoWn>=bvIEb0m{N1+XLC=DiPmr$?9tmoOzJT^teI;981!!p? z5{|H62T$^^#%>z&%!2*rYQ z$Vy0NHJm&JW@l~Xr0p1KBbB@u8fiH(vp2;!Y1?6L)_9OgTuQvOm?a$DhUD`Y#Z&lh zh5V|hQ6R0zg@0RgAwcvDBfrSST#xBzQlB{yM(%^ZU6K^SDm*&r3~9_9>MuXi@Z-tb zCZVTKGkMi{N1Da0$5x}KspL~YU?}mrrq$$q8saF@bLK#E1WD8*aWx1WS`af$#25(c zP%F6=_rW!FNqz9&wx)S zTEg^IG$$qA7e1FTOT+?1U+*3rNw~QOyY0B8Jn3El&CfOx{)dY>74agFuUBXW$wgge zImZF%Ivn$%3~P*ciQK^Vw?3R^oap__0BCLiG+%?RmW^-{Z%?0XiZp}bn`PP)X6h;O zN^eVL+i_TD*sAUqm1wa99n;7LL(A}6Q)mr z70+D7>`BZIgl8A?CluP4=5)N(=vTPrS~H}1t4uXQdEJa-e-yC>=ZeJq7VaK$WY1T% zQK)aA`OX-mp62~jdl6gk$WKDU6{~Ds0KhUfU3iqDC^ak3*!N2mzpOA6+!^r2; zIn1GSzQHXvaPc;j^Vgozov zZl4VT8yVp>KKp)L=uc(Lp$PJ64qRwr$`k*P8Nt)etwhIyQ*bJ`kXKk+!2^SEc)z%@ zX2MTrb+&mYW#s%%cmcLcRn!;VGaup4((Cx2rwN~VI2m2u-i0%cp|tL*A6j(i!S;JT z!aDgHuvnPLdwGt^(D7M^IRwn_iQ)#Gus|7{(190$g4L}s%a&9XM2 zpKCfUI9$WsdT3$m-|5QnR{H4G_A03DFG9e!7i?_Zq1=@f=`W6qM_;Uy=iCx8uvXt@y^M zS=fs9gjjR&3tMMk4Chx3!pM>#v{pY!3T)Dqh4BLXU_ZwF=kUEy>V2E`@AQE#_FG|6 zau&=0bI5;fEE_Cnp&s~~EKT#ehtrL<x0Q3SE$2Gy`tubjX8fJT zS{+eWSKj{Y0Pk%5p8bm1&N|ZG_%r^K(eKa?rtLomUk}?4TaN7E!K<%An?=pg>gGl` zMfdb@Eb?(N``ZE(qQ0jGSbq?@jqREL0PsIIP?pryX9^vCZm}4T@oY?*;~5)mYc+m!17y4VWBu2G%D<}d5ZbW-Mtv#JtSdN)LBaL7 z>4LdbZxNuee}rGVwpUNO{@}ac-J-Q+TWL?fR!B9;^6Hl6)ic&sPun(zH5V6Ae7fa* z+}#(lXC0^C{~+oV$4s~`eSEeb;%QxQznPuoQ~&m%q3uh_dy0?jw=x754++M%XPx9V zCf8Wit46Y&U9@uKKC%b;|84v@iD- z41GBbx(=f=9S5Dnk-2>#I(ioi_b^kB&bQ^|CRf?Zw|8ideMh-|ryTS?x*P5{?Z{qV z`j|I@*16{TwNtxZTENG=u!d_3n}ef)2@b7}g5mzw5bGqPb4G6V+qVYb_U8~Q8ghth`@ctec6Q^S3!PnPCl^>A zz#`+pAeYj2iVw1B@4HmqHp2{JkIaU8#_Mt?KWUFcT2!&mqs`EMtN~%tLLR$#I~(r5 z2RE1KK;-rZ%y`6ZENS3@4}Yiehrinh9N>%I7^#~Y0;XLHL{rkGf0s1ijy|D;U6Vzx zz@0ZEDHl_5UyM1`STSMO7rymX9Qgj|tWsaXY5%vPUhtCTXQeEAEnC!j9cFzw!=kT7 z*Y?(c78dG>_&d-uCLV0*-C&9tVMzogeD4aK<{rXPtQk_TGrN(~kuU^2G#}X4u15q; zz>NP?#b@+HpwEQLZ{1+pW*0`73*q0~P$yt3#AR-gJawDG>YKxX@ScetaWJ{g?uY%x z_SQCX_wTOo_h>aP)3%bIjJ<>O^LXS(ChpyFkBM5Jl-yOmnl+RU){CR~_rbODbDV9S ziOsF{vu+#mK;O#(dIQxN44GQMsGkMK(a*c6?u*TV`U36a#v!Kt$8!DBm8kILQs~Q9$}%|?($4(` z!dGrm=NSz1{R_t*9~0|NrJHwp)#6AoOyQZ^VllN@urjFUHTe2&2u`i@6evHK;xH<& zN$45r!hZn7b;>83W}L1em8BAKYKcRR?L@*B7(x38 zK_f|h|LQruSks3Q&%m+gAK>vKIuo(SS`3-9jEkHfoSDf+&pLq#y5?%jNkywU3|vzDR^7)#;e}zv5#bhg3F$ko#$^2H__+* z0Kx~t(xJF^J!hl`pm{}GTpCAfsiNL0jdp2c$C6Ms>Gc-KaybqEsw$K=>GO$uuVeGp zA&l^wXKv~YmXY)D=ABEpD(XH&R z-fJ^f4E-Y2^tg_xi8L>Jz7MwAo8aRa-Oyw0WxVQ^T-)QW(FvmVRjMD{wA~nqpV0i* zF{#;`aP}nS7>4OIgP=~?R8NcHxsM-Im-u0WN=vR+l#nMdk+cH5Oj(5|&mU%lGpOr# zRCzk85u{5qacyxd%UW6=^op8e&DqsB)A2Uki+jWh12?mib#>&)j(W1-sM4G3Rl+kI zL+3~q>u(h?;Zy@iJj>R<)yEqZtvT@^ln%`1uZ|?=Z$3kt0QzQ z(WRamiNsBG#&15iAG--0qO9el(i=RhdaU%ccp@k6R_WgH%+4Vip*;xyVXWT~OnI-x ze>OXW>kJ}l`9j31V(22pYT#+Sn5By_dK+wg)fnqtXakwo!{N{01K6p}4J0gsG~Z(= z^nu_M;(C_hpNNHlhB)_%Ip+21i#0t4;gTy;(YWX}MC(+;e$PM{v2qCS+0PSa$3ErH zwuj@L&YAGND!TUi!51CS(O?Vn-_}?@6f>3TTMHMs9Yo@HchVTZy*8n!Tf#yptN4b* zPi$~uBE}dRGEq-fadhskUpnRn7|Rw5Np&|*WyIkueutrKHP8*;(jM`P0!P7K2P2tk z7?Z}Y#TD7wBL5oFD{O~NbK37a9dafNWKqNHYH__7Dw$-l5%a{Mhrkq6X9@ zS6(WQGa^xF%g2l2VWrhPT-b7=;AGZ)MIDvuR}nn-esP>+byHtl5B&QBj;42@7w_^V z&Bqz>3Ap9lfEQ~D8R=&*4}J_nv!1))2o6J2;iJWJ!A&aZC+bl>`E1ejT+-`I-eIKP zIWd89SKI&a*3bY+r$UR)UHB-MT>hqS0VYekg$6`XD?0~gFyegv-U;Avp=IusP?-^~ za_WV=b_v%Zv2A~(K4f|!-q6is0({Zk4i=Sf7~v-fEH|6ok=cj+g$vLG$R9|ScM9Ra zxem<6?LU@gbO%2VKEa&17gpIDv!E4S5d{vxunxlTVHb6QGV?XzV@+eDAH45kRdU6}L#iXBJ*7DGy#@%q}fz!Nf zP8yI8QTq>{rzDNn;zBbBo+8etzH7yMG;50qiz^xZol2Tk;H*?&X$Nnv)>nxG;rZ`i zXk^}*9qC?|e;yqT1!iZt(Z9+j2ZPWkjC%Dd#|{I_OyQ)NX^eQ1)4f5ZN0dZ7t+8!AL~tf9Tlj|FW6%Kc4DpH%k}ih+ z&u!6n$#bC>Jcv7Z$;cgy;y`*N3>|%RWy&QN&+}^X1s?1@T>5mkJ2cqq1G_UH@}uv4 zIpMO>W&1f$@SxzKqc23OtedGN2_65#;isWK>x9Z&i` zj#oT&K%ddiYW4mr>$iAhr8dtEh+sln3hmTtJp$FWT=#Y{e_o=^L=V$5^X{IeXi+&+ z^cHExro@p3@MgnlWzsYm$S)8cT1i)~G!dFy=yB|ySO}et?8O(0USTBdKbF~_@eNJ? zvUWq4&^spmL_IOm5=`*ednZ&#Gh=?h1I-H^3m&$nFBiN&w7Nds(*l7Jv{=j$hCOy- zExvNdw|xPzv~Ik^sO@ZhiWC3#Y(A351nN@|H9FzLAT;;Z=f|dcGSVfoZMF{iR8{bp zB)G%RwH;O@T+O>b)B!rb+75}SznFbfXGU`gh=-49z7yV-`jjyE9;bR>^MW5Shz{Zb_mRB93gXp=q`QV| z7PvV8X`os!Dr)Ap=R+?1nBnWKsQtnQSIjxgt@Ow7#Y4UeexL(C6d;}!n2N;VNIWfc z2kUjsRLxKBLNkdeLce1Zc*QBkK)95@CMpr0q;v%RRaz2xd=UD*%fqfRc~SCJ^YGwF zBNQ3{MmJ>1^J-9hzR(S%J;-P6;jVqp(R_Y03d|5OHrbp>^9yVK}*A^r=mty{8w@EC)y%YlK#&S&VehS;1~sV>o#|RrvOBk7!Q1ixDsJnB{lHOofxD zi1*zaUG^dDaWly6S6C0_Y0hubI@aGg&GEL%7eiQn;X;cg(#kp8d1){EH#Y_#4Z zG?cn@U^l$wRwKPVdz>)c3y9}wkG&#BxXw!Awu<={9J=Sh4>it__e?ogJL3`>VD}0= z>OCukW<=^G$D!DBxGgSe;K{;tb|Liyv%c7hdgr%9_o@o-L9-WT6&HnnkItaauoSw1 zW-I#@(uN>v@KDT4F7(-gg}WK`G$%cVy}SNV=vfqt4i_YWE5spSmQ_b~*CdJ0ubt6Q ztl;UWSiG&hn<+&*pxpL{B}#_%q-(tby{`I9{}D6iEi&%+Os=l@M!>OQ~NsjJ$iqZiw=UnBSpJO2Jj ze&syU41xCUO2wr&>i}UsQVz+_uO*M40Y;8>NXz#IzH}UE^#~vj%*dNC!d5hn-G*D* z45Hqti{}@-L-H6XW-`=&NLY&}wk%Tr&CDPj8;4ZeKpde^j*&De`K^bHxPVceGMay? z^n1*)pbHoCv#%?3)#Ms)T;BO4H}M*UP~@F!FwEpzm=Mxw)Ek3j_yUPpGeyQ|LKJL zjp~pV@dBDbi2hW?+>qkJsx8{FF!xW&=vH@Yxxx43XqeEgwa`9FTKonv1LB)~hG5oG z;`3&$g|`Bls}UZqrTMEB`AAbF`~oq*6?10#|44HRwTs13jH-7*vA6&yiNIoso*aTR+yHdN>pU15DJRW1cAF&xAK)qycb3w?lC5 z=U?&saCcH~bX+!uaKMs(-|tTS`H9VZvH}}N+A^90iyZ2eCcp3Em5Zz41`&8b^3F*|?czK@3&7{i)BA-K+AEyks% zVdCsQXx_AuyvwgSKA+S?i7W{M_) z^<~YwcyWgw3(zmC2ZVmMk`Inp33rx7;d#ABT&?N}-^V^@zpH6auBREWJzy`Sx6a(mK-vade&cG(| zHgcnnO|YhV81kq}dOmF&`^`(vO9_QZzQ+9Eh~Id!`Frpf?m}m_>fkh~jIVGw4nBA4 z;i;=VF;FK4K73K&(CQz|x#1PM|01Mo^LB%2tyqk<95i7l-xXJbRsY;DsHZ94`wm4s z_`I?SXl=5CxoMi=u(q$c&afNcpuG!oQW7xf*=)Gqy9ty{`h;wFZ+<^~4hB2)glz%w z{9m1X-sXl49{pPe^e0d*qyeAm!S>KNpghs<%*Vl7FJt2_b75}mW(+#90u1ASa*91^ zy`!wvjcm%Nk?dO!(CF7;_;Ae;CoWAAxhJj*6mjD<1J}dt_r=`DVjAp-{FO|sb zR$yoSAJhL;0MeZyBKFeH8M~Dg4o=YTB#r3;Vq$!Q=^Di^{ zLS(u>r{{w2ZZ{wzo3`l4*~7oP4aQ#^#$%Lg0;WAngS2ODRB8MUFe|cvnt^)aT2jcg zQJ^N!=Nip~X*RUy)s;K2tSk|l(M(F~*L&u^@-wFzV&zR}{pq7jChByf>l01Kid8_h zB=2dl56nGUpSe_}rPBRStZC0;v#oRwn3oz>2zBY~sq!YBr7jhN<#BtjVBGhcw5I6^ zn*3_0UefEubnV_^ctHeTUy#R*=1m341C&oHN8Q^#?1r8;1S}nhuEQ4t_J=!tUC)(-uJYVJ|M5mm+hIBj1L_<6?~94t%fc6p^S?>+ zPFw@Mjh2wedZpB{-D^(eWy;K`NktgeGMjk8JjWd0B^0Wqn@vd#{m|0^2xi6 z@h&{V8L>G`zA`KKRozY4Ds4aYQ#DY}@#jE$%QhXUx!a^K{E4=}0=-3||KxxWE0sQr zO>Fd$#iV=621SpQ`BDsD(f^!OXIL%|2uWls7Wm6^4ST9)9>Y<6^i}y$?Wo?pyidBi zY#3pgmbz{iz=p^&{_fm+WWYJZ+zf4@vKcxo4<-h|xgRlL%15@?Uxi$9~C)y@r1;j$BS zUWrpMAAWeOa%cN(%+Gm-`(|h2psX<%k^T<#jyZ#S!#bRPC)fE+HnjR$#DBTvBE^vH zOge|n*3H0G2kq3kh8NMMyt7R8i=x-5eihM|V-Gh2+b*%-welF-^W9h#vD7HvQXO7F^RVPbs)VGx1`q5mz zW$P@@lsuK|mn(tl7X8jN0>VZ9B|4DpYNyX)b#2kLp%tU+^GUOAVsRktQ&o}za~j3r z0*4w{vN;0Bh16mBUXC0p>Qeo##r|0f;PilG?5fFt-_`Y1fsyH}C*r&^I%lq0h6B&a zl*e_iLetT232T0F%CmS*(F@R3#wmLf36o0E_vIm0M?V@S+qA)#Bb~v+DG@!AM=H1Bi}asaDWn+PhMbhM|i zw>-58ThE+}W4_&!MZOL^^T(L%NP(w(sec+oMmE5;uU=r?qF&@(Z*q!n9`y*=FBy(y zKXj3v69_|LRM!ZI?==w@8#cv&i;KCR&O5x+z8pKw^a7*4L*Tq#Apf}gJbM0ihyUDO zveRduaJmPiUZXvGUMqv<>p+>U1@+GfKH*zCAWY{Qx;sHo&q&fMI_iK=Tk*<|aX?t0 z^t4YxbzvBP^nPPk>V2fTg|xV}EH$hTZk~1o^nZ27Fw-oI{Jt7Hycqz?i?6X>Q-fLk z_^X^SN20tk(husWz29-ki6ppwc?wov8%8x`t|+PH-775c-+MvTilq06;1SH!HeetZ!1MZ?!t?@ zHdO2PXcnvTgkHs*xJlF;2+Y~n%NpZLTA`D5GqoYT>r3~>Mc=&cq$i#cD@F$5>MPvO20^aZZPC-5c#h>p z{Z?9PXW+5b{Yh)avWwjg<5K51%yij;J%5KogZv`cd#MeGdk}aV=31x-ow}*Oj!~S6 za{?)U-#KY8p(#o4G)4K!Th>}Tg!jI3NXhnk1H=oQ;>c{fG=jCJKk#3NQiX7W6Q`38 z+QLc4ss_g_NW-0lfiLrUeLFMObLRt2{9cPYm6@qhzdB|!KnQSNvxMvT0~j~F>(yTOfcyzc>pGzEUJ z9LxyA1;+74McS}%0`0Y-(*{fr?1ue~CDPz+WO^=HVE&qBePq%+Y=rMCe7z_T=;!io z{YZeIGc;lGO-rO_ceLp$y(*x}Jl^lK2ioNLorFL@T z{LUEBT??$zUNWk6Nj=*M&w53HzTI%HPy4&Sy{0m&8_VJ1dOsMobTSU`%&GMkq}PEo zo@)2Cf>R90XB5`P%Rl6bBp+|hD@H!zMUR?8(W3g=@s~Bv*Hd-$TjRvNUHI;#Bap(62n_)_t2bhU1M7u;B`;B5j!Z98@=|nZouHL0 z_*iHn;(Uzx{z{^{tNp!UI{s|KG;cWKB57>2FSE{0-zDK6GExeGbQ@`(`O3Oo2wQcp z^F7}qxagy2nJT2j#k1|9jn$O6ra*a>PGrP`&^i$TDMGTpCA5${|prpw+ z!Pk_3JM{5f!6{B`O|wEy{eiucW7)W+Ins+xC+SS;=R#+5!F#0VA-=^R(FgeFad&(c zei%0f)CeA?I(WpoACCqTyVi14s5j8{leCP) z&893cJkFnl7vwGZ(_8o}c=~)FCmfZDUw||LT#gDu!V0DSpIF|B+&v!ltr1_XKz=VIB(HR8(2pu0A z9DtXGyoYP0S@`hY8c9<@8@U^_z$Im;B!St)|B}V2t4Mi}D(@+zOV@JhaXPE+8oPeP z7ED(dsPxQ?FpE`YI`dRT+t0EQApTv>y7|Gi*TZJ?mV@{{|cgt`{_--eDp75+S zy02V-FP?{?kHssX`o+d354ffFSVnpmI*ot8PK_|iv($bp{0d9%wGjo!xH>(>X%m8= z{=8iLbL$h32V$GEhXU2R@KR9aH~{+3-vv~w{9)!B9Fb)XT{n$nq!maLJVB~aXuISP z^<;wN-}Qh(o*4)`c#q_E@Zz}|Q9m5kM0q5Tco)0%#^pz1g$O^=2L z`eNSIcpUWLLmqiqPQM4_bHH}+NJdyJdK3-gm;c{m+~Fv&O!z_JlSq5wi-AiS`77bo z`J+ka5e$-O&zf8m9{M)y&=!Zc#xfDUdd;n^51nNPUMrn#X{Q)^sbQaU-qcUZnPbI56H*KKh8BI{jDnL zBd$w5=U)b^8$TtwzC;)&<|sI7Obgked_5Q(+X(_cTnz@+)~>*S;(gN@`E@3=|Lc(! zXtl1CT?~|I&A9_uo^lo1U*0u)9K`kdA^Z-Ij-VOM6oCnBi zE=zPzK=D`NdM)Du8`MWjgwNqLzY+5t@(2BSXM-2qZk>Zf7{|za3%|>{Tdc+fhEDGO zOIP5*caiLtEq#wMZ!o8tMgOJ0*oB-de*SDIpSpB2W;ef!o129~^|jlqQPXr-S+)U4 zvjFKJXyifr`(-V_L_SaWUD>R~i1+DX1^A!_pKkrtdl zGo)oS*O&vO=M?folJMkS$zICW-P>ztF26QZC^TEiBb@`{TCLmc5L!(BcDkG}EP|2# zEL(6x+wF>VRChyi0ZBh|WGxbGj5HsPxarh#&{kPGeC=Eh!4qmSD~Z_xXk zGxGAI20>uk6ui~j2MO=gVGq2J{4^3aa>qTTN3_nv2>ZEDn57A(ib4Krb+yBey&>q%?K}x*@Nbbx2x*7B%c$u2w%-lClnL+ z9YRT?qn@dM9tT@Q2>euA(pm}XXYz;RAtHS?2>%xu86)&791TklGYj_hTw5HqH<-Pu zYoLmm9BEO)sfD7SIB6D6b12jpbW=sWchdC6>NOqEWZn%XxQqOj@IW}nc@%m6%|Q9& z-70dK@vyqsVjW}6rX1wtff&sLIr&YD%uazdpHG3nD4K8bepk%o9>aBjW+vR{Qz?)S zshy>bJbal6KNJ5wk6mrw0ZC8OoWmPv#)VW%oaRWHr)VM*jzj5?hBODdiPfnE82iu| zC22|G&7W$ETawePa>`i`RNo}7}-@1!A?&fLjf$CeSS!5wo zyx3q1W1!mNG$*a~e&z4?;KlVNNE((Eu2&fKrb2kcXfDhCy0t`414E>F45NHWk=cCzGTaq>oMwX+ zQeIU6>B9BIL08}bN&+W|J81uy39p48W(K!AAbC!7zOWyt&xKC`>N!R;Y9#FdG%JPk zRZZnj-n5@%HLab$Vur-)pzU54DW6C>o6}5IB`iguO|$&2>f#5KT2NT@1@l_5zt3O}dpU&(~=>wOl)=H!|q@Rze_u-4^B@BC&1e+s0 zX=Y>v0%yBzi>{qPl1Aae1JVpuxiH;C6~6x6z|MTiUMrdn?Zxp?Eueb48cQ} z4bf!G7}mSJ7T?*dBfS2Qj5Bt)F{wo$=)_paF_?)(V|L*Df7jTAZL9g6h;U5r>Z^n_ zpU>U}yunkxXZV_upX}O-ZWurHHvC+4Sjx|Kfc*}?@t65TC>?Y{sekQ|CfD8_CbrxN zh0zA`z#lc5_m)o}Gp1M*yl4#{-tsS2(7sd?mKQ=+{Zp{Y{tzAv??`LM^Pt(nT}-RR zRp$Sv1I#j9&$JA7VBY&nQrE!sc-<)q-hZnnuNyp(1)K^}d#yhQ?|g4!lW~n@dIm{e zGzS|v4Z~J1cENsEE44iG1NXn}k0yf)u!sHw>A&D|793CnrBf@>b-)WOS-Jtf=>)>i zL@kxBi@#cj;Jxo9?p~W|pL+TZJg&ic9CI@Tq8#I3fcXi?ZE6kYo<3nBPu44R;e<;I ztSM^=6FauVT;mYf`@K7BGSeC6?A^~lraWaQ9P}XhR4869X(WejHUYz-pQKj_+o1UN zcbNU;7=D^OT%w=hJ95{8xF+QQ!U?|vsEFtLh>5> zBVof96)*OVfmJLJsb)Z{{WJ*f(TG2N6D01FQO)qb*R2E=1U*!(qP& zNIE}QY5P_eS57`99nflzUYl!R?fRkU9B!<>jR`WA>g5mVL zKJfi@YAwd-dCtN;X5XOuO9>ajVRrPS8*EKG%3cJz;jL!*(D*24-POsQ{tiYr=q#t@ zRN=<{nb`gMdidAd4u99}&72RM<@axEsVlaIv8LMBu-B|DY(U+{s=$b@>xK)A0;dmE z)N^sn`S?Rt>fIPxPt;ZkqZri+8&mawMRXfa=VJJveJA>U=I|4+C@5gD(k^D-cPSs+ z%1!h>J~ebyZ{EC&Z!Qg_ckGs7uJcf6;rdzR9t}26#K<*e*j7)$Wv%I4nf49TzGwH) zJ~Lfl!kmt5nrj3`S8l@gOEzNbiR<{-PNg{e);3-`bqbV3F&tAh2F3k&NWNeivo-t%hp5)CKV6%0`&kVK~mS3IoI5{sMDB#G-}k0)99!6)2xLz^PIqY=PfT z=i#OQCWGh!yQwGnPVZ2N?bTH-53<2q_3YX0tLD6ae_J$}_LZmF_GixF5j-sJ5WjBy zfp41|&SB35PPieDPqvXYuJk`CD`1f4Okkv zsowKctWzGz*Bm>{eZ60UxQAT*Rn(7_$Y(i$%j}yh?C2v#H6!aT3glK5<58lZ!6)Q&3e+_?3#A+88Oxt@B2>YSKzzj}&#I|49jgN}2u+i4nIK>^h)wGm9 zH+7N;>v6&MnF8;SuogzwiKqUicSdKpC~Y4+$3aB~Jfrk3rrH)GaRgF+scxf{C#&t@ z{N_DC*dTBN>SxS?H6_cTPTgN@d(|xIG@ApD?oPo2U!rj4@FV!X^-uJke1O@@v{$q7 zNa<7$2PXPa^ybXr?QxmzCh7a*2xhSP8H*iqgVS~K%N2dO_|qx)yD~PDuTCL76Zkl1BH1YOgd?O_6gGJC*bt;a>PxIy> zX$goAt!EY1k~?HEf#0Ok7@`!AZYxx-b4-_i$c( zXcQ-o0KygMl1}UCXD@)?pQGuu*r^yE_@DfB3;BpSH*IN9U+bt9KAi8B5I~ z==*8X9Mvuv80FX)H$NQ&`syw0)Yud$ZZP9ODXR32a&wO~$ou&egk~X5!1f{g3GZKH zwL=pov>y(xk>cv4foq#s5HS{*xzX+c?hBQNjvN@%DqU8aYZ(^Mc1hi8{}<-L4h zgW==4v1d6ykUjPVQ8(ee*Rq~@U2yvI#~51qk2T(BD?5Dbs;TGG3YYG=gGV3KBOQAW zNCR@>J0yK5QT}l}AI3@Fpni%q9KG_63;ksK@B|)S93b!PGzo6}*yB!GS8zFLrx2kT zVatC*;o7DWZuHYhXhtqL^_*&|xJ=0Al!sb z9kuA}PU4z#PsfQG#H7f_NSax8U*!NcLC<++On=xgX&RDFpx7@HIvSgIt|t$QGY5|V z+Q%>OH(YACj~%HwkB0*tWufUhnjEZsKGEOANnF%7eJ&tZur6M^_r4!MqMYy`v6Z`ar~i&N=FXb_)i=#dc-NzMy)r z(djE&{nHmo=i|@mrf4v^0gw&_(urs`cf2G%CuiO`$Uhtg+g7yVA9L2hu!ZSBeu6!p zQOX1!9iI}7t^JoTu|?=s@)!v??&C#%Y}F;a{bGQqZP4pd!ap}X4vCt9px3&ay1J=}{PfLh z(jpI)17B#}eQ++-d?eDjpIGz$E==`G#q;}a;lQV=^5@PSh4_~LjVls9MIkK&?NUGU zLvLu`^m)0NXw)D zFH?>b@?ru*aQVw({{GumT=IAVk7yVr*{!ZZ(p*^o>=w3Ri;NB*v-p{v)p_Wq^5ipn zad)z_{Bc(=!C&NKd~x~bsYu#^4NY82XPHbuO`lV|V8kP;@mGwvoL`%yCC?3PqNd0j z`S{Co8Pz<7_tvWYS>yGY)Z1EW=+`7hIEU)j3?Tf&DUkyi)v|`-u5Q0z32ndc)eQ5W zOPWVp{^jW|JP+Kfu&nigzdUn=j*&!cDL3S6S3r-SXVCJGr9}GLgK&+jUtRdj4tGTS z@Kle3@cr5wsCfo(G=B(?#;2L^X@xW+e6}xQeJkIyqYt(!b;?cEw4CWEblSHT7C`=x zO>C(T58G~olnEn1GkyjNkJHKh2`9gz5ck89OGm)ad7r>CB<{q1JA1Pbw+=w}%gEPI zFU$q<6U4Xa{OxRGp!~vFb3dW2aiRu=4}fk>Yk)L5(lhXkOURegzCAy(T~%y<02`Xy zF!EaP`)_-i0e@h0Pqq3gE&ZB^m++qWCGRDhr~%<65FN%y=P>=0JtBu({2b{aByGZkb`hFP=)b#~ zv83g>JMk?|rRU(Tk7bzm?1%`Hsa*D#oPe;dv2g>Zh&XEvN+v4UTo(tzun*k zXmpcna+nFh+dg}*`@zpVB@$t@=W)6IO|Ox z6nc?(m{Bj+)?D59jc{bpB1JzlmpA<{6Z&3r2f}jp=ja+FkN!W7t~;Kq?~Rk06s44e z29Zjo68Aipww6#SiT2Rmdl|`yvKpkKp(RR)d!DOQS|SzAue6u;*8D!lAH9CRFFv2o zx#v93dwuRbM__h7ajM$khb3l$gyiWlj`n{dkE}K^-Ay_m3Uv%t3%!jdm5r(27;{+| zi9&mkk9QG1Nc1}Cd(yI93(E!;16`lM7AA0V;2cBYtK^I;bAk9ua4|ny*`KuMGi9aG zUKAWoxSu=hj~Z9S!gs`b1=1xp!YXml$Ai$%P`ovy(!a8s;9){xC>0B z^=-|BudH6APdsZTJ8HcHhbJD4JO#VmECxqc+!8g->GRmLfAg`(APCtYp#< z;Igp3ydl?w<(}QdgubSqt2euS0pekGZgppxb7%e{`x2+RL#i*Cv@_E6u{8_m8NV9? z(az;4l3pf0&nBJqS~(QIo!fPeMe^v-W2u5>i_L(1nj)E;g^g~ej89AubqFo)e1nCb z9VOD>ltnBg?HtToU9v~=P5Ai81Jc{HzX)MWy~AZdc+bU{n$6Av%5_j^vKl2DDJ!YV zJ;*b%F9p+qaxdO}w=rc*y3lq}DLPiCFv3mYjj&htR(7TR0oo(nOcq*=G^;H9oQ9q$ z(!8mJDe%-gg>s-lAm)hjC$zRnm#E&5@D2o~jyFq@1-=qT2z*8I=1BS;DL+w3FCqDQ zPV>p14hY71!OsOgbJAM0Z$u)lG*_YG&Iy{sG!$7^ufndJbTklmvC$vn6v|?dYF_9A z5Nk=8G*D1H}vc+dLN&}+sQhg`XlisyLdf;5f7q8 z_-;Ngcsi_Bmy*vr=Q4u!aHHDA1j$Ub2)9Is_klECXTqM{*y7GIe68n)v<{T7+WTE7dp_j9V_COhLwZf({;ZIN>TDNEt=mzGd3ry_Bd;0xA}?#VG*-$S+PFb22n zEM~d)iiks=Bk44eCn5DXBR{DM?bg>foKsey2n|V^ov>j+UG75tKp1!w2V9>?nUh4i zr$q1ylk^V40Utm)t^mDZ~jRi=rirkYM&RC}2 zA5UjGTQdG+V+<1-aY@%kICexKTfWPOk;j3>kzP=vIMRD`12K1DW3DQ*=03t{A=!%1 zsAHuFM!J=>1cusy2 zDSv|J*R<4N&&M=pL%HUK`m)FPAvXcVcs(lj za)*-U{PmLvWs320=w7x4d>nTp@hDZ*t!%t{weYsigmIKd9D^x8vgq|Dz#fz< ziwgS)Z3?@z{TXFBaQD;zCUiRKcgnjqajHS+G1Cf!o}_$AO=!@=2X@x)co z;8-}zZ%|M6-;yN!xA0#OnR=E{ric#8cck1BPCD0DsrRtn;o+3i*~^p}vs1$wL5@}n z*uQrQBTRGlp=a~nm-Q0sMVzpY|9C*p`rcUvlwm0%6BQo9)KZ`F!vxZidC;x(VO&+V zm9Wkf3LbZ?!%>mv3QTiQmg9ipGDiNA-mjcf?xIjmE5ClTmuorAJzlG|5cyu6-xmHycpREPcvBvuwEkeIvL&j^7K_Q~G;a`|-RmHSRy6^O zo3(s+{p~E>OGCYpbPnFnsn3mzJMo-O^qgUQ8#p!i2RfMThlOjj)%>o@3*4H7u&#kO zrPs-|JZ!+Z{EPQ&=pItw1|JJpTQ`JaItO@Z&~d2o{DxyXxj-_lZ&CPDu3KS<0VgM5 zp~Y-IZf!SQ^d}cT!fS}>p&>n{XEko_jK;MecJr#}PB?!RQ*Hcb;*__0@YVFDYSiBv z+;J}jyxX4#xr4&;uNbMX)^EiTUy4}P;=Q20(m|W0uOXqr7FvIZ#tDJ`O0RYU*t&(~ zSbu>&e7Y5qPoIM_WpRpQZ)xnM9xS2aAhVjk6k2+%XL*UMA^(XnbT~E%Li~TR;4fFu za7hlnPF~61lsAO-_A}`HXW=TBu~-qZi3K&hN^7u+HxIG|=P|~7v**-;K9f$M&vLpK zq@W7AJGX=^zcw)QUINl*NtgPL=KF$NAl5kpJmudwXPFV7Y_(UJXmJ-eU7g9xhcs0O z1|5{D`*eVoT4ubJ&Tsb4O2r*9<#b+mEEK(^Y@uc$7Ta{d*;``SgN6@yrmruj`NAK@ z0n+&72Qc!i8=WP39yVV1!q>d>0lGG6XMa<*^kNdTf7A(wT(@Ge-ks&k%hH&X?go`w zGC%p_9~{&cP$z_S1ZD*SyPz+|3Z8xDQ|EbesxRrvgX?HjzY)x6({plJ*^ZF|~y52J;6grcjIzA_l*Q-ILBqZ9lzd@0?v_4`v20|E^{Gb2hN_ znVM{aeJ#9mE|e_hHo*&@+n;9l3{-EoVyNipCM`7W1+L#uv8;xb1uvidW;LG6VCC%l z;Q#Cq{=V2&rnylkY5QWp)rsI4Mf*+~c(7|znyF$P%hs5}r${GdM8kd%F?j)$t}3N@ z=)y<%ZDE0@FN3HT-PAs~Xo?ne(b$Kh<8>kOi5?7?R>e4B2jbCoyd$<*SjY`*!q~9Z*YL#Q za(+52nCje%Hyn48k6rx|sJ}4k?`$5Q`X78-^2nu!ZVOm8JQM9#Pr&JsJ6WvuBplSL z9h(N8U|gI5%5>U$`EViYlI+6+ZMO3dk{+&iD`SJT+Jfl+G1YVM%$y+947>t9RgvsR zz+v>;md(WL#QbX{)4jHP(ov5$fI)daP_Uz+N;L|~$&Wm7uZ^;L)IRDvT`|vK-s`VI zbBwc=43q=Rj$!|GbT&@Gd_3MKRg9Z8Tj!&+S?J1_=RM#Zv+QAxabLMtWD~W@Z6bb6 zf5NE8c=opx-a6_uYkQ!+`eN->=5sy*d=p1k{$k9bxT_Ft`fDKdqS8aIY-3C)5@-urn;#x-W4{6KmwYj6L85yr7G6SYC$wwhAF=sFnHD!lH| zL{8Vr0ZV4AUM#Yfsm?H{y$7=~(!!nfb4rxFqQW zHtd_t3A-58C#P$GnKABazdso~_t+XZurrjuFL*C_fo*eb1HUisRTd4YC(o;m%&+Hp znI&&ALxBZ^|J(}uuqD}!Y{4XjdY}dLilkhFIAipWxA1$=D4fc7Q7^lKzoP@@{v5>C z)=vddUuoS8WV&WZof3__M2Ww4FZws8xMqpz~+>$OyK{$w%t+S!qAN=ikL{}EY zj?#O3!rcfB*FRlu!u{J_(7e|=xRCCLITzLftu4~LAYB{P=VShUPNd7gAX|(HoF;yT zd;jUl#En3GjnOCR-23;T7}FyN?#y*!qJJg?{s++-J)tJ|oahHmm<@@M*0AIAE@{a1 zJs3kC=u^8_Y|<wT|*@rsGia9nqskZT7P$_m2IBEp#la&+n&Tf7770qb+d<<@v;Kv<|FO z^ZQ8auKGUeNnBBgn^TS>*C-UVhJ$)qV-q^7jr0M2sBnS&wdeTQ$uoc_e~^k&p8?@A z(6zH0rHzor#;7Kk;H5RJEfQWU`~~2>`i`ihyG4n75{?ERT}Vr;rdsGOt0^vk<`Jl& zk*s*iYosvR2jd)Nv(X;G%>4CspnAd?A4^#F^5GcT?`IvR2%LUYWewdzcd<6U^qlL- zk8msB1;?1=*J%;z3GvxX_iaO*z95qEqvxGZ;+6h;;Elx+Z0Dz|I?cNTRD)8#ul38@M%FV2>mg`wFSN$Is{&6xZ{-6n{b46MBB#C znemE;>_Y|ZQ}A>klr*uBiC1a9G^H^UH}Lmwr8=H;;!T0H1fDmjM#40e)?8_K=B*e5 zZ`V-aV=mO7$EajZnnG@KyMbD0Q6t97_C4PS!3Swymid1Lo-@)q67?RpzJH2af62#@ zOBXYXx$%&D?6*SL4a7q8_aa#w`8}k0rFmxY&0BJ3`;GG*u{jj{737h#jk&%W* z(i+gBr8ijj(UE$j4uOKdOOUvolNOP#1f(*;FZof`ejpx!kxM_rkAM!)&oq;?fR4Oe ztD{&ycocgFycfqpYL_A;PT&Q9zc8v1PV*y~y)2_z%ZC3B9OJZ}gzqcR-!YS4ymx>; zN9Ba$bZzV4BhRNA*^75a^+exev!K2K-8)PA>a~Xn=|2^{?=F{)wmnine8oEtZ4WA) zy+Grj`QC*=i<7{$V0@nwbn_Vk~DXAl2#!8&BsnMu@z! zku}cfh~LId1d}f5IRBwOo}p}wIEZv5W!Lm9kl=gLCH(b^Vqis)NZ6~kkL|(86XEl$ zGJ!eJna*1j`fTWk>x^m?J9YI3>OZAy&`>;-f4pFPZ~&|v;m6O+(NH(8+>C@L5^;(A zR{JxX|1bhK9$PHD55Btk3rR~+CbNumV<`L`VgW;4%E2Ro&aNGvDOKCq<#P`M7_wm` zo89+3pBUO+=vC^gW2C!c>O2(&&*$Vx1a2|%MLbsf5q#dSLB1|htTz|yO1c%wOX$9A zqfo&CYNp$5yqgvbq_6qagfgr@CY;^OiD4-nw~Ahu7Prvgw02DJ(8h@|__O#f5Jr#= zN#}Avn9zDOH}z3Dxey$#-UiZU^u9r&F1g9Cd(>0T+)BZ)eu9{?Y}{s(DiLQWLNi(S3FCJ*_9DGhir+gtzzHb_>3yuh z=B!iQyycng(4J`jf><|_F8P$zEt<0-{U-Uut3r?Kt2TbWNu-ZZeu`jeP(n!s>gk3{NNaj zFY6$GF+2fB-aQZ=Qe3mBUAfBbAzG$=cOm@@55L*S9qjUjg1 zxbVVzORzxTH~A2mu#Oc>?JH|*U%*~4Q0Q4YmrVnv?QMlZ8>RhmMe@CMKBT4BKkRpW zB9wI*0$vS%Dx^nYLW(W67~TqmC;d+M;A6j_PRGvfaE|zg&Qv8YoZtK#7=3qO zgLjQ$q&czO!8h0~#S%vxTq@Bu@zF>1SleiQY*T1ZH)hg8lxLy8Do+N53N+{OGf=8_zM!j7p>ZE!OfmeG1c@8>*nN*m-^lkIswSX z!tz!b`C<(5ss4g{=p3nX^!(5aNdHS~+NP17tdGLujxRgRNe_a+-q3!lK=`?u!0*oY zZ)c&q=2-HjLt$i}Mk@6Otlc+)vV&SAj_E}?1{*iEYoYGj7=h(5$|#z=vbev*pdaRR8cO=vgOT5YQT;wjl<9EFTm-gYe%J3n^$I_m zqyuG2q(54ssP8knC;9W=E%}D?aSHJlpEYg(|NEyLgZpg9&O_7dv}dz*m10d*${M5* z2fr53*sjo0{h{BO}F=$oUm!7-mj8_6$^8}x} zOj~;(ez}fwSutHa>YgVaOHo zH9kT+)@cmk9eS_I1~KmPk^$J@b3OHI`V>BRR|N}q*rZ&2n2Znn?B&JXG;zgsJFvo{ zI&HYWR7dS_>=D}dzoO@fbXDQUuGa2Eq2=G*_<$>RRRM9HL^a9!Z=V2pt5*>w#_^r~ zw{bMrmv_}Rkwvcy+>9EUkJ9H&id&Obe7X3i9FmMeEP^sWPFOqZ$|dnOnYabA~fAocT1#olyO5pmPy(w^9BRz?)36!7$01PkCxv? zzpl?X)iM{_RPa^Q)B;A{1t@D$2=@fW0=-TSG1^KQawd{D1IvhSykKY%ke*Ri&)pB9 zu@~6OXKNJMxIpBbb^i9P_i3QKmmlcq1jLg_{!bG6mM{tgJ}mmvlk%TRPI?%13eIxk z0XRGF310brgRiE2s!xtDWwJ5(s4@6=0>W$pDZTu8APs?xb1)wbsQveGDq!e%I!DWNOLD@ zhY3&L^!ROwaJTL=VH`sE>V?qF^9E~>?nEAAjp!-rw|87{vHhivA~#`_x3Ss>_n29$ zmMU>87ul}HNe`sYgEf_-1h;a+UNJ`!T@R8^rrf=&$d%Z7x8V|DzIrOF7==DNC>vl! zx8FD_$d#>VSIU=ms6-nrU3qQGB9}EL)A_e0Ch%jSky`WTDfCNwEv;|(KneZx%|-i; z7I-FWtJ_E2hAY$b)%BJ;SnR|X{AijlEXnMTX6Eg&&9awDYFQ);()!1?kIRPSdvw0q zhY0p@*?IKR9tYs~8t8Q{FOs(LnuN`K-asof=-mNt4UEAf?Jq%tvrT!&spaf(>r;5O zswwU7z6lMui&}B<0KebqB94e@qe=r0(Y>^z;b^N@5FY9R3ko}`GfPinn|j@0x946c z?=uA*UN@0@pVkAnPLuIj%PiivS0bM{=^WPlnF^&hdvc5Ik<4#h3|_u5nXkxdE^Uly z0aj7zY{G{)_Sm)wG~F=+jN46s&j0-<<_JR*Qqg~*J)Ugn16L<+5TDNK!HTmo4lgi62r?8^06Aao@0KU4x;BNX^npu&I-JTi%ewoDD{ul{W z9s0q2n>W}vPa6&#dnvV!(^P$fn&jwi@-6+eH?jap4>Pytp@Cx_=rD+cE;|7M=wCORb>Oa}K`=TOxvb0?h}j z=P9e+O&UXW=VT06p(9Q6?Il~%O&!hBEg&dWi`CwL#?^W)WWAot@ypkv?9A^i#EEt= z>4^i<33jkN+Z<{5d{L|tb@1vf7bW?g8B|=fkz;DcW6+k%(w`FA zZ?TO7UaT%=lV8_Y#|OM&*9W=cZ?AdIyDH+qVtak~6Q~8#-2bq&^GBe4Z90tpLE2OM zK6|rbDW(l>$D6^&v1oi$3pNE zj?P)nL8={~nuI-PZt`dKm&&I?s$4pLNXDM$UP0OATR5kzi5!#~$`;$KW5c7%!1ld6 zr+!6RCve{@!?de!@Z5t>{7A2QShyjSjjkVteKAxi{20J#Y>KXzF&cDv59gMo;D6oQ zDxw!Hnk46Mu1#e5&9u~AV}r$Ku$g0{cwRKXxd)5D_|R}z*-eXWeR6=_PX|8#Gr%KV z5Au!Q-?5sIQP6RAN1z(TJiSu>e$iX-Oz5DL(;3KR_l#l8hOM~uiH-cAt0nZfeGnh+ z9tyUrr5BJ1XJI8|V zz;2k%cf<4v@i5P=Kbu;WPWLCB!i6rthBO~2KWKlN*5WWXO(|si;FRQiu{T{uJX2zf z)ZlIVS={Gn$}L*JZ1xt9n^XZ^hY}PqkBKqehD_<_yiMTRJC*N)Uh2PVK0JP&g?u64 z9;Y6lb7zZTXa5g8Gb2hWs;R_?m42|Wcq6~b?z5&QEAWw-Kh7`ef?C50p#Bhjx#NeH z*a)L>_2Df@*DnpQ?}j$ZxpJge2)H;eLhXx}v67xY%hon;q_U+YF^krSm&{#0=!c%kDx!WcU((uIhX_mqF*Qt{?>ZGl&i(XKz2i;aNlS@Z_qSJWQN z+G?sRvbMvMy?fb#oOA4ceq+{f|8o9*GjY~_ubWe`*I0M{qk$&UAq z;-W59k{TY)*QI3e!XNp#(%w#f8Q~9vDWca@UFA7{8Sx*QoD34Z!D=6$;a_X6!r>0X zRC+I^p_B%$PJLXW=6r`vZ@01Co^3(nc30NrS}m=26M;QU%<-SVP`EUy8`Z`^m+I_D zsb8yK9KSqbKNfBQm-BSoe7kDcHOL)BeXX+H4}ybcjow&r;njXvd^QA$-(>mNDtexD zB8u@Ju&ZSoV|IXZ-|Mh;^D?|KKtk#lo^pGusO^FlO^3=CURgt?=_CH|&=H_|f##O> zjQB@dy*CGjH9d<|A?o|kgGkuL3mWX_CVK}$=O?F>gz7S>^k%Li*2ODw2;?^Ig!FgN zb@CpV6iDZ0O}&WUmL$NISpy+A?2*#*+)PeC=bQeeNOs@ojIff;FngFSbgZ7p@1Jl| zx?Ec+RqemY{9aCh-L5a$^$LBJ=7X8F4aVHCN#GTG0Cmm}U~6_%@;M{x)$z-YDhq75 z|GTIWPCbAEKLy^rZLkwdulnIrlTpw+(*qtG{lS+_ZEjip6eQi2F=d^;h^!@h8(7q`6mg)wEq~zk{yPin(%L#XobPgD0cSZ(-<%w@&q^jH) zF;_f!LL|G6i$T9o7UNe2ciaGnx_89l&sty|oQ!8{8>p`QIFb&*=JC~ad|v8a!v$xW zSd0-IgM=;E_TvwH7qgKaaOo~I4b2@r-yIwQQ6Hbf*CO=@kcMIl zPL<=O=c(|>ej7Hm&c;tavfzDGh;zZxRcLVJU)|?t>#mag7arl=AL&X?uB(uGL>d3e zi3^;gF>%2~R7ad@4+TyVud8}60{zxC6nw%bKF+LnEwdBYE^kF*1c zlO)>knxB7G3eD1Y!Hb4h8O=98l;0BmjT(U2#&_x5WLvzSx`ygslYUl=q#3D}8pw3r z@M~%Y>5zZyMUpArb4mxn@!2WukaQvL^w&}Q9~!_;B{avepZa1=qdj~$#>=&;<+ez|MwI|h8r`|1Im0j!=CQ3r2TTTxT#$v?itXJA2=2$G@gr- z>rc2?Jpkrh?8UzP-Y9gHj4Q8mk8Q`$Fmp5vZ(*iZ?H`Fxts4PpIhSW!Pou+pdKQQD zFlh;w^xm7ntJzlE5ZQ;cNP>hxow#=cCz&`LgeExD_9H~-*g)3aqxhifZs^x)HC%qu ziZtyL*tq5aoAU4oo@#W6Px#OnmeD5L{j*x*=(P$yH}(=(3c2Q+*o%0EH0RQRoPM|= zwiSC58->Jwq7HC~T@dP)q@rK#E)e}YY0OmUIMoY0%q=jxd5$7@`o@(Gcw*}yxZ~(4 z@CGEeQWQP4@_@6zGZ(vwE0Hu0X~RQ&XSo8TNm<|a_xPCw17O?uJZv2oEIm(YiS=E| zn82Kk`iGf$qjQ|Jfh_(;>w2Aj$5AV%F!BUS_NG_Lo?*LT{L*0fS~H9bOd^hVA#IH< zY{IC`0%PvmsiP|F*f$ENbdhr#zj5`l6EOkW< zWAU3qyl+<*Mmm!lXLV3XXMl6rPU+{Xopt>|I)+m{@)4T1!DcyQ&SmD9Yv2uEr&nRl zmNUxPxkUh{#=>D~Bir<^mD*#3GwG`N{6##6$v2i@(#=A=+dHgaYv5KCeM8p|`u&bU zXrmKot!p53g7d5^4Afu9NRx2#8GQ5HE7JG?x{usgZw8@}5$5Ul>*XM`(Ay#(ppl2d)T6g02~x^DTZ z_YhodF+lhh(&p2Fya3E7@5g<@llTo!GfuipCB4jRXLQ9md24|@C=YJjlM{C`;fsV$ z?=`He>fInu@GM5HJ;60b6e$j`F8623= zO5h_SPIDzMN0@sV&c5_UpI^htn+z@>{SA*z?=Zqgmf$x5mK{BVLI(+ck6PP}g|vu; z+Q+?B;%K2+ah_6vZYR8vuvKYG-vbkuvn{JN)Hf@>!r8ffQ1EZ7W|sNF=O$LZXIXI{ zk$jubgpBkBr#eEPa5Mb#pEFS3VeG;-@T(eN>WeVgw80RK>1%{_%VT9%wpnAhUPfUQuj+$dz$!6Q~6zU;JbAE_Uqm7XGlX*5$fG~uK zY$D-(UCN=Oqz*PKci;pb!^tLAxwK3%pX`i6@C!{FFa*9{}X=` zYrw3Gwn6N|G@$jXTetm=zI?jRN%Wh0lYe_O7s>lz(el(foSrvu4+xDpd0Mg}xSF&L zL#*L=R!_d0)MU7AD-^n%?Y;{X>Xo!sJj%_Bm(|D+#)=gyso)g=bNbi zLGUVhU?7br2@e~+pbQQ3dji!B(wea187}fmt+|3@;lWV{b~!K_iNAy&=aqxwph?C7 zxPGn-zWM)UqHnV|%|yC(Ag)y!=WT$bqUyy~z_LvGqxZ80w^;@PmX! z82)!Kyxh_YCXIPY+Mqp>_rc%Ko3rjdNE$tZkuH=-kCA_{#sLTVFv13Q$MG7YT+8L+ z>{w1d7^weX^vZ)G$9+UDma$IxN)?e!emX(p8McBq#Yg2v37KO^+jaae2Sv z9n4PIhxzNrqQFPW!kFOG*=#PjAKrnKyYOA-ZUg03b!$Ahqc)@bfeE}79@}yFBaszB zzs|X^cc3X;^}fQXXYh4&cQ~4MNAL=7*kK0hy4@nIucrzeBE00C18tFVI-zOFk37Wj zcYd=6?cIb|q6{gQlOGq_Tx3fsjh6}TBQK18FQ0(cfbn41UxN!g^`Yk;hVF}%#C)D; zlYmtBSnzWuB>UI{X>Anvcql)a6W3AC&gA*cLXr4dR`gp-q%GK}FQ0|x%dZ{%4WTdx zsV_vHC^QRkM6S@PBJZKR;4WA+IIVo2GL~>FlKfgCbi3(AJp7aAX?zmb3W7`L^c_U` zL^IX?)oD)ity29W;TS?!3~_QPzE$wrd*HwauNLYdWYlQyQ-v} zk>-Z2+0zx0FHevzkGUb{fKhg+EI8!_q;-IBN@yQWnFvNMyT$M3C|EwiLTDpVTYOI5 zAJT3%GU+5%^yxTX(ar;fm)QO=jmEK*AK!5mzR${GC(`SwdrNdw;w4TsUzg30HWD6= zQQZRh4TWA$8Dt3QHcj$04OOatd{+M}v~01LQ|<+!f0i+kmDoKC1kxEw<@q)WX*(b- zqb#@-MZDmGEw+pU@~50MF=bSBUrjQebe zB3oQ4ZJ}(ik?@!_-X2i&sVgV_i>LpY)L|lJ$puvRNID3NI=jkO#&@pssiX??Ts$?7*ezp1w%fjI1ah8=SbuJH0ify!aMh#BGHhVx)iBzai6k zmr*l`tDeK)^rkT8-E8Hh)?3y;D;24qx$rR}D;7ORc?I9NW<0m4`M^?c({tC2-Eo9| zHoT*Kb}7T9IdcNi`E}WaYwy;QRbm+Lmo|$ZHwjR~Lkq}Xc_?1ZnyI8^MMe*s!;YfO zXbXCN=8tl?bwA81FTmr86X8kd!GcaxcJeX*Rr0I5;xV*vH+>Ii4XLA!U`dx1{8(cv z48M1V4R?=%w;N+HYhF4&igCj~6ZT_6@)ri{JHe%;uh`du0o?1_7!1-j23XMm_bv4W z^>r@)w5y%eH)?Bv_vS^I+3PNzy+wP5L=ED12Y-Zm{IOsX32g zPIK0$5YtvoMSpu2)^1`h>*e*BfBO*6D`y_%x|_?PXO|q9xb_eZeZLud`;J1d{c$*W zoP@Lb_r%+F7vM|lXBg3I5dPQH6fbOwK%e!)<AS`@u1uG(#L)#87S^3)ge17~6(CKy=?!0-!muuRqWi}51 zV;sQQrWLeIY^DC{JO#}hBe9p)WW3=K$-MW3!QkyCvQwNpocryjK6yQm!;BSlR-l3W zUv>yz+Sf=m7&HL~r1t{NW(T=%qvp(S_HI0yvmK6%iDmqY2ZouaLsiNX^a{*JX0Q;3 zsHKXNy`9?FCjf1G{}t;8-4`U$y{}1Z@HmC1#)iUw;p#` z8QbH!SXT`7-^6KM6^kY#ARH=?UN2qr%wo>3&PuLH1$gA?E9FZ4LOAnq7w_Ik7iP`> z1*aQ4#Y(*$7}$=^4^$C`d`SlDjq`DNrv)%1UJo}9z5z$gPx0sX_kwHrMi_Q77aTm+ zu%yGMng1kRxV7aO`~1@$+f3`jk7YHGs%vM}{ru<%ZD>}V1a}87LHqq0s!QuwvEKNf z8|}e%;wz87C@Jpq2DClsR}KKQEpZn$z|0hqixf!kVs&mR|eM>>7ji_P0^tvqhu zT7GNt0*4#Rc)Gz<_n)ey-l;~gsF@%8Z&`@@AcSFn$r_&9^tSgeQB?lNL@?{k$U9iC?C@H6L2g*#m>| zZkPuK4ljk)ZhC6)^nJManVwoR>MBGzf=a!n*bUR6Ua|xCi_duQ^mg*~5nGk`J1s%H zPuRdWaEG$v2_ZSk&BfrfCYvJ5_Rw<~%2ICmlSD5r{2Mp?|ffY$>6~k0Nuw7mPeTO4Y-y4IYzH8u5y~B*= z1bf`bfL+cJQjZ&*m~HQMtnno+xjsFw4nTXvXE?#LhYsp0p3gozY2*F$U$}NDogvsR zoW5gt#v>|oP<-Ym`?Y-dA}{6hxhjlH^MHLBHrQ{;w>n%{=km^(`W^}6aA4X|2nj{J&q>tts+(g=jL`T6eLnV}`)>R54-X=s_|rk2aC0-U6Wk+=)9fGd}J?CS9rX05wpu|AxnpmEPd-pR zL-Wf&xy4F459IJJuzazJSsu-1m5$>XjSaV|?>W7PEc$2FCmq71?XY;!BxX6-3e(;i zs7b~XfO=Maa#};KFx-#k$}JXJXsPy`-H?Czx*N0Ya^d{|J2?jyS`^`9>3c#M7v~GrbKp2L?E1n zDM>@PQf8uDdbtH-inL|o59n~%kYoETd`IR`EOyWYhqg|9-uC?1oR zPF&cOH#K_0^hSJ#{FD*gJ;e&Bw|Q%Q2`q2@V2$m!^9y-pobVJhMjLX%F*u(1kO?jt zUNHsdoqf%szDFC@1J=^Ym9v{vKqw|6mfZh}X zXw)N%U!7iDAULYYI~C(o`taUc(nwQSgQ(%y^t-I>-!^DBEDUX)EQ9ewXQ0D|!BWUM zd-c;lCupOUiI3ioAl&;zTA&ACb0U?_zGyA)9^Y5Zb1RVqjvSbMhItG#h5xea$?FeB zi1ooP+?2meRzq@&z;WGr}t0^^U$l?Y=yq+Rs+r@iTMV?3M4$Bzg+`* z#TN3$oQ(xE7KmMK!hBru6Z(n+vIm;Mn5XqlQvC(>P;1RJl|>&HnG{n zXbzC(oi|z#0R!E3@CFB_^QWyMNVnWV^sZz*OH+wcdSUd(TQImby$;tVJiUnRwufMo z?5A{|ovB*j{^<{Bx3gKQ$44`}Sg)St0f%^w+#0B{`po7zM96CA^ZBOpU zMmy(qxovCRJ%am9AX|N9K|Yi`4U^i!NLnbDd_Yj5A< zy`mXgo!3bby=vU0om#zpjC9H57LbmE;l?Vy8T4R}2)A-_vN_clzZ*v9eve339*$llv~$U;PI3eCT#5wyM3*U8D(hRMKa3j@e53PN6LlN6Rge4&@6hr!|Cqw`=g> z|7bsuo;u0a8{cDtej_pG#Wf~$!pY(DVMOt1=1yl2W_vBXtAf z0?awOjPuLkEacn~7&kqhk8j;ZeV1`jAztCrN8ZH;H@hS3kJCUTROn@{OP%rc1*hHKR=V0dGB7OtDG15U?)W5uY zfGjYNG^nTrrdPa+s}XyZ{XG_o+QK36;Z*12@zbOsENtK${D&Rk>ETK2kKGs$o`mL{ zlSV|s5g>l!&NeC7uC|%b?O@;S9t$gIf*E~2VkgZA?(0&;AKW~SXPwQ|wL^k&xEi@J!C>;s2tF|Kb4G;BiAn)(-8U3TLa^gu`U%wSjtma5K4Wv7u zfSyT+Slouz*$MMgZm^U+2ielOm8@gJTTz!1)rQa=c&D9&cJz!}^aW#;`~mw=`W23Z z+(N_Ddx9UK>JIWX|2;?2xXkU_8Em*Tk+pBxpPmmXK%p60R0i{JYu~_!`qxnC?fnOn z@b8O-P!w3hPp^w&>CIxiM$4m)Fs{o0)EH0;w#}TuUCT|G zo6=R?eWsF8-GjDMB^Ml+anIY8JOev)j`Q(_4Q1W0^HK27?5bu!o}^&(saNm$7 zSpWG@c(8C67Piq6K1WF`tEZB$RmhVec^am3ttX#k8cF?_$V$%*6I_S)9#_C5)B4Qy z{CY0t(B#-1Cf;AHvz>7Ul8=+B%d8c5t%7sVv`>`Ax&a}nT?kep)WF&e)A&lXKpPV!v zvg#ue`I~~Yw^53Z1qb0(X%1n@;Y^o+ch!uzgOgSVv5u2;zQL^$SFELH&ZtfxGU>k1 zD;R8lMG9YW4Cu3vd^Ri6y+fY9F$xWPbi@X#y`4Ny|1Xd~#?MY0gbzXD2=Zh}jPQ>a zhMJ;SpV-a&!WD#GeL3X=7al|z_m)j{>{#gU^ABn){;}sPjkxFB{^U1R_PBj2lo#}Xj1`3< zLjdDAClEOJY@In$|0(u!Px5y|dXTn0gpGZw#Qbt?Cm$gFrc9~ahm-DQNy&357yYCo zf3p9>EruVh;}fBah4&^st8TH3#v55F#OUC7(Q=oVRZ{z~*X=~Z?7tDB6tk2G%rwEdeVy&ijq6Gs5) zGQod>ACb6&laJ(8Mg~Aw&TOp8CDM98K1UVWr+(Ht@*)jX@^}hyT|pPV4UR2#gqlzJ zc-TJ$O#2)|;$I{Wj6V--WwX);p+ffuP-eltd$c6~?OW$JE_!z1H1F79(P>P$*+?;t z%Y&is8)0emKQV6M|MB3Ziwe!Z6m4e>IhMOf8+b4=M&U*7`h^4G2RwOwfw`9J%A`}6 zz`N}y$KcgnO?Y6FFM@M`v@R6M2iU@xXt2BcfIo~c0pb%z^Cwr+cOB$4IpORnq30<( zqD<(qN|_H~`W=Zdf>SLZ;fyT2m4StsOk7R5Pji{-pY>a^jLz{K52R(Gi^UO`-!%*g zXPCdwdQ9lq7ESNPfXlI0b=*N?5*lA6?qD`wBDv7SBWqT|%I|T|=ITSm`14>`ksL+( z(1#K477*uhp#|slY|LlmzF~q}jxEk6oa;r`uS0X5tx%7s#KjW5mXnXi@(-Fa`Cl$@ zk#MdqiweG!hvWl*d^)>TQV1i@bO+L`?7}8}l`uqT3oQL-BNM)pm#017$!C+Ez%Q+* zsTRjwDUT?Xs-$uxeXo))s#_P48<7WBDT{(rcaGxsdyDbI-Yg)0&r74%^U4DoPk-`>5elSJ>ijundTh|yyIg2V;RmQUB%u#``mJIf%l%pRKc6`HD8@UQi);?a zbI^SLL%k_cDrI7l$jn4e=ss-(7ruZpMQ6fhq1)-YLx9#4VZ|na4}2EwN0d13KU{1) zyv|dNah=IT7P0O9aaguz8w&j}cIN^Rcq}qZF+YcXMqtx{1(XqG!-Rrh!h*R4(IaPJ zm*@VRJg5BhnWUa|PC~+4qa4b)`}`??0pF#0NO&c1Oys2bwX{b}(fv41^+^8fG8+>7#o4^oEPOKT z9-G$L3dCBA?3FSH%8TuVCv|ZPc!=ND&Vi?`^hx7}E0;6!IQ1q{-I2FlPWAnOe0F;Yzm5X)VDk%CDA9Ig8(L>0XE(lm)@Z3=L&wpx1MdnZ z-QSFrjV@#IhCLXt+8w6SDMg$58>-vBJ>efah4DXKw!;}iZMoHz74-XyxN%+@-mXl? z+T5lvslFB-yA+3WVxDuY;dK8?R5%RtGgqT4W`SFWtxAuGxor6M6ukc5SAOu?M4b2> zxcPAzZ*|+klSg+{`)pbdyN=C3=a)G!-f9ATo~g^TbP{l1`VRbiGZS5PJ)vR#T|Rqp zM`cz@g%+(-Q_6+_t2`^q+JU)21w3~ofWko_k`gUN{~=}W`iaO1i= zUVOO#-Y1yDw{$(QdvuP8alTzpiNj|e!p&|E;ecBREEsGmiR=2((2{9wn+S>1!*E|k zH2gO72GcXmW&021aATac>gn@dT4%5t9M&1iz5$)VW`AF_xsitkx6gq877g|7Rhbvt z@5cCFM!2&togL*u&mfxU%06onvGczG=ojP-FG#kUqrg)}Z&z7PIqv$q5CI@rmv+rkIT6c<(rzpVFK6zrHDd_B9jOzBFEnFWt$X z+{p*uO>NLU+Zra_Zv@)?v_Px1O!rughU15i@DJ@);jr>T+*eN%N4h1zpMXuMKc@sf z(H=~_U%Y^d3rUbMcnZ7J;1u4tei03SZbZYY@%;A#e=sPIqljzrCs|29tK-OY4i6nd6J}o^1UoIxqdj3@9so z$-UD%@KgVDblq`1bzwYBB~%(jL~k;Z7V4hoW<_OZW)o$U?7b=}3Z)_qqYz1oP~G!f zD;b5zNM`olBV@eK>5upGQa``nz0dfL=XdTo&JxDCI&C?1f_H6aPOG?6A7ZEG@ z!|7N!Z~hGDMOyH)E0^;wQ?%vBar&xxybU%>&x10{vtTgU3a2%B3JGTY5m$L*=dYb{ zQ;nnaZTkwy*LZ>So;Y;sZ+x(!gB%j>rq+uZ2Gqxl;wlAO6vHZmTK4tuF`SY-+1;z1 zH+=Y@CAVlhxvn03`<;f-*RO(0T3a}sms;1GZCb_S2FL60CacDM>xJ3;^XpO2=gm3( z+KbM&+WwnUtw2rJKuMwf0C;?uvc20`?&Rdemyfz7O`OwAp1ZjZ=DO&?Yc)^OyuA^# z&N^e%@gZQfHx}$oxpzVIsA-IAj|ME zr#@hTBaG3nUJ2JRi)Es29ys-uIM93uKW$xo@wBH^C%eNsH={Y zrh(Ps=1^1rGjFim4}PWJh5dtKk*)(NZZKldE<9mz1Y)1mP;C5}($foCb_sD``H`N{ zz8ESI_A+)^)X`Lj7eJ27W)J)Qfp@>0KqJ)<*MGT&H$er_ zFI2nWq@^kpLokoujY}4(XzQ?(r?cH|wR8@jtwSqi!vrtb|2dQUb*44t`$Om+8gwI^ z1p0h#IHv=y7|;%}Ycdc%@Z?Hbi#tPCwQphpeCkHrH0uU_T>aSnXGhw9^45IJ)oH>+ zJx7+VSBw{|M-i{cG&7lSQSRJ`);0U>hRuWC5$4mmnCC~}d((GV``Jt#@b?H-F7*K7 z51c#27krl-L(8qzdP;lVXMM=8UL|t>KOxwD#SHN6%Quo%h{vTN(I-6Bc9k^^@H9 z)KnCCIMJsqGl<;`6N+h1vbZID{b0%c)esnP_Z@C*6J2b+y4~am%k93WKv!T96B@;cYQ2 z7g)-v23gXZV<<2`PS*n{rg-y6wPgLf47SBy=3h2_C@S$YL9ccfnBDpMNW94gl^Cg= z&vAj_EPH$l;{9@dv-$>K-u^LIA5G&`Ax6-n_f<5|=>k-XDEK_)rHvd}O5fdV`NR!k zjb(jxEnZ&hE;tye*Z9houHa*p0>wUS-AOal@f_h3>J5#= zvo~X++h!(olBTYvO7F@1&)>wqi_cNsw!_p-E^_rn(wHj}>-3Dj?-54Vrcj;ZnD1Mm z)9!@|yEqV+?4f;xtt{Ow`5V|`V1T#!y&2ZZGQ@r!G^URj^ZgtzWmV4YD1I-^C zW}+4cEV#w$8$Drn)|IiLQ&+I`qy{S014gYIr-;vX`LPL?RP4q5pWA|N=Tb&|#Lmqd z$b?Q2c{}#4klQ6E;*6;+fp|eBY?Mg{@$RGa(PPDD$*kuqJkcjp3j5kp&hhBN@@U;& zWJqhMIdujJ`;l;-IN<;a91%76D&;j6yf(ngjkluLuj@F=X%#0dQlI#nsdTR>Th?c# zduR>1^nx%+Pu|l4F~e@Az;8I-cmX4hV+&~wTbh+V&~@VN509i9+iaD^<1|%=gBmLJ z66P&G4v$g`Kt8dP^4o&;4?7Oidip`L`9S=7oCVzSN75-sJc^g(Xy}%-3C zz4`P_KpI0$f2hF9Gi6A<4#SRhWjff81?il9+^{Leb?)eR5SGs3hvo4CK_bRbEvN?-nN$3{>IOw`NM%2BbD?uJ6s$f zG#WP2H^r&1Q!#(f-?~2&KhkrNWp!F6^O&tVze6q~&R6>%*OG}Z#dS%}07rfxX9QhN^?n)X7$%Pt{D7->az?cPEWcN{h= ziuVq^MtC`fG}3ZtuWf+){tU;Mm%G`d=;0`|80jr0V(jktlo4O^N3)7idGm4TL-U z`to}vm+JVd{jDuZXPC%@p7|NItFGU>*ILuF*`{RM$JLQ@jfG4c$Yu#IgA zJ;hSz1Tx_(;^HhJ=erKLKE26>|Cri00?57Z%r8MhM7;2d3L>{ zKv*L5m_it$gi=&q~?b!8|~lG_hKN8Eb|j`BZ`B%*w}3 zesy62L@cE_KB#<&w-1nqD(ZiH4c5e8;omc(NQ0QDb9}bqjIJG6yZmxyF=P=0{n3-t z8`4~?YAx}iKg?;~25cIPM!TS0;=YmD9*5RfMq#(4UwlymZ!X=}1zU}5iSmf?JNH39 z{YNOYd8O4z_W2JPbSsGF=@yyY(Vq4KwU^h^|!1~tbB;pE2-d;{Sy$faz3Bb=yFHs&cIn_99n>?Dd zzzNW;Hxe6;o6Cyq3<>XV1NmLy>3I173m_k)7M0m>YrmsNIsvJE_{Ew(Y`=AL@-caJ znwjob=udXDkq;veC44qZ`(Ub&&cwkF%f$VP>lHo+!oKbh{#I}zCmqP_pS7WLU^~$D zI+GUIP2A$n`sq)Gg{|tTM}1q%!t)XCLEfh-Bn<|iGWIiiz53d#Ar5_JJ9U7)9nRHzg_CnEVV1O>FAHi6r5gHJfaWv@ zj01t6V)l~qs~4w!fa#|qNiR=A>H!davaInwc5&Eq#x7oFmBpr zV~@UKH%BgkIRCb2cYYmM@}MG%A>aAJPaB|z**HuYnGHvJC5pKO1lnz9G*e&?GXt2Y z@jdYmIq5Wa@p*lkF(mBegdJGYp{3k7rz2F`n!?f5X3&JbR~qys0>zw2#I%0ONiOQ_ z^l%r7fejE&WA@(ua3Z}CbT~6kw#og-OClqQdlrd#0_lYlczxkRl{6+N9HJiS%dfgU zKyk069l3$dF`yZmx_QMTuw8V857CTA(yNSe4~~4Js0*BNrzdzW+>PPY&p6FnC?_L@ zCuM|BOn90t_u2u?k~q!7Xolu0W=~8bbpxY0pG?}1O)I1Qk1l3&XR9AvXp)8QAZA#i z_awrgI!#0R4<1Z7t_W>IGYv6&;dJln<@_90cH%A)uh;SE?bGj&>QHHJ*cRezV`0y! z>+m+Bk-TJ)3>E)4CN(?2sqTcO^i64JbE`y za~_(H-DffMT_Aa0*7+-)LA|95{x-bE1uyk5yT^hpdh_9<2jQ3tZOAh$RY=2Q_fhL% zS-ywb%is{rIMyg4mcm!tH7-QE#%|J&C-qq$I#XR}E}Ab0?F>)P{wor>U0B={iO(6$ z|8UL3MBYe0kvyRbtch4jbH-S{Cw?N5FA^LjYKG2})}~qO8W1{T_@4kgWOTZKd?t>4 zJRU9TpNEmt$EvfO{&M0|e4|s%sHedz!cnGKrqC@aVT|(EXDABoKs|&bR+yrWSz{*Z zjyxrgZ?7%eG^m2mg>yi7Ui*SWjBo{M1}hWa0qI!sF8S17y7D)>Dpq;3Ehl{iRPRji zBY8;_K9+PMkmez*dZ{S0xzGvBq0Jsnni+{77|lzFBS*mWg5_eaBzhfSRsa)NvO#kq z#b-4fI_k%~ehtHgt-^#ScVDu{iGK*#hh=Zex$fehT<8_T3*zK((hd%^UT(6O1f~EFJa9< z6#jXA$$jddSjxpug*-K=U*7=Ds>Mu>yw5tI*{HgwUmnn0n+t!o;l^u8#Hf4iE-@33 z=w9n|(aZn5)Psvhu{SQmXM^DM7>P=C1ujwD2~_A`YkcTAdF(w zHLYkK;ElwsSQ{`54BEWK_X`_i&1eVp$}SiD_t;j>TXB;WJllg~7ZkArch=){`p$2y z$#~@p=A&Ym&gXr-z^1kTi*t)E()Y(5@IXX94P;Py#hzWMPF_NnhNK6)KsZqJeUrfC3o<|mXtPW$0~E85#NcwM1k zqgQCzTu%-7^K=`+^zat?b`)lwG!{+{l4r29~E;%=j5wH`PuumqR8 z&+!?vKo4cwX?7j2|%FUf&i{}DV zKKa0Hv;A0a=>R%c=Cu^%T3-#&*1^z){>tknrt0pl410{qm7b41gRjCp;K}R~snH!3 zqOEn{_uXsQGQCwl?0QfMe}BR*FpZk<&5q@IX$Ks4Eiw#J6e2% z9Y-y&P-h@^J^w^p2k85yNGIpd!euLaD3w0fm9AC_oZNJl>SA(nXGd^{GE{?)!Y`e`F{_yiWR8r>y{T;HV#z0<0M?CT8J)>B_>N&>P zWZWaE!@wPE#?BRrQKpG}GOM|qQ9V_?)#wH|+HMnd29fK=vMby`^_P4o8cBD%bW!LH&cXAeO!lxm#~98b8|1UfEBF3M*ZpI_CW@*_=Fe zu^4w8P2wAlXS-{(+{@OkiN=K`AuPi@LHcd10nMM?2EDEySjghIjPk*L^~uJ4?>8vj>s3kHBG2RNAIJg@IVi0P!-|3*mE(|*5778m z03L1^E)5BpE&7uATBgDL&KHobPZgi@I^#L)zkZC1o{pbC2s@Xb##Ua#;o9R!u$!EY z-RDKJhKd<~u;Qykv4L(0Zrrx}cNj6b2T(6EgM?=2lxnW#E{@>4`gthzmR?ep9Daj? z_gDetN4gvugOfAX!+@3PZ1tSY(*8!rkos1c@+XgnE_}=-BB~h#uv} zpP@ptGX!_b#7~nA)n2{rsRs`6%7_ZeK?!;m9RP|ekA6K8R-UBqeY@%5&!aaL!UlSKq z*xiPPUgvRP*EFOa6ZHclD^Do*7VqY@w=`t;|28qIankHx`L|*{+%V}TiWqU@dC+mz zIrcZ$PHoybnh$x{f|c}tfom!@fL4c6wqWl$-Z&@$yX@oQ{b1s!22}q}xQNZd?-y>f zPER~xY-}9wRj~>@cMPNZx+Q%)Hj#-KTfIHVOKm0t)dZjNxC-ccA+WnP#x>msR3A9g ztQJ;h8?ikjpD>DhH<6q%vN;<^rsLrXy1?;yLF8xCj5ChSnf~tN3P6 z6T-VMc)5?E9BsW8eXJM5+JWOZ#Tr-sipTeo5mJ0bjWDWD2v6FG6OM1dym#TS!~HHZ=3@~;+m8O27?*Yu=&eFr(&oxx}1UVia{J6L}S z#jrP%Ks&%k)UKo(Y$X%dz%bop!oMbru9YzBGK9ReL9Gv^NH~JO*VbY!J(o_oK$iiD zXnLd@z9%SwPiwyl z?Dv=8Cgba@a%UECaun*z#Q=B4p-DZ3PfzKH)bH-CfB1sW<~{JBqEys6b8%AfqLw?F zRXpVG6B~jYNps(O^vt#EKEmR6Z1o5UTi^eMq9-Qt``CL`wh|QclhfxS@eg2z7n~lG zjQuX{E;?v=MB`xxk3EUT&Xh-rXQEQ^U1piWvK1S$opzb+ui0STAumeEK+ncr=8UEiJ&@H>+vyOhe}T^c}o-Yawg*`^Kz`571y4N0heh9Xuw^aL_SdL~5Ct^#(5qM)s4$et#&6|(Z zrQQp~QJu_$=71hKI_&$#(d^eGO}W#Pvq&+-p0uYy^wHJMASN(M9@fK4q95 z^DOE>J@gw%(;?LkUNUGX_nvYC!rM*);%7$Ofw%AM=M-Df^GXB#rUKjX-}x(?w20EO zmlo7Nf0kWYI}S$ge~Jm(d!)esa$tYq1ST}?+q1@XyiZx8(6wW;XeSua_f;MK5f{k<=l9H&QJ6Py@I{;Iw`g5 zTk2l3KnLmG3P``98Z`%ByiG!#UEZ8<3pW^QBI!}$#kGv;Pf57)P01fv%Ns>Zqcx5N zjQW>TJh01S37(b)^U~3=q^I`7AE$O)V3W040i0rE!K4+AjWxna#;yw0i*(?mGYT$mF?JN%oXsTO+=rjTTye~BV^!!~!UjICYA#`! zuIv?kRp?BCS#`C&Z2NS`OFD={7xsqH58{FP6og-(UXe&Yp;^1GU^HhcuT7=>Kvpau z@39%jmBuomlZ9^Z8>m9~xJ@{s?+i|wfO>0|l+um%<2x~q3k(vxZrHvDUQf`L$t%J3 zrA;|$X!2Uum0y#>;R2l}hSM%^^P(84w{h&i$s?FDl=iZq`Xb&}1!j>hVq1=-W3#>W zRY!xK((50f-qT$K=`)`z{`c$4xjk=*`U1)wXc}Zd@y(Y^{M>v>7l9c_UW46C-~nZ!rDl0SUh4bK+bj{S?T=59E`w&?tr@>1g6UJs=IsY_jM(r72z1wp%Wd zp4TVrNRo`^JmrL!GU;;ChgY!w+cH?*$Q-C{K=An~?PBTDhc1H8g+AfK^3DLo0g^Lk z^FQXk{87~o2zyhFhd*EEq(8xw&PAqL1oBNN_?E&^%RSG9h!ut;P1=2j&=#I=%FIa-mFoS2b1f9F*1?EFw{y&yik|a9FuOaH=pMCk*1@6%6-A(elUf_DhME<(2zD%4_NOd5Ydp}@( z`i0Vc=kTSyPK&x@#O+jb-ZJrLa`A>xA$A86kNFAl#R&wvNP$E#s)ij$>oTM95syh+S-H1ObN*@t?2P)M3jO n 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

  • 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 eMu&mz@|T?XbNqi5{%r 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 DLT}xQ diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/0-fd0434ac-e5cd-4ddd-9dd5-e5048d4edb59.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/0-fd0434ac-e5cd-4ddd-9dd5-e5048d4edb59.txn deleted file mode 100644 index 81d66a0b44..0000000000 --- a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/0-fd0434ac-e5cd-4ddd-9dd5-e5048d4edb59.txn +++ /dev/null @@ -1,2 +0,0 @@ -$fd0434ac-e5cd-4ddd-9dd5-e5048d4edb59$id *string08Zdefault(text *string08Zdefault>vector *fixed_size_list:float:153608Zdefault. -attributes *string08Zdefault \ No newline at end of file diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/1-14bb4b1d-cc00-420b-9b14-3626f0bd8c0b.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/1-14bb4b1d-cc00-420b-9b14-3626f0bd8c0b.txn deleted file mode 100644 index 86b642720ab8ceea9462b5d5719247941c13d822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmW;CI}U>|3;<9*EkcYLJ25a-GIC-A4nx(eV3SOULvd2nE^m5m=?2fLtbPYGMBso5 zQ9T3AVa}+#80yu0yN_GDcgPEyBmv4a{c;46Xs~&*jEi7W8jtO?vector *fixed_size_list:float:153608Zdefault. -attributes *string08Zdefault \ No newline at end of file diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/3-7516fb71-9db3-4666-bdef-ea04c1eb9697.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_transactions/3-7516fb71-9db3-4666-bdef-ea04c1eb9697.txn deleted file mode 100644 index 9b0915ab9b9b5634920d29f45de678c91c756c1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107 zcmW;6I}UAw-MP9)oB5;%h z;ujmVutP_0b9JXWy2+5UoHm9iYXoZ+1D-X45OOdSc0oVi{t2S0EHBFbe<+6f19)8+ AFaQ7m diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_versions/1.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_versions/1.manifest deleted file mode 100644 index a35b96156d4c3dd049516e4808a47682f339204f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 302 zcmb1QWMJS@5n{?rQTPu7j9P5PB}JKe=?07zOi}D9scDI&IVD^gLM$bz6(tgk1XbDz zv6ZDJm*f{oFd?gzO3SQBO^GkgtV)f~$t*6hO3TSlEU_{)H8um<#E7s-PlzkA1n7dK z(vs9-31(z7u(?cv(Tba6*Y`R5*aRBB+%QklGSE#+F)%SUNleyFHBC;@HAzWH(X~uT zF$HoBOe|7NQd5#lE%iz&^0N53SaTBdl2e7)4D^f)^bD$aU;@lWdIk(|z{ud^=;sUo D`hjb4 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_versions/2.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/_versions/2.manifest deleted file mode 100644 index c14970b78c50aa9a4083bf3d8a9dcf64b272e729..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366 zcmaiuK}y3w7=<&FHcAwfS%t2$a3O&i{>h~2G>d|`6%Wu&$xLP>5>jZU5_*>2z#F*e zIlPHWtxB~E!MAve$K!i%jyx~CBDk*N_k&OpbZ%9*4}c_|pH#+{>&AuGWZ+EiBJ^)_ zMuI1!-EtM-S7|bSVlqe{B3O(iEK?1vM{&tfb3gT6KfL_XO_KQS93e8qRpTY<5348-D zK8mkWgHr85a1L`AhM8fO$g=z^Y_~exAAllnFq^i2V5qQ{CmI^L?TmkoT?3;D(7(rG%Ed*@9%f?f^n4pv<|n5ya4(o}Jt@~H{^Hc{+LGc8bC14G~(XZ*DcFL32Y zi6}GG{`fn=3gAz;Vf{gv(vZz%e!~^{Q6O- zC?z6~d80&3O080oan6aFejp%OR>z=9UJ7c){_(<}eP?=%CXBM(`9W|J%B&wC>+a_M F_7k4HcrE|{ diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/data/2794bf5b-de3d-4202-ab16-e76bc27c8e6a.lance b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/data/2794bf5b-de3d-4202-ab16-e76bc27c8e6a.lance deleted file mode 100644 index 8758d96515a0eb646eff7b5bdcda303020508151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80120 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 CBqU@2 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/data/2f74c8e8-3f35-4209-889c-a13cf0780eb3.lance b/docs/examples_notebooks/inputs/operation dulce/lancedb/default-text_unit-text.lance/data/2f74c8e8-3f35-4209-889c-a13cf0780eb3.lance deleted file mode 100644 index 8758d96515a0eb646eff7b5bdcda303020508151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80120 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 CBqU@2 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_indices/b1bd07f3-ad25-40bc-b91c-14215386e477/auxiliary.idx b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_indices/b1bd07f3-ad25-40bc-b91c-14215386e477/auxiliary.idx new file mode 100644 index 0000000000000000000000000000000000000000..57eee5fba5a54a17161bb005a3f859127b08a500 GIT binary patch literal 12931 zcmeIw-AV#M6bJB~EzAxTbtE!_l7+s!Ftw<#B13|p=mGj*8{AzPSa(Cm(jxF(dWLR# zxw2gQpo_?>F8&9GnKR5e2Yw6-BPGPqz+pr&XoG$|b_hTK0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##{;vQ%30mQp zT@P=SlYZ%k$i$i|(3=}Mu`SL<9M_XgU(+rRd%o03@%3fOQ!UrA8|u!rebvxK&kv<8 zuIIK2->NecH0sNs;uh77$0DCe(74lm|8`~T_O;8VU&t)cWJ8B_S#|B2tED5gWIng< zFDysZF0A*q57yUG)vs2O9TIK^lN7ZIO&U(q2$(1dw&;5MPZ8Pqv$v=wm&AMvNi~28<%UWJw|1M&>Em`fxW%CD` Cwop+3 literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/0-5b75ba0a-bae9-4244-8a6b-31de09f7e03d.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/0-5b75ba0a-bae9-4244-8a6b-31de09f7e03d.txn new file mode 100644 index 0000000000000000000000000000000000000000..9796ad0ee932e92681fc1c59aee0aacb93c86f35 GIT binary patch literal 283 zcmZvV%}T^D6h=)K6}rqyMua*H2m>ieoBm`#AH+?$$-UJ;Xr)aD^|1sW%qP%6P+a)I z*`343ceQP63lf9{GD4SHiw+tqDupD?(2}h1E&X8GEjQU-6PA@zjX80W z`|EB7|4i5~{+0URmv|V$1o2SGwmkLhx8L4mSKsdita0jHAQ;!DVhTueA0J`lsnQ59 T%l10E{73X-r1=PeC#C!X8a7@0 literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/1-71f2ac8d-a101-467d-b57d-2dea6d14f7a7.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/1-71f2ac8d-a101-467d-b57d-2dea6d14f7a7.txn new file mode 100644 index 0000000000000000000000000000000000000000..eba161193099063ca3efdd864737b8e09efbc29a GIT binary patch literal 146 zcmd;J6jCuaOfyPMwn))UG&C^OH8C?!(M>W15=JShiDoH=CTZr0=DXO^xl*}=xCA!t zW&gZZ)nU(084<Y&Q ml2i3c5|eUL^}@g!Jo8dgD_l}b5;Jp(Ef^h6{Qt3Rw=n?wiYcT3 literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/2-d621e621-8e92-419f-99e4-f1c7d163bcc2.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/2-d621e621-8e92-419f-99e4-f1c7d163bcc2.txn new file mode 100644 index 0000000000000000000000000000000000000000..2b154eac74e37f0b3f88b1acbe58120039c45cc5 GIT binary patch literal 64 zcmd;J5>iPqGcrsCVqJ?=OCwzqL(4Q>OUqOf-892w^AtlfHyLQ4>AA% literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/3-4ada922f-cf85-44df-bc8b-b132e35009d0.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/3-4ada922f-cf85-44df-bc8b-b132e35009d0.txn new file mode 100644 index 0000000000000000000000000000000000000000..1ae8892c8c97812824cea574259bb7a040c31623 GIT binary patch literal 107 zcmWN=u?hk)3;<9)LF8~aIy&9pB;<%`T2lw{SJI@N#P9Gs?lYbA!8`22nboxrb+9f8 zn7uwD!D@iXmNx#GI@H3tC!8`2JCDvuOrVU(F zfrte>i$NhnVy#uVe1_-vNcZu|DA`Lih*l8@DL{o7v}T%}(Vgt}vTcpj@4EB<)aUQ} GIGuiEf*Csi literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/6-c2afb84c-4b3a-4ccd-8843-0deaa25bd971.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/6-c2afb84c-4b3a-4ccd-8843-0deaa25bd971.txn new file mode 100644 index 0000000000..821dd8ca62 --- /dev/null +++ b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/6-c2afb84c-4b3a-4ccd-8843-0deaa25bd971.txn @@ -0,0 +1 @@ +$c2afb84c-4b3a-4ccd-8843-0deaa25bd971id = '__DUMMY__' \ No newline at end of file diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/7-6798041f-3283-4b54-8313-54f80e00d338.txn b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_transactions/7-6798041f-3283-4b54-8313-54f80e00d338.txn new file mode 100644 index 0000000000000000000000000000000000000000..fef8f6ccbdf84ae6f0214ce6fcf02bbce7443237 GIT binary patch literal 107 zcmWN=F%H5o3;;k{35q&qWa_|#WaPwl;xM3oB~6?O^-)Otkr7V1^W?5EWkvQKC@2AM z!l2{{gu9|4HX?nW*7@lk^DV@bRJ4JQg@G$p$l?X8Ny%mudQ10L*{iwnFkJqZ5x<|~ GGW`JL)EDvq literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/1.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/1.manifest new file mode 100644 index 0000000000000000000000000000000000000000..a3a4bdc459c608a3beb6d54de1ed28483030d734 GIT binary patch literal 358 zcmZvUO-jQ+0EIIt#u5t3tV%_wAP9jOX7Zncg18kCSK=njUohM4S-_ZM>>EJWZrA_- literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/2.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/2.manifest new file mode 100644 index 0000000000000000000000000000000000000000..6f79fc2d12fab099ad09a4e23ebf1102d2b088b7 GIT binary patch literal 467 zcmZvZ!AiqG5QcXnMp*>Q;z6on3yM%k+)dJ?Ehvg!1Q9_I@e(%KjYgMLnyprk3O<71 z3wTmc!GoxG!PoE&ym+f=i{in7`47YY%?vZU001NqM!EaffzR9Ng_o!Ck>bY1$1#R5 zkB&sB>J2~UtpY6J8UX-iKqqotwTftRRN;z7RfqO zHJf-=#=~D8&*3U6If7euNL_s^G$_=+{hf%<*q2*DtyF1nZ%x789$RjVn zQH_Aw(BSpM<-4A{yE(t=TOZs8L5Uh3jVu;cxWOo)hU0qN2+EmQTrihYC-RtQs#dZ; zjQV?>bz<7oq^Cnag+9w9XK)5h^sdI5s_utUu%vlt)+HAWU+u93>(t@wBt3&gH1>}( XPLyaIF^M&c9CSa?5eQZn*OtBkgr1F* literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/3.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/3.manifest new file mode 100644 index 0000000000000000000000000000000000000000..9deea08227b59dee9886e9dfc0fea6163fdad100 GIT binary patch literal 295 zcmWe;WMJS@5n{?rQTPu7j9P5PB}JKe=?07zOi}D9scDI&IVD_nLTqKJ$tC$k5{$@d zrP4AhQd8oKGpkbLb25udtkQDw6HBa&4a|*z`WfN+C77*vI96_&cA8CK#r+jGnF2T> z7?QM%bW_ZX3{!zv*CN%@NY}*BGELXgGSx&k%`n+K#n8++DLL6lucRU`i=T@%CowNM zRfx?%&)87Uu!;vJz-**v(8Q?DB@331lcE8izOxmrdm&aGH^YQll?q0O6KsI1Yh7vKQIg)ua zM4YP}WirZ87BH&WkdRmrY^UYjj=%K__6TMH4(9Duut70dfJ1-pr^jM!t5g~-%JDs} njM8;#Z$$~cfGaU;7GU4s{byN}R@W0@pi7Cf7I4l^&QHGqE>v$! literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/5.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/5.manifest new file mode 100644 index 0000000000000000000000000000000000000000..baf532593dc58eb3858827f0018bd8fbf5978848 GIT binary patch literal 360 zcmZvUF-yZh9K~~y#u5vbn@UBfAP9v!?viVgW)Q`-h=YT;gnx1ujU0(2*HSxn@)P(K z9NhdAg5StNElP`n58m?L`@KtKS?(dW3pw~&3k{vd)J1v2P-I_kOO?Y^8}}GHGnJXD z?xDZieqPL#Oqyb$5?wSV&UFPQ_F3qyc(md1NgLtV9ja_JmeE)c@E{-pgdmX@1Vpkh zO=S>?%=f8=GE>;LP=Dot%|0GGgKn=C@3dcDpWdDB+wI zc>piq%3F8_HyV`|7k%(={`cO;TLQ~+k3BnAgRhmq&}mGam$wK+_RWscnV1yDJ@uTa zPEA$sga6rnmd~_GntZO4B5zEb6_qeCK@7KjuLO>XjSZ7dYia<)JhMds=a)oFp10p3A zn+f|)yxVzxS-v^FkJtC{Rp;84!vN|u3Pr{iIF(ttsUn1GlHLff^92iP~W@_x_V z{#)iCpN#y`yt{gAVIM8PiF^3#`(k3MBrUWkCl7vAC|xJ!PL!TAqDnkA3vlEfY)Iy% S(e+dmo{f>U7O*bQ#~0sOe0_ER literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/7.manifest b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/_versions/7.manifest new file mode 100644 index 0000000000000000000000000000000000000000..3f8fed8f6be43b89b0c83bdaa01b58e3161cda56 GIT binary patch literal 427 zcmZvWKTE?<6vgu*rX>_CnTjG*5QM@DFL^J22T@!_9K|Kv_a_<&iKMTkcI@OX=!bCA zFW~Ox$8pi9v^ey@UG6>SckUB1413=(3pxB+3XQC>Zi?!PpxC_ZNR`8+)b^ocO_k7f zGeG~n+j%ilG8-3jm6gRH1BHULwR=K2@QKoPbu>dEMu#g9oa|Y`P zgHGD(KEFJ^Tm83(*AH~wy)gMG#KMQ1x6PPw3YZBYaU3&>iBtf7z-1D7uAWslTlVJP zYZh^-=X&$ra z=IB>&b@5Axqqu0QvpK2A4@|li{d}R7rF_5ND5XV&>tn%Jo6L@{Mr&AUw5m6|y3?Y@2 zLV?2&D#VjSg@UGp_=PM}?b#Msucm9G_v==-T@maBff0@ptTU)HMIa?q!-!J`BZX*~ zFp?xx{!6GW2sq?iFri=&N(yO;QW&v-L9LjKv?e%H{1@Tvw%%=Yn*CPu?*8V{X}>##suc+cWHb{!XjzUg{XwDhFgEA1^qhbyc{Q4YEqCJ&XI>gToXEnnF|t+y*5Urq F!6!VSi{k(Q literal 0 HcmV?d00001 diff --git a/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/data/2677858d-16a4-4c0c-9515-ed5a9ee32fd7.lance b/docs/examples_notebooks/inputs/operation dulce/lancedb/entity_description.lance/data/2677858d-16a4-4c0c-9515-ed5a9ee32fd7.lance new file mode 100644 index 0000000000000000000000000000000000000000..f19cd20010933bfcd02332023e8c02aad649807a GIT binary patch literal 86776 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