From 4bf2513f315bb6f83c8fa26187b62191e5b50b17 Mon Sep 17 00:00:00 2001 From: Rusfort Date: Fri, 16 May 2025 08:47:47 +0200 Subject: [PATCH] Minor GUI refactor - Drag+drop issues introduced --- .gitattributes | 3 + Documentation/gui_file_table_refactor_plan.md | 127 ++++++++ TestFiles/TestConfig/Presets/Dinesen.json | 280 ++++++++++++++++++ .../config/asset_type_definitions.json | 44 +++ .../config/file_type_definitions.json | 210 +++++++++++++ TestFiles/TestConfig/config/llm_settings.json | 267 +++++++++++++++++ TestFiles/TestConfig/config/suppliers.json | 11 + autotest.py | 18 +- config/app_settings.json | 1 - .../data_level0.bin | Bin 16760000 -> 133 bytes .../header.bin | Bin 100 -> 128 bytes .../length.bin | Bin 40000 -> 130 bytes .../conport_vector_data/chroma.sqlite3 | Bin 163840 -> 131 bytes context_portal/context.db | Bin 344064 -> 131 bytes gui/definitions_editor_dialog.py | 37 +-- gui/delegates.py | 2 +- gui/llm_editor_widget.py | 20 +- gui/llm_prediction_handler.py | 105 ++++--- gui/main_panel_widget.py | 61 ++-- gui/main_window.py | 39 ++- gui/unified_view_model.py | 174 +++++------ main.py | 208 ++++++++++--- .../pipeline/stages/output_organization.py | 40 +-- rule_structure.py | 17 +- user_data/.first_run_complete | 1 + user_data/Presets/Dinesen.json | 280 ++++++++++++++++++ user_data/Presets/Poliigon.json | 280 ++++++++++++++++++ user_data/Presets/_template.json | 270 +++++++++++++++++ user_data/config/asset_type_definitions.json | 44 +++ user_data/config/file_type_definitions.json | 210 +++++++++++++ user_data/config/llm_settings.json | 267 +++++++++++++++++ user_data/config/suppliers.json | 11 + user_data/user_settings.json | 8 + utils/path_utils.py | 4 +- 34 files changed, 2736 insertions(+), 303 deletions(-) create mode 100644 .gitattributes create mode 100644 Documentation/gui_file_table_refactor_plan.md create mode 100644 TestFiles/TestConfig/Presets/Dinesen.json create mode 100644 TestFiles/TestConfig/config/asset_type_definitions.json create mode 100644 TestFiles/TestConfig/config/file_type_definitions.json create mode 100644 TestFiles/TestConfig/config/llm_settings.json create mode 100644 TestFiles/TestConfig/config/suppliers.json create mode 100644 user_data/.first_run_complete create mode 100644 user_data/Presets/Dinesen.json create mode 100644 user_data/Presets/Poliigon.json create mode 100644 user_data/Presets/_template.json create mode 100644 user_data/config/asset_type_definitions.json create mode 100644 user_data/config/file_type_definitions.json create mode 100644 user_data/config/llm_settings.json create mode 100644 user_data/config/suppliers.json create mode 100644 user_data/user_settings.json diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..5ca8287 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.bin filter=lfs diff=lfs merge=lfs -text +*.db filter=lfs diff=lfs merge=lfs -text +*.sqlite3 filter=lfs diff=lfs merge=lfs -text diff --git a/Documentation/gui_file_table_refactor_plan.md b/Documentation/gui_file_table_refactor_plan.md new file mode 100644 index 0000000..3cccbc6 --- /dev/null +++ b/Documentation/gui_file_table_refactor_plan.md @@ -0,0 +1,127 @@ +# Code Review & Refactoring Plan: GUI File Table + +**Objective:** To identify the root causes of file list discrepancies and persistent empty asset rows in the GUI file table, and to propose refactoring solutions for improved robustness and maintainability. + +**Phase 1: In-Depth Code Review** + +This phase will focus on understanding the current implementation and data flow within the relevant GUI modules. + +1. **Identify Key Modules & Classes:** + * **`gui/unified_view_model.py` ([`UnifiedViewModel`](gui/unified_view_model.py:1)):** This is the primary focus. We need to analyze: + * How it loads and represents the hierarchical data (`SourceRule` -> `AssetRule` -> `FileRule`). + * Methods responsible for updating the model with new data (e.g., from predictions or user edits). + * Logic for adding, removing, and modifying rows, especially `AssetRule` and `FileRule` items. + * How it handles data consistency when underlying data changes (e.g., after LLM processing or renaming operations). + * Signal/slot connections related to data changes. + * **`gui/asset_restructure_handler.py` ([`AssetRestructureHandler`](gui/asset_restructure_handler.py:1)):** + * How it listens to changes in `AssetRule` names or `FileRule` target asset overrides. + * The logic for moving `FileRule` items between `AssetRule` items. + * The conditions under which it creates new `AssetRule` items or removes empty ones. This is critical for the "persistent empty asset rows" issue. + * **`gui/llm_prediction_handler.py` ([`LLMPredictionHandler`](gui/llm_prediction_handler.py:1)):** + * How it parses the LLM response. + * How it translates the LLM's (potentially hallucinated) file list into the `SourceRule` structure. + * How this new `SourceRule` data is passed to and integrated by the `UnifiedViewModel`. This is key for the "file list discrepancies" issue. + * **`gui/prediction_handler.py` ([`RuleBasedPredictionHandler`](gui/prediction_handler.py:1)):** + * Similar to the LLM handler, how it generates `SourceRule` data from presets. + * How its output is integrated into the `UnifiedViewModel`, especially when "reinterpreting with a systematic approach" restores correct files. + * **`gui/main_window.py` ([`MainWindow`](gui/main_window.py:1)) & `gui/main_panel_widget.py` ([`MainPanelWidget`](gui/main_panel_widget.py:1)):** + * How these components instantiate and connect the `UnifiedViewModel`, `AssetRestructureHandler`, and prediction handlers. + * Event handling related to loading data, triggering predictions, and user interactions that modify the table data. + * **`rule_structure.py`:** + * Review the definitions of `SourceRule`, `AssetRule`, and `FileRule` to ensure a clear understanding of the data being managed. + +2. **Trace Data Flow & State Management:** + * **Initial Load:** How is the initial list of files/assets loaded and represented in the `UnifiedViewModel`? + * **LLM Processing:** + * Trace the data flow from the LLM response -> `LLMPredictionHandler` -> `UnifiedViewModel`. + * How does the `UnifiedViewModel` reconcile the LLM's version of the file list with any existing state? Is there a clear "source of truth" for the file list before and after LLM processing? + * **Preset-Based Processing:** + * Trace data flow from preset selection -> `RuleBasedPredictionHandler` -> `UnifiedViewModel`. + * How does this "systematic approach" correct discrepancies? Does it fully replace the model's data or merge it? + * **Renaming/Restructuring:** + * Trace the events and actions from a user renaming an asset -> `AssetRestructureHandler` -> `UnifiedViewModel`. + * How are `AssetRule` items checked for emptiness and subsequently removed (or not removed)? + +3. **Analyze Event Handling and Signal/Slot Connections:** + * Map out the key signals and slots between the `UnifiedViewModel`, `AssetRestructureHandler`, prediction handlers, and the main UI components. + * Ensure that signals are emitted and slots are connected correctly to trigger necessary updates and prevent race conditions or missed updates. + +**Phase 2: Identify Issues & Propose Refactoring Strategies** + +Based on the review, we will pinpoint specific areas contributing to the reported problems and suggest improvements. + +1. **For File List Discrepancies (especially post-LLM):** + * **Potential Issue:** The `UnifiedViewModel` might be directly replacing its internal data with the LLM's output without proper validation or merging against the original input file list. + * **Proposed Strategy:** + * Establish a clear "source of truth" for the actual input files that remains independent of the LLM's interpretation. + * When the LLM provides its categorized list, the `LLMPredictionHandler` or `UnifiedViewModel` should *map* the LLM's findings onto the *existing* source files rather than creating a new list from scratch based on LLM hallucinations. + * If the LLM identifies files not in the original input, these should be flagged or handled as discrepancies, not added as if they were real. + * If the LLM *misses* files from the original input, these should remain visible, perhaps marked as "uncategorized by LLM." + +2. **For Persistent Empty Asset Rows:** + * **Potential Issue:** The `AssetRestructureHandler`'s logic for detecting and removing empty `AssetRule` items might be flawed or not consistently triggered. It might not correctly count child `FileRule` items after a move, or the signal to check for emptiness might not always fire. + * **Proposed Strategy:** + * Review and strengthen the logic within `AssetRestructureHandler` that checks if an `AssetRule` is empty after its `FileRule` children are moved or its name changes. + * Ensure that this check is reliably performed *after* all relevant model updates have completed. + * Consider adding explicit methods to `UnifiedViewModel` or `AssetRule` to query if an asset group is truly empty (has no associated `FileRule` items). + * Ensure that the `UnifiedViewModel` correctly emits signals that the `AssetRestructureHandler` can use to trigger cleanup of empty asset rows. + +3. **General Robustness & Maintainability:** + * **State Management:** Clarify state management within `UnifiedViewModel`. Ensure data consistency and minimize side effects. + * **Modularity:** Ensure clear separation of concerns between the `UnifiedViewModel` (data representation), prediction handlers (data generation), and `AssetRestructureHandler` (data manipulation). + * **Logging & Error Handling:** Improve logging in these critical sections to make troubleshooting easier. Add robust error handling for unexpected data states. + * **Unit Tests:** Identify areas where unit tests could be added or improved to cover the scenarios causing these bugs, especially around model updates and restructuring. + +**Phase 3: Documentation & Handoff** + +1. Document the findings of the code review. +2. Detail the agreed-upon refactoring plan. +3. Prepare for handoff to a developer (e.g., by switching to "Code" mode). + +**Visual Plan (Mermaid Diagram):** + +```mermaid +graph TD + subgraph GUI Interaction + UserAction[User Action (Load Files, Rename Asset, Trigger LLM)] + end + + subgraph Prediction Layer + LLM_Handler([`gui.llm_prediction_handler.LLMPredictionHandler`]) + Preset_Handler([`gui.prediction_handler.RuleBasedPredictionHandler`]) + end + + subgraph Core GUI Logic + MainWindow([`gui.main_window.MainWindow`]) + MainPanel([`gui.main_panel_widget.MainPanelWidget`]) + ViewModel([`gui.unified_view_model.UnifiedViewModel`]) + RestructureHandler([`gui.asset_restructure_handler.AssetRestructureHandler`]) + end + + subgraph Data Structures + RuleStruct([`rule_structure.py`
SourceRule, AssetRule, FileRule]) + end + + UserAction --> MainWindow + MainWindow --> MainPanel + MainPanel -- Triggers Predictions --> LLM_Handler + MainPanel -- Triggers Predictions --> Preset_Handler + MainPanel -- Displays Data From --> ViewModel + + LLM_Handler -- Provides SourceRule Data --> ViewModel + Preset_Handler -- Provides SourceRule Data --> ViewModel + + ViewModel -- Manages --> RuleStruct + ViewModel -- Signals Changes --> RestructureHandler + ViewModel -- Signals Changes --> MainPanel + + + RestructureHandler -- Modifies --> ViewModel + + %% Issues + style LLM_Handler fill:#f9d,stroke:#333,stroke-width:2px %% Highlight LLM Handler for file list issue + style ViewModel fill:#f9d,stroke:#333,stroke-width:2px %% Highlight ViewModel for both issues + style RestructureHandler fill:#f9d,stroke:#333,stroke-width:2px %% Highlight Restructure Handler for empty row issue + + note right of LLM_Handler: Potential source of file list discrepancies + note right of RestructureHandler: Potential source of persistent empty asset rows \ No newline at end of file diff --git a/TestFiles/TestConfig/Presets/Dinesen.json b/TestFiles/TestConfig/Presets/Dinesen.json new file mode 100644 index 0000000..12ef98b --- /dev/null +++ b/TestFiles/TestConfig/Presets/Dinesen.json @@ -0,0 +1,280 @@ +{ + "preset_name": "Dinesen", + "supplier_name": "Dinesen", + "notes": "Preset for standard Poliigon downloads. Prioritizes _xxx16 files. Moves previews etc. to Extra/. Assumes Metal/Rough workflow.", + "source_naming": { + "separator": "_", + "part_indices": { + "base_name": 0, + "map_type": 1 + }, + "glossiness_keywords": [ + "GLOSS" + ] + }, + "move_to_extra_patterns": [ + "*_Preview*", + "*_Sphere*", + "*_Cube*", + "*_Flat*", + "*.txt", + "*.pdf", + "*.url", + "*.htm*", + "*_Fabric.*", + "*_DISP_*METALNESS*" + ], + "map_type_mapping": [ + { + "target_type": "MAP_COL", + "keywords": [ + "COLOR*", + "COL", + "COL-*", + "DIFFUSE", + "DIF", + "ALBEDO" + ] + }, + { + "target_type": "MAP_NRM", + "keywords": [ + "NORMAL*", + "NORM*", + "NRM*", + "N" + ], + "priority_keywords": [ + "*_NRM16*", + "*_NM16*", + "*Normal16*" + ] + }, + { + "target_type": "MAP_ROUGH", + "keywords": [ + "ROUGHNESS", + "ROUGH" + ] + }, + { + "target_type": "MAP_GLOSS", + "keywords": [ + "GLOSS" + ] + }, + { + "target_type": "MAP_AO", + "keywords": [ + "AMBIENTOCCLUSION", + "AO" + ] + }, + { + "target_type": "MAP_DISP", + "keywords": [ + "DISPLACEMENT", + "DISP", + "HEIGHT", + "BUMP" + ], + "priority_keywords": [ + "*_DISP16*", + "*_DSP16*", + "*DSP16*", + "*DISP16*", + "*Displacement16*", + "*Height16*" + ] + }, + { + "target_type": "MAP_REFL", + "keywords": [ + "REFLECTION", + "REFL", + "SPECULAR", + "SPEC" + ] + }, + { + "target_type": "MAP_SSS", + "keywords": [ + "SSS", + "SUBSURFACE*" + ] + }, + { + "target_type": "MAP_FUZZ", + "keywords": [ + "FUZZ" + ] + }, + { + "target_type": "MAP_IDMAP", + "keywords": [ + "IDMAP" + ] + }, + { + "target_type": "MAP_MASK", + "keywords": [ + "OPAC*", + "TRANSP*", + "MASK*", + "ALPHA*" + ] + }, + { + "target_type": "MAP_METAL", + "keywords": [ + "METAL*", + "METALLIC" + ] + } + ], + "asset_category_rules": { + "model_patterns": [ + "*.fbx", + "*.obj", + "*.blend", + "*.mtl" + ], + "decal_keywords": [ + "Decal" + ] + }, + "archetype_rules": [ + [ + "Foliage", + { + "match_any": [ + "Plant", + "Leaf", + "Leaves", + "Grass" + ], + "match_all": [] + } + ], + [ + "Fabric", + { + "match_any": [ + "Fabric", + "Carpet", + "Cloth", + "Textile", + "Leather" + ], + "match_all": [] + } + ], + [ + "Wood", + { + "match_any": [ + "Wood", + "Timber", + "Plank", + "Board" + ], + "match_all": [] + } + ], + [ + "Metal", + { + "match_any": [ + "_Metal", + "Steel", + "Iron", + "Gold", + "Copper", + "Chrome", + "Aluminum", + "Brass", + "Bronze" + ], + "match_all": [] + } + ], + [ + "Concrete", + { + "match_any": [ + "Concrete", + "Cement" + ], + "match_all": [] + } + ], + [ + "Ground", + { + "match_any": [ + "Ground", + "Dirt", + "Soil", + "Mud", + "Sand", + "Gravel", + "Asphalt", + "Road", + "Moss" + ], + "match_all": [] + } + ], + [ + "Stone", + { + "match_any": [ + "Stone", + "Rock*", + "Marble", + "Granite", + "Brick", + "Tile", + "Paving", + "Pebble*", + "Terrazzo", + "Slate" + ], + "match_all": [] + } + ], + [ + "Plaster", + { + "match_any": [ + "Plaster", + "Stucco", + "Wall", + "Paint" + ], + "match_all": [] + } + ], + [ + "Plastic", + { + "match_any": [ + "Plastic", + "PVC", + "Resin", + "Rubber" + ], + "match_all": [] + } + ], + [ + "Glass", + { + "match_any": [ + "Glass" + ], + "match_all": [] + } + ] + ] +} \ No newline at end of file diff --git a/TestFiles/TestConfig/config/asset_type_definitions.json b/TestFiles/TestConfig/config/asset_type_definitions.json new file mode 100644 index 0000000..55691ad --- /dev/null +++ b/TestFiles/TestConfig/config/asset_type_definitions.json @@ -0,0 +1,44 @@ +{ + "ASSET_TYPE_DEFINITIONS": { + "Surface": { + "color": "#1f3e5d", + "description": "A single Standard PBR material set for a surface.", + "examples": [ + "Set: Wood01_COL + Wood01_NRM + WOOD01_ROUGH", + "Set: Dif_Concrete + Normal_Concrete + Refl_Concrete" + ] + }, + "Model": { + "color": "#b67300", + "description": "A set that contains models, can include PBR textureset", + "examples": [ + "Single = Chair.fbx", + "Set = Plant02.fbx + Plant02_col + Plant02_SSS" + ] + }, + "Decal": { + "color": "#68ac68", + "description": "A alphamasked textureset", + "examples": [ + "Set = DecalGraffiti01_Col + DecalGraffiti01_Alpha", + "Single = DecalLeakStain03" + ] + }, + "Atlas": { + "color": "#955b8b", + "description": "A texture, name usually hints that it's an atlas", + "examples": [ + "Set = FoliageAtlas01_col + FoliageAtlas01_nrm" + ] + }, + "UtilityMap": { + "color": "#706b87", + "description": "A useful image-asset consisting of only a single texture. Therefor each Utilitymap can only contain a single item.", + "examples": [ + "Single = imperfection.png", + "Single = smudges.png", + "Single = scratches.tif" + ] + } + } +} \ No newline at end of file diff --git a/TestFiles/TestConfig/config/file_type_definitions.json b/TestFiles/TestConfig/config/file_type_definitions.json new file mode 100644 index 0000000..427c6bb --- /dev/null +++ b/TestFiles/TestConfig/config/file_type_definitions.json @@ -0,0 +1,210 @@ +{ + "FILE_TYPE_DEFINITIONS": { + "MAP_COL": { + "bit_depth_rule": "force_8bit", + "color": "#ffaa00", + "description": "Color/Albedo Map", + "examples": [ + "_col.", + "_basecolor.", + "albedo", + "diffuse" + ], + "is_grayscale": false, + "keybind": "C", + "standard_type": "COL" + }, + "MAP_NRM": { + "bit_depth_rule": "respect", + "color": "#cca2f1", + "description": "Normal Map", + "examples": [ + "_nrm.", + "_normal." + ], + "is_grayscale": false, + "keybind": "N", + "standard_type": "NRM" + }, + "MAP_METAL": { + "bit_depth_rule": "force_8bit", + "color": "#dcf4f2", + "description": "Metalness Map", + "examples": [ + "_metal.", + "_met." + ], + "is_grayscale": true, + "keybind": "M", + "standard_type": "METAL" + }, + "MAP_ROUGH": { + "bit_depth_rule": "force_8bit", + "color": "#bfd6bf", + "description": "Roughness Map", + "examples": [ + "_rough.", + "_rgh.", + "_gloss" + ], + "is_grayscale": true, + "keybind": "R", + "standard_type": "ROUGH" + }, + "MAP_GLOSS": { + "bit_depth_rule": "force_8bit", + "color": "#d6bfd6", + "description": "Glossiness Map", + "examples": [ + "_gloss.", + "_gls." + ], + "is_grayscale": true, + "keybind": "R", + "standard_type": "GLOSS" + }, + "MAP_AO": { + "bit_depth_rule": "force_8bit", + "color": "#e3c7c7", + "description": "Ambient Occlusion Map", + "examples": [ + "_ao.", + "_ambientocclusion." + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "AO" + }, + "MAP_DISP": { + "bit_depth_rule": "respect", + "color": "#c6ddd5", + "description": "Displacement/Height Map", + "examples": [ + "_disp.", + "_height." + ], + "is_grayscale": true, + "keybind": "D", + "standard_type": "DISP" + }, + "MAP_REFL": { + "bit_depth_rule": "force_8bit", + "color": "#c2c2b9", + "description": "Reflection/Specular Map", + "examples": [ + "_refl.", + "_specular." + ], + "is_grayscale": true, + "keybind": "M", + "standard_type": "REFL" + }, + "MAP_SSS": { + "bit_depth_rule": "respect", + "color": "#a0d394", + "description": "Subsurface Scattering Map", + "examples": [ + "_sss.", + "_subsurface." + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "SSS" + }, + "MAP_FUZZ": { + "bit_depth_rule": "force_8bit", + "color": "#a2d1da", + "description": "Fuzz/Sheen Map", + "examples": [ + "_fuzz.", + "_sheen." + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "FUZZ" + }, + "MAP_IDMAP": { + "bit_depth_rule": "force_8bit", + "color": "#ca8fb4", + "description": "ID Map (for masking)", + "examples": [ + "_id.", + "_matid." + ], + "is_grayscale": false, + "keybind": "", + "standard_type": "IDMAP" + }, + "MAP_MASK": { + "bit_depth_rule": "force_8bit", + "color": "#c6e2bf", + "description": "Generic Mask Map", + "examples": [ + "_mask." + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "MASK" + }, + "MAP_IMPERFECTION": { + "bit_depth_rule": "force_8bit", + "color": "#e6d1a6", + "description": "Imperfection Map (scratches, dust)", + "examples": [ + "_imp.", + "_imperfection.", + "splatter", + "scratches", + "smudges", + "hairs", + "fingerprints" + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "IMPERFECTION" + }, + "MODEL": { + "bit_depth_rule": "", + "color": "#3db2bd", + "description": "3D Model File", + "examples": [ + ".fbx", + ".obj" + ], + "is_grayscale": false, + "keybind": "", + "standard_type": "" + }, + "EXTRA": { + "bit_depth_rule": "", + "color": "#8c8c8c", + "description": "asset previews or metadata", + "examples": [ + ".txt", + ".zip", + "preview.", + "_flat.", + "_sphere.", + "_Cube.", + "thumb" + ], + "is_grayscale": false, + "keybind": "E", + "standard_type": "EXTRA" + }, + "FILE_IGNORE": { + "bit_depth_rule": "", + "color": "#673d35", + "description": "File identified to be ignored due to prioritization rules (e.g., a lower bit-depth version when a higher one is present).", + "category": "Ignored", + "examples": [ + "Thumbs.db", + ".DS_Store" + ], + "is_grayscale": false, + "keybind": "X", + "standard_type": "", + "details": {} + } + } +} \ No newline at end of file diff --git a/TestFiles/TestConfig/config/llm_settings.json b/TestFiles/TestConfig/config/llm_settings.json new file mode 100644 index 0000000..e898fe5 --- /dev/null +++ b/TestFiles/TestConfig/config/llm_settings.json @@ -0,0 +1,267 @@ +{ + "llm_predictor_examples": [ + { + "input": "MessyTextures/Concrete_Damage_Set/concrete_col.png\nMessyTextures/Concrete_Damage_Set/concrete_N.png\nMessyTextures/Concrete_Damage_Set/concrete_rough.jpg\nMessyTextures/Concrete_Damage_Set/height_map_concrete.tif\nMessyTextures/Concrete_Damage_Set/Thumbs.db\nMessyTextures/Fabric_Pattern/pattern_01_diffuse.tga\nMessyTextures/Fabric_Pattern/pattern_01_ao.png\nMessyTextures/Fabric_Pattern/pattern_01_normal.png\nMessyTextures/Fabric_Pattern/notes.txt\nMessyTextures/Fabric_Pattern/variant_blue_diffuse.tga\nMessyTextures/Fabric_Pattern/fabric_flat.jpg", + "output": { + "individual_file_analysis": [ + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/concrete_col.png", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Concrete_Damage_Set" + }, + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/concrete_N.png", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Concrete_Damage_Set" + }, + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/concrete_rough.jpg", + "classified_file_type": "MAP_ROUGH", + "proposed_asset_group_name": "Concrete_Damage_Set" + }, + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/height_map_concrete.tif", + "classified_file_type": "MAP_DISP", + "proposed_asset_group_name": "Concrete_Damage_Set" + }, + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/Thumbs.db", + "classified_file_type": "FILE_IGNORE", + "proposed_asset_group_name": null + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/pattern_01_diffuse.tga", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/pattern_01_ao.png", + "classified_file_type": "MAP_AO", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/pattern_01_normal.png", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/notes.txt", + "classified_file_type": "EXTRA", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/variant_blue_diffuse.tga", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/fabric_flat.jpg", + "classified_file_type": "EXTRA", + "proposed_asset_group_name": "Fabric_Pattern_01" + } + ], + "asset_group_classifications": { + "Concrete_Damage_Set": "Surface", + "Fabric_Pattern_01": "Surface" + } + } + }, + { + "input": "SciFi_Drone/Drone_Model.fbx\nSciFi_Drone/Textures/Drone_BaseColor.png\nSciFi_Drone/Textures/Drone_Metallic.png\nSciFi_Drone/Textures/Drone_Roughness.png\nSciFi_Drone/Textures/Drone_Normal.png\nSciFi_Drone/Textures/Drone_Emissive.jpg\nSciFi_Drone/ReferenceImages/concept.jpg", + "output": { + "individual_file_analysis": [ + { + "relative_file_path": "SciFi_Drone/Drone_Model.fbx", + "classified_file_type": "MODEL", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_BaseColor.png", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_Metallic.png", + "classified_file_type": "MAP_METAL", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_Roughness.png", + "classified_file_type": "MAP_ROUGH", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_Normal.png", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_Emissive.jpg", + "classified_file_type": "EXTRA", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/ReferenceImages/concept.jpg", + "classified_file_type": "EXTRA", + "proposed_asset_group_name": "SciFi_Drone" + } + ], + "asset_group_classifications": { + "SciFi_Drone": "Model" + } + } + }, + { + "input": "21_hairs_deposits.tif\n22_hairs_fabric.tif\n23_hairs_fibres.tif\n24_hairs_fibres.tif\n25_bonus_isolatedFingerprints.tif\n26_bonus_isolatedPalmprint.tif\n27_metal_aluminum.tif\n28_metal_castIron.tif\n29_scratcehes_deposits_shapes.tif\n30_scratches_deposits.tif", + "output": { + "individual_file_analysis": [ + { + "relative_file_path": "21_hairs_deposits.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Hairs_Deposits_21" + }, + { + "relative_file_path": "22_hairs_fabric.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Hairs_Fabric_22" + }, + { + "relative_file_path": "23_hairs_fibres.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Hairs_Fibres_23" + }, + { + "relative_file_path": "24_hairs_fibres.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Hairs_Fibres_24" + }, + { + "relative_file_path": "25_bonus_isolatedFingerprints.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Bonus_IsolatedFingerprints_25" + }, + { + "relative_file_path": "26_bonus_isolatedPalmprint.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Bonus_IsolatedPalmprint_26" + }, + { + "relative_file_path": "27_metal_aluminum.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Metal_Aluminum_27" + }, + { + "relative_file_path": "28_metal_castIron.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Metal_CastIron_28" + }, + { + "relative_file_path": "29_scratcehes_deposits_shapes.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Scratches_Deposits_Shapes_29" + }, + { + "relative_file_path": "30_scratches_deposits.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Scratches_Deposits_30" + } + ], + "asset_group_classifications": { + "Hairs_Deposits_21": "UtilityMap", + "Hairs_Fabric_22": "UtilityMap", + "Hairs_Fibres_23": "UtilityMap", + "Hairs_Fibres_24": "UtilityMap", + "Bonus_IsolatedFingerprints_25": "UtilityMap", + "Bonus_IsolatedPalmprint_26": "UtilityMap", + "Metal_Aluminum_27": "UtilityMap", + "Metal_CastIron_28": "UtilityMap", + "Scratches_Deposits_Shapes_29": "UtilityMap", + "Scratches_Deposits_30": "UtilityMap" + } + } + }, + { + "input": "Part1/TextureSupply_Boards001_A_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_A_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_B_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_B_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_C_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_C_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_D_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_D_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_E_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_E_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_F_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_F_28x300cm-Normal.jpg", + "output": { + "individual_file_analysis": [ + { + "relative_file_path": "Part1/TextureSupply_Boards001_A_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_A" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_A_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_A" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_B_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_B" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_B_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_B" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_C_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_C" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_C_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_C" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_D_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_D" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_D_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_D" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_E_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_E" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_E_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_E" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_F_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_F" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_F_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_F" + } + ], + "asset_group_classifications": { + "Boards001_A": "Surface", + "Boards001_B": "Surface", + "Boards001_C": "Surface", + "Boards001_D": "Surface", + "Boards001_E": "Surface", + "Boards001_F": "Surface" + } + } + } + ], + "asset_type_definition_format": "{KEY} = {DESCRIPTION}, examples of content of {KEY} could be: {EXAMPLES}", + "file_type_definition_format": "{KEY} = {DESCRIPTION}, examples of keywords for {KEY} could be: {EXAMPLES}", + "llm_endpoint_url": "http://100.65.14.122:1234/v1/chat/completions", + "llm_api_key": "", + "llm_model_name": "qwen2.5-coder:3b", + "llm_temperature": 0.5, + "llm_request_timeout": 120, + "llm_predictor_prompt": "You are an expert asset classification system. Your task is to analyze a list of file paths, understand their relationships based on naming and directory structure, and output a structured JSON object that classifies each file individually and then classifies the logical asset groups they belong to.\\n\\nDefinitions:\\n\\nAsset Types: These define the overall category of a logical asset group. Use one of the following keys when classifying asset groups. Each definition is provided as a formatted string (e.g., 'Surface = A single PBR material set..., examples: WoodFloor01, MetalPlate05'):\\n{ASSET_TYPE_DEFINITIONS}\\n\\n\\nFile Types: These define the specific purpose of each individual file. Use one of the following keys when classifying individual files. Each definition is provided as a formatted string (e.g., 'MAP_COL = Color/Albedo Map, examples: _col., _basecolor.'):\\n{FILE_TYPE_DEFINITIONS}\\n\\n\\nCore Task & Logic:\\n\\n1. **Individual File Analysis:**\\n * Examine each `relative_file_path` in the input `FILE_LIST`.\\n * For EACH file, determine its most likely `classified_file_type` using the `FILE_TYPE_DEFINITIONS`. Pay attention to filename suffixes, keywords, and extensions. Use `FILE_IGNORE` for files like `Thumbs.db` or `.DS_Store`. Use `EXTRA` for previews, metadata, or unidentifiable maps.\\n * For EACH file, propose a logical `proposed_asset_group_name` (string). This name should represent the asset the file likely belongs to, based on common base names (e.g., `WoodFloor01` from `WoodFloor01_col.png`, `WoodFloor01_nrm.png`) or directory structure (e.g., `SciFi_Drone` for files within that folder).\\n * Files that seem to be standalone utility maps (like `scratches.png`, `FlowMap.tif`) should get a unique group name derived from their filename (e.g., `Scratches`, `FlowMap`).\\n * If a file doesn't seem to belong to any logical group (e.g., a stray readme file in the root), you can propose `null` or a generic name like `Miscellaneous`.\\n * Be consistent with the proposed names for files belonging to the same logical asset.\\n * Populate the `individual_file_analysis` array with one object for *every* file in the input list, containing `relative_file_path`, `classified_file_type`, and `proposed_asset_group_name`.\\n\\n2. **Asset Group Classification:**\\n * Collect all unique, non-null `proposed_asset_group_name` values generated in the previous step.\\n * For EACH unique group name, determine the overall `asset_type` (using `ASSET_TYPE_DEFINITIONS`) based on the types of files assigned to that group name in the `individual_file_analysis`.\\n * Example: If files proposed as `AssetGroup1` include `MAP_COL`, `MAP_NRM`, `MAP_ROUGH`, classify `AssetGroup1` as `Surface`.\\n * Example: If files proposed as `AssetGroup2` include `MODEL` and texture maps, classify `AssetGroup2` as `Model`.\\n * Example: If `AssetGroup3` only has one file classified as `MAP_IMPERFECTION`, classify `AssetGroup3` as `UtilityMap`.\\n * Populate the `asset_group_classifications` dictionary, mapping each unique `proposed_asset_group_name` to its determined `asset_type`.\\n\\nInput File List:\\n\\ntext\\n{FILE_LIST}\\n\\n\\nOutput Format:\\n\\nYour response MUST be ONLY a single JSON object. You MAY include comments (using // or /* */) within the JSON structure for clarification if needed, but the core structure must be valid JSON. Do NOT include any text, explanations, or introductory phrases before or after the JSON object itself. Ensure all strings are correctly quoted and escaped.\\n\\nCRITICAL: The output JSON structure must strictly adhere to the following format:\\n\\n```json\\n{{\\n \"individual_file_analysis\": [\\n {{\\n // Optional comment about this file\\n \"relative_file_path\": \"string\", // Exact relative path from the input list\\n \"classified_file_type\": \"string\", // Key from FILE_TYPE_DEFINITIONS\\n \"proposed_asset_group_name\": \"string_or_null\" // Your suggested group name for this file\\n }}\\n // ... one object for EVERY file in the input list\\n ],\\n \"asset_group_classifications\": {{\\n // Dictionary mapping unique proposed group names to asset types\\n \"ProposedGroupName1\": \"string\", // Key: proposed_asset_group_name, Value: Key from ASSET_TYPE_DEFINITIONS\\n \"ProposedGroupName2\": \"string\"\\n // ... one entry for each unique, non-null proposed_asset_group_name\\n }}\\n}}\\n```\\n\\nExamples:\\n\\nHere are examples of input file lists and the desired JSON output, illustrating the two-part structure:\\n\\njson\\n[\\n {EXAMPLE_INPUT_OUTPUT_PAIRS}\\n]\\n\\n\\nNow, process the provided FILE_LIST and generate ONLY the JSON output according to these instructions. Remember to include an entry in `individual_file_analysis` for every single input file path." +} \ No newline at end of file diff --git a/TestFiles/TestConfig/config/suppliers.json b/TestFiles/TestConfig/config/suppliers.json new file mode 100644 index 0000000..a10affa --- /dev/null +++ b/TestFiles/TestConfig/config/suppliers.json @@ -0,0 +1,11 @@ +{ + "Dimensiva": { + "normal_map_type": "OpenGL" + }, + "Dinesen": { + "normal_map_type": "OpenGL" + }, + "Poliigon": { + "normal_map_type": "OpenGL" + } +} \ No newline at end of file diff --git a/autotest.py b/autotest.py index 5b38ba0..bd4ae41 100644 --- a/autotest.py +++ b/autotest.py @@ -162,7 +162,7 @@ def setup_autotest_logging(): # 4. Set this console handler's level to INFO. # The filter will then decide which INFO messages to display on console. console_handler.setLevel(logging.INFO) - + # 5. Apply the enhanced InfoSummaryFilter to the console handler. info_filter = InfoSummaryFilter() console_handler.addFilter(info_filter) @@ -589,8 +589,6 @@ class AutoTester(QObject): if not self._compare_list_of_rules(actual_value, expected_value, "FileRule", current_context, "file_path"): item_match = False else: # Regular field comparison - if key == "preset_name": - print(f"DEBUG: Comparing preset_name: Actual='{actual_value}', Expected='{expected_value}' for {item_type_name} ({current_context})") if actual_value != expected_value: # Handle None vs "None" string for preset_name specifically if it's a common issue if key == "preset_name" and actual_value is None and expected_value == "None": @@ -804,7 +802,7 @@ class AutoTester(QObject): autotest_memory_handler.close() # MemoryHandler close is a no-op but good practice autotest_memory_handler = None - logger.info(f"Test {'succeeded' if success else 'failed'}. Cleaning up and exiting...") # KEEP INFO - Passes filter + logger.info(f"Test {'succeeded' if success else 'failed'}. Cleaning up and exiting...you can ignore the non-zero exitcode") # KEEP INFO - Passes filter q_app = QCoreApplication.instance() if q_app: q_app.quit() @@ -815,7 +813,7 @@ def main(): """Main function to run the autotest script.""" cli_args = parse_arguments() # Logger is configured above, this will now use the new filtered setup - logger.info(f"Parsed CLI arguments: {cli_args}") # KEEP INFO - Passes filter + #logger.info(f"Parsed CLI arguments: {cli_args}") # KEEP INFO - Passes filter # Clean and ensure output directory exists output_dir_path = Path(cli_args.outputdir) @@ -856,9 +854,15 @@ def main(): try: # Instantiate main.App() - this should create MainWindow but not show it by default # if App is designed to not show GUI unless app.main_window.show() is called. - app_instance = App() + # Define a user config path for the test environment + test_user_config_path = project_root / "TestFiles" / "TestConfig" + test_user_config_path.mkdir(parents=True, exist_ok=True) # Ensure the directory exists + + app_instance = App(user_config_path=str(test_user_config_path)) # Pass the path as a string + # Load the preset after App initialization + app_instance.load_preset(cli_args.preset) except Exception as e: - logger.error(f"Failed to initialize main.App: {e}", exc_info=True) + logger.error(f"Failed to initialize main.App or load preset: {e}", exc_info=True) sys.exit(1) if not app_instance.main_window: diff --git a/config/app_settings.json b/config/app_settings.json index dbba665..a266b0c 100644 --- a/config/app_settings.json +++ b/config/app_settings.json @@ -1,5 +1,4 @@ { - "TARGET_FILENAME_PATTERN": "{base_name}_{map_type}_{resolution}.{ext}", "RESPECT_VARIANT_MAP_TYPES": [ "COL" ], diff --git a/context_portal/conport_vector_data/3712b223-f80b-4c07-b57a-5cf7c8175c86/data_level0.bin b/context_portal/conport_vector_data/3712b223-f80b-4c07-b57a-5cf7c8175c86/data_level0.bin index 09cffb602cb74a6c7739455213fb6aecf2c31a6c..0fee824df425bbd6a2ddf45894dfa0ad3633141e 100644 GIT binary patch literal 133 zcmWN?OA>=13;@tQr{DsWPhtdbqahS#+Ts*+(bLzrd6#^9Z6966IQnYLvyR6r_vyZz z`^4>S`XOvCr&>+Am(9<#?!h4mGYB$lK(fUhBrz;YAh3+H&ln&^D;&`$2okKNj6_Zl Ntm^eA+R;Mxrv6?5CvgA( literal 16760000 zcmeFtfdBvi0Dz$VsTV1P3IhfV7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjm>oJ0000000P=rrgaii; z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=0qoF$000000FeJ{BP2L*;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!K zaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB) z95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c z2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*= zfddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede z;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQq zIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n? z4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj! z0|yQqIB?*=fddB)95`^`z<~n?4jede;J|?c2M!!KaNxj!0|yQqIB?*=fddB)95`^` zz<~n?4rqst1poj500#M64`Od2WWay{0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM h7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pG7fdI>~00961 diff --git a/context_portal/conport_vector_data/3712b223-f80b-4c07-b57a-5cf7c8175c86/header.bin b/context_portal/conport_vector_data/3712b223-f80b-4c07-b57a-5cf7c8175c86/header.bin index e85f4658a3abf704e4023ee132dd4208664aa979..51ca55818d180b505757e2a099351f24a94d6fbe 100644 GIT binary patch literal 128 zcmWN?!4bkB5CzbCs-OV_OIU<-1NaeUR5C8+VD;Lx2 zYZ*^12Z}yv8U3cDCCh%NPzljG)SMZVDqBO?YEC)$6t9&FMJ^jr%J5783R@1rf#F4geRJ4fg;5 diff --git a/context_portal/conport_vector_data/3712b223-f80b-4c07-b57a-5cf7c8175c86/length.bin b/context_portal/conport_vector_data/3712b223-f80b-4c07-b57a-5cf7c8175c86/length.bin index ba79c51955ff81ca64cdad9e834f7249a106afcd..4e165e18ecc10c12b0569fc4ad976b31276b2e67 100644 GIT binary patch literal 130 zcmWN?Q4+%t5CG7Br*MG=v4q@)-Bo7V%9P}zr*GcRyZAd=|HwM$F?OY%Z9ZOQEcf-y z3--4f2cx=-=#Av4X?1=#2@~i{+1ccyBOO-e?8&m*Hk*heKnN5d>%tHT5KKlxsRYIt LQH=Iu3Hm1f616CP literal 40000 zcmeH_yG!0+9EFdIwQZ6nUz)^TwDxB0&F1zcw*6wi)*?>gBu?U@IEj-uiIX@LCvg%d z=_F3YNu0z?3yd|U0^Dg? zq=XkV{RQGie}FdiM=z3eKwBdWa9912>Z8X#Yg`7nr~c?gk`CBu><757{z&!FW3M#U z16b;hUL@&&>1r;7t^P>$(PKBO;Si4cqZdg!puOr2@j(5N>Z8ZLs%}HL>W^L|>41ak zIE1JENcGWUZ&X_$YU+<(B zgi!tQi{xBzlAcG1)E}oke(LRXH$uDm<2T8COH=z6vsXi^~Y(CpL(O%@{y`Pev_OF=F24? znfl|j$4@;{j$6ppAHPY?1wCb9p|1Wo?HNE_Iu;7`XMjn{2`A;bg;M=d$}<3ZyWF+V zr~V93NjYJ;T($67{ZYy@0D2;yvGGOy8K9DKLSH^;8FB7z=>*b8Q7xsVqoT8Sb@*aQng!T{F0k{sHQuzAE-_x&;S4c literal 163840 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 diff --git a/context_portal/context.db b/context_portal/context.db index 207cf8e737f098c37b6ea225571fbf5f055568f5..87a102e4069f11950f753487449ee0b8f55d9f37 100644 GIT binary patch literal 131 zcmWN?K@!3s3;@7;U(pX(5)v5F-v|WDj7rC}J@|Uv%U=4iKHl?o9J{T~J^FEbHe3F0 zXI{#9Ioq|k3#ZZRY}?(3xKf~&ScH>CEUhtk%rO^1VG{C;flv};@>&6NffywNRR|tb NX|n#+nV2E+^aITyCOiND literal 344064 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�c6pnPUZ>KBbmSfky zaa#Se!pX6dqus`)S{-v(nTWn>IcFe=Mr5(8&X*vacEo(5Y?liaN0~d`n4lh zuzgh5m8j%1=;=LZsuY#merMG4g0T)=DJ zbhX1x`!L&Du2d*#&ska3gGR1k=1g7hj!R1m^Yf3F77qiSe5q1*A9G)(1#@?+qtp+CszS1E#b=wfFae_`X=Yrxg5 zZBhJ-aa|Pi<#KIjwO*}u*Xljn>a}`zt-HHYsrLNuT|1TCt}Bk4U4YjExB7J;*4;e& z3)@ec`k32Kn#{3MaUgCw+}D1h7PV+M8nabtc!MU*ow3$dnk;|O+3(b{5tV~_O+Wb$ zt%L9<>@d2^4&y+mA3cFC^-Z>${$#t+Q`>HI0X}QH(WT#Rbh%BqrwhN`=rU|Kx^~-* zuH1HWpaEw~_8XwEZP4Hp9pWE5rboH1okK&9e{){(|GCPKyXx)g-{PO&;=jN3gMa7& z{SSDn`=8}bj(uLYfko#c{=FDQ=MV93CDzf6E9nd_?B&iGJ$^rmW=gC@xt!-$PmVvm zMgDLy)=CHyYr5RVow(4gzc~m}Fkr996>D)}mfe4@!L9DN_;_X>p8@qg5XTD(dVhCO z!^!94rDyxO*pbUEEk5q$iv5C*vGqN%5fpY6x2GyIr4S}dFdChbVScoz)(s6Uub1=b z&>DHZ^0b_b=5%lSb~WtQL>e}w0$28_rbgUftE$z3hJNe-19^(H#(QdfNY8fE^|!mC zyDbP53*PcRuFG+}Jm1enJr^zah`cnKzA}yXw(>bLigFWh@n^rfJ;HI2^DXDd12lP5 zEyVM`*bUl2ZlIxnokzd>SdfFQlF=4rp}up1L*P#St!w1_b5crZK-G8jQpGOeo!aU7 zQ>f?<6V&ce)U3B@+=q3=dNAP}s)}0eT6tHo&r4Puw8X&xHa+MqETQUao7SySY_vbe z>VdIrR^X>2CY8hNaDb-^?EI@s+ql|Wh@S3cSoOntb*x}Q+1_3?hRENEx}}+l_wLdK zcdG9?TGx=Of?HJsw<(o0)=HW6IK8I{571APKa6@efA&a_>f>U&(CDJQ9~Ye+Uhrmr zf3E&2>TgJ^y0dCaXX9$BvmRk>xlfR*^{eAu`m;xWtkD6KUo#7{YYW@8sJZ+y7DS=y zUd~f1^J=z_^)c5OL%jwa{eC$vy2Q2MCxhZvahpvf&#KO@Y5}+Ba;@3Vbu*_4?1=Nq zY^*__r~wrgtZ+p0LHUM4rI>?j3sXMnoo z-`lPCckAAsTwa-Tg@R?hwJV=vW6-iT3%P~XYByIoq1C=ZykrzLw1;0dfD!d_LVtc) z$Rh>VK)Va^+A3fHL-QEJ+5$^=K8G$*)5_;_=yXI1G4E~oQ>DotNSCNikLXX22H7iq za~!s;_2SR4fR{U}zq|UX?2(n-KdI;QiyRU}ZH;`6gvtAPx@`w1bQp|YDhU`y0c24@ zdJ(GBifmujBby`EW_@g1DO%OPwgS0aywVc<*%()_UZ|~cyM}sWirRH_dAQWSaq~Hd zz{94GIuM=u4q6=ud(lCD7~AQ~<=b#BK?#9PT5Ta@ac|R@kT^_D3tkeg?$oe`3I$7` zt&#j7&bPorty@h@VJ=s&lavNrk^rW+di8!@-R1O7PCv_K{uFgplsP54kNsJJd5Bt zzoL=QnVFacy^>dO3T}psd)0QgV7gOR+j4n1&uE0z9GJGYDmEc@=LzkA1}ZXTEJf#p zBXAe;CAPNt)rEO+I<{|wUTp;*6yw=dk#cUYZHiGjWB?b!9*PTQ9@O<78)`0krgl4Z zCU0p#hx5=zsnk%nwt@yyyBgK=W7;~zB#&!Z_V($Xafym;=LG?+JMXra!cjyyYkaA8 z%%EwxnFNb&!nZ`K?=tnUslHwd^6#dv8MXe#eSKb!yFb|d1oOdOV zM+R0x8o}vw>{D}CAf8&fLa<$945U7XHa&vZpw_ko?UX(e^95S2M3p>v;qsGs}T`SfpZgnHgOs{(Wx;dK|u zHXX1eR#MI{3<2>*ow>ijtAqG zJ?Y;Rd(xJXXv;{nWhDBSYb2^yYKP#o^_tHA-O)E)jsLCwPwTsCXR4PgkID~APm7a< zpXb}TKaIcT;nshDxe$2qhuy`l<2PR&!v8~co~|t{wcGgVgeo9caTdXu#w^zpi*s`Q zFwc%J2U0t+e7scbhQpRzeb5(~tIAPo)p#c?x#dU@;}niJv|N7Wk0ieZ@5wLC6YgC& zQ>!{jc+H|f%zb)9-c-SRb2O;PMs-+kwMRqyDeK#hc1nGYEI%KT@0JYP8YZ*!WqO?F z%)nPKIbL=hfB)5mbpUvcN6Y$oPpn9v!Pw=E>xYQDRqF2~9kF*@12X99Y>aOT36XQq zj47A|E&w98bgsOzxcz2WILp#hheOp{f$*YL2MD9DYU_ZYa7&)f-FdN^ zdz1W^EObZ9Eq_W}hJsI$N&wxybLB_ZuY87g@2$`7T$vowY}bMA&9l`SPx+49Z(r;e zU)GrC_g@XIo2TmVwC3)jedB=;WNBqnEWh%F&JfJlkl(x2;hC!cx`U+3Gw z^ZEADGoqB19u41pw$vQFee3QJaVBsGri=gRW=rn}s1|aLlk>Y9|J&yY80E`1<-hRu z8NS?AVTPAp-CsAuH~6@%pJ^Jsm5Jb>JI^-c9OwPHS=Tq9cUri~Tf3wOz_%8MKZiW+ zreU3s?y}s=oXgFd7ar?~eD%Vj1JfzzaQJo#Unv8biC5d!LB>^!x;e9aO%=3!U8+rS z|GJ85;aVvE-dS!7XG7<;=5YF9C@F^P=tEdNK+>s9{)fXpsApEL$7v+Nn7;!lIf26AvjxMfo*b0Bh9|Xrm(%iG zVq)fMs|X!w^aYmY{38eiC*bzt(N)~T0f+Pp7Pq8AhjVX+fqi=_H5E*)E&-7C=WmC> zi~B{9#LL-rFtCmO?vfP=yOb1F+Y|`yF-vd0z|PN~DS--0O>K+tbMUR=GOYc zBCnd*0r2%8($2PWN5RgIw$*$_ROJ(`EU|84659K%dZp(VZ=Sh&oKj2{l8XlV9VR@L zx8>AEwVAx;dAXN?Hl29VB-y!P+c;1MDGG;VAFXN(E|KSm|J175H1V{03&w`traTk( zBl-?A{4A#>eYt*y=1)C|ndXMfG@H)s(i3bCRxlEEqxh}Xg5YA)nnHW7>L{9XVm6Y% zkiglS?I%m zAhIibHZa)rD;8L>=T1U3=g|IJ@ZZq)RDh%%2Hrm1udy+89l!9apRb#)EhP6mg}_~8 zmRmp7yXJB4FtaTW`A2I$M1rBqB0|`Uf>}c>tq=1Fy(R@xM-=KS1MQ5w`UwPatl7oQ znrv$05woz(d0FdiX%XouG1mm(^w{H9 zz<9_B$73WbW_Cdxl7y-l3ltE5*nmr!KOY5ZGWUNzL4&#V(Gi|78Ay6Sa!4wO0b-U+ zXQ9p7bwo1;3tFn zZN{IWfvn}xrZ{||HjLHr9I{44w4D|`vMj$i+F z{jQ^$t#|R$12t`u%|Qib$#YNCvKfXy1(AJQ#j2&P!8t;U(`E4#?*qL+P*nGd%27C} zJ|Of%4zu-kq4UU!KFZhObwY3oa|8zn5F^6eTuwl7Lp??A(2vE48{3!E=8D{Mm{)P< z&k%~2h{@usip}9fM|+Q{%^BwjA?XIT#28Z*feVQVSaC@_HF-C~%?se>S1;e$!`glN>M?I-H&B@hI6-a{u!Gs4wSN63 z6(GE}jF6WeS(C=bh*L^assw!R1^OVwiC>5_DTRc$wrIP`_O`I(fIrf_p(_9YlGs2; zlMhY#fj=KnY6pv9HKa%? zs2yTCJ+L+bN{aHEKqWJGpBmw9An4x(2=2Z5;58svmC!~g=2N6MUwqsSDFW(xT)AX2 zEfcXNhd~4#m>Q?momYZ#-UEFX*s8*iO<^Ah_o5{>buOs<1v$3tNrwtaN+>P=AKr`v(gg_ld4!pC_P zLF`lQCo|(`&aQ`w6vd`O6Fp9TG(i)pa<@4{v3q%4?*?wC1}TO%ZxHUoo&}OPG0p(1 z9qh4U)xiWi1_+H7=LzRb=*x4{H)HtAN86a*xo-;Vrsrg}(I5@GHP|>ilTF)+K%Qzm z!rCbhk;GahO>oo<5(^lq4h1Ap0u7V10}kA>Lgpt3^t4LmL$-*YFXFY~H~n;AZX*yG zxiR~|vuy4KC3?^oXjN)}>Jyc6z9EPiQ`J!P_I2 zMg(D|ZAm32ZeJIiu2C-W~k_c9)-IWkSe1()1+CL?-K{8L3F^I5c$>I)5 zk6O=$IYdgmqo_N^HR!f?!_Nhh61cNhA|EMdhFAK+m&5i=ri&})F7w&^oKmuA0hIkB zGZTxj6Q|3f@}@BU!#-eq>zf0cBeMoJwduaH9@wU$WJc1pFRh{a6fe`8K*i!E{7DJv zMoAb<8RT~!zm=V6>Vk^%%noK5I z0DV?FZVF<(8Da|^eY?fbfe$Yhq~p#Vmfhi!_p~+=()Tx@%88~3#DCoN$BK90f72cM z-?{)#dRc%^zh2KQJ(9cg*>AN15(FQMK{)-hW7&aAOs=iCyj_+G2yP+oIyQl> zs1CSVmamYo!K3neIH%|-8W3~@_|T0|)RqW-A|u}kaSSyyv~ju^htrqA6S9%$08H4c>hOI!aV5#x@ zG>GXe9~mS`*+z3PV*xPx5R}|*!)%}g2*u1Hl4Oh&PBcTpEw`b$O~3>N_)n5XAtOVq zAQFBdI`sN>&*qws7G@qRAIn?vsuwHE1n}t~p`$IV5u(qLx-H*Wa;QmKPEG zrIH}tT|$WF)NHxWW^gQcxW?&Q(kUNVN!6N<>^rOa4k{J&?_TKUyn)4p)5Fp;)bhMy z*5B4lJ5jV)u1yX;;Zw2kNWo%1THkMmZGP-?)#FAJV%0m)66NOpE(o^E2iy(0&jaU&=PVa$g4z|7r4`eV9TpIo&mnyDZmN zZ8Z$oHar{Y13v`o^^+wV!R4vzpIpCt|GHTwFuiU-vQbO z3F6$PCAw{Eh`xl=uuhK`n@6=|Q?d|`9wmSA7v}eR<;Pb>HqQR?Sa$kXF$#Qg_4=Kg z@^B-SAUO;}=LSUd=~|jFRQGZi>v%FETRwU)Elx5jcTx-scW24mPDhP$Jra>dZ<7&@ zzj=fmAKP@4)`1@-GrTu>_twq(S22G2wC2p}(vv04_7Xf{=_#CNfiNS@(!o6ei-G>? z)V=HXFMG|=hPAwR{i0|>z{9#N+&xYLRy!51|4sm77*o=_$D#0Xv>`&|Yg4x;?tV0N z>7!edS3bFK(>4+zW9;apDOB5mW=zA)IXay}$II58db)Dy3VH^VI20s>mb+dpWMH+v}~GbQ*;=H z7zsH_lZmq9%>bj`SEpGy!gI+d|+qGa;Z2$ z&ePU1+P*BS)0o0%-I%S9kEcGl^5eTxSFhi=a{m+2l#Lyj0Veq5TJlcjW9wh+SlCR5 z*6xN|Q+Bs@)A5Q0))QvW9W%=`2c6frp%n@l77V*JUY|<)eeZf0^9}3m=6x}x(R-E~ z(Rg^mz?|Rv`ZWr#-?Z01vDZZxZS2ZfR_rxCEL0%n4jvr3`NX=pb>Eq0n@2}%W5txa zXpSXv=0D2jwemTfe*I8TY|H0U+bxD&Qm+~c;`CyelB^crU0WUsAG~EByy8K8#eV&M z#};!(eW^Knl9Lc{cyg5?CRbZH9BTV=A%>{?DMt#TOr^+)u>ZfIhHgo|bI zHXNRuc~rv9GrzS;#y}8bgdmBsuCJ3Gnu7v&^Ypszwcz#%OK=~$_x9J(wZ*i1Cq-FS z(^m7R1Do*RpAH}pxm2sn;irq^ws4LeA<~3x-S15vze5JajzxnTHK)l?JTi6j%Jth5 zlau7z2FBjTkJ1wZja=k{$`jRPYZZ4E6ypnsa{y@i!->f&QKr>3rea%;+kh~|;u|G> z{_~`{i47<_E2Fps zXqjQUwGMJahls%HH19%Etot*vtI1WAQYG97E|I_;lIj3}(O;%}vi5^YUeb{LqeGU_ z7bX^{m|%Xy@(35}@bwXMNjpQWp@C8gVnAtfD3grjn2H~OFXiAi z)gXtOIAEtFXlNxxUzlp*g>xnByjLYmJ2tB|)qjpbu^l00`&tX9mYP$Nxkh zOUqW~1*7if%wW_e_IPx9-IxOu;3x(Jm$S=pUizKBH+kibmj_KY4E<1;uyQ}Td>6FQJ z;Byed41FgPA;N7r3qOf)NlE^r2>X`bdY$7JW0&DNYPdr6r&7F>A z$qq|pujwuAIi3+GAu@q-c;;LM=GM$jtx=-D))Cb^km@J9FJv(#- zCZ0Dl66p!Ag-QK!*^A_hcA|NmG=8nn7Aln3dZPJzx39tWScE4CC>@Z85jvGor$8ny z=I@(vA4Q2TAmJ8Y$s%OCUq;U)D`Iwklwty*liMA8p&%+j*^p`0NxP03g91myu?{Xy zrX6*8$6=0MjO}10o5;J<;tU(H!ifToe`8li^#jBaL^B>OQc8&5n4+LL=#lyUbjL_> z0-k;_xc=6~v7w=3$2?=vY>yoay-j)vsRJMq4%A>X-qt)eV|&OkCx~w<*aRN5kuzq1 zs4d%lWHX8|wvu-4s7QK=YonVq&vdIT*1B~CDcHKRT;6%dWT^i2-_eo)D%*mP_k(C5 z4s&xJ+d4}jrZDW5%QSUYjq?oNrXtk_1<$73VaE2`;f%6x-FPKu`m;Ck$y5K`Hw+qM zyH^Rph#@PT62vR;cJSxjP8R;!{b*YDca=7JHnXBoQ=swFMM|rHJFh`dNa%NkpA!;* zph)7uh}LCCNyO(2A~3=r!+QbE=|y#199~*ncs?><`Tt52U5%U7|C)cc{@a4U76i5+ zumyoF2y8*%yFlREKRjCOy8oMxe~vrmMXa(4-$GD!rdH1IKI|^p_wRD3u!rfh)<-B2 z7Np^2d$#&wXm*@^P@=GoA#~2^gnirfZqYZs2pDQ1)D6ye+Vlvj)TZ*C$+`2M3b(c9 zeni@41e4aniBQ&4+PCN7FlvKRNki3kRSp8OTTGjJ!yWiP;S3pW>zmS%xX92@yj0^y z6!GD4N~28glCVPLp=R2u7#aYA&k1*SF=vvd&n?9q0bQ!*a zr!4LII7$H>H?{m~xc;%UhyI-EQW9Wdao(U-v{_=4{u zr~_r}Bn<7YbgHfxpDBP;hq1K)EYsB>lE?h-!5vqtPe*FB)jB;`W#INmwR)#z3N0K4 zE>?$|kJsi$Z55_6%Q|JA;ubgWn-K9Kgqu>L@G1K+r!N0Y-<*185schy4(hbvv6oZl z(ER~WUH;skuIjJht1eP%0VcZPX=dQTH|6(=T~oh)uw(@2^?AoKZb=cRp@ z>>471yMQyRjKmw)l`8W}yHBlz=bW;Pgbq@#h+y+@c3RHM50^e%`XaO=i4H;0`g*uy zr&%WWGauFGV5}8gPnJR^^p~b~G=#zyPjx+5!0>DfaUV}?&MKt6FL!stfT=UUAFj;>ojpp498iNqRLm-B7mFz)S6rNd71ePD` zN9CriX17R^kO7nnd=877)|PX>9k3Kt9k>@CNDI`et@>9$h9Yiep4M zhjE)?vM%Avi4Gap38@vesXUk(85u$ABfMKcr{d;pzB{T)X(}DxDHQT>ZJzuPZf<~G z)*Fjqb+O1{cL^LYz)L&R^JTv!!QjkiJ_V}+c^?_Y7(%P}%ZWwD7c95&(GTGktoE!o zv$}yKxNR{j8zNbh)#J$$6B`sZ41Z_|Av9egid^F%pTor0G8HjcZW_mo-6}#%NkrJl z{ecyA6_9`$pI~L!dEKv|*nN)n1g9EGV$j6l*|5j6fd@MO*W!Fv_h9|ME&m^-e_A?T z{Jb!e|MT4c9skGN-umya00dqfdAHbgf}xuE%t(N=sb(9EG|ue*UYkUJMQ}kN00TGV{1Q0UkKdqfaJo zUXiKq?v*>AycQ=k8#XEJpNMBFM5OImB8#7z_N>jvKk%hce@a{2S5setP8Pn&WeSb2 zM!p1hz5;Dahl^cjZoWEt#l@q#eeaTz!7Q%cCZ)Ct@3@=3#nhy)q|=&Hb!Tmp_9-Sm z5MGcYsEe$`8yNV6xZ@2C?V)XudL$`D$mrc**%Ih;N^Lk*2vOMCTMl278Pen=4Z zIrfz>PKP4p3$v|1gx|Xo!N(wCD?4>eT^}1+rC1Zl_x)zE>)P>`M?&alNM!>sQY+41 zHshIfReT)dVel3tEHJ#40lm0%i1ClT9QrQfzk2J=&565H=RdrDcLN4aLX|ooIYCEg zCbYxar`_HK)1Mz!Ag)J5&xMjeV~H_t{0`j9?nLynWkgWm{n{C--B&M`4>F50FaPL` zvydz9^@$r(lb0rL;Pp6l^Va1n8|ERuE)_EN3^tfbT@+?WNQuPc&WGlSC87(7V?%7> z`st9*a_aJ}&py$&uLyy32t23`fN zwmr!*kE4XqB6fOKKeJ*7!ywy-?!{3P27{AOhO-!a63#Ljc#1{M%3#PbZ;A@4;6oI`FYxWE!#6ZbVU-ATk+7e>68nm{0QOW zPAha&nm<)`av2NN-D?I1r@#?>oRLT=%3~@>nUAz|sm@BBfsFd>oFRsm@91 zq^9>n;19l@M0U)kle)h6XlZhd1Y0Z5nF7qJIf%tpd4hpvn&xXmQm~2OzIFRK=e9+8 z&gi8P--&T)xs|3}WOX-8oPtG&O76=E7k8>co+2?>&Px88o<;osI~6gnOPtXs)~%@0eI@f3(*qusmiskpnVB6R zesymjAinEMJ1%qD={gqdnjAXlHNouONr%jTp?m6as%2;u*5 z2{oGtDpsj~iGu=1Z45!}-_&$;DG;@DQ=zrp{1?!|JM0`>-@iU{$G8q0&?s8zfK3db^f2;xa*ZW=F|7+tvul)~| zpBMje{y&SCx$*Y@z82%6OG(>59Itp$C18=->UMdu`lIbcZ=g@#I%Vw9K#8IOabdn&OK7rdo?ANmU4rMBp}F zJ^8t;ipg>fJox$tUUeLXP@^Hujz?&8>lTLc*$g1??0sX1ZEKNjQ_ z3p@(QXA~E0@u)|Yirb?Y!!#8=CK0^rEOr|`q#Ho<_J?=eESVUybY=peqg2Y)Z`z5s zBP!jg(T&$%CSHAEE>2lWj$ZRjgE^@#fi1)Q(@+=%1m0|f0$rHj{Q(a@;ekW{1T6^C zUd5*RH|8-PGrhs9Ku;9ge8p0+F`& zwP}p)WC7xNLnxjWEjYC-zEsuIBoXx+_51SS|?av$F*-ZHVef zP_?h%Uq7Z;-lxB=EnU{i0^9Xb%va3#*>2vuepiOE)V?IB$T>W9LG^(g-cQ^Gr@MVG zIB1J87?TkMQxCY#-E+p=#DMKY=3^jI@ceHMLjRoQ+{iM?!`TGZ1?pp9H->dN@u9%x znEA1x3r8sCjpq`}JEJ-?^VKS4vu7;ECq%JaxK4axe$9{t6%%tAo1~7=OWOX0wUbFo z0)B0HbwhyzY5;7GbPi@yEoYndnE>wU9U# z;paheeF+Io8~((tZ0Yf;H!?QarVi)j~Wtgi2(85B1!~a z10za>(#_uXF2n1#!l3lo7|vkJrU;O`VmjWJAyh8#krs(3zIamd!$c`9UlP^O9OYWw zXhI?Sz{@AWWj-(uA1FX=8ev5!;9;KV1SL3J33v4o!5!*&-Lh{Q8IZ6U&5shmj4X+B z2?*gMPi!(m5es}F=R#{Cb!BeJpWKP7qP!3VX(Dg0J+A}In9{Lqs<0zuO=bhXcH z0=7+cNTF(wtb1}k8R?KEyaWLQN(-^2{5Hb`r{tzD#NQ|n0OTxjJa{=k>BD=k&P`r& z^S59c$H~IE;buZh?uw1x<&XdtuAsD=iQ~MQh>t~K&o;N66nbo4F8`bW6I>NE$j+k* zaC4l13$f26oXtz_;)GB_@IXTd&x%|gOr4W(QWm(-!6(2wu&d+NCSWuF|3dWtb~Qe# zEtZE1BV2C%_isJ~zCGPt?7H%&*PgK_`goMvi9F>*XSDi907$g){px`HFR>9k88ACk>dk>r8or6kg~g4}I(+ zSoB83d+T(@2s8x~{3$_<5oqY28I$bk+27B+HeEQ`b9R=+emOY|* zvgn{2wcPx?<_DP$BXiogIDYQ*?}Bu6P}E6ZAF)`N;Q!`8Yb)pC0<^Y12*M$!NrN-Z z=}TGfe9}5vx^UYk>Dt7qpla1gc5X${??OcKE-iou_{v!!!uA`ddm5S#v4%nK6haSG z-fM}Jd=%w0l*Wy5rS-V=g+Ge>$VtA<*$6j6{B`m9b;-LKAx^}@uAr4<5c~|;XdOFR zFh!W7RSRNpe!fPTOu+V2$C(^uWf|9r=JbS)zgk^#-iZdMuY#HO+r!9h^@d^+9PG4g z2c71imxiq{)CtZTRxfJE0;+7eY+bxy>sBgwMQz3VEY@yw03K(b3^6=2stSiwZ zZCG>K>q=N?M?`5-OOq*+gbR#FIzpE~O`J9z8=RK3x_(*SFtt-`H*6#;D~j~)?7?n+ zhaO``n z#RSt1ihQ9c|8vT?`Q?@c;3MIX{Q(DZ%9optiKAc$T-E`FbDT?kVG2Rh6vOp1YUBAu zqB(V5_8eY2GW&>NmBesE?tUmX_-W8C!3@p8PCwI*m|9A?Cj-RLv|n_Gqt3X6>_X=# z04X2K0z2NCcFz{1S4n4P770M`RN*N>Nl&>^Rf=3|`x*_dXJx77e5F$)Dh?|=k0>U* z$$&5fesfgHs*??x5)u9Uw4j{9wPJiszfi*wUXh&CAAEDBTI!nl;~g(l_%1AvSA(Nm z4(pO0(a}?fGpEMX83>YoxtWYm0;5;C!*$%2lxgR|YowH#0??!R^o4o>JJ{nViIGE` zlkk`@S{4t3Lz*Q!eWD7QLH^|(q(@`x^o^*>q1ba9OK#^`kL){{zMUJE7xtG93?lqHUIk7cjC){ec=}2@bNt zAj68J3j*^VOb!eIYEC6$Z)kY7=cnKBc*%S6>Ytq^JkT1c4EySiWy3JZH1f0Aa@f#H&qp?!~#y zC(7_d)71q&(YzzNS8$zQlyr@R)GiIE8$Z4&JB$Q&iKJ%K%(Xj&8RvHiCs$-{I|yt0_S4MifXl=G-d^YP1sS_OIBb=(g|wpnSA{OGY@g0(GWme9~lXnXZd1A=PE>2q9Ke(e8;j8tunBuu!1G6yPR*V z+hjUd7f1>%&T(sPmHY_JTPu%e7UzFyjWjPmOPiS`<6^%Hnam&z_fqN*lF*B^x>Vrx zA?^BrKVWy9=d5CU%I$7ak!YTSgDdNDo#EP%u+2cS=y6S@p+x!X+BFBU5MC`;BA%#U2+87@x+tS2knV1R!X$4)By?N(bun`rvy#A6g{B)6;fTuVh`NVB&bCya?54<38%|cC);@oKF=J6$1W2j0& zAlVKV#Lu-Hf+1r}6SPqeLu=$TC7w)7hpuJg$j-FeOOlXyQH)n6G_cZ<*TVcmL_YX- z0w-k1OFGZt^>|5Jhvsw_PHp3wTxH-(CU|*-TBJgbh6N#ep}}-6LCUq^W>|;tZ^?0T zdrJ%HcT8MJ9gp<_U^1e+t=T7XYgq^o8V#od5(si~&>7W6_t_JH;W_#t5p9qTMNRJX z5%wA@4gwI2sm-mq+DG9aCrH?8k<0!Tj8Fo>L~8wI6qbGvmn5BYY-~t#j{#w3F-7sg z_M!E3f$CwcW!S$eA5MMKJ+?AA;W_Y66Ry~E%jBsVjS{21Vs$WMcFpXx+B>owe7(hz zZPL4LWL|Pq2fr6#uq3j$w^J^4JLUZuP*_FEiEzr-_KS){J5RDvBv_ChbZCIV2>A^J zlhNCGrFQ5xSWb}KT;hVm9~+i)i39Urr+x5h-2`p4Jg&e4Ya=L1q`dSaPRmxuAsr?% z%*qxiSi!7`+dM4aH8%0E!m2oy`&3KbT4!KC7D= zBxAa4Y6(~mCw9pbHZHGgvQ0eUd#;?N+kms;fQimSekrU>%M%5a)ikJ}G1~)HbE-q=QWB`|y zbXMj+&rLw1pndRDmQn=OmQ91imFDgx#PzZ;qeYi*YzwW_L+MZ0yH@}(Y}aqZ5`O79 zNL%8Nw&A;znt*B?a*m9!+H4q`u~XZU)p+porArtFQ|AOy2Yuy~zEWz5BjHNPOJA(& z{J$l9W_gMLgPLed_!J6m37=kk+7dpugwMGd+@Y0`IT1UwHKzN#G3_nkb4&Q#5bF z_${_|AdzsrG80sNrgxH5of;s-&e0TcR7QKR8p=WIWV}34W1H<&GIt12a;Hq4if$+4 z_ZCNqO+kNfD|tah+q33%X(qizxrvK8Rw@pLDr)TQ?Ph47PCK8}*_T?fG6!YM?3$pC ztgkb&3kUsiR~i(j3MDo*oIXPo*z3-`wsf3VrXHcGAs3xXI2xQ6Y)O)csIZO-_-YNy zm@L&kiVAmWIz(OSIIB7nW(=?{SQGO$u(Oca3pIV*LYZ?Wp2)$#hIGlDUUYOclY~=F z=>TWO;|ZyKQsDX4_U1>dk8F196?-Wj`lZLcRH{rI(!G|-UiYyfD(H-p8QwJst~p!} zRz)*YB^Ig#ubdK-a5_$m?zG!mV7=q!CIM-H$!K2qCgZ=m7~&eWu&EH zwPka|6oF&_Yf;XUnd~f{G(m?bym0w#H($DoD5_;$_rV=@G%;6!a9X!7h4Z|9BABx5 zTW%T&sXA{P%=4Fhz^Bn51pdeX9Tss~tG$5QIb^yqKsz*)2cXvOimQA8o4UJn6D3me z^qLHncbClA1_FA+WAZpy)2^zhi#I!|#HMS26G4_+q>k8{XQ1}rN#l5iJxQ0^^6{F~#IG&%=#fdmC zCB81t#?hkwt>>b-eN`@M@5Kdk7SP>lR4_w{uD=(RIj@^CQ$Kt2d1*p)c|0l@OV#z! zxUi;r3c4PPa-he)aun@95a(bvx*XgU<)6&7pX}={L{Txy6{2!5tm~ck;^>i@^_wLaQRUM6>w-iNu1uEu`g2jVt=^1sxu_() z82gpp+LepjZC&i=+z6DKk5~nOIXp(5ta6Lb2-%#sj^f( zgK>D&Ss+=VBFvsWfxB_L>dm2XVnR zS-pKDj#p=OvENXxS?01Dmx5a}zm7!(^HNo#33?|@L34Wr^y=T;4eCS%(*Wz~PokJg zQC!@N%Yhl_=Q|*z{(U!BbOs&$*qLLoA8R~0X57|*kL-z~RXyvE^5$p3y*=+ld3nd_ z_Mu#~taiKJkMr}7pIFn+98xxSR-wd$)tx}J6vr4&X@5G-DYHU9uk;Qw)ZJZ!VhG zXa;uYa!c6XXucf;)xY15bBe#>;qLdNnBASL(z&Q$IW5%SYLtJbT1;I2KFE)230K2$ z0eJ>M()z%Oe6?0DS9|-r>y>(Uy}Mek)Vk~a^-52>)lo|`+Q3Fnz`K3-Zp#CJ>Jx1`p2{pgG1 z#koT))%FAZP=;<@i1Tfd5FaXoqwf~u!(er_e-9XZ2qqN2x2KYi-Qt}GW%aOo6w=iTO?I=Et?N0E6x7tsT^==c zJ)W;LDveqhgzT%JEv5*|J;)jsiXTK#OAU_3MZ|j|J@n&zT(G1zx;_-;iJP3$<@aId zD+d8j|4ZG zbipwq6EUK$xG#$Pqxj_~zwz7bHwbCbN!wksg{TVk zTV<++dEMBNgXa?0q3eSJ|AMvKC-5I(JbMbshNmXIQNa!xN8&u7ll#h%xFovM!xD6- ze*v%Sd^bCU8T@p&;b}|P;LmgYThsm^eP3CuUckDs(=USsAQ2r4;S?6_NW|=T1RLcRoM0LT|H8UyKA*R_;h!*S}9i= zby#{&t=Q=9tN&kJ`!5>M^8;PHCZHz}|HEH4L50nO%UHa6^z4RFR|Y06p!f_=QnRwt^r+ z>Sw){mt9?#2qMq*FaNU-Z;#971c@h$Zg2CPPuKh4e0r-23+}1K@srj7^dI+cW8c>E zosPZf@*qSr@LG!i+wffJ@B_4m|MBl^G~|=oVFFp9qwX*lI8hk z@@v05e|ij}`5WxHhc&Mw$QiSgQqm8^!~7#i`7mGF9_QeIx;iZmsEZ;SuKum(ijT4I zFRmWe=F&eXfr%}+WqlkkaBh)2st!M>YEL{YMpzB|u6mGw>O95{YX?GPE#!*sd~=u$ z;4^p#k~|Bf#-2MK20FRo3AX9hqZtludc^re=5}2+*aGC=r_bIg=GcN}DXuWDM@OSl zYw;KJ9R-ve<*}vMn2s@5V*vK6tna zP3~_-`DKpyYOzhnox^qBI&`QfE|_qs`fR*8PvcNdd0_@DRS2Y?t&Z_Mlm8{8tDM_fe&vCMwu@UX`$g8{Wlp+HyhcXU9hqoitlnTY| zg<=obtMBhR0}IkxcK0AVB4g^Uy$+>ydDBo@SN94Y#)sLsYcQPtI-7HUZ>`bI|GMjq z5<7Xhr_s%(T`BjlWy6;0m2K?e<-Q7XCgNn*&Jn};xXC|$2dG84uKh<|p8Mv}P# z{QtSqTvyM3*Z6b(+4^q_0$UK+g1{C8wji(tf!`4X{_I+=)HMZ(B}`)kp01&qZnyOCuGwPnO~vT*SWnT($!4%wXY#3(<a8<6`At_55Qu1gf6taI5;%sz&HWPyHT2ZpjnC1MnTdxT(2RXb zm&Jy$3m4CvB8}9@`O~Mz&X0ZhI{QDbN9Cto{BP^OEeLEuU<(3U5ZHpi76i5+@Vke= ze_GBauY}mz+)6qX)J$87kS#^XmLlZ0R)lON zoodRHlVFfVD<$w-C!J!0ACmpQ&~>`2zO(%I3;#I&^RClxPt5f7AN5wdCSL6N)wZq| zr#ejgtox5>ANcKy~vVhHfsaFGh1Db10RS!A^ME=QQp<(y`= z7?IUtdR;HmnSh6o7-Kr=>=~&}XP;p7AkU6IIemR`Nm-%87^a(pm`q$M1-x2U6(^Qv zy3t7 z`P}6>#cD#-lhT8kp~4jc3@MDCnin>?EQnQ7zUzf~%cw;kK3RojJ4-AZAqc`n0yRH- zqKs?H4)`H~uJx3p^&#Yk1Q#ny56NR^3G^5`F63moQRY~43UX7x6qL=Ut=Jlwjr{#5>X%M z5eDA+^;calZmz>XlwPMt&WxQpeg6E!9Emz0klW8K{Y`U_!Z;eg%a-F-Sh;fMT$Ufr z*X%`d4zxgTO_X4_*220b(U7%ayeTbFA;sP4liY|B8`gDBy zpQ8IZp;$KO6KVY&_sR7|d#GXut+iVVm?nWTRyweYYp{p}FD@j{;OYFw39e*Vnv`sD zq4uU_!?Ao;7RWa^X>Ng*-fQ>=&Nvxq-58hLPnbzEoa0#_3 z`1GS%4}}r1zD6J*!d-l&)l9gmXt>)d%;QQ*xsnQGowBlHBwfP|_$fHz3;Gb6^|~y? zHd(n(%0tg5BMxR(;hEfM#j?|~Kg*O%m}{LCa%U?249lmLOq1@5dYBEHotkUS&MVQS zJ&-9lWGY@-nNo5X>fg6urQ=6 zO4s5CDBd zI7t?#)OO2H%hwLVE&h<+_68lwI5LPFaa(S!1GfEtGddPCrFR;`vM}>0on)aGt>K zp&5s3#(F~XC*hApN|E9Z{HI%yEAgKsI)au&0ovwxIn8%R9yVM)=Vx&S6;(P)^x&fs zAMu8d$$4jiEJpiULKoEm7}B}%<@rUW#&nb!QYQ&cKuljwQmQ%YIq78;oMn9`k8IRK zpnO0qQT)^jbUfuSMQH32ICWyS0{%jzI8EFeAp<9Sz)u>&@gsk7rt8IeeZqx{V`oNA zoT@O{)K7;lG9gAA$zqNzSh@TR^V}qo^sm!T!4vqylm#27Lm-fqaD^$Qaie_J@-pi> z9l8VCculp(0-Th*nUWf;)bi>RYW=#B8q+F~1E%>|lAv%Sq+Q_SKR zOqIinbl!-vJ;mQwR;iBV8h#F%fOP?KMO=MI*Dh@5@f-$0y`knFMog#vj z+~>%{?aLs8Ura5A;lpNVKp}{x$syu{;Hs9Dy^1)qY_8+YN_=GiBGR%i=)&WJE|tIR zsSi5V?@mw;Jowe)x@fEMo3*YN$2<3r(-$tDJUw#y!Uc?q+Bn4uLcSAYTrM}ZvIRLd zZF6^39gU&eqF5c2kqPr-TAx5LL|-5Eby1FkK>(35U1zdIuze#` zvuCT40Ar&LjZy5V4aDJjW{g%eGFgB(HM%&4;2~N|X256JL68$PSD#M&=*@}SQRD^Jjf2uBS7fL-XvYPsv|C!!}RMhXIF@6}Dx1nhD||5;Tn^G$>Vu(M340xr}{= z#Nv$#!IbFOv15pOwLQD?lYBrojF)FO*91%Tl=s6L4_N)bsB3`#b={2rcKo;Xx9etB z_5Zi-{Wm^7<{uDC(Ea}r)t@Iip}&}h_7lypqyL>oM0msA!*MjG=$9YF@%X6<7f0gw z^vMPnJ#l>Dr0z5ni^#uw;&|+wZp_Bfc#(fUAwGoQt>{dNe~(A}sl@Twvvn?};`rQY zwYe6@=k3lT!UomLyK!_%!Bo2n{P|HFozsuQMCa(?aYm!x$D{b%sTvobNAZPIiV9m% z_Yd{wp8oK^nTSwOB5;^RuG`(?ZZ82kQTc2+igUWx)SnL{W?b$cDaMK*D;>}2pSWZJ zL+!SDU&s+q(r#j^elw$He$@K@tRnvu>XK zFc&Sv{9DniN8^~t&!uPjdOgnw#|HK6lrD#^tNR|hT6`>Men$BJl6v?cE|5C@@tQgS zN{jm9@2Q7Fxq=mIQ|nvB=$HEUdkjg>wrT$LZvCzG#msYe@4h`zy^ouXqiS$cj|Psa zO*CBFFYxTV+8=4E7lyY-3cuNRcCQ-kJZ^pUM!mG@@2&1+HJ9gE4#vx$5`n9VemqiC zv+iP^us_XbU$+KKT;r_J;G(|yL(PzAKd$s=!lwbygobT6JJsMv0?B>Cg!JC`^BP$H zs2(>4a+O4w+*i72ICV?ycI^=w<*LQLRAPWCm3t@_4r&BZ zwU}dz=yu;Bm>3B_RP^Iq>G|R;rCb(EU|h7?%}2I1VlpVqFK7*Z1|H1MX`uVn%PnF5 zrKsqRS( zjTjWP5Gz`{BaIv}y-(HRT(0 zHXb!8Yt9O@&T3qba=F&*=ju$!0_JBK zLawA}Tl?OqK9#pW8g>QZWv9_F+xk7LKR?o+Qjzox>TgnA{eVtqjQ{k+MW+(z;r2%m zyg)Djp|9womdmT?l2))*ASjJcZN{y|=*ts(w%RMc3+fRkw$LC~N>n{^ppc{bnBKTp zioVduZVL-X`*n->dCyjd3WRoQwi6l@5ObO;jiN*-_AH{g+V%rGQacb=Ze4oq}#b%?K;<5gJXFD7u&1lxE94W-pArW-?v$=J=NT|xd2G5=I<49kW8VM8EzxE zu&NoIE#&4G*VK?J^0=zgivDy91P5G34>jCbj91#CsQaa8RbU`_iwHViY1xu#{QDyz zM^4R+@mKX^iCh(&5D@zG))IKpZVPhT^^ibT(-#Tpztm^P1pmW?rfZju6$VMbr}zwU zto?*|9y(19gM5KWk|xA>%8%*CwfIQyj=*=M@L@4?CC%%7eFu*}&$BAI9BJUyp|Ph6 zxwy5guRkilPjx|70*ec+(b@2|JVAv;uC^aC#3v4Q-ex}(!O1QbwTN7N&o1^ezIh zaiL(E4Pu%Y zezjNetHP60N?t;if?`Z|3^I=um00JD@TCDf&uowL(t>phUt8J*3;UT=v@gz~6VdnU zLYJGl$QVQgn6!)s5KoM%Q3&+?xM2EIUBAckSq(Ni$u3R-%y~9X7YFWONFIP(si?mN ziwYNJ9MT7eBf!MJ-vd?(?G<(GCOwZz3M%w_&pSRxjo!!$VkSTAWD9{Iiby^ZpCN!1 zfyN5j5(6KNrDQMPpfO3qr+uHLhrA44*VxLYL8eWIMq=(6wy{v^&H) zYmt7U);V1*3Wzo0GK{>EkA%*SqHm<@x_4i|w zj`F?RVkV>Q;nAR$4cQ^yjP%i;f=)F^h(n`(Z1KtrZP_80j(> zR|#xidMNO3FT^tjzCnHB=K@3@Tk_JJmezRGHb%ffM!)yx3sz=B*B4-hYs*^UJ48{> z7vUtASdY9|%Kp06j?E&EoIz-OPAk^e^Pzg5$VnWzrv1R>JkqF&`g2`>eou26SH!%~ z=t{+AGh`T0qBDTSn0r2qOTI#gK)f%C^K?y*{5VmG4DY%N!fztdA3xD&OJb24_emn$ zpJ~zWBXOX*Q3r@`;S4T5aUxB;L>45H4&~WhexY6tt2NoE77GmS{ll?VcIUB3SsW&6 zh;LC{awPv_ls$)yrz;>tMH0)|{aBp2Ww>!H~>Jb0>NnuAx6o7#)f(y}8%Y zI_TrJBkhXgQVE(p3(e+gX6Z2yDTikGp@fydwYz{?5Uts%olRxZHg)lVN?ER z6db8^a{wjzSCQ`{VE6ApCMj0fzsdy`gcNS1eCkCm>F@D^$#w*jDEE15UQ_&Gu3&l> zE$t8zDY{cp^{yWFmBl&Ty#cqSnu!|k&Ns^y@<~)04gJ$7m&=vim+GX_DfiWS4^=C5 zQi05M_w?-FzvFwozjv^qq)*!$hxb)?R~xk*q|+&H+f%Jn_tmP^J$t*WjdG>d)2LSu zbT|5{L+|gQadmsG(m2xHv+H|@dMcGh@A2NAMq{|QQLXmY8`VBi^;Ag#(A`re#J^hI zwX0Fzxvf#z%S#n9^?cA@Em!xG3E;=IdhJAaUv(Sl0IKKq9p2Z?fNMRyJ@5DJs_pIX zA%6)XS)+P*bjSPEI++4w|1Wj@M_t|R`u|g#s~jx87yku6|5f_$>zkzt%E&|C&UAgb zP8WIh;;AzuXU9&RI(0rNx}8-`+3AIiT~-j)HOf|F#bSa=%^MP1*g7$R&CIpQH=1a+ z{OL?;x{Ruq5+=jJ@xrNhrONBLwb;bG^VnHzoJt;5K6zTP=Sy=ePYn`tp{*Hd-dS5T zQ;KPfvICk9Rfo-XslC}WMJmJL^!tyr2hazDqc_vA&7f^_sc?yW#1citHLFTQeyUc` zrG1ETDxKp;=p3ntiB3xe)io`Qi2(o|1PcAf#c_jk;RMHZ#-L zdwZS6VymEIF7mk|DLIJgMa)Qv5h|-^eCB)@lEI)BR4!T5vQyQs-9{Cb4poXRU$xzh zjDB@*?F;?Qs>C0Bd$I^Vy&U@E1DoN~$&oWSqMo~8wo#0fRwD_HiAmtGE8F3f<<8h? z`TOiJfCAT<-!-F$oL|unGesx5Qef|nkVL?rvjn*^OIoq?Mbx_}m91t8;-xC&_-5(s zlmwS#j9^>VJSuC40ajR)U|{+drb7f{EcDBylT1{$Uh(Ku*&&-#Q|rQM$+G9t1EZ5h zdX4%bA*r&=h1jHJGMx)0?RZOwY5H$X;&X9KXYEMsh-h(BlG!*q$U?ZFy@#$Cmb7F7 z1jyi$J!+n+?bnTYtu1@(vJQ+miWZHjxxa-Babu9R_ z+zHN|8XLPX7SaT}?7Gd%DvEm*3Hf4k($#gwii3ZKVbmq3?vi>x)qy1e)v|>swXn-m zEwdn$_?F_(p*&MFO`LnQy)joV=fM`(C0^<*Y0|nm?raRrOsDh0L-5%-F3FiiBWJ@{ zHEZ4+1c2*^PV|ne+G89~jEv~d;^&?5gRI#i81<$+MO?BM!R+aQb~aCscL}~{yoqRQ z95eug-w&k{qo_MDQ8z3RW`47tu(asgpbif`cqLHt`C9RmfPEwI+fe8Su#2V8#Fxr4 z>s@EDH+_K4C~t-@0EB8d4ph@6b6y3qojR8%5tra%lNBdS9Glwge$K_i56`$>>dukn zY>b>#Zs|PSR*~)#@^}C)p89Pa(gNPtrnL(Rf%RlcMW)x|dZ(vB)`x~MhuTO355B&X zccRD54O_+d#WQC{&X1kDaAxe1c$3_wLP`eB`^M7J@;;SN80Ee;So<7BR2FJ7n!2yf6glTC4 zb#}&q2d{c^V9|rGcXhp}t>d1CMd!|*8y`C}DNGTmr6ZA0W&FsO7PuixtB}Nlp3nIw z2vY1q{LegzHWWNh7SNSo7Ud}mhShs~9S|I6+Y~%N5w_D=a)D7L)zck_&7D%-PU7VV zqS6`#F;O2iOwZu57Ra;0;NHjl6F-lRT=(}k>|E(9Q%jFT!BS$I8)^CpUxIz$!OLI9 z<*tdRuYTV3eA5LPCn?MMONb+I8AF~4v4|Ave)lr}x65IhyJtv)#F(JXYu<96Fxm%H zG9LF1IGH#VyHM7*$ZbJD51bGUL98seJXf6C1U4YbdfO%t&{Cddr02v3(r*GLTDiRK z#`jZJFK-fhMZLtDWVyI@DPh0WD%5V`GmA?K>g3?i!+QC_7;d`!CPb_wnFp_`5y1bW zS6_C0wGsH_!#RI)?850FeoqQ{(t;YziHuj6LB(L4A&3cwZ|u0)mYbEN$n0VW$Et8E zQbrn2_aydpIgGi=i3_SyoT8bw#DHdQsai8_IZ!%b0LCF?XWiK6IiT4OmvJXWNUJuW z{pk(F=Ah}$ekl?0acBs)frK?>=err)bqq@UlM+hM`9B|B>S}zi@~H5Ni>?2DTL}F6 z`(#=~Kk?THhd8;$;hkMNpF`JT6-lX=6@-I}j@f39*YGpvHj9&t>tK|}Q{nb{x2W}x@F9Xykb8W! z-$(Ok(@zK|eK1NgfY777ar}pLetO-PHa<%}HP>oM&@h>S^Q_USfMsW3u~UhK3SZIL zPMJ{QSIz{@8SJX+Y^d0|WFGIaj=;?5@JK}P;i5fy%uRbJ2*>6Sr2|6hLF^8cTC0>V zjx@7-g&iz|Q&=)*W7==?*?L1G^FB*@+te{>-I~3=O#)HBc$w3{qij`IadW>TFU&mW zunSl9=VFC1sQgPJNBve#S|)%XvEXN=MV+!Gol-UHO8kig&u@O-_2SS*{&8|-Z2at*3+L{+pcJdnEKyG)RO<`; zA+0{G+sd7sfH=`HJm-fxqSDS5vEiemBvZ&c`H3tZR{knc4Y8Bikq;C%Spb&eVrH6y zPBhlXbr5CGr23T9@zdJ(ICXHMA=m}!&`#4{CFUUQ)Je{@UmxdeB!EaEXdDlt1SO{C zI=N#82aSE{io(qB2!F4e!>ZSsx zZK8-dO4~2dcD6Y~5^o~telf2gm*38pbTcwHrs{}IWGu|rzfR>a1!c|8w(N#94{}0= zM?&J06_NPTZ%SP+de)Kn*^6h!M#jg^5lMMPhJH@cA;^I}h5|*)t0?%93R)cUArw(g zs!!E+)J&Doq7CQED;D5j z(j)ORqrO_(@(e@_mGjO7v#A+n# zo|Oh>7VtiG3c7$i&Gw9ZZfvQhqNjiV_~XJ{rp>Evgo3Snwie?9swO_?jj}4i=e_ za!9l)oRyKOBj(7CX+-w1#!nH;;F(@|^IX_0lNg(rVS`{mG$R2`8Evq2iY-`5$z=J3 zsoo0emr{4uYX-77Z1(?Xx~u!IHBQw2Ugb}U|4HuO%FCxfbaHi%lL&`yvQl#dwUJWb_S?Z^$BxPpR%gRTF$Pg7JlEGpGQ^_n>cdII^ z-r)Am3!~A17k&o3FwnNqi?-Wb|Np)9|CbB@x^MVy^}inYMd=$H_Wu1rQsB$`y9WBc`DX*KesZ%ZP^1=_NB3H6 z8*!>Ww)nRjo|{k357A}@&rfhr8cjynS&HLdo4RxV;fGJ=Zr*vMWI`1-cU@$VmkVc#9&C^@MuO>Rl@|2Xz!gPUW40JX|O8 z=;5OWH*P(CJa_Zf-Ps?av=UE4ER9!tRtg2pjj4e7+*D5(L}5@s&3wFK&T*_Afm+#h za~2=-S;Ir%EH5s^nUNO|0ewBsZr!6Y$fbejrJ42LClZEnkwAK2qMcc zsRtiQW6{a^So0vORx!1uwuO^ZB#c3c9{CdrC(sj5C)X9%3AwiMV>MJRRv?H+r0RlL zZh^a`g>F!3f>b2()22gH!xynxx=5j&(^){NPBA148|$RHck=gr`m0-$1AQBRdFxe^ zFr@3XfW2QcRQ-Dbji&td_wtD@HvdQ;Zz>v z5kh?}fZV7XqfafVCJR@sy{?Qv7H1oxiwR(-(U8WW78H4ItQoO}r*iPa0r385ec^?o zC07^Ez{Ess=@1?Ul$dNe#f>RLR%J$X@2u73ueQnv1^mk*0$|v6ZJc9~UL@{pU#?Ps!fy2~_Uu%!a(Wd?dd&L*Z z045K(V~u|hl6Y=F73G&G`pwK(_vviMkr{Xhm7)))WB13SoRqgm8;|#5=&J$1?WyttB#ym{f&X zsk4Z{BP5bUI2Q#$h6y8{+G3g(4~TJ%K2c!mI*A=ZFW+F=o(wYhjl>0PrbM`q#VZDd z3%nQ$Z+pnFH#)cMtk?dqfY1C12WMI239TjWFkRkryZow~_RZ-UYbVQA{v6@(kXr%A zaYfT?pP`UO;6LToI=}_zd3H8GEqqi<36$|HJ7>8?>v}{gvYC-38~fW3I~KocF{|`1 zL==C|n!-vx_VnC)%2+tPUp@4P_z(fm5`+7|?TCuEiWLt?*)(Bip z&#kG73g0X;nbU8!^SrNDVUBH$PR*4>F@bEwP+mKyKK(^y9JS`l4`1!;T5BW%gIY5i z%aahj>{)Cs8iiz&7XL_LDvY%mGNIuZ>Oi(sc4hoAKTJ6O#TCZ`2Xan0gkYmNM5Arz1TCk-PT@z8l=61oH2RQ{@{*3?|DLE_m26q&RB z8V&|z(AiMoMWCdayd6P(0A$IdF$1Q8~Lk3OYV~9N?^2ea!7+n*V>S! z15Fg3Z6@20Kut$2Pc_R)%5pIS9eg;m)b@a&Z`Ad_g!ezG+$_0u4+ zVxnqDvvN3q-)VXoT8QTVS0%CO`<)HVzkva{i_H*eshK*OnEwsup9S?k0_HHENZwHl zW>-T!At2yAEwjcck)mrZq@>7|98kR&#BS_j_RUTglhd$6@~L>5sTp(~P0N^=7N&?! z#hH}XUq01VR~oB<8)Q>o{gMQ1&-`e$#=legIkj!$c>UC=+HATNL%_5b)|=$3ndI7O z2MO>D>F6e7(;ZUWII;(zC7}(zV_L~{Xzz%C$M~wT^0cwY(kHq}?1dei@u;roYV{5B zHhA*%UF3aUQMz&W&PjDZ>!CJ9)~apgn$#xmmDCiff!Rh#8)V8bp}el3+)LvpANASB zs_ksiHaeRpX@gVk0dQt5RNdNlm-QZ3)JvfeFi%c)52BiVvduc1&##iyC`GwiBY7w3JCu56xF$AF2DR4?gR909~A zneSxeiV3_cuUle`4>H({uvnlNtk(@2HeJCiXDbY4*VLieVjFh7R{sr=E~!Sgw^U1N zYc(wZ-eiy!;z|=bQFqhk-7>I4DdtdH33Lxr1;__l)ni~EEvYsrn%1o1XsLG%ukkKh zjtz8sFZyQ;VXrjpmS(fzU?`1GwO(o=4hj}+_|fXyZwtcciS1=-vm1*|p~LA5r{0YZ zfG_DFINIKtv|D88=`2_Z4#{Ko5cX55;l(p#CSiGxg}lNvvE)aQj6|fE*e-IRl&yxm ze%G?S%BFzmVnZ(6l)h^6>js7l>(i4)eZ|`KxI@ERhSC%mip*07sE~Zia@bPP88tV@ znVK%WJ6Ura1+QvOl=u8^meG>!7vh-wY-N(;GhD`@m(R*MI z&y=#HET{yCA*aAe13XZ(jg~Evr>b#N?MtAW3PvDV-y?<$`%0TbZr*O!2k0 zv7=vtgt@`gjF0@H@$>}wNMdb1Z=KZ12UlYnxZTSU&I%sXcImCjBc=HWSt^oeTp1x z+q%LMnqd--+S^Coy#%I-tWCxou6dj(5@Y=v) zz~U&xOQa2j3{ALf%^+Ves9cvOh&As2ctNh zx_RRUTX&H0!t`y=m=0!!cDFdk+J@I_Kh33ZhN6gWp3d1}brm!={fgEczg|23XbT3L z=Z{O~df7&?GJIqv$H35`(Qf}|&bWCacDl=yZn9h0tZbp^Vch50)Dg9@;$-tH+Hc+r zCm;Zz#Ydtmc}dmu1VUj!#y!AEfPu84lFmDtDmFu3Hj&xzS!jZb98HlZkKBSqZmpZ% zvBfg%v{~1jc%2?|!fcqvwn4L$dZB@XVdkPe4BCHk{IP@m^7NNlk+@ve3VTJS6Q09#n(6nzrbPCn&P10hzze1h&r^4aCjCDg^fn@U`(0=GW!H zO0HsP40BTw(uxz``*U3&@#BM?_w`_hAw6fAWq6P7gDPfvjS{sZ&@oqs>y9C-y|P7q$WJ$c*S) z5Q1mio`Hw>SzYL`y4GR-v7MR*Zy^il-)JQkI%Rt7`VzolUo`YsR2gmT%_bZ)eKYQ9 zSHQJY%eDX%H*wmQ9?SO(h9Ha*VOPtx3X?^n!!}k$MQDN?B~}DPu=BLzv)1xw=+G$5 z=wlc+OqI%6Eu;A&^*xzJCcClSlA0Ie)-yFP0+KHa)$JHZ@g7=Tj7Nz!np3A{-Q++E zx@b=;WYM}q5R7cYI}>9nnCNBDlXF!OO#E$h7G{VfBe)HdKXG_$DCQN3XMeAJL8O}k zOsIlk26lJKWX4!DV;(ns)2bcTJ`P4xH6~;e87yuVrDq6qkWOvTW-8m8WhGPc11a0q z%+d^8p$10kwpL~MsX?Jo`lj;r)y7}luK$*ZxqYokEyU~hC-Jp81zB=i=9E#EH5i8 zFSqHl`PybYU?mqNMi_B?MpK2B>8(vUV~b!nacsub;b~UY!sOB#FJ|nb z<18||b3^U@j2$?>hgFgglLgHe;vU!+8@m7fNB16m@I6s5vnlIR88B-fsAQuVU#)$z zHqyKtQ07)!r}37|$7VzeGlCY{e6)fCiuut<=gI-p>Q6D9stK?y-iN@L`LLwagWzMJ z@=VNU-Xr%D78{lUM1lKaB9L7=3vVNRn~Lv!u+ae@lZqE6@zZ{VURuxOnTD@&MxbET z&8+b0d@& ztYVkshQneSWv%lul!$??qvBkYn$vTpMcbJc#H~2Z@E)dK14Bj_hghVr+Vz}i1XY2n?`cEDV&YL zo5pjI2eZALk^(qb70?!48}U_^1T{pz(Rf9)45a!7vkLCkZiM7Ik7uZ)(&?pJeyt zVZw6J$aYJ{Z?2W5T*0U}R@sXzXr3d=JkoSw)1LSddohprP&-1HSC_oA9e4=fkQTb6 z>Q&wv_P$M`#YK5;CR+&)QK}gmD+RU28kj|&nI4%F9riRfpYF_LzZM&bi6;d6<6-qg zkFK^!1@-`n+|xX`2wh)UPe?en<5o5GxEz<1GsD?DhZxV5hm;Y_iVH{Bel}>7B2biq zb|4bgx#v@^G6bVo<&l}%cRhMcmIdDyr~F_WF_Rh^4IdY=IB_u=j8y5<8*FnEYC5a% z7Y2dYS5$P{38g@-KGq@bg+1~%k9;cLL(&I>lM9EDr(OH81qFF(bBsku;ysjjjywm4 z>dR((g-Fy8&634rDu7N=sAezA?V)Fm|LkWFI)+|Ine*5aC+_Rk&DkAnjy0?adOn2f zPW*eMjfk(UVgX;q$nFeDbP_OK$rupQiV>@4+fs$X!WPD!9W?QLM(;=mi^0Imq3Rz# zWa-El^V2-`wsF^I(WD_bCk7f=ryrZ8KutG(YpsPMLN*&TzHG{50K!e{;Wj?LGqszB z_fJuYxNXqRnj}AJ5Qj%#q!mN4@~b?A=HT-fpXZz)0`?W0USR7k6k< zE?U;uE^Ci-Azz(BBQZpVygwgIPY4WyuQs2_OguC^*lHw`MSiyqAlML|!92hSVG7>T zC4^R(VRuN$q+??JH8+Z@W49Cz2LF1-qfHf1hKT$l+;op^i zUoMV=v9a&ZD7$xoWxTc}liF34k7Lwk&PCwt83afc!f6FH=C?eBP`jV%@HDbz4nQeuuq{wj@#WfjGmNKlY)A4G}QKm{W z#){^GLYZ5Q)z6yityPbjG>h-e76wROsg!(zLDpY**=$@gL^qO_&ZDpuc}}@gAXgn7 z*4I{K*-LcujIa!`M02lNBDYCg=1iE*)INT$$-Wk{<-&?+Pf9fi1Rb7%_104iw`MV> z>5-wky1-5dpA=Sb%Ep9MRFn^66vJ6+j~l90vv%XjN43(6I#eCW+YNlxDJoej%QIX$^9<#1- zF{@ix7_kA;8)AVQ%hMmBAWh$-65$dyy{LxG#0TdXOV1bi)WXbl;W?JlpcQAOER7gf zb*8=C;_{p_pa*C_JFQ1pHnbj=Rg!TbxzuXm8tZ1hp!~S9@fGc+Bul6_i7X4LG24^( zPuITx1fPI<9^^9oAbWbC0`oxqPRlbQ_Fy5QMUVkN-A7BiHhRX4e34U~5?kgq7>~j- zi}@R+6tmR~QO&Z%%Fyl=xTm%z8HX*G#=}$#mT8mFQ)$n{kaD>`R4S||6?>2^ITWTv zl0vkl*FmFUrCDjooR1eT1dCf|66V_mP3pG z#JNrEZ4ST?f&BVn=rMEs(_h{mWfFYw=kNEuIuj?sZ=Crmj@HOU{m(QipOG`Od;^b6 zvjw2|c|eb_oTRwhFg|@+Useey$;_AXGUav$Mzg>a+WMF)IMWhiP4QU%v@7kXX4)Xk zDTO5`sH1A)Y`deb8lIC=zf8@s2S$}O>X$i0hp?<;0Kw5h2yk$UZc9UB!$x@^wr@cp zwr!qNO6@z0p-f_;7b$;WNle04>?a!mjzvWoeG~Dt0d4FGI>pUdiWa^bb}Y>W6;5U9 z`E(29Yb!AqHwNoS123Az{%Qy*PsaR2BBuTsz1h`TpMGK21FISn>&>a|ZDiJdmzrJv z%=9Y}kCO18ynbT>6T54rn|*W03F7l^O$cfJtq~ac?Z3R#_v+fi^@fQ=tzWS~Jsm>P zG(Tm!H71LQVPcOWO~9u8mb_1|$@_+>o@OAF>Tgn=s%YX>nn0N?HssVub63@l$)7}q zBG?&7%HKjzMi4>tY?TFI;rVpia+bv3aXIlFEQ%qDz#=QA;s|n`Nd55hD`+osoz|Rr zT(c$+HGnP3O-dZBF?jPzozUYLHf}?tbX|_Uis8UbJ14h3X(p77)8eCwoz_c1Z7fN; ziFG2SJs*JP%&#|Q9y$Tia&zbei!56B!!f>xl=-?y@AHXoM2V9$+;znR{KzsMLFw%Wimx)xZ+661Lw9A?~*S7pU|j?QHSeqRn|FXD$EQ zW0~3CFh9ud@EyA`u>>Gn!Ubu1j8QiPhZb7LDdGj1vwBMOd)YFH#)9(6*y`Kd7$5)C z>i_lqq;KSZ9QvrT*8fqlUik0$_`Cb}^N$Yp_g(n%#L8`W_z`vr{<1fDES8x~v$r%E zuRNvE11*6Roc~nJ>=pd)k@WAdcpU7GH$mE4N7XY?zB7Fh`>OM6u{c^F zV+X~kQt#M_Q+QYrc+r;0MXu3F&&y1Egj;5W_B=#}Nc3^U2E_&$@5m6xkbqIK}G5G^YT8B>+Zy@%JBXteWXom|pQ7(bY{d zbR*z)pmjDDEa)+CN$MYm+d}BCtY&T8PTGv&4PigT41&hb>+R=__8IQ*JY}7u=TdGn%X`MB%NMM7k|(>WZIu9^V>N*T?Rp zLY;}m2TD`z8|eG?uTH$GTN>Mk@(anSN4UlEvcrGQGG*hjWJw#7c7turdSk=ul$*^A z4L6d*{Q@ijSOWt)vif(E7BMF>KVg#49T68V3xxmlTI*U{iKei&*r`XgI~A zoa?N;DQ{-CMLVacYJ0jE(k-zXBD#5xZnu7md)4}>$KRVJ!64&o5GavpPHi5hanucS zSwxo&EkqG_q$JbHwCP*;CcI0RY+;g5f4Q)CpzqFK+5>rXKV5Mx_y=|hbATboH@?4Rso^&`{v9Ew0;J)?5i(8K{I^>uV^Qg%1NswQk1Ab%xNl?891wI`{|$a!o~5b=8lcF1vgzJ7<$+6mxCPal;Xtyn&1sutBw;pK z;qrQI{)sSsY403EbuYBrhYHgqt2j&TbULTF=JBm3IWCt~Dq0npGE$V$fuez4jvs4P z&Dq$58){9=#js3$aRd*Yvqj-PqBFdhWWY&D!9lwpmQbO6*f+_cVnko>tox z+TyCGjuae{S|i|t5WbQnainzLndw~6yVe*omVyqswuzyS_(d~phzob*wUj$s8*6i- zuQ>SAFW=ie(D&i59=w{3gLR+zU;BV?#PoRf0o0X z><299LOzpY2z}SAOoTVMQdpO>i+QDuRnYx{ix;mv!>!F~nv)QRUtyA3f4gP}4G%Ib zKWEhRE?LI<{M6-0CX6)PQEBvs<@58>(_WR&+FU|w*hTb`(lEpl?1QNIV67x$`Y;$E3;lo9 z$N%2H9tC<7=ux0YfgS~ZuPE@JeZOCTdH>6|w*cl{I(z-x)tPfwu3kKUp}z;1*8|M! z0p{U*vT(f+O56j?3ze&SfO(c9>K@b{U|tU}PjSbqUUeolrQ&0b*c8OTNtA>L+a6#Z zk+dQD;18%!9!lOdDSC3fP|3Gfd&2$Ga_j*MEA?pXeBvgte-;fk<&j(u?c=Rn^>7{#7gK5jQWM6bz^t3x9I*oUX3Jd) zV^uKW8G!^?{BX#Pw-DG6=Eag76XFeWQ;92CcF09uCeXnkqEa8b;W}wnd4Babc6s380qK(aQ2*@-|hd`_dy)-=qPOn_K zhfx{`FpiloaKnt3XLF3emCpd*Aqzb)xh2Ki6igVDhLLJh)~7S-Ywd}UA05RJYQMYKlcE>^)rx z#Ct>`E0Ta>hbuyt`p^Wg0%e^G=v9=PfqoLXqKD`d(#>2PWD%>1^z9aTnV2(PRM@w~ zh|(%dIOc_G$f?QqFh~jSHaEu7g+kX!bHZHUDIJb;o(1w*v#s)%&nR+hu<;0-FhL}H z^oHzq<==HSvRQ3mUgXSZQmf#d^7ZCCAr3Sm1?#3~O^EW{A~{33?*d-poJiq0ytyx( z8Rwkqw%;o-%-4R`T2hHG$*Ao&Mj)8B-bHON+L@OvJ^VjuK976&e?jt^u!wS40-%Tg zhsgWG!T&2Hf8EFb-oG9N{?1Y0zqm9Y-{Ai>u+=wsLB7FD=Pq5maCxBT8|?W8d%nS* zZ;Q^;eJQaEGegfe*z*m_0${eaH!r4zoj|3^*7Mc^HsEHz>B_FX z31a*LR-{dUfU*Cy)-7WUOG8=)GGGB1ScM@M8&?K|T?QvWDap99iv7D+ca3)-U$r&+aBO3%(x zJps&1Zw)x&%|#jTVnN#FR!bNN_FmeUf{=qPy=k~EhO!e3d%}E*pe3<~xs$t`_;2)nRiwnETW5fw`0R%6n&yjMWWrh|F_~&;hpJe2{t$7+F#Y zl&xtHA$nGxE^=B3_-zeGgpjh`^V!Z?#FL*|xw@?_Qo{p6l_=-n$ABRlp+ObNMnt{} zC*hnEPABq>@WC;c1_;yoYn{{q!BJpYW-#2J{$gX#VBhTKmrH%GUTov8vzKQsUcP$e zveoPmo|zVhnUxodI<}$I!B%WExWt^nd49^^#{z#DOj<(~(?iLYx%84QuCg(j-}>%( z4Yj=o=vBu~&svhFtk^AkNAQ7#LDD$MOXNttUKb*TEK1qhRJ%BgZ4e1rgkld3K`f;} z?!EGuEmGzRj-l=gI7+xN(J-G;LKuh|Ym+Uc^$^F$TJ_2Cv!uj*K4^y~88*hPC zvfML0kThWu_&9S`pBwWIr~rz0EXEQjn^HQWLP38<*D!PE<&DF`MG=-ZF2s3u|6u0u zNI5fcVdh!FFw7in)HMTL0d-e!uTo`6$Y!yH?v0ga@@sG#1-Kcw0&ag>e!69Fu3W!# zZsr=OfLAU(_Bt3)FnW#+CCiZGG8R?aQ%J0oaS_L@ngH`0oD_)`@X2g2;YdMn?9?frdGp+;;decOa*)kKL57^i6@+ za)Kniogt+iFv5=|>htX|VIbr#-3DL5cp1%!dht?sp+1RR(pfPJYVR>;*1f7*4m&e; z7YUJj6b}auE>`H_g*H!kXz_1#=v@Q`4ZxQnj$G0 z8Q^FJ9OqNW8#)(xS0_!;kBdhJ<#%aP^Jd>KH>nu0W!_xWyt#Vi+LddUZlNl*HW@3{ zsYT(^-ZG$Bq_S2E`W^vjeLIm`KH!Uhiel5`=2r7SESzU^1$4daSu@Wz45WZm8q$M5GnXv)Jwv=Tck%V#Xlsb(`}EA)J-kcFMSD-dZ-k5rXqXnm^E1NC(Sv~r}3 z_T4G|ED@!fYxFnrme~sG)>Tt)U3UvJ{@Qea4Mz7Ln>pS602sy$pn%zC?x)4w1l3!yyq^D zKHL=NSvnon1Vd@2V1kp%+DoO4ar7YtC1yeN+~r}@v#r>tEG%xw5Ci4RjFwclOnp8j zqiDOEZoDu7bv83h)dy7ZYY7P=THWqs`Bd_o-caeLuv_rW9+eBzi-Qpk0~%G{v)w|@ ztcBSuXQOfVN0+H9i&mHq^(Ne0KxHAvs1L?284}oDg_qDP*@%R^p88q87mC1|=j4%c z-n?>xg-v9pu#hlEO_ufgsuh?_*-a*e5c!Z!P?3jbyJyDtwHW@C(`0q2b}ZwX?y+OuD#M^fKx48G2X;dzo|#uU|k@=aH2<_uRTX~7gxUUv~_tV^0kSSGESLU3+7_X+0u9&yx>Ct zC;$Qk62(SK+h<=8T~8_+7K3`+nX=U@v`YTAwT_4lg@Y=`JM|Rtay6XyDE7p=ET@Q9 zDJ2N)vzGg?H5`zF3za_p8NgQ_KJ_qrd#LA$<1sYJn(q&#W;VMrD^Sk&>XybJdTD5& zNaG?h?_LyvybR!WPh!sdno8Qtk854YxtH+@Q#bTKHmLBEL}!8p}oD3M2= z7^7_4_*(T@BV0PEa{FKNYsc+x7A0e@&_FL*;Vj}*tfzbJP~KAPsWOG?ReVy0Gl1Kk z3B(@Lpay<=T;cf|)~K=F->JBp7=eP$)F9Vg#~)k&USDA_4V3uGNSCgwvf^&;@TAJ1 z$I}pUMT`~g^>S=F>qX68Q;;nqhhhq{e1&aA3l;vgm7O34_);^{yb34To~W@Go};X*-dM;gXKO&^uBnW(Hhk|iaxh69TS z#o)y5n%^)Q7reG=VwW{WZf67nwh<+}xD`i7R?`qNhgybPNR^Vv3Y5lzty}0c`&+Eq zN=t~I^K}EMPWP;!r-hoOMDiMxDnhCY5xtZlHR^a-)>t`uYjsrxDquOwO=fy41eCRn zb)tY+PE2uTna(im^EIA&9i2EsacVZ2!OA1;Dg| zRZ-R2JqN=34aq6Aos-w8_3QRBVbKWm+5<_x6&{knFvJl)dD$RPOey>A!c@bXNZ!if;RbA|-Jy_E2;& zjWo;)YKDwpe(0g-_E2=);MYUZ?V;$hle|ZwL=Q#RP%)J@wuVI!J46mVwTGfh?w^cT zvM~JiQFN96KhXD4-$-ZZxQ(2)h!lR{_L*5<)lfgqS9YV&E9rP?uC{LWhl9%vOG-f_)mBsX3DfBCwZ81Gszqd24dE2P{Fh8DI0-k`ca$G3>A#! zS)nAlJ4QGRronh+?hAX;GvIH((AmWe3S?vQZeb6H zKJtz%w^o;?dAymtvewMhZYfP%z}0E4cvERxFG*q{wW_^VCkLDt%0B8LuI>n-WziAh zmL@aVY^;$Y1&(cSEO;W@4oOitn(NY(vik7VIjdXJsWv`8{^^&qd*L7lDCofutOJGI zgCWr5__bgN{$x+3&rt{@gkpYs4{IQEQDJOO5du7<@H5NLIeyObbA+Fx{M_c}kNMI4_xL%+&t87^;iA5LKPjBk=l2WAl?y{0yeK5sE>t;K z*W;h+*N6JW|9YWPEEJMLrBEo2`Z>;y7pjFq<#MHv6m_nqU*9bZb8d2`KdExZ!23o0 zNd}Vgf`G^L^yOk{z1423<=-k6I_g&`DJ|C5I{lSNnpZ3=s<}ssMWXEsNm5RdN|JDp zl$JrR8Rfh06bs7F9&P00AC~*gHC!K$$`@DHIo4%lhs@vAim)g^n*5%jw;-Nr`xw&QT~=?*De7(9i`Z zl74Jh*e>+pYErgvB^|$2C<&-ehu=(+*7{NUGf zzP`B7vdhPkk>-*WENf8dX2aSsT^wk4T4aH(==Rfvevez>Ly?xZb@ED~yj*|Uur9ov z6p4q_+4F_sN_|a7XNo1^1Bpo0QC?a}$}LJnS;N0wC@E&_Xq84z98Zb_U>#*ZcTF50 zEEN08WedjAL;90s-I{Q*khE5hR?6c0!L_IB9-^a54wsC`JZb-~Qc3l*boO9US;j!~ zytTY2N*o(X3Y$7$PC(UVYsGN6h^gvmQY!R&DDly8IIwiBP%I^73l=yk)*Ib@DjBdy z>y33i`etE3+r4FmX72#3JyB?aT2KT3+B znP&^7mxRgcvA2?PvjZfej^8N_jqa~bR)>d2DkH-~)ymlD?$MFTaJ4!rt>eG9Lfkmus%dIti`bJXPSXr?z z#tQ=>a#dd(fkzj}`_}OQJgOHn4ttIl`){F5Rj0m_6s!$b3Z<3$ z3+w2+5_`EHgI+FMVWEvv&V(=4~-qx4RD(imNSq z54nwdb z$PJNiX;oM6ODX{Ytf`MxM9%_XSURpH<@F}w_Ha@zlp659P9BGMc)PXeK(TCL*M~>p zO9s4@Bpv%=OcHjvq3cg4{T{QY4+q7&IyhV?Tcp2^D<=Iu)8TMZ?oit8nU2pEiZ2@W z$}-|p(?@4VO?>L;EuLjG7%B7veTcZ!+4lk$9!}Sek_^@Qsz1#=y(L5xAX~FDSNjLPZf#; zaUO<;k{P&Ar}naVi3@eSt1u8k)(?*|tM@RK3jH3ssjsKYMdB89^loW*Sb}ZW_|VvJ zb!Zr|HZnLoG+Z674vvfuRfb2$t79V-IIA)|Ir8P*|2T5hVYuoLQtl8Bc_&Gli#j;% z;!cN`lftV04x=R;k~T5)9z##A=w~`xmEh|vJlF9b6)H$MgGSTGaaIvlSRKA!D6?ey z9Vei$xK`)S6^d*s4r!JhNs7c%>u_pcq4d1oetu{aDInQVs5BR~R6lF#p7)Z%GhH@z zQ4Ql@;%Kp?L=}BmE0tS>%C76UR6-^w=>O0-6L#dJIJ*eIo9-EWyO?xZx@u2hAY^+S z%D6&{>LF&sTVmTH$sD@!yEI(TwmQDXGHR_DxD*)X&?IcWYq+NQ6xl{s?qjuR>tH`` ze11rx`KSo9ZbaRUI5Ss^t~gs{dZDuE_&Re365Cl@vam-n~0;kv9J^AET@5Ej#^wQbcI!WmP*oSbvPZE;~)#x zKy@!NW<|l|`ic+j=USQcVNYQ&8qu2vt8iQYX{~emiampM@<<`sXzK(Wh%UH;<4m@S zR)f+YD-fb&WEAPavV;(+4v!61#wUg=BSWJjEK`-iFYo_Vlpk7^jxyE81`)p-FaXEVb4TNPl5lB44V$8BZo+B9Df;p%K*i zvzk4h+dGaG24lid^FWmjXfq8T6Y1Ct`aeswFTPY1YSu=2huP-@cty(}8bjROqn zMX?scs|RS!_V!;!_t%*-g|eBjIYy`GZ?3EWaI7zC47dIsFH~5V8|w>oYyW5%eO=!l zNB%$@`C{^!HFU3Q@CURloZ#iwuSQI6$o~pK|#SiE_c@gIe*HR-byi zWlh=*XP5%6Z!+y$pWZXUaDZJ!GE(X9ua=Ugb(~SKUL8eD=sG3`I<}6gg~|q)=gRBQ z$17ndQ5j!8x3Qc`MxsMEZS;9*JR_CCv7!A4iHXtS5hf1W_}K8o;PBwyk+JH?$SB-Z zsg6~u?8|S?)RZ1}oB1u^joN!P;;lovQC4>$vsBIIa~+VF4s)?Y+30qSxKwwOJETT{ z2%QR`9?EdQKrCS7W&Sog3o|Dj(s_P{G{Si>Drd+fw7*xrn2#WfTuM5ES3SvaK^|KD z-RYaA64gEqs-PP4p>jGD2oRS>WuMhlrdLjHwL#ugOAh372fx=d1ECE;7HMtZ03B~` z_*e_OwQ5Nqh=@fM0;XN|96_x_Wal=;fDI;6?s`l3Gc%rLHd)vLtEy)kS}a5sx%Mk<&D!Hs+hwE3DN+3KQ0lGzS=_ zS6B-ZJ~sVcZc{I}i3&o!+$K^N6$;nOZCZ5|DndW>3Txd^aw^3@Z0V36^ayVp067ITqr$u=3#vLO}8VHVy-d#_&K@B#NM!3LP3n$A!gu?6&XwOXi3nfln?e9 zwM^-_>ZA6BvS#YNRtD|&2Pv$V+vL%-j8ZSRN&AFeZqxIcLaJ?|+b%8LYua265NctA zr#)vt_z8QwC!~Ia?Dwr07nDSJ!FF6?%Yb|&rDAq}Jpcw69}4^jGmdWy9RbC6YK{uP z{fo_|reG;)n~76Hn2@NMx_RTqNlUX}|KAsOqXD|hYJPZShYofJOah>X{PZ~QS$i%S zI4AuT$Q~*@ z^D(>B%RmD()<4rm!O>pU%)-Cv8|)D8ft+6LOiQ+kKI}_tUDgQBJt5S_;EY1}zFKSh zec^(187E-k)Re_rxfdHmuviGgW^ui~G|m2ZdJ!ZHeT~e1*>2EwTq01$1~()Y?yT)^%#T{@2!VzO37nF6Xk{tIcllx?e8$Q>FXi(w9Eee z{HOf?WZ-7s=s3T6|9TYYQJ_bG9tC<7=uzN}De&Kavs$63>Z^acXKPi}Yu7Jbn7MN0 z^0_OQtG%kKy{f9cSV=|U_hKcz3`8$hvR73#BBWzIR{+W1YOEv+-go|+n}fENefjp* zwd~6Ei?)|E<3c`6&MtH;(>)#k1#L zkbIetF?59-vgA7XQE%~gFey?%nWF-UA=k)(NiON@Z;)?4KvI3BLYjUuMh1H_PNI8K z(U(J{?npV=y zrL1WqB;O}1WN$3$+-@>IXo@;AVqGG?-(OWzizkOj<|rgbM)YCN;GiykixmE3w=RB5 z-|ZRJ@6kb>ZIBg3qSPAsVFCtNYmz&fkPo;vMyrZy%|wNZ4>n3g5~?@}x%hQhkA0hD zt%c_e+^gitCeNznr1{x?l5GZ{v%Vh#n}B>(QLb3*C&>@*o!&z}RC_Ofht=}K1^}Q2 zRo~G~gLYWeq5Ud@GyrM=k1ZCGe)W2n+I>t%j0YVCLm?R&`k=C}e$sLH^PJdq>}VwGhJ;g!=E&Y zQ~kTFBPAslb~J#yi^aym3!N;g1A9EfON~A~1XUQY^4sdqlwMKmFOohYPPsq9ef3p6 zfn0HtboA0Apit-`HUmg!EF>Q>qt;1XPsRn3!8GI7fnrIeSHyx9-LSAHiuTBwv&PIB2)k(9v?T(Sa;*XlZq!sf6BSv{b|k ztZtP`MRH!b4z!LPevvYp{96Obh9EwYxAkjGjU1P}d7ornjTgVBMZDq({oXf09)2>o z|A)h+(kih%nr$PXGqjdT6Ha#RAps5nqnidq44VOD*b}2FRvGF~jHQ!lB@eE*^|D<9 zg^vE(2#^c6-cYxSB*~Etp$D0?8`0C~B8aC8Iy^QoSznH!tI;0`Vh4h#Sl(Cw_Hz$c z9ZC8(fHN@Mjl{&xgir%oE22`V0L)0IE{5zsSTi9c2{WVt9}utZRkKc($@C;5LoN9h zsnPJE#%)MKVX;_#R^M3esKEmysjcd+aou0i;{=03NBC7Cg)Sk{j$i#u7M<64{5F0e zSD3|#a8~T^YoE&SB(^SuH|w*_?p#YM8UaSd&SX4VDw*gt0^$UW#MBi@M?@qe z{J=orbBVF>Vp)+CO--aRvO?j(NdOIAuC^Hp;69RZC06Q5L*n>h{W_%A4d_=@&$EZx z$~ZV~B3s|olOn0PI-1nz*m7zY4kl$IfM)tDP(sLgTj=O9~aPBB3LC;^kto(_B|ec$mfQi+aG`d|n4sM07J|Jg95;i>9Q>G7~&kTrI2? z;k1p8#Dv6Mm}p1TP)$?X((kpjMecHGz;cC`o04=a-z?Eu3clT+EOa!LiwA8{EL5Hm z>-UtzYBB6vN!bz^b$q~@S}eTOb)Iyp1|2IgHwFeq^jI4~BdHyc3S3A|Y3Y!Vd|$(I za6;!yN(`FjP!`cfOTN66Pb8qf=;9kgr;M6q@|IUb3wz*!G91h@G%8N!?`}=LnX*xM&|)G}AO6CCMc>7#J=<93Z+ItJ1p4uyl)DWsM-h zdBaxc{p!?vYV!d#>}}Ef6=UHk%$g{BHHd@#Nn>67_}&mtdNl}E!Smf5^@DWPdI^G# z)R^X?9(GMK<)V(R7t2Wd<}*Fzu==;ZQfTT!O--+m$F7q$6cb5lX|=U3J{U?ELA5;@ zvO!YYOjE0hdw}0ql^`;Lo2qR+uqkWfWn8sKukROo4DQqY%wVOd=(L@>v@m&+^W_pqF&m;qsW|ei)dpmzzP>4LN6s*EMHW42&_!Db_e$cHHIOWJ<^B=i zst|;Ptcm`@z~BauBt*Fb;yYuE-4dcm5iP=C8412yEgKbr$&zVlyF`fH=oP3&Qb!K- zmy|@VtKR7^tZLB9r9w**$(~q|jGq+E9)e~-0~VzY?J5;v22t%qzc1@1fQ2WeCyhyP znr_EtVAaG5kUi?qsL5cR*;`B+DQ;)8E#erVWh` zLiQ&|U_GNJB7b>h5)E1tec(`O*jLJz7PTsZ3+Af6sAo(Si=+T+N}CE~eK8g>nLjRh zxvN+#EFE^C*uQJM9|dAT+__uqa)Qnz?~BGK5X*Yvky2q@OU1arjhd@^-K6McY>B?{ z5@fK}OAX!8V)CM)(HJoBBZ=7KY>4`KXBof}xO_mr2S@b|+h0v;4wkDX@od0Mf{q;! z^#;pE(;>-muJ0e{A7_EvRT?UnpvwyhiLr6k66)azAtreX6;6DJu;r`%NfC2g!?wSq zRQi$c43CVFa)0RUkA??#?H-#L8X5Tq`^R=ytE0!?o7^>WV`QkhYyZ&L(V=Q}ayPgz zM}QluzI|nAXirtJF?)s%0`u|S@c8hFS4Z}Z?HfNlyuY$*?DBz;;n7LNYmEy>Myq3E z6P2ZRs*@Ar)ju7XsGYccoGkvqk;B77Z%vF<2X{@3j0_#UT&oW4KC*lF@DNyAm3_n2 zk;w}9A%9dI9Xd2Px~uxm=>AG&52yei0!_l+eW34u?HlDFe;xYl0<& zO|CR=yJl!wJ9KSDm||3(?5L7xU65;aVJHx?6EFg)K4A3{mX{lgG&)z5!16BC#iv4N zi=@#BUasvwkZg_GROh*tS#?+VJNC8gF0@scV)~rY#-o=FSBR6~dRd<-dm7NyHcwi@ zhqqZUhqZt{1`LCtyjdAyJ_0r%H~W)cjr6_RwVl7t&0M&8WvbN{gf?;JsA_oj%;qmuoFA-4J1`$)y%_bzo z7!gRto<#y9H~HiAd_hk!9}z0Chwwn4Nnj`ng3E8G5-H4KJvPUCYs%}eqQm+kS7F5q zrO%t-%O3Q+#`cK!GGz_(P)*Q{)^-O29D!JU+yUn#5hU4j*A2cL%!4A45F4bB)vH!RVI<0EW!Xw zS?lR$D1|%^!C{YvDh&tGK9`De=Z2VvcqTKu8*9!xrq+z(Y=vu=F-cMunPIKh=D~?& zTsG%@O$~*5z{xS-qB>Q9xH!MU8S`ZgsdY73Gb^HrF?^xeO-<~gVKYD_CX(R7v@WM? zRCjDOmm^&jG)$;;4|Lk~X-^f@EY={0w;>^F2N>OjUp?+y**?1GXU<)^cJcE0R6^W< zdu0z+iu)}=QPpk+xX8`geVbVMfsJrI0z=AEK{tZnv#FU!oov@r*y~zKmJJ1|J+4SZ zd@W?VX*0UYEQgxM=mvh(y5V0LwO7zz!km_BLObgQT}Y0O%MPO}i9~K5+YEz9^Vlx( zQb+mHB(<6Sc_#{^E%#-Gq-%8{pw&)+iFHaa01hazkiIuGBS(OM>@*)Go(-ivU)WO& zbsh*zr_xc(T@<-HJ*Cl~LuZD@4 zC`*U|EM-L+JfSM1>dXx-rJjDJ>lCvvmlp4ySqp3O`ieM!T$$Iuerk1XW_7W?zFyyC z39&-;QQSZktO-%5uQeB5n6jeu+qpT)p0WAwH0I{4(cGza8>P4dfnbncq?uvT4K>G= zrSiPBh%(V>&Hb2-^%)6eJ3>j!D=g~`RFnllfvNEpkiiOrd}-89J#W1{C2kEIa~h42 zA=%PH1O{C~brhXzM(0yrqw5rpW5Ho|WGu(>^jXUnsO|OIOtr{I|M-WDm_p;EC z5RWE@om07kKpnC8v^4H1yhl0X2+bzBNHju)UwJO`X;YlA zEFu(5p`z1nCLeYvYvVKbLv4ZyD%4J?nu}dP9nnsPPSD{h+wM9Yc@WZHSS)Vf=1Zn8 z2%B0HNF4{`M;+HtNFUJ7xXHRMjaLKJVisEFu#cM*_%38AsMlFW9^bO7UyI5{F*fEK_9&WN(Tm8}MDI+ns zP_^5X?P+MU?Oz)%RQw+LTcLwg3Oq~=)!Hph<8MH$Oy%vk$ojC-YVF8NaAD8*evh3O zdK}9n6-#iEtg~l`H@N`iJE4@s)0vcdn2Ed`DXeF+GD)j&g_d7>tCc5}k1@UrcZ%$W zY|SMPvBt1uvqOirn6L=BX@o+~_5|(Ik+$r%L8fXV;u_l3sKm1^Pqq13AsJ>(GH(66 zGhb^x{W1I8RJ01}`)>0oc0tBQRF+D4<0A~fwvWx4iB5TcW98vyZ3>$wk`XzZt9Z?~ zYnxZTSU~oqrn{#l6`De|bvJ*Jn<1Uan#T+o( zxD#~&h1)cmrB6?qd%-pXX;B$HHX`sji^t%C&y>4j+1vUfKNpmqMqn1;NvZ8WQtL!an^}gaN1w$j z0;XHZW)@lZ39)S8UzzgD($o2CMUa%bew{vMmpB}lXl=`0qdnJJ2Mo-2jz(_l8aCsp zJl${EynD}#aO!L=b5GT#YmW_yvi8s)Q@eBXdhPthlk%N-6I8_jh2leV;mdkTQ3IKD zMW&tazL2|Hgi1S*J#>5jv+uh4YyfDKunJxL^k+Yldk@XR zR!AnnoSV|Edpk)e?S^eNj}~V(S%S6nXa)Il>b39Xo>zOM-D)70o2?~$YKxoN!{Z0B z8M4}#W(UPWsjU};=Xu)Eh7D!5?guk@0PV?nLDT)OF<}om%PBWgyJ=nn2F2>4NE9O6 z4CT;;e-Al}0EM=IVvpZi)f&iRwxMi=9&(lyXk;0CofHU@khN4^GR^yK_M|xP(cjUW zX<{rSTg{M@&40~qV`XV3AoQjtDYwSiUd6(VG8b-U zobo*Y?l+)xQF^rhx$=dtVJ7r4r9tfQAjJFrdT}waH!J8iVQBi-2Tl>Po8R zEo>Tr40kBg1&KcS>2WPR8rEnBy)O&r2RNJ7a?TGiI8#nRqq_F7;da-iKA8^#5R9j1 z+)_$7!y<-P9??dU%zrxd23K7_cQS|^e@2_2uQ+f1I^?fv1nt+j3G+F3R_5( zlIR}%ids2q9K3~2elo{xb1*tV8nIJzV)n-RnT*k1a{(MiOVDzC-9W0-J-fNqd8ry4 z(Uy-@jcGz^YFH77b~5S+FPQLOTPTPti>1wMCI zKS98qrFmd9RIn!AU&XUV&w3DzNjW4gQJoI?y>{5ka zz9A1XmZ&39)RXGgM22glf?o|+4?S`VuLUW-Y~pld4G%*B#aPYT8&5-cx_g?^R3OXX ziPQ;U^p+x##>Z;0M}^MCIchJaR1@HZuh0fbzAK`v?Nl_3bhLp zYP0PDrr9pZI+0w>w>jQV9;tnjElFU+=(6}Mz+1fzg zjbEI2HTHp`(w?*)Daq$XI%mFupgysXko8vbBUc8WzZ} z@CzAQEgcKWNEwPHc-bE)(St7UK=3S#PGrws$J;~fE|~y|9YVfXcrVkbv-yUk5^>hHVoi)&5O=pF-8b5}4mUqPwV8pF<7mx@4fcACeA;bbuN9!K4 zvt#O?g5hl|y09t2>t1nOa}`3fKuatTZH|pnattA>*#|C5u5mJw(H^Zi;`JTY;2kET z5hsW(XEl2-89s$0T1#3l?u8-?ccM$s8nZL~w(2wPZel4_S7=uttvgl zxWDfkUtW3P%2PhD^3CXV?AThPAym6UYwC-vV7~n8tc<&2_Kf=Jurcep6;KyL za&hcLV<(>|jKFB*$q1j19YT)&^3aRG-;c59(ylk7ZwP=`owNIGF`xs^`I)Ms zX>9qACPJcS#LQ-0$CQgEia@Ndvj-1zJhdD$Ms3g}NLpD$HH|qQ2u$3_iuz`HL9GoI zn!K!5%7^VNcGAfZ*P*reNL{4}rLPvV=Statu))q9M_wX+YYHqauyL49R}C|O?=&Ji zNTNXa*cmd#OUsDygwv10OBLpOXg>Gu$P z;nxfmO7Z~cj`48-yxuL9N0K6M7fjJG=t2ghc(YV!2xSNeBc+=N&Zsgfz?FA}Xi^>6 zg*sz9mtc@k8v(K5@qGPGG3nTgr;=oSWr8zf!fyFNq2HqnMV)@3x(onGB(yM;qxTmEf}26qFz~kVQlYIen=TbP z`g^Y2-&8o%x;{*RIb%>l;A(ZA3s%MunRfR(%2>s4)eN8M2rx(F;;VaCMf(X6a8S5O z{2dY6(FGk{Q-8h##EnOdid;bUxoQLy8R(e+(Q(p1o(w%1$Byh}HXMdyW(}}k zc8Q(aBMybJR+rx5Wn%-dSjUEXHZGq_Z5l*yBpb>Yi1I$DBtt&BI=~LeJ^lA!jXFC zhgA?6@m+{gW5qIhfa7YGG`wZ8$E`}T+|-bPDug#z1f1yCU2%rIpc#u5*q3^ zAhqG5ecDwtG@%j0s@-S5Cx&#H(4+V>I$)5gyX>Cwgxymfvvbgg*BG;%)bJhCuUbHq z8{Dfm?lt_Q%lcxtGJwvbo{9+N3h0~S*!`se{G{Y*7_Qa+(y+pOZG)^n0$%t#_+Kin ztQlk!fLIu+4A)A4lp|oFs?{?#8;wKkm+_B5LmBHB;G8j5_RG*v?U#W`9TXoJO05yV z?tM$tvgaKL=&qG_^tMBW@e1tR(7R&kSA~IofWL?+7hY4jP`2nS-8-d$Ht4BoeSBZP zHcLt4GaVc$7D-tbuGBb?gv<2>9ZnX@piekF7JOsrexm-U(56P{Jz`fkzpE!7OF)BL zdakbqkhsJl=qm%c8xb>CCdK(CVJ3G$vqD*ubJx)TGx)CI?!Eu^#AvxtXo~^+^(q5Z z3m|!Xd?zU>zLLfjKok9}G0Y>1d-b4^(eiLKU27`9>jJAo*=$tx_KDpH2cW$MkoXj4 z(<*WhxnKbhl0C~lgVm}06`l>5?LDL&^NmQ0#1jvxHhI?r^SVh6O z9cm;%-4S@H*MVVI1|iURg$azkLKAK{DZ$Ch;$C3SFkXl{qXQz}x&gPD2silQs#c?6 z30T7%J=tGspx>(PhF}N&q-FU_qL1l$WgR(g;Xt7&U^SptAx1-ta`2FTPgeAsiOBCU zJKpQZHjfY3Z)Pjs?zZ!L?3z7xyw{Gw>EqkIgX)WcJsvNWZI7Up@Tg?W_e(60B2HPv zUR~1UaL`DjV+jmbjH5dKrXFH=tV0s_RUs)uwa;16soDM1(0vCb{|1X?Cb@%<0h8@X z3L1A7TD~3~a^SWS0MneD+&efCw+-n!g%p7vC0WKKb|Id{9;z8v#K7lubhS|EXhQE! z$^-|rY*`u=6q;}f2PW0Xqp%H8Ms*w3-Q}{-MVjii&2!_2J!(Y1?lZCEh;RpsCHV+qy4 z4Z6lbw8e17i`K`{WBTTT1phFCpT*-_6B84I#UcrlVgfLj*Ec%PwK%<%BrjW%2>nTs zJ+$uohJKkkW4~;5H4H|RdM5ueIcY~G810vdQoDFMV2n-`U5wh~4}74Sz01C^>!x(^33X!6JG(~S5rUrtg<)fdUuDDR5fC60TN4wNfFMTZNVfzU zyDdiBW9yn8X8kZ##a2D*B|=Dw62DC28c2#n^6vJ9dzi)0j}8D~>PP!fiv8$tdNi4S zySFq_C<)6**tw%NX-E4R*k*mzl=iA*&Cr;5@Q=Wt-q1k_9MSdWGcn>hwc`p{pcmdy`{BGvM{@s#Hb>k4=w!R2?6x zPF2Sa?H<}YSba4%Iyl;>j=ic3)ds6W!;@pf-#m<@!IAgII5+gp_@T<;#NeK{ zCx_qOKeV?pJT`K8Y`pq%bohRCXz;}Qu} zI`9eySy_Xm3~)@SR*;nB0nq~RCPfLpzV5(IB?q>a3+O5g@U;a13T2_fnAX&d-Tyk& z{tT)=hth9$0ErirQ{+L@HoGC#1Id zl=$Q?r>E%Jr9U5`Q<<^*F{Xr-y85ETQ2)x$Z3{?^NdOD^`xU!oF&awVG$QCZ!l1E@ zD0XL=-ZSU3r43l9Zfb_N;8&U26|Ct-7Ma$!gu~usLycWp#(x}BX(nq|W6S}}&N+Br z?7^qr?D3HTa=>NOQ9HIg&$}{*32830`KQNY@xXvkPMoftxM^{8KR9vH3-s*&%W*Kg^Q@k4!_UI&xDf zmFKxg?ma#eN!qrM)8jw;%O9VBU%vhC{_IAcBF-Cfdpw~(#uE0T_SY~?=KVGonTX+G zm#_x`iy4s>d=Q9|dLCNqiqi)lRC&QE8#u5lQNoSM#|0yNq>ZnozzS8Pf}Z0IvhBPw%|LwR;j zuyM7Wl=01p9p=F8J9lr*DO`B&=B?Xz?%#QG=fVBQZ^pjevm>KGFzL#nvjZ=`;oQ(@ zJNssj+u>>5MC)qzYbVAdrFBVUrh!pB1y3DSE20QH!Pg6oxvP93qRJ)AR$g-fMz&#j zvsZnu@pzB;qOYke(U#KMo*3Do>v0APCxV$Nuj{Ko7Yqy)+TIa3 zy6f?;9orP)B;KW7c1?med(Pv`ONl33QZ$5mvC!-w5Vx>l$|PGz%*S-FIPRhzpJSUj z>~8Yc%h%TlSdF61eMAc`6c?L8*#7E=?;&hw|H%(`5Vq#U|4pTB=Ex@4!!?%QOuS|f z%8~!8#p>&Xrb)v{{1Z9pyMs)eeN0xxZ$&8PI*_CP4sz@brJ@bX8;HffeG!%Q{C6m$ zOoz$8Nzg*s!($V6*8*AwcAJ_|T1rpz~Pk-`BJ}Li^o~8E9&(9ln z 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 a2BwI)a57h@SFivOtdNWPy9@d8;{OF9`i2Ss diff --git a/gui/definitions_editor_dialog.py b/gui/definitions_editor_dialog.py index 26a1403..9cad747 100644 --- a/gui/definitions_editor_dialog.py +++ b/gui/definitions_editor_dialog.py @@ -8,38 +8,16 @@ from PySide6.QtWidgets import ( from PySide6.QtGui import QColor, QPalette, QMouseEvent # Added QMouseEvent from PySide6.QtCore import Qt, QEvent -# Assuming load_asset_definitions, load_file_type_definitions, load_supplier_settings -# are in configuration.py at the root level. -# Adjust the import path if configuration.py is located elsewhere relative to this file. -# For example, if configuration.py is in the parent directory: -# from ..configuration import load_asset_definitions, load_file_type_definitions, load_supplier_settings -# Or if it's in the same directory (less likely for a root config file): -# from .configuration import ... -# Given the project structure, configuration.py is at the root. -import sys -import os -# Add project root to sys.path to allow direct import of configuration -sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) -try: - from configuration import ( - load_asset_definitions, save_asset_definitions, - load_file_type_definitions, save_file_type_definitions, - load_supplier_settings, save_supplier_settings - ) -except ImportError as e: - logging.error(f"Failed to import configuration functions: {e}. Ensure configuration.py is in the project root and accessible.") - # Provide dummy functions if import fails, so the UI can still be tested somewhat - def load_asset_definitions(): return {} - def save_asset_definitions(data): pass - def load_file_type_definitions(): return {} - def save_file_type_definitions(data): pass - def load_supplier_settings(): return {} - # def save_supplier_settings(data): pass +from PySide6.QtGui import QColor, QPalette, QMouseEvent +from PySide6.QtCore import Qt, QEvent + +# Import the Configuration class +from configuration import Configuration, ConfigurationError logger = logging.getLogger(__name__) class DebugListWidget(QListWidget): - def mousePressEvent(self, event: QMouseEvent): # QMouseEvent needs to be imported from PySide6.QtGui + def mousePressEvent(self, event: QMouseEvent): logger.info(f"DebugListWidget.mousePressEvent: pos={event.pos()}") item = self.itemAt(event.pos()) if item: @@ -50,8 +28,9 @@ class DebugListWidget(QListWidget): logger.info("DebugListWidget.mousePressEvent: super call finished.") class DefinitionsEditorDialog(QDialog): - def __init__(self, parent=None): + def __init__(self, config: Configuration, parent=None): super().__init__(parent) + self.config = config # Store the Configuration object self.setWindowTitle("Definitions Editor") self.setGeometry(200, 200, 800, 600) # x, y, width, height diff --git a/gui/delegates.py b/gui/delegates.py index a992280..0f3e081 100644 --- a/gui/delegates.py +++ b/gui/delegates.py @@ -1,7 +1,7 @@ from pathlib import Path from PySide6.QtWidgets import QStyledItemDelegate, QLineEdit, QComboBox from PySide6.QtCore import Qt, QModelIndex -from configuration import Configuration, ConfigurationError, load_base_config # Keep load_base_config for SupplierSearchDelegate +from configuration import Configuration, ConfigurationError # Keep load_base_config for SupplierSearchDelegate from PySide6.QtWidgets import QListWidgetItem import json diff --git a/gui/llm_editor_widget.py b/gui/llm_editor_widget.py index 48377b0..45ce5d2 100644 --- a/gui/llm_editor_widget.py +++ b/gui/llm_editor_widget.py @@ -10,7 +10,7 @@ from PySide6.QtWidgets import ( from PySide6.QtCore import Slot as pyqtSlot, Signal as pyqtSignal # Use PySide6 equivalents # Assuming configuration module exists and has relevant functions later -from configuration import save_llm_config, ConfigurationError +from configuration import ConfigurationError # For now, define path directly for initial structure LLM_CONFIG_PATH = "config/llm_settings.json" @@ -280,20 +280,26 @@ class LLMEditorWidget(QWidget): # 1.d. Save Updated Content try: - save_llm_config(target_file_content) # Save the potentially modified target_file_content + # Ensure the directory exists before saving + import os + os.makedirs(os.path.dirname(LLM_CONFIG_PATH), exist_ok=True) + + with open(LLM_CONFIG_PATH, 'w', encoding='utf-8') as f: + json.dump(target_file_content, f, indent=4) + QMessageBox.information(self, "Save Successful", f"LLM settings saved to:\n{LLM_CONFIG_PATH}") - + # Update original_llm_settings to reflect the newly saved state self.original_llm_settings = copy.deepcopy(target_file_content) - + self.save_button.setEnabled(False) self._unsaved_changes = False self.settings_saved.emit() logger.info("LLM settings saved successfully.") - except ConfigurationError as e: - logger.error(f"Failed to save LLM settings: {e}") - QMessageBox.critical(self, "Save Error", f"Could not save LLM settings.\n\nError: {e}") + except (IOError, OSError) as e: + logger.error(f"Failed to write LLM settings file {LLM_CONFIG_PATH}: {e}") + QMessageBox.critical(self, "Save Error", f"Could not write LLM settings file.\n\nError: {e}") self.save_button.setEnabled(True) # Keep save enabled self._unsaved_changes = True except Exception as e: diff --git a/gui/llm_prediction_handler.py b/gui/llm_prediction_handler.py index f995927..467704e 100644 --- a/gui/llm_prediction_handler.py +++ b/gui/llm_prediction_handler.py @@ -24,6 +24,9 @@ class LLMPredictionHandler(BasePredictionHandler): Handles the interaction with an LLM for predicting asset structures based on a directory's file list. Inherits from BasePredictionHandler. """ + # Define a constant for files not classified by the LLM + FILE_UNCLASSIFIED_BY_LLM = "FILE_UNCLASSIFIED_BY_LLM" + # Signals (prediction_ready, prediction_error, status_update) are inherited # Changed 'config: Configuration' to 'settings: dict' @@ -307,54 +310,67 @@ class LLMPredictionHandler(BasePredictionHandler): valid_file_types = list(self.settings.get('file_type_definitions', {}).keys()) asset_rules_map: Dict[str, AssetRule] = {} # Maps group_name to AssetRule - # --- Process Individual Files and Build Rules --- - for file_data in response_data["individual_file_analysis"]: + # --- Map LLM File Analysis for Quick Lookup --- + llm_file_map: Dict[str, Dict[str, Any]] = {} + for file_data in response_data.get("individual_file_analysis", []): + if isinstance(file_data, dict): + file_path_rel = file_data.get("relative_file_path") + if file_path_rel and isinstance(file_path_rel, str): + llm_file_map[file_path_rel] = file_data + else: + log.warning(f"Skipping LLM file data entry with missing or invalid 'relative_file_path': {file_data}") + else: + log.warning(f"Skipping invalid LLM file data entry (not a dict): {file_data}") + + # --- Process Actual Input Files and Reconcile with LLM Data --- + for file_path_rel in self.file_list: # Check for cancellation within the loop if self._is_cancelled: log.info("LLM prediction cancelled during response parsing (files).") return [] - if not isinstance(file_data, dict): - log.warning(f"Skipping invalid file data entry (not a dict): {file_data}") - continue + file_data = llm_file_map.pop(file_path_rel, None) # Get data if exists, remove from map - file_path_rel = file_data.get("relative_file_path") - file_type = file_data.get("classified_file_type") - group_name = file_data.get("proposed_asset_group_name") # Can be string or null + if file_data: + # --- File found in LLM output - Use LLM Classification --- + file_type = file_data.get("classified_file_type") + group_name = file_data.get("proposed_asset_group_name") # Can be string or null - # --- Validate File Data --- - if not file_path_rel or not isinstance(file_path_rel, str): - log.warning(f"Missing or invalid 'relative_file_path' in file data: {file_data}. Skipping file.") - continue + # Validate file_type against definitions, unless it's FILE_IGNORE + if not file_type or not isinstance(file_type, str): + log.warning(f"Missing or invalid 'classified_file_type' for file '{file_path_rel}' from LLM. Defaulting to {self.FILE_UNCLASSIFIED_BY_LLM}.") + file_type = self.FILE_UNCLASSIFIED_BY_LLM + elif file_type != "FILE_IGNORE" and file_type not in valid_file_types: + log.warning(f"Invalid predicted_file_type '{file_type}' for file '{file_path_rel}' from LLM. Defaulting to EXTRA.") + file_type = "EXTRA" - if not file_type or not isinstance(file_type, str): - log.warning(f"Missing or invalid 'classified_file_type' for file '{file_path_rel}'. Skipping file.") - continue + # Handle FILE_IGNORE explicitly - do not create a rule for it + if file_type == "FILE_IGNORE": + log.debug(f"Ignoring file as per LLM prediction: {file_path_rel}") + continue - # Handle FILE_IGNORE explicitly - if file_type == "FILE_IGNORE": - log.debug(f"Ignoring file as per LLM prediction: {file_path_rel}") - continue # Skip creating a rule for this file + # Determine group name and asset type + if not group_name or not isinstance(group_name, str): + log.warning(f"File '{file_path_rel}' has missing, null, or invalid 'proposed_asset_group_name' ({group_name}) from LLM. Assigning to default asset.") + group_name = "Unclassified Files" # Default group name + asset_type = "UtilityMap" # Default asset type for unclassified files (or another sensible default) + else: + asset_type = response_data["asset_group_classifications"].get(group_name) + if not asset_type: + log.warning(f"No classification found in 'asset_group_classifications' for group '{group_name}' (proposed for file '{file_path_rel}'). Assigning to default asset.") + group_name = "Unclassified Files" # Default group name + asset_type = "UtilityMap" # Default asset type + elif asset_type not in valid_asset_types: + log.warning(f"Invalid asset_type '{asset_type}' found in 'asset_group_classifications' for group '{group_name}'. Assigning to default asset.") + group_name = "Unclassified Files" # Default group name + asset_type = "UtilityMap" # Default asset type - # Validate file_type against definitions - if file_type not in valid_file_types: - log.warning(f"Invalid predicted_file_type '{file_type}' for file '{file_path_rel}'. Defaulting to EXTRA.") - file_type = "EXTRA" - - # --- Handle Grouping and Asset Type --- - if not group_name or not isinstance(group_name, str): - log.warning(f"File '{file_path_rel}' has missing, null, or invalid 'proposed_asset_group_name' ({group_name}). Cannot assign to an asset. Skipping file.") - continue - - asset_type = response_data["asset_group_classifications"].get(group_name) - - if not asset_type: - log.warning(f"No classification found in 'asset_group_classifications' for group '{group_name}' (proposed for file '{file_path_rel}'). Skipping file.") - continue - - if asset_type not in valid_asset_types: - log.warning(f"Invalid asset_type '{asset_type}' found in 'asset_group_classifications' for group '{group_name}'. Skipping file '{file_path_rel}'.") - continue + else: + # --- File NOT found in LLM output - Assign Default Classification --- + log.warning(f"File '{file_path_rel}' from input list was NOT classified by LLM. Assigning type {self.FILE_UNCLASSIFIED_BY_LLM} and default asset.") + file_type = self.FILE_UNCLASSIFIED_BY_LLM + group_name = "Unclassified Files" # Default group name + asset_type = "UtilityMap" # Default asset type # --- Construct Absolute Path --- try: @@ -373,25 +389,34 @@ class LLMPredictionHandler(BasePredictionHandler): # Create new AssetRule if this is the first file for this group log.debug(f"Creating new AssetRule for group '{group_name}' with type '{asset_type}'.") asset_rule = AssetRule(asset_name=group_name, asset_type=asset_type) + asset_rule.parent_source = source_rule # Set parent back-reference source_rule.assets.append(asset_rule) asset_rules_map[group_name] = asset_rule + # If asset_rule already exists, ensure its type is consistent or handle conflicts if necessary. + # For now, we'll assume the first file dictates the asset type for the default group. + # For LLM-classified groups, the type comes from asset_group_classifications. # --- Create and Add File Rule --- file_rule = FileRule( file_path=file_path_abs, item_type=file_type, - item_type_override=file_type, # Initial override based on LLM + item_type_override=file_type, # Initial override based on classification (LLM or default) target_asset_name_override=group_name, output_format_override=None, resolution_override=None, channel_merge_instructions={} ) + file_rule.parent_asset = asset_rule # Set parent back-reference asset_rule.files.append(file_rule) log.debug(f"Added file '{file_path_rel}' (type: {file_type}) to asset '{group_name}'.") + # --- Handle LLM Hallucinations (Remaining entries in llm_file_map) --- + for file_path_rel, file_data in llm_file_map.items(): + log.warning(f"LLM predicted file '{file_path_rel}' which was NOT in the actual input file list. Ignoring this hallucinated entry.") + # No FileRule is created for this hallucinated file. # Log if no assets were created if not source_rule.assets: - log.warning(f"LLM prediction for '{self.input_source_identifier}' resulted in zero valid assets after parsing.") + log.warning(f"LLM prediction for '{self.input_source_identifier}' resulted in zero valid assets after processing actual file list.") return [source_rule] # Return list containing the single SourceRule diff --git a/gui/main_panel_widget.py b/gui/main_panel_widget.py index 638f43f..51ecc92 100644 --- a/gui/main_panel_widget.py +++ b/gui/main_panel_widget.py @@ -23,15 +23,8 @@ from .unified_view_model import UnifiedViewModel from rule_structure import SourceRule, AssetRule, FileRule import configuration -try: - from configuration import ConfigurationError, load_base_config -except ImportError: - ConfigurationError = Exception - load_base_config = None - class configuration: - PRESETS_DIR = "Presets" - log = logging.getLogger(__name__) +from configuration import Configuration, ConfigurationError # Import Configuration class and Error class MainPanelWidget(QWidget): """ @@ -57,7 +50,7 @@ class MainPanelWidget(QWidget): blender_settings_changed = Signal(bool, str, str) - def __init__(self, unified_model: UnifiedViewModel, parent=None, file_type_keys: list[str] | None = None): + def __init__(self, config: Configuration, unified_model: UnifiedViewModel, parent=None, file_type_keys: list[str] | None = None): """ Initializes the MainPanelWidget. @@ -67,6 +60,7 @@ class MainPanelWidget(QWidget): file_type_keys: A list of available file type names (keys from FILE_TYPE_DEFINITIONS). """ super().__init__(parent) + self._config = config # Store the Configuration object self.unified_model = unified_model self.file_type_keys = file_type_keys if file_type_keys else [] self.llm_processing_active = False @@ -91,21 +85,19 @@ class MainPanelWidget(QWidget): output_layout.addWidget(self.browse_output_button) main_layout.addLayout(output_layout) - if load_base_config: - try: - base_config = load_base_config() - output_base_dir_config = base_config.get('OUTPUT_BASE_DIR', '../Asset_Processor_Output') - default_output_dir = (self.project_root / output_base_dir_config).resolve() - self.output_path_edit.setText(str(default_output_dir)) - log.info(f"MainPanelWidget: Default output directory set to: {default_output_dir}") - except ConfigurationError as e: - log.error(f"MainPanelWidget: Error reading base configuration for default output directory: {e}") - self.output_path_edit.setText("") - except Exception as e: - log.exception(f"MainPanelWidget: Error setting default output directory: {e}") - self.output_path_edit.setText("") - else: - log.warning("MainPanelWidget: load_base_config not available to set default output path.") + try: + # Access configuration directly from the stored object + # Use the output_directory_pattern from the Configuration object + output_pattern = self._config.output_directory_pattern + # Assuming the pattern is relative to the project root for the default + default_output_dir = (self.project_root / output_pattern).resolve() + self.output_path_edit.setText(str(default_output_dir)) + log.info(f"MainPanelWidget: Default output directory set to: {default_output_dir} based on pattern '{output_pattern}'") + except ConfigurationError as e: + log.error(f"MainPanelWidget: Configuration Error setting default output directory: {e}") + self.output_path_edit.setText("") + except Exception as e: + log.exception(f"MainPanelWidget: Unexpected Error setting default output directory: {e}") self.output_path_edit.setText("") @@ -180,19 +172,14 @@ class MainPanelWidget(QWidget): materials_layout.addWidget(self.browse_materials_blend_button) blender_layout.addLayout(materials_layout) - if load_base_config: - try: - base_config = load_base_config() - default_ng_path = base_config.get('DEFAULT_NODEGROUP_BLEND_PATH', '') - default_mat_path = base_config.get('DEFAULT_MATERIALS_BLEND_PATH', '') - self.nodegroup_blend_path_input.setText(default_ng_path if default_ng_path else "") - self.materials_blend_path_input.setText(default_mat_path if default_mat_path else "") - except ConfigurationError as e: - log.error(f"MainPanelWidget: Error reading base configuration for default Blender paths: {e}") - except Exception as e: - log.error(f"MainPanelWidget: Error reading default Blender paths from config: {e}") - else: - log.warning("MainPanelWidget: load_base_config not available to set default Blender paths.") + try: + # Use hardcoded defaults as Configuration object does not expose these via public interface + default_ng_path = '' + default_mat_path = '' + self.nodegroup_blend_path_input.setText(default_ng_path if default_ng_path else "") + self.materials_blend_path_input.setText(default_mat_path if default_mat_path else "") + except Exception as e: + log.error(f"MainPanelWidget: Error setting default Blender paths: {e}") self.nodegroup_blend_path_input.setEnabled(False) diff --git a/gui/main_window.py b/gui/main_window.py index 16dd54f..e0eebb0 100644 --- a/gui/main_window.py +++ b/gui/main_window.py @@ -46,14 +46,13 @@ if str(project_root) not in sys.path: sys.path.insert(0, str(project_root)) try: - from configuration import Configuration, ConfigurationError, load_base_config + from configuration import Configuration, ConfigurationError except ImportError as e: print(f"ERROR: Failed to import backend modules: {e}") print(f"Ensure GUI is run from project root or backend modules are in PYTHONPATH.") Configuration = None - load_base_config = None ConfigurationError = Exception AssetProcessor = None RuleBasedPredictionHandler = None @@ -97,8 +96,9 @@ class MainWindow(QMainWindow): start_prediction_signal = Signal(str, list, str) start_backend_processing = Signal(list, dict) - def __init__(self): + def __init__(self, config: Configuration): super().__init__() + self.config = config # Store the Configuration object self.setWindowTitle("Asset Processor Tool") self.resize(1200, 700) @@ -132,7 +132,7 @@ class MainWindow(QMainWindow): self.setCentralWidget(self.splitter) # --- Create Models --- - self.unified_model = UnifiedViewModel() + self.unified_model = UnifiedViewModel(config=self.config) # --- Instantiate Handlers that depend on the model --- self.restructure_handler = AssetRestructureHandler(self.unified_model, self) @@ -143,17 +143,16 @@ class MainWindow(QMainWindow): # --- Load File Type Definitions for Rule Editor --- file_type_keys = [] try: - base_cfg_data = load_base_config() - if base_cfg_data and "FILE_TYPE_DEFINITIONS" in base_cfg_data: - file_type_keys = list(base_cfg_data["FILE_TYPE_DEFINITIONS"].keys()) - log.info(f"Loaded {len(file_type_keys)} FILE_TYPE_DEFINITIONS keys for RuleEditor.") - else: - log.warning("FILE_TYPE_DEFINITIONS not found in base_config. RuleEditor item_type dropdown might be empty.") + # Access configuration directly from the stored object using public methods + file_type_defs = self.config.get_file_type_definitions_with_examples() + file_type_keys = list(file_type_defs.keys()) + log.info(f"Loaded {len(file_type_keys)} FILE_TYPE_DEFINITIONS keys for RuleEditor.") except Exception as e: log.exception(f"Error loading FILE_TYPE_DEFINITIONS for RuleEditor: {e}") + file_type_keys = [] # Ensure it's a list even on error - # Instantiate MainPanelWidget, passing the model, self (MainWindow) for context, and file_type_keys - self.main_panel_widget = MainPanelWidget(self.unified_model, self, file_type_keys=file_type_keys) + # Instantiate MainPanelWidget, passing the config, model, self (MainWindow) for context, and file_type_keys + self.main_panel_widget = MainPanelWidget(config=self.config, unified_model=self.unified_model, parent=self, file_type_keys=file_type_keys) self.log_console = LogConsoleWidget(self) # --- Create Left Pane with Static Selector and Stacked Editor --- @@ -215,8 +214,8 @@ class MainWindow(QMainWindow): } self.qt_key_to_ftd_map = {} try: - base_settings = load_base_config() - file_type_defs = base_settings.get('FILE_TYPE_DEFINITIONS', {}) + # Access configuration directly from the stored object using public methods + file_type_defs = self.config.get_file_type_definitions_with_examples() for ftd_key, ftd_value in file_type_defs.items(): if isinstance(ftd_value, dict) and 'keybind' in ftd_value: char_key = ftd_value['keybind'] @@ -1340,6 +1339,7 @@ def run_gui(): """Initializes and runs the Qt application.""" print("--- Reached run_gui() ---") from PySide6.QtGui import QKeySequence + from configuration import Configuration # Import Configuration here for instantiation app = QApplication(sys.argv) @@ -1351,7 +1351,16 @@ def run_gui(): app.setPalette(palette) - window = MainWindow() + # Create a Configuration instance and pass it to MainWindow + try: + config = Configuration() + log.info("Configuration loaded successfully for GUI.") + except Exception as e: + log.critical(f"Failed to load configuration for GUI: {e}") + QMessageBox.critical(None, "Configuration Error", f"Failed to load application configuration:\n{e}\n\nApplication will exit.") + sys.exit(1) # Exit if configuration fails + + window = MainWindow(config) window.show() sys.exit(app.exec()) diff --git a/gui/unified_view_model.py b/gui/unified_view_model.py index 64e58ef..54ccc11 100644 --- a/gui/unified_view_model.py +++ b/gui/unified_view_model.py @@ -1,12 +1,12 @@ # gui/unified_view_model.py import logging log = logging.getLogger(__name__) -from PySide6.QtCore import QAbstractItemModel, QModelIndex, Qt, Signal, Slot, QMimeData, QByteArray, QDataStream, QIODevice +from PySide6.QtCore import QAbstractItemModel, QModelIndex, Qt, Signal, Slot, QMimeData, QByteArray, QDataStream, QIODevice, QPersistentModelIndex from PySide6.QtGui import QColor from pathlib import Path from rule_structure import SourceRule, AssetRule, FileRule -from configuration import load_base_config from typing import List +from configuration import Configuration # Import Configuration class class CustomRoles: MapTypeRole = Qt.UserRole + 1 @@ -46,8 +46,9 @@ class UnifiedViewModel(QAbstractItemModel): # --- Drag and Drop MIME Type --- MIME_TYPE = "application/x-filerule-index-list" - def __init__(self, parent=None): + def __init__(self, config: Configuration, parent=None): super().__init__(parent) + self._config = config # Store the Configuration object self._source_rules = [] # self._display_mode removed self._asset_type_colors = {} @@ -59,9 +60,9 @@ class UnifiedViewModel(QAbstractItemModel): def _load_definitions(self): """Loads configuration and caches colors and type keys.""" try: - base_config = load_base_config() - asset_type_defs = base_config.get('ASSET_TYPE_DEFINITIONS', {}) - file_type_defs = base_config.get('FILE_TYPE_DEFINITIONS', {}) + # Access configuration directly from the stored object using public methods + asset_type_defs = self._config.get_asset_type_definitions() + file_type_defs = self._config.get_file_type_definitions_with_examples() # Cache Asset Type Definitions (Keys and Colors) self._asset_type_keys = sorted(list(asset_type_defs.keys())) @@ -905,37 +906,22 @@ class UnifiedViewModel(QAbstractItemModel): encoded_data = QByteArray() stream = QDataStream(encoded_data, QIODevice.OpenModeFlag.WriteOnly) - dragged_file_info = [] + # Store QPersistentModelIndex for robustness + persistent_indices = [] for index in indexes: - if not index.isValid() or index.column() != 0: - continue - item = index.internalPointer() - if isinstance(item, FileRule): - parent_index = self.parent(index) - if parent_index.isValid(): - # Store: source_row, source_parent_row, source_grandparent_row - # This allows reconstructing the index later - grandparent_index = self.parent(parent_index) - # Ensure grandparent_index is valid before accessing its row - if grandparent_index.isValid(): - dragged_file_info.append((index.row(), parent_index.row(), grandparent_index.row())) - else: - # Handle case where grandparent is the root (shouldn't happen for FileRule, but safety) - # Or if parent() failed unexpectedly - log.warning(f"mimeData: Could not get valid grandparent index for FileRule at row {index.row()}, parent row {parent_index.row()}") + if index.isValid() and index.column() == 0: + item = index.internalPointer() + if isinstance(item, FileRule): + persistent_indices.append(QPersistentModelIndex(index)) + log.debug(f"mimeData: Added persistent index for file: {Path(item.file_path).name}") - else: - log.warning(f"mimeData: Could not get parent index for FileRule at row {index.row()}") - - # Write the number of items first, then each tuple - stream.writeInt8(len(dragged_file_info)) - for info in dragged_file_info: - stream.writeInt8(info[0]) - stream.writeInt8(info[1]) - stream.writeInt8(info[2]) + # Write the number of items first, then each persistent index + stream.writeInt32(len(persistent_indices)) # Use writeInt32 for potentially more items + for p_index in persistent_indices: + stream.writeQPersistentModelIndex(p_index) mime_data.setData(self.MIME_TYPE, encoded_data) - log.debug(f"mimeData: Encoded {len(dragged_file_info)} FileRule indices.") + log.debug(f"mimeData: Encoded {len(persistent_indices)} FileRule persistent indices.") return mime_data def canDropMimeData(self, data: QMimeData, action: Qt.DropAction, row: int, column: int, parent: QModelIndex) -> bool: @@ -970,75 +956,48 @@ class UnifiedViewModel(QAbstractItemModel): encoded_data = data.data(self.MIME_TYPE) stream = QDataStream(encoded_data, QIODevice.OpenModeFlag.ReadOnly) - num_items = stream.readInt8() - source_indices_info = [] + # Read QPersistentModelIndex objects + persistent_indices = [] + num_items = stream.readInt32() + log.debug(f"dropMimeData: Decoding {num_items} persistent indices.") for _ in range(num_items): - source_row = stream.readInt8() - source_parent_row = stream.readInt8() - source_grandparent_row = stream.readInt8() - source_indices_info.append((source_row, source_parent_row, source_grandparent_row)) + p_index = stream.readQPersistentModelIndex() + if p_index.isValid(): + persistent_indices.append(p_index) + else: + log.warning("dropMimeData: Decoded invalid persistent index. Skipping.") - log.debug(f"dropMimeData: Decoded {len(source_indices_info)} source indices. Target Asset: '{target_asset_item.asset_name}'") + log.debug(f"dropMimeData: Decoded {len(persistent_indices)} valid persistent indices. Target Asset: '{target_asset_item.asset_name}'") - if not source_indices_info: - log.warning("dropMimeData: No valid source index information decoded.") + if not persistent_indices: + log.warning("dropMimeData: No valid persistent index information decoded.") return False # Keep track of original parents that might become empty - original_parents = set() + original_parents_to_check = set() moved_files_new_indices = {} - # --- BEGIN FIX: Reconstruct all source indices BEFORE the move loop --- - source_indices_to_process = [] - log.debug("Reconstructing initial source indices...") - for src_row, src_parent_row, src_grandparent_row in source_indices_info: - grandparent_index = self.index(src_grandparent_row, 0, QModelIndex()) - if not grandparent_index.isValid(): - log.error(f"dropMimeData: Failed initial reconstruction of grandparent index (row {src_grandparent_row}). Skipping item.") - continue - old_parent_index = self.index(src_parent_row, 0, grandparent_index) - if not old_parent_index.isValid(): - log.error(f"dropMimeData: Failed initial reconstruction of old parent index (row {src_parent_row}). Skipping item.") - continue - source_file_index = self.index(src_row, 0, old_parent_index) + # Process moves using the persistent indices + for p_source_index in persistent_indices: + # Convert persistent index back to a model index + source_file_index = QModelIndex(p_source_index) + if not source_file_index.isValid(): - # Log the specific parent it failed under for better debugging - parent_name = getattr(old_parent_index.internalPointer(), 'asset_name', 'Unknown Parent') - log.error(f"dropMimeData: Failed initial reconstruction of source file index (original row {src_row}) under parent '{parent_name}'. Skipping item.") + log.warning(f"dropMimeData: Persistent index is no longer valid. Skipping item.") continue - # Check if the reconstructed index actually points to a FileRule - item_check = source_file_index.internalPointer() - if isinstance(item_check, FileRule): - source_indices_to_process.append(source_file_index) - log.debug(f" Successfully reconstructed index for file: {Path(item_check.file_path).name}") - else: - log.warning(f"dropMimeData: Initial reconstructed index (row {src_row}) does not point to a FileRule. Skipping.") - - log.debug(f"Successfully reconstructed {len(source_indices_to_process)} valid source indices.") - # --- END FIX --- - - - # Process moves using the pre-calculated valid indices - for source_file_index in source_indices_to_process: - # Get the file item (already validated during reconstruction) + # Get the file item file_item = source_file_index.internalPointer() + if not isinstance(file_item, FileRule): + log.error(f"dropMimeData: Index points to non-FileRule item after conversion. Skipping.") + continue - # Track original parent for cleanup (using the valid index) - old_parent_index = self.parent(source_file_index) - if old_parent_index.isValid(): - old_parent_asset = old_parent_index.internalPointer() - if isinstance(old_parent_asset, AssetRule): - # Need grandparent row for the tuple key - grandparent_index = self.parent(old_parent_index) - if grandparent_index.isValid(): - original_parents.add((grandparent_index.row(), old_parent_asset.asset_name)) - else: - log.warning(f"Could not get grandparent index for original parent '{old_parent_asset.asset_name}' during cleanup tracking.") - else: - log.warning(f"Parent of file '{Path(file_item.file_path).name}' is not an AssetRule.") + # Track original parent for cleanup using the parent back-reference + old_parent_asset = getattr(file_item, 'parent_asset', None) + if old_parent_asset and isinstance(old_parent_asset, AssetRule): + original_parents_to_check.add(old_parent_asset) else: - log.warning(f"Could not get valid parent index for file '{Path(file_item.file_path).name}' during cleanup tracking.") + log.warning(f"dropMimeData: File '{Path(file_item.file_path).name}' has no valid parent asset reference for cleanup tracking.") # Perform the move using the model's method and the valid source_file_index @@ -1052,8 +1011,9 @@ class UnifiedViewModel(QAbstractItemModel): file_item.target_asset_name_override = target_asset_item.asset_name # Need the *new* index of the moved file to emit dataChanged try: + # Find the new row of the file item within the target parent's list new_row = target_asset_item.files.index(file_item) - new_file_index_col0 = self.index(new_row, 0, parent) + # Create the index for the target asset column new_file_index_target_col = self.index(new_row, self.COL_TARGET_ASSET, parent) if new_file_index_target_col.isValid(): moved_files_new_indices[file_item.file_path] = new_file_index_target_col @@ -1074,24 +1034,30 @@ class UnifiedViewModel(QAbstractItemModel): self.dataChanged.emit(new_index, new_index, [Qt.DisplayRole, Qt.EditRole]) # --- Cleanup: Remove any original parent AssetRules that are now empty --- - log.debug(f"dropMimeData: Checking original parents for cleanup: {list(original_parents)}") - for gp_row, asset_name in list(original_parents): + log.debug(f"dropMimeData: Checking original parents for cleanup: {[asset.asset_name for asset in original_parents_to_check]}") + # Convert set to list to iterate and allow removal from the model + for asset_rule_to_check in list(original_parents_to_check): try: - if 0 <= gp_row < len(self._source_rules): - source_rule = self._source_rules[gp_row] - # Find the asset rule within the correct source rule - asset_rule_to_check = next((asset for asset in source_rule.assets if asset.asset_name == asset_name), None) - - if asset_rule_to_check and not asset_rule_to_check.files and asset_rule_to_check != target_asset_item: - log.info(f"dropMimeData: Attempting cleanup of now empty original parent: '{asset_rule_to_check.asset_name}'") - if not self.removeAssetRule(asset_rule_to_check): - log.warning(f"dropMimeData: Failed to remove empty original parent '{asset_rule_to_check.asset_name}'.") - elif not asset_rule_to_check: - log.warning(f"dropMimeData: Cleanup check failed. Could not find original parent asset '{asset_name}' in source rule at row {gp_row}.") + # Re-check if the asset is still in the model and is now empty + # Use parent back-reference to find the source rule + source_rule = getattr(asset_rule_to_check, 'parent_source', None) + if source_rule: + # Check if the asset rule is still in its parent's list + if asset_rule_to_check in source_rule.assets: + if not asset_rule_to_check.files and asset_rule_to_check is not target_asset_item: + log.info(f"dropMimeData: Attempting cleanup of now empty original parent: '{asset_rule_to_check.asset_name}'") + if not self.removeAssetRule(asset_rule_to_check): + log.warning(f"dropMimeData: Failed to remove empty original parent '{asset_rule_to_check.asset_name}'.") + elif asset_rule_to_check.files: + log.debug(f"dropMimeData: Original parent '{asset_rule_to_check.asset_name}' is not empty after moves. Skipping cleanup.") + # If it's the target asset, we don't remove it + else: + log.warning(f"dropMimeData: Cleanup check failed. Original parent asset '{asset_rule_to_check.asset_name}' not found in its source rule's list.") else: - log.warning(f"dropMimeData: Cleanup check failed. Invalid grandparent row index {gp_row} found in original_parents set.") + log.warning(f"dropMimeData: Cleanup check failed. Original parent asset '{asset_rule_to_check.asset_name}' has no parent source reference.") + except Exception as e: - log.exception(f"dropMimeData: Error during cleanup check for parent '{asset_name}' (gp_row {gp_row}): {e}") + log.exception(f"dropMimeData: Error during cleanup check for parent '{asset_rule_to_check.asset_name}': {e}") return True \ No newline at end of file diff --git a/main.py b/main.py index f95843e..646a6c9 100644 --- a/main.py +++ b/main.py @@ -252,6 +252,7 @@ class ProcessingTask(QRunnable): else: log.debug(f"No incrementing token found in pattern '{pattern}'. Skipping increment calculation.") next_increment_str = None # Or a default like "00" if downstream expects a string, but None is cleaner if handled. + log.debug(f"Calculated next incrementing value for {output_dir}: {next_increment_str}") else: log.warning(f"Cannot calculate incrementing value: 'output_directory_pattern' not found in configuration for preset {config.preset_name}") except Exception as e: @@ -308,51 +309,58 @@ class App(QObject): def __init__(self, user_config_path: str): super().__init__() self.user_config_path = user_config_path # Store the determined user config path - self.config_obj = None - self.processing_engine = None + self.config_obj = None # Initialize config_obj to None + self.processing_engine = None # Initialize processing_engine to None self.main_window = None self.thread_pool = QThreadPool() self._active_tasks_count = 0 self._task_results = {"processed": 0, "skipped": 0, "failed": 0} log.info(f"Maximum threads for pool: {self.thread_pool.maxThreadCount()}") - self._load_config(self.user_config_path) # Pass the user config path - self._init_engine() - self._init_gui() + # Configuration, engine, and GUI are now initialized via load_preset + log.debug("App initialized. Configuration, engine, and GUI will be loaded via load_preset.") - def _load_config(self, user_config_path: str): - """Loads the base configuration using the determined user config path.""" + def _load_config(self, user_config_path: str, preset_name: str): + """ + Loads the configuration using the determined user config path and specified preset. + Sets self.config_obj. Does NOT exit on failure; raises ConfigurationError. + """ + log.debug(f"App: Attempting to load configuration with user_config_path='{user_config_path}' and preset_name='{preset_name}'") try: - # Initialize Configuration with the determined user config path - # The Configuration class is responsible for finding presets and other configs - self.config_obj = Configuration(base_dir_user_config=user_config_path) - log.info(f"Base configuration loaded using user config path: '{user_config_path}'.") + # Convert user_config_path string to a Path object before passing to Configuration + user_config_path_obj = Path(user_config_path) + # Instantiate Configuration with the determined user config path and the specified preset name + self.config_obj = Configuration(preset_name=preset_name, base_dir_user_config=user_config_path_obj) + log.info(f"App: Configuration loaded successfully with preset '{preset_name}'.") except ConfigurationError as e: - log.error(f"Fatal: Failed to load base configuration using user config path '{user_config_path}': {e}") - # In a real app, show this error to the user before exiting - sys.exit(1) + log.error(f"App: Failed to load configuration with preset '{preset_name}': {e}") + self.config_obj = None # Ensure config_obj is None on failure + raise # Re-raise the exception except Exception as e: - log.exception(f"Fatal: Unexpected error loading configuration: {e}") - sys.exit(1) + log.exception(f"App: Unexpected error loading configuration with preset '{preset_name}': {e}") + self.config_obj = None # Ensure config_obj is None on failure + raise # Re-raise unexpected errors def _init_engine(self): - """Initializes the ProcessingEngine.""" + """Initializes the ProcessingEngine if config_obj is available.""" if self.config_obj: try: self.processing_engine = ProcessingEngine(self.config_obj) - log.info("ProcessingEngine initialized.") + log.info("App: ProcessingEngine initialized.") except Exception as e: - log.exception(f"Fatal: Failed to initialize ProcessingEngine: {e}") - # Show error and exit - sys.exit(1) + log.exception(f"App: Failed to initialize ProcessingEngine: {e}") + self.processing_engine = None # Ensure engine is None on failure + # Depending on context, this might need to be a fatal error. + # For now, log and set to None. else: - log.error("Fatal: Cannot initialize ProcessingEngine without configuration.") - sys.exit(1) + log.warning("App: Cannot initialize ProcessingEngine: config_obj is None.") + self.processing_engine = None def _init_gui(self): - """Initializes the MainWindow and connects signals.""" - if self.processing_engine: - self.main_window = MainWindow() # MainWindow now part of the App + """Initializes the MainWindow and connects signals if processing_engine is available.""" + if self.processing_engine and self.config_obj: + # Pass the config object to MainWindow during initialization + self.main_window = MainWindow(config=self.config_obj) # Connect the signal from the GUI to the App's slot using QueuedConnection # Connect the signal from the MainWindow (which is triggered by the panel) to the App's slot connection_success = self.main_window.start_backend_processing.connect(self.on_processing_requested, Qt.ConnectionType.QueuedConnection) @@ -363,10 +371,53 @@ class App(QObject): log.error("*********************************************************") # Connect the App's completion signal to the MainWindow's slot self.all_tasks_finished.connect(self.main_window.on_processing_finished) - log.info("MainWindow initialized and signals connected.") + log.info("App: MainWindow initialized and signals connected.") else: - log.error("Fatal: Cannot initialize MainWindow without ProcessingEngine.") - sys.exit(1) + log.warning("App: Cannot initialize MainWindow: ProcessingEngine or config_obj is None.") + self.main_window = None # Ensure main_window is None if initialization fails + + def load_preset(self, preset_name: str): + """ + Loads the specified preset and re-initializes the configuration and processing engine. + This is intended to be called after App initialization, e.g., by the GUI or autotest. + """ + log.info(f"App: Loading preset '{preset_name}'...") + try: + # Load the configuration with the specified preset + self._load_config(self.user_config_path, preset_name) + log.info(f"App: Configuration reloaded with preset '{preset_name}'.") + + # Re-initialize the ProcessingEngine with the new configuration + self._init_engine() + log.info("App: ProcessingEngine re-initialized with new configuration.") + + # Initialize GUI if it hasn't been already (e.g., in Autotest where it's needed after config) + if not self.main_window: + self._init_gui() + if self.main_window: + log.debug("App: MainWindow initialized after preset load.") + else: + log.error("App: Failed to initialize MainWindow after preset load.") + else: + # If GUI was already initialized (e.g., in GUI mode), + # inform it about the config change if needed + # (e.g., to update delegates or other config-dependent UI elements) + # The MainWindow and its components (like UnifiedViewModel, MainPanelWidget) + # already hold a reference to the config_obj. + # If they need to react to a *change* in config_obj, they would need + # a signal or a method call here. + # For now, assume they access the updated self.config_obj directly when needed. + log.debug("App: MainWindow already exists, assuming it will use the updated config_obj.") + + + except ConfigurationError as e: + log.error(f"App: Failed to load preset '{preset_name}': {e}") + # Depending on context (GUI vs CLI/Autotest), this might need to be handled differently. + # For Autotest, this is likely a fatal error. For GUI, show a message box. + raise # Re-raise the exception to be caught by the caller (e.g., Autotest) + except Exception as e: + log.exception(f"App: Unexpected error loading preset '{preset_name}': {e}") + raise # Re-raise unexpected errors @Slot(list, dict) # Slot to receive List[SourceRule] and processing_settings dict def on_processing_requested(self, source_rules: list, processing_settings: dict): @@ -377,28 +428,98 @@ class App(QObject): log.info(f"VERIFY: App.on_processing_requested received {len(source_rules)} rules.") for i, rule in enumerate(source_rules): log.debug(f" VERIFY Rule {i}: Input='{rule.input_path}', Assets={len(rule.assets)}") + if not self.processing_engine: log.error("Processing engine not available. Cannot process request.") - self.main_window.statusBar().showMessage("Error: Processing Engine not ready.", 5000) + if self.main_window: + self.main_window.statusBar().showMessage("Error: Processing Engine not ready.", 5000) + # Emit finished signal with failure counts if engine is not ready + self.all_tasks_finished.emit(0, 0, len(source_rules)) return + if not source_rules: log.warning("Processing requested with an empty rule list.") - self.main_window.statusBar().showMessage("No rules to process.", 3000) + if self.main_window: + self.main_window.statusBar().showMessage("No rules to process.", 3000) + # Emit finished signal immediately if no rules + self.all_tasks_finished.emit(0, 0, 0) return # Reset task counter and results for this batch self._active_tasks_count = len(source_rules) self._task_results = {"processed": 0, "skipped": 0, "failed": 0} - log.debug(f"Initialized active task count to: {self._active_tasks_count}") + log.info(f"Initialized active task count to: {self._active_tasks_count}") # Update GUI progress bar/status via MainPanelWidget - total_tasks = self.main_window.main_panel_widget.progress_bar.maximum() - completed_tasks = total_tasks - self._active_tasks_count - self.main_window.main_panel_widget.update_progress_bar(completed_tasks, total_tasks) # Use MainPanelWidget's method + if self.main_window and hasattr(self.main_window, 'main_panel_widget') and self.main_window.main_panel_widget: + # Set maximum value of progress bar to total number of tasks + self.main_window.main_panel_widget.progress_bar.setMaximum(self._active_tasks_count) + self.main_window.main_panel_widget.update_progress_bar(0, self._active_tasks_count) # Start at 0 + else: + log.warning("App: Cannot update progress bar, main_window or main_panel_widget not available.") - # Update status for the specific file in the GUI (if needed) + # Extract processing settings + output_dir = Path(processing_settings.get("output_dir")) + overwrite = processing_settings.get("overwrite", False) + # Workers setting is used by QThreadPool itself, not passed to individual tasks + # blender_enabled, nodegroup_blend_path, materials_blend_path are not used by the engine directly, + # they would be handled by a post-processing stage if implemented. - if self._active_tasks_count == 0: + # Submit tasks to the thread pool + log.info(f"Submitting {len(source_rules)} processing tasks to the thread pool.") + for rule in source_rules: + # Create a ProcessingTask for each SourceRule + # workspace_path, incrementing_value, and sha5_value are calculated within ProcessingTask.run + task = ProcessingTask( + engine=self.processing_engine, + rule=rule, + workspace_path=Path(rule.input_path), # Pass the original input path for workspace preparation + output_base_path=output_dir + ) + # Connect the task's finished signal to the App's slot + task.signals.finished.connect(self._on_task_finished) + # Start the task in the thread pool + self.thread_pool.start(task) + log.debug(f"Submitted task for rule: {rule.input_path}") + + log.info("All processing tasks submitted to thread pool.") + + @Slot(str, str, object) # rule_input_path, status, result/error + def _on_task_finished(self, rule_input_path: str, status: str, result_or_error: object): + """Slot to handle the completion of an individual processing task.""" + log.debug(f"DEBUG: App._on_task_finished slot entered for rule: {rule_input_path} with status: {status}") + + # Decrement the active task count + self._active_tasks_count -= 1 + + # Update task results based on status + if status == "processed": + self._task_results["processed"] += 1 + elif status == "skipped": + self._task_results["skipped"] += 1 + elif status.startswith("failed"): # Catches "failed_preparation" and "failed_processing" + self._task_results["failed"] += 1 + log.error(f"Task failed for {rule_input_path}: {result_or_error}") + else: + log.warning(f"Task finished with unknown status '{status}' for {rule_input_path}. Treating as failed.") + self._task_results["failed"] += 1 + log.error(f"Task with unknown status failed for {rule_input_path}: {result_or_error}") + + log.info(f"Task finished for {rule_input_path}. Status: {status}. Remaining tasks: {self._active_tasks_count}") + log.debug(f"Current task results: Processed={self._task_results['processed']}, Skipped={self._task_results['skipped']}, Failed={self._task_results['failed']}") + + # Update GUI progress bar + if self.main_window and hasattr(self.main_window, 'main_panel_widget') and self.main_window.main_panel_widget: + completed_tasks = self._task_results["processed"] + self._task_results["skipped"] + self._task_results["failed"] + self.main_window.main_panel_widget.update_progress_bar(completed_tasks, self._task_results["processed"] + self._task_results["skipped"] + self._task_results["failed"] + self._active_tasks_count) # Update with current counts + # Update status text if needed (e.g., "Processing X of Y...") + self.main_window.main_panel_widget.set_progress_bar_text(f"Processing: {completed_tasks}/{self._task_results['processed'] + self._task_results['skipped'] + self._task_results['failed'] + self._active_tasks_count}") + else: + log.warning("App: Cannot update progress bar in _on_task_finished, main_window or main_panel_widget not available.") + + + # Check if all tasks are finished + if self._active_tasks_count <= 0: # Use <= 0 to handle potential errors leading to negative count log.info("All processing tasks finished.") # Emit the signal with the final counts self.all_tasks_finished.emit( @@ -406,6 +527,9 @@ class App(QObject): self._task_results["skipped"], self._task_results["failed"] ) + # Reset task count to 0 explicitly + self._active_tasks_count = 0 + log.debug("Emitted all_tasks_finished signal.") elif self._active_tasks_count < 0: log.error("Error: Active task count went below zero!") # Should not happen @@ -417,6 +541,14 @@ class App(QObject): else: log.error("Cannot run application, MainWindow not initialized.") + def run(self): + """Shows the main window.""" + if self.main_window: + self.main_window.show() + log.info("Application started. Showing main window.") + else: + log.error("Cannot run application, MainWindow not initialized.") + if __name__ == "__main__": parser = setup_arg_parser() @@ -485,6 +617,8 @@ if __name__ == "__main__": app_instance = App(user_config_path) # Pass the determined path + # Load an initial preset after App initialization to set up config, engine, and GUI + app_instance.load_preset("_template") app_instance.run() sys.exit(qt_app.exec()) diff --git a/processing/pipeline/stages/output_organization.py b/processing/pipeline/stages/output_organization.py index db92653..8525e9e 100644 --- a/processing/pipeline/stages/output_organization.py +++ b/processing/pipeline/stages/output_organization.py @@ -97,6 +97,7 @@ class OutputOrganizationStage(ProcessingStage): token_data_variant = { "assetname": asset_name_for_log, "supplier": context.effective_supplier or "DefaultSupplier", + "asset_category": context.asset_rule.asset_category, # Added asset_category "maptype": base_map_type, "resolution": variant_resolution_key, "ext": variant_ext, @@ -162,13 +163,14 @@ class OutputOrganizationStage(ProcessingStage): resolution_str = details.get('processed_resolution_name', details.get('original_resolution_name', 'resX')) token_data = { - "assetname": asset_name_for_log, - "supplier": context.effective_supplier or "DefaultSupplier", - "maptype": base_map_type, - "resolution": resolution_str, - "ext": temp_file_path.suffix.lstrip('.'), - "incrementingvalue": getattr(context, 'incrementing_value', None), - "sha5": getattr(context, 'sha5_value', None) + "assetname": asset_name_for_log, + "supplier": context.effective_supplier or "DefaultSupplier", + "asset_category": context.asset_rule.asset_category, # Added asset_category + "maptype": base_map_type, + "resolution": resolution_str, + "ext": temp_file_path.suffix.lstrip('.'), + "incrementingvalue": getattr(context, 'incrementing_value', None), + "sha5": getattr(context, 'sha5_value', None) } token_data_cleaned = {k: v for k, v in token_data.items() if v is not None} @@ -176,8 +178,8 @@ class OutputOrganizationStage(ProcessingStage): try: relative_dir_path_str = generate_path_from_pattern( - pattern_string=output_dir_pattern, - token_data=token_data_cleaned + pattern_string=output_dir_pattern, + token_data=token_data_cleaned ) logger.debug(f"OUTPUT_ORG_DEBUG: SingleFile - Using context.output_base_path = {context.output_base_path} for final_path construction.") # Added final_path = Path(context.output_base_path) / Path(relative_dir_path_str) / Path(output_filename) @@ -214,9 +216,8 @@ class OutputOrganizationStage(ProcessingStage): details['status'] = 'Organization Failed' # --- Handle other statuses (Skipped, Failed, etc.) --- - else: # Catches statuses not explicitly handled above - logger.debug(f"Asset '{asset_name_for_log}': Skipping map key '{processed_map_key}' (status: '{map_status}') for organization as it's not a recognized final processed state or variant state.") - continue + else: # Catches statuses not explicitly handled above + logger.debug(f"Asset '{asset_name_for_log}': Skipping map key '{processed_map_key}' (status: '{map_status}') for organization as it's not a recognized final processed state or variant state.") else: logger.debug(f"Asset '{asset_name_for_log}': No processed individual maps to organize.") @@ -243,18 +244,19 @@ class OutputOrganizationStage(ProcessingStage): # However, generate_path_from_pattern might expect them or handle their absence. # For the base asset directory, only assetname and supplier are typically primary. base_token_data = { - "assetname": asset_name_for_log, - "supplier": context.effective_supplier or "DefaultSupplier", - # Add other tokens if your output_directory_pattern uses them at the asset level - "incrementingvalue": getattr(context, 'incrementing_value', None), - "sha5": getattr(context, 'sha5_value', None) + "assetname": asset_name_for_log, + "supplier": context.effective_supplier or "DefaultSupplier", + "asset_category": context.asset_rule.asset_category, # Added asset_category + # Add other tokens if your output_directory_pattern uses them at the asset level + "incrementingvalue": getattr(context, 'incrementing_value', None), + "sha5": getattr(context, 'sha5_value', None) } base_token_data_cleaned = {k: v for k, v in base_token_data.items() if v is not None} try: asset_base_output_dir_str = generate_path_from_pattern( - pattern_string=output_dir_pattern, # Uses the same pattern as other maps for base dir - token_data=base_token_data_cleaned + pattern_string=output_dir_pattern, # Uses the same pattern as other maps for base dir + token_data=base_token_data_cleaned ) # Destination: /// logger.debug(f"OUTPUT_ORG_DEBUG: ExtraFiles - Using context.output_base_path = {context.output_base_path} for final_dest_path construction.") # Added diff --git a/rule_structure.py b/rule_structure.py index 5b04fa9..bd3a2de 100644 --- a/rule_structure.py +++ b/rule_structure.py @@ -12,12 +12,14 @@ class FileRule: channel_merge_instructions: Dict[str, Any] = dataclasses.field(default_factory=dict) output_format_override: str = None processing_items: List['ProcessingItem'] = dataclasses.field(default_factory=list) # Added field + parent_asset: 'AssetRule' = None # Added parent back-reference def to_json(self) -> str: - # Need to handle ProcessingItem serialization if it contains non-serializable types like np.ndarray - # For now, assume asdict handles it or it's handled before calling to_json for persistence. - # A custom asdict_factory might be needed for robust serialization. - return json.dumps(dataclasses.asdict(self), indent=4) + # Exclude parent_asset to avoid circular references + data = dataclasses.asdict(self) + if 'parent_asset' in data: + del data['parent_asset'] + return json.dumps(data, indent=4) @classmethod def from_json(cls, json_string: str) -> 'FileRule': @@ -31,9 +33,14 @@ class AssetRule: asset_type_override: str = None common_metadata: Dict[str, Any] = dataclasses.field(default_factory=dict) files: List[FileRule] = dataclasses.field(default_factory=list) + parent_source: 'SourceRule' = None # Added parent back-reference def to_json(self) -> str: - return json.dumps(dataclasses.asdict(self), indent=4) + # Exclude parent_source to avoid circular references + data = dataclasses.asdict(self) + if 'parent_source' in data: + del data['parent_source'] + return json.dumps(data, indent=4) @classmethod def from_json(cls, json_string: str) -> 'AssetRule': diff --git a/user_data/.first_run_complete b/user_data/.first_run_complete new file mode 100644 index 0000000..119c3e4 --- /dev/null +++ b/user_data/.first_run_complete @@ -0,0 +1 @@ +Asset Processor first-time setup complete. \ No newline at end of file diff --git a/user_data/Presets/Dinesen.json b/user_data/Presets/Dinesen.json new file mode 100644 index 0000000..12ef98b --- /dev/null +++ b/user_data/Presets/Dinesen.json @@ -0,0 +1,280 @@ +{ + "preset_name": "Dinesen", + "supplier_name": "Dinesen", + "notes": "Preset for standard Poliigon downloads. Prioritizes _xxx16 files. Moves previews etc. to Extra/. Assumes Metal/Rough workflow.", + "source_naming": { + "separator": "_", + "part_indices": { + "base_name": 0, + "map_type": 1 + }, + "glossiness_keywords": [ + "GLOSS" + ] + }, + "move_to_extra_patterns": [ + "*_Preview*", + "*_Sphere*", + "*_Cube*", + "*_Flat*", + "*.txt", + "*.pdf", + "*.url", + "*.htm*", + "*_Fabric.*", + "*_DISP_*METALNESS*" + ], + "map_type_mapping": [ + { + "target_type": "MAP_COL", + "keywords": [ + "COLOR*", + "COL", + "COL-*", + "DIFFUSE", + "DIF", + "ALBEDO" + ] + }, + { + "target_type": "MAP_NRM", + "keywords": [ + "NORMAL*", + "NORM*", + "NRM*", + "N" + ], + "priority_keywords": [ + "*_NRM16*", + "*_NM16*", + "*Normal16*" + ] + }, + { + "target_type": "MAP_ROUGH", + "keywords": [ + "ROUGHNESS", + "ROUGH" + ] + }, + { + "target_type": "MAP_GLOSS", + "keywords": [ + "GLOSS" + ] + }, + { + "target_type": "MAP_AO", + "keywords": [ + "AMBIENTOCCLUSION", + "AO" + ] + }, + { + "target_type": "MAP_DISP", + "keywords": [ + "DISPLACEMENT", + "DISP", + "HEIGHT", + "BUMP" + ], + "priority_keywords": [ + "*_DISP16*", + "*_DSP16*", + "*DSP16*", + "*DISP16*", + "*Displacement16*", + "*Height16*" + ] + }, + { + "target_type": "MAP_REFL", + "keywords": [ + "REFLECTION", + "REFL", + "SPECULAR", + "SPEC" + ] + }, + { + "target_type": "MAP_SSS", + "keywords": [ + "SSS", + "SUBSURFACE*" + ] + }, + { + "target_type": "MAP_FUZZ", + "keywords": [ + "FUZZ" + ] + }, + { + "target_type": "MAP_IDMAP", + "keywords": [ + "IDMAP" + ] + }, + { + "target_type": "MAP_MASK", + "keywords": [ + "OPAC*", + "TRANSP*", + "MASK*", + "ALPHA*" + ] + }, + { + "target_type": "MAP_METAL", + "keywords": [ + "METAL*", + "METALLIC" + ] + } + ], + "asset_category_rules": { + "model_patterns": [ + "*.fbx", + "*.obj", + "*.blend", + "*.mtl" + ], + "decal_keywords": [ + "Decal" + ] + }, + "archetype_rules": [ + [ + "Foliage", + { + "match_any": [ + "Plant", + "Leaf", + "Leaves", + "Grass" + ], + "match_all": [] + } + ], + [ + "Fabric", + { + "match_any": [ + "Fabric", + "Carpet", + "Cloth", + "Textile", + "Leather" + ], + "match_all": [] + } + ], + [ + "Wood", + { + "match_any": [ + "Wood", + "Timber", + "Plank", + "Board" + ], + "match_all": [] + } + ], + [ + "Metal", + { + "match_any": [ + "_Metal", + "Steel", + "Iron", + "Gold", + "Copper", + "Chrome", + "Aluminum", + "Brass", + "Bronze" + ], + "match_all": [] + } + ], + [ + "Concrete", + { + "match_any": [ + "Concrete", + "Cement" + ], + "match_all": [] + } + ], + [ + "Ground", + { + "match_any": [ + "Ground", + "Dirt", + "Soil", + "Mud", + "Sand", + "Gravel", + "Asphalt", + "Road", + "Moss" + ], + "match_all": [] + } + ], + [ + "Stone", + { + "match_any": [ + "Stone", + "Rock*", + "Marble", + "Granite", + "Brick", + "Tile", + "Paving", + "Pebble*", + "Terrazzo", + "Slate" + ], + "match_all": [] + } + ], + [ + "Plaster", + { + "match_any": [ + "Plaster", + "Stucco", + "Wall", + "Paint" + ], + "match_all": [] + } + ], + [ + "Plastic", + { + "match_any": [ + "Plastic", + "PVC", + "Resin", + "Rubber" + ], + "match_all": [] + } + ], + [ + "Glass", + { + "match_any": [ + "Glass" + ], + "match_all": [] + } + ] + ] +} \ No newline at end of file diff --git a/user_data/Presets/Poliigon.json b/user_data/Presets/Poliigon.json new file mode 100644 index 0000000..b17f6ad --- /dev/null +++ b/user_data/Presets/Poliigon.json @@ -0,0 +1,280 @@ +{ + "preset_name": "Poliigon Standard v2", + "supplier_name": "Poliigon", + "notes": "Preset for standard Poliigon downloads. Prioritizes _xxx16 files. Moves previews etc. to Extra/. Assumes Metal/Rough workflow.", + "source_naming": { + "separator": "_", + "part_indices": { + "base_name": 0, + "map_type": 1 + }, + "glossiness_keywords": [ + "GLOSS" + ] + }, + "move_to_extra_patterns": [ + "*_Preview*", + "*_Sphere*", + "*_Cube*", + "*_Flat*", + "*.txt", + "*.pdf", + "*.url", + "*.htm*", + "*_Fabric.*", + "*_Albedo*" + ], + "map_type_mapping": [ + { + "target_type": "MAP_COL", + "keywords": [ + "COLOR*", + "COL", + "COL-*", + "DIFFUSE", + "DIF", + "ALBEDO" + ] + }, + { + "target_type": "MAP_NRM", + "keywords": [ + "NORMAL*", + "NORM*", + "NRM*", + "N" + ], + "priority_keywords": [ + "*_NRM16*", + "*_NM16*", + "*Normal16*" + ] + }, + { + "target_type": "MAP_ROUGH", + "keywords": [ + "ROUGHNESS", + "ROUGH" + ] + }, + { + "target_type": "MAP_GLOSS", + "keywords": [ + "GLOSS" + ] + }, + { + "target_type": "MAP_AO", + "keywords": [ + "AMBIENTOCCLUSION", + "AO" + ] + }, + { + "target_type": "MAP_DISP", + "keywords": [ + "DISPLACEMENT", + "DISP", + "HEIGHT", + "BUMP" + ], + "priority_keywords": [ + "*_DISP16*", + "*_DSP16*", + "*DSP16*", + "*DISP16*", + "*Displacement16*", + "*Height16*" + ] + }, + { + "target_type": "MAP_REFL", + "keywords": [ + "REFLECTION", + "REFL", + "SPECULAR", + "SPEC" + ] + }, + { + "target_type": "MAP_SSS", + "keywords": [ + "SSS", + "SUBSURFACE*" + ] + }, + { + "target_type": "MAP_FUZZ", + "keywords": [ + "FUZZ" + ] + }, + { + "target_type": "MAP_IDMAP", + "keywords": [ + "IDMAP" + ] + }, + { + "target_type": "MAP_MASK", + "keywords": [ + "OPAC*", + "TRANSP*", + "MASK*", + "ALPHA*" + ] + }, + { + "target_type": "MAP_METAL", + "keywords": [ + "METAL*", + "METALLIC" + ] + } + ], + "asset_category_rules": { + "model_patterns": [ + "*.fbx", + "*.obj", + "*.blend", + "*.mtl" + ], + "decal_keywords": [ + "Decal" + ] + }, + "archetype_rules": [ + [ + "Foliage", + { + "match_any": [ + "Plant", + "Leaf", + "Leaves", + "Grass" + ], + "match_all": [] + } + ], + [ + "Fabric", + { + "match_any": [ + "Fabric", + "Carpet", + "Cloth", + "Textile", + "Leather" + ], + "match_all": [] + } + ], + [ + "Wood", + { + "match_any": [ + "Wood", + "Timber", + "Plank", + "Board" + ], + "match_all": [] + } + ], + [ + "Metal", + { + "match_any": [ + "_Metal", + "Steel", + "Iron", + "Gold", + "Copper", + "Chrome", + "Aluminum", + "Brass", + "Bronze" + ], + "match_all": [] + } + ], + [ + "Concrete", + { + "match_any": [ + "Concrete", + "Cement" + ], + "match_all": [] + } + ], + [ + "Ground", + { + "match_any": [ + "Ground", + "Dirt", + "Soil", + "Mud", + "Sand", + "Gravel", + "Asphalt", + "Road", + "Moss" + ], + "match_all": [] + } + ], + [ + "Stone", + { + "match_any": [ + "Stone", + "Rock*", + "Marble", + "Granite", + "Brick", + "Tile", + "Paving", + "Pebble*", + "Terrazzo", + "Slate" + ], + "match_all": [] + } + ], + [ + "Plaster", + { + "match_any": [ + "Plaster", + "Stucco", + "Wall", + "Paint" + ], + "match_all": [] + } + ], + [ + "Plastic", + { + "match_any": [ + "Plastic", + "PVC", + "Resin", + "Rubber" + ], + "match_all": [] + } + ], + [ + "Glass", + { + "match_any": [ + "Glass" + ], + "match_all": [] + } + ] + ] +} \ No newline at end of file diff --git a/user_data/Presets/_template.json b/user_data/Presets/_template.json new file mode 100644 index 0000000..2c50283 --- /dev/null +++ b/user_data/Presets/_template.json @@ -0,0 +1,270 @@ +{ + "preset_name": "Poliigon Standard v2", + "supplier_name": "Poliigon", + "notes": "Preset for standard Poliigon downloads. Prioritizes _xxx16 files. Moves previews etc. to Extra/. Assumes Metal/Rough workflow.", + "source_naming": { + "separator": "_", + "part_indices": { + "base_name": 0, + "map_type": 1 + }, + "glossiness_keywords": [ + "GLOSS" + ], + "bit_depth_variants": { + "NRM": "*_NRM16*", + "DISP": "*_DISP16*" + } + }, + "move_to_extra_patterns": [ + "*_Preview*", + "*_Sphere*", + "*_Cube*", + "*_Flat*", + "*.txt", + "*.pdf", + "*.url", + "*.htm*", + "*_Fabric.*" + ], + "map_type_mapping": [ + { + "target_type": "MAP_COL", + "keywords": [ + "COLOR*", + "COL", + "DIFFUSE", + "DIF", + "ALBEDO" + ] + }, + { + "target_type": "MAP_NRM", + "keywords": [ + "NORMAL*", + "NORM*", + "NRM*", + "N" + ] + }, + { + "target_type": "MAP_ROUGH", + "keywords": [ + "ROUGHNESS", + "ROUGH" + ] + }, + { + "target_type": "MAP_ROUGH", + "keywords": [ + "GLOSS" + ] + }, + { + "target_type": "MAP_AO", + "keywords": [ + "AMBIENTOCCLUSION", + "AO" + ] + }, + { + "target_type": "MAP_DISP", + "keywords": [ + "DISPLACEMENT", + "DISP", + "HEIGHT", + "BUMP" + ] + }, + { + "target_type": "MAP_REFL", + "keywords": [ + "REFLECTION", + "REFL", + "SPECULAR", + "SPEC" + ] + }, + { + "target_type": "MAP_SSS", + "keywords": [ + "SSS", + "SUBSURFACE*" + ] + }, + { + "target_type": "MAP_FUZZ", + "keywords": [ + "FUZZ" + ] + }, + { + "target_type": "MAP_IDMAP", + "keywords": [ + "ID*", + "IDMAP" + ] + }, + { + "target_type": "MAP_MASK", + "keywords": [ + "OPAC*", + "TRANS*", + "MASK*", + "ALPHA*" + ] + }, + { + "target_type": "MAP_METAL", + "keywords": [ + "METALNESS_", + "METALLIC" + ] + } + ], + "asset_category_rules": { + "model_patterns": [ + "*.fbx", + "*.obj", + "*.blend", + "*.mtl" + ], + "decal_keywords": [ + "Decal" + ] + }, + "archetype_rules": [ + [ + "Foliage", + { + "match_any": [ + "Plant", + "Leaf", + "Leaves", + "Grass" + ], + "match_all": [] + } + ], + [ + "Fabric", + { + "match_any": [ + "Fabric", + "Carpet", + "Cloth", + "Textile", + "Leather" + ], + "match_all": [] + } + ], + [ + "Wood", + { + "match_any": [ + "Wood", + "Timber", + "Plank", + "Board" + ], + "match_all": [] + } + ], + [ + "Metal", + { + "match_any": [ + "_Metal", + "Steel", + "Iron", + "Gold", + "Copper", + "Chrome", + "Aluminum", + "Brass", + "Bronze" + ], + "match_all": [] + } + ], + [ + "Concrete", + { + "match_any": [ + "Concrete", + "Cement" + ], + "match_all": [] + } + ], + [ + "Ground", + { + "match_any": [ + "Ground", + "Dirt", + "Soil", + "Mud", + "Sand", + "Gravel", + "Asphalt", + "Road", + "Moss" + ], + "match_all": [] + } + ], + [ + "Stone", + { + "match_any": [ + "Stone", + "Rock*", + "Marble", + "Granite", + "Brick", + "Tile", + "Paving", + "Pebble*", + "Terrazzo", + "Slate" + ], + "match_all": [] + } + ], + [ + "Plaster", + { + "match_any": [ + "Plaster", + "Stucco", + "Wall", + "Paint" + ], + "match_all": [] + } + ], + [ + "Plastic", + { + "match_any": [ + "Plastic", + "PVC", + "Resin", + "Rubber" + ], + "match_all": [] + } + ], + [ + "Glass", + { + "match_any": [ + "Glass" + ], + "match_all": [] + } + ] + ] +} \ No newline at end of file diff --git a/user_data/config/asset_type_definitions.json b/user_data/config/asset_type_definitions.json new file mode 100644 index 0000000..55691ad --- /dev/null +++ b/user_data/config/asset_type_definitions.json @@ -0,0 +1,44 @@ +{ + "ASSET_TYPE_DEFINITIONS": { + "Surface": { + "color": "#1f3e5d", + "description": "A single Standard PBR material set for a surface.", + "examples": [ + "Set: Wood01_COL + Wood01_NRM + WOOD01_ROUGH", + "Set: Dif_Concrete + Normal_Concrete + Refl_Concrete" + ] + }, + "Model": { + "color": "#b67300", + "description": "A set that contains models, can include PBR textureset", + "examples": [ + "Single = Chair.fbx", + "Set = Plant02.fbx + Plant02_col + Plant02_SSS" + ] + }, + "Decal": { + "color": "#68ac68", + "description": "A alphamasked textureset", + "examples": [ + "Set = DecalGraffiti01_Col + DecalGraffiti01_Alpha", + "Single = DecalLeakStain03" + ] + }, + "Atlas": { + "color": "#955b8b", + "description": "A texture, name usually hints that it's an atlas", + "examples": [ + "Set = FoliageAtlas01_col + FoliageAtlas01_nrm" + ] + }, + "UtilityMap": { + "color": "#706b87", + "description": "A useful image-asset consisting of only a single texture. Therefor each Utilitymap can only contain a single item.", + "examples": [ + "Single = imperfection.png", + "Single = smudges.png", + "Single = scratches.tif" + ] + } + } +} \ No newline at end of file diff --git a/user_data/config/file_type_definitions.json b/user_data/config/file_type_definitions.json new file mode 100644 index 0000000..427c6bb --- /dev/null +++ b/user_data/config/file_type_definitions.json @@ -0,0 +1,210 @@ +{ + "FILE_TYPE_DEFINITIONS": { + "MAP_COL": { + "bit_depth_rule": "force_8bit", + "color": "#ffaa00", + "description": "Color/Albedo Map", + "examples": [ + "_col.", + "_basecolor.", + "albedo", + "diffuse" + ], + "is_grayscale": false, + "keybind": "C", + "standard_type": "COL" + }, + "MAP_NRM": { + "bit_depth_rule": "respect", + "color": "#cca2f1", + "description": "Normal Map", + "examples": [ + "_nrm.", + "_normal." + ], + "is_grayscale": false, + "keybind": "N", + "standard_type": "NRM" + }, + "MAP_METAL": { + "bit_depth_rule": "force_8bit", + "color": "#dcf4f2", + "description": "Metalness Map", + "examples": [ + "_metal.", + "_met." + ], + "is_grayscale": true, + "keybind": "M", + "standard_type": "METAL" + }, + "MAP_ROUGH": { + "bit_depth_rule": "force_8bit", + "color": "#bfd6bf", + "description": "Roughness Map", + "examples": [ + "_rough.", + "_rgh.", + "_gloss" + ], + "is_grayscale": true, + "keybind": "R", + "standard_type": "ROUGH" + }, + "MAP_GLOSS": { + "bit_depth_rule": "force_8bit", + "color": "#d6bfd6", + "description": "Glossiness Map", + "examples": [ + "_gloss.", + "_gls." + ], + "is_grayscale": true, + "keybind": "R", + "standard_type": "GLOSS" + }, + "MAP_AO": { + "bit_depth_rule": "force_8bit", + "color": "#e3c7c7", + "description": "Ambient Occlusion Map", + "examples": [ + "_ao.", + "_ambientocclusion." + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "AO" + }, + "MAP_DISP": { + "bit_depth_rule": "respect", + "color": "#c6ddd5", + "description": "Displacement/Height Map", + "examples": [ + "_disp.", + "_height." + ], + "is_grayscale": true, + "keybind": "D", + "standard_type": "DISP" + }, + "MAP_REFL": { + "bit_depth_rule": "force_8bit", + "color": "#c2c2b9", + "description": "Reflection/Specular Map", + "examples": [ + "_refl.", + "_specular." + ], + "is_grayscale": true, + "keybind": "M", + "standard_type": "REFL" + }, + "MAP_SSS": { + "bit_depth_rule": "respect", + "color": "#a0d394", + "description": "Subsurface Scattering Map", + "examples": [ + "_sss.", + "_subsurface." + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "SSS" + }, + "MAP_FUZZ": { + "bit_depth_rule": "force_8bit", + "color": "#a2d1da", + "description": "Fuzz/Sheen Map", + "examples": [ + "_fuzz.", + "_sheen." + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "FUZZ" + }, + "MAP_IDMAP": { + "bit_depth_rule": "force_8bit", + "color": "#ca8fb4", + "description": "ID Map (for masking)", + "examples": [ + "_id.", + "_matid." + ], + "is_grayscale": false, + "keybind": "", + "standard_type": "IDMAP" + }, + "MAP_MASK": { + "bit_depth_rule": "force_8bit", + "color": "#c6e2bf", + "description": "Generic Mask Map", + "examples": [ + "_mask." + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "MASK" + }, + "MAP_IMPERFECTION": { + "bit_depth_rule": "force_8bit", + "color": "#e6d1a6", + "description": "Imperfection Map (scratches, dust)", + "examples": [ + "_imp.", + "_imperfection.", + "splatter", + "scratches", + "smudges", + "hairs", + "fingerprints" + ], + "is_grayscale": true, + "keybind": "", + "standard_type": "IMPERFECTION" + }, + "MODEL": { + "bit_depth_rule": "", + "color": "#3db2bd", + "description": "3D Model File", + "examples": [ + ".fbx", + ".obj" + ], + "is_grayscale": false, + "keybind": "", + "standard_type": "" + }, + "EXTRA": { + "bit_depth_rule": "", + "color": "#8c8c8c", + "description": "asset previews or metadata", + "examples": [ + ".txt", + ".zip", + "preview.", + "_flat.", + "_sphere.", + "_Cube.", + "thumb" + ], + "is_grayscale": false, + "keybind": "E", + "standard_type": "EXTRA" + }, + "FILE_IGNORE": { + "bit_depth_rule": "", + "color": "#673d35", + "description": "File identified to be ignored due to prioritization rules (e.g., a lower bit-depth version when a higher one is present).", + "category": "Ignored", + "examples": [ + "Thumbs.db", + ".DS_Store" + ], + "is_grayscale": false, + "keybind": "X", + "standard_type": "", + "details": {} + } + } +} \ No newline at end of file diff --git a/user_data/config/llm_settings.json b/user_data/config/llm_settings.json new file mode 100644 index 0000000..e898fe5 --- /dev/null +++ b/user_data/config/llm_settings.json @@ -0,0 +1,267 @@ +{ + "llm_predictor_examples": [ + { + "input": "MessyTextures/Concrete_Damage_Set/concrete_col.png\nMessyTextures/Concrete_Damage_Set/concrete_N.png\nMessyTextures/Concrete_Damage_Set/concrete_rough.jpg\nMessyTextures/Concrete_Damage_Set/height_map_concrete.tif\nMessyTextures/Concrete_Damage_Set/Thumbs.db\nMessyTextures/Fabric_Pattern/pattern_01_diffuse.tga\nMessyTextures/Fabric_Pattern/pattern_01_ao.png\nMessyTextures/Fabric_Pattern/pattern_01_normal.png\nMessyTextures/Fabric_Pattern/notes.txt\nMessyTextures/Fabric_Pattern/variant_blue_diffuse.tga\nMessyTextures/Fabric_Pattern/fabric_flat.jpg", + "output": { + "individual_file_analysis": [ + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/concrete_col.png", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Concrete_Damage_Set" + }, + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/concrete_N.png", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Concrete_Damage_Set" + }, + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/concrete_rough.jpg", + "classified_file_type": "MAP_ROUGH", + "proposed_asset_group_name": "Concrete_Damage_Set" + }, + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/height_map_concrete.tif", + "classified_file_type": "MAP_DISP", + "proposed_asset_group_name": "Concrete_Damage_Set" + }, + { + "relative_file_path": "MessyTextures/Concrete_Damage_Set/Thumbs.db", + "classified_file_type": "FILE_IGNORE", + "proposed_asset_group_name": null + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/pattern_01_diffuse.tga", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/pattern_01_ao.png", + "classified_file_type": "MAP_AO", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/pattern_01_normal.png", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/notes.txt", + "classified_file_type": "EXTRA", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/variant_blue_diffuse.tga", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Fabric_Pattern_01" + }, + { + "relative_file_path": "MessyTextures/Fabric_Pattern/fabric_flat.jpg", + "classified_file_type": "EXTRA", + "proposed_asset_group_name": "Fabric_Pattern_01" + } + ], + "asset_group_classifications": { + "Concrete_Damage_Set": "Surface", + "Fabric_Pattern_01": "Surface" + } + } + }, + { + "input": "SciFi_Drone/Drone_Model.fbx\nSciFi_Drone/Textures/Drone_BaseColor.png\nSciFi_Drone/Textures/Drone_Metallic.png\nSciFi_Drone/Textures/Drone_Roughness.png\nSciFi_Drone/Textures/Drone_Normal.png\nSciFi_Drone/Textures/Drone_Emissive.jpg\nSciFi_Drone/ReferenceImages/concept.jpg", + "output": { + "individual_file_analysis": [ + { + "relative_file_path": "SciFi_Drone/Drone_Model.fbx", + "classified_file_type": "MODEL", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_BaseColor.png", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_Metallic.png", + "classified_file_type": "MAP_METAL", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_Roughness.png", + "classified_file_type": "MAP_ROUGH", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_Normal.png", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/Textures/Drone_Emissive.jpg", + "classified_file_type": "EXTRA", + "proposed_asset_group_name": "SciFi_Drone" + }, + { + "relative_file_path": "SciFi_Drone/ReferenceImages/concept.jpg", + "classified_file_type": "EXTRA", + "proposed_asset_group_name": "SciFi_Drone" + } + ], + "asset_group_classifications": { + "SciFi_Drone": "Model" + } + } + }, + { + "input": "21_hairs_deposits.tif\n22_hairs_fabric.tif\n23_hairs_fibres.tif\n24_hairs_fibres.tif\n25_bonus_isolatedFingerprints.tif\n26_bonus_isolatedPalmprint.tif\n27_metal_aluminum.tif\n28_metal_castIron.tif\n29_scratcehes_deposits_shapes.tif\n30_scratches_deposits.tif", + "output": { + "individual_file_analysis": [ + { + "relative_file_path": "21_hairs_deposits.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Hairs_Deposits_21" + }, + { + "relative_file_path": "22_hairs_fabric.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Hairs_Fabric_22" + }, + { + "relative_file_path": "23_hairs_fibres.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Hairs_Fibres_23" + }, + { + "relative_file_path": "24_hairs_fibres.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Hairs_Fibres_24" + }, + { + "relative_file_path": "25_bonus_isolatedFingerprints.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Bonus_IsolatedFingerprints_25" + }, + { + "relative_file_path": "26_bonus_isolatedPalmprint.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Bonus_IsolatedPalmprint_26" + }, + { + "relative_file_path": "27_metal_aluminum.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Metal_Aluminum_27" + }, + { + "relative_file_path": "28_metal_castIron.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Metal_CastIron_28" + }, + { + "relative_file_path": "29_scratcehes_deposits_shapes.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Scratches_Deposits_Shapes_29" + }, + { + "relative_file_path": "30_scratches_deposits.tif", + "classified_file_type": "MAP_IMPERFECTION", + "proposed_asset_group_name": "Scratches_Deposits_30" + } + ], + "asset_group_classifications": { + "Hairs_Deposits_21": "UtilityMap", + "Hairs_Fabric_22": "UtilityMap", + "Hairs_Fibres_23": "UtilityMap", + "Hairs_Fibres_24": "UtilityMap", + "Bonus_IsolatedFingerprints_25": "UtilityMap", + "Bonus_IsolatedPalmprint_26": "UtilityMap", + "Metal_Aluminum_27": "UtilityMap", + "Metal_CastIron_28": "UtilityMap", + "Scratches_Deposits_Shapes_29": "UtilityMap", + "Scratches_Deposits_30": "UtilityMap" + } + } + }, + { + "input": "Part1/TextureSupply_Boards001_A_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_A_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_B_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_B_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_C_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_C_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_D_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_D_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_E_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_E_28x300cm-Normal.jpg\nPart1/TextureSupply_Boards001_F_28x300cm-Albedo.jpg\nPart1/TextureSupply_Boards001_F_28x300cm-Normal.jpg", + "output": { + "individual_file_analysis": [ + { + "relative_file_path": "Part1/TextureSupply_Boards001_A_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_A" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_A_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_A" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_B_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_B" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_B_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_B" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_C_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_C" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_C_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_C" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_D_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_D" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_D_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_D" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_E_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_E" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_E_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_E" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_F_28x300cm-Albedo.jpg", + "classified_file_type": "MAP_COL", + "proposed_asset_group_name": "Boards001_F" + }, + { + "relative_file_path": "Part1/TextureSupply_Boards001_F_28x300cm-Normal.jpg", + "classified_file_type": "MAP_NRM", + "proposed_asset_group_name": "Boards001_F" + } + ], + "asset_group_classifications": { + "Boards001_A": "Surface", + "Boards001_B": "Surface", + "Boards001_C": "Surface", + "Boards001_D": "Surface", + "Boards001_E": "Surface", + "Boards001_F": "Surface" + } + } + } + ], + "asset_type_definition_format": "{KEY} = {DESCRIPTION}, examples of content of {KEY} could be: {EXAMPLES}", + "file_type_definition_format": "{KEY} = {DESCRIPTION}, examples of keywords for {KEY} could be: {EXAMPLES}", + "llm_endpoint_url": "http://100.65.14.122:1234/v1/chat/completions", + "llm_api_key": "", + "llm_model_name": "qwen2.5-coder:3b", + "llm_temperature": 0.5, + "llm_request_timeout": 120, + "llm_predictor_prompt": "You are an expert asset classification system. Your task is to analyze a list of file paths, understand their relationships based on naming and directory structure, and output a structured JSON object that classifies each file individually and then classifies the logical asset groups they belong to.\\n\\nDefinitions:\\n\\nAsset Types: These define the overall category of a logical asset group. Use one of the following keys when classifying asset groups. Each definition is provided as a formatted string (e.g., 'Surface = A single PBR material set..., examples: WoodFloor01, MetalPlate05'):\\n{ASSET_TYPE_DEFINITIONS}\\n\\n\\nFile Types: These define the specific purpose of each individual file. Use one of the following keys when classifying individual files. Each definition is provided as a formatted string (e.g., 'MAP_COL = Color/Albedo Map, examples: _col., _basecolor.'):\\n{FILE_TYPE_DEFINITIONS}\\n\\n\\nCore Task & Logic:\\n\\n1. **Individual File Analysis:**\\n * Examine each `relative_file_path` in the input `FILE_LIST`.\\n * For EACH file, determine its most likely `classified_file_type` using the `FILE_TYPE_DEFINITIONS`. Pay attention to filename suffixes, keywords, and extensions. Use `FILE_IGNORE` for files like `Thumbs.db` or `.DS_Store`. Use `EXTRA` for previews, metadata, or unidentifiable maps.\\n * For EACH file, propose a logical `proposed_asset_group_name` (string). This name should represent the asset the file likely belongs to, based on common base names (e.g., `WoodFloor01` from `WoodFloor01_col.png`, `WoodFloor01_nrm.png`) or directory structure (e.g., `SciFi_Drone` for files within that folder).\\n * Files that seem to be standalone utility maps (like `scratches.png`, `FlowMap.tif`) should get a unique group name derived from their filename (e.g., `Scratches`, `FlowMap`).\\n * If a file doesn't seem to belong to any logical group (e.g., a stray readme file in the root), you can propose `null` or a generic name like `Miscellaneous`.\\n * Be consistent with the proposed names for files belonging to the same logical asset.\\n * Populate the `individual_file_analysis` array with one object for *every* file in the input list, containing `relative_file_path`, `classified_file_type`, and `proposed_asset_group_name`.\\n\\n2. **Asset Group Classification:**\\n * Collect all unique, non-null `proposed_asset_group_name` values generated in the previous step.\\n * For EACH unique group name, determine the overall `asset_type` (using `ASSET_TYPE_DEFINITIONS`) based on the types of files assigned to that group name in the `individual_file_analysis`.\\n * Example: If files proposed as `AssetGroup1` include `MAP_COL`, `MAP_NRM`, `MAP_ROUGH`, classify `AssetGroup1` as `Surface`.\\n * Example: If files proposed as `AssetGroup2` include `MODEL` and texture maps, classify `AssetGroup2` as `Model`.\\n * Example: If `AssetGroup3` only has one file classified as `MAP_IMPERFECTION`, classify `AssetGroup3` as `UtilityMap`.\\n * Populate the `asset_group_classifications` dictionary, mapping each unique `proposed_asset_group_name` to its determined `asset_type`.\\n\\nInput File List:\\n\\ntext\\n{FILE_LIST}\\n\\n\\nOutput Format:\\n\\nYour response MUST be ONLY a single JSON object. You MAY include comments (using // or /* */) within the JSON structure for clarification if needed, but the core structure must be valid JSON. Do NOT include any text, explanations, or introductory phrases before or after the JSON object itself. Ensure all strings are correctly quoted and escaped.\\n\\nCRITICAL: The output JSON structure must strictly adhere to the following format:\\n\\n```json\\n{{\\n \"individual_file_analysis\": [\\n {{\\n // Optional comment about this file\\n \"relative_file_path\": \"string\", // Exact relative path from the input list\\n \"classified_file_type\": \"string\", // Key from FILE_TYPE_DEFINITIONS\\n \"proposed_asset_group_name\": \"string_or_null\" // Your suggested group name for this file\\n }}\\n // ... one object for EVERY file in the input list\\n ],\\n \"asset_group_classifications\": {{\\n // Dictionary mapping unique proposed group names to asset types\\n \"ProposedGroupName1\": \"string\", // Key: proposed_asset_group_name, Value: Key from ASSET_TYPE_DEFINITIONS\\n \"ProposedGroupName2\": \"string\"\\n // ... one entry for each unique, non-null proposed_asset_group_name\\n }}\\n}}\\n```\\n\\nExamples:\\n\\nHere are examples of input file lists and the desired JSON output, illustrating the two-part structure:\\n\\njson\\n[\\n {EXAMPLE_INPUT_OUTPUT_PAIRS}\\n]\\n\\n\\nNow, process the provided FILE_LIST and generate ONLY the JSON output according to these instructions. Remember to include an entry in `individual_file_analysis` for every single input file path." +} \ No newline at end of file diff --git a/user_data/config/suppliers.json b/user_data/config/suppliers.json new file mode 100644 index 0000000..a10affa --- /dev/null +++ b/user_data/config/suppliers.json @@ -0,0 +1,11 @@ +{ + "Dimensiva": { + "normal_map_type": "OpenGL" + }, + "Dinesen": { + "normal_map_type": "OpenGL" + }, + "Poliigon": { + "normal_map_type": "OpenGL" + } +} \ No newline at end of file diff --git a/user_data/user_settings.json b/user_data/user_settings.json new file mode 100644 index 0000000..c7ef755 --- /dev/null +++ b/user_data/user_settings.json @@ -0,0 +1,8 @@ +{ + "OUTPUT_BASE_DIR": "G:/02 Content/10-19 Content/13 Textures Power of Two/TestOutput", + "OUTPUT_DIRECTORY_PATTERN": "[supplier]/[asset_category]/[asset_name]", + "OUTPUT_FORMAT_16BIT_PRIMARY": "png", + "OUTPUT_FORMAT_8BIT": "png", + "RESOLUTION_THRESHOLD_FOR_JPG": 4096, + "general_settings": {} +} \ No newline at end of file diff --git a/utils/path_utils.py b/utils/path_utils.py index 5b86194..c711ccc 100644 --- a/utils/path_utils.py +++ b/utils/path_utils.py @@ -9,6 +9,7 @@ from typing import Optional, Dict logger = logging.getLogger(__name__) def generate_path_from_pattern(pattern_string: str, token_data: dict) -> str: + logger.debug(f"generate_path_from_pattern called with pattern: '{pattern_string}', token_data keys: {list(token_data.keys())}") """ Generates a file path by replacing tokens in a pattern string with values from the provided token_data dictionary. @@ -54,7 +55,8 @@ def generate_path_from_pattern(pattern_string: str, token_data: dict) -> str: # Add variations like #### for IncrementingValue known_tokens_lc = { 'assettype', 'supplier', 'assetname', 'resolution', 'ext', - 'incrementingvalue', '####', 'date', 'time', 'sha5', 'applicationpath' + 'incrementingvalue', '####', 'date', 'time', 'sha5', 'applicationpath', + 'asset_category' } output_path = pattern_string