diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bdf88c5..cb7551bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,12 +8,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased ### Added -- `leave_one_out_mask` function (`rectools.models.nn.transformers.utils.leave_one_out_mask`) for applying leave-one-out validation during transformer models training ([#292](https://github.com/MobileTeleSystems/RecTools/pull/292)) - +- HSTU Model from "Actions Speak Louder then Words..." implemented in the class `HSTUModel` ([#290](https://github.com/MobileTeleSystems/RecTools/pull/290)) +- `leave_one_out_mask` function (`rectools.models.nn.transformers.utils.leave_one_out_mask`) for applying leave-one-out validation during transformer models training.([#292](https://github.com/MobileTeleSystems/RecTools/pull/292)) +- `logits_t` argument to `TransformerLightningModuleBase`. It is used to scale logits when computing the loss. ([#290](https://github.com/MobileTeleSystems/RecTools/pull/290)) +- `use_scale_factor` argument to `LearnableInversePositionalEncoding`. It scales embeddings by the square root of their dimension — following the original approach from the "Attention Is All You Need" ([#290](https://github.com/MobileTeleSystems/RecTools/pull/290)) +- Optional `context` argument to `recommend` method of models and `get_context` function to `rectools.dataset.context.py` ([#290](https://github.com/MobileTeleSystems/RecTools/pull/290)) ### Fixed +- [Breaking] Corrected computation of `cosine` distance in `DistanceSimilarityModule`([#290](https://github.com/MobileTeleSystems/RecTools/pull/290)) - Installation issue with `cupy` extra on macOS ([#293](https://github.com/MobileTeleSystems/RecTools/pull/293)) - `torch.dtype object has no attribute 'kind'` error in `TorchRanker` ([#293](https://github.com/MobileTeleSystems/RecTools/pull/293)) - +### Removed +- [Breaking] `Dropout` module from `IdEmbeddingsItemNet`. This changes model behaviour during training, so model results starting from this release might slightly differ from previous RecTools versions even when the random seed is fixed.([#290](https://github.com/MobileTeleSystems/RecTools/pull/290)) ## [0.15.0] - 17.07.2025 @@ -24,7 +29,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - [Breaking] Now `LastNSplitter` guarantees taking the last ordered interaction in dataframe in case of identical timestamps ([#288](https://github.com/MobileTeleSystems/RecTools/pull/288)) - ## [0.14.0] - 16.05.2025 ### Added @@ -33,7 +37,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `map_location` and `model_params_update` arguments for the function `load_from_checkpoint` for Transformer-based models. Use `map_location` to explicitly specify the computing new device and `model_params_update` to update original model parameters (e.g. remove training-specific parameters that are not needed anymore) ([#281](https://github.com/MobileTeleSystems/RecTools/pull/281)) - `get_val_mask_func_kwargs` and `get_trainer_func_kwargs` arguments for Transformer-based models to allow keyword arguments in custom functions used for model training. ([#280](https://github.com/MobileTeleSystems/RecTools/pull/280)) - ## [0.13.0] - 10.04.2025 ### Added @@ -53,7 +56,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Interactions extra columns are not dropped in `Dataset.filter_interactions` method [#267](https://github.com/MobileTeleSystems/RecTools/pull/267) - ## [0.11.0] - 17.02.2025 ### Added @@ -68,14 +70,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `ImplicitRanker` `rank` method compatible with `Ranker` protocol. `use_gpu` and `num_threads` params moved from `rank` method to `__init__`. [#251](https://github.com/MobileTeleSystems/RecTools/pull/251) - ## [0.10.0] - 16.01.2025 ### Added - `ImplicitBPRWrapperModel` model with algorithm description in extended baselines tutorial ([#232](https://github.com/MobileTeleSystems/RecTools/pull/232), [#239](https://github.com/MobileTeleSystems/RecTools/pull/239)) - All vector models and `EASEModel` support for enabling ranking on GPU and selecting number of threads for CPU ranking. Added `recommend_n_threads` and `recommend_use_gpu_ranking` parameters to `EASEModel`, `ImplicitALSWrapperModel`, `ImplicitBPRWrapperModel`, `PureSVDModel` and `DSSMModel`. Added `recommend_use_gpu_ranking` to `LightFMWrapperModel`. GPU and CPU ranking may provide different ordering of items with identical scores in recommendation table, so this could change ordering items in recommendations since GPU ranking is now used as a default one. ([#218](https://github.com/MobileTeleSystems/RecTools/pull/218)) - ## [0.9.0] - 11.12.2024 ### Added @@ -115,7 +115,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed - [Breaking] `assume_external_ids` parameter in `recommend` and `recommend_to_items` model methods ([#177](https://github.com/MobileTeleSystems/RecTools/pull/177)) - ## [0.7.0] - 29.07.2024 ### Added diff --git a/README.md b/README.md index 740630fe..b383177b 100644 --- a/README.md +++ b/README.md @@ -24,17 +24,16 @@ RecTools is an easy-to-use Python library which makes the process of building recommender systems easier and faster than ever before. -## ✨ Highlights: Transformer models released! ✨ +## ✨ Highlights: HSTU model released! ✨ -**BERT4Rec and SASRec are now available in RecTools:** +**HSTU arhictecture from ["Actions speak louder then words..."](https://arxiv.org/abs/2402.17152) is now available in RecTools as `HSTUModel`:** - Fully compatible with our `fit` / `recommend` paradigm and require NO special data processing -- Explicitly described in our [Transformers Theory & Practice Tutorial](examples/tutorials/transformers_tutorial.ipynb): loss options, item embedding options, category features utilization and more! +- Supports context-aware recommendations in case Relative Time Bias is enabled +- Supports all loss options, item embedding options, category features utilization and other common modular functionality of RecTools transformer models +- In [HSTU tutorial](examples/tutorials/transformers_HSTU_tutorial.ipynb) we show that original metrics reported for HSTU on public Movielens datasets may actually be **underestimated** - Configurable, customizable, callback-friendly, checkpoints-included, logs-out-of-the-box, custom-validation-ready, multi-gpu-compatible! See [Transformers Advanced Training User Guide](examples/tutorials/transformers_advanced_training_guide.ipynb) and [Transformers Customization Guide](examples/tutorials/transformers_customization_guide.ipynb) -- Public benchmarks which compare RecTools models to other open-source implementations following BERT4Rec replicability paper show that RecTools implementations achieve highest scores on multiple datasets: [Performance on public transformers benchmarks](https://github.com/blondered/bert4rec_repro?tab=readme-ov-file#rectools-transformers-benchmark-results) - - - +Plase note that we always compare the quality of our implementations to academic papers results. [Public benchmarks for transformer models SASRec and BERT4Rec](https://github.com/blondered/bert4rec_repro?tab=readme-ov-file#rectools-transformers-benchmark-results) show that RecTools implementations achieve highest scores on multiple datasets compared to other published results. ## Get started @@ -48,11 +47,10 @@ unzip ml-1m.zip ```python import pandas as pd -from implicit.nearest_neighbours import TFIDFRecommender from rectools import Columns from rectools.dataset import Dataset -from rectools.models import ImplicitItemKNNWrapperModel +from rectools.models import SASRecModel # Read the data ratings = pd.read_csv( @@ -67,7 +65,7 @@ ratings = pd.read_csv( dataset = Dataset.construct(ratings) # Fit model -model = ImplicitItemKNNWrapperModel(TFIDFRecommender(K=10)) +model = SASRecModel(n_factors=64, epochs=100, loss="sampled_softmax") model.fit(dataset) # Make recommendations @@ -105,22 +103,22 @@ pip install rectools[all] ## Recommender Models The table below lists recommender models that are available in RecTools. -See [recommender baselines extended tutorial](https://github.com/MobileTeleSystems/RecTools/blob/main/examples/tutorials/baselines_extended_tutorial.ipynb) for deep dive into theory & practice of our supported models. - -| Model | Type | Description (🎏 for user/item features, 🔆 for warm inference, ❄️ for cold inference support) | Tutorials & Benchmarks | -|----|----|---------|--------| -| SASRec | Neural Network | `rectools.models.SASRecModel` - Transformer-based sequential model with unidirectional attention mechanism and "Shifted Sequence" training objective
🎏| 📕 [Transformers Theory & Practice](examples/tutorials/transformers_tutorial.ipynb)
📗 [Advanced training guide](examples/tutorials/transformers_advanced_training_guide.ipynb)
📘 [Customization guide](examples/tutorials/transformers_customization_guide.ipynb)
🚀 [Top performance on public benchmarks](https://github.com/blondered/bert4rec_repro?tab=readme-ov-file#rectools-transformers-benchmark-results) | -| BERT4Rec | Neural Network | `rectools.models.BERT4RecModel` - Transformer-based sequential model with bidirectional attention mechanism and "MLM" (masked item) training objective
🎏| 📕 [Transformers Theory & Practice](examples/tutorials/transformers_tutorial.ipynb)
📗 [Advanced training guide](examples/tutorials/transformers_advanced_training_guide.ipynb)
📘 [Customization guide](examples/tutorials/transformers_customization_guide.ipynb)
🚀 [Top performance on public benchmarks](https://github.com/blondered/bert4rec_repro?tab=readme-ov-file#rectools-transformers-benchmark-results) | -| [implicit](https://github.com/benfred/implicit) ALS Wrapper | Matrix Factorization | `rectools.models.ImplicitALSWrapperModel` - Alternating Least Squares Matrix Factorizattion algorithm for implicit feedback.
🎏| 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#Implicit-ALS)
🚀 [50% boost to metrics with user & item features](examples/5_benchmark_iALS_with_features.ipynb) | -| [implicit](https://github.com/benfred/implicit) BPR-MF Wrapper | Matrix Factorization | `rectools.models.ImplicitBPRWrapperModel` - Bayesian Personalized Ranking Matrix Factorization algorithm. | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#Bayesian-Personalized-Ranking-Matrix-Factorization-(BPR-MF)) | + +| Model | Type | Description (🎏 for user/item features, 🔆 for warm inference, ❄️ for cold inference support) | Tutorials & Benchmarks | +|---------------------|----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------| +| HSTU | Neural Network | `rectools.models.HSTUModel` - Sequential model with unidirectional pointwise aggregated attention mechanism, incorporating relative attention bias from positional and temporal information, introduced in ["Actions speak louder then words..."](https://arxiv.org/pdf/2402.17152), combined with "Shifted Sequence" training objective as in original public benchmarks
🎏 | 📓 [HSTU Theory & Practice](examples/tutorials/transformers_HSTU_tutorial.ipynb)
📕 [Transformers Theory & Practice](examples/tutorials/transformers_tutorial.ipynb)
📗 [Advanced training guide](examples/tutorials/transformers_advanced_training_guide.ipynb)
🚀 [Top performance on public datasets](examples/tutorials/transformers_HSTU_tutorial.ipynb) +| SASRec | Neural Network | `rectools.models.SASRecModel` - Transformer-based sequential model with unidirectional attention mechanism and "Shifted Sequence" training objective
🎏 | 📕 [Transformers Theory & Practice](examples/tutorials/transformers_tutorial.ipynb)
📗 [Advanced training guide](examples/tutorials/transformers_advanced_training_guide.ipynb)
📘 [Customization guide](examples/tutorials/transformers_customization_guide.ipynb)
🚀 [Top performance on public benchmarks](https://github.com/blondered/bert4rec_repro?tab=readme-ov-file#rectools-transformers-benchmark-results) | +| BERT4Rec | Neural Network | `rectools.models.BERT4RecModel` - Transformer-based sequential model with bidirectional attention mechanism and "MLM" (masked item) training objective
🎏 | 📕 [Transformers Theory & Practice](examples/tutorials/transformers_tutorial.ipynb)
📗 [Advanced training guide](examples/tutorials/transformers_advanced_training_guide.ipynb)
📘 [Customization guide](examples/tutorials/transformers_customization_guide.ipynb)
🚀 [Top performance on public benchmarks](https://github.com/blondered/bert4rec_repro?tab=readme-ov-file#rectools-transformers-benchmark-results) | +| [implicit](https://github.com/benfred/implicit) ALS Wrapper | Matrix Factorization | `rectools.models.ImplicitALSWrapperModel` - Alternating Least Squares Matrix Factorizattion algorithm for implicit feedback.
🎏 | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#Implicit-ALS)
🚀 [50% boost to metrics with user & item features](examples/5_benchmark_iALS_with_features.ipynb) | +| [implicit](https://github.com/benfred/implicit) BPR-MF Wrapper | Matrix Factorization | `rectools.models.ImplicitBPRWrapperModel` - Bayesian Personalized Ranking Matrix Factorization algorithm. | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#Bayesian-Personalized-Ranking-Matrix-Factorization-(BPR-MF)) | | [implicit](https://github.com/benfred/implicit) ItemKNN Wrapper | Nearest Neighbours | `rectools.models.ImplicitItemKNNWrapperModel` - Algorithm that calculates item-item similarity matrix using distances between item vectors in user-item interactions matrix | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#ItemKNN) | -| [LightFM](https://github.com/lyst/lightfm) Wrapper | Matrix Factorization | `rectools.models.LightFMWrapperModel` - Hybrid matrix factorization algorithm which utilises user and item features and supports a variety of losses.
🎏 🔆 ❄️| 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#LightFM)
🚀 [10-25 times faster inference with RecTools](examples/6_benchmark_lightfm_inference.ipynb)| -| EASE | Linear Autoencoder | `rectools.models.EASEModel` - Embarassingly Shallow Autoencoders implementation that explicitly calculates dense item-item similarity matrix | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#EASE) | -| PureSVD | Matrix Factorization | `rectools.models.PureSVDModel` - Truncated Singular Value Decomposition of user-item interactions matrix | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#PureSVD) | -| DSSM | Neural Network | `rectools.models.DSSMModel` - Two-tower Neural model that learns user and item embeddings utilising their explicit features and learning on triplet loss.
🎏 🔆 | - | -| Popular | Heuristic | `rectools.models.PopularModel` - Classic baseline which computes popularity of items and also accepts params like time window and type of popularity computation.
❄️| - | -| Popular in Category | Heuristic | `rectools.models.PopularInCategoryModel` - Model that computes poularity within category and applies mixing strategy to increase Diversity.
❄️| - | -| Random | Heuristic | `rectools.models.RandomModel` - Simple random algorithm useful to benchmark Novelty, Coverage, etc.
❄️| - | +| [LightFM](https://github.com/lyst/lightfm) Wrapper | Matrix Factorization | `rectools.models.LightFMWrapperModel` - Hybrid matrix factorization algorithm which utilises user and item features and supports a variety of losses.
🎏 🔆 ❄️ | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#LightFM)
🚀 [10-25 times faster inference with RecTools](examples/6_benchmark_lightfm_inference.ipynb)| +| EASE | Linear Autoencoder | `rectools.models.EASEModel` - Embarassingly Shallow Autoencoders implementation that explicitly calculates dense item-item similarity matrix | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#EASE) | +| PureSVD | Matrix Factorization | `rectools.models.PureSVDModel` - Truncated Singular Value Decomposition of user-item interactions matrix | 📙 [Theory & Practice](https://rectools.readthedocs.io/en/latest/examples/tutorials/baselines_extended_tutorial.html#PureSVD) | +| DSSM | Neural Network | `rectools.models.DSSMModel` - Two-tower Neural model that learns user and item embeddings utilising their explicit features and learning on triplet loss.
🎏 🔆 | - | +| Popular | Heuristic | `rectools.models.PopularModel` - Classic baseline which computes popularity of items and also accepts params like time window and type of popularity computation.
❄️ | - | +| Popular in Category | Heuristic | `rectools.models.PopularInCategoryModel` - Model that computes poularity within category and applies mixing strategy to increase Diversity.
❄️ | - | +| Random | Heuristic | `rectools.models.RandomModel` - Simple random algorithm useful to benchmark Novelty, Coverage, etc.
❄️ | - | - All of the models follow the same interface. **No exceptions** - No need for manual creation of sparse matrixes, torch dataloaders or mapping ids. Preparing data for models is as simple as `dataset = Dataset.construct(interactions_df)` @@ -215,6 +213,7 @@ make clean - [Grigoriy Gusarov](https://github.com/Gooogr) - [Aki Ariga](https://github.com/chezou) - [Nikolay Undalov](https://github.com/nsundalov) +- [Aleksey Kuzin](https://github.com/teodor-r) Previous contributors: [Ildar Safilo](https://github.com/irsafilo) [ex-Maintainer], [Daniil Potapov](https://github.com/sharthZ23) [ex-Maintainer], [Alexander Butenko](https://github.com/iomallach), [Igor Belkov](https://github.com/OzmundSedler), [Artem Senin](https://github.com/artemseninhse), [Mikhail Khasykov](https://github.com/mkhasykov), [Julia Karamnova](https://github.com/JuliaKup), [Maxim Lukin](https://github.com/groundmax), [Yuri Ulianov](https://github.com/yukeeul), [Egor Kratkov](https://github.com/jegorus), [Azat Sibagatulin](https://github.com/azatnv), [Vadim Vetrov](https://github.com/Waujito) diff --git a/examples/tutorials/transformers_HSTU_tutorial.ipynb b/examples/tutorials/transformers_HSTU_tutorial.ipynb new file mode 100644 index 00000000..4e52099a --- /dev/null +++ b/examples/tutorials/transformers_HSTU_tutorial.ipynb @@ -0,0 +1,1303 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Transformers HSTU tutorial\n", + "This tutorial tells about *Hierarchical Sequential Transduction Unit* *(HSTU)* - sequentual transduction architecture proposed in paper [Actions Speak Louder than Words: Trillion-Parameter Sequential Transducers\n", + "for Generative Recommendations](https://arxiv.org/abs/2402.17152).\n", + "\n", + "RecTools implementation of HSTU is fully compatible with our `fit` / `recommend` paradigm, requires NO special data processing and is widely customizable.\n", + "\n", + "The important part of current tutorial is the fact that **HSTU metrics on public datasets from the original paper may be underestimated**. We show the actual metrics in the common academic leave-one-out setup below, using the stable sorting algorithm for interactions.\n", + "\n", + "### Table of Contents\n", + "\n", + "* HSTU architecture\n", + "* Rectools implementation of HSTU model\n", + "* Results on Movielens datasets\n", + "* Ablation study for Relative Attention Bias\n", + "* Context-aware recommendations for HSTU model\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## HSTU architecture" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "HSTU is a sequentual transduction architecture challenging recommendation systems problems. We make short overview." + ] + }, + { + "attachments": { + "495d54e1-0c6c-4d9e-85eb-39affd6c920b.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaIAAAPuCAYAAABKDhlRAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAP+lSURBVHhe7N11WBTbG8Dx7wYlIiCi2N3dnddW7O7u7u6Oa11/dncX1rUbG7vFFhURFZHY3fP7Q/HCsMCCKOH5PM88j847s+zOzpx33jNnZlWfPn0SSJIkSVIMUX358kUmIkmSJCnGqPz8/GQikiRJkmKMKiAgQCYiSZIkKcaoAgMDZSKSJEmSYoxKp9PJRCRJkiTFGJVer5eJSJIkSYoxKoPBIBORJEmSFGPUyhmSJEmS9DvJRCRJkiTFKJUQQnbNSZIkSTFGVkSSJElSjJKJSPpjfPz4EX9/f+VsSZJimExE0h9j1qxZLF++XDlbkqQYJq8RSX8Eb29v0qVLh42NDQ8fPsTCwkK5iCRJMURWRNIfYfbs2Xz8+JEXL17IqkiSYhlZEUnxXlA19PHjRwBSpUolqyJJikVkRSTFe0HVUBBZFUlS7CIrIileU1ZDQWRVJEmxh6yIpHhNWQ0FkVWRJMUesiKS4q2wqqEgsiqSpNhBVkRSvBVWNRREVkWSFDvIikiKlyKqhoLIqkiSYp6siKR4adasWREmIWRVJEmxgqyIpHjnw4cPpEuXjk+fPilDRsmqSJJilqyIpHhn9uzZJichZFUkSTFOVkRSvBLZaiiIrIokKebIikiKVyJbDQWRVZEkxRxZEUnxhsFgoEuXLmEOUti6dSuWlpbUrFlTGQIgderUzJgxQzlbkqRfTCYi6Y9hZWVF0qRJefr0qTIkSVIMkl1zkiRJUoySiUiSJEmKUTIRSZIkSTFKXiOS/hiWlpbY2dmxa9cuZUiSpJ+QPHly0qRJo5xtMpmIpD+GWq1G7u6SFP1sbGx4/vw5tra2ypBJZCKS/hjm5uaYm5vToEEDZUiSpChatWoVAPfv3ydz5szKsElkIpL+GHL4tiRFP2dnZ1xcXH4qEcnBCpIkSVKMkolIkiRJilEyEUmSJEkxSiYiSZIkKUbJRCRJkiTFKJmIJEmSpBglE5EkSZIUo2QikiRJkmKUTESSJElSjJKJSJIkSYpRMhFJkiRJMUomIkmSJClGyUQkSZIkxSiZiCRJkqQYJRORJEmSFKNkIpIkSZJilPxhvDhCp9ORPXt23N3dlSHJRHq9Xjkr2qhUKtRqeV4XHdRqNX379mXq1KnKkBQLRccP48lEFEd07tyZxYsXA2BpaakMSyYICAjAYDAoZ0cLrVaLVqtVzpYiyWAwEBAQgFqt5unTp6RKlUq5iBTLyET0h/D19cXW1hadTseVK1fInz+/chFJijd69OjB/PnzKVOmDCdOnFCGpVgmOhKR7EuIA9q1a4dOp6NRo0YyCUnx3ogRI7CysuLUqVPcu3dPGZbiIZmIYjlPT0+2bNmCWq1m/PjxyrAkxTtOTk707t0bIQTNmjVThqV4SCaiWK5ly5YYDAbatm1LlixZlGFJipcGDRqEra0tV65c4eLFi8qwFM/IRBSLPXv2jIMHD2Jubs7o0aOVYUmKt+zt7Rk0aBB8PxmT4jeZiGKxZs2aIYSgW7dupE6dWhmWpHitd+/eJE2alHv37nHo0CFlWIpHZCKKpW7dusXZs2extrZm2LBhyrAkxXvW1taMGDECgPbt2yvDUjwiE1Es1bx5c4QQ9O3bF0dHR2VYkv4InTt3Jk2aNDx//pzNmzcrw1I8IRNRLHTu3DmuXbuGvb09AwYMUIYl6Y9hbm7O2LFjAejZs6cyLMUTMhHFQq1atQJgyJAh2NraKsOS9Edp2bIl2bJl4+3btyxYsEAZluIBmYhimX379vHw4UOSJ08uzwDjE5+nuLpsZPWq9bhcfaOMSuHQaDRMmDABgKFDhyrDUjwgE1Es06lTJwBGjhyJlZWVMhzzAl5z8+xpTp+5xOOPETy3zfc5186e5sy5O7w18rxR3ZtbnD1zlpuvA/B5cpUzp09zxvUe78N9WT1vbp/lzOkznL//jnd3z3Hm7HVe+imXiy0MvD4wjPJZs1DCuSmt2zSnwbDdyoVMEnx7/Qz9u7ucO3OW67F3o4VSv359ChUqxMePH38kJSkeEVKssXbtWgGI9OnTi4CAAGU4dtDdFtNKWQuVykxkH3hGfFXGf9CJW1NKiAQqtUhcc4l4qleEP50UQwpYC7P0rcTWV3rhd3G0KGilEmiSi8YbXgvl4kF09+aKinZqoTLLIrr9+0F4Heotclqaiyyddos3Ya0Ug3SPF4rqidVCZZ5WVO73t1i2YrGYte68crGIKbbXT/E6JHrntBTmWTqJ3bFxo4Xh4MGDAhBWVlZCr4877zu+q1mzpgDE/fv3lSGTyUQUizg4OAhArFmzRhmKVbz3dRTpNAh14tpi+UvjDYLec6tokUIjVOZ5xLDzforoJ3G8bw5hrk0v2u95/z3p+IiTA3IKc5VKmGXuLg59UqwihBD6F2JV3aRCrdKKdO12CU+9+LbewFzCQptGtNr2JswEFjN04s7EIsIMjUjdYa/4rAybzNj2+jk+JweKXBZakabVtliZwMNSrlw5AYi+ffsqQ1IMkYkoHpk7d64ARK5cuWL/2Z7ugZhd3kaoVGYi5+BzQplmhPAXV0YVFBYqjUjedFOohi7w+nhRxEojHOuuFiFO7j/sF10ymQmVykoUGnNF8bp68XZHG5FGg9CkbCY2vw624oc9on0ajTDL0lsc9wm+Tkz7Kva0dRJqLETVxZ7KoMnC3F4/5YPY0z6N0JhlEb1j10YL15kzZwQgzM3Nhb+/vzIsxQCZiOIRGxsbAYidO3cqQ7HS58PdREYtQu1QV6xStI76V6tFPUe1UCUoISbfDAwRE8Jb7GiVQmjMcouhF5QNiV682dpSpNIg1HZVxPxHuv9Cn46InlnMhEqdTNRb9UxRFejE3WmlhJXaVlRbpIzFpK9ie/PEQo2FqLUyqvVQeNvr5+juThOlrNTCttoi8Sz2bLQIBTV8bdu2VYakGCATUTwxevRoAYiiRYsqQ7GXzl38r4qdUKvMRO6h54NVL1/F2UE5hZlKI9J12ie8Q6wkhN5jhahtpxaWpWeIB8HyzH8LPBOr6iUTajQiZfMt36upr+L8iPzCUqUWDtUXieD56cdqr5eLWnZqYVF8srhjJP57BYqXV4+IQ4f2ivGVbIUKM1FymIs4dOiQOHT4tLjrZXqrH+H2+hn612J5LTuhtiguJsf8RjPZtWvXBCA0Go34/DmqCV6KLjIRxQN6vV5YWVkJQBw5ckQZjtW+nOgjspqphNqxvljzvatM/2SRqG6nFmq7ymL+49CNm+fqusJObSFKTX8oQke/0T2cLyrbq4XKLKvoc/yz8L85TZS2UQm1XQUx+24Ya+nfiGXOiYTKvKSYFu0tdmR5iSXVLAQQetKkFz2Ohu7MDIsp2yvq9OLNMmeRSGUuSk578Ate/9dp2rSpAES9evWUIek3i45EJH+hNYb16tWLefPm8ddff3H48GFlOHYzPGdp7bx03vuFPMPPcH58dk73zE+V+U/I0v8Yl6eXJOSPmvuzv2NGnFclZvDZK0wsFNZPa+u4ObU8JYaegbLDGWi7kDG7/Sk++QxHB+fGXLk4AHrcZ5Yj68CrVF32jN1tEysXMM7wmvM7j3D/iymHgYbUpRpTLr1GGVDw5/rmuex95M/9bVNYdTmAHE1G0DyPGajtKNS0E5XSRPQaRGJ7RZ3efSblsg7katVlPNvdFhO3Wox7+PAh2bJlQwjB69evSZo0qXIR6TeJjl9olRVRDPr69aswMzMTgDh/PgpDemOBr2cHiZxmKqFO2lisOz9LlLdRCXXS+mJt8MEEQXT3xORiZkJt30Rsiej6+NcLYlRBK6FSqYRKpRIJCo0WFyMoJPwOdxNpNVqRqfcJYfLVFL8DolMqTejKxehkIWqv/qJ8hXD85DWiyGyvqPI7LLql1Qhtpt7ihMkbLXbo1KmTAETFihWVIek3io6KSN7QGoM6depEYGAgderUoUiRIspwnGBZtA+DajrAu92MbD6DUz4WFOg+ksZORnYt3TOevjKgSZmetBbKoIJlfho450CLQGBGztoNyR/BOtp06Uil1vP62TP8lcGwmBWi1xoX9u3bZ8K0i9F/RfAmIkPvxe2Da1kw+2/mLt/N1TeKG1Ujs72iSpuOdKnU6F8/45nJGy12GDVqFBYWFhw5cgR3d3dlWIpLlJlJ+j0+fvwoNBqNUKlU4ubNm8pwnOJ/YYTIZ64SgNCkbit2eSmX+O7LFtHETiXMSk4TDyO4IKG7N09UslcLtX1y4WSpEmrHWmKpewQrfVgmalggzMvPES+MFGS/XzgVkc9pMbako0iYIp+oUKOaKJ3VQZgnLiZGHAu28SKxvaLug1hWw0JgXl7MiR0bLVL69esniGsDfeIZWRHFYa1atUKv19OiRQty5sypDMcp5gV70L2iNSrMyNu+L9XtlUsECSAgEFTmFpirlLFg9PdZ2HM0R7wtKdR3Mwuap0b1bi+jBm/iVXiP/zE3x1ytQgQG4G/KJZ8YZPB5wtei/+Pqo6sccdnHyZsX+KfkI2YOW8TdH49DMnF7/RRzzM3VqEQgAbF9oxkxdOhQEiZMyIULF7h+/boyLMURMhHFgFevXrFnzx60Wu2PR9zHaWpbHOzNUaHC1s4u7J1KbYGluQrh95WvYbZ5eh4u6sWowx8wy9WDmf1KUWv0WGo5Cl5tG8LQnW8JMxf5feWrQaCysMLK1IZb/5LTG5ayZMkSE6blHHpo5KF5UaBO1pzJMxuQKWg0hzYD9WsVQjy4zd3AoIVM2V4/y4+vXw0IlQVWJm+02CNJkiT0798fIQTNmzdXhqW4QlkiSb9e+fLlBSC6deumDMVRQV1Q5qL87HBuKPU/IXpn0gpt5r7iVBgXxnUP/yeqOqiFyiyz6PZv0F1IOnF3Vnlhq1YJbcZOYl8YXX+6m+NEITOVsG20SZg8pCDWDFbQibuTiwnLzH3EyaBtY8L2+mm6m2JcITOhsm0kNkXmo8Uinz59+vF4rBMnTijD0i8mu+bioAcPHnD8+HGsrKwYOXKkMhy/adOTIbUa/atHPPRRBgH9I5b0HMm/XipSN5/GmL+CfotJQ9au0+id3xL94xX0G3uMz4pVAQIfPuKZXkuqjOnDGOJthFkR+m8+wrFjx0yY/mVC5ZAD0qPNh2PMW3mddM71KRz05iPaXtEh8CGPnunRpspIepM3WuxiY2Pz4+ch2rRpowxLcYEyM0m/VqFChQQgBg8erAzFYSZWRMJfnOyTWWg1aUW3w8qx2DrxaGF1kUSN0CRvKNYaeZjqp6O9RFYzlVBZ5BVDzihP3wPFlRF5hJk6sWi6JaLq43cxrSLSvT4iRpVLJhIXHyVOfggeCW97CaF7e10cPXJNvAk+kEH3Vlw/ekRcCz7T2LzvAq+MEHnM1CJx0y0/8VDWmPf161eRMmVKQRx6TFZ8ER0VkUxEv9HFixcFIBIlSiS8vMLoX4qTTE1EQnxxaS9SarQi+8BzIe710T1aJGokUQvUDqL6wsfG7/LXvxXbW6UWGlQiQeEx4lLwtll3V0wubi5UNjXFMuVTVmNMRIlIL96enCJqpksssjWZLy4qn4cUzvYS/ufE0NwWQqUyF9kGnAqaKc4NzS0sVCphnm3A9+48Y/OC6MTdycWFucpG1FwW255cHnmLFi0SgEiePLkyJP1C0ZGIZNfcbxT0E+ADBw7E3j7MoWXxWoJyDaieUvBg50Zcg36XTe/O8t4j2O8JtmWGMaN9eow+d0DtSO3xY6npqML30kz6zL75I6S7tZGtl3XYVWxAjSRxYbc28HxHNyrUW4H1oH9x3dCNQkZ+Fd7o9gLAny++ekCP75f/Av5ffNEDet8v+Imw5wGgu8XGrZfR2VWkQY0kYQ8yiSPatWtHxowZef36NatWrVKGpdhMmZmkX+PIkSMCEI6Ojn/4gxoDxaWR+YS5JplotD66zsI/iQOd0wuNJp3ofCBubFvdk8WihmNq0XjdU+PV3w9hb68vj46JjRuOiofBeym/PBLHNm4QR4PPNDZPCPHpQGeRXqMR6TofiNPdcsGtX79eACJx4sTKkPSLREdFJBPRb5I2bVoBiNmzZytDfxz9262iRUqNMM89WJxVXuqJgsAbk0VJa42wr7ZQGHnOaiykFy/mVRBWKZuJFW43xc2bwadbwv19yJ/OiO7tJYQQIvCGmFzSWmjsq4mFcWOjmcRgMIg8efIIQMyYMUMZln4BmYjiiK1btwpApE6dWvj5hb7o/OfRixdrG4oUmgSi8OiL4fzcuAkC74jZf9kJjf1fYs5t5W8fxVaB4sqIvMIs1PBwBN+vs4UUjdtLCCFEoLgz+y9hp7EXf825LeLKVjPVnj17BCCsra2VIekXkIkojkiWLJkAxLJly5ShP5f+rdg/sJzIka+BmHcjqslZJx6vaiMK5SgmOm6MqIsrjouW7fWN7vEq0aZQDlGs40bxNJ5utBIlSghADB06VBmSoll0JCL5MxC/2OLFi+ncuTNZs2bl1q1baDRGL8NLkhSNTpw4Qbly5bCwsMDHxwetNvp/QkP6Jjp+BiKuD5SJ9QYPHgzA+PHjZRKSpN+kbNmyVK5cGX9/f3r27KkMS7GMTES/0JQpU/D29qZAgQI0aNBAGZYk6ReaNGkSAEuXLsXX11cZlmIRmYh+ofHjxwMwceJEVKq490BJSYrLChYsSP369dHpdLRv314ZlmIRmYh+kUGDBuHr60uZMmWoWrWqMixJ0m8wfvx41Go1W7ZswcvLSxmWYgmZiH4BnU7HnDlzIFj3gCRJv1/27Nl//PZXy5YtlWEplpCJ6Bfo2rUrAQEBVK9enZIlSyrDkiT9RmPGjMHMzIz9+/fz4sULZViKBWQiimY+Pj6sXLkSvl8bkiQpZqVNm5YuXboghKBZs2bKsBQLyEQUzdq2bYtOp6Nx48bky5dPGZYkKQYMHz6cBAkScPr0ae7cuaMMSzFM3tAajby9vX88VTt//vxRvrlLkqTot3nzZgAKFCjA5cuXlWEpiqLjhlaZiKLRrVu3yJUrl3K2JEmxSJo0aXj69KlythRFMhHFQnfu3OHGjRvK2VIs0bRpUwwGAxMnTiRTpkzKsBTPqdVqatasiaXlL/rJ9z+QTESSFAleXl44ODgA0L59e5YuXapcRJKkSIqORCQHK0h/jOB3169duxaDwRAiLklSzJCJSPojeHl5sXv37h//9/f3Z/To0SGWkSQpZshEJP0R2rdvH6oCmjlzZqh5kiT9fjIRSfGeshoK8vXrV1kVSVIsIBORFO8Zq4aCyKpIkmKeTERSvBZWNRREVkWSFPNkIpLitfCqoSCyKpKkmCUTkRRvRVQNBZFVkSTFLJmIpHjLlGooiKyKJCnmyEQkxUs6nY5z586RIEGCH1OQ4POCJpVKxfr160O8hiRJv4dMRFK8pNVq8fDw4MuXLz8mrVYLEGJe8KlFixbKl5Ek6TeQiUiSJEmKUbH2oadeXl7069cPLy8vZUiSosTFxQUhBM7OzsqQJEWJubk5kydPjvLDPuOD6HjoKSKWqlu3rgDkJCc5ySlWTyVLllQ2X3+UmjVrCkDcv39fGTJZrK2IqlatysGDBylRNA+tm9VUhiUp0t55fkCn05PcKYkyJEmRdvjYBbbsPEyuXLn+6N8gi46KKNYnopULxtC6uUxEkiTFLoePnadS7e4yEUVDIpKDFSRJkqQYJRORJEmSFKNkIpIkSZJilExEkiRJUoySiUiSJEmKUTIRSZIkSTFKJiJJkiQpRslEJEmSJMUomYgkSZKkGCUTkSRJkhSjZCKSJEmSYpRMRJIULxnw8/Lg/l13Hr76TIAyLEmxiExEYQrg1a1rnD7nxplLz/lgUMYVDB+5d9GN064PeR2fjnrde265unH2tqcy8p/PL7ns6saZC094H9F2CkHHmzvXOOP6kNcBvjy55sbpc2643vcm3JfRv+e2qxunXW9y/9177p534+zNt/gplwv2Hbo9+6oMGmX4+IJLrm6cufgULyNvQvf2EWddr3HTIxCfp3c5c86Uz63nzd1rnDnnxvkHH9F7PuGc6zWuv/JXLgj6D+F8ngjovbi0dQXdm3UgV9YKOBXsgHOrwdSoUBvHdHUo1ngC4zbcMG3/NHhz94Ibp10f4aFTBkMK2mbhvufg+5HPK666unHa9Qb3wt9w6N8+5mzQ9xH4E9tGitVkIgqL/h0b+nWmdJUOlKrYka7bPMNvHAMuMa5+R0rXmMFWz3CXjEO+cGp8b4pWH8WiB8pYED33l42iVOUOlKrSj0kXTGnlvvl8diHVy3em5YqnoNXiuXcGlat0oFSNqWx+E9Y21HN/yUhKVulAhW4uPDUz48X2SfxVtgu993kpviMVj9eOpXyVDpTpu5/XYb3kD3oerxxDqcodqDz2HJ+V4c9XGVm/NeU6buceGszen6B37Q6UqtyF7tvD3j/0D7bQolIHStcYx+rnajSaN2zq1ZXCNWew551iLY0mnM8TNv9H/9KzchMqT3JDW7wxC1128dbdhXsXNnPv7lHeXJjB2BpJuLegP3nKjWHJ9S/KlwjJ7yKj63agdI2Z7DCWkYMJdFtLw6odKNdzD+56ZZTQ+5GZN7sGdadM5faU738Ij7BeXv+U/3VoR+nKXWi34TVqs6htGyn2k4nIFAZPto7+h13KRiOe+3x6EV3+eUDSpgOZ5RzGb/joHrFu6y38zcww179gy7pLRNDEffP5MqN7r+W6Yw3mTi5PcrU5hXr3p3s2LYY3xxg17WLoRAAYXu1nyLSLfFQnp+X4Lvxll4iKo4bSM9Nrlg+Yw84Q35EZReqXJ4sGfM4cZeerCL4//TM277pJANaUb1iR1CGOji+cmDSJv28mptW0ftR1UmNRoBWzOmXA3ODJ9onLOGr0Db9l3ehlHP2oJm3T3owrZwP2RZk4uzFZnu2mx4jjvA3xtsL7PMb53thIverTuVRkCBfPzmFOz0qUymyLebBlLJNmokqrLqw7tp4NNTwYU7cP4119gi3x64TajyxyMHBKQ3KYGfDYvZAJJ4ztMQZebprHhBM+qNNUZ/rwIthFYdtIcYNMRBFRJyZr5kSIF/sZOO4sf8wPl+seMmfkNu4lKs3YkSVJHMae4n9pLxtv6bAt/xeVbAUv9+5jv7dyKSUdNxbMZeGDhDgP60r1oBe3zs/wibXJqNXxcM0//H1NUV0ZPrB7/EJ2e6pIUa83E6vZfduBrfMzbEx1Urw6yNAZV0MkQvN8VWiQUwu+bmzd+zbcs2jdnX/Z7qZDZV+UpjWThDg4dLc2MGjZU2yrdWZ8FdvvMStKD+hDuwxadI92M/Sfu4TsbDPwbt//GLnvA6rklZg2qjQOQR+1RDsmN3bk5ZZ/mHRW0W0YzudR0j8/QIdmK/HrMot/J1cgo6VyCQVNEioOn8W+AVYsajuGFY+NljDRJ4z9yLpEe2a0TIVW95zlY9ZxVdFLafA8yYgJJ3mrcqTR+G7U/LHhTN82UtwRRvMi/UdLqc4tKWWj5/G6WYw5/nvOImPaxwNrWHBVT47WbWnsFNZu8pVj64/wyJCQ8vU60qRMQnh/mrUu78Nt8Pl4mhlL76DLVoeh9UM2+HZ/dWZKg6So/e4ye8wugreTn08tZfAmD4RjWSaNrUDwt2VXuSU9imh4uG4V614E++vajDSunRUz/Di36yhPw2x3dVzbfozrOhWOlapQ0yF4zAeXuVu5rMtAh/6VSR7iDRdj7NjKpFT7c+V//7AseN/U58uMH3WA5yIxtUf3oH6y4CvaUK13I4prn7Ny1n6eKzZYmJ8nOIMHqwfN5nL5EWzsnQsbZTxMVuTtPJ5l1dwZNmQ3T8LcJj8v7P3IhsrDe9IkhZqvbusZuvoF/72NLxyfOpd1LwTJanRnSm3FPmLKtpHilLBaGOkHA6RtyJw+ubHWPWXx4GWciuppmO49V/duZ+LIaXTqOoYOfWczbulxrr41fjVY73Gfo8cucPLOBwzoeHlqGyP7j6PdgG1c9APQ8/rGRQ4fv8ItTwPoPuC2cx3DBoynQ5/ZTNl0i3fBGhnfp5dYPn023bqPpePgxSw69gLfYH/vB8N7dqw9gYdZLlq3zBaiiycE77Os3fsGYVeMhlVTU6NeMRLjw+FNh0M1rP8x8GbPHna/0VKsWW0KKF9cnZi6o7pR2xG8jy1n1J7v1wL8bjJt+A4e6G2pOqI3zVMpdl1NGlq2LEqizxdZuflZsEZNQ9Z6FSlqAX4Xj7I9rEwUcIdNu90JVCehZsMS2AYLGd4eY+W+95gVrkm7fGbBIgBqkjp3Y2KNxPDxApMmHvve1ebPhdmzWfJQT+JKXZje2CnUwabJVJ12Faz5fGIP6x4q3leYn+c/ARc3MeNSHkaOKIGj8sUjoral0pAOlLq6nv9dClRGo0cE+5HasTwTR5UlGT4cnrGQHd+72vwurWbAymfoE5dg3IRqii5S07aNFLcov2JJSQCYka/nAPrltyTgzmb6/H0zkqN2DHidX0ejovUp3HQSI+ZsZsk6F5YtW8vofgMoXLAF7dY8CpUUfA79j+q1u9Ng9mUuL+hDoVqTmbBkNytWnuDaV4CvHBjfi0q1BzH1yBWm1m9GkVazmLx4F8uWr2Vox3bkqbeWy76BPNoynqLFutB+/FoWrNnD0gWL6VKnOaVHuIYe8fXBld1nvmCWvyx10mkUwSAG3uzdx15PcPirItUSq7GvWImqDip8z+1n/YOwmodP/LvvMp/MclCrZgqMvbo6VTWmDSmKvXjH5vErOOUTyK2Fs5lzPRDb0h34u1UqI+upSVq1LKUTBnJ5/8kQF8016SvSsKgl+N9i+67nRhsu/0v/svORHk2a8jQvaxUi9uHICU580lKoejnSh/7DoHai+fiOVLQTvNq+gMlnfQm4s4kBC+4RYFuQkZNqk8HoeompUT0/CQPu4LLvleJ9hf15vgnk4q6TfKxYg7pJo3YYq5OWo2VFH1x23/41w7sj3I/UpG7cm1HlbRCvDzNi5lV8Ah4xb/gG3AISUm5QX9ob3+ARbBspronaHvwnsszJ4GlNyGvhz9X5M5hx3fRD98vFZdSsP5stD1XkadaL7Ud24vHkMM9cF7Csd1FS+D5kZa9edNxm/BqG4fUBBk6+T7pmXVm8eByLRlQie/DTS+HH2alj+Z+oxfpTLng+3sW5xc0omdiAx7GF9Bg4jeZ9jqCtN4wTbv/ieXcDu0eXJq3mC1f/9zczLoc8I/a/fJULnzVkKVmQtMbaAQDDG7ZuOs9HElO1XnHsAGyL0bCKA+qAu2zYeA+jdZ7/LU5e9kWTKT/l0oT14hoytu3D4KIJ0D3YxZhZqxg++xo+CfMwZGoDsoaxmjpxIcrm1BJ44yqnPgYPJKN+/QIkJJBLu49yP1TD5c+Zrcd5rNeQuXZVSoa4zhLAhTO3+KxJS5nSTkYS4DeaDHWZ2TcvCXVPWTZpFVPHruaMTwKK9xtA1yxhraXGoUxB8mh1uJ27SvC3THifh2/VxiW39+QpmgdrRQi+xc+tXkSv3jOYvOsxxjuUrSheNDOvrt3lVwz0NGk/0qSi06TWlEio4/7qxUyd9T+mufqSsEgbZndIF+b2DnfbSHGOTESRkKBoO+Z2zoi5702mD9rELaMtrYLuIXOGrMT1kzkFev/N0YWtqFs4FckS25E6R2HajZ/NwQlFsTO8YfO4lZwIVWoJPp6+hF/nvzk8vz0dm1SnUx9nSoZoffx4SimWr+lKg7xOOCRJSbEmfVg3vAg2+OG6ZiePS/dl59x6lMmQGIcUmXHuP5opznaodM/Yu/9BsKSh5+nNh7wVVuTMmx5t8D8TjP7hQdad9UOdrAQNywW9mQT8VbcUydU67uzYx5lQnwX0zx5w850gYfasZA/rxQG0meg9uRkFLH05MX0hu70sKNijP31yKrvGgtE4ki9XEtT+7ly7Ezy5qnGqWYkKthB47Shb7im+ON9LbNz3BoM2I40a5gjZhaR/zbU7HxAJM5A/a7hvmFxd+9I3nwU+p5cxep83lvmbM7tbplBdUsFpkmchT3I1/vfuc1N5bhPm5wF0nrz2SkiqlEbTEF/2z6NezyXMW7GR4a17MfCYkXuWgESpkmHv5UlEAwojz7T9CECboyl/d8+Gpc9lJk48wXvL7PSb2ozc4W64cLaNFOfIRBQpCSg9cACdM2v5fG4ZfZY+NdrNE1zAlX2sveKPOnllRg/M/61yCMGM7O3a0zqDBt3T42w6q2yNwGBXioE9chk/8wVAS54G9Skb/MIGalJXLk4+LaBOTqOuVRVnpXZUKJsNM3Q8efgiWNeMnmfPPDFokpI+dViNvo7rmw5yKUBN8iqV+CvhfxHrMpVwTqlG9+QIq48pOxtB9+I1rwwaUqZNjoUyqGCZtyLO2b43YWYZqF03awTraEiXJhlqvSfPnofcjmrHMjQub4tK95CdOx6HqNZ8jh3C5bUBs3wVaZJT0WTqPHj62oAmeQrShv/HwTIrDap9a3QFWnLWqEj+iNbRpiBdCjV6Dw+ehcoVYX8eACG0mIfx+r7v3uMtvv1bGHz44B1GpjHXojUY0IcRjjpT9qMgFuSvU4Yc2m894WbZy9Iwb3hZiAi3jRS3yEQUWbaFGTOlNpk0PhydMovl4Q45MvDm0i0e6cGmWHEqhDWsySIH5YrYoDZ4cfP6W2UUszz5KBXWugBYkilbqlBnneokDiQxA7TpyJcndIuVyNGehCoI8PUNlogMeH/0wUBC7O1VIZb/wf8Gq7c/JlCdDOf6BUkQPGaZn8Y1UqA1eLJ746lQw931Hz/zyQC2draE8erf6bm/bBZzrumxS+aAReAd5o7dE8EILw0OiW1Qo8P7g3JEiS3VG5TAUaXjpsthrv3IRD4c3HGGN8KCEvUrE6oXTf8Z788GSJSIxOG/YfQPttF/wT30dklwstBxecF8VoY1OCKIxhYHOxUi0Aevz8psEM7n0djhkMgXrzAe+eFQuz0T62UnfYo0lGjanQGVQ173CqL3+sQnGxvslZ/7p5mwHwXRP2XhsA1c1duQPKk5gVc3Mmyd8pqZUjjbRopzZCKKAvu/ujKzaQrUXmcYNTz00Nv/6Hn1+j0GNCRLlSycLhoNTsnsUSPwev9BEVORwCExtuF9UyotlhZGDnaVCrUaVBpzrELnIdBovyUv8X1MxncBATpQmWFhbuQ1gS/HXdjqrkdlnoC3hxYzZNS8YNMiXDwsMUfw/vB+titvmw8IJBAwt9CGm4j0D7bRc9IFvC1z0Hf1UJqnUvHuwEIGb3tn9DpaEHNzLWogMCD0WbJthcrUcFITePc4W92+d+d4nWbTYW+EdX4a1zU2eEJHQCCozM0JY3N8o3/KwoGLOOJtQaHuU1jQyAnV+9OMGnUogm4vM8zN1KiEjgD/4N/CN2F+Ho0j2TJpuHfzmdFrcWr7fPRbuYbHd7dzZlFDChktp3Xcu+GOJkM6UoX64N/2HTCgM/YHgjOIb9+JRhNi+0W0H32j5/6y6Yw+/hnLAs3ZPLsaqVXe7J0wl00RPAojzG0jxTnhNW9SWNR21Bjdh2YpVbzZO58hO8N+vEsQYQjdyARnMBgAFVozZV0DWu3v/JpUWFiaoRL+fP1q7D1/Yu/GE7wygPB7xLZ5q5g6O+Q0Y+dDfAHx+SLrtoU8s1VbWGCuAj8//xDJLwT9cxYNWsjhD1pydepLv+JlGD2sDI7Ck22j/wn3jno/P38MgIWVkTs7ExamabWkaPRP2bnzDgEYeHfgMIc+gG25qtQzdr+U2gxLcxXC3w+jmwMAPQ+XT2fUsU+Y5WjEzB75qDW0M7UcBK92zWOoS3iPo/Hnq58BoTLDyip0gx3257GgZJmcPP/3BHciShRh0T1g2/43FC2TF+Wro7bE2lIFwifMqiuI+PyFzwLUCYNXVhHtR9/oH22n18TzfDDLRI9JzSlVvSNjq9shPI4yZIzyqRMhhb1tpLjGyJEnmUKdtBxTJlQkBe/YPHI+ezxVqEO1IxpSpEiCGj2v3V+Ecxd4AE+fvkePhlRpkimDv5kaxyS2qIU3b4wMpTK8OcbaQ94IbUbaz57M5lVTjEyTWdw6E2b4c3bzgRANpTqJHQ5qgefbD2F0veh5tGIao45+QpOxNjMH5MMaNamb9mBYqYSIlwcYNP4cyrrxGz2v33hjwBKHJMEuXP1gSemG5cmg0fNw32Eu+Hmxe8dFPmJL1YZlMDoKWm2PY2I14r0Xb42/YfSPd9Bz4nk+aFLTflI7SlmDOlV1Jg8oiK14w/qRCzho/A2D3hOP9wKVlS2OiZRvIPzP41DdmZrvdjFtb3iJLiwGXm1dwYoPpWlTwz50Q2CWnLQpNKB7wbUboa/1/UfHw9tP8BFqnDKkJtGP+eHvRwDoX7B44EIOfdCQqVUfhhW3ArUTLce0o2wiwYvNcxl5+JNyre/C3zZS3BJq/5NMpSZ53V5MruGA4fl+Bky+RWCoLgg1yUvkJbsWvpw5wo6wuhq8Xdl77guYZ6VciRAjDmKAhvTpnFDr3/HokbIB0vNs+36OfALzAtUY0LoSDetWNDJVol3/2pSygoDrB1hz9b9RTdq0qUit1vPK/bnRIcX6xzvoOcEVL5UTzcd35q+gzaFJR9fxTchvqefx2lmMPWksret46O6BXpuUjGlDV5YAFoWrUDejBp37SbYcOMKW019QJytF08r/NaEhaFOQIaUK/esXPDT6hl+wZOAC/vVSkbpxb8aUC2oUNWTt0IveeS3Qu++h35RLRp+dR+BzHj3Xo02RivSh+m4j+Dy2pRg+ICOHhk1jrXvkyqKAe9vpNPIKeQd0oGboETSgSU2pwknR8IVjm//laRi7Lv732bj7ITpVIkqUyRFsMEl4+xHfTjhWTmPkkY+oUlVl2rAiP24i1mRpwLSuWbHUv2DF0MUcM7rhItg2UpwiE9HPUDvRbFJXajroebRhKwc+h+6C0OZyplOZhPDxDKP67+KOcmSUwZO9Yxaw+S0krd6IVplCddb/ZmqS5c1MWk0A167cC/nsNP1T1m9x4ysWFK9biczhvFVNmsq0LJ8Qtf4ZWzZc/XEDsDppVvKm0eB341ao54uhf8HSQQs56KXCqVZ3JlYPeaZuUaAl09ukRat7wsIhKzirbN907ly69hlsMlMgrKHW5tloWicjZnoPDs3ezZkvalJVr0bFsE6q1Q7kz50cjd99Loa6d0zP41XTGXn4I6pkFZg0qkzIJxxY5GDAhLpk0eq4t2wmk1xDj2fX3bvDVW+wyZUt9HD2CD+PhoxtRrK48hP6NZ7MZnfThjH7P9hPx2b/8KjyMJa0NXZzMIA5JZtVJ7e5wPvIQtrOdAv9sxi6d+wbPYk5N3VoM1WjS+XgGzGc/QjQu++k1/hzvFclod7o7tRKEnzDmVOoVx86Ztaie7CNvjOuhbrZO+JtI8UlMhH9JE1aZ/4eXgx7/Rc++oZORGhS0Wl6H+qkVPPKZQqlyg9i4NzdbN59hPXLltLRuQ0Nlj9Bk7kW86dUDvH8tJhinq8oZZLCy5PnuBqs7dVd288GNx1Y56dR7eRhNGDfqR2o27QUjioDT/fs5UDQTYfm2alYIjG8usTBa8EbTj2PV89gxCFvSFyc0eMqkyLUtrCm7KAeNE2pxv/mRvrMuROigdM/duXIfR3WRYtQJsRQvuC05K5fgXxaHXeu3MNHk4p6jfOHHPkXghkFyxUgGe84duReiCcQ6N130WvcWTyxpcrQnjQJ8RC6b2xKtWdyw2SoAx4wd8hqLofM7Dw6coG7OitKlCsQ6j2Y9HnUSag1YzbL/3pEr2o9Gbj5AR/C6EJE58WldTOoWH0abiWG4TKrAilDv+UfzAu0YE7P7CTCm2Pju5C9VB86DF/IxJlLGTV0DFWLNaL2/+7imzAbff/uSCnFewxrP0L/gmWDFnDACxwqdmRqA8fQDZFNAUaMqUIqdSDXF85keogXMHHbSHFGqO9fiiwNGdv2Z3SZhGFuTG3mOmzYP5XhVVOiu32UGSPG0bjFYJr3Xciyc1/JVr8ne/cNp37oljdmJChIg8pJEY+Os/FiUMvpz+kNh7irg0RlKlHXhPdqV6kmdVOpMbw9yZr9H75fx7CkXJ2SpBTP2bntxo9KSf9kN73HncGThJTp34f2Rh8JA+okZRk/rDSOKj8uzZvJ7NtBXVI6bm07zGWdDRVrlyLECbaCJkslGhY0QwWYZfmLZoVD9YmFkKD0X1RPIXjgcpAfRY3+JcsH/4/9XmBbsi0zWqU0npjV9tQe0ZmaDip8r6ylz/8e/hfTPWbjzjvo7IrQoOr3J4n/FzT586BxotbkhZyckQ/32d3JmLMFlVtPZNCUNcxbvJEZU+bQuVUX8mSvS9VZLyg+cQkn51UmY/gfG0hImZHzODDVmaLJVLy7eZpl85YyYuxCxs934d8HgSQvXod/ds1nctlEofd/o/uRHvc1MxjxrzckKsCwibWNPzYJNY41ujK2qh2qr7eZOXg9N3/0PkZi20hxgkoIYeQ0PuZVrVqVgwcPsnLBGFo3r6kMx1EGvjy/w6nLT3n1yUACBydyFc5DrqQRtgi/ne7qQgpXXM7rmuO4vqKq8Qv5UaW7w6iybZnkUY41rpNoGukndhrx+RxdSvRmqajDXtdhVAmrqy1KdFye0IoSMzyps2QjGxomDt3oRsHnw5PI22AnovUcbswpToi3HOXPE8Dbu9c5ce42Nx958PaTHjNbe9JkzETBwvkpntMh9Ag5U+g+cv/SDdweeeIdoCJB4qRkyZubgukSGk/A3/2S/SjK2yZ6HT52nkq1u5MrVy5u3LihDP8xnJ2dcXFx4f79+2TOnFkZNkl07BaSydRYp85J1TrVadeqJk1qFIqVSQhAm7cxI+o54Omykr+/Peo7+miz0nNQJZzeH2fyvJuh+/8jTcfNJUtZ+9yayv1ah329J8q05O/SnkbJvNk5cx3nf/4Ng+4h86fu41miYgzpWyRkEvqpz2NO0myFaNi2FWMnDGLB3KHMHd+FAW0qUj6qSQhAa0uWYqVo1LwOndrWpkXt4hSJIAnxS/ajn9k2UmwlE5FknNqeumN7Uc/hMfMGr+JSdLQhP6hxdO7J1Fp23F40g2lXlJeyI0d3fwt9Zt3AvHRnZobVRfaT1EnKM2VcBZLc3UTv2bcj+fR1JR13F89k6kUzyg3tG6ob8nd8nt8mmvejeLVtpB9kIpLCpE5Rhfnzm1Pkywmmrgp2bSM6qJPS9O9R9Cv4lV2zdnIzqrlI/5L1s/bxOkstFvyvYeiRZ9FGTcqGg1nWMydf9q5i6W3lCDrT6Z8cYOomT7K1HMryTooHgv62z/P7RNt+FA+3jfSNvEYkSZIUBfIa0TfyGpEkSZIU58lEJEmSJMUomYgkSZKkGCUTkSRJkhSjZCKSJEmSYpRMRJIkSVKMkolIkiRJilEyEUmSJEkxSiYiSZIkKUbJRCRJkiTFqFj/iJ+6NcvJR/xIkhTrHD52gX8Wb5aP+ImGR/zE2kTUoEEDtm3bppwtSZIUqxQoUIDLly8rZ/8x4nUievbsGS1btsTP7yefGy9J37m5uaHX6ylYsKAyJElRYmVlxd9//02BAgWUoT9GvE5EkhSdPDw8SJ48OQCnTp2iVKlSykUkSYqC6EhEcrCC9EcoWbLkj387OzuHiEmSFLNkIpLiPQ8PDx4/fvzj/97e3pw+fTrEMpIkxRyZiKR4L3g1FERWRZIUe8hEJMVrymooiKyKJCn2kIlIiteMVUNBZFUkSbGDTERSvBVWNRREVkWSFDvIRCTFW+FVQ0FkVSRJMU8mIileiqgaCiKrIkmKeTIRSfGSKdVQEFkVSVLMkolIindMrYaCyKpIkmKWfMSPFO+8ePGCtWvXKmczdOhQACZPnqwM4ezsTM6cOZWzJUmKQHQ84kcmIumPoVKpAJC7vCRFn+hIRLJrTpIkSYpRsiKSoqRXr15cvHhROTtWc3V1BcDBwUEZkv5ADg4O3Lp1C61WqwxJkRAdFZFMRFKk3bp1i1y5cilnS1Kcs379epo2baqcLUWCTERSjLh48SJFihQBYNCgQcpwrKXT6ciZMyfZs2dXhqQ/TNWqVfn06ROrVq2iVatWyrAUCTIRSTEiKBHZ29vj5eWlDEtSrJc+fXqePHkiE1E0iI5EJAcrSJIkSTFKJiJJkiQpRslEJEmSJMUomYgkSZKkGCUTkSRJkhSjZCKSJEmSYpRMRJIkSVKMkolIkiRJilG/5YbWFy9eMHnyZAIDA5UhKQ569+4dO3fuxNzcnNatWyvDUhzl5OTEuHHjlLPjJXlDa/SJjhtaf0siCvrSJUmK3ZYsWUKHDh2UsyO0adMmli1bFmd+YuP06dP4+fmRI0cOUqRIoQzHSlZWVqxcuZLEiRMrQzEqziQiJycn3rx5Q6umNciaOa0yLMVBDx49I4mDPfZ2NsqQFAcNH/c/AIYNG8bEiROV4QiZm5vLHo/foE2bNqxYsUI5O0bFuUR099JWsmZJpwxLkhTDBo2cw/Q5a6KciLRaLXq9njWL40bXnq+vH289P5AuTXJlKFZauGwbZ85fo06dOuzYsUMZjlEyEUmSFC2iIxFpNWr8PM8pQ1I0WLhsK137Tom3iUiOmpMkSZJilExEkiRJUoySiUiSJEmKUTIRSZIkSTFKJiJJkiQpRslEJEmSJMUomYgkSZKkGCUTkSRJkhSjZCKSJEmSYpRMRFLs8fERB7cdZMOWA6Gnrf+y78ZH5Rpxhs+DS2zbeoANWw+yeddJjt30xF+5UJB4vB0kyZg4nYg+P7nDmXNuuN73xqAMhkP39hFnXa9x0yMQfF5x1dWN0643uPc+/FfRv33MWVc3zlx8yru3Tzjneo3rr8JsTn4RHVcntiChQ2lKzXqCXhmOw3RPTzNr0kJGTVzIqAmz6dRhJB2H/O/7/xcybc9T5SpxhD9HZgyhcbcZDJ2wgMEDR1G1ZC0yOS/kqGfofS7+bofYQMf1BQMpVLIPM67plEHT6V+yvGML8tdZxIkvyqAUWXE3EemfsrBje0pX6UDpJis4Z2o++HyVkfVbU67jdu6hATNvdg3qTpnK7Snf/xAeoduFb/RP+V+HdpSu3IV2G15jZvaGTb26UrjmDPa8C2ulX0Ov1xEQGEigLhofE6h7wNzmLcjfaA1Xf+L4/BnaPK05cHkHD9x28uBMDyqYaSg2eDn33HbywG07x4flUa4SIwzed9n8vzXM2/MQH2UwDEIINDmbsv/yTtzvH+LJ7makuLSSjlOuhKqMTNoOf2JD+PEpJ/cd5/CtD+GcgBnwunuRXXsvceeDkePyw0lmzDqB22cn8mfSfpv3+Skn9x5l14lHhHku6vsK1wPH2HXmKZ8BNMkokE5w+9gGpmzyiNSJsBRanE1Eutv72XA5ADNzLfrHh1l18qtyESO+cGLSJP6+mZhW0/pR10kNFjkYOKUhOcwMeOxeyASjR7WBl5vmMeGED+o01Zk+vAh29kWZOLsxWZ7tpseI47yN43vih31rmLr3Pp9SZSXL9+NT6cvTq6yfO58eXYfRoNkAGnaYQP+p23C55R12w+DzgtP7j3Pguieh85uBjw+ussflNBdfxZ2fENA9+Jcxw+fQf/pR3EN/KBOYkbxsc9oVVfH86k2ehLnxwvEHNoS+RxZQq8kAavTfx4swP7AP24f3ok7TngzcozyWDTzbtp2dHmpyNqhNWevvc31uMLv7YOrU6kSb1a+M7Mt+nJnch7KNBtFm+gU89QBacjerQQkLH46u3MOtKO0HUpA4mogCOL/hX27oElKxdjFsxVt2bTyDt3IxBd2tDQxa9hTbap0ZX8X2x4e3LtGeGS1TodU9Z/mYdVxVnKIaPE8yYsJJ3qocaTS+GzUdvq1pXaIdkxs78nLLP0w6a0oijKUMHmxcfpzX6gw0bVmA78fnf/yesHlwR7IU7EjzESuYv+5ftrkcZ+vmnfw9cTK1StahQKetXDZy6cLvxBLqNRlArT57eKQ4wn2vrab2X52o1Xw8M858ChmM7/Sf+PBZoE1kg51KGTTFn9kQBvUBmNIXEGoZ/XM2brqMjzYTdetlJuh8S528KhP65sNGfGT/lMXsVpRFutsbGbz0MYGWWek9ujbpNd/ma9JWoF4RCwJv/Mu6q3HnRCo2ipuJ6MslVu98gcG2EI2HVKaCLXj+u5+d4ZYlPrjM3cplXQY69K9M8hCf3IbKw3vSJIWar27rGbr6RbCzoi8cnzqXdS8EyWp0Z0rtJME2mg3VejeiuPY5K2ft53l4fz4W0z86yNrTvmhzlqdRbkU5pHvByg7dabHgKh5WmWk+ehInL7jwxv1fnpxfxPqRVcmXyJcbG6dRrfVGbgWEXD244A2D4e1J+rZdyElvc3J1GsW8+g7BovGUQY+/71c+ejxkz/TpzL1qQ9WGpXGM4lEoG8LI0T8+zq4rgWgyFqV6iLJfS47OvemZ2wzDqwMMn+HGj1rK8JqVY9dw7ouWrG37MCC/+X+rqR2pXjEbZvpn7Nlzj3B2fSkCUTwEYpb34X3seimwK1+RmhlL0aiCLXw8z9odb8LsojC8PcbKfe8xK1yTdvnMlGHUjuWZOKosyfDh8IyF7Ph+3cfv0moGrHyGPnEJxk2oRmrFFtNkqk67CtZ8PrGHdQ9DF/XRx4CP+yXWzFnIrMNv0WPgyf7lDJm+HZdbH4x0e5lKz6O9J7gUoCFz+ZJkC5GH9Livmka/PW/Q2xVgws5lrO1fmdLZnEjqkJi02QvSdOAETu7oTClbwbtjC+m36qWRrg2FgEfM7zyOpQ8NJK/eny0TS5I0qnuirzsuyzey6uzbML/72EJ3dTH5U5bGLktTGi31psK46SxpkjTqB6FsCCPBwJvj57kaqCJpkfzkCZZPALDMxaDxtcmo1XF3xVxm3wwEDLzft4hxBz+iSlWVKYMKkDDEShpSl8hLRo2eBydceRDhji+FJcrHQIwxvGfXhtO8w5YqdUuSWJ2IqvWKk0Tlx+nNB7gXxs7w4cgJTnzSUqh6uR+ldUhqUjfuzajyNojXhxkx8yo+AY+YN3wDbgEJKTeoL+2NrahOTI3q+UkYcAeXfcb6l6OBnzvrB3Qgc8EutBq5ii03fRAY8HI7xN/jJ1GrZF0KdNjCJSNdYxEyeHH46D0CVfYUL5GZEMdnwB0WLbyAt7CgcM9BDCyYIHj0h4QFWzKtTTrMhA/HVu3hZnhZ0fCRw6OGM/iINwnytWL9gnpkUzYKkaBzP8SYATPoPv8KfsrgdwavG6yauYz/HfNA/+UBqwb2olDhRhSut4ADXkEL+XDnwGaGde9PhfJNyJa/HnkqdKfF6N1cMDKy7QeDNxdWz6VJjRbkKNCQwrXHMGHfi1ADEAA0uVpw4OIOHt89gvfDtaztkY/vvbxRJBtC0/njev4e/mjJkS9byP38O9tyHZlQJwlq31v8PXo37p+vMXnsAV4Ie2oN74KzkS/LPEc2cicE3d3rnPUKZz+RwhV6y8ZyhhdHWHvcBxxL0KiiDQC2FSpSPZmagKsHWWt0SGYAF87c4rMmLWVKO2EknXyjSUWnSa0pkVDH/dWLmTrrf0xz9SVhkTbM7pAujPXUOJQpSB6tDrdzVwmZCwy8vniUtRv2ssaEaf2plyHWBiDAnUVtutFm8S0o0oyVh/dwoncGtGgpMGQVj/8dSY/CWm5vnk61Fuu4YawFDM/XG5y9HgBmGSigqBR1d09z8JEOLHPTokmGH33qoZlTqG45smlBd+cyR16GdUDqeLh2HK0XPkSXuhILVnelrL1ymeine3SMqRMWMmrNYf5p25P2iy7w4O1bbpy4yPUPesCPQwNbkL/RNKZsuMT9T2oSJoC3Ny+wftY4yteay3FjSf7rM1a2aUWZHmvYfvU1b18/5/IxF0Y1b0/9pe6hKhSVhQ1pMqUmfYpEWChiUSUbQhPpnnPt7hcMagcyZUpkvOFTO9BgVAcq24HXkSW0bz2Dhff0JCrVjslNnIyvY5mWbGm0CP8nXL9jrO2RTGF028Zeeu5v3c8pXzVOlSvyPQ9BwiI0qpwEtc6dzRuvhT4z1r/m2p0PiIQZyJ817OYUQJujKX93z4alz2UmTjzBe8vs9JvajNzGTqG+0yTPQp7kavzv3edmiNZHx/U1M2jTeTStTJjazXcLvvK3brPl0xi8/x0Whdqxa1s/WhdJglnQxW2VOamK1Wbu1hkMyKPl/YnF9FsZ/PpWxHSP73P7k0CdNDVZ7EPuDj437vNAB5o0OSicLPxdRZstKzmtVQj9c27fM3ZACnzOLaLp4BN42ORl5MqRtEhnPLX/GoLPh5Yy/LgNbVdv5e3To3jemkan9BpAEJggDXUHT8D19iFeXF7PpTPbeeE2k05ZtHy9uZ0Zu94rX5DAeweYdVhL3WnLePbsCJ5PduLSKyc2hvfsHzeXNa8ikRh0j/lf6zZUmarcByIgG0LT6F7h/kIP6iSkThn2fqdJV5upvXNhbfDk2OF7+Fpmo8+E+mQNaxWtE6mdVKgMnjx5GtmzQClI+K1LbKN7wLqtdwhQJ6FG3SLB+mutKF+/DKnUetx37eWw8uYOnQdPXxvQJE9B2ghPRS3IX6cMObTfLq6bZS9Lw7zhZCEAbQrSpVCj9/DgWYh9UUuhruNw2TqHfSZMu4YWCb4y6O6zYtVVPqqS0WRwS4qEGs72nW0+hgyogKPqCyfWH+BusPZI7/WYgxu3MnveRpbvvcsbxWm67ukrnulB7ZSMVIrrQ288vAgA1MmSkiL8/A3aJCR3VIPhM15eoVOheH+Wvh3WcPmrE03nTGZ4YePdfD+otJhbmGFhEX27aMBHHbn6jWdenVRYoCahUxLs1ABWVB8/lw3Dq1LE6b/vWpuiJL0bZ0GLH7euPQ7+UgCotCloNn8+a7vkwUkLWDhRfeRAumfTIrwvsnGv54/rVuZmZpiZmxP66uR3+rdcv3CXWy8Voy8j2g6yITSN7wc8fQSoE+KQOKysAmBGxhJ5SP19EXWSzBRMF97xb0liO0tUGHjvGdTPK0VWGHt37OR/YS+b7uhQpypD49KWIWKWJSpRO60GvcdJ1hxQ9KPoP+P92QCJEpE4oqGy+qcsHLaBq3obkic1J/DqRoati+Daj8YWBzsVItAHr8/Bz4LVOGQvRNXKJalmwlQlr2OwdcHgcY2z93WoE+WlcqnwG267MkUoagW6u7e48PnbvC+uSyhbsDXt5h3m8PHDTOvehhzVFnD8w3/r+Xp64yNAncgWhxDHp8Df79tILJWZGZYR7ilazDUAAr0h1MBZVGbW2CVQgeEDNy4/I8LB2tZV2fLyFHtbJw62kxp4vm4kufPXIXO+b1P2Rpu5pYOvx2aT5/u8zPnqkrXCXI4q2mVNmhqM75GNkHtOeDQkTWKLGsGXL77KINpcNRlcN3nILluLrFQr74QGf2663f/ePWdB9fkH8DnYkkxhtIF+l89y/HM2OrcvGDJgdDsEJxtCUxj8/PETAFoswjsZ1T1k7qjt3DNYkiSxJYYX+xgx+zqhv/3/mFt+S1T+X5WdsZKpjO/bsdJXjqw7wmM9mFt7sX/SPIaMCjZNPMXrBGaohDcHNh3jdYheER0BgaAyN8c83ESk5/6y6Yw+/hnLAs3ZPLsaqVXe7J0wl00hX1DBDHMzNSqhI8A/dCMcVbrXb/EwgNoxKanCPJX+ztqR5HZqROAH3rzTfxtl99SforPW8+jMQly2LeXmscGUfLyWYSuCHg1k4OvXgG/Dqs3NFQ20Cgurb3/U8PUrX8L7+ADCl8++AlSWJLIx0tomysv4BW0onNCfG/8bQ49tURvlZtAF4O8XgF/QFKD79jp6Xaj5esVXoU7sgFM4WcjnwWnmjRyDc9UW5CxQm3TZq5N3zJVvyUSY+r1qSJfGCTWCD288Q3cTG2N4y/q5h7DtNoiBEVXfRvw5DaEKFSAMBoyc63xnwPB9x1Krgh3sGs33EwYDujBHuut5vGoO0y58xSJ3c3asa0JuMx03Fs9h3u2wuz11gd+OJrXWyH4vmSTuJKIPp1mz7x164Oudo8ycvYqpIaa1bLnlhwA+n9jPpqfBahi1GZbmKoS/H1/D3IFB/2g7vSae54NZJnpMak6p6h0ZW90O4XGUIWPCe3qCP1/9DAiVGVZWwTOdnpfnDrB05Q6WmDAtP/o82LqASv3tCxKG8CsyAKFHrxeAFjNzADXJGvdgZp3UPxKMNn0FahUQPLj7hKBjUaP9vgvo9T/mfY+QLFlizADxxoNnYR+H3/i84sk7A2iSkT6NsQNShWWh9qwcXQwHgwcb+o9h3p0wW4QwqEnbeir37+zj+d1vk/vOZuTWglXFAdz7Pu/53b08Pd2PSuEknZD0PN02jsKl+tBrzgFc35mTKksWChfKTeEMNpE8SNRYWmpRARiEaclWGMjeajKbB+SIRLX2nz+lIVRbJyCBCoSXF2/DOiD0H3jnLUBlha3tf2dvauuE2JgBBl8+fjK+ssHjEEOnnMdbnZJWo1tQqmRLxjd2Qv3lOtNG7Q7jCRh6Pn/+1u4ksg26aC1FVuSOsRhjwGPPPva/F5hlr83ClVPYvMrItHI4HXNqwe8a6za7/3dvjdoex8RqxPvwduAXLB64kEMfNGRq1Ydhxa1A7UTLMe0om0jwYvNcRh4Oo0NJ74nHe4HKyhbHRME3qZ6bG+bSpddEOpkwdVt8Pdi6oE3tRAot6F+/4KHyupeCwesFjz8I1ImcSJ80jAZJ/wFPb7BPHPRUCTUJEyXADDB89uGjYtskzJGJTFrQP7+Na/DEbsTnM5e55A/qJNkpmjmsC0pasnccwdx6yVB7XWB4p0Wc+t6NGKO8jjJ04B7uBTjRaP56nlxezsGN09myZipLW/93B75p9Lzz/IQBsLKzIfwO1e80ThSvno+0kS+G/qiG0CxrBjKbgd79Kkfdje+PhteXOXVPh8osA/mD35xtloQUSdQgvHht9IGSH9k/4X9sfyNwrN6J0X/ZALbUGNKeqvbgdXgJw3e/D31ioX/Pa08dQmWFU/JEyqhkoriRiPQebN50kU+YUahxSzrUq0jDukamerUY2jIfVuhw27KPy0E9FdoUZEipCqdB1/No5TRGHvl249q0YUWw/R7RZGnAtK5ZsdS/YMXQxRwz1nAGPufRcz3aFKlIH6Ix0VKk5xSO7F3IMROmf0cVC74y6iQFKZ/HDHyvsM0lvK4sA89dTnIxQEWiEsUoFcZp9YeTm1h5MwXOtXP8uI/CzMkRRzUIT09eK45tbc4SVEynQQTeZu3aO0bvjYFvSXzlkpO8E2pSValIufBaX7UTjWeOoEsWM3yvraXN4KOKbtTfL+C2G+e9BJqMlenbOEPoRxyFQXx8j4fyyU6Gj5y/8hQdWjJnzxj24ITo8gc1hJrUZWlQPAEE3mLO0C3cUD5KTveKTaNXcdRHhW3ZajRIG+yEzCwtWdNqUOnf8cg99J785ewKBm14hT5hfgaNqkqK7y2jJk1NJnbLjpXhHVvGLeGochi/7jkPnhlAk5KsYV0AlCIUJxKR/sEB1rv6gWUeGtVLHcb9PAAa0jaoTkVbFbqHh1l99vsOp3Ygf+7kaPzuc/F66H50vftOeo0/x3tVEuqN7k6tJME3izmFevWhY2Ytugfb6DvjWqgLl7p7d7jqDTa5spE9xOmzGvvMeShbuhDlTJjK5FA85kaTlradvz3tYf+kmax5bLwrK+CRC31nXuKLWTra96ho5CkFejxOLKReh4Mk7jWckcX/u1prljkt6b9XXY+Ujap5bjp3yI8tOm4umsSA/W9DdxEavDg2cTSjT35BZVeIgb2KRtiQqxMXZ8rCNhRJqOPxusl0WPHkJ54MEQ3Mvl07FF998QmeFP0esmHP/TDfm859Fx06b+dmsB3Cz20LC45+AW1GqlUNb1+NJn9SQ6hJRcdx7ShtB28Pz6R0md50nbiOhSu3MXf63zSs0JrWW15jcCzG+Am1SBv8OFDbUzB/CjQEcPvGw5D3eAXcZeawrdwJ1JKrQ3e6hhirbUbebj1ol1GD7tFuBs29GeK6n/7FA26/M6BOkpVCGSJXO0v/CdVkxT46rm46yJVAsC5RifpGrz/8R520PK2q2KM2vGbHhnPfbzA1o2C5AiTjHceOKB6Fon/BskHf7rB3qNiRqQ0cQ28UmwKMGFOFVOpAri+cyfSrwV9Bz6MjF7irs6JEuQKmdcWYTI1Tg/4sbJsBy1dH6Fi5Ex1m/8slj28DDL6+usnG2RMoV2USO9/Y8deoMYwtoSiHDB84Nas/xVsdxmnIP+wfnh+7YGF1kuwUTKtB+D3GLdQ1Gw1ZOg1hRo2kaH3vM795Mwo2ncKYeVtZumobc6bOoGH5plSdcY0PQoVjicpUi+D7CWJdqD0rRhcjCR/YP3I04y8o07tptGnKMmBUNya3yR3lm0TNcxenQio1+hf7GTxwGwcv3eHsvi10d+7G4KuQKIwBLtYpk/B1/xTKVhzC4Llb+GfaRCo3WcElPzUp6rWlW85f3zD9aQ2hZf427HYZTudiSfB/cIaFU2fRtddkeo9fz7ZrfqQq15TVLtPokV1Zi5qRr1Q+kqr1PLl4nefBzqh8Dm5ggZs/VpnrMLlP3tDHsE0hhg+vTBrzQK6v2MDuYKNOP56/wU0dJCpUkGJh9ERIEQvV5sY6fm6s3v6EQBJSvl45Ukb4jm2o1qw8qdWCN/v3suf741kSlP6L6ikED1wO4vrjlEaP+5oZjPjXGxIVYNjE/56sG5IaxxpdGVvVDtXX28wcvP6/x9joHrNx5x10dkVoUNUu+jeo2pHafy/gwJSa5FfdZfmoUXRd+wwdOm4sG0uLUXu4nagog1YsZmfvnCGrEYMHO/p2od5aKwbtXMmGjjl+dDn+YJ6VcsXs0ehfcd71TeiKR5uODquWsn1oBfIk8uH63q2MHT6Fjj0n02fiRrbd0JG1UlmKOWp4u28SRSqOYdYJjx/deCpraxKZabCySaC4EK8le8dRzG+eFuuvd5n396EQUZPZZKVJn3b0rJQyzOpDbZWAhGYqzK0TEGIsSZAEhRi/oCMVnQK4umoyVSu0pGSTWbgkqMvmjW0oYKUhQQKrH4urLS1JoNWSotZQ9s2pRspnR5g+Yio9J+zglIeWTM592TazIhHcAxwt/sSG0DZPHRb+u4eXl5fhsmIMy/4Zzbp1/+PynX95uLs/zbL/910Fl6BkaSomURF44wKHgo08Sug8ltfeF/lyeQg1EodY5Ts1yRuM54nnRXSPJ9Lox9NAfDlx7Bo+JKR01aIhTvCkyFEJYfK41ChzcnLizZs33L20laxZ0inDv4mOyxNaUWKGJ3WWbGRDw7Duy4icz4cnkbfBTkTrOdyYU1zxUMRopvvAnQvXcPlnOkNdPElXvx/zepShdP7kJAz1YfQ8XdmfwlOtmP3vBJoF3aFnxGeX0WRpvpfPFYZwf1uDH/3jofh/4M6Vm1x//J6POg02SVKQp3BuciY1J8D9GEM7T2aeqxeBWJCyaD3mre5L3ZCPOY/dfD24cNKN2+8EDtnzU6mQk0mj2HSeDzhy/C4vA61Im7cgZXPYR3KAQ1T5sqNjbRpsCqTGP9vY2cohyvv0oJFzmD5nDcOGDWPixInKcIS0Wi1ajRo/z3PKUCzylQM9G1Bz1Wcqz9mGS1sjvR+R8fk4bQoMZE1AeVZfnkLzEF360Wvhsq107TuFOnXqsGPHDmU4Rjk7O+Pi4sL9+/fJnDmzMmySX7flYh0t+bu0p1Eyb3bOXMf5qPUEhaR7yPyp+3iWqBhD+gZ/0sMvorUne4lSlM9mgxoVDjmKULmgsSQEGN6zZ+tFzEuUIKfPE27defTfdPcVXsEufNiUr4JzCjW+50/i8iackQMW9mQvXprGzevQqbUzTWsUJGfSb8MezNOXZ+b+jZyc05iK6dS8vnicIw/CuroSSyVwokjVqrRpWQ1nE5MQgDZJZqo0cKZd04r89duSEPD5AruOe4N9ERpXt/+TDuYosqJCu5rk0vpyYuthIhgIGqH3Bw6w962KNHXqUucXJqE/wR+19dRJyjNlXAWS3N1E79m3TbvZMEw67i6eydSLZpQb2pf2v/W5aSYwePHGS8/LLWPJV7QxuYJPJcexJvgQVuvCdG6WEa3PFTbueB26e85UmsQUazuQQ1f3cnv/JPoWitJ4ZMlEsiGMPPO8DehTJRF+51xY+TO/Jmh4zcY1Z/CyzE3XbkUiHKAjhe8P23vVpGw4mGU9c/Jl7yqW3g49gs5U+icHmLrJk2wth7K8U/rfdxZsKm02xp91RXy6FHp6v5DeqYJ/9Wbk79CMGvb+nF6/hxs/cXwCoElE1uK5yRjqqq8UbWRDGDVqR1r9bzXnD4yhQ8afOGrVSWgwbQHnTs2gX5hPRJVM9YclIkBtT9Xxi7h1Zio9ckT9jF2TriYrTmzh3LzKmDhQLFZTJ6/B8mOrOLmwDmHejyrFHrIhjDK1fSoKFclM6p/K3mYky5aLIll+Y1dsPPbnJaI4T4VN2myUKpGP/KlNvYphCjX2GXJQLJeTPLuOE2RDKMUfMhHFORqyth7D0QMLWdhE8eRnSZKkOEgmIkmSJClGyUQkSZIkxSiZiCRJkqQYJRORJEmSFKNkIpIkSZJi1B/0rDlJksISHc+a0+v1HNmzQBmSosHCZdvYsvNwvH3WnExEkiT9dCIyNzcnMFD5MyJSdGvYsCGbN29Wzo5RcS4RZcucjqyZ0yrDkiTFsF37TgBEORFNnDiRjRs3KmfHWp8+feLVq1dky5ZNGYq1bG1tWbVqFRkzZlSGYlR0JCLEb1C0aFEByElOcorl0/r165WHb7yULl06AYhVq1YpQ1Ik1axZUwDi/v37ypDJfktFFBAQwIkTJ2TpHk/odDoaNGhA/vz5GT16tDIsxVHp06cne/bsytnxzr59+6hRowYASZMm5c2bN8pFpEiIjorotyQiKX4ZNGgQ06dPR6VS8fbtW5IkSaJcRJJirfTp0/PkyZMf/1+1ahWtWrUKsYxkuuhIRHL4thQpOp2OefPmASCEoF27dspFJCnW2rdvX4gkBDBw4MAQ/5d+P5mIpEgZNmwYfn7//aSgi4sLnp6eIZaRpNiqe/fuylm8ffuW1atXK2dLv5FMRJLJgldDQWRVJMUVxqqhILIqilkyEUkmU1ZDQWRVJMUFxqqhILIqilkyEUkmMVYNBZFVkRTbhVcNBZFVUcyRiUgySVjVUBBZFUmxWXjVUBBZFcUcmYikCIVXDQWRVZEUW5lSDQWRVVHMkIlIilBE1VAQWRVJsZEp1VAQWRXFDHlDqxQunU6HjY2NSYmI7ze37d69WzlbkmLM1q1bQz3VpXfv3rx7944uXbpQpkyZELHs2bOTL1++EPOksEXHDa0yEUnhWr16NT169AgxT6/X4+vrC4CNjU2ImI2NDU+fPkWr1YaYL0mxSdDTFeRTFX5edCQi2TUnhatVq1Z8+vQpxHT8+HEA7O3tQ8Vevnwpk5AkSZEiE5EkSZIUo2TXnBRpFy9epEiRIpibm3Pu3Dll+I+l0+kQQmBmZqYMSbHMX3/9hbe3t+yaiwbR0TUnE5EUaW5ubuTPn185W5LinLVr19K8eXPlbCkSZCKSYky+fPl49uyZcvYf7cOHD/D92pkU+yVLloxz585hZ2enDEmRIBORJMUiKpUKvt/cK0l/iuhIRHKwgiRJkhSjZCKSJEmSYpRMRJIkSVKMkolIkiRJilEyEUmSJEkxSo6aiwbnzp2jVq1afP78WRmS/iD+/v4AWFhYKENSDNFqtYwYMYIhQ4YoQ1I0iY5RczIRRQMHBwe8vLyUsyVJigXUajU3b94ke/bsypAUDWQiigXatGnDqlWryJ8nK2cPL0ej0SgXkSQphgwZPY+//1lH6tSp5Q3Yv4hMRDHMzc2NAgUKoNGouXxyLXlyRe1LkCTp1/j61Y88xZvy8PFzhg0bxsSJE5WLSD8pOhKRHKzwE6pXr44QgiF928gkJEmxkJWVJcvmjwRg6tQpsiqKpWQiiqK+ffvy+vVrsmVJx8jBHZRhSZJiiTIlC9ClXX30egOVK1dWhqVYQCaiKHjw4AFz585FpVKx4n+jMTeXj/2XpNhs2vhepEqRlHv37jFz5kxlWIphMhFFQZUqVTAYDPTq0phiRXIrw5IkxTI2NtYsmjMMgCFDhuDp6alcRIpBMhFF0rhx43B3dyddmhRMHNVdGZYkKZaqXqUUzRtVRafTUaVKFWVYikEyEUXCq1evGDduHABL/xmBtbWVchFJkmKxOVMH4JjEjitXrrBs2TJlWIohMhFFQuXKldHr9bRvWZu/yhVRhiVJiuUcHOyYN30QAN26dcPHx0e5iBQDZCIy0bx587h16xbJnZIwc1JfZViS/kA67q+dQKVqnak9/izv/B6yoFMXylXtSLlaU1j/TK9cIRS9uwudnDtRtmpn6ky6gLfeg82DelKuWk/67PDAoFwB0D8/RO96nShXbwZbXhhbInyN61emdvWyBAQEUL16dWVYigEyEZnA29ub/v37A7Bg1hBsbRMqF5GkP47f5RW0GrSTo/etqdWiKI6WGaj9ly33XK9y4vh2hkw+xfvw8oThLetHzmXZiSucuq6neJ0C2GmcqN2qENx0ZV6fscy9o1OuhSZ1WdqXgWtHNtGl60ZuhV4kQgtmD8U2UUJOnTrF1q1blWHpN5OJyARVqlQhMDCQRnUrUrtGOWVYkuIUn2c3cNnqwqrNp7j6NuKqxSj/u0wbsIoLX+yoPrI/bdJrADUpGvRk9F+JUGPgxab/MeW8n3LN7wy837+AkXu9MGBJoZ796ZNDC4BFrmbM65cX6w+XGDtwC3dDJRpz8nQbxJCiVnw4uZhei58QapEIfOvZ6ANA69atCQgIUC4i/UYyEUVg7dq1XLhwgcT2iZg341vfskkM3ty94MZp10d4RHCUGD6+4JKrG2dvviWswzZqdLy/e561C5YweOAkOnafQPdhC5m59gw3PCN4U5Hl/44brm6cufScD2GcBRs+POeCqxunXW/xyDuMhcLy/fVPu97j6Rdl0BgDH91vc+acG+cffFQGY57uLqPLlMIieXum3o9iMogsgycHxnQma/62OLcbQ5sOgxi2LypPjNfzZO18Zl3xw6pIC6a2TMmPJyxqUtFhYltK2YDQPWbh6E3GKxafK0wYtZ9nerDM1YTZvbPz3zPLzcjdtRdds2n4eGo5o7a/D91FZ56J3uMbkEPjw/EZC9n8NtQSEWrfqg5/lS2Mr68vdevWVYal30gmonD4+vrSsWNH+D7aJqljYuUiYfO7yOi6HShdYyY7vMI/SALd1tKwagfK9dyDezS1SR9vuNC7Zl3SFu1Oy8GLmLZoO0vX7OR//yxlQLfe5M1Zl0rDDnLbpEY9YvrXB+levQNlmq7knLGTyy83mdykJcUrd6LR33fwt4rkrqd6yYpunSlduSNdN3uGbpiU9C9Z0rk9pav0YNgRX2U0FjCgD9AR4K9DF41Pe9Td3Ej9Ms1wnnNXEdHjvnI8zWddxtOpGP0mjWTF3J60zGWpWM4EvleZ9c8FPqqS0rhvfXIonvOrzdaYmd2zYQX4nF/DiI3Kaz0BXJwzm0UPdKBNR5epbSmRIMQCYJmLPr1LkZgP7Jy1iStG9inLws0YWNUWPI8zdeFdjCwSoSXzRmBlacH+ffs4dOiQMiz9JpFsDf4szs7O+Pn5Ub1ySVo0iSsXNfW83DuNclXHMvfkawKT5aRR954sWTaDPZums35uT/rVy0UK/WsO/zOC0nUXciKCRPnT9K/Z0GsoY899waZwOzYvaUCOyP5kj3lOmtRMgxZfTu46zssI3rL+4SG2Xg4Em0I0rZNMGY6nPrF77kp2Xf9CmrxpQ4b0z9mw5jxeqmS0+nsaM3vUpk2bZjQrFPlE9OHfnWx6rEebpRqdK9oow4A5hXr3p3s2LSrhjcuUpez/8F9Ud3czA/93l69oydiqH6NKWwdf+Ts1yevUo35KNYF39rHkxFflAqBOQoO2FUil1nFr4w6ORuGkKn26lEwa3R0BNGzYEIMhgh1L+iVkIgqDi4sLR48eJaG1FQtnD1WGYy3/a6tp0nkLbp81ZKg9iDPnV7Bpcms6NCxHzWrladqmNTNXLufmkcE0SKvhg+tymvbYx5NoqsRC8+H0pCF02foaTeZarFjbiVK2ymVMYUaBhn+RWwu+5w6zK9xMpOPWtqNcCVRhX74KdZ3+jN3c8PxfFrl4os5ehXalFPe4BT7n4XM9aDNQpJCy/IiMT+zbepp3QkueutUoaK6Mf2edn+ETa5FBA7pnexk+58a3bmf9K1aMXMGpz6BJVZXpI4phr1w3iHVhWtRKidbwht3bLmAsz1iXrU699Br0L0+y8biRZGWCXl2bUKxwLj5+/EiLFi2UYek3+DOO0EjS6XQ0bdoUgGnje5M6lZNykdhJ/5QFw1Zw5hMkrTyAfcsaUcje2Fesxi5vQ9Zu6kFZW8HrffMZ6eIdcXdXpOm4v3oMTf6+hW+y0sxaP5i6yY29H9Noc1Smfl4tfL3Btt2vCTN36h6wefdDAlX2VGtYGgdlPF7S83DbPk74aMntXIm83677B6MjIBDADPPIVqPB+Vxi/5kvGLTpqFolHaH+TDB2f3VhaoOkaAjk+pL5LLyv483u/zH20EcMakcajutBrSTh7Q9mFKlalJRqwbsTZzj77QdwQzLPSc1yjmjEB47+ew1ji0RErVazbP4ozMy0bNy4kfPnzysXkX6x8PaCP1bDhg3x8fGhbMkCdGlfXxmOtQIubmfBWV+wLsCQyXXJGtbZ6ncWORoxqXVatIZ37Fh6kOfRmokMvD82l0YDj/M6YW6GrR5Pl4jeUEQ0aWlcJxcW+OO6+1iYVVzAlX/Zfk+Hxqk0zSrGsqH2Bl8en9rLjPHrOfBaD4ZX7Jkxj4krTv3cABL9C3buvU2AJjWVKgdLELp3uJ04z+ETj3irF2D4yP3T5zl87DxHXJ+EObAkLAG3rnPJW6BJkpMSOcNLQ4A6MXVHd6VWEhXi8xVmTFnK2EmHeWVQkbR6N6bWSxJhA2SRPx+FEoL+zW3OPTK2fcwpVDwHCTHgcfUGD4wtYoIc2TIwclAHhBA4Ozsrw9IvFtF+8Mc5efIku3btwtLCnCXzRqBSqZSLxFKBXN13lsd6sC3nTIvMpvxSrDmF61cghxZ8L57jcLg3fUSO/50ttOiwgeuGdLRfMI3RxaIjIWjIULciJazA//JRtj4ylokCOL/9OA/0atI6V6OCscsPMcTv3gF6VqlLthqjGTT7MNc/CjB84sq2dYzs3Zf8+VvQYsltojLGz/D2Aoeu6VA55qF0rmBPg/98hmH1u1Op4UIOfQJ015jUqDuVanenSsfNuAUGf5WIGPhw6yFP9aDNmo0CJjx0Xp2qOtMGF8FOZeDl1qUsuKdDZV+MsROqk8aU1idhVvJn0oLuGdduGK93EubNShYt6B7e51rUeucAGNKvDXlyZuLdu3d07dpVGZZ+IVN2hT9KnTp1EEIwbngXMmdKowzHXoZPXL3+Ej1a8pQsaHJ3lDZ7TvLbqRB+7ly7Z6xhjzzD25P0bjmHg14OOE+dzj81HaNtR1On+ovGpRJAwG22734WunvO7xobXV6i06ShfsO8ROZSvMHjJts37mXNBhOmzZciNcIx4N42Gtcaw/xLULz7GM7eXMzAbFrQZmPU8d2c+qcxRbWPWT+wF/X/eRjpLqavF69x1R/MsmWjQPDCM0FO2ozozqQRNSmYANBmoMmw7kwa3Z2JvcuQMYKiJiQDT5++RYeKxGmSY2fSl6ohU5u2tEgbtLCGDE3a0jaDKSdKgCYZ6VOaoyKA58/eKqMAaFKmJLUlCL83PHkViS9FwcxMy/L/jUatVrN40SJu3bqlXET6RUzalf4Ubdq04cOHDxTKn51+PZsrw7Gb4Q3PXxsQKmvSpE1s+herTUqqpBowfORNVG9uDC7wOUs7jmXJA3OKDZzK6nbp+ckOuZDUDtSpWxhbdFzdfRjljfe+Jw+y+4UBsxwVaVbQhFP2YAJv7qJ3l9G06mzC1G0Dp03NFvoXLBowD5fXZhQZOJN9k2tSLLmWoFpbZZGUkq0Gsm99S/KZeXN08t8siUyWQ8fDG+58EmqSZUhD4uBfvkVmGvVpy9BeZclmoQJ1Kqr2aMvQ/m0Z3KEYaULlAz8e7plP4157jHR96nn77iMGNCRJ5hDu9aH/GHi2bSNbnwVV23rcd2xm+2tTq28tTslsUWPg/dv3yuA3Zg44JVZHyz5cMH92BvRsgUEIqlWrpgxLv4jJ7VV8d+XKFVavXo1Wq2HZ/FFoNKGO0NjN4M8XfwEqc6wsI9GdqDLHwgJAh/7njmEAxNcnnL/1CYPKAnvHhJGqSEyjJmn1SlRKrEJ38zhbQmQiXw7vOM0rg5YCdauQ27SW8gez/E1Ys2UO+7aaMG3syF8mXvTXXd/N0jM+qFJWYVSvXITVW2hbvA3Datmj+nyFVZsj87QAPe5PPdCjJnmqZCYmCCV/np7aRt+6jcnXfAU7brwldC+X4KuvPwKwSmD5I5GGx/BiP31HncTDoCV7yyZUtVOh9zjKkLEnMO0eVBUJrC1QIfDzDeN2b5Ul1hYqEP74RsMtY2OHdyZThtQ8f/6cYcO+/YaR9GvJRPRdjRo1EEIwtF9b8uTKrAzHAWZYmgHiKz6+kbhDUnzF96sAVQISJTSlaQmfKlEpJs+qQSbNe/YPHUj3Pe+ifzRe4lI0qWSPSveInTse/NdgfzzH5oPvEZZ5aVI/zX93+5tI7ZCRcpVKUq2yCVPFbKQw6Q8YeO16nbs6FYmKFaNsuJfKbKhQLhdW6Lh95RbGnnmgf+PGhgPKJOXHu/e+GFBhm9g20p8b3X2mVq1G5hrT2fApOyUzhv0K4seuZcK+YvBg3ZB57HprQJP8L0aP6sH4zlmxwsDzTXMYdfiTco1whbdX/7iU+98bjDJLSwuWzR8JwNSpU3n69KlyESmayUQE9O3bFw8PD7JnTc+IQe2V4ShSoVYDGNBFdGprEN8aa40m8o1IEG0yUiVToxJ+uD/yCH3tJCx+Hri/NoAmKenSRvmvB6MiqfMQNo4oiH3gM1Z0G8z488buAPkZCalcrxTJ1Tpuuxz5cde917+HOPBeYF2yEg2j5bNEBz2vXnliQE2ylEmJqLPQOnkS7NUQ6OlF8F4mw0d3XOaMpUSJLnTb/DDkUwQM/nz1+9YAm5tHrSM0Uba/GLViNbf3d6eCQ1hJRoVVAnNUgN/Xr+EmBjDwcstshrh4olfZUX14Dxoks6RQr950zKQF/QuWD1vCcWPZNoSgKkyFpVUY9bXw54vf996ABGG998gpU7IAXds3wGAwULlyZWVYimZ/fCJ68OABc+fORaVSsXz+KMzNI2oqTKS2xNpSBcIHrwjGyIrPX/gsQJ3QBvuotp9qOwrlT4kGHTdOXeRN+H/yB/8rV7jwWaBxzEaRDFHr1AnNkoK9J7KsRRq0H68zodVolj2I1PCsCCUsWwXnlGp0D46z5WogGD7gssOVDySkYoMKROV2Jf0rNzas2sGSlSZMq115aGK2V307I8Ggj/hLEXoDegFotT+urQWcX0jhHE1pvTmAVCmNfUdqtN/3G70+orMeI7RZ6Dp7OCPqZyFxuPufGsckiVCjx9PjfbgnO4ZXB+k78iivDCrsSrVjWvPk306ybAoyYkwVUqoh8P5W+sy4Rvi9aXo83nzEgJrEjmHc+qrzxMPLAOpEJHWMwhcfhqnjepIqRVLu37/P9OnTlWEpGkXftxZHValSBYPBQO+uTShWJLcyHHVmyUmbQgO6F1y7Ed6hpuPh7Sf4CDVOGVKTSBk2mRkFapYikwZ8T+1kyU0TGn6DN3tWH+WZQU2KyhUoHcYJZ5Sok1Bn5hQmlbHF8Po4PZv/zT7TLgqYJkF+mjqnRKt/zu6dt/B7d4LNJ3zAvgRNq0disEYwutt7GdR7Ip16mTD128I5kwYraEiT2hEtel65Pyf8n2Ez8N79JV5CRaLUKUj2PSlokuSix4JV3D85kkbpjGQKdQJsE2pRIfj80SfcBPFzNKRLkxQNgvfPXod9D5LhHZuGzmW7hwFVgpz0n9yQbD/ethrHml0ZW9UONYFcXziT6VfDeUqc3oPHLwMQaEmdxvijmvQvXvLcD1TmTqRLYSxRR42NjTWL5w4HYNiwYXh6eioXkaJJVI7XeGPs2LG4u7uTPm0KJo7qrgz/HE1qShVOioYvHNv8L0/DOmj977Nx90N0qkSUKJMj2BOII8+8UEN6l7dBFXCPWQNWcSHcVs/Aq71zGLrdE4N1brp3KxLmRfQos8xC32Wj6ZjZDL+7W2nZZjWXoq2Xzpxi9cuTWaPn8f7DuOw8zInPapyqVaF6GCfOETEr2ILNLgs5tteEaVdXKpuUuNU4li5EPnPwPXOEHa/C2hEAwxt27rtFgMqaMhXy/RjooclYira1suJgJAd9oyV5cnvUCN6+8fyFiUhN4lyZSKuBwHt3uWL0XMfAq21/M3DXO/SYkbtzX/rlUfQyqJ1oNbYNpW1AfL3NzMEbuBlWIedzD7cHOtCmIU8YD2j1uX6fezrQZsxEnmjeiatVLkmLxtXQ6XSyi+4X+mMT0atXrxg/fjwAS/8ZSYIExnfyqDOnZLPq5DYXeB9ZSNuZboR6tqjuHftGT2LOTR3aTNXoUjnklWzdza10aNKPxtMvRXAm/Z0mJR2mdKdKEvjouhjnhv+w67GRkUb6D5xfOppKHffwUJ+Q0oMG0jt78DNJHdeXjadOkyFMPBleNRcxdbIyzF7di4oO4HV6IQ267wt2/83P/R3z/FVokEOL/pkr09Zc44s6KbUaFSXc8QDhUNunpXipQpQrbcJUMhPJTDx6NJmd6VndAT6eZczgfTwyWgAE8nDdTCaf/IpZljr0rROZqk5L1swpv1Vdj18YGe0Wfcxz5aGArQqD503OGPl9B4PHYfqPOMJLA5hlqsvMfnkx9mQ7bdaGTOuSDUvg8/kV9F361GgC9b/ixkUf0DjmoFhmY9VOABfP3sIHNUnz5yarsUV+0uwp/XFMYsfVq1dZunSpMixFA9P39XimUqVK6PV6OrSqQ4WyhZXhaGFeoAVzemYnEd4cG9+F7KX60GH4QibOXMqooWOoWqwRtf93F9+E2ej7d0dKhThi9Tw9vJ81+y7wPlEqowezMdos9Vi3visVk6l5d2YldYvXpVDj8fQbv5RJUxcysPdgyhasS6l++7n91Y5yQ/5me+9vDcIPeg8ObtzL7mMfsU3/8wnaMmdj1i6sTw4LHU+3T6L+qAvffrnzZ/+ONhONa2dBq3vCxetf0WSoQPMSUXidX02dhCZTh9Ipmzkvd02gVPXxTNt6m1cBAvDn5cV/mdajE6V7H8fDoQgTF3amtKlfOHyruvJlI50G/O7d56bRRBdNbApRvYQ1Kt1TDhxwDzl6z+DJlmGz2PLaAGonmo/rSIUwH3BrQZE+veiQSYtK+HB0yiyWh7pxKYDzB1x5aVDhULak8a5j/5u4HHuHXmVLhSr5f8HtAuDgYMc/MwYD0L17d3x8TDotlCLhj0xE8+bN4/bt2yR3SsKMid9+pfHXSEiZkfM4MNWZoslUvLt5mmXzljJi7ELGz3fh3weBJC9eh392zWdy2USKL8OHM+cfoLPKTd3qSSPxRamxL9aO/Sf+4e+WBUirfs+V/buYNX0hwycuZcaKI5x87POtARE+PHQ9j+sLRR/LRzfO3tJjVaQ8tVKa/pfDpiZplX5snlicpCo/rv4zjKYLHkTD39GQrW5FipgDaMlWuyrFfqZv8xdSJy/HfJd/mNU8Kyq3XQzuNIUVD/Wge8iCbiMZss6dRBVas2H/TAYUVDw52wTmeQpRylGN/ulNzr5QNujRyY4aDUrgqNJxfds+Lv5IegZe75zNgO3v0KPCybkbE6vbh7/f2hRi5OhKpFCDwesso0ceDPnzHj4XWL37FTp1Umo1MF7p+hzfy/YnejQpytK0fKSyd6Q0qleJOjXKERAQIG90/QVUQkTDwPs4xMvLCycnJwIDA9m1YSa1apRVLvJr6D5y/9IN3B554h2gIkHipGTJm5uC6RIaH7Ltd5aOefuwPusA7uxsZNpzuYwwfHnLjcu3ufXUmy/CjEQOTuTIn5JPO2fTfvxh7n0BrUMuukwdxZRGGbAG/A5NIFPDA2SftpWDnZzCb0x+wu/6O7GNztOdc66nmDXwH3Z4pKDJlIH0q5afgmkSRLAN/NjUqgpdtCN5ubyiokr+ws7O9ai/4QuVZu1gX/soPlZJ/5ypVRoyUt+Ra4fbk93Yzul7md4luzHPPTEtVm9kda0wy56fYODl6v7k7nmKLznbc+Z4VwopR6Yb3rKsaWM67f9K7oHLuTAyR/Q+xUPhtYcn2Qs14OMnH7Zs2UKDBg2Ui/yRnJ2dcXFx4f79+2TOHLV7MKO0r8ZlVatWJTAwkMb1Kv2+JASgtSVLsVI0al6HTm1r06J2cYqElYQA3Z1rXHhnTgnnMqT6iW9JbZ2UvGXK0axlHTq2qkHjGgXJncKJkt2mcP7gCNrlTojh/U3+6diWYp22cMErgFuuN3lrkSeSlVhk6X7T34l9tEnSU7pqIXLYqkFlS65yxSgcYRKKiDWVGpQmpdqPs/tO4aG8HhmdEuSnf+/i2Il3bJm5Gbdf0RX45SrTZ5/DmyTU69845PPzghY5u5pphz5DsgoM7ZLtlyYhgOROSZg56VsPSuvWrQkI+BUf/M/0c/t+HLN69WouXrxIYvtEzJsxSBmORQy8Pn+N++Z5qVvt1zXStnnqsOzQWo6vm8LmlSMZVc2ed+6POO36DPNi5XFO8av+8rfrCWd/x9/5g1iXrU/rHFp8Tv/Llme/sntOTZoWPRha3JoAt3UMWPbE6ECDqAvg0pzZLHmox6FSRyYaG7jhf5vpw3fyQG9H1aHdaBCN9w+Fp32rOlQsVwRfX1/q1KmjDEtR9Hu+vVjA19eXzp07AzB32kAck0RxjO9voSZ5y2m8uDODTj9TDpkiQSpKO1ekYd1vU42Cmemwdh/P19cl9a/80+oktPsdf+dPYp6Vrt1KYe/nxqp1D5XR6KXNRO9ZnSlv/4VjU6byzx2jY7mj5MuF5XSbdwd/p7JMm16H0A/q/orrjCnMvBpA8uq9mNc6VZg9C7/C4rnDSWBlyf79+zl06JAyLEXBH9MEODs74+fnR40qpWjeOPZfbNRaJ8LB3iqKD7D8GVqs7e2wt/7Vf/l3/Z34xJLGq0/wIdT1oSBqUjQbxYVjS1jZOoo/YaJJzeDDrgQcC+P6UDDm2ZuwemEn2lZx5M6Rm3grF4gKgycnjr8jm3NdpiwdQev0od+E4c1lDr9KR902PVn7T00jierXSp8uJZNGf7vvsGHDhhgMv7If9M/wRwxW2L17N7Vr18YmYQJuX9xCqpTG79CWpN9G/4SlPaaw5lkaOi4YTIvQv8cgxWIGg4FSldtz7sINmjRpwoYNG5SL/DGiY7BCvE9EOp0Oe3t7fHx8WDBrCF3ay5EukiT9vDv33MlXohmBOh3nzp2jaNGiykX+CNGRiOJ911zDhg3x8fGhbMkCdG5XXxmWJEmKkuxZ0zNycHuEENSsWVMZliIhXieikydPsmvXTiwtzFn6z0hUP360RJIk6ecN7tuGvLky4+np+WMwlBR58ToR1alTByFg/IiuZMqYWhmWJEn6KWZmWpbNH4VarWbp0iXcunVLuYhkgnibiFq3bs2HDx8oXCAHfXs0U4YlSZKiRcH82RnQswUGg6Bq1arKsGSCeJmIrly5wpo1a9BqNSybPwqNRo5IkiTp1xk7vDOZM6bhxYsXDB06VBmWIhAvR805OTnx5s0bADq2lnc/S5L0650668bdB08AePnyJSlSpFAuEi9Fx6i5eJmIzLRadProfeiIJEmSqf79918qVaqknB0vyUQUhgcPHnDgwAHlbOkP8vfff/PkyRMGDBhAmjRRfMqAJEVBlixZqFKlinJ2vCUTkSQZYTAYsLe359OnT0yaNEn22UvSLxQdiSheDlaQ/mzbtm3j06dPACxatAi97KaVpFhNJiIpXjEYDIwdO/bH/58+fcqmTZtCLCNJUuwiE5EUr2zbti3UTYXjxo2TVZEkxWIyEUnxhrIaCnLv3j1ZFUlSLCYTkRRvGKuGgsiqSJJiL5mIpHghrGooiKyKJCn2kolIihfCq4aCyKpIkmInmYikOC+iaiiIrIokKXaSiUiK80yphoLIqkiSYh+ZiH4B/dPjrFm+i2sflRFjPrOtcwHqzLmNThn6wdgyejzOrWby4J507TmS/x15gn+Idf6jf3yUVUtXsP+unzKEwcOVzSsP8TDsPx6rmVoNBZFVkSTFPjIRRTt/zszqRIcubRiy4SUGZTgUPd4v7uPuGVYawegyn4/0p0Kt6bhZZCKHozuLGlag+x6vEGsF8b+4kJ6d2tOg5RQuKXKR7sEmhvf4hzOhc1ScEJlqKIisiiQpdpGJKLr5HGb1DhXO9bJwbv0GHv+S9s4f1y078akznVXjetNz1FJmNhYc2nMBf0Dv5837zyETmyZ5AbK/mUPvWdcJCBGJuyJbDQWRVZEkxS4yEUUzr72r2WtVk16jG5HHbQNrbyr7vHS8PruKCf270bXPWJafeWOkaopoGQ1JHO348uIp7wyA/0Mu3/5C2szp0QLeq5uQrtpcHgVPgtpC9J9YlafTevPPHeV7Uvh4mz3/jKZv1850HzSZNede/9claHjPxS1Lcbn1hmsbxtGr51xOfwqa945b26czqEcPhszZz2M/0L8+w/JxfenWfTCzXO7jG/Iv/ZSoVENBZFUkSbGHTETRyfCaHWsPk7h2Q4plrU+DQg/YuOZCsApEz+NVTSlWYxKuuuSkS+zFzm4NmXEjeGIwZRktebuNou6TsdRp1okGJeuyJeMU/tc9KxpApVKj0mjQqIKtggrH+tOYXOEek/su5mEYbbD+6UbaFClFr51vSJQhM8m+nmJ8tcLUW3jn2+cwPGfPxN6MG9aZ9nOv8/nLRz76P2fPxJ70b9+cPjs/Yp9McGF6ff5qM4B2tfryr19SUqgu8nejavQ78Fn5J6PM3t6epUuXGp3s7e0B6Ny5c6jY0qVLGThwIB8+fFC+pCRJMUFI0Ub3eJYolyi3GHYxUAihF8/+V1kkSttZHPjyfQHvHaJVCgdRfZG70H2fpX+9TjR0Mhd5RlwRgaYuI3zEjZWdRNE06USR8oVFqqQ5RMPpJ8VbvRBC+ItzA3OKVO33Cr/v63/Z2FDYpekiDvkJoXNfKpyTJRO1ln57ff+TfUQm61pi5WchhPggtrdMIRyqzBcPv/0hIYROPFlcQzgkbSw2vhdCBF4VI/OaCeuSk8T1oD8QeFWMzGsukjZcL97ov83yXFNX2GkcRb3Vr4ReCCH0b8QyZzuRqtOBH+/rV0qdOrUAxKZNm5QhSZKiUc2aNQUg7t+/rwyZTP4eUbTRcWtCCYpur8aZC2PJqwXD66XUyj4Su2V3WFvfDv+j3clW7yVjn+yklV3Qeu9YXDU98wuf4vL4/OgjXCYvnltaU6zve/rs2USf/DZ8dFtM1yYjuF9nE4fGJeLvYnV4NvImq+raAuC7qREpBzmw5f4CKlroebSgJsUmJGT2hU00fNyfnNUeM8JjF63NDtMtawNej3/CjpY//jh8WEGttONIvfMu88vcYVShEhxqfJXTQ79VYOjcGFWoJKfb3edwr5SoAd2FoeQrf4Ue7vvpklQNBHCqby5qPhvD623NSPDfq/8SqVOn5sWLF4wePZoKFSoow5IkRZNatWrx8ePHn/o9IlkRRRf/82JwDq1Qm9sIe3v775OtsNKqhV2dlcJDL8SXzU2EfYr2wuVr8BW9xJJq1j+qnQiX0b8S8ysmFDmHXvheHX3jf2eBqJEirXBuVVGkzDNEuPr/FwteEQkhhNDdFXP+SixSN98inh0PVhF92SKa2CcX7UL+cSG+bhfNkyQTbXZ9/V79WIvKC958q3REUEUUcl7gxeEit3VNsdw7aCF/cWZAVmFTd60IKhB/pYQJEwpATnKS02+a3N3dlYehyWRFFE38jvYgZ60rNN02hzoO/12c8T87gTojvjDmxkE6uPcme827DLh/kG4pvl+e07kxunBxdtY8+60iOt4z/GXGJGB6yQLsrn3lv4oEAD1P5lclT++b1Fx/k7WNHH5cAAxZEX1/yVvT+av0AtL1rIDrzHcM89hFa/NzDMpbkfOdbnK0b/ofr61/NJ2yeTZRydWV0dlvMqpQKc53ecz+Lkm//Q2dW6h5uksjKFDuGn1f7qGtLUAAZwfmoeqjkXhsb/7LK6IECRLw9etXMmbMKCsiSfrFcuTIQZ8+fZSzTafMTFJUfBI7W6cQNpXmi2c/yoTvfPaKDqkTiOKT7wjd5/2iU1orkaOri3ilE0KIr+LO0kYinbnZf9d/IlzGT5zun01YZ+8otj8JKnF8xOMDU0TdzI4iTRpHkbLmXOH2WQih1wu9sYpICCGEv3CbWFzYJkokEloFXSPyF5dGFxQ26ZuIVXe/V0V+j8XGlpmEQ/nZ4q7OePVjbF5MV0RWVlYCEFOnTlWGJEmKZeSouejwfjdrXHwp16QeKZVb1PovWjdIxdUN63CzrMy4hb2w21qf7Blykz9HDhruL0TjMub/LZ8womUsKDlyJRNynKJd9uSkzZaTrKlSka/TfpIP3s/V86to4jGKYqmdSF58NJfCvGnInLz95tIni44vP8aGm1Nw6BrmVbhHv4JpyZq/ANnTF6D/k1osW9mDrP+VX5IkSdFGds3FAMOX59xwe4q/Y1byZXEkWBqKxDIGvry6w42HnhjsMpA7V2psgpKg7h33Lt/nk0MO8meyR6tY0xS+r29x/eEHNMmyktfo34/dgrrmpk6dyqBBg5RhSZJiEZmIpHhJJiJJijuUHUmSJEmS9FvJRCRJkiTFKJmIJEmSpBglrxFJ8VLQNaISJUpQq1YtZViSpGiUKVMm6tevr5xtMpmIpHjJxsYGHx8f5WxJkn4BtVrNixcvSJ48uTJkEpmIpHgpZcqUvHr1ii5dulCkSBFlWJKkaNKuXTuAn3rWnExEUryUJk0anj9/zqZNm2jUqJEyLElSNHF2dsbFxeWnEpEcrCBJkiTFKJmIJEmSpBglE5EkSZIUo+Q1ojikVatWHD9+XDlbMuLVq1fo9d9+D12j+X1Pa1Wr1SRJkgStNipP+JMAtFotM2fOpG7dusqQFAtFxzUimYjiiNmzZ9O3b1/lbEmKl8zMzPDx8cHcPK49bvfPIxPRHyRRokR8/vyZkcNGU6liZWVYUvAP8OP8+fPodDpl6JdKkSIl2bJmU86WIqFX3x64XbtK69atWblypTIsxTIyEf0hRo0axfjx4ylcqAgH9x1WhiUpXrl9+xaly5dArVbj5eVFokSJlItIsUh0JCI5WCGWMxgMTJ8+HYCRw0crw5IU7+TIkZP6dRug1+tp3bq1MizFQzIRxXK9e/fGz8+PcmXLU6pkaWVYkuKloYOHo9Vq2b17Nx4eHsqwFM/IRBSL+fn5sWjRIpDVkPSHSZ8+Ay2atcRgMNC8eXNlWIpnZCKKxTp06EBgYCA1aziTP18BZViS4rWBA4ZgYWHBsWPHePTokTIsxSMyEcVS3t7ebNy4EZVKxfCho5RhSYr3kjslp2P7zgghaNq0qTIsxSMyEcVSLVu2RK/X06hhE7JmyaoMS9IfoU+vviRMmJCLFy/i5uamDEvxhExEsdCrV6/Yt28fZlozhg4apgxL0h8jcWIHenTrBUCLFi2UYSmekIkoFmrWrBkGg4FWrdqQJk1aZViS/ijduvTAIbEDt27dko+4iqdkIopl7t27x8mTJ7G0tGRA30HKsBRX+Tzj4r9b2bhxMwdvvFVGpXAkTJiQvn36Q7AfYZPiF5mIYplmzZohhKBLp64kS5ZMGY55AR7cvnAO1/NXePLJoIyG5PuCmxfO4XrxHu++PX80BN3bO5w/78rtNwH4PLuGq+s5XC/dxyvcl9Xz9p4rrq6uXHr0Ds8H53G9cJNXfsrlYgsDHkfG4Fw8P1VatKNbrw60nrhPuZBJgm+vn6H3vM+F867ceh1rN1oo7dt2JEWKlLi7u7Njxw5lWIrjZCKKRS5evMiVK1dIZJOIXj36KMOxg+Yjh8fXpbpzRZrMukDYTZmeu0vbUqVmVZrNdsVfpQj7nGVS0/I4d1/BQ7SYee1laKMqVK9Zg4G73hBWLtI/WkLnGlWoXq8bG5+boX21nX71y1J7+D7ehbVSDNI/XUnvrrM44+VE+S6TmDtnLqMb5lIuFjHF9voZGu1LdgxwpkLdQRyIjRvNCAsLCwYNGAJAt27dlGEpjpOJKBZp1aoVAL169sHOzl4Zjh00WWnTpyGp1ToerJvNNg/jDZnBy4VZSy7y1SwHbfs3IVWIPe0zZ6b2Zv5tR5pMmkzNZGos8vVmUrtsmBnesGfKNE76BF/+O8MrtoyfxslPalI3HM+wMnbYlR3FzA6ZeL5+AKP2vQszgcUMPY92rOGYt4qUjf5m1bgetGjahq71CykXjEDo7fVT7MozYnoXMr1Yw6CxLrEygRvTrElzMmbIiIeHB8uWLVOGpTjsJ/doKbocOXKEu3fvkiSJI507dlWGY5VE5frQtXhChPe/zF9yCX/lAgRwc8lMdr2BZDUH0iWfRYio7vYCRq96QKIqwxhWMfH3ndCa4n0n0iK9Fp37GsYtuKZ4XQOeB8Yz6YAnKqd6jB1WjcTq7+v1GUMjp1dsmzCDc19CrBTDAnF3f44eLdkKFCKhMmwi49vr51gX68+oBsl5tX0Mf7vGqo0WJq1Wy5DBwwEYOHCgMizFYdGxT0vRoH379gAM6DsQa2trZTh20WSkRd8mpNPouLd2NjvehDylNrzZxoyV1wiwKkznvrVwDLGXfeTg/5bipstGy971cQoes/2LISMakELtx7VFY1j7JNiFJZ9TTB+3iRfCkerDx1IreFVgW5me7YugdV/HnG3/Z++uw6LY3gCOfzcIQREQFbu7u7tRUbE7fna3YmPntdtrd3d3YncnJiigpMTuzu8PxAvDAguihOfzPPPc67wzy+7ZmfPOOXPm7PsE1SoKDgoGwMgofDI2XBTl9Ussqdm3O6XVL9myYDvvE1KhRcGhcVMKFizE169ff04GLCR+cXZYC7G3c+dOXFxcyJgxE506Jo5RQckrDKBv5ZTw9SiLVt0K03oJ4MbyuRz1UJCp2TC65A1/P0P3+QCbj7phVKIN7QrLf/RMSer64xhTLzV4n+GfGQd+dBsFcHPhaNa/0mJVfQwTm2WUHbgqcjRvT9UUPpzfup0XegZG/FkaPt0/x9lz53jirkVCx9eXFzl77gxnzzvz/JvhtX7U5fVrVNlb07aKBT4XN7HzZbwXmkEUCgVjHMcC4OTkJA8LiZRIRAlAnz59ABg5zDHx/CKlKgutBrYlh1rD443z2PejVaR7t4U565+itahK//41kP+SzLezh7nkY0Sxug3Iou8XvJUZaT5uJFVTSnzaN4m5zr4EPVnG2BX3CLKoxLBJHciqZz9l6rrYlU1O0N0jHHWJ70rVhxNTmuLQvDlTz3kDGq7Ob4FD80Y4tOjGygchrSRDRFtev0KZmtr1ypM86DbHjr0hvkvNULVr1aVM6TL4+fnh6OgoDwuJkPhhvHi2fPlyevbsSe5cubl0/ioqVVzXNr+R7j3r25dn0Ak/Cgw6wUnHPDg7VqTpvy7k7H2YMxPKYhpuh0BODCpM621WDDh8kbFFIxv9peHRAjvqTnaG8sPoZ/Ev048GUXrMCfb1L4D+VK3FZUk9Sk24R415j9jSxlq+gX46V24cPstLf0NOAxUZyjSlYrQZIZCH+5Zy/HUQLw7+w5Z7QeRtPJzm+Y1AmZKiDp2pljG61yAG5RV7WpcFNCw3hnvVF3N/Y3sS6BCZCK44X6a+fV1MTEzw9fVFrY77shEMExc/jCcSUTyztLTEy8uLtf9uwL5hI3k4wQu4Ppbqjebz1NKB5RtLsb6pI5eS2bPszHqay0d3aZ8zr0EZJr1oxOo7a2gU1a2wgJtMa1CPWfdCBognKzKSgwdHUSyKWy2B5wdTqsUajP53kCtTKkSSsGQCTzKodDPWfTKku8yYeovesqmFmTwQiQAO9spDx11+1Fnwhs2tYjhcISblFVuBZxlarjHrjHqw78IMyhtUaAlD81YOnDp9ku7du//8uRThz4uLRCS65uLRlClT8PLyomiRYokyCQGYluhD/9rW4H6YKb0WcMXPhCJdRtBEnoQANO9556pDlS4LmaJIKACYFqFRnbw/npgxIm+9JhSOZh91psxkUGpx+/BOz0i+SBgVo/uSHWzbstOAZSsjKkfzJmJC68mT01tZvXwhyzcf4t5n2YOqMSmv2FJnJnN6JVq3d7z/tedk/7gxo0JmpV+9ejX+/v7ysJCI6KkthD9Bp9MxdepUCHNCJUpKWxwG/I8CRgG4vP6ElL45w7oW0v/IpdYLLx8dWFhiJX/AVUb78l/GrLiLNmVa0pgEc2elE5vfRn0XQ2VtTUolBHt9xceQBg6AMhX5KtSiVo3aBiw1KWxrSJeaAfycmdmoBLUGLGTfubPsW9iHWhXrMeXS1/+2iUF5xZrKGmsLJQR78dXgQksYihQuSiP7xmg0GjH1TyInElE8GTZsGP7+/lQoX5Hq1WrIw4mKcZEedK1sDqgp2LYPtSzlW4QKIkgDCiMTjKKqWLXPWeM4lXNephTruZ45TTOi8DjKtIm7iLIHzcgYIyVImiCCEniHs87PhYDiczl3/RL7Nu/i8IUzzCz9isVT1vDsZ741sLx+iTHGxkqQggkKTOCFpseokWNQKpXs2LEDd3d3eVhIJEQiigdBQUEsWrQIEntrKJTSAmtLYxQosEiZMvKDSmmCqZECKTCAgEjrPC2v1g1n6rmvGOXrzuSe5ag3bBT1Ukm4HhzPxKhmTwgMIEAHCuNkmBpacWs/4rx7Hes2rDVgWc+ZV1G3ygylTNOScRMbkz10NIc6G/Z1iyO9esLz0EF1BpXXrwrge4AOFCYkS2ZooSUcuXLmplXLkNnq27dvLw8LiUSkdYbw+/Tu3ZugoKAfw1DLysNJl9KGVNZKJI/PuEdSn2tfr2HEjNN8U+WgndNQypqDMkNrxg2siIX0gZ0TJ3Hqm3yvEFo3Nzx0kMzKBgtDj2zNI7Y5DWDQkP4GLINZdcPgu08xpMXd4xuktP4xY4Rh5fXLtG589tCBqTWpUhhaaAnLyGGOGBkZc+zYMd6+fSsPC4lA4jzyEjFfX1/WrVsHwNik0BqKCXUWsqZXonV7zSt9s8poX7HOcTKnvyrI2GwSIyun/BFQkavTJHoUMkX7ZiNjZp3HR7YrQPDr17zXqkmfLYthI+YAjErQZ9VB9u85ZMCyj9FVww9IjzPfzrNi6wMy12lEsdA3H115xYXgV7z+oEWdPhtZDC60hCVjxkx07tgFSZJo06aNPCwkAiIR/WGdOnVCo9HQtEkzChSIxSzMiZkyDYULZEYVcJ9b9+UtCy1vNg5n6hlPFGnsGTvKDpuwR6dJcfpO6EROtYbn60Yy95p8lJSGZ3fu8o0UFCiUR/9gCX2UVuQsVZGKFSoZsFQgf5q4P2W0bueY1qkru6z6M29Iuf+evYqyvEDr/pALFx6E/4kNrTuPLp7jYdiV+tb9oHl+i3vfIHn+ouQ2uNASniGDhmFmZsbly5d5+PChPCwkcHF/VgmR+vz5M3v27EGlUuH4Y/LGv4sxRaqUJw0fuXjmLmFHC2vfrGfktBN4Yk2NYRNx0DOpWorywxnnkAFl0AOWj5nPnbB1s/YVpy88Q2NWhirlDH3OJ77pcHeeS1u7DuxNM5JdW0dTLrQRCFGWF0HXmNK0Co2aVqHBpCuhK7k+vQHVHRpSvdF4nIMiWxdKy+vT53iuMad0lQokllLTJ3Xq1PTs3htJkmjbtq08LCRwEc924bdp164dOp2Odm3akz17Dnn4r2BWvjG10km8PLyLG6E/ZqR9w8bREznhCRblhjCxbVb0DpJW2mA3chR1Uin4fmcho5Y/+hnSPNnFvrsaUlZpRO1UieGw1vH+0CAaddqIed+9nFjRjWLy+ZAiKy8AgvD/rgW0fPf/LxDk9x0toP3u93OAg751AGges/vAbTQpq9KoZqpEXxn07zsAy5SW3L17lytXQpOzkBiImRX+kNevX5MjRw6MjIy4df0e6dOll2/yl9BwZ3oV6sxzpf4SZ1Y5pI6DCtCHU0PL03KjRIfNzvxTPYYzGMQD7bu1tK09A/PJx1nRNJP+xAtRlpf/mwscvS1RrE5lsoU2Z/xfc/H4TaQidlQKXalvHeBzegCV2qxDareTS7NrxvpnKhKSeQvmMnHyeHLmzMnz58/lYeE3EDMrJCKhPwHetUv3vzgJAagp3HU4jdN4cGj+Qm7Ib/XEgubxSmbvfEeKqoMZUCUxVKc63I7t5LxReWrk8eXZk8c8/rk84e1XTZhtIy8vs6yVcGgSJgkBmGWjYuNm4RKO3nWaR/z7zzbep6jBwH7VkkQSAujetQdp0qTlxYsXHDlyRB4WEiiRiP6Ae/fu4ezsjLm5OYMGDJGH/zpKm4aMH2dPqqfLcVx0K4qfGzeA5hmrxszlulElRk7sEPczVP8WOty/eKJx3UHf6mWoUDnsUoG+O1zDbR2n5QUhAztWj2DeDWMqDp9K+8RRaAYxMzNj2ODhAHTv3l0eFhIokYj+gNCbp3169SNVqlTy8F9ISXqHf1jQqwT+R+ey4XHEEWGG0eKyay7b3XLTbtYSuiaaYV9qCjte5vNnbzwjLB7s755Rtn1clVcIrct25u9wJXebuSzqEoMRholEh/adyJw5C+/fv2fTpk3ysJAAiXtEv9nFixepVKkS1lbW3L55nxTJU8g3EQQhjm3bvoVefXtgY2PDly9f5GEhDol7RIlAx44dARg4YLBIQoLwhzRv1pK8efLi7u7OwoUL5WEhgRGJ6Dfav38/r169Il269HTtIvqrBeFPUSqVjHYMmblk9Oi/8Zm9xEUkot+oZ8+eAAwbMgJT0980NYwgCHrVt2tA8WIl8PHxYcKECfKwkICIRPSbrF+/nk+fPpEtazbatRGzAgtCfAid3X7mzJnodJHO2y7EM5GIfpNBgwYB4DhyDGp1UhuXJAiJQ9Uq1ahUsTLfv3//eU4KCY9IRL/BP//8g6enJ/nzF6Bpk2bysCAIf9DY0eMBWLp0KQEBv/4UlhD3RCL6DcaPDznwx44ah0KR+H5sTBCSkpIlSlGvrh3BwcH06NFDHhYSAJGI4tjo0aPx9fWldKky1KldTx4WBCEejHYMuSjctGkT3t7e8rAQz8QDrXFIo9FgYmKCTqfDrl59KpSvKN9EEIR4MnqsIwCNGjVi79698rAQS3HxQKtIRHHo+vXrlC5dWr5aEIQERMy2ELdEIkqAZs2axe3bt+WrhQRi27Zt6HQ66tSpg7W1tTwsJHEKhYLevXtToUIFeUiIJZGIBCEGNBoNRkZGAEyaNIkxY8bINxEEIYbiIhGJwQrCX8PRMeQeAcDcuXPDxQRBiD8iEQl/BY1GE27yS09PT/ETAYKQQIhEJPwVHB0dCQwM/zs+Q4aIHykUhIRAJCIhyZO3hkK5ubmJVpEgJAAiEQlJnr7WUCjRKhKE+CcSkZCkRdYaCiVaRYIQ/0QiEpK0qFpDoUSrSBDil0hEQpIVXWsolGgVCUL8EolISLIMaQ2FEq0iQYg/IhEJSZKhraFQolUkCPFHJCIhSVIqlXz79o3v37//XFQqFUC4dWGXli1byl9GEIQ/QCQiIUlSKpWYmpqGW0J/pFC+PnQRP+kuCPEjQU96un//flxdXeWrBSFWevXqhU6nY/ny5fKQIMSKqakpLVq0wNTUVB76a8TFpKdICVS3bt0kQCxiEYtYEvTSsGFDefX1V2nQoIEESM+ePZOHDJZgW0R169bl2LFjKBQKWrVsIw8LQox9+vQRjVZLpoyZ5CFBiLFz587w8dNHChYsyP379+Xhv0ZctIgSfCJavGAprVu1lYcFQRDi1dlzZ3Bo3kgkojhIRGKwgiAIghCvRCISBEEQ4pVIRIIgCEK8EolIEARBiFciEQmCIAjxSiQiQRAEIV6JRCQIgiDEK5GIBEEQhHglEpEgCIIQr0QiEgRBEOKVSESCIAhCvBKJSBCSpEC+vX/KvVs3uPP0Ld+C5HFBSDhEIopUAG9vnuTEqeOcvPCQLzp5XEbnweNLJzhx+hou/vJgIhb0nttnT3Dq1lt55Ced1zOunDrOyXP3cNXKo1EJ4v2d05w8fYN3AV68uHqSE6dOcO6BG1G+jOYT986e4MSpszz4+JEH509w6vorfOXbEci7Wyc5ceokzi+95EG9fn6W8/dx0/OdB324xZlTJ7n5LgDvl86cCt026jfMp/unORn62dzuc+7USa69jviO0bpF8XmiEfQJ582T6duqMkVzZ6d4g7b0dxzGwM61KZovB2Ubd2LsqhO8MuSFdW48OHeCE6dv8j6aJBZaZqeuvsRHHgwV9jjyfo7z6eMh31/UBYfG9S5nQss46BfKRkjQRCKKjNaV/RNa0LJ1M1o0s2fwtnfoqZf+E3yL5b2a07LdaPZFc3IlHt+4MKU59dsMZvdHY3nwBy0v1/fBoXUzWrRsw+xLAfINIuV10YlW9s0YuvcjRsbJCLwynS6tm+LQfCDbPkRW2lpere2BfcumtHHczUezFPicd6JDI3uG7v8k+44UuB4YQZvWDjQbuZ33kb3kT1rebhlA09bN6PDPeb7L56X3Os+ktnVpOWIXH42NMQ24xMyuzWjR3J4h299HenxoX/1L7yZNaNFuKHtdjVGZ+3BuSlsaNBvMPlfZXiqzKD5P5PyfbWVgvXK0XvqIVLUdWX/+OS/u3ODssTOcvfyEV3fPsKhLcfwO9Kd6jVbMd/aI+rUDLvFP56a0bO/E8W9RbonmyVr6t2tG65FbeKORR4l4HJkGcmV2R1q2bkST4Vsi/160L1nTtwHNWrdk+L6PmBjHrmyEhE8kIkNIXzgydSy79V0iJ2He56cwZOUT0rSYyWQ7W3k4hOYhO/fcJNA0Gaa6dxzafhJv+Tb6eJ9l6rClPE3TmhlODbBVGlOg5zR6FDRB8jjKjNnH+SbfB9B92sb4f87hrchAs3FjqWmZgnJD59I732d2jh7J7nAVuzHFHBqTRw3+V/dyKNLk9oP2JfsOXCcAc8o3bkJmVdigF+dmDGL507S0mjqF+mmVGBfow5RuhTGRPDg2ezon9b7hj+yYOIPz3goyNJ3EqOpWkLw8w2f1Jf+X7TiO2cWncG8rqs+jn9/dhbRvOpqnlRZz7uRmnLrUo7CtWbiTW5k8MyXt+/PPnkvs6ASrOzZizKnPf6Qyj3AcGRek16ReFDKR8Dg+nVmnvsp3AXR83DmWWRe8UKRvgdPIWljGomyExEEkougoU5ErZypw28vEyYei76JLKoLusXTiWl5a1GOkYx2sIjlSAm9uZfdjDRYVm1DDGj4f28JR9+gKKYj7y8ex/pUFdYeNpVboi5uWYsDELuRSa3m3YyILbshaVzp3jkybzBF3BbYNnBhnlzrkADYtRf9xbcnkvo/Jc06H6x5S52tKowJqCLjGgUMuUXb5aZ/vZf/tIBQWVWla3zbcyRF0fwkTNrzAoo4jo2pa/4iZUrL/VDrlVKN9t5VJi68R/h3rcD86ialH3VGkbcT4MQ1IHfpRSwxkQqvMfDk4kdlnZR1aUXweOe27rfTrvAip53a2T6hPZhP5FjJKa0r1Ws/OCTk4MqALSx8GyreIW5EcR6YlBjG5Qy7U2rdsmzqf6xG+6sNMmX4Yd4Ut9mMnUP9nwRleNkLiEUn1IvwkqSnZbRhVLSXe7xzNlFOe8i2SJK9jC1lzX0vedoNxSBvZYeLHhW17eK1LSUX74ThUsQav02w/+DHqK22vIyxadxdtno4MbBK+wk9RfgROLTKjCnrAv5NX8SxM5vC5NIMJO98jparLqPFNSRdmxxQV+9OzrCnvds5ni0uYndR5aGxfAmMCuXFwH2FD4Wl4tG8f9zUKrKo3p15oxQfAN44u/Zd72rx06N8M27Ch5BUZPr41mVRBPPx3Aqufh/kDvheYNXEb76VU1HacRJNwO6agUu9elDN9y/bFmyK8r0g/T1i6d2wZPY4HNRayqlcJUsjjkTImV+vFLGvtxbyRS3kSycvHhciPoxRUGDqJVplUBD1cycS1z8JcJPhw8Z9x7PggkarWGJwapwt/jBhSNkKiElkNI/ykhfQdmDqkIha6N2weO5VzBvU96RHkxp3Dq5g5biD9enel9+ARTFu5h5uukdwN1rzn5snDHDt9FzcdBL0/y79TBtCrVz+WOvsAGt7fOsbR4ye556YDzWdu753PhGG96T1wBDM3O+Maps/ez+U8G+Y4MqhfN/qMcGL50Sf6u9F0bhzYdoQvxiVp2boYkd0dwusE249+REpZhcZ1slKzUW1SK/y4tGsnryKtH3S4HdrMsS/GlGzRjqLyF1daU9txAo3SKvG5Mpcpu3/cCwi4wYLxa3mptaTq0Cm0zhSu3wxUWWjatiYp/S+xZccT/vvYKrLbN6G0KQTdPsC+yN6Y5i57Dj5Go0xLHYfaWIYJ6dz2s+XYF4xLtKZNkQhvGKta4xjX0Bal7yXmT9vxo6stgJsLR7P+lZaUVRyZ3DIzsneMKnNz2le3xP/KZrY9ld1cifTz/Cfo1gqW3CrL8OE1sY7xmZycMn0dqfthFcvP+smDcSOa40hpVZfRYxpjq/Th8sKJ7PrR1RZwax5jN7xAm7IaI5zaIv+qDSkbIXGJ8eH7N5IkNbn/N4vBpVOgebUGxzmXYzhqR8fXawvoWKU4NToNZvqy1WzauZ2tG5cya3RHapcvT7c19yK+pv8ZZnVqRZseC7h4ZzGtajdm2Pw1bNu1maMPfNHhx7k5bWnTvgsLz15kbsuK1Ok+lgXrNrJ181KmD6xLRYcZXPUN4tXuPtSq2oABMxazbts2tqyZg2OHKtQefEB2jwL4doqjV7xRF7bDLqu8Fgil4/PhrRz3AKuqDtSyUpKiShNqp1USeHMnOx5HVj185cyxS3iri1KnXvYIlTOAMm0Txo2ogzVfODxrBme8g3i8chTLHwSSouwQpnTMoWc/JTY16lMhhYaHJw7zMky+UWVqTOOy5hB8mwP7n+mtuIJu7ubACw3K9HY0r5w8XOzb2SNc8VFTpHZ9skX8w6BMS+Mxo6llDV+OTGP2WS+Cnixj7Ip7BCYvz+BJXciudz8batatQArNA44feynrNoz884QI4vaBw3jXaCVrvcVAyhq0rKPm1OEr/JYOumiPIyVp7ScwsqY1fDnE9Dmn8Q56zPLxS7kfmIJyA6fTSX/BRVM2QmITyyP4L6TOT4+pAylpHsyT1SOYd9PwMdp+N2fSqvVYDrw2okjb6Ww9/YQ3b115ee0EK4fakVXzjF2Ozei1JZJ7GJIruybO4FG2jjgtXM+ahZNpVTDZf1+e9J1r//RirVFn1p1/xbvXz7m4ZjiV0yjwdJ7FiOED6T50L6pGCzl66wPvn9/lwLTm5DT5zrPNo5hzMfxnCbx1iVu+KrKXrSi7YR+G7j37dp7Fm1TUsK9BSgDzyjSpnR6l5iG7t9/QX7kF3uDyLR9U2cpRMcKlbigVmVtNYkj5lOjebGHmP7OYtPgqvmYl6Te5J3nV8u1/SFmJioWM0Dy+whXPMNlVaUv9xpWxQMODw3uQNz4gkGv7DvJGqyJb/ZaUMwsfu3HlJj6q7JSrkEVPAgyhytwWp0EVsdC9ZuvsWcyZMo+rfmaU6DuD7nkie8OQskIlChtpeHT1MmHfckgwks9DyP2yu/c/k79UGczDR0Lo3HBe78Sg/v2Ysu02+ge+mVC0dCH8Ht3lrd4D79cYdBypstBm/DAqWOh4s306s+c6sfCaL2bFBzCta14iLbmoykZIdEQiigGTQv2Y3rMYyQLvsmz0Qu7prWllNI9ZOXYu131MKdJvK3vn9qZ2wfRYmJphlbUMTYdvZNdUO2wkV47MmMWpCM0ikHyvcOl7DzZun0+/lo1p1LIXrcuG7TwK5KOiHgtXOVIvrw3m5mnJX38Uy0bVIaUiiHs7N/GqzCQ2zOlI6YwpMEuZjQr/m8ckh3Qode84dfQW/3UOann78AnuUnLyFsoboTsllPblTnZe9UeRug6Nq6b8sdaM8o3tyKTU8vrAZi7o6fHRvnvIEw8J87xFyBPZiwOoc/O/if0oYfad60tmcNTTmELdp9O7UBR345VpKJQvI6qgpzx4HBw2QNq6DlRJqUDz+AB75a01/0vsOeqCVp0b+6alCPcXtC48euqOZJ6PQrmjfMPk7jyNvsXN+H5jAbOOeWJcsDdTexYO/3oyytSFyZ9BRdCz+zwK+5aJ6vMAOlfcvlqQPl341lso/9MT6TJ8Duu2rmNO/+aMOqbnwAKM02citacrbhGS868y7DgCUOfqxpTeJTH7fo1Fcw7jaVyYnpP7EtVXHWXZCImOSEQxYkrxfjPpUdAE/1vzGbnikd5unrA097ay/fZ3lLbNGDmgLBbyDVCTtdUw2uVRo/t0hL2y1gkAkgW1evehpN5LXwA1+Zp0pHy4OklJmho1KGoEKNPRsGsrwveOpKBc+eKYouPT61f891c1fHj/CZ0qDZkzRlZ9aLi/cwe3g5TY1mxE2J4sk9JNscuqQvfxINtPRRzPrPnwFledirSZMkVZOQEY52tI7dxGIf9Q56J2/aKEa6xEoCZTlvQodV94//57+JB1HZpUt0ahecKhfXfCfW9+l3Zx9KMOdQEHmhaUXYNrPvDOVYcqTRYyRfuG81O/Vl5C3rGanLUaUiTqNwzqTGRJp0Tn/p73ER7BiuLzICFhhFEk7ynoizteoQ0F6Tu+fpE0eYzUqNFFPbgkVgw5jkIZk8+uDnlCv+qcdWhQONqCi6JshMRGJKKYMivD4Kk9yGfsy9X5w1n1IpITHAAdX27f4pVWQfIyNaig/+IV1AUpXzI1Sukrjx+8kUdBXYiyZSOmsP+YkC1XjgjdGMoUqbExBVS5KFTQVBYFE5tUpFSC9N0X3581kZZvXj7oFJZYWUbSnxJ4le17n6BRpqeOfeXwXUPGJWhSPycqyYPjOw/yWVbDab288NYpSGlpGWk3VwgtL9Y5suSuhpS2tiTTPGTlpDVEWdwosbJMiRItPl7ymRQsqdmkLmkUWp4f3sutn01AH87uPYarzoSSjZsRoRdN+w0vHx2KlFZEVhyhtC9XM2bZbTQp02GbTMOjf8ezLrobGEprrCyUoPXm28/M8TMY+edRpMI6hTffvup/fcv6w3BqWYYcmXJRtuV4BtYNbbWGJ3l64J3cGqtoPlvMGXAchdI+Z+24xdzRWJIubTI0j1bgtP65/m7qn6IoGyHREYkoFpKXHca0DrlQeV9g1th1vIn0jNHh6vYFHUrSZEgfRQtARbq0qVEi4eWpZ3i4aSpSpYjiq1IYYWKkJ65UoVAqQGGCiameuFodcgBI4acQ0AQHA2qMjBXh1ofyu7CZ/S5aUJvx+dQUxo4fHWZxYo+LMckUEt7nt7FP/hBpcBAaQG1sgv5XD6F9tZqRM87wzaQYvVYupHUWJd4XpjN2ayT30X5QGqlRIxEcFHEkYvLKDtRJp0T7+jD7QjPRtxPsOfUFyawcDo2y6UmOwQRpALURJlG+4ZesHTWFs99MKNpjHfNaZkXpfY6Z4zdFc/9FidpIDVIwwcHyqRyi+DwqW3JnN+HZo+f6W+UWJem68ATXb97k8MLuFNd7EaTF5cET/LPmJos8AaNAqQzZRhPl+wckHRIhx1vY8ovuOAqh5dW64Uw99xWTIr35d24bsii9OD9nDJujLrjIy0ZIdPTUTkL0UlJ5+HTaZ1Px9fQUxm6PZvofQNJGrGTC0upCXkFlFKFGQKFUofpj35QSExNjFAQSEGGOG4CvHN9+OGSkXdAzDq9cyOKl4Zel++/jKwH+V9ixK/yVrdLEFCMFBAZ8D6m89NG+Yt2oKZz5piZvl6n0KVOLoY72pFV4cGLaWPZE8US9JiCIYBSYJIvYAsSsMs3sMqPUvubI/qsEAp4nd3Hqq4RFhWY0TK+nkJWmmIa8Yfwjf8O8Xj+MqWe/os7Tncm9ylJzyFgaplHgcXIS4/dGNR1NMIGBwaAwwVRPpov885hSqlIJPp04yBO9mcgA2uccOPqcIhUrECFPKc0wM1WA5I3n18jfPYDO2wdfHSgsUmLxswijO45CaF+vYcSM03xT56XrxH6UrT6C0fXTovA4xtSJ8lknwou8bITERs+ZJxjEsgajJ7Yms/ILR6aNZY8bKCPUI0rSp0uDEi2uLq/Qc+/+hyDevvuIFhXpM2WWB/8wJalSWaPUeeDmHrGG07kdYPspDyR1btrMWMvqVev0Lgs6F8WEIO7s2ca9MC+jTGWDtVKHx+cv+q/k0fJ6wzCmnPFEla09EweVxxwlto3GM7SKJdLn/ThNPhjJDBdaXD+7o8MEq1RW8iBgQunGDcmu0vL22B6c/T9zZN85vLCiqkN99D63q0xFKmslOk839BQHANrXaxkx/RRfVdlpN2Eo5cxBmdaBsYOrkVJy48CkCRzS/4ZB68ZnDx0YW2FjKX8DUX8eqzrtqPttA/MOuEWR6CKj48vhOax9X402DcI/VAyAURYyp1OB5jUPH+p92uwHLR+fPsNTUmCdJTs2YRJRVMcR/LjgcJzM6a8qsrWZwpCy5qC0pcno4VRNKeF2cDwTD3+J5LNFXTZC4hLh+BMMpcS61ngmNc0ArntxmnaJgAhdEEpSlSlHPjX4X97Pwciu5H3PcfzSNyR1fipUSCOP/mFqsmbNgEr3GZfX8glUtLzbv43zPmBUqBV9OzjQ2L6J3qXNwE5UNAfNs91su/bf8EJ11mxkUOn48uaV3ulZtK/XMWLaSb4q0uMwZjTVQ29tqLLTflx/Sprp+LBrLFPP6JufLJg3r9+iVaUjW2b9HaHGxZvSMJca3Yej7Du6j/0XvVHY1KFZrVTyTUOos5EtvQrdlze80vuGX7HecRKnvipI38SJkdVCRzOqyNZuEv1KmKH7uJ3x00/qnTuP4Fe8eq9FlS47Ed9yNJ8neS2GDi7KpfED2PgyZt1TmlebGDzmONn6OtJI33NIqmyULZkBJT5c2LE78u7FoMfs3H8LjcKCUhVK8V/bJKrjiJALjo0hFxyKdM0YP/zHIwCAKltHnPqUwkz3gZ0TJ6FnzEv0ZSMkKnqOQMFgyjTUHzuZxrbwfs9KDuuZY02dpw0dKluC9zGmD1/HE/nIKJ07Z6dPYucnCeua3WgT4W75n6bEpnARMqkCeXj7TvhngbTP2bXLme+YULKxA7ki3lD5SZmuES1rWKPQvuHA9tM/H9ZVpipK4YwqAh/d5K58+Lv2NRtGTeTUV0hdbxxj6v+YS+4H4wK9cOqcDyPtazaNnc4F+YhkzQtu3vdEMi9IkXyRVE7qwjRtWBC1zpULS9bi7K8kXe1mVItsLIjShsKFMqMKfMDtCOP1tbzZNJwpZzwhdX3GjGr4cy45AIwL0mN8N/IZaXmzxZEZFyNWyJqXN7nnKWGevygR3nK0n0dF5tYLWNDgHU7t+rHjpfz96adx2cuQTqN4VGE2i7pF9qyOCaVbtiS/sYT3ucn0mXcl4nNOWjfOTOvLknvBqDI3pWO9sMk8iuMI0L5Zz8hpJ/lKauxGjaNB+IKjQLfJ/C+vEdo3Gxkz63zEi5Zoy0ZITEQi+kXKtE2YMKY+aSQfvP309IWrstB+6hQaZFDy6egg6tVpw9jF69lzcB87181icPNqtF3xAClbS6ZPaUPGBPCNGBeqSvnU4HbpFLfDXGhr7m9j171gMCuPQ8Osem7sh5WKui3qY6vU4Xp0K8dDGzDGhalSLg18vsjpsC/+o1KffNoTUlZn+LiWesrCnLIDJtI6iwrNi38ZNe9qmGHnoH17kvNPNZiXqkaFSEf/qsnTuDFFjTW8vHcfH2UWGjSvov+hUACMKVylPGlw4+KZsM9b/ahMp57AE0uqDZlE8wwR3jDmZQYzvmVWVJrnrBk7m2vhRudreXvmLE805pSpUjHCezDo8yjTUGvSTpbWe8XYxg1x3HYbz8haL1oPHuwai4N9P64WnsGWuc0jf9AUMC7aj+m9ipIcTy7NqE+Z6s3pN24Ks+fNYtq43rSoWoYWi2/hbZqPLtPHUE12oymy4yjkgsOJk56QsupInJpljFgRmZdl0Lg2ZFFpeL5uJHOvh3+swaCyERKNCN+/EFNKMjadyujaqSIdBabO3p6VezcwuGY2tE8OstipL//r0p7uwyax9rIXWRuMYePepTSLdKaBP8ysAva1MyC9OcSuq6EVQADO23fzTAMWFZrSQN+NfZnkVdrSKIsKyfMU2w+5/ujrN6N8w7qkl15xeO+Vn4lE67KBkdOO4yklp0z/qXTUO5cOYFmLkSPtSasM4uHKESz82azS8HTPHm5pUlKpYb3wLRMZVfYmNC4R0omkym5Ps5JRPTkJZmUbUye9xOujO3H++YbfsHH0RE54SiQvPZhJHfRPVwRW1BwxhoZplAQ9XIbj4tv/hTRP2bXvFhqLKtjXDt/6i8nnQZWO2uMOcGR2dVxXNKd4sfI06tKH0TP+YcmKRcybOZqBXRtQqVhhGs66T/4R+zm6oA25o/7YQErKO+5hx+Q2FEujxOPRMTYtm8HUqZOYtWwjJ5/6kqpoayZvO8i0GjYRKxO9x5EWl80jmHLKE8m8LAOdOuufNgmwrD6a0fXTogx6wPLR87nzs1kVg7IREgWFJMnG7iYQdevW5dixYyxesJTWrdrKw4mUDp+3N7ly6xmfvDSYWmUiX+myFLZNeJd0mvtTqVVvBu9qLePSv63138iPLc09ptetzqz3dVhybgMt4+LFfc8wtJoDa7Xt2HJ+IbUiDAP7FRruz6xOrTlvqb3wKmtbpI1Y6caC77lBVGq1Bm3r7Vz6p3b42bNj/XmCcH92jctXb/Lw1XvcvYNRpUhNxmx5KVKiAqUK2kbzUHAkgjx4dsuZe69c8QpQYGqVjhyFylAyp3UkXXshfstxFOuyiVtnz53BoXkjChYsyP379+Xhv0bDhg05ePAgz549I1euXPKwQUQiEvTTeXCwfwU67U5Br91nmVRW3nH0K3R4HupF5f/tIEWPg5x0Kh+hWypmNDxZaEetyY8pM+0827roex7o1+g8D9CnWnt2pejDvmNTKPdrbxg0T5jfpBoTH5dl5smd/C/ctBe///P8MXF+HCWcshGJKERcJKK4uD4RkiJlKuzGTKaxzQv+HfMPN/TMPBR7SqzrTcDJPjUv1oyM0QSy+mherMRx/jXUFRyZ0uH3VExK6/qMm9CE1C9XMmrB9XD3pmJOw/M1w5l73YiKw6fTUTYz9Z/4PH9MHB9HSapshJ9EIhIipbR1YOaC/pQMPML8jQ/k4V+jTEeT6UvpVyKAowvXEusfCtW+YeeCrbjmas+cBT0iTtETZ5SkazSbRX1KEXh8Lutj/YZB67Kdeds/kbvNXBb/L0/4rq0/9nn+nDg7jpJg2QghRNecIAhCLIiuuRCia04QBEFI9EQiEgRBEOKVSESCIAhCvBKJSBAEQYhXIhEJgiAI8UokIkEQBCFeiUQkCIIgxCuRiARBEIR4JRKRIAiCEK9EIhIEQRDiVYKf4mfCuIm0bimm+BEEIWE5d/4M3Xt1FVP8xMEUPwk2EdnZ2XHkyBH5akEQhASlcOHC3L17V776r5GkE9HZs2dp2rQpGo1GHhKEWPHz80On05EiRbifoBOEWDMyMmLWrFl07txZHvprJOlEJAhxSaPRYGRkBMCXL1+wsbGRbyIIQizERSISgxWEv0K9evV+/n/ZsmXDxQRBiF8iEQlJnkaj4eTJkz///fLlS9zd3cNtIwhC/BGJSEjywraGQolWkSAkHCIRCUmavDUUSrSKBCHhEIlISNL0tYZCiVaRICQMIhEJSVZkraFQolUkCAmDSERCkhVVayiUaBUJQvwTiUhIkqJrDYUSrSJBiH8iEQlJkiGtoVCiVSQI8UskIiHJMbQ1FEq0igQhfolEJCQ5jx49Ik+ePBGWUPL1efLk4dKlS+FeQxCEP0fMNSf8NRQKBQDikBeEuCPmmhMEQRASPdEiEmLl1KlTnD59Wr46QZs6dSoAVapUkYeEv1DWrFlZu3atfLUQQ3HRIhKJSIixt2/fkiVLFvlqQUh0Dh06hJ2dnXy1EAMiEQnx4vr165QuXRqAUqVKycMJlo+PD5aWlj/fu/D3WrBgAQDr1q2jQ4cO8rAQAyIRCfEiNBFZWVnh6ekpDwtCgpctWzbevHkjElEciItEJAYrCIIgCPFKJCJBEAQhXolEJAiCIMQrkYgEQRCEeCUSkSAIghCvRCISBEEQ4pVIRIIgCEK8EolIEARBiFd/7IHWI0eOEBQUJF8tJELPnj1j+PDhmJubs2nTJnlYSKTSp0+fqGbK+BXigda4ExcPtP6RRFS8eHFu374tXy0IQgJz4MABGjRoIF8dLRcXFzZs2IBOp5OHEqS5c+fy7ds3mjRpQtGiReXhBMnCwoK+ffuiVqvloXiVaBKRra0tbm5u5M2Tl5w5Y/dGhYTl5csXWFtbY2VlLQ8JidDBQwcAGDVqFFOmTJGHo2VmZsb379/lq4U4NnToUGbNmiVfHa8SXSK6evkGuXLmlocFQYhn453GsnDx/FgnIrVajVarpWf33vJQguTl7YWr6yfy5M4rDyVIa9evJiAggMaNG7Nnzx55OF6JRCQIQpyIi0SkUqlwfe8uDwlxYPXafxk6fFCSTURi1JwgCIIQr0QiEgRBEOKVSESCIAhCvBKJSBAEQYhXIhEJgiAI8UokIkEQBCFeiUQkCIIgxCuRiARBEIR4JRKRIAiCEK9EIhISDu/HnNq7k527d0Rc9uzi+ANP+R6Jhu/LC+zfs4Ode3ay58BhLjx0I1C+UagkXA6CoE+iTkQ+Lrdxdnbm+gsPYjLnr+bzY65edeaRWxD4unDv6hWcr17juWfUr6L9/ISrV6/gfPM57p+fce2qMw8/Bcg3+8003JtRmYwZ0lFvwTO08nAipnE5xtIZU5g2YwrTpo9iUK+uDBw78ce/p7Dg8HP5LolEAOfndqDLgGFMnD6ZCaO606x6QUo0ncJ594jHXNIth4RAw8OVbalWvQUL72vkQcNp37Cxd2Uqt5jKJT95UIipxJuItM9Z06c2dva1sWs3h2uRXl7K+F5mautqNOyzhheowciDw6MbYdewNvYjduMWsV4IoX3Ov71rYdewPv22v8PI+AN7hjakepPhHP0S2U6/h1YbRFBwIMHaOJwmUPOA5Z0rU7ntfO79wvn5K9SFBrLzym1uXr3DzdMTqGSkpuTgE1y/eoebV29xcHgZ+S7xQud1lz0r5rPi0EN85cFISJKEKl8fdly+w937r7i7sze2t+YwYM7FCC0jg8rhb6wIvZ9z+dghzj5yj+ICTMfXp+c4fPQ8T7/pOS+/HWbhgkPc98lI4ew/fk7B9zmXj+zn8IXHRHot6u/C9RMHOHzlOT4AqowUyaLj6bklzNv5LkYXwkJEiTYRaR5vZ9etQIyMjdC+2cPWi4acjT5cmjGAxY9S02rqNBqkVYJJcfpN7k5eIx1uh6Yw+4KPfCdAx8ed45l9wQtlptZMHFGVlJbVGDOrJznfb2C400H+cC6Kc9+OLmD+kXv4ZCxCjkh+7sTv7WV2LnFiWP/OdOzUhk69+jJmzmqOPfKIvGLwfYXz8UOcvO9GxPymw/vlZY4ePsatT4nnRxM1L3YyY/xYxszdz9uIH8oAxthW6kfbUko+3LnB20gLLwp/YUXof2Yybdq3puXIrXyM9AN7cWB8U9p1cGD8YW9ZTMf7Pas57KYkb5P2VDD/sdb3GksHtadds3r03uSi51j2x3lWcxq0bUfvuWfx1AKoyd+yNaVNvDm/YRNPYnUcCKESaSIK5Mb2XTzSpKRqg+pYSB85vOMEXvLNZDSPljJ+3XMs6oxiVE3rnx/evOxQJrbJjlrzkk2TF3FPdomqcz/MlOmHcVeko8n4cdSxDtnTvOwQxjVLx8fdE/jH2ZBEmEDp3rF7/UFclflo2qYiP87P/wQ8Y8/oupQqX5fuE+bw79ZdHDh8kP271rNkxkBaVy9KlT7/ckd+3gMBF2bQvn1r2gzbyGvZGe5/fz5t6tajTec+LLryLXwwqdN+xctHh9rCkpQKedAQf2dFGNoHYEhfQITfFdC+ZNfOi/iqC9CgUSFCr7eUti0Z3a8cySVPTs6exhFZs0jzeDlOa58QbFqEnqM7kEUVsl6V2Z6GJU0JfriLHXcTz4VUQpQ4E5HfebYdeIXOohJNhjWlsgV4nNzKoc+RXiYBXhxbsoo7mry0H9AU23Cf3JLqw51wSKck4N4SJm56HeaqyIeL/4xjxweJ1PXGM65B2jCFZknNvt0prX7JlgXbeR/Vn0/AtK93sf2yL+p8DWlSQNYc0rxic+9G9Fh5GTfTgjQbtYZDFx7y9MlL7p4/zArHFhRK4cOjHUNo3nUpj6M4H8PWC7rPhxndbTKXvUzI978lzGicJkw0idJpCPruh7fbI47OHcbyu5bUcKiLTSzPQlERxoz2zSGO3AlClb0atXKFPc7V5P3fJLoVNEb3aTuT517h52Wl7i2bp8znmp+aXO2n0LeIyX+7KdNTq3oRjLQvOHr4LuIbiL1YngLxy+v0Ng5/lEhZtQl1stWhcVUr8D7L9v3vI+2i0H0+wOajbhiVaEO7wsbyMMrUDRkzqj6p8eLsvCkc/NHXFnBrHmM3vEBrVQvH8S3JKCsxVfbWtK1igc/FTex8GbFRH3d0+L65wLbFk1h6+hNadLw9NhunuWs49shdT7eXobS8PnyI20EqclStTbjzEy0uG4cx+tAHtCkrMGbHcVYMbEq5PJlIbZ2aTHkr0mzQKg5tH01ZCwmPc1MZs/GNnq4NmaDHrOrXh/WvtNjWmcGaCbVJHdsj0f8px9YtY4vzx0i/+4RCc3caVbKnI2uhcnRe60mlcZuZ3zx97E9CURHGgI7P505zL1hB6pLlKSCvAkxLMWBce7KpNTzbMI5lD4MAHZ5HpzHrpCeKDC0ZP6QCycPtpCJD2bJkU2l5ef40v/X0T+JifQ7EG91nDu84hjvW1LCvhZXSipqNapFK4Y/zrh08j+Rg+Hb2MJd8jChWt8HPpnV4SjI2m8TwKpZIrruZMv8yvkGPWTF+KfeDUlJxyFTaZ9WzozI1teuVJ3nQbY4dM6ASjo2Ap+x0rEPJ8vXp5TSPvY+8kNDx9d4uFk8bQOvqxajaayW39XSNRUv3mXPn7hKsSE2psgUJd34G3WLtqjN4SaYU7z2HfsXCn4ahkhfrj1OH3KglLy5s3MTjqLKizpOzEzsz4YwHZoUHsHJhZ3LLK4UY0LzZzXTH4QxbfpHIxi/qvl5jy7xZ/HvuPVq/B2wZ1ZRqFUtTvdUkTn4N3ciLpydWMHFAK+zrlKN0meJUrNuI7pM3cFPPyLafdB7c3DyW/zWpRNmypajevCezj72KMAABQFWgPzsu3ub23Te8eXCeFT3L8qOXN5ZERWi479y4fo9AjMhTuGj44/wHi8qOjG5oi9L/BosnbcTF15m5U7fxQbKh3ojR1NXzZRnnLUp+c9A8u8a1SEc6CNGJWLIJnO7DXraf94LUtWhc3RIAi6qNqZVGSdDdHWzXOyQzkJtXbuKrykm5CpnRk05CqLLT0WkQZcw1vNg0lfkLnVhwzZfkpQYzrVPuSPZTYl2hAgXUwdx3vkz4XKDD9eZ+tm/fwjYDlp2X3oTbG4Cgp6zpZk/vf29AyT4sPvyAg33yokZNkaFnuXNgEd1KqHmyaxjNOy/ikb4aMCrfr3P1fiAY5aWIrKWoeXqcU680YFqaFs3z/uxTj8iEYvYNyK0GzdMLnIv0TrKGV1t603vVIzQZHZjz7zgqhHyFv5Xm1QHmz5jM1M17WNm9Cf1WneHV5488unCeh1+1gD9nRlWmStuhzNtxgZfeSszN4cujs+xc0Af75uO4qC/JB7xkc/eq1B+4gAN33vHF7SV3zm1maqfadFzzNEILRWGckow5cpAlnRVhOnh+iagIDaR5xYOn3kjKNGTPYaW/4lOmodGoEVRPCd/OTqdf1+GseabFovxQxjXPqH8f01zkyqyGwGc8fBosjwoG0lu2CZeWF7u3c8VfSdoajakSeoGevCqNa9qi1Dxl73bniFfG2rc8fPIFyTwfhcP3PUWgzteLyT2LYup3kTkzDuNpWozek3uTX98l1A8q28Lkt1US+PyB7B5JMA83D6d33x70MmDpu/xK2J1Dus3WDcXp+CdMig9j05ZptC6ZDqPQm9sKE9KX6cCMLZvpV9AIzwvTGL0h7P2t6Gle3+epj4QydXZyWIY/HPwe3ueVBlSZilEsTdSHijp3EfKaKUD7iqfP9Z2QEn5Xp9B1zGHckpdh2MpFtNDfNP1NJHxPzWTyBUvarrrJs2dveXFrA52yqgCJ4GQ5aTBkFSduv+LhlUucOX2Lh1e30CmXmu8PV7PowGf5C6J5tp0lp41oMOU495+/4eWTe2ztXYIUus+cmDqObZ9ikBg0T/i3a3WaznGWR6ImKkLDaFxw+aAFpS0Z0kdeB6iytGdCn1KY6Vy5ePoe/qZF6Tnhf+SK7FBVZyRDGiXoXHn79rs8Khgo6tolodE8YMfeWwQpbaltXzVMf605lRrXI71Si8vBLZyTP9yhec87Vx2qdFnIFO2lqCmFG9Yjz49j1ShPfRoVimYndWYyp1eidXvH+3CJyIhi3VaydctOthmwbBpWNezOoLnHpk2X8FZkwGFof0pEGM72g0U5Bg60x0bhw6Vt23kWplGo/fqEUztWsXTpUjYevctn2WW65q0L77WgTJuR8Oenls+unwkClGnSYxv5uRtCnZa0NkrQfeOrZ8RWqeR5nNG95nPne0aazlnHkBL6u/l+UhhjbGyMiUlkNUDMBXsHk6//KmbYZ8MEJcnT2pJSCWBO7fG7WDWiBSXS/vddq9PVoUezwqjx5/H9x2Ff6scGWWg2by/Lu5UhrRowyUhtx1n8L48ayessu4+4/rxvZWRkjJGxMUayl/hJ+5GHN+7w5KPs4I2uHERFaJjv7nj6SaC0wMoqkrIEwJisZUuT4ccmylQFKZolqvPfDCtLMxRo+er+RR4UDJSoElHgjS3seaJBmaEeTSqYhYuZlm2KXWYVOrdDbDshmwJF64WXjw4sLLGKbqis9jlrxi/lntaStGlMCL67lElb9T1bEIbKGmsLJQR78dUn7FWwEuu8lahZoza1DFhqFEoXZl/QuTlz7bkGRYqyVCsXdcWdslJVSiQDzbNb3PpRl/ldnU6D8tXot3Qv587tZcGA6pRtNImLYUZKf/fwIOT8tMY63PkpERQYkrUURiaYRnukqDFWA0hodfJxs6AwssAimRJ07jy69SLkocComDdn7atPbGuXOsxBquP91m5UKFOUEj+WMu2W80QD38+OpuLP9cUoVXcs52XdlMpMrRjVswim4VdHQUXqVNYokfD3k1/dgDp/Gwbay7p6TQpTq3JmVATw+O69H91zptSe94z3BwaQPZI6MOD2CS76FKVTp0rhA3rLISxRERpCF/CdAAnAGJOoDgDNI1ZMXsNznRnWVsnQfdjK5EVX8ZdvF4axSUh3SWBATPvFhVD6j+0EyY9zW/fyRgvG5l84OWscTpPCLDOP4mZmDJInp3YcwDVcr0gQQZqQCvVnt5ZeWl6sHca0898wLdqHNTNbkFHhwfHp49gT/gVljDE2VoIUTFBgxEo4tjSuH/msA2XqDKSP9FL6B7N02KZUQrA7X9y1gA6/d98pMeMit04fZOvWY1w+NocybxYyaV3o1EA6vgcEhAyrNjKW3bdQYGwaskb33Q//qD4+gOSHj78ECjNSJNfTfEpRltELB1PcPIBHK3oxbG/sRrlJmgACAwMIDPixBGlDXkcXTFDouoAAAoM0yCeeUFqlJW0UlZDvy2OsmNiTVvaVKVe2MIWL5qXS5IshycTgr1VNpswZUCLx7fNnvYMWItB9ZOfi3Vj0mE2/6Frfevw9FaECBSBJWvRc6/yg+xlTKMKc7Er1jwsGLZpIezC1vNk4hvnX/TAp0IeNa3uS3yiYR/+OYUUUI3A0mpCYUq3nuBcMkngS0bdjbD/2CR0Q8GQ/ixfOY364ZQH7HoV0Tfhc3MaesI+rK00wNVIgBQb8uCrST/tqNSNnnOGbUX66OfWlbF1HRtZNheS2D6fJUc2eEMD3AB0oTEiWLGym0/LReQfrN6xlnQHLxrMvw+wLKJQhX5DuR2UbFUmLVisBatRGAErSNHNisn2Ony0AdVZ76hWRePnsGaHnokr14xJdq5UNAVeRJm1qjADp83veR34ehvBz4Z27DlQZyJJZ3wmpwKT4cBaProG17h27RvRkxRP57fzoKMnUbgM37jzhwd2Q5c723uRXQ7LqM7n2Y92Du4+5d3oa1aJIOuFpebe3DzWqN2fkoh3c+GJC+tyFKF6iFMWyWcbwJFFiamKEAkDSRf+9EbJd7nZrWTOweAxaa//5WypCpbk5yRQgebrzJbIuCq07Ht90oDDHwuK/pK40tyC5EaDzwdtb/846t91MnH0aL2VWWo3uR9lyAxjdLCNKv2ssmLghkhkwNPj6fkdCQQqLlPKgYKCYnWPxRofb4W2c9JBQ523PnJXrWL1Kz7JyAR3yqyHgKjt2Pf2vYlXakMpaieTxGXe9BxOgfcW6UVM4801F9rZTGVzWHJQZaTlmKBVSSHzYNZapZ0LH+spo3fjsoQNTa1KlCFukGh7vGMvgIf0ZZMAydPW1MPuCOkMmbNWgdXvNq2gmbtB9fc2bbxKKFJnIkjqS/h+tO55eYGkVOquEEnOL5BgBOj8v5Oeneb78ZFOD9v0trr+LrOBC+Fy+yO1AUKQqRsnI5ghCTZ4uC5neKAPKr2eZ3GcKVyL2eP15X/cxcdRGngdlovG8S9y9coJd6zex9t8NLGhXMIrRgvpocff4hg4wTWlJMnlYH1VGStcpR6YoBsRE7u+pCI1y5SO7EWjfXOLCG/3Ho871IleeacAoL4ULhulGMLLFNpUSJHfc3PTt68nJ6RM58FnCpq4jw6tZAtbUHjqcmpbw7cx0Jh/6HPHCQuuGq3swKMxJa2sljwoGShyJSPuOvTvO4o0xxZoOoEOjJjS217M0as+gNuVIRjD3d2/hTugFtzoLWdMro6jQtbzeMIwpZ0IeXHMaVhWLHxFVzq44dS+CqfY1m8ZO54K+ijP4Fa8/aFGnz0aWcJWJESV6r2PfnkPsN2DZ7Vgj7M4obSpRqaAx+F9i/+GourJ0fDh8mNtBClKUq07ZSC6rv11czuZHmanboPjP5yiM0qYjlRKkL264ys5Pdb7aVM2sguCb7NhyK/JuJu0rtqw5jLukJEOtxshu34WnzIjDjIV0zmWM//2F9B69X9aN+ucFPb7CDU8JVXYHejXLG3GKo0hI3m64yYdo6jy5efs5GtTkyJsv8sEJceUvqghVGevTqExyCL7JsnEreCQ/lzUu7J40l/N+CiwqtqRR5jAXZEY/RhdqP/H6TcRBHX7Ocxi/3QWteXn6O7Yg3Y+aUZWpDWN6FMNU94m9U6ZzXj6MX/OKV+90oMpKzkgvwIToJIpEpH2xg53XvoNpaRo3zhHJ8zwAKjI1bkUVCwXal3vZ6vyjllCmoXCBzKgC7nPrfsTqVPtmHSOnn+SrIi0NR4+jXrg5V0wo1mcyHXKo0bz4l1HznCPcuNQ8v8W9b5A8f1FyhzsWlVjmKEOFCpWoaMBSPp9smhtVLtp0tSMNXpycOYJtr/V3ZQW92sSo+efxM8pN+56N9cxSoMXtwhTa996JVe+FDAuTqYxy5iKLGrRur3gjr1SNS9GpS3ks0PBo1UDGHv8YcdCG7gsXZvRg2kUfFCkr069P9WgrcqVVTcYvHEwJcw0uWwcyYP2zX5gZIg4YmWKsAOm7L35hk2LAQ3Yduhfpe9O+Wc+Avmt4FOaACLi3ktXnfECdn5q1ojpW48jfVBGqstFh3FDKpQT30yOxq9mMITMWsXrDapbPdaRT3Wr03v0WXeoajJ7QjkxhzwOlDUWKZEFFAE8fPA7/jFfQXRaPW8XTYCPydxlPl9xhvzVjCvaYQNtsKjSvNzB+8Y1wj4doPzzkqbsORapCFM2WxMv/N4pQZSU8Gu7t3MHdYDAv60DDTFGf2so0DWlVywaF7i2Htp/88YCpMUWqlCcNH7l4RjYVivY1G0ZN5KQnWFVzZEKTdBELJXlFho5pTgZlEA9XjmTh3bDJTMvr0+d4rjGndJUKRNUYiDklaZvM4J8OeTH9tI8BDe3ov3Ant92CkICAT9fZvbAvDe0HcOhzKqqMWsbIsrJ3oHPnyoLW1P7fbtIO2cOOEeUJ24GjTFWUoplUEPCU+xEmilORs8tcJtZLj9r/Pqs6ladqx8FMX7qK9RtXs2zOCDrVKUezeVfxkhTYlGtKzYxRfz+hzIsPZ9HoGljjzgmnHsy6oa+pGT115vr0HTWOce1Kx/ohUeMCNaiUQYnuw3YmjFrNqVu3uXpsJUOb2TPhHqSIZICLWfp0fD82iAb1OzBhyUpW/tMfh/azuR2gJF2jIfwv/++vmP62itC0yGC27F5IpzK2BL48zpo5oxg6ZCCO0xaz//530lfuzbJdG+iWV97PaUyhCmVJrdTy9pYzH8JcUfmeWMLqewEky9mRcX3LRjyHk1dmyMhmZDQO4uGGJRwJM+rU+/pVHmsgRYlKlIqkJ0KIXoQ6N8EJuMLWfc/QYEHFxg1JH+07tqRmy4ZkUEp8PraFoz+mZzEr35ha6SReHt7FjZ+XNFpcNo9gyilPSFGBwU7/zawbnhKbemMYWTsViu+3WDxmCY9CL5M1j9l94DaalFVpVDNV3BeoMh12Mw6yc3JbCnOHjZO6M3TLC7RoeLS2Nz0mbeJp8uoMWHGEjX1KhG+N6N5zcHh92m8xY8CO06zqUvxnl+NPxoWpWCY1Sq0LN6+/j9jiUeemw8pjbBhmTwELbx4eWcXM8YMZOHggo2YsZf9DDbmq21EytYovRwdQw64nSy68+9mNpzBPQQojFclSJJfdiFeTp8tiZrXKhXnAHVYs2B0uarDkhWnadyjda2SNtPWhNE2OuZECY/PkmOpLKmaVGb1gJFXSBnJv40Ca161CvfajOJ6sE2vWD6ZIMhXJzP6rnpQmZiRTq7GtP5fts1uS/u0+FkwYwojpa3F2MyZ7/amsm9GEaJ4BjhN/Y0VoUagD/xx4yKMrx9m6YhkL5i5hxZr9nL3zgls7p9Msr/42uVm5elSxURD84Bxnwow8Sl5/OU9cvfhw+R9q6+3dVGLbZCX33nvh/mg1TX7OBuLLpXNX8cWCcrWrh7vAE2JGIUkRJkuPc7a2tri5uXH18g1y5cwtD/8hGu5Mr0Kdea7UX+LMKofInsuIGZ/TA6jUZh1Su51cml1TNiliHNO48/SGM8eWDWPiYVcyN57OjF71KFckM8kjfBgt7za0ovocc6Yd/JdmUbRUfA73oFTnLfhWncv1Lf/72T8eQaA7T29f5+Gbz3hrVCRPlZUCJUqRL40JQW8OMLHfQFZc/YIGU9KV7sKMVVNpEH6a84TN/z03L13h6Rcd1nkrULV4RoNGsWncH3Duwh0+BScnU6GKVMhnE8MBDrHly8Hehem4M4ja826xqU2aWB/T453GsnDxfEaNGsWUKVPk4Wip1WpUKhWu793loQTEj5ODS9JqoxfVZ99kawc9vR8x4XuI3mXbsC2oIcsur6d5bKdRN8Dqtf8ydPggGjduzJ49e+TheNWwYUMOHjzIs2fPyJUrlzxskN9XcgmOmsJdh9M4jQeH5i/khvxGT2xoHvHvP9t4n6IGA/tV+71JCEBtQ56ydamUOyVKFFjnq0r1YvqSEKBz4+iecxiXrUle32c8fvL4v+WpC1/D3PhIUaUZddMp8b92mGNR/ZSGiQ15ytbDoVVHOrVrR7N6FcmXJqRDzDhrQybvdebQ7B5UyaLC9cZBzr2I9IGNhMksIyVqNadNm5bUNTAJAahtClKjSTvatWhMlT+WhADfcxw+7wGWVXGobfM3ncyxZE7ljm3Ip/bl0p49RDMQNFqex7dx/IuCjPadsPuNSehv8FeVntKmIePH2ZPq6XIcF92KOCddjGh4tnoE824YU3H4VNrr79OLP7ovfP6q4dPu3lSuXIYKYZfqvdkW9jfRzavQqWV+1H4X2b3/bcTuOUOpUlOqwyz2OD/Cee9qeheP7V0bwRCiIow540Jd6VXLioCrm9n8s389FnRv2b35BF9NS9Gle7VoB+gIUfvLjl4l6R3+YUGvEvgfncuGxxFH0BlK67Kd+Ttcyd1mLou65PlzV8GGUhdh9BlPPD97R1w+HKJnhrBfvTGFO/emtmUAzls3/Xf/K7ZUVuQqW5psEe76CnFGVISxo0xHq/lnOLl/Ge2z/8JZq7TFfsp+jp/cQp9wo+yE2PjLEhGgtKHm+MNcOb2Bbvlif8WuytKGxSeuc/yfpkRx+yXRUNq2YdGxMxxa2JFfOT+FP0RUhLGmtMxOsZIFyfhL2duYNHlKUSLXH+yKTcL+vkSU6ClInrkYZcuWo3BGg57bN5ASy2zFKVUgo7i6ThRERSgkHSIRJToqcrVbyv79h/ineRQ/8icIgpBIiEQkCIIgxCuRiARBEIR4JRKRIAiCEK9EIhIEQRDilUhEgiAIQrz6i+aaEwQhMnEx15xWq+X187fykBAH1qxdzcQpE5LsXHMiEQmC8MuJyMjI6OdPlgu/T5MmTdi9O5Yz1f8miS4RNWvaglw5Y/dGBUH4fabNCEk+sU1EzZo149ixY/yB6iRO6HQ6AgMDSZYsLh8K/72SJUvG5s2bqVWrljwUr+IiESH9AXnz5pUAsYhFLAl8mTt3rvz0TZJKlSolAdKFCxfkISGGGjRoIAHSs2fP5CGD/ZEW0dOnT1m8eLFouichq1evJleuXFSqVEkeEhKp3LlzM3DgQPnqJOfhw4cULFgQgLx58/L48WP5JkIMxEWL6I8kIiFpWb58OT179sTY2BgfHx+MjeU/yywICVfp0qW5fv36z39fuHCBihUrhttGMFxcJCIxfFuIsdGjRwMQFBTE0KFD5WFBSLAePnwYLgkBdOvWLdy/hT9PJCIhRpYvX46Hh0e4fwcFBYXbRhASqs6dO8tX8eTJEy5evChfLfxBIhEJMRLaGgolWkVCYqGvNRRKtIril0hEgsHkraGw60WrSEjo9LWGQolWUfwSiUgwmLw1FEq0ioSELqrWUCjRKoo/IhEJBomsNRRKtIqEhCyq1lAo0SqKPyIRCQaJrDUUSrSKhITKkNZQKNEqih8iEQnRiq41FEq0ioSEyJDWUCjRKoof4oFWIVo2NjYGJSKAfv36sWDBAvlqQYg3/fr1w9vbO9y6Xbt24efnR/ny5cmZM2e4mL29PU2bNg23TohcXDzQKhKREKV169bRqVMn+epIJUuWDG9vb9RqtTwkCAlGtmzZePPmDevWraNDhw7ysBADcZGIRNecEKWOHTsiSVK45dq1awBYWVlFiPn7+4skJAhCjIhEJAiCIMQrkYgEQRCEeCXuEQkxdv36dUqXLg2AUimuZULpdDoQZZIohH5X4h7Rr4uLe0QiEQkxFhQUhI2NDT4+PvKQICQaZmZmPHjwgGzZsslDQgyIRCQICYhCoQBIND+XLQhxIS4SkehDEARBEOKVSESCIAhCvBKJSBAEQYhXIhEJgiAI8UokIkEQBCFeiVFzceDz58+0atWKT58+yUPCX+TJkycA5M2bVx4S4omJiQnz5s2jatWq8pAQR+Ji1JxIRHGgQIECPHr0SL5aEIQEwNjYGA8PD5InTy4PCXFAJKIEYP78+QwcOBALCwuWLV6BhUVK+SbCX8Ld/QtarY60adPKQ0I8GTdhDLdu36RixYpcuHBBHhbigEhE8czT0xNbW1uCg4PZtH4L9erWl28iCEI8cnVzpWz5knj7eLNjxw6aNWsm30T4RXGRiMRghV9Qt25dgoODadLIQSQhQUiAbNPaMnnSVPjxkybiF4QTJpGIYmn9+vVcv34dK0srZkybLQ8LgpBAtGvTgSqVq+Lv70/jxo3lYSEBEIkoFvz9/enRowcA06fOxMbGRr6JIAgJyPx/FpIsWTKOHDnCiRMn5GEhnolEFAsNGjQgICCA2jXr0LxZS3lYEIQEJnPmLIwdPR6A5s2b//wZCCFhEIkohvbv38+ZM2dInjw5c2bPk4cFQUigunftSamSpfHy8qJt27bysBCPRCKKAY1G8/MAnjBuEhnSZ5BvIghCAqVUKlkwbzFGRkZs27aNq1evyjcR4olIRDHQrFkzfH19KV+uAp07dpGHBUFI4PLkzsOwISOQJIkGDRrIw0I8EYnIQGfPnmX/vv2YmJiwYO6inz+CJgh/Lw0vtvSjSSM72kw7gXvAI1b3qU8D+7o0aDaIne+08h0i0L7ZxMCm9ahvb0fbmWfx0r5jzygHGjRywHH/e/TdydG+383IVvVo0GoEez/o2yJqA/sPpkCBgri7u/8cdCTEL5GIDOTg4ICEhOOI0WTPnkMeFoS/TsDt2fQatY7zLyyo17o6NqZ5qVfNmhfXLnP5/BqcZh3BM6o8ofvIzonj2HDhElfuayjVsCIpVZmwa1sZHp5ixdBeLH+ike+FKmN92leAB2eWMbj/Uh5H3CRKarWaRfOXoFQqWbVqFQ8fPpRvIvxhIhEZoGPHjnz9+pWiRYrRp1c/eVgQEhXfd9c4tmczW3Yd4d7n6FstegXeZcHIedz0t6bWyOm0yaoClKRrMpHhVa1QoOPDzonMu+Yv3/MHHZ7HJzPlyBckklGs9wx65VMDYFKgNzP7l8H823lmjFrBswiJxoQCPWYzsLQ53y5OZ+TqZ0TYJBpFChelX5/+6HQ66tWrJw8Lf5hIRNG4desWGzZs+HkVpVKp5Jvop/Pg2Q1nnK89xi2as0Tn/ZrbV69w9eFHAuTBX6LB8+kZtq+czoRRAxgwsB9Dx01h0ZbjPHKP5k3FVOAnHl27gvOtl3yL5CpY9+0lN69ewfnqTV57RbJRZEJf/+o93vnJg/ro8H5zC2dnZ2689JQH45/mLtNq2pI2Wy3mPY9lMogpnSsnp9hRumxNWvfoSZ9e7Zl07Jt8KwNoebvFiSV3/ElWsj8T2mTl51mhykYHp8GUTQ5onrBmygr9LRbfS8yeuJX3WjAp0JOpfYph8jNoTP7uk+iSR4X3pdlM2/c5YhedcQF6jvsfeVVeXJw3mb2fI2wRrRHDRpEjew7evXuHo6OjPCz8QSIRRcPOzg5Jkhg0YAj58xeQhyMXcI7pLWpj12QEh6Lsn4Dguwvp1KgODQdvwiWO6iTvB5sY6VCUwpUb0XP0VBasWsOGzetYvWwG4wY0o2KJojQZt5MnBlXq0dO67mBo4zrU7/AP1/TNouJ3g7ntq1K7YT06L7hDoGkMDz3FGzb1t8OuYV2G7HKNWDHJaV+zrl9t7OwbMem0rzyaAGjRBgcRHKhBG4ezPWoeLqVDzQq0WnxXFtHisqEv3RdcxCNtdXpPXMSiOU60LJBMtp0B/C+zZOkZvBXpadK/C3ll12bqPD2Z3LMopoDftflM2SG/1xPIrcWjWftCA+rcdJ48lDJm4TYA01L07FMXK9w5tHAZd/UcU6Yl+tCvtjW4H2Teqjvo2SRKpqamLJi3GICZM2fi4uIi30T4Q2JYG/xd+vfvj5ubG3ny5GXIoGHycAKl5eORoTSw782Ki28JTlOCxj0mMm/ZZrZs3MSKORPp3agk6bRvObfsf9i1msKlr9FW679G+5adQzox46o3KUoMY83S/5H3v8tfwxiXwKF+TlT4cvngQT5G85a1L/ew/1YQJK9MU/uM8nAS9ZUjS+Zy+IEPGQvlDB/SvmTX5tN8U2Sg1cyNTO7ZgTbt+9CsuDwDRO/bybXseaNFnasFnapZysOACcX6TKdrHiOQPDg2ezonwzS8NE+XM275HQJQk63tNIZXSBF25x+U2DbsjH16JZonW1l/Qc8Vk9IW+/b2ZFBqeLJjLef1bBKdcmXL06VzV3Q6HbVq1ZKHhT9EJKJIPH/+nMWLF6NQKFg4bzHGxsbyTRKkwPvz6Np3JQ981WRpOJujF06xetJAOjg0oE7thjRrP5DJK09y+cgc7DOr+XZ1Fl0HbeFtHLXEIvLCeWZHhux5iypHOxatcaSshXwbQxhTpElj8qvB/+pejkSZiTQ82bufu8EKLKs2o0Hav+Mw173fxdrDrijzNqNdefPwweCXvPqgBXU+ihf/ld/l+cqJvcdxl9QUsG9J0chOC/PyDJnQjqwq0L7byqTF10K6nbUubHL6hyu+oMzQkokjaqAvlQFgXoUW9bOh0n3gyN6z6Msz5pVa0SCLCt3Hw+zWl6wMMH6sExkyZOT58+fMnDlTHhb+gL/jDI2F2rVro9Pp6Nm9NyVLlJKHEybtc1aPm4OzD9jUmMH2pd0pZqnvK1aSslA3lm8YTwULCbejE5ly2CP67q4Y0/Bicy/+t+Am/mnqMWXdPzSw1fd+DKPO1xT7Qkbw/Rr7D70l0typuc+eQw/QKGyo2aQu1vJ4kqTl1Z5tXPJTk9/OgYIh9/3D0BAy8bQxv3RN5XuBE1e8kdS5qVErDxH+TBgpq41hQpP0KAni4b9OrHmh4fOhicw87YmkTEfjceOpZxPV8WBM8dpVSaeUcL9wnGuB8nhIS7lOlfQoJXcunLyKvk2ikyJ5CubOng/A6NGj+fz5s3wT4TeL6ij4a02YMIE3b96QNUtWRjuOlYcTrKAba1jt7AvmFRg4uTO5oqlwTPL1YGy7XKh0nzi0diexeCQjCjo8z42ls+NBXM1LM3jVCrrkjml/nIwqF03sS2JCADcO7o+0FRd0ZzcHn2lQpq1Ls+oJ7IcKdb68ubSFhdMXc+qTFnQuHJ03njnrj/zaABLtKw4dvUWQKgfVaub+L0FoPnH/whnOXnyMu1YCnQcvrpzh7LkznLv6LNKBJZEJenyNO98klKlKUPrHKLdIKVPTYPQY6tkowPcSi2bNYObMPXzSKbCpO5YJjWyjrYBMipajmDnoPt/m+it95WNCsTLFSI4OtzvXeKlvEwPUrFGLFs1bodFoqFOnjjws/GbRHQd/nffv3zN58mQA5s9dhJlZzPvQ40cQ946f4I0WLCq3o0UOQ0b3mVC8iT151OB/8yRnPWJYK0Uh8MlKevRewkNdLtov2MCIMnGREFRktW9C6WQQePsA+17ry0SB3Nx7kJdaJZnqt6SyrIcqPgU8287whkUp3aQH4xfu4aG3BLqv3N27kClDW1K5bEW6r76Ft3xHA+i+nOXs/WAUNqUplz/MFYjvcSa1boRDm8mc9QE0V5nbthEOzRvRtM8K7geHfZXo6Pj26AHvtKDOXZQiRvJ4RMoMrXEaXBULhY5Pe2aw+pkGhWUNRo5vTUZDah/zIhTOoQbNCx48/C6PAmBeqAg51KB5eZ+HvzDsdNrk6djYpObOnTusWLFCHhZ+I0MOhb9K7dq10Wq1tG/bgUoVK8vDCZfuG/fuv0GLEQXKVTS4O0qdpwSFLRUQ8JQHz2N5OSkjfTmM4//GcMozLXUnb2amXbo4O9CUGRrRpFxyCLrFwYMvInbPBTiz68hrtKoc2DuUxVQej4LO7ToHdmxh23YDll0XYjTCMejZaro068mqW1Cqx1KO3TxCvzxqUBdl+LH7HJ7Xg5JGT9g5yoEOyx7GuIvp+42r3AsEozxFKRy2JZysBK1HjmfsyLYUMQPUeXEYPp6xo8Yzpo8d2aJp1ISn4927j2hQYJUpEykN+lJVZG8/hBaZQzdWkbX5ENpmM+RCCVBlIEsGUyCAD+8+yqMAqNJnIYMJEPiBtx9j8KXIWFlZM3N6yG+L9evXD2/v2FwSCLFh0KH0t5g/fz6PHz/G1taWSU5T5OGETfeeD65aUKQgY6Y0hn+x6vSkT60CnSdfvsRBItK8Yn3v3qx7YUqpQetZ1jEP0fQQxowyLfUbVcaCYO4d3MNT2Vv2v7STox90qPM50KxYzP5y8MMNOPbrQa++BiwDFuNsaLbQvmKt4ziOuZpQYtBWtk9qSylbI0IniVKYZKBsm1lsX9OfQkaenJ/pyPo3MalQNbx++AQfSUmabDmxCvvlmxSkSd8hDOptRy5jBSizU6PnEAYNHMLAztXJaGA+CKHB/YsnOlSkSpM2yvtD/9Hxfu8y9r8LbW1rcdm/ggOuhra+jUiTxholOjy/RHLvxigtaayVoPPk8y8ew43tm1DfrgFBQUHY2dnJw8JvYnB9ldR5enoybFjIEO1/Zs3DwiIuupL+IF0A/oESKExIZhqDefAUppgYA2jQxqTui4T0/Rk3H31FUphgaZMyzEOKcUVJ6rpNqWalQPPoIPvCTQHjy7l9R/mkM6KIfTPyG1ZT/mRUtBfLNu1k2xYDlvWOVDbww2kebGT9FW8U6ZsyrHdJIusttCg7mMH1bVD4XmTLrpjMFqDB5e17tChJmyGDgQkiMv68OuRElyEb9dyD0/HdPxAJMDUz+5lIo6L7sI1Rkw7zWacmd+ue1EipQOe2j4lTDvHFoFykIJmZCQokAv0jmaVBkQxzEwVIAXzX33sXI7Nm/INFCgsuXbrE9u3b5WHhNxCJ6Ic6deoQHByMQ+Om1K2TGK+EjDA1AiR//Pxj8ISk5Mf3AAkU5qRI/uuHgyJFXcbNakM21WdOjGvLsEOf4n40nlVtHGrYoNA84tD++/9V2N6n2HPyM5JpGRwa5/zvaX8DKa3zUbFGbWoZslQvQjqD/oAO12tXea5RkKJ0DSpEOXLaksqVS5EMDU9v30DfY7hatyvsPCFPUv64e/giocTCyjrGnztEAO8urWZUy7JU7jyHgw8+oa9Ol6TQY8uANKR7z46x4zj8WYfStjHDR01gVNcimKLj/c4xTDvzVb6Hfj8mGJaI/LgO2USCn+8v9mzT2jJ50lQAOnfuTFDIcEPhN/r1micJWL9+PTdu3MDKyprpU2fJw7GkQKkE0KKJcGUpo9OFnGIqdSwrEUCdkfRpVCD54fLqXcR7J5EJeIfLJx2oMpA5069dS4eysZvDvyMqYhn8gk0DOjDruo98k1+UkmqN62Kr1PD0yN6fT91/PbmLUx4S5uWa0ihzrEsyjmlw/eSGDiVp0qcnuvv7ZrZpsVRCsMcXvoT5EnXeTzm2uDd1qjdg6M5H4WcR0AUQEBhSARsZG9hMC0tzn3n2eSjRZCi7vItSJtL7N8ofrRMI+O4XRVoA0PFx9yicDruhU1hTa8QEGqU1o1ifSXTIrgbtazaOm8FFfdk2HIkA/wAkFJgki2TgkBSAX4AEClNMkxmQIA3Qrk0Hqlaphr+/P40aNZKHhTj21ycif39/unfvDsCMqTOxsbGRbxI7ymSYmSpA8uFrNDMXSD4++EigTJ4Sy8jqgOgoU1G0SBZUaHh0+TyGTr0VeOcSN30llDZFKB6zO9dRMKNo39UsbJ0TtfdVZv+vBxtexu1VZfKKzaibXon2xUH23Q0CnTvH9p/hGymp0sSe2DyupP10hZ0b17JugwHL5tO8MjDbK0KuSNBpo/9SJJ02ZMoftfrnvbWg65OpXrQcvXYFkD6dvu9IhfrHcaPTxmgY3E8WeRoxfMU5nPeNp1KqyCpzJalsrFCixdPtc5QXO7pPOxjttB9XnQKL8sNwapU55CIreSWGjmlOeiVonq/CcZ4zkXS4/aDB7bMnOpRY2aSWB0No3PjsqQOlFaltYnsCRTRvzgKSJUvG0aNHOXbsmDwsxKFYnK5JS4MGDQgMDKR2rbo0a9pCHo49oyxkSqcCzWsePIyqRaDh1ZPn+ElK0mTLjr7JTgxjTBG7emRXgf+ldax/aEDFr/Pg6Kb9vNcpSVfTnnIxGWIWHaUt9aevY2xFa3SuBxnRyZHjhmZHQ5iVp6ldNlTaVxzZf5OAL4fZe94LrGrStG7qWB3YmsdbmDC0P4OGGLAMX8F1gwYrqMmYIR1qtLi+eal3doD/6PB8/YavkoIUGbOS+kedqkpVim4LznLjxCIaZ9WTiJTmWCQ3AnT4entHmSD0Uheiy6wFDG1cCKso63E1mTOmR4WE57u3kT+DpPvE7rHjOOCmA7MS9J3Yjdw/X1eJjd0YRtZOhYIgHq4cycK7URSk9j0uHwIAYzJkSi+PAqD98IYPgYBxBjKn11M+sZQ5cxbGjZkAQIsWLdDpIvvAwq+KzfmaZOzbt48zZ86QPHly5syaKw//GlV2ypbMgBJvLuzazc9BQ3KB99h96AEahRVlKoSdgTjmjIt3pUcVSxRBd1k6ai43o+z20PHpyFgm7nNFZ16K/3WvFulN9FgzLUTvpUvomNOYgKer6Nl9HrejroljwISSTRqQQ6XlzfE9HDuwh0u+StLWbkatSOeMiZpR8X6s3n2I/XsMWHaMo5pBiVuJTYXKFDIG/yv7OfgpsgMh5J7K4WO3CFJYUL5quZ9Dz1XZ69C2QWGsI00SRqS1tUGJxBc315gnIoMpscpfgEwqCH52h7t6G186Pu11ZPzBT+gwJn/XqfQuJBu9qMxEqzGDKJcc+H6LxWOW8iiykRl+97j/QgPqHBTIr/8I9XtwjxcaUGcvSIFIeu9iq9v/elC6VBm8vb1p06aNPCzEkb82EWk0Gtq2bQuA0/jJZEifQb7JLzKhTMuW5DeW8D4zmT7znYnQQ6f5xPFJA1j+UIM6e0s61ww/Uk/z8F/6d2hFl7nn9d64jkCVlQ6Tx1HDBryvTqN12/Ecfq2n40Przo01PXDos5HX2pSUGzSbnnnDXklqeLi2D23bd2RO9J34UVKmtWPqqolUTQXfLk+m48CtYZ6/+bW/Y1ykOfb51GjfnWbBZmf8lBmo17QaUY4HiILSMhely1eiYgUDlnL5SWPg2aPK2Y7uddOA93FmjNnCa72N1SBebR3J3It+GOXqQO+GMWnVGZEzR5Yfra7XcfxTIuEZFyxNEQsFkscNrur5fQed2x7GTtjLJx2os3dicv+y6MsN6tzdcepWBBPA99ocRq95rjeBBt6+zC0/UNoUo2ROfa2dQG4538IXJamLlELvJr9AqVQyf+4ijIyM2L59O1euXJFvIsQBw4/1JMbBwQE/Pz8qlK9Ipw6d5eE4YVy0H9N7FSMFHlycZkeZGs3pP34Kc+bNZOrYnjSrUoa2K+7ib16U3jNHUDbcGavl3ZmtbDt6Bs8U2fSezPqoc3ZhxZqxVEmjxP3KXNpVLUa1dn0YPW0G/8yZzLih7alfvhj1Rmzj6fdUVBi6lQ19i4R/8FP7llM7t3LkvCcWWQ39y5Ezzd+T5Qv/Rx4TDe/3DaTDxLMhv9z5q39HXYAmDQqj1jzj9gM/VFntaR6+EBMGZVocJs+nUx5TPh7oR73GfZi/5zaugRLwnU83dzJ/kB12Qw/ilqoqYxaOolyMPoYSmyLFyKyCgKf3eaQ30cWR5JWpVc4CNM85dfxJ+NF7Olf2jhvFXlcdKDPSfNxIKkc6wa0pJfpNon12NUhenJ8zmo0RnhAO5ObxM3zSKbCuVEd/13HgDY6d+4hOYU2lmuVj9ACzofLkzsPwoSORJAl7e3t5WIgDf2UiOnv2LAcPHsTExIQFcxeh+DE8NO6lpLzjbnZMbkeJNErcHx5j49IZTJk6mdnLN3P6RSC2ZToya+dexlWykn0ZXly9/hBNstI0qJshBl+UEssyQ9lxYi9T2lQgk9KNu8c3sHTuFCbPmMmi9fu48tor5OpT8ub1tdPc+CCrubydufZQQ7KSDamX3vC/HDklqWtOY/WEmtgo/Lm/rDNdVz6Ig7+jInejxpQwBlCTu2FzSv5K3+ZvpLStz6xde5jaqgiKextw6jOIza+0oHnE6gHdcNr6hBRVBrJq7xb6FdPfBRUV44IVKWujRPvuOtc+yCv0uJSK2k1qYqPQ8HDvNm79PHR0uB4Yzbh9n9ChIE39cYypaxP1cZu8MsNGNyWdEiTP40yfuCP8z3v4nmXroTdolemp56C/pet7YTMHXbQo09nRtIq+LeLGgH6DKFCgIO7u7j8HNwlxRyH992DAX8Pa2pqvX7/iNH4S/foMkId/D40nL25d4/4rN7yCFJhZpSdH4VIUzZJS/5DtgBMMKN2cnblncnV7d8Pm5dJD5/eRR7dv8eStB34Yk8I6E3mLZMX7wGj6T9vDC7+Qm+GdJy9mfNO8mAMBp/pSou0Ock+5wa7/ZYq6MvkFf+rvJDQa96dcv3aEJaMmcMgtCw6TZtG7TnmKZkoeTRn4s7trLgarFvNoeWNZK9mHQ32L0WG7L9Vm3mZ7p1hOq6R9ybyGpZiqdeTC4WHk0Xdw+l9kZLWGrHBJQ4tVV1jWwNAJpWJCx8dNrakw+Aj++Ydx9NhYIkyUofvIhg5lGXjcj/yDTnDKsXjczuIhc/feHWrWqYZOp+PevXsULFhQvslfqWHDhhw8eJBnz56RK1cuedggsTpWE7MOHTrw9etXihUtTu+efeXh30dtTc7SdWnSqiOdOnSgRcOalIgsCQGap87cdDehtJ0dsWos/KA0T0/Big1o1qYjHdu0xqFuRfKny0jZ7us4uX8hbQumROdxnVW9a1C7z0pufg3iybWbfDEpE8OWWExp/tDfSXjUNnkoV7syeVIqQWFNvso1KB5tEopOCqo2qUd6pT/Xjh7FTX4/Mi6Zladv35qklD6xb/4K7v+OrkC/yyxceAIv0tJwQE+K6Mkwfs7zWXD6G6SxZ1DXor81CQEUKVyUvr37IUkSdevWlYeFX/Brx34ic+PGDTZu3IharWbh/CWoVJGlgfimw/WaMy+Ny9KgTvrf9iVZFOrIwoPnOLhmPatXLmJYndR4vHmE87UXGJduSJ10v+svh9xPuPYn/s5fxLxSF1rlU+N7ZSf73v3O7jklGVs7MahMCoLuLWbsumd6BxrEXiC3F49m/Sst1tUdGaNv4EbgLRaOX8tLrTU1h42jUeoIW/wWI4aNIkf2HHz48IERI0bIw0Is/ZlvL4Fo0KABkiQxeOBQ8ufLLw8nIEps22zk4Z3NdMzwm78is+yUq9+YxvZNaGzfmNrFCtJ+zRMerO0c6+5Agyhtafsn/s7fxLgIXbrXwTLgClu2PpRH45Y6Pz1njqKSpTcXZg1h5ZO4axb53ZjN0KW3CUxrh9O0jmSNcL3ox/V5g1l8NxDbupOY0S5bpD0Lcc3U1JSF85YAMHv2bFxcXOSbCLHw11QB/fv3x83Njbx58zF44FB5OMFRm1thbWn+ixNYxoYac8tUWJr/7r/8p/5OUmKGw6oPvIlwfyiUknQtl3Dq2FGWtMshD8Y547y9WLrIkba10vHs7A285BvEhs6NS+c/ksuuE+OXLqJ1xCyEzu0i5z7lpn57J5bPbasnUf1eZcuWo0vnruh0OmrWrCkPC7HwVwxWePr0Kfnzh7SAjh0+SYniJeWbCMKfpX3G+kGD2PYuJx0X/EOLTH+4NhV+iY+vD+UrleHDh/dMmzaNkSNHyjf5a8TFYIW/IhFlzZoVFxcXevfsy+SJIbPqCoIg/IqTp07QonVT1Go1Hz58IE2aNPJN/gpxkYiSfNfchAkTcHFxIWuWrIx2HCsPC4IgxErNGrVo2aI1Go2G2rVry8NCDCTpRPT+/XsmT54MwIJ5i0mWLJl8E0EQhFibOmkaNjapuXv3LsuXL5eHBQMl6URUu3ZttFotHdt3omKFSvKwIAjCL7GysmbW9DnwY0CUt7e3fBPBAEk2Ec2bN4/Hjx9ja2uL04SQVpEgCEJca2TfmAb1GxIUFES9evXkYcEASTIReXp6Mnz4cADmzp6PRYpIZ14UBEH4ZbOm/4NFCgsuX77Mtm3b5GEhGkly1Fzx4sW5ffs2AAvnLZaHhb/A9+/fcXNzJWvWbPKQIPwWm7ZsxPnqFRQKBf7+/pia/o65wBOeuBg1lyQTkVKpJAl+LEEQEom9e/fSqFEj+eokSSSiSKxYsYI9e/bIVwt/kWvXruHp6Un58uWxsBBds8KfkylTJhYsWCBaRDGQJBORINja2uLm5sa///5Lly5d5GFBEOJIXCSiJDlYQfi7XblyBTc3NwCWLVsmDwuCkMCIRCQkOU5OTj////r165w/fz5cXBCEhEUkIiFJuXLlCseOHQu3LmxiEgQh4RGJSEhS9CWd06dPi1aRICRgIhEJSYa+1lAofQlKEISEQSQiIcmIKtmIVpEgJFwiEQlJQlStoVBRJSpBEOKPSERCkmBIkhGtIkFImEQiEhI9Q1pDoQxJWIIg/FkiEQmJXkySi2gVCULCIxKRkKjFpDUUKiaJSxCE308kIiFRi01SEa0iQUhYRCISEq3YtIZCxSaBCYLwe4jZt4VEa82aNVy6dEm+GoCtW7fi5+dHtWrVyJ49uzwMwJQpU0ibNq18tSAIMRAXs2+LRPQHaV3OsvmUF4WbNqJISnlUzoddPaqwIf9Gdg7Ij1oehki30bpeYdOavVx/649locb87381yGoi2xXQvjrNxtMupKnYmnp5w/92is7VmZ1HfSjerhY59f/xBC1z5sy8e/eObdu20aJFC3lYEIQ4IhJRohLI+YGFqLXkC9UXPOBQzwzR9It+49/6GVlQ/AI3JxWLJBHp2cbnFAPLtOJUoV50rajm+qp5XC61jhurGmIt29t/WwtsW+9EW2Ic5y5MoGSYXBR0YRAF6r1ijOs+OiYPu1fikDFjRj58+MCAAQMoV66cPCwIQhxp1aoVwC8lIiThz/A5KP0vc26pacvSUspKs6TnGvkGcl+lVXbmUuExt6RgeeiniNsEHO8hZcnUVTryPeTf30/0lLJm7iYdCZAkSfNd+uruLQX82NZva3PJMn0JqUQmS6n81LtSYOjLSpIUeH6glNPcXlrrE2ZlImJubi4BYhGLWP7Q4uLiIj8NDSZaRH+I57aWFBifkW170jOmzGaqX7jKhCJh2zkaPl3exL+7rvJBm5ZSzVuhnVqCReFaRNFvo7k9lpI1b9DrziF6ZArmwYzaVD/UgAtnhpHn2wrqZl1PjTvnGJZDhf+2FmQYbs2SyV4M6+/K4MsnGJwv5C/pbxF58ejABradfohrUAqylm1Cp9blSKcGdB5c37UHt/wNyXRvOf9etqTFlLaYHNuDW/5GZHu6lnWnXVDmqk/3HvXI8vUS61bu5IabMbnq/Y8eDXJj9l9h/DIzMzO+f/9OyZIlsbOzk4cFQYhD+fPnp2XLlvLVhpNnJuE30H6UVjWwlvIPvyIFal9L86ulkPIMuRSmBaKRXq5tJmW2zC3V7z9Rmu7UX2pYuJCUO5NJmNaOIduE/K1d/8srpSveUurWtISUs0Rn6d/7fiExjxVSvRSVpTmvtZIU2iLK3FM64fdWWu+QTrKps/hnSy1Ci0jzRtrSMbdklbWG1GPcTGmWU1+pXq6UUoaGS6VHgZIkBd+WxhYxk0rZN5JKlG0qdeo8UTr4+bY0toiplLtMLalm+9HS1Im9pWoZkklZWw6ROpQsJbV0nCpN6lNNypgsu9TjiPePPxQ3kiVLJgHSjBkz5CFBEBIYkYj+AM2ruVJVi0LSqOvBkiRppbdLaksWWXpIR3/kB+nbHqlD+lSS3fLXUmiPnfbTJqm5rfF/ScaQbSRJ8r2/VupeJrOUtXQ1qVTGNFL+5rOk859DEk/glWFSgYz/kw796Jv7mYgCJEnzepXUMG1ayX5VyOvLE9HX3e2l9KnqSItf/NdRqHmzQqqfKo3UcqvHj0RkJJlXmCrdC+37C74tjS1iLKVpvllyC3kLkvuGJpKlKrXksP6jpJUkSdK6Sf82tJQydj/6s8swLohEJAiJR9T3y4U4oOHJps1cz9GEFkXVgJIMjZtT6ds+Nhz5BkDgzROc96tIyxZZUf3YS2lbi5pFjH6+iiHb6Fx30LPBaN612su9q6e59uAYA9SraFpvFGe+BnH/0Em8qtengp4RdKqsnZg7vhiXxw1j6wedLBrIjRPn8avUljY5/utOVGVpRtPy37l6/s6PNWoK1Xcgf7jXV1OgYmVsfhxpKXPnIYNJMWrVSRsyWENpSa4cqfF290AbdjdBEP4aIhH9bkG32LDlNt8fzqVaGmusra2xKTCU036fObRxH2460Hp44mVuQ6pwI6jVKMN8O9Fvo8Nt9wr2Ju+AU99ipABIWZTua/cy0XYDnTt2Y+QaLe1610f/yHEVObrPY2y+0ziO2I1buFyk5dtXb8ysrQk/yDsZlhYmfPf3/fFvJRZWVijCbaPAyPi/ZIlShVJhjInJfx9OpVYiblUKwt9LJKLfLODiena4lMJx/ymOHz/+YznJiTkNUZ/ayM53OlSpbbD0csHFM0ztr3Hh3af/2gjRbyPh7eWDLkUKLMJmAuO8dFs0ilxnN/Gg8miGljIOE5RR5aH3/JFkOzycMad9whwcajJkSovXi2eEeUug/cCLN/5kzJotzEpBEISYEYnot/Lh2Po9fCnfjh61SlGyZMmfS4X/daex5WU2bXmGumR9atlcYvHkIz8q+gCerJvG+kf/1fom0W6jImvlimS+v4E5+10I/LHW7/UxZg+ez12rDGjPb2DzfV9Ah07e+/aDusAAFgy1Zd+8HXz8uY0xJVq2JN/thYza9JQAAAJ5vdOJFU/K0L5V/rAvIQiCECMiEf1OHvvZcNCfqq0cyCAvafMadGyWkdtbNnHHtDYTl/XHcmdT8mUvRLH8+Wl+pCQtK4dpvSSPfhuTCmNZOzk/F7rkI12WvBTIk5GMRbtzJN0Ijty+yrpWrowrmwnbdOUYfyPov9cOx5gigxcwMLcGvzDJyriEIxsWVufp4BJkyVOM4vmyUXzIG+z/XUvfPKF3rQRBEGJOPEeUgOj83nH/jguBqfNQNHdq9HWiGbbNRx7ff4G7zpLshQqSKUVoFtTw5elNnnmnIn+xnFjpn64hav6feHjvBV9VaclTJDep9b2BBCD0OaIZM2YwfPhweVgQhAREJCIhSRKJSBASD5GIhCQpNBEBKMMOPxQEIc7lzp2bO3fuYGKi59kQA4hEJCRJNjY2eHh4kDZtWlKkSCEPC4IQR168eAG/OOmpSERCkiR+BkIQ/oy4+BkI0WchCIIgxCuRiARBEIR4JRKRIAiCEK9EIhIEQRDilUhEgiAIQrwSo+YSCRcXFxo2bIi7u7s8JOjx+fNntFotSqUSI6Mws3//JgqFghQpUqBWx2a6CkGhUNCvXz9GjhwpDwkJXFyMmhOJKJEoVKgQDx48kK8WhCRDoVDw9OnTWFdmQvwQiegvcenSJSpWrIixiQmbDx7FPHly+SaCjE6n4+P7d+gim2Y8jhkbG2ObPoN8tWCgxbNncHDXTkqVKsW1a9fkYSEBE4noL5ErVy5evHjB8AmT6NZ/oDwsCInet6+eVC1SAD9fX+7evUvhwoXlmwgJVFwkIjFYIYE7duwYL168wCZ1Gtp36yEPC0KSYGllTZfe/QBo166dPCwkcSIRJXDdu3cHoPfQ4ZgmSyYPC0KS0bl3XywsLbl//z5XrlyRh4UkTCSiBGzXrl28ffuWdBky0rJjZ3lYEJKUFBYWdO8/CIBOnTrJw0ISJhJRAta3b9+Q/w4fibFxAv0FOkGIQx2698QmdRqePXvGiRMn5GEhiRKJKIFat24drq6uZMmeHYfWbeVhQUiSkpmZ0WvIMAC6desmDwtJlEhECdSQIUMA6D9ytHhIUvirtOrUhXQZMuLi4sKePXvkYSEJEokoAVq4cCEeHh7kypePBg7N5GFBSNKMjY3pO2wEAH369JGHhSRIJKIEaMyYMQAMdBwjfuZa+Cs5tGlH5mzZ+fTpE+vXr5eHhSRG1HIJzJQpU/D29qZg0WLUbmAvDwuJji8frh/h4NZN7D92F3etPC7oo1ar6T9yFACDBw+Wh4UkRiSiBGbatGkADB49Th6KZ0F8fuTMDecr3H/jRdQT5/jz6YEzN5yv8uKLnppX85nnV69w65Er+Lrw0PkyN5yv8coz6lfVfn7MLefL3LzxHI/PT7nt7MyTjwHyzRIMnesJZjcsRq06LRjUuydDOk7glJd8KwOELa9fosXj2VVuXn2Aa8Ittp8aNm1Ozrx58fDwYMmSJfKwkISIRJSAODo64ufnR8my5alUo6Y8HM9UeJ8cRxe72rRoNYs7UVRk2ifLGFCnFm3azOZWoEIW9eH6VAeaNuzGlheAkQenHBvR2q4W7Ybt5ktkuUj7nE09atHKrj4jt77DyPgjhwY3wKHRcE5FulM80r5h24D/seKSB6mr9cVxwVImj29NXlP5htGRldcvUaH+uIsxjSvT3vEwHgmw2MJSKpUMdAzpph41KqR1JCRNIhElEBqNhrlz5wIwaMxYeTgBUJGz01AaZlKieb6eFbs+6W8V6Tw4MXcpd78bkbvzCBplDH+I+V6awrjFD0jVahajG9iCSXG6Tu1OTiMdXw5MZvF5n3Dbh9DhumM8i897oczUmpGjqmJhWY3Bc3qS9d16nMYdSHCVqvblDnae+YoiQxuc1k2jS7t2tOzVgiJm8i2jFqG8flHKquOZ2D0nHzcOYfqhL/q/wwSkTsNGFChSFC8vL6ZPny4PC0mESEQJxKBBgwgMDKRC1WqULl9RHk4YLGrQvVcFzKWvnFu8lLuB8g0g6MEylu1zhbSN6N2zOCZhg5qHrBv/L68s7Bgwqg6WP44+s3LDcGyXHbXmJTsnLuSh7HV17oeYO/UQnop02DmNp5p1yI5m5YYytEU63HZNYOkVv/A7xTPN61d81II6bwmKxHay9EjK69eYU2qwE43SfeTgxFlcT1jFptegUSEXZpMnT5aHhCQiTg5t4dcEBQWxfPlyAAaPGS8PJyAqsrQbTuOsKjRP17Fyj2v4K2qdK4dnr+JRUDKK9BhO7dThDy+fY/PZfEdDzvZDsLMNG7Ok4kgn6qdXEnh3CbM3vua/O0s+XJ01jv3vJVLZTWCYfdowB60lVfr1oJj6Jbvmb+NTQrq8Dw4iGMDImNjOiRF5ef2ilLXp2rUMqlebWLHjfYJvFVWpVZviZcri5+cnuuiSqDg8uoXY6tGjB8HBwVSva0fh4iXk4YQleSW69q1KCjw5s2gZ98O0XgJvLGb5UXcUmVrRp0s+wj2Gq/vM8c2H+WJUGod2RSNUzsrU9gwZ04BUeHH5n8kc/3HfJ/DmPKavf4HWqhYDJ/OguSIAAJ2QSURBVLYkneyIVeVoTbOqFvid38S+F3oGRvxhmk/3uHL2DFeefEErge7rC66dPcOls2e5+fyr4ZV+NOX1a1RkbdmeCil8cN6yjdfxX2zRGjwmZPDO3Llz/9hvTAl/jkhE8czX15cNGzYAMGh0Qrw3JKciY6uhNM2hRvN4HSv3uYVUrrq37JmzhpfalJTvP5iKFrLdvp3i1CVvjIrZUTOLShYEUJKu+ST6VrVE+rSbuXMv4Rf0mPVjl/AoKCVlhk2jeVY9+ylTU82uPOZBtzlz9E2YllT88Dsxga4O9nSbegZfQHN1Nt0d7Onk0IihK++HtJIMEW15/Rpl6rrULJecoDtHOe0S36UWvTIVKlG+SlUCAgIYOFD8JldSIxJRPOvSpQtarZb6Dk3JW6CgPJwwmZWnS9+aWODO6UUreBgE/hfns+q0F6rcHenbNivyqjPw5iXu+arIWq4SGeTBUKrstJo0iOLJNbzeOJUV851YedUX89KDGdMld4TXDKHEslJF8qiDeXzlMvqGOuin4/ONfezdtsWgZf/FN/IX0Mu0RDsGjh3PwNZFSQao8zal/9jxDBk7nq71soVvJUbBoPL6FUprylYoiDr4HjeuxGZM+Z8X2m29bNkygoKC5GEhERO/0BqPPD09SZ06NQBHnW+QLWfsft0wXgRcZWb1uqx8aond8h0UXd+QqZdMqbPMmQXNw97HAdDyel4t7CY9p87qJ8xrZB4uGl4A96bVos2sOwQCJCtGv4Mn6F8s3LCH8ALPMqFUI7Ya9WD9lZmUNqgfK5ALgwrTdd1Hg7rLjOut4OGm1vLVkQo8+D8qdNzO9zrLuLa5LVF94ohiUl6xF3huMLWbrkbd7SBHplWM4+6/36NH6xacPnaEzp07s3r1anlYiAfiF1oTufbt26PT6WjSqk3iSkIApqXo1L8eVrhzasr/+PeKL8ZFutOniTwJAWj4+O4TOlU6MmaKIqEAYEr+RvXI+aPpYJS3PvUKR7OPOjMZMijRur3no56RfPoZUbD7KlZu28UqA5ZlI6rKX+AXBPH51l42L5jBwn+Wsu/SG76Hi8ekvGJPnTkztkotX96/J7G0Lwb+6L5ev349vr6+8rCQSEWsM4Q/4uPHjxw5cgS1kRH9RjjKw4mAkjQOQ2hdwIhAl1e4SRloOKwn+fT2PWnx9vJBR0pSWskfcJXRPmfLmKU80lqSOo0JwXeWMXuzS9T3flTWWKZUQvA3vHwMad8AKLHKV4nKtWpTxYClUuF08heIJV+uTqpBvSaj2HPlIU8vb2RGs/I0H3EE959vPQbl9QtU1tZYKEHj9RVfQ4stnuUrWIh6jZug1Wrp2rWrPCwkUiIRxZN27dohSRIt23ciQ6bM8nDiYFyM9l2rYQaoC3agcy0r+RY/BQcFg8IIY6OoKlYtr9cMZf65b5gU68OCOS1Jp3Dn7LSxHIpybLYxRkZKkDQEByXwnmadP1/UNZl54TY7tqxn0c4L7F5Qk6/rJrHxoebnZoaV1y8yMiak2IJI6MUWVuhkwDt27MDT01MeFhIhkYjiwevXrzl79iwmJib0HjpcHk5ElKSwtsRIAQoLSywiPZqUGJsao5ACCQiIvMbTvvqXiVPP4GWUn/aT+1GyniMD6tkgue5j1sSoZk8IIDBABwpjTE0Nrbi1uDrvYPu6NWwzYNlx5qX8BWJHmYYGjuOpkTm0y02JbT07Cqtf8+p5aAeZYeX1ywK/E1JsyTC42BKA7Lly06hFK3Q6HR07dpSHhUQo0qpD+H3atGmDJEm07dqdNLa/Pm1LwqfEOpU1SskDj8imn9a+YuuIKVz6piJLu2n0KmsOyow0HjeU0hYSrjvHMvfUV/leIbRufPHQQTJrrCPPhjIanm8bw9hB/RljwDJh1TX5C8QZrcdnvmktsbIOHR5nQHnFAa2rG191YGJtQwpDiy2B6DfCEZVazeHDh3F1/dXJYIX4lsgOv8TvwYMHOF+9ipm5OT0G/i3T26vJlDUDSu0nXF7pu8GsxWXdUOad9kSRsSUjRlYlxY+IKldXRvQogon2NbvGTMNZ3/js4Je8fa9FnT47GQ0e+mVE4T7rWb//MBsNWNaMriF/gTjyFecl63mQsSF2pUNbSdGVV9zQvH7NR60a26xZMJIHE7hMWbLSskMndDod7dq1k4eFREYkoj+sffv2IEl06tkH61Q28nASpSRV4UKkVwXw5Na9kGHZYWjfrGXS1JN8U6Slztjx1LAJe1iaUKjvFFrmVKN5/i9T5jrLRpiB5tltHn0D8wJFyKF3sIQ+SlLmLEOZipUMWkrnTyN/gV+ndePytDYM2WlJt4WjKPNzQtSoywvtF55eOMeTcD+xocXj0XmuPPwSbmCH1v0hzucf4BGhYaXhxe27/J+9u46q4mkDOP69QQgSgijY3d3dBXZ3d3d3d3fHaysmdjd2i4KKLWXQdeP9A/EHyyVFAZ3POXuO7rN7uVvz7MzOzvXBhHxF88b5/abkpN/wUejr63P+/HlcXV2lYSEFEYnoD7p9+zYPHjzA1MyMHgMHScN/Nf2i1SmTDtyvnuVZxL7Calf2jZnO5a9gXnMsI5vZRD0pTSrRb1JLrOUhPF87mvUPIhbNat6dv8hrlTElqlYiVYRIcqbxvMqa9jUYdNiGQQcPMqiceaR4tPuLEO7PbECzxg1o1mASd37EQm5Pp1ON+nSqUY/5juEzb7G4SRU6NqlCu6nXI34IqF9z5bIzKuOyVKgQzyHBk4n0Nja079ErrJm7fXtpWEhBolzzwu/TqVMnAHoMHIyJqZk0/Hczqky92hnQvnLg2J3wHzNS8377KBaf+QKmFek7rTOZdY4iIMfSbiKD66ZFFniPTeNW4hzewUzlhMPh+6jMqlOvjmWKOKHVHw4yoXF7DqQeypbTm2hXJLwhMgKd+ytMSEAgakAdGEBweF+GEH+C1IA6gMCfHRyCCQxQA2oCAyLXq1TP93PygQrTqk2obpkS9ppuvYcMI5WRETccHXn69Kk0LKQQYmSFP+T8+fPUrFkTi7RpuXD/CUbGv+dt+eRM9WAGzerOx6P+Bo5taElilH9+5wbTsPUWtJ3sObaoVjxHMEgC6rfsbleVVSYL2LO2BTY6E2+YaPdXgCs3T95FW9yOctnDazMBvLt6gkfa4tSsnONnzTDwzRXO39VSyLYKWX9WfHy5Mqw8PbZpabXnJtNrJvR3KpKHRTOmsXrRfIoXL869e/ekYeE3EyMrpCDhL9/1GTrin0xCAMoivenXJD3fji1g050AaTj+VM/YvmA3n0xq0ntw9eSfhACN+0mOXVFSonpe/JydcHGKML37yn9vEsWwv4yyU7ZZiwhJCMCILJWa0yBCEgJIla0y9ZtHTEKgeraOFXvfk7rGMHpVS9lJCKDHwEGYmJpy//597ty5Iw0LKYBIRH+Ag4MDrq6upLfJQLtu//Db4HIr6kyeTl3L52wbu4THMfzceOxUvNowinW39Sk7ZhYtf8MI1b+DxsuD7yp3jg2sgF3FMpGmRn228zlip4JE3V8/qF6wfdxiHuhVZtD06JpCUxZTM3N6DBwMEZq/hZRFJKI/oE+fPgD0HzEKA4PfN3ZYSiDP0JLJywZSJMCBdf97Jg3HmfrtXtbtdSdnhyXM6ZEvxfT6UhaZyFEPX1y+Rp2cjg+KkhgSa3+FUfN+/2IOu+ehxcLVdMibUvZa7Dr37kcaS0ucnJy4fPmyNCwkc+IZ0W+2a9cu2rVrR6as2Th96x56eintjQ1BSBk2rVzO7InjyJEjB69eJdJIGEKsxDOiFGDw4LAmg0Gjx4okJAi/UfvuPUlnbcPr169xcHCQhoVkTCSi32jdunV4enqSM0/Y2FiCIPw+BoaG9BsxEoC+fftKw0IyJhLRbzR69GgABo8JGy1YEITfq1XHLmTMkpUPHz6wZ88eaVhIpkTp+JssXLiQ79+/k79QYeo1biINC4LwG+jp6THox+97DRr0b41ekpKJRPSbTJkyBX78oqRMloLG2BeEFK5xqzbkyJ0bDw8PNmzYIA0LyZBIRL/BpEmT8PPzo1ip0tSoaysNC4LwGykUCgaPmQDAqFEp+fe+/h0iESUyjUbDggULABg6fpI0LAjCH2DbpCn5Chbi27dvLFq0SBoWkhmRiBLZiBEjCAwMpGylylSoWk0aFgThD5DJZAwZPxEiNJMLyZd4oTURqVQq9PX10Wq11LStT4kyZaWLCILwB82fGtYqMWXKFCZPniwNC4kgMV5oFYkoEd2+fZsyZcpIZwuCkMRKlSrF7du3pbOFRCASUTK0YsUKMRR9MvT27VvOnz+PUqkM+5Vc4Z9hYGDA+PHjyZQpkzQkJAKRiAQhjrp06cLWrVuRyWSoVCrxgrEgJJLESETiahT+ehqNhr179wKg1WqZPXu2dBFBEJKQSETCX2/BggUEBgb+/P+cOXPQaDSRlhEEIemIRCT81TQaDTNmzIg0z8/PT9SKBCEZEYlI+KstWLAAX19f6WxRKxKEZEQkIuGvpas2FE7UigQh+RCJSPhrRVcbCjd79mxRKxKEZEAkIuGvFFNtKJy/vz+zZs2SzhYE4Q8TiUj4K8VWGwonnhUJQtITiUj468SlNhRO1IoEIemJRCT8dRYuXBin2lC4efPmiVqRICQhkYiEv87IkSPRarVRJqVSCT9GV4g4+fj4iCF/BCEJiatPEARBSFLJetDTXbt24eHhIZ0tCAkybNgwNBoNS5YskYYEIUEMDQ3p2LEjRkZG0tA/IzEGPUWbTHXv3l0LiElMYhJTsp7q168vLb7+KQ0aNNACWmdnZ2kozpJtjahevXqcOnUKfQMDmrZpJw0LQry5f/6EWqUmQ+bM0pAgxNv1ixd4//YNhQoV4vHjx9LwPyMxakTJPhHNXbmGZm3bS8OCIAhJ6trFC3Rp1kgkokRIRKKzgiAIgpCkRCISBEEQkpRIRIIgCEKSEolIEARBSFIiEQmCIAhJSiQiQRAEIUmJRCQIgiAkKZGIBEEQhCQlEpEgCIKQpEQiEgRBEJKUSESCIAhCkhKJSBD+ShqCv33A9flz3n76Tog0LAjJiEhE0QrG/Zkjdxyvc/fuK7xj+yVpzVde37nBnZvP8PibrnqVBy43b3DvmZs08h/fNzxxvM7d2858i20/RaLCy8mRuzef4RHix4dHN7jjeIP7Ll+I8WPUYd/pjuNtXL08eHXrBveefiJYutzPY3iDZ+/9pUGdND6uPHa8zt07LnzX8SVUHk7cc3TE2S0E/3cPuRun7Vbj9dyRu443ePDyK2qvF9x3dOT5pyDpgqD2jGF7YqH25LH9AqZ0rIttwSyUK1OHXt060qNOEcrmLEKLtgNZvudW3M5PzRde3b7BnZtOeKqkwcjC91mM3znieeT3lqeO17njeIvXX2Pccag9nLgXfjxCf2HfCMmaSETRUX/GYYQtbe3q0qZuPSYdcIu5cAy5zIqWdWnbaAQnvWJcMgXx5fasZjRv2JNdL6WxcGpcN/ektV1d2ti1ZvWtuBcRfjem0722LSO2OINSj2/HR9HFrg5tGg3juHt0+1CN68butLarQ8eBu/iop4fbwUF0rFGf6Sc9JcdIxvsdfelgV4d2w/fgEd1H/qTm/dbetLGrS5fp54iSunyvsaRVNdr32cRrlCi/HGN6s7q0sbVjykH3aM8P9cv1DK9XhzaN+nHovRyF8hPHhjWgWeNRnPOUrKVQxrA90Qt+bc9U27J0mXMDRbneTD/8iJsuzzhz/TZnnrzD8cYuBte3xnVNGxrU7M2ex77Sj4gs6BJLW9ShbaNRnI4lWYQ+WM7ABnVpP3g779XSKFHPI70vnBvbmLZ2tekw8gDSXfCT2oUdvWvTxq4+Y3a/R66XsH0jJH8iEcWFxo2T0yZzNtor5u/kd20mk1Y+wbLNfMY3sJaGw6ieccT+DiF6+uipX3Ni92UCpMvo4nuFZcOW8yJtOybOakQ6uQGFB86hQz49NO5HWLLgEn7SdQDNpz3MX3AJX3kWmkwbTwWzNFScsIROud6xf9R4zkQ6RvoUadaQ7Arwv36YM59iOX5qF44fuUMIJpRr3gSbSFeHLzfnDGHTUyuazp1DHWs5BsUHM75HPvQ07pyePZcbusp2zSeOTJ3LDR85GVvPYHBVczCvzrCFfcj2fhtTJx3lS6SvFdP26Bb4ZDX9G47gSenFHLhiz8T+zSiVywL9CMsYpCtI5Q7jWXT2Oovt3rOsRUtWOHpHWOL3iXIeGZSgx6xe5NLT4Hl0Bisv69xxuO2bzMrL3sgzt2XMuGqYJmDfCCmDSESxkVuRPVcatB/2MHfmGb5L438r1VO2Tt7Ia1M7Bo+ri3k0Z0rwnZ04PFNhUq0xFU21uB/fxaVYyzcVL9ZOZKeLGTXGTqRamh8fblyRftM6kUWp4u2OyWx6JKldaTw5N3M657xkpG86g2F1LcNOYOOK9J3UhnSf9rFg0bVIiVC/aEvqFVBCwA1OnvgY41206vkBTj0MRWZegwYNrCNdHKpnq5i32RmTeuMZUtviR8yY0sNn0SK7EtXr/7Fg1UNJk5GGLyemsfiEFzKbZoyeYEv4phqVH8GIVja4209h9Q1J3SuG7ZFSf9jLuA6LCO65l80zG5PVULqEhMKaimP3sWGYEbt79mW/q84qTOKJ5jwyKj+SsR1yoFS9Yv+05TyVHmqvYyyedYyvMhvspk6musV/50hc942QckRTvAj/0aNUr0GUMlHzbudYlsVeyv4VfE8tZecDFbk6DsfOOrrTxJ+bew7xTmNGuaZjqV/FDL6c5vAxjxgLfHxOsGHTfdT5OtOnaeQC37TGeEY2y4A86AFbpm3lXYRy0u/qXObt+4DWqgHDJzXGKsKKprUG07GMkre7FnPkQ4S/riyAXaOi6BHI/SNH+Bhtuavi+cHDvFDJsKjVghoWEWPeXFi+gSeqfLQc2px0Eb+wWU0GT26BtTyIp6sns+9NhD/ge4WVU/bwWWtFrYnTqJs+4ormVB3Ym+LKV9gv3cNnyQ6Ldnsi0rzn4JjxPKm+giWDSpNaGo+WMfl7bmB23ecsHLuND9Huk18X/XlkTqUxU6mfQU7ww1Us2O7Kf1/Dl5vzJ3HkgxZLuymMbJQ+8jkSl30jpCjRlTDCTxrI0pMJg8pgpHJhz7j53I7y8CCOVB48PbGJVVOGM75/b8aNGMfyTUd56qH7abDa7TE3Ll7klpMnGlS4Xd3I4pH9GDNqI4+CANR4PLnEtUtXcfHSgMqTZ4dXsGBUf8YNH8+afXf5EqGQCXx3hX0LxzN5YF/GjZ3FrouvCYzw937SeHB653E89crQrEOxSE08kXif4fDxj2jNamBbNyfVm9TAHG+u7z0YpWD9jwYvhx2cc9ejWJuOFJR+uNyKOhMmU8sKfC8uYKnDj2cBQXdYP3ELb9QWVBk7g0aZJKeuIhdN2tcgte8l7Pe7RCjUFORo2pSiBhB85winI2a2iELucczhBSq5NTVa1MYkQkjjcRT7E+4oS7WnZdEoXxjLBpMZZmcFPhdYM+vIj6a2IB4uG8eeV2rMa01gdMtMUS42Rc62tKhmiv/lHRx+Kfle0W7Pf0LurGXj3bL0H1sbS+mHx0ZuQcVRoyn1cBU77sal90ICxHIeya0aMXxCAyzx5vqiGZz+0dQWfHcJc7a9RJ2mNkOmtZY0kcZt3wgpi/QQC1JaLWBAgf7z6FYsFSFOa5mx5HY8e+1o+H5rBYMqFqdZ+8EsXraOvbt2sm/TcpaNaEezMpUYs8MpSlIIODeNHs0aMXDZVZ6sbUHTpkNYtfF/2G87xvMgAD8uz2hGl2YdWXvhGmtbVaR517Gs3bCNfZuXsbB3TRq0XMaTgBDe7u9P84p2jJu5jJ07trNv7WwmNa9Em0nno/b4+n6Oc9d80CtuR62sCkkwnAav47u54AVpajalaho5ZrWaUcVSRqDjHo66RFc8fOPqiav46ZWgZv1s6Pp0eabWjBpVHVPtZ47PXMBtvxBc1o1n6+MQTCqNZlzH7DrWk2NZpz6lU4fw9NSJSHf5imxNsS2TCoLvcOrwK50FV/Bde868UiPP3JBGVYwjxbwvHOeWrx6FbRuQKeofBnkmGk0dQ0UzLe6HprPmhh8hTmuYs/YRoaaV6T+jM1l0rmdFdbsKGIfc58LJN5LvFf32hAnh8ZHj+NZoS51IVbS4k6drQJMa3lw4eu/3dO+O9TySY9NyOgOqmaP9fIDFi6/hH+LEtomreBZiRtmRs2mZTfd6Me8bIaVJ2Bn8LzIsSa85/chvEMSz1aPZ8DjuqSjgzlx6thrHiZdy8rWZzsrTD7nx6g2Xrzowa1B10gU+xX5IU8Yf+KSzSUvjto+5cx6Rqe1EZqxZz/SxzcipF2EBbQD35/Vhh7Yjiy46ccv5MXvX9KdEGg1eF2cwdcwIhg8/hLLpUnbcfc2tJzdYM9GWDApfnq0ZzcZ7kYuh4LvXeOSnIFv5ymTUVQ4AaD5wcu8FfLGicpNamAKY1sS2dnrkIfc5uvchOut5wXe5dc8XRa6KlM0c3YcryNp5Nr3Kpkb1chvLli5i4bIb+KcuS+/ZPcgRzWpyiyqUKagk9PF1bvtEDGSibtNKGBPCE4fDRH0sEsQ9ewfeqxVka9SKEpGeswTz6Pod/BW5KF0pi44EGEaRvRtjB5fDWOXCvjmLWTdjCXf9UlN8yDza5Y5uLTnmlSuRVxmK043rSB/ZR7s9hNU2Hj90J2+ZMhhJQhAWv799FtOGjWLNEaeoPQABMKZYmUK4P3oY9WYkEcTpPFLkoM30oZRIrcJ1+yzWLZ3K+pt+GJcZxoRueaLd3zHuGyHFEYkoHlKVGcHEnvnRD7jNhjFrcNFZ0kqonrF13CIe+BhQYNBu/rdqCHVK5SBtGktsClSl5ZT9bJ5WHVPNR47PWMitKK+WaPG9dongXnvZumwUrVu1oc3gDpSMdNMewEfqMmfrRGyLZCJN2mwUbzWLReOqYUwgD7Zv4X2l2axe3I0y2a1Ik6EQNYeuZmSDtMhUL7lw8kmEpKHm09NnfNGmJneRvCgj/pkI1C/3cfhGAPL0dbCtGt6QlZryTeqSTq7i1aFd3I2yLaB+/xgXTy1G+YqQM7oPJ+zZTpcZAyho6MethTM599WQQv3m0qWAtIEnAoUN+QvYIA9+wXOniMlVjlX9ZpQzhdBHRzjxQnLgAi7jcPIDGmUB7FqUjNyEpH6Hk5MnWuP8FMgT4xcmT5/ZdC1qiP+1eSw98QWDYgOZ0LdglCapiBTWRchnLSfE+THO0mpJtNsDqNzw/GaKdUbTyPN/CDg1kX6DZ/O/LatZ2K0Zcy/qOBhA6kyZMPvqFoeu7fEVt/MIQFmgH+P6FsPA7yqrZh/jm2Fxus3qT94Yd1wM+0ZIcUQiipfUlB4xnza5lfg5zmfGptjbp0Pu7+Lw/SDkNi0YNKxiWM0hEn1ydRlFs+wK1O8cOHYjak1LY16PHv1L6b7zBUBJ3ubdKRPpw+XY1K5NfiUgz4Jt71aSu1JLylcuih4qPr5yJfTnfBWf3n9Go7AhU2aDiCtEoOL5vv08CZGTrk4zKkR4Sm5UuTk1MshRvz3MoUtRO2CrPrzHXaMgfZYsMRbQAAZFmlAj748iTC8/tRoXJbpvFEZJxiwZkavd+PQh8n6UW9lRv7oFMtUTzh52ilRb8790gAufNegVbUr9ApIiU/WBT24aFBmykTHmPw6GRalXL9+PQleP3HZNKRDbOsosZMwoR+3+gU9RDn302wNatFp99KL5/EAPD3y0P/6j8cX7ezRnqr4ShVaNOtETUVzOo3CGFGhsS67wQ52vPrZFYlsnpn0jpDQiEcWXaVUGzexMVoU3N+aNZf/baC5wCOu+e/cO79RgXLYW5SI+AY/IoARlS6dBpvHA+fFHaRS9wuUpFWOXKCOy5s0e5a5TbpmONHqAMg8FikTt15vaKi1GMggN8IuQiNT4ePuiwQyzNLJIy/8UfJNDB51QyTNRo2llUkWMGVbAzi4rCo0b5/acjNLdXeP9HT8NmJinIZpP/0GN6+axbH2kxjR9OvRD77Nt+vZYngcoSGNhhpxQfL5JG7osqNasNhYyFc7HDvL8Zyby5srBU3hpDSnerAXZpW1B6u/4+GjA1ByzmL8w6pcbmb3mIWqz9KQ1COXJ2inYR9c5IpzCAnMzOYR+x9tXmg1i2B6FJeamvnh/0/35aRqPYnjT4mTKkIvirSfRo3bk517hNF+/4ZfaHDPpdv+yOJxH4dQu7Jqwmmdqc6zSGRD6YA0Ldr6N5SYvhn0jpDgiESWAWY2JjG2TFfnX0yyZGLXr7X9UuLt5okFB2owZifhYJzIlaa3TIkeL91cvSUyGoaUVJjEdKZk+BgY6FpDJkcsBhSEGuqofSr2wNnitlvCbZ4DQkFCQ6aGvp7sACbi0k5Nv1KBvzJezs5g/dVKEaSYX3I3QQ8u3c7s57SbZOaGhqJChZ6AfYyJSv9zItNkX8TEsQdfNS2icScbX0zOYd/Czzudo4fT09ZGhRRUS9S7ZpHpzqlvLUb04ysmHP5pzvp3m+LkvaI0rUr9xVh3PJEIJVYFMzwD9GL+wC7tGz+S6tyGF+21jWstMyL6cZOkUe6IdJAIAffT05KBVERoS8SiEiXZ7FBnImUPJ66evdD6Lk5uXp9vGy1x4cp+9q3tRWGceUvH6yQsU2fNgHWXDZchlAGrUuv5ARBpN2DFRKCPtv9jOozBqXDePYOml7xgU78+yha2xkXlxcfZEjkV/YUFM+0ZIcXSUXkKs5JZUnzCThhlleB2fwvzD0Q/vEk6riXkJrVoNyFAoo6YrpSJKKfEbydE31EemDSYoKGrBCN+4uPd4WOEa5MSplYtZtzTytPHwU4IAfC9x+GDkO1u5vgF6Mi3BgYGRkl8k6lfsGjODa9/1yNNzFt3K1WfgmPpYaN04NXVyjG/Uh32uDP1UkeppYVJXpUG9jMjVLpw5fJ8QNHw5dZCr38Gkakvq6npfSq6PgZ4MbXAgOncHAGrebhnJkovf0CvQm7H9KlBz1HhqWmrxODKJBcdiGo4miOAgDcj0MTSMWmBHvz2GlKhSCrczDryKLVFER/WYUyc/UrRK2ahNnvJUGKWSgdaX77oG3YvI1wd/LchTm2H681SN7TwKo369kWmzLuCtV4COMwZSynYsg23TonU7zPxp0lEnIot+3wgpjY4rT4gLebqGjJzalPR85vjkKZz3Cr+DjEhJept0yFHj+cY1Svfs/wTz8Z0HapRYZ84kDf5hciwsLZBrv/DFK2rjiMb9KIfPeqFV5qflwq0s27RNx7SVGZ0KoiSI+/v2RCooZWnTYi7X8s3TM5qmFzVvt45g6YVvKHJ0ZuywChghx6b1FPpUNEX7cS/zZp1F92vFajw9vqAhFeaWUZ/GgRGlmjcks0LN2xMHeRTkyblDF/HFgirN7XS/iyNPi4WFHO0Xj0jvZEWkdt3E1Fnn8VbkpOX0EZQyBnmmtowYVonU2o8cnTydK9I2ynBqdzy/aCCVBRam0i8Q8/aksW1Pda9trD8eU6KLjgb3Awux/25LczurqAWBXlYy2ChA5crzJzE1fal46+RCgFZO2uw5I7xUG/N5BID6NbtHz+TadwVZO8ymbzljkGeiyaQRlDHV4rZ/IovPfZOu9UPM+0ZIWaKcf0JcyUnXZAYj7NKh+bCb2fPuEmogzURyrMqXJ6cSAq4d5nR0TQ3e57jo6AP6RSlbIdIr/UlASeZsGZGrP/P2tbSzgZpPh3Zz3Qf0i7eme6dm2DZpqmNqRouhnSiZCkIf7+fQg/96NSmzZMdGrsbD9bXO4VnUrpuZNvMc32WZaDR1LBXCyxhFHtpN7UcBQzXvdoxl+RVdhWMob13fo1ZmIEtWXW2RYFCqBXVyKlC/OcGJU4c4cc0Xefp6NKydRrpoGGU2MmeUo3Zz5a2uPtDq1+wZPYOr32TYtJzOwKpmPwIKcnSbQZcihqjf/I9Zcy/rHDuP0Fe8+6BGmSEHmaJ85Vi2x7QefYcW4OqE4Rx+E79qUciLjUyYfI18Q0dRPfwrR6TIQalSGZHjg+M+ez5Gc+oS/AiHo09QySwoUbl4hJpVTOcRP284lpz/iixTa0aPqfbzJWJF7h6M7l0UA7Ur9hNm46jrUMe2b4QURSSiXyHPRMMZk6huqebd7g1c9o3aBKEs2IHWlc3A5xRLR23lpbQ5W+POhWkzOO4Blra9aJrzTzbD6SLHskhhMiiCeH7vUeQXd9XOHN3vSBCGFGvSHJ3vGv6gyNyCJlXNkKldOLH7+s/PkacrQv7MCoKf3OOZdF+oXdk7ZgZXvsmwajiFYbaR79QNig9iTKfcKFXO7Bq3gHvSTKZ6weNH3yF1IQpG19VavzgNGhVAqX7HtWXbuOcvx9q2daSef5HI01GgUBYUQY95LB37DjXvto1kybmvyNI3ZviE+pFrVQYl6D6tC9mVKl5vHs2am9IvDCrn+zz7DsYFi0btzh7r9ijI2nklM+u8YFa7wRx/E7duzMEv9zC+41Te1V7CzC45dDwXAzCgRNs25NXX4nt+JqMX34j6sxiqz1ycOoitT1Uoc7aibe2IGS2G8whQv9nC9Fln+S5LT92Jk6mZNtKOo/CAmbTOpUTlspGZix2jtibEum+ElEQkol+kyNKBcWNrYqb2xS8gaiJCkZ02c2dSO6Mc92NDaVOrA3NW/I/jRw9xZNMcxjWpxoDNL5Dn6siUmS0ijZ+WVPSLVqdMOnC/epZnEco21aO9HH0YCsYVsGsY/cudEFaA12lTFwuZho/HdnI5/KVD/eJUqJAOPl/myqOIBaead/8byeKzXyBNLQZOaUGkodkAMKHMiCk0yCgn5OlqZiy/H6mAU7ue5bqLCqMy1SkTbV93JXmbNia/UsWr+48IUOSgbssKkXv+RaJPoWoVScsnHM8/jDQCgfrNVqbPPMM3LKg8ahoNooxFA6krjmJE84zIQ56wddwSnkTO7Lw7f5HXKmNKVK0U5TvEaXvk1tSca8+c6s+Y1qAJc/Y/wTualjBUnjzeNYrODUfgVGEp6xY0RtdjsXD6xQcyoX9xUuPFzZl21K3agnETZ7Jq8VyWjO9N10pl6LPmIYGpi9F1wRhKSb5jdOcRalf2jZnO5a9gXnMsI5vZRC2ITCrRb1JLrOUhPF87mvUPIqeyOO0bIcWIcvyF+FKQtfNcBlY2i7YXmDJXZxY7bKdfneyonQ6zcVI/BnfuyPARM9nnGEDOZtPYcHQ59TIkk8NhVJl6tTOgfeXAsTvhL0IGcXe3Pa9VkLpSc+rE4bua1mpPnYxytB4nOPTz92OMKNuoLum1Lzlz4NbPRKJ+u40ZM0/zDVNKD5tJS51DwoA8bQOGjrHFQhbI45Wj2fIsvElKhcuBQzxVmVOhcb2fo1zrosjTDNuSYc05yjxNaFgqyqP6SFJVbELVDFreHNvPg/DdoX7D/jHTufQVUlcYwZiOuocrQm5FrfHjqW4pI+j+cmasfvZfTOWEw+H7qMyqU6/Oj5HE/wvGeXtQZKLmzGPsmluRD0sbUaNoJbp0G8TceUvZtmENG+ZNYEJXO+oXLkq3pa8pPv0ku5Y0J/YWLTPKjD/IptkdKJpeztenp9i3cg6Lp89g5eqdXHUJxqpcFyYfOMyIKmmiFiY6zyM177ePYvGZL2Bakb7TOqN7gA05lnYTGVw3LbLAe2watxLnn62P8dg3Qoog02q1Om7jk169evU4deoUc1euoVnb9tJwCqUh4MN97tx1wd1HTSrLLOQpVYY86WIuCJOC6sEMmtWdj0f9DRzb0FL3g/yEUt1nSY2arHZvwIKrW2iYGNVA37NMrNycvdoubLi2lMrRNbUliIons6rQapEbtdbcZEkLHQ/3E8Dv3GAatt6CtpM9xxbVIlIP6wRvTzBfnt/iluNdnF+/54uvGqWpFRlyFKBQ6YoUL5Auag+5uFB9xfXuLZxeu+ETLMfQIgPZi5amUFYz3Qn4h99yHiV43ySuaxcv0KVZIwoVKsTjx4+l4X9Gw4YNcXBwwNnZmdy5c0vDcZIYp4UQZ3KMMpWkSuM2tOzYngZ2lZNlEgJQFulNvybp+XZsAZvuRH228UuURek4ohlWXxxYs+p21Pb/eFPhvHEuhz+YUmnI0Oif9ySYkgK9RmGX/gtnlyznYWLsDtUzti/YzSeTmvQeXD1yEvql7THAMl9lbLsMYfC0hUxbvIRJU8fTo3NTyiU0CQEoLcheth52bbvQpksnmjSqRdFYkhC/5Tz6lX0jJFciEQm6ya2oM3k6dS2fs23sEh7rHqosgeRYNpjGyIaWvFw3ivX3f+3DVc7rmLHkFnqVxjE2uiayXyRP24gRUxqT5vkapi+7F+Xhe/yoeLVhFOtu61N2zKwozZB/Ynv+mEQ+j/6qfSP8JBKREC15hpZMXjaQIgEOrPtfhGcbiUGegYbzV9GtRABnl27FOaElu/oNR5fuxjNPJ6at6PVzvLLEJ8e6+UJm9y9J4PHF7I3S5S/u1G/3sm6vOzk7LGFOj/Cx6cKDf2p7/pxEO4/+wn0jhBHPiARBEBJAPCMKI54RCYIgCCmeSESCIAhCkhKJSBAEQUhSIhEJgiAISUokIkEQBCFJiUQkCIIgJCmRiARBEIQkJRKRIAiCkKREIhIEQRCSlEhEgiAIQpJK9kP8DB0/kaZtxBA/giAkL9cvXWDMgL5iiJ9EGOIn2Sai+vXrc/z4celsQRCEZKVIkSI8fPhQOvuf8VcnomvXrtGsWTNUqp8/yygIv8Tb2xuNRkOaNGmkIUFIED09PRYuXEj79v9uq81fnYgEITGpVCr09PQA+Pz5M9bW1tJFBEFIgMRIRKKzgvBPqFmz5s9/ly9fPlJMEISkJRKR8NdTqVRcvnz55//fvHmDm5tbpGUEQUg6IhEJf72ItaFwolYkCMmHSETCX01aGwonakWCkHyIRCT81XTVhsKJWpEgJA8iEQl/rehqQ+FErUgQkgeRiIS/Vky1oXCiViQISU8kIuGvFFttKJyoFQlC0hOJSPgrxaU2FE7UigQhaYlEJPx14lobCidqRYKQtEQiEv46z549o2jRolGmcNL5RYsW5c6dO5E+QxCEP0eMNSf8M2QyGQDilBeExCPGmhMEQRBSPFEjEhLkyJEjXLx4UTo7WVu8eDEA5cqVk4aEf1DWrFnZvXu3dLYQT4lRIxKJSIi3t2/fki1bNulsQUhxjh49SoMGDaSzhXgQiUhIErdv36ZMmTIAVKpUSRpOtnx9fbGwsKB06dLSkPCPmTdvHgBbt26lU6dO0rAQDyIRCUkiPBGlSZOGr1+/SsOCkOxlz56dN2/eiESUCBIjEYnOCoIgCEKSEolIEARBSFIiEQmCIAhJSiQiQRAEIUmJRCQIgiAkKZGIBEEQhCQlEpEgCIKQpEQiEgRBEJLUH3mhVaPRcODAAYKDg6UhIQV69eoVkydPxtjYmLVr10rDQgqVMWNGqlWrJp39VxIvtCaexHih9Y8koiJFivD48WPpbEEQkplDhw7RuHFj6exYubi4sGXLlhTzExsrV67Ex8eHBg0aULhwYWk4WTIxMWHkyJEolUppKEmlmERkbW2Nu7s7BYoUJUcCv6iQvLi+dCGNpSXmaSykISEFcrDfD8C4ceOYOXOmNBwrIyMjAgMDpbOFRDZ06FAWLVoknZ2kUlwiOnXzLjly55GGBUFIYnMnT2DD8qUJTkRKpRK1Wk2vwUOloWTJ18cb989u5MqbVxpKlnZt3oSvjzdNmjTh4MGD0nCSEolIEIREkRiJSKFQ8NTtizQkJIKdmzYwecTQvzYRiV5zgiAIQpISiUgQBEFIUiIRCYIgCElKJCJBEAQhSYlEJAiCICQpkYgEQRCEJCUSkSAIgpCkRCISBEEQkpRIRIIgCEKSEolISD58nLhyYD9H9++LOtnbc/HJV+kaKYb/yyuctN/HUfv9HD9yHMen7kQ7Fv1fvB8EQZcUnYj83t7nruMN7rt8QSMNxkDl4cQ9R0ec3ULA7y1PHa9zx/EWr7/G/ClqDyfuOV7n7h0Xvni84L6jI88/BUkX+81UPJ1dmSLprWm95AVqaTgFU709yaY5M1gyewZLZo1lQu/ujB8/9cf/Z7DewUW6SgoRxI2FnRg8cCQLZk1n3piedKtSkFpNZnLDK+o59/fuh+RAxfO17WlSpSUbHqmkwbhTv2Ff78o0aj6Lm/7SoBBfKTcRqV3Y1ac2bezq0LbdAu5He3sp4XuNJa2q0b7PJl6jBL0vnBvbmLZ2tekw8gCeUcuFMGoXdvSuTRu7+ozZ/R49/U8cG9aAZo1HcS7alX4PjTqE0NBgVOpEHCZQ9YStnSrTqM1Snv7C9fkrlIWHsvnWA87dfci5y1Mpp6ek2MiznLn7kHN377NjTFnpKklC4/2Q42uWss3hKXEtg7RaDYoC/dh46yEXn7ly8WB/0t1dwPh5V6PUjOK0H/7FgtDHhVsnHbj2zDOGGzAN359f4uyJy7z8ruO6/H6MDUsdcPLNTIGcP35OwdeFW8cPc/ayE990rAJAwFvunz7C2esu+AEoMlEwm4aXF1eydu/7eN0IC1Gl2ESkctqLw91g9PT1ULse5MCVuFyNvtycM4RNT61oOncOdazlYFCCHrN6kUtPg+fRGay87CtdCdDgtm8yKy97I8/cljHjqmFqXp1hC/uQ7f02pk46ypcUfiZ6n1jKuuOP8MtUlOzR/NxJwLtrHFkxlSn9uzCgYzsG9hrArPkbOf/sS/QFg99r7pxy4PJjd6LmNw2+L69x7tgpHn0KkQaTLZXLfpZNnMDshYf5EHWj4kCfdFUG0KKMnM8PbvMx2p0Xg3+wIAw8N53e7drSc+Qe3KLdYG9OT2pG3/ZNmevgI4lp+HRgE2fd5ORu3pEyxj/m+t1iy6CO9G1aj9H/e6vjXA7g7twWtG/TgVELL/BNDaAkb9t2FDfwwXHbdlwSdB4I4VJoIgrm4e79vFCZUaFRDUy0nzi79zTS005K9WwV8zY7Y1JvPENqW/zceKPyIxnbIQdK1Sv2T1vOU8ktqsbrGItnHeOrzAa7qZOpbhG2plH5EYxoZYO7/RRW34hLIkymNO9x2OKAhzw/DTpUwkgaD3Lm+Nh61C5Tj+GTFrBjlz2njh3l5P6tbJ49hN5VitK4zwae6DgAwZfn0L9dW3oP+x/vJFd44KMl9KltS59O/dhw/Xvk4N9O/R1vXw0KU3NMZdJgXPzbBWFc2gKi/K6A+hUOe6/iryxInaaFCb/fktu0ZujgChhrv3Jp/izOSZroVc/WMG/Tc0INi9JlYmcyK8LmK7I0om5pQ0KfHODIg5RzI5UcpcxE5H+Zg0deozGtQv1RLShvCt9O7+GMR7S3SYA3F5Zv4IkqHy2HNiddpC03p9KYqdTPICf44SoWbHeNcFfky835kzjyQYul3RRGNkofYaeZU3Vgb4orX2G/dA+fY/rzyZj69X4OX/NDWaARdoUk1SHVa+x7N2L42mt4Ghai0cQt7Lz+DMeXr7l47TiLxreigIkvL/YOp3vX1bjEcD1GLBc0HseZ2X0Gt7wNyN1jNZObpYsQ/UtpVIQE+OPr9oxzC0ew7YE5VVrY8uO+Jt5EQRg/alcHzt4PQZGzBlVzRzzPleTuOZ2OhfTRfNrLooXXCQgPad5xYPpS7vsrydF5Ft2LGfy3mjwDVWsWQ0/twvljDxFHIOESeAkkLZ9zuzn7UYtp9aZUz1EXuxoW4HOBw4c/RNtEofE4iv0Jd5Sl2tOyqL40jNyqEcMnNMASb64vmsHpH899gu8uYc62l6jT1GbItNbYSPaYImdbWlQzxf/yDg6/jFqpTzwa/N9c4dDy6Ww+9xk1Gj6cXMD8hZs4/8xTR7NXXKl5d+wYT0IUZKtehxyR8pCa99tGMMvhI2qzSgw7cIaFQ5tTOl9mLC2syJi/Mg2Hb2Sn/XhKmWr5enEms/73RkfThkSIE9v79WfvKzXp6s1l+fQ6WCb0TAx4zvnNazhw41O0xz65UD2YTeOs1pQoUI5Bm75SfspOZrbKkPCLUBSE8aDB69J5noXKsCxdgXzSIsCwNL2mdiKLUsWrrZPY8jQE0PDtxCyWn/mKLFNrRo6syI/WvB8U2JQvRxaFmjeXzvE21hNfiE6Cr4Eko/Hg7J5TfMWSyo1rYy5PQ5UmtUgjC+Duvr28juZk8L5wnFu+ehS2bUCmH1XryOTYtJzOgGrmaD8fYPHia/iHOLFt4iqehZhRduRsWmbTsaLciup2FTAOuc+Fk3EohBMi6DlHRtWhVhk7Rk5ezImn3mjR4P3Qnk0zB9O7SnEa91rHYx1NY7HSeHDt4kNCZVYUL1+ISNdnyD12r7+Aj9aQIgMW0qNE6ojRn4xLDGZUl7wotd44btuBc0xZUfOVa1O6MO+8F6mKDmHRqm7klBYK8aB6c4Blo0cyZXXUh/7hNN9ucWDxPLZf/IDa/wkHRjejSfnSNG05ncvfwhfy5uXpdSwY2IYOtcpRp1Rx6tduxPBp/+Ohjp5tP2m+8HD7RAY3qkS90qVp2qw3K0++1vldFAUHsenGA84/ecu951dY2K88aX7pChQFYdwF8uDmI0LQI1fRYuhJw4BJ1bEMa2yNPOAOm6b+j/e+N1gzYw9u2rTUHDuBGjqqrvr5i5HHGFQvbnEvll63QvSi7tlkTvPxEIcveYNVLexqmgNgUr0p1dLLCXmwj8M6u2QG8+j6HfwVuShdKQs60kkYRQ7aTB9KidQqXLfPYt3Sqay/6YdxmWFM6JYnmvXkmFeuRF5lKE43rhO5q4MGjzuHObRnV5ymI1ffRFobgJDn7OrWiNEb7kDp/sw99ZSdA/OhREnBUZe4cHwlHUvp8XL/SLp3WsELXSVgTAJvcf9RMOjlo0CRyBlB9eI0V16pwLAMjVvn+9mmHpUBhRs3IIcSVM+vcONTdBekirc7+jFq3TPUmZoxdcskyoYdwt9K9eoo62bNYOmOg/yvexPGrr/AW/dPOF++xPNvaiCAq6Mr07jNcNbuucwbHzlGRvDl6UWOLOlHh6YTuakryQe9wr57VdoNWsrpB+/54vaSJxd3sqRjbQZseh6lhiIzMMMmV04yZ0hDhAaeXyIKwjhSveb5Cx+08nRkzZlGd8EnT0e9CaOpZAbe5+cwttsodr1Qk7riSEa0yqR7HcPc5MyihGBnnj8PlUaFONK5b5MvNa72e7gTIMeqVlMqmPyYnboadrWtkatecHzPjah3o+p3ODl5ojXOT4E80RenAMoC/RjXtxgGfldZNfsY3wyL021Wf/LGcNeusC5CPms5Ic6PcY5U+oTyYscoRvftxcg4TGNX34i4MqDm7ZYRzDv1Gf2So1izdw7NStugDH+4LdPHulwnJu3dQY/Ceny7PItZ2yI+34qdyvUJL321yNPlJLvk9jzgySPeqECRpQSFIz9Ui0KZtwi5jWSgfsXLF7ouSC0BjjMZMu4YnqnL0X/TSppk1Z3afw8t/mfmsuhyGppvvofj6/fceridNtkUgBaVUS5qj9zI/keuXL11nUOX73P1zm7a5FES9HQTGw57SD8Q1Yu9bD6nR+05Z7j8+i23Xz5m/YCSpNZ4cGn6JA5Fm5B1UDmxvVt1us6XngOxEAVh3Kje8P6DGuTW2GSIvgxQZO3EqEGlSaVx4+a5RwQaFqPrtO7kiO5UVWbCxloOGjc+vguURoU4irl0SW5UTzhif48QuTXVmlSL0F5rTLmmdljL1Xw4uotrfpHWAtUHPrlpUGTIRsZYb0UNKdDYllw/zlW9fPWxLRLLSsosZMwoR+3+gU+RsqAehXptYP0eezbEYVozulrElUH1CPtt1/CTZaT+yEEUjdxA/R/TCvQe1ggLmS+3du3hdYRKofqbE1f2rmfzytXsO/EQL8ltuvrtGz6pQZ4+I9aS50Nebh6EAvJ0GUgf/bUbRpmedFZy0Hzn+7eotVLtlzPM7L2EJ4GZaLh4K/1K6W7m+0mmj76BPvr60ZUA8RfqE0qeIRuY3Dg7BsgxtrbGVA5gTLWpB1gythVFrf871soMdencsghKAnB55BTxo34skJVGyw6zsFdZrJSAQSaqjV9A+3xKtN4XOXbC7edzKz19fZT6BjqbhABQf+bF7Qe4fJL0voxtP4iCMG4CvfjmrwW5KeYW0exLAPTJUr4MNj8WkactRMFsMV3/RpiZGyFDzTdPT2lQiKMUlYiCb+/k2HMV8ox21K8UuZOxQflm1MqiQON2nEOnJEOgqL/j46MBU3PMYusqq3Zh14TVPFObY5XOgNAHa1iwU9e7BREoLDA3k0NoWJfc/8hJk78yVWrXoWocpspFbCKsCxo3R+65qJCZlKNyxZgLbtMq1SmWClQv7vHwRyIOcJxNuzLVGbPiENcvHWL9gOrUazCdmxF6Sgd6fSFAC3JTC8wjXZ9aQoLCspZMTx/9WM8UPfSUAFrUGmm/WZDpm2CaSg4aL17cexn2UmBMjFuy/K0bGzpZRThJNXze1QO7UkWpWTJsqttmHS4qCLo4jgY/5tUsWYzatSdyQ1I1lmduy5B+RePRLKbA0tICOVoC/aN+Y2XBdvRqImnqNShC1apZUBCE84NHhNVRDKm2zIVHxwcTXSUw+N5pbvoWo03XypEDOvdDRKIgjAtNYBDBWgB99GM6AVTP2Dp1M681RqRJkwrNh90sXnaTmFK8nkFYc0lIUJS2GCGOdJ/byZI/N3Yd4r0a9FJ7cmnuJOZPjTDNOYmnkT5ov3Bl3xEi9+QOJVQFMj0D9GNMRGpcN49g6aXvGBTvz7KFrbGReXFx9kSOxdg3Wx89PTloVYSGRC2EE0rl9gkvDcjTZcQ62lvpH4xssDKXQ6gXXp5qQEPA+yCKLrjG+cvHWL/3FMfPLaSk6zIWbAkfGkhDUFBQWLdqPQNJAS1DP1XYHE1gAIExbT6A1h9/fy3IjDBJraP6ZFKOISuHUyR1EC/W9GHqgYT1ctOEBhMSHPTfFKoK+/5qVaT5wSGhSAeekFukw8ow8ryI/F+eYtuU3vSqXxnb0oWpWjgvDaddDXvWE+WllOgoyZQlI3K0+HjEMJ5cRJpPHFl+AJM+C+kZW+1bh3+nIAy7eLVaNTrudX7QoPlxYsnlES52heLHDYMaddQK+w9q3m0bz/pb/ugXGsCq//Ulr14oL9ZPYNuzaFdCHRp2NcmV0dxlCLFKOYno+ykOnfiMBgh2OsympYtZF2laxolnYfctfpf3cCzi25NyfQz0ZGiDAwmK9gQG9euNTJt1AW+9AnScMZBStmMZbJsWrdth5k+LafSEIIKDNCDTx9AwYqZT4+a4j71bN7MnDtO+C68irAvI5GGXnkYdc40MQKtGo9aG1Uz0AeSkbTmVcY1z/kwwymyNqVlcy9vnzj+7eyvCLx6NStIFXEHa9FYoAa37ez5Ffx2G8X/DBy8NKDKSKYuORIQMg5KjmDuxJmk07zk6sjfbnKSP82MjJ2On/3H28QuuPAmbLtj3I48SDGvO4/SPeVeePOfypTlUiiHpRKbm44F+NKvagunL9vHA0wDrPEUoUrIMhXOYx/MikaNvoPfjuGnilmy1GnJ12sKyYSXiUVv7z79SEMqNU5NKBtqvnnyJ7oJQe/L1uwZkxpiY/rc35cZmGOsBGj98fXSvrHE7wIL55/GRZ6PpxIGUqjCYoS0zIfe/yfqp2/igczUV/n4BaJGR2uwP9Lz5S8XvGksyGjwddnPpixZl/k5M27iNZZt0TBuX0aqAEoJucmTfi/8KVnlaLCzkaL94xHACv2b36Jlc+64ga4fZ9C1nDPJMNJk0gjKmWtz2T2TxufC+vhJqdzy/aCCVBRZhDx1+UOGyZwIThw5iQhymKRtuRVgXlJkykV4JajdX3sYycIPmqyvvvmmRmWQik1U0BZLai6/fwdTC4se9pRwjUxOUgMbPB1/JvjHKX5CsSlB/uMcD6bAIEn7XrvI4GGRpi1M0/AFbFEpydV/BxKYZkX+7yKK+M7mta0SlP+3bYRaM2c7rkMzYLr/GxVtn2bxjB8u3/I9ZHQvF0FtQFzVfv3xHAxiYm5NKGtZFkYni9SqQMYYOMdH7dwpCZd78ZNMDtes1HF11n4+az1e57awCvfwUKByhGUHPmnSWctB64uGma92vXJo9ldPuWixsxzGwhjlgQbXRo6hiDt7n5rDoqEfUGwu1Ox5eoSAzxso6jTQqxFHKSETq9xzfexE/9CnUchCtmjbFtomOqWkn+nQojyGhONnv4kn4DbcyG5kzymMo0NW83TqCJefDXlwbPaYa4R3yFLl7MLp3UQzUrthPmI2jroIz9BXvPqhRZshBpkiFiR5F+m9j25HjbI/DtHl8zYgrI09bmXKF9SHgGqccYmrK0vD5+DEeh8hIXaEmpaKpCXhfWcOBp1mp0ajkz/eFlOmtsZCD1tMNT8n1qSxQmwpZFRB6l8M770XfzKR+zYGNx/mqlWNdpyllo4wRFIE8E/Xnr6BtHn0CHy1j9NjDkmbUPy/k2XUeftWiyNmcri3zRx3iKBpabw88pQ8PNF95eM8FFUqy5csfzySWAP9QQajIVJ965VJD6F22TFjHC+m1rHrLsWmLcfSTYVKlFfWyRLgh08tNjqxKUH/m3RvpQYOAGwuYt/st6tQV6TW+Fel/lIyKzO0Z1rc4BprPnJgxhxvSbvyq17x5rwFFNrKHD6IqxFuKSERql70cvRkIhmWwa5ormvd5ABRkbNaWCqYy1C8PcujGj59okKejQKEsKIIe8/hR1OJU/WYL02ed5bssPXUnTqZm2oi7xYDCA2bSOpcSlctGZi52jPLgUuV8n2ffwbhgUSKfi3LMcpWlbKXKcZrKFJAMc6PIQ/Ne9UmLN5fmjuaQq+6mrJDXO5i5+DIBenlp2a+JjlEK1Hhenkm/3vsxG7CMAeX+y1R6ufKQ6Uet6530Fy30y9C2ewVSo8J53WDmnPoUtYlQ44nj7N4sveKLzKwKPQfUiLUgl6epxciVwymaWsX7XUMYt+W/psIkoWeIngy0AX4EREyKQU9xOPYo2u+mfrOVcf024fxzPBgIfrienRd9QVmAqnVjOlcTyb9UECqy03rKCEqbwddzo2lTvTmTZq9g59aNbF04hoG1qzFq/zs0VjUZOrUjGSNeB/K0FCqWFQVBvHz8LPI7XiEP2ThhAy9D9cjTfTLt8kY8avrk7zOVFjkUqF5vY97yO5FuyNQfn/DSU4MsbREKRx6WRIiHKEVW8qPi2b59PA0Fo/LNqBc+4mA05Oka0rROWmSad5zefebHC6b6FKpWkbR8wvG8ZCgUtSv7xkzn8lcwrzmWkc1sou4Uk0r0m9QSa3kIz9eOZv2DSKci785f5LXKmBJVK8WtKSbO5Fg1m8v0Lvkw+HSI8ba2jFu6n8duIWiBoM93cFg6gPZ2gzjjbkmFCWsYXF6SBjSe3F7ShpZdDmA16hCbxlbENEJYnrYYhbIoIOg5z55JE52C7D2WMNYuA8qAx2zvWIEmHYaxbOV69m7byJb5oxhYqxzdFjnio5VhUaE5VWI5PuGMSo5izsSapMGLS1N6sfJ21F5pcaHM3IAeEyYxolOZyKNCxIN+oVqUzyhH83EP88Zs5Mrd+9w7uY4pTRsy7wGkjqaDS6qMNgSfHEq7up2Yt2Id/1swiC7t5/M4SE76JiNoX+D3F0z/WkFoUGw4a48sp005a0JenmbX/LFMHjqEGTNXcvJRINZV+zH/0HY65peeDfrkr1QeS7maj3dv8jnCHZX/6ZXsfBiEYe4ujBhULuo1bFKFfmNbkEE/hOdbV3IuQq9T31u3cFFB6pKVKRZNS4QQuyhlbrITdIODB51RYUq5po1+VpmjZ07Vto2wkWvxOrmbcz+GZ0lVsQlVM2h5c2w/D37e+at5v30Ui898AdOK9J3238i6kcmxtJvI4LppkQXeY9O4lf8NY6NywuHwfVRm1alXxzLxd6jchlrzj7FpVnsKyB6wb2pPJu98iRoVzpv6MmLqdl6a1KDXhhOsHlgycm1E84HTI+rTf6cRPQ+cZ0n3Ej+bHH/SL0LZclbI1W95eOtD1BqPMg+tNp1m5ejG5DP15vnx9SyfOIzxQ4Ywc/ZqTj5Rkb1WfYpZKfhyYjDN6/Zm0+X3/901GpuQWk+BoYmJ5EG8klzdVzGlbW6MAh+wbcmBSNE4MylCg0Ej6VQrW7S1D3kqY4z0ZOgZmxCpL0k4oyoMWTmGCtbBPNs2hG61q9C63TjOp+rKsh3DKZhKgaHxfy9xyQ1TYahUkq7BEjYsak3694dYP2k402Zt5o6bPlkbzGbFgqZEqlj/Jv9iQWhSuDPTjz/j2q0zrNuwlllLV7Nw21EOPX7FuYNzaZRf9wt3qcrXo0JaGaGPL3ItQnuwcYN13PDy4fHNRVTX2bopJ13zDVxy8+GF82bsfj6K8+PWBUf8MaV03RqRbvCE+JFptXHul5pg1tbWuLu7c+rmXXLkziMN/yEqnsyqQqtFbtRac5MlLaJ7LyN+/M4NpmHrLWg72XNsUS3JoIiJTOXJy9uOXFg1kgXH3MjUbC6T+tlSqlgWjKNsjJqPW1vTbIEx409sopHuAfYA8DvWi9qdduFffTFn9vaIPtkHe/Ly/h1euLrjG6rEOG1W8pUqQ+50BoS8OcKCfkP4n6MnKgxJX7YbkzbNpo50lNjkLOADD6/e4KWnBvN8FalUMlOcerGpvJ5w49ID3FTGZCxciTIFwnob/n5+nO5dmAH7Qqi+7D6rO6RL8Dk9d/IENixfyrhx45g5c6Y0HCulUolCoeCp2xdpKBnx5/KQkvTc5k2lRfdY30VH60d8+Dowqkw7DgU3Yv6tbTT+jXceOzdtYPKIoTRp0oSDBw9Kw0mqYcOGODg44OzsTO7cuaXhOPl9ey7ZUVKg1yjs0n/h7JLlPIzQrp9gqmdsX7CbTyY16T24+u9NQgBKK3KVt6VcXjPkyDDPX5VKJXQlIUDjzvkDl9ArX5vcvs64ODn9Nz1/y/cIDz5SV2tJjQxyAm8d54J7DD0HDKzIVc6W+m270KZTBxraVSZ3urCiWj9bI8YdvcnORb2pkFWBx20Hrr9MYUPOGGWiaJ2WNG/fmppxTEIAyrSFqNy8Ay1bN6XCH0tCgO9Fzl7+AubVsauX9l+6mBPImHJd2pNH6cetAwcT9oOEEXw7tZeLHjIyNOlC7d+YhP4F/9Tek6dtxIgpjUnzfA3Tl8XQCyxOVLzaMIp1t/UpO2YWLaN7ZT6paDzx+qrCfX9fGlUsg13EqWpfDkX8iUvjqrRtUwCl31UcDr+L2jwXVworindZwNY7Tpx02EzXknEtyoWEEAVh/OkX6UGXOmkIdtzBgRheUo2V5h3Hdpzmu2EZ2vWuHmsHHSFm/9jZK8e6+UJm9y9J4PHF7H2W8FSkfruXdXvdydlhCXN6xDQydRJRFmXolW+4fPWNOrkfp0umiIdenwLd+lPNPIi7u3bw4heuTwAUachRrgxZxdX5+4iCMGHkNjRdcRH7Y2tp9SudO+TW1Jt9lH0XdtItUi87ISH+sUQEyK2oMvUEJy7/j44FEn7Hrsjajrnnb7NvSXMy/AXnodymHXPOXWTnqs5k+4XrU/hDREGYYHLzHBQuXQibX2pL1ydtvtIUzfMHm2L/Yv9eIkrxZBhnKU7J8uUpkDkx74PlmGUvQfGCmcTddYogCkLh7yESUYqjIEenNWw/dpzprWL4kT9BEIQUQiQiQRAEIUmJRCQIgiAkKZGIBEEQhCQlEpEgCIKQpEQiEgRBEJLUPzTWnCAI0UmMsebUajWOL15LQ0Ii2Ll5A8vmzPprx5oTiUgQhF9ORHp6eqhUvzokhxCbZs2aYW9vL52dpFJcIqrXqAnZcyXsiwqC8PusXjQfIMGJqF27dhw/flw6O9lSqVQEBgZiYhLlh1GSrVSpUrFr1y6qVasmDSWpxEhEaP+A/PnzawExiUlMyXxatmyZ9PL9K5UoUUILaC9cuCANCfHUoEEDLaB1dnaWhuLsj9SIXF1dWbNmjai6/0VWrlxJ3rx5qVWrljQkpFB58+alV69e0tl/nUePHlG0aFEAcufOjbOzs3QRIR4So0b0RxKR8HdZsWIFAwcORE9PDx8fHwwN/5GfBhX+CiVLluTevXs//3/hwoVk19yVkiRGIhLdt4V4mzRpEgChoaEMHTpUGhaEZOvRo0eRkhDwT9QCkzuRiIR4WbFiBd++ffv5/40bNxIUFBRpGUFIrrp27SqdhYuLCxcvXpTOFv4gkYiEeAmvDYUTtSIhpdBVGwonakVJSyQiIc6ktaFwolYkpAS6akPhRK0oaYlEJMSZtDYUTtSKhOQuptpQOFErSjoiEQlxEl1tKJyoFQnJWUy1oXCiVpR0RCIS4iS62lA4USsSkqu41IbCiVpR0hCJSIhVbLWhcKJWJCRHcakNhRO1oqQhXmgVYmVhYRGnRATQp08fVq9eLZ0tCElm+PDh+Pn5RZq3c+dO/Pz8qFatGnnyRB6I2c7OjsaNG0eaJ0QvMV5oFYlIiNHWrVvp0qWLdHa0jI2N+f79O0qlUhoShGQje/bsvHnzhq1bt9KpUydpWIiHxEhEomlOiFHnzp3RarWRplu3bgGQJk2aKDE/Pz+RhARBiBeRiARBEIQkJRKRIAiCkKREIhLiTSaTAfDt2zfkcrmYfkwymQyZTBZlvpiS3/TmzRsA5HJRBCYH4igI8VasWDHSpEnzMyEJQkojk8kwMTGhcuXK0pCQBESvOUFIJOGJWVxSwr9E9JoTBEEQUjyRiARBEIQkJRKRIAiCkKREIhIEQRCSlEhEgiAIQpISveYSgZubG82bN8fNzU0aEv4hr1+/BiBHjhzSkJBEDAwMWLx4MXXr1pWGhESSGL3mRCJKBPny5ePFixfS2YIgJAN6enp4eXlhamoqDQmJQCSiZGDhwoWMGDEC8zRpWLxhC6lNTKSLCP8IH+/vqFQqLCzTSkNCEpk9cRz3bjpSvnx5rl+/Lg0LiUAkoiTm5eWFjY0NKpWK9bv3U62OqP4LQnLi5eFB3XIl8fn+nZ07d9K2bVvpIsIvSoxEJDor/IK6deuiUqlo1KKVSEKCkAylTZeOCbPmAtC9e3fxC8LJlEhECbRx40bu3btHGgtLJsyZJw0LgpBMNG3Tjso1axEYGEijRo2kYSEZEIkoAfz8/OjXrx8Ak+ctJI2FpXQRQRCSkRmLl5HKyIgzZ85w/PhxaVhIYiIRJYCdnR0hISHUtK1P/WbNpWFBEJKZDJkyM2rKdADatGmDSqWSLiIkIZGI4sne3p4rV66Q2sSEqQsWS8OCICRT7bv3pGS58vj6+tKmTRtpWEhCIhHFQ0hICJ06dQJg7PRZpLexkS4iCEIyJZPJmL1sJfr6+hw4cIBr165JFxGSiEhE8dC0aVMCAgIoV7kKrTp1kYYFQUjmsufKzcAx49BqtTRu3FgaFpKISERxFP6Q08DQkJlLV0jDgvAPUuG6cyCdG9jSe+YZvgQ9Y0cfO9rXr0f7pkM58l4tXSEK9ZsdjG9iS7v6tvSZcxEf9XuOj2lK+wZNmXHoAxrpCoD6wwGmt7SlfctRnPiga4mY9RgwmAJFivLlyxd69OghDQtJQCSiONBoNLRs2RKAYRMmkyVbdukigvDPCb43n5FjtnDDxZSa7WtgaZiPWjUteX3zGrcubWL+nON8iylPaD5xdPJE9l2+yu3Haoo3qoSpIjM1O1aBJ+fYNqwPW52idipQZKpPy0rgdH4NEwesxiXqIjFSKpXMWbEahULBpk2bePTokXQR4Q8TiSgOOnTogLe3N8VKlaZLn7Bu24KQUvm/v8V5+50c2H+Cpx6x11p0Cn7IulFLeOhvSbVxc2meTQHISd9sGgNrpEGGBrd901h7K0C65g8avp2azuLjnmhJReH+c+lSQAmAQcH+TBpSDqPvl1k+Zh2voiQaA/L1XUDvssZ4X5nNtA0viLJILPIXKkzPQUPRarXY2tpKw8IfJhJRLG7evMnu3btR6ukxa9lK5PI47jLNF17dvsGdm054xnKVaHxceex4nXtPPxEsDf4SFd+eX+DQ2tnMGz2YcYMGMmXCTDbuPM0Lr1i+VHwFf+bFzevcvfsK72jugjXfX/HQ8Tp3HO/yNrqFovPj8+84PuKjvzSoiwbfN/e463iDBy+/SoNJT/WQpdXTUyBzbdY6JzAZxJfGjcvTbKlTqia9e/ZmdK8OLDzxXbpUHKj5sGMKm+8HYFh6ICM7ZEMRHlJkp9W04ZQyAVTP2TVtre4ai981Vk3ZzSc16Bfsy4SBxTH4GdQnb5/ptMunwPfqfJYe8ojaRKdfkC5TepBL4c3NRTM57hFliVgNGDWGnHny8OnTJ4YPHy4NC39QHEvVf1fDhg3RarX0HzGK3PnyS8PRC7rE0hZ1aNtoFKe/xnyRhD5YzsAGdWk/eDtxaFaPE98nO5jeuChVKzZi5NhZrF+/iX3bt7Bj1RzmDGhOg6JF6TxhPy5xKtRjp3bbx5SGdWnbYRH3Q6RRwP8Oa9pVpaWdLYOW3CfEMJ6nnswV+wF2tLWry6R9blELJim1K3v61aaNXWMWnveTRpMBNerQEEKDQ1En4miPqqer6V+9Ar2WP5RE1Lzf2p9hS6/yLX0Nus5YyZzF02hSKJVkuTgIuM7mVRfwlWWg/pDu5P6ZhcIo8/VhbN9iGAABN5exaK/0WU8wj5aPY5eLCpR5aTd7BCWMIi0AhqXpMtAWc7w4s2QNT3WcUwal+tOzrgV4HWXdugfoWCRGBgYGzFq6EplMxpIlS3j16pV0EeEPiWdp8G/p168fnp6e5C1QkN5DUsodkxq348NpX78v2668Q5W+JLZ9pzFz3U7W7trBosXT6Nq0FOnV77i+qhttW87kZowN+YlA/Y6jQzuz3NEH41KjWLauB7n/u/2NG/1S1G+QGwV+3D56FPdYvrL65QFO3g0Bkyo0bJRJGv5LfePc8kWcfexLhiK5IofUL3HYcR5vWUaaLNjBuH6daN65P41KSjNA7LzPbOaYqxplnta0qWEuDQMGFB44hw759EDrxYW5c7gUoeKler6WuWseEIySLB1nM6CSrhHr5aRr1JW6GeWonu9iz2Udd0xya+p1boy1XIXL3i046lgkNiXKlqNjz95oNBrq1KkjDQt/iEhE0XBycmLNmjXI5XJmL1+Fnp6edJFkKfjRYob0W4+Tr5LMjRay5/p5ls0cSqsWDalRtxENOw9l3MZzHD+9kHpZlHg7zmPooF18SKSaWFTe3JnTiUn275Dn6sjcrWMplaCfhdGnYPMm5FVCoOMhzn6KKROpcDl4hKehMsyqtaS29b9xmms+7Gf3cTfk+VrSoqJx5GDoa95+UIMyP0VLpY4ci5dvXDxwmq9aJXkbt6aQvjT+g3FF+k3rSBYFqN/vYtGyW2HNzuq32E9ZyG1fkGdqzZixNTGTrhvOuCqNG2RHofnIuQMX0fW0yahKa+pmU6D5eAwHXckqDoZPnELGzFl4/fo1M2bMkIaFP+DfuEIToG7dumi1Wrr1H0jh4iWk4eRJ7cLOCQu56wMWteeyYV0vCpvrOsRyTIv0YsHOKZQx1eJ5YipLjn2Jvbkr3lS4bu/LkCV3CUxvy/j/LaKOja7vEzfK/M2oW0QPAm9x8ug7os2dqsccd3iCSpaWqs3rkUYa/yupeWu/h1t+SvI0aEa+sOf+EYQSGgKgj150ySMu/C5z+boPWmUeqtTJS5Q/E4FpjQmMbJYBOSE83ziFnS4qvI5OZfnZr2jlNthOnkLNtDGdD/oUqVud9HItX6+c5p6uB6j6paheLQNyrRc3ztxM0DNWI2NjZixZDsCUKVPELy0ngZjOgn/WuHHjeP/+PVlz5GDwmPHScLIVcnsTO2/4gXFFes/sRo5YChyDAr0Z0SkPCs1nTm/az+dEzUQavl2cwKDRR/EwLkPfTetplze+7XESijzUb1wafYJ4cPRItLW4kPv2nH6hQm5tS8Oa0d5vJw2NH++u7mLDrBVc/qQGzVvOL5rEqi0nfq0Difo1Z07cI0SRi0q18/yXIFSfeXb5AtcuO/FFowXNV1yvX+DaxQtcd3SOtmNJdEKe3eLxdy3ytKUo8aOXW7TkVtSZOJGaaWXge42N8+ayfO5B3DUyLGwnMaqpdawFkEHx8hRODRr3e9yP2n0urBmwXAmM0OB1/yZvdS0SB5Wq16B5uw6o1Wpq164tDQu/WWznwT/n3bt3zJ0X9rMOs5atxDBVAh7mJokQnp06y3s1mFTtSONckifIOhlQuFkjcikh8M4Zrn2JZ6kUg2Cn9QzvvYrnmjy0XLmdgeUSIyEoyNykKSVSQci9I5x8rSsTBfPwoANv1HIy1m9NeUkLVVIKfrGXqXZFqduoF3OXHuSFjxY033h6cDmLh7WiUamKDN94D1/pinGg8bjAtUehyKzKUKpghDsQv1MsbNWILm1mcM0HUDmypk0jujRrRNc+a3EKjfgpsdHg8/QJH9WgzFOUgnForZZnasvokdUwkWlwt5/DzhcqZOY1GTytLRniUvoYF6FATiWoXvL8aaA0CoBR4SJkV4Lq1ROcdC8SJ+NmziZtuvQ8efKEVatWScPCbxSXU+GfUrt2bTRqNW27dqdMhUrScPKl+c6zR66o0SNfhUpxbo5S5itJAXMZBL3guXMCbyclNJ7HmdF1PFe+pqfGrB1Mrm+TaCeaPGNj6ldMDSH3OH3UJWrzXJAjx465olbkom6LchG6BMdO43abU3t3cWhPHKb9V+LVwzHkxUYGNevN9rtQvO8a9j48SY98SlAWY8C5J+xe1puies85MroZ/Vc9jXcTU9CdmzwLBr28RYmYh0hViubjJjN8XHsKGgHKfNQfM5nhEyczbFB9ssRSqYlMw8f3n1AjwyxLFkzjdFAVZO00gsZZwhdWkLn1cJpnj8uNEqDIRKaMhkAQn999lEYBUGTMho0hEPSBj5/icVAkTM3MmbpgEQBDhgzh+/eEdG0XEiJOp9K/YuHChTg7O2OdIePPIeNTDM0HPrupQWZChizp4n5glRmwTqcAzVe8PBIhEYW+Zm/vvuxxMaTY8P+xoGs+YmkhjB95emo3qYoJoTw7ejDKy46BV/Zz7qMGZf5mNCwRv78c+vR/zOjXi5F94zANWMnduGYL9Wt2j57Ehc8GFB2+hw0z21PcWg/Zj7BMPyMlOyxg4/8GU0DvCzfmjmHvm/gUqCrePnmOn1aOZY7cmEU8+AaFsBs0gj4D7MipLwN5Dqr0G0GfoSPo3a0GGaLkgwDeOkxl0NDtOpo+VXzx+IoGBWnSpf/v3aEYafh0cA0n34fXttV8OLyO03FuB9bDKp0FcjR89/CUBsPopccqjTzsHI7tpb1Y1GnQiHqNmhAaGipedP2D4lxe/e28vLwYM2YMANMXLSW1ia4upcmYJpDAIC3IDDAwDC/i4kBmiL4+gApNlIIn/rSBL3j47BtamQFmVmaJm4QAkGNp25xKaWSonjpw4nnEgseP64dO4K7Ro2CT5uSN190+6BXvy4Ld9mzYE4dpx1jKx7G6pXq8nb3XfZBlbMGAAaWIrsO0Sblh9GmYFpnvVQ7sc47HaAEqPrz9gBo56TJmiLEDQfSC+Hh1IzNblKVhpwWcefyJqD+qrSE4MBgtYGiU6mcijYnmwx5mTjmGl0ZJzvZ9qGwmQ+N2mPnTHYhbS7AMQ2NDZGgJDtTVbw6QpSKVoQy0QQRFs0h8TJ63EFNzcxwdHdmxY4c0LPwGIhH9UKdOHVQqFY1btqZanbrScAqgj4E+oA0gICAeb0hq/QkK0oLMmNQmv346yEzrMWJBO7IoPLg0vh1THT4nfm+8NHWoXystMtUzzhx6/F+B7XOW42c80BqWpX6z3HG8Y/+P3CI/ZWvVoWrtOEw1i5I+Tn9Ag+dNR16rZKQuW5MyMfacNqd81dIYouLlvTvo6oys+nCBPYeeSJJUAF+/+qFFjkkai3hvN6rHrK2fh1qNRnDUpzglc0T/CVpt+LkVhzSk+cCR8RM566FBbtOEgROmMrRXUQzQ8HnfBJac+yZdQzdZ2N/SEv15HbaI9sf0a9KmS8eEWXMB6NmzJ0FBUVOykLh+veT5C2zYsIH79+9jYZmW8bPDTsBfJ0MuI+wN+thubTWasMJaoYx/IRJOmSmsiU3rz4fX76M+O4lO0Hvef9KAIiMZMyfsXjoyGZYNFrF0bCXMQl+yf0BHVtxKyOP3mJhRqVk90slVvDx+6Odb999PH+DyFy1GFZpjmyXBezKRqXD/7IEGOWkzxF5bSWVtjZkcVF88+BLhIKq/PuL43M40qdyUGfZPidTHQBMUdjMB6BkYRozEWep8TRiw4TInHSZTzjK6JCPHIJUBMiA4MCCWIl+Dm/045h9zRyOzpNqYqdRLb0ThATNonVMJalf2T5zDzVhPDS3B/oFokWFgGE1dUhtEQKAWZIYYpIruu8dP0zbtqFKrNoGBgTRs2FAaFhLZP5+I/Pz86N+/P/yokqexsJQukjDyVBilkoHWl+/fY6kT+PrgrwV5ajNME1p+yi0pVCwbClS8uHoJr1j+ZLjg+1d55KdFblWMojliKybjyohCgzYzu30ulD43WdW1N3tfxncAlpgZV25JjQxy1C4OnHgQAhpPLhw+jzdmVGjemHQJOLPVn65zdNtm9myNw7T9PG/jmO1lYXckaNRxWEGtDhvyR6lHeKe0kNvTaVqkKlNPGZI7t65Eo0Dx47xRq+LVDS6MsjDtFy6jf7PCmMd4/smxsLJAjppv7h4x3uxoPu1j1uTDeGhkmFQcyah2WcJuskwq029SS6zloHLewIzFjsTc0U2Fp8dXNMgxs7KSBsOo3PH6pgF5GizTxrgB8TJ90VKMjI05e/YsDg4O0rCQiBJwuf5d7OzsCAkJoZZdA+yaNpOGE04vKxlsFKBy5fmTmG77VLx1ciFAKydt9pzE2HITI30K1q9HVgUEXt3KHl2Dc0lpvnD+f0f4pJGTrnYjSukq4xJKbk3tedsYXtkCzeejTOs0hosJGJgyWkYVaNAgOwr1K84dvkOw53GOX/aGNLVoaGuVoBNb5bSbecMGMWFoHKYR67gfp84KSjJkskGBGg/X1zpHB/iPhm9vXPHWykidKSvhZaoiXWV6brrOmbOLqZNVGbVRTG6MSWo9QIO/j0+MCeLXKMmU2QYFWr6/e4tPdIdT85ljEyZyyk0DRiXpPrMnOX/mBzmW9ScyqG5aZITwfO1o1j+IYUeq3/P+YxCgj02WDNIoAOoPrnwOAvQzkSljYt1MQYZMmRk5eRoA7dq1Q6WKrWlDSKiEXK9/jf3793PlyhVMTE2ZumCxNPxrFDkoVSojcnxw3GfPx+gu2uBHOBx9gkpmQYnKEUcgjj/9kj3pXM0cWchDNo9exMMYx/rU4H58AgsOuaExLkOH3tWjfYieYIaF6bpuNa1z6xP8fAMjui/msa4HHwliQLFmDcmmUPP+5EHOHznILV85VnVbUlXX8GdxoFdyIMsOH2f7kThMByZRKU6JW45FxSoU0IfA64c5HdPQRJoPnD1xjxCZKaVrVPh5LiiyVqNhnfwxdJfWI511WuRo+eLu9hsTkRyzggXJoIBQ54c81Vn50uB+YAxzj3xGgz55e82mW2FJlxV5ZppOGkppEyDwHpvGrSLaNwf8H+P0UgXKnOQrqPulsIDHj3mtAmWOQuRN5JO4ffeelCpXAV9fX1q3bi0NC4kk2lP7bxcSEkLnzp0BGDN9FumsraWL/CIDSrRtQ159Lb7nZzJ68Q2itNCpPnNx6iC2PlWhzNmKtrUjv/SperqBce1bM2jhZZ0PrqNQZKPVrElUTgt+jrPp1WYyZ1113IOrPXmwqRdd+mznndqM0sMX0CV/xDtJFc839adPu06suhJjNouVPL0dEzZPp6IleF+bwYBBuyO8f/Nrf0e/WEvq5Veifn+B9dsdCZBnpGbL6ugurmInN89N8YqVKVspDlOFAsQ4Ok0Eitwd6WibDnxOs3zcLt7qrKyG8HbXGNZc8UcvTye6NopPrU6P7LmzokSNh6trvN9Big/9gmUpaCpD63Wbu8+iZg+N20FmTz6EuwaUObswdkg5dL0Srszbi1G9iqIP+N9cyMxNOt4JA4LvXeeRH8itSlAsl67aTjCPHO8SgBzL4qVJtNblH2QyGbOWrUBfX5+DBw9y9epV6SJCIoj7uf6Xadq0KQEBAZSvUpVWHcMSUmLTLz6QCf2Lkxovbs60o27VFoybOJNVi+eyZHxvulYqQ581DwlMXYyuC8ZQKtLdnJqP5/Zw6MQFvptm13kx66LM3Z1F2yZSIb2cr9cX0bdSMZq07c+smXNYPX8Gc4Z1pF2Z4rQZsYeXgWkpM2o3KwcVjVwTU7/jyr5dnLv0FZPsv36LaVCgDwtX9iCXgYpPBwczYMrFsF/u/NW/oyxI/UZFUKpe8PixP4rsjWhUPgGf87vJ09Ng1lLa5DPE7cgA2jTsz7oD9/AI1gKBuN/dz7rBtrQZehRPy2oMWzme0vHaDDkWRYuTUQHBLx7hrDPRJRKTKlSrYAoqFy6feh65957GjRMTx3LiswbkmWg0ZQzlox3g1pCig2bQKqcStN7cmDeO/VEeugXz8NR53DUyzCvX0d10HHybCxc+oZFZUK72f7XIxJQ9V24GjRmPVqulcePG0rCQCP7JRHTmzBmOHz+OYapUzFy6QhpORGaUGX+QTbM7UDS9nK9PT7Fv5RwWT5/BytU7ueoSjFW5Lkw+cJgRVdJIDoY39249QZWqDHVsM8bjQMkxKzeSjecOM65DJTLK3Xl6ahubF85k0ey5bNxyiNuu3mF3n1pv3t28wIOPkpLLx5F7T1UYlm5EzTiNwxIbOZZ1ZrNsei0sZAE8W9WVoWufJMLfUZCjSVOK6AMoydGoFcV+R0mUCOQ2DZhy6CDj2xZF9nAb8/sMxf6VGlTP2DmgB/N3Pid19aEsObqbHiXiX6fTL1yZUlZy1O/ucO+jtEBPTJZUa1YLC5mKFwd38/jnqaPB4/A45hz8jAYZaRtMZlhsz+pMqjBgYnPSy0H79TRLJ+/DLWKrgd9FDjm8QS3PQM3mNXTWdP0v7eLUWzXyDPVpWC3hT1hj02PgYAoWLcbXr1/p2rWrNCz8Ipn2vxcD/gkajQYLCwu8vb0ZN3MOXfuG9Zj77VRfcb17C6fXbvgEyzG0yED2oqUplNVMd5ftoDOMK9mCo3nmc8q+V9zG5dJB4/+JF/fu4vLuC4FaA1JbZiJX0ez4HRnH2JkHcfUHhWVp2s5eycgW+TECgs8OoGabveScc5fNPTLHXJj8gj/1d5Iblddz7t88yeYxkznjlpX6sxbQrV4FCmVOHcs+COBEzzyMDlrIzf+1ltSSfTnTtxj99/hRccEDNnZL4LBK6lestSvFEvVYjp4ahc4hCwOuML1KQ7a9SUfjzY4saGghXSIRaHD7XxvqDzlBYIFR7Dk3EemjJjSf2Nu+LBNO+ZN3+Fnsx5f4DS9Q/8fpyWOa1qiCRq3m3r17FCtWTLrIP6lhw4Y4ODjg7OxM7ty5peE4SdC5mpK1b98eb29vipUuQ+fefaXh30dpQfay9bBr24U2XTrRpFEtikaXhADVc0ceeRpQooEdv/JzOnLjDOSv3JBG7bvQukNb6ttWJm+GTJTssw3748tpUcgMzZfbbO9dkxZ91vHwWwguN+/wxaAstevFpyYWX6o/9HeSH2XafJSuW4VcZnKQWZCnSk2KxJqEYmNCxeZ2pJcHcP/kCTylzyMTk1FFug+shan2MycWr+XZ72gK9L/GhmVn8CE9dYb2iTx+3g8BN5aw/tx3SN+IPr2K/dYkBJC/UGF6DRqKVqvFzs5OGhZ+wa+d+ynMzZs32bNnD3p6+sxethK5PLluvgbPWzdw1S9H7boZfttBMinchdknL7Nj2zaWbVzJwHpWfHV9yp2bL9Er2zCBzWVxpHHj3p/4O/8QoyrdaJZfif+1/ZyIz4is8SYnQ/tp9ClnQujDlczZ7Kyzo0HCBfN4+Xj2vFKTptZYhjXW0cQXfI8NE7fwRm1JlVGTqWcVZYnfov/I0eTMk4fPnz8zbNgwaVhIoD9z9JKJhg0botVq6T9yFLny5pOGkxE5Vu13cPXJLtpk+s2HyCgHpRs0xbZJ2FS9RGFabXvBlf914xd+wy52cmta/Im/8y/RL0q7vvUwC7rBwZ1PpdHEpSxA5wXjKWfug+PcYfzPKfGqRQG3FzB55X1CrOszam4Xog6S4c/9RUPZ+CCYdLbTmdQpe7QtC4nNwMCA2ctWIZPJWLp0Ka9evZIuIiTAP1ME9O3bF09PT/IVLESvwcn/TkZpnIY05saxDgmT+JQYmVtiZvy7//Kf+jt/EyNs13/gUZTnQ+HkpG+zCvuzp5jbMac0GDeKnPQ+9Q2ns9E8H4pAP39f5q8eS4s6Nry6cBsf6QIJoXHn1qVP5KjflZFrV9AsW9QvoXG/yvXPeajdeRoLl7XXkah+r+JlytKxZ280Go34Eb1E8k90Vnj69CmFixRBBtifvUihYsWliwjCn6V2Zu+gIRx6n5tWKxfRJPMfLk2FXxLg749dxbJ8fPeWqVOnMmnSJOki/4zE6KzwTySiLFmy8P79e3oOGpLyfmdIEIRk6drFC3Rp1giFQsG7d+/IkEH3EER/u8RIRH9909y4ceN4//492XLmZPCY8dKwIAhCglSsVp0W7TuiVqupWzcl/nRM8vFXJ6K3b98yd27YzzrMWrYSA0Ndr2YLgiAkzNgZs0ibLj1PnjxhxYrf+XL83+2vTkR16tRBo9HQrlsPSpevKA0LgiD8ElMzc6YtDBswediwYXz//l26iBAHf20imj9/Ps7OzthkzPRzKHdBEITEVrt+Q2wbNyU0NFQ00SXQX5mIvLy8GDduHPz4cavUJibSRQRBEBLN5HkLMTU359atW2zfvl0aFmLxV/aaK1KkCI8fPwZI/N8ZEgRB0OHQ3t3cv3UTmUyGn58fRkbxGkI9xUqMXnN/ZSKSy+X8hZslCEIKcejQoX/mJyNEIorG9u3bsbe3l84W/iFeXl44OTlRqVIlZLIoP64tCL9NlixZWLhwIUrlvzFqiEhEghCNWrVqce7cOc6fP0/16tWlYUEQEkliJKK/srOC8G+7cuUK586dA2DKlCmimVYQkjmRiIS/ztSpU3/++/Lly1y8eDFSXBCE5EUkIuGvErE2FE7UigQheROJSPirRKwNhRO1IkFI3kQiEv4aumpD4UStSBCSL5GIhL+GrtpQOFErEoTkSyQi4a8QU20onKgVCULyJBKR8FeIqTYUTtSKBCF5EolISPHiUhsKJ2pFgpD8iEQkpHhxqQ2FE7UiQUh+RCISUrT41IbCiVqRICQvYqw5IUULH1MuvrJkyYKxsbF0tiAI8eTk5ATwS2PNiUQkpFhXrlyhSpUq0tmCIPxh+fLl4/bt26ROnVoaihORiIQUa9u2bdy8eVM6G4CtW7fi7+9P7dq1yZUrlzQMwMSJE0mfPr10tiAI8SSX/9pTHpGIhL9SlixZeP/+PXv27KFVq1bSsCAIycivpTFBEARB+EUiEQmCIAhJSiQiQRAEIUmJRCQIgiAkKZGIBEEQhCQlEpEgCIKQpEQiEgRBEJKUSESCIAhCkhKJSBAEQUhSMY6scO7cOWbMmEFoaKg0JAjJ2u3btwkJCQFAoVBIw7HS09OjcOHC6OvrS0OC8NcyMzNj165dmJqaSkO/VYyJqG3btuzevVs6WxAEQfhL7d+/n+bNm0tn/1YxJqI2bdqwZ88eDh8+TJEiRaRhQUjW3r9//7NWFF/p0qXDxMREOlsQ/lrTp09n06ZN7N27l5YtW0rDv1WcEtHVq1dFIhIEQfiLTZ8+nfnz5ydJIhKdFQRBEIQkJRKRIAiCkKREIhIEQRCSlEhE/5jgz09xvHGDG+GToyOOdx7x/M0XgqQLCymCxv0YwyvnJneVERxz10jDgpDsiUT0T1Hzed8w7OrWpW74VKcOdWpUokyRHGTOUY6WY7Zx75sozFKS0IcncHjsjvujo5x4KN75E1IekYj+UalyVaNl69a0bt2KFo3rUbmwDcovzzi1agC2dYaLO+sUxKBKPyb1bkqz3pPpV8VAGhaEZE8kon+SDNPy/Vm5fj3r129g0//2cuzaUx6fnoltBiWBLzYzatZ5/KSrCcmTYQHaz93KlrntKGAoDQpC8icSkfCDgrRl+7N8Uj3SyDR8PHmI68HSZQRBEBKfeKH1n6LmzTI7SkxwxLLjXh6vrIv0Blr9Zhl2JSZwQ1adRU4H6ZFODqhxe3wVpy9KrAuVJ7+5G1e2beTQ3c/ISnZnRreSET7HF5cLBzl87j6uX0IwSJuTErWb0qxKdowi/6XIn5lWhfs9B/YedeSFmx+KNNkoUaspzWvkJnWk9UDt9pirTl9QWheifH5z3K5sY+Ohu3yWlaT7jG6UjLhRKg8enjrGacenvPPyQ2NoSeaC5bFtVI+i6ZQRFozK99UVjh27wP1XbnwPkmGSIS+lazehYYUskm0BfF24cPAw5+678iXEgLQ5S1C7aTOqZI+yJKDB2/k8R0/cxMn1I14helhmyk/p2o2pX9qGiKPbabydOX/0BDedXPnoFYKeZSbyl65N4/qlsQlfUO3G46tOfFFaU6h8ftL+uL2MvJ/SEvD6Avb7z3L/7VdUqbNQsl4bWleXHpcIVJ48PHEAh2vP+OitJnXGwlRt1grbfDJe3XrAh2BTcpUtQWbpSSSkSEn5QqtIRP+UOCQi16XUKzmRm/LaLHe2p7MFgDf/a5WT/qdMaLtlP8W2tWbcOQ/UgH7t5bjYdyYNoPG6woJevZl/9gORK1NG5Goxhx2rupD/5x+M8Jn/O0XDq73pv+4ukftJpCJ741nsXNudghFKS+//tSJn/1OYtN3C/mLbaD3uHB5hX4blLvZ0TgOg4evNVQzpN4cjLj5In3jJzQrSbtYmFnTMH7UgDn7FgYl9GbPRETfps399W1a57qHDz9F/NHhdWUCv3vM5+0FShTTKRYs5O1jVJf9/+1njxplpXem37BruqsiLK4uN5cr5sRRUAmhwOzONrv2WcS3qgoy9cp6xYQuC9/9olbM/p0zastNpLfV//LGI++lQxaN0Hbmfl4ERPkdmQtF+WzgwszZWkrYR1ZtDjO48hE33v6KOGNDPSoMZI7BeM4QN70oz/e4JBmeP/6CyQvKTlIlINM0JEWjwunqD52pQZCtAfmlVBC2f901g9qOstJu4jHXrljKhad6wO/iA28xr05aZZ91JV3sUm84+5PUbZ24dnk/7gnJe7R9Bl5nXdTx3CuXFul7026+g2Xx7rj19zRvnWxxd2osyFsG4Hh5J52lX8JWuBmg/72PC7EdkbTeRZevWsXRCU/L+qCX4355Hq+bjOfRSTqF209hx7gEv37jyzPEoKwZXxybgKdsHNWOg/afISUrtyo4eDeixxpEv6arQf8kBrj99zZuXDzi/czbdK9pgIPtv8YDb82jTdiZn3dNRe9Qmzj4M+/6H57enoPwV+0d0Yeb18K3W8G77YHouvsa3rI2Zsd+RF2/f4frsFqd3LGBg3VwY/fhszbvtDO65mGvfstJ4xn4cX7zlneszbp3ewYKBdckVvmAcBD9YTLeJDyk4ehdXnrri+uwqO8bWIoPCl4drhjPnckDkFbwvMal1L9bf9yZthb4sPeLIM1dXnt+wZ37rNFydMJ59n6WpXRASTiQi4Se/J5sZOusU3lojSrVrSwnpLyBovbl6OZjee46wcmQX2rTpypAO5TBGhdOasSy+5YtZlans3zWBFmWyk9bCmnzVe7Ni5xSqmYbyfMsyDnlICjCtD/fuyui9+xCLe9amcOa0WFjno2rXBezf0pPcShXO2xax94O04NPiffUywb33cGTlSLq0aUPXIR0oZwyonrF6zCJu+RhQdPBuHNYMoWHpHKSzsCRTgap0mr6PQzOqY675yIFpi7j68wUqDZ92jmX8kY9oMzRh+fFDzO5Wi0KZ02KRLgelGvRn8eEltAxP0Con1oxdzC1fM6pM3c+uCS0okz3s+1fvvYKdU6phGvqcLcsOEbbZ37l49AJftUbUHL6UQXUKYJPGHMtM+SjXsBdTx7ckvHLx/eJRLnzVYlRzOEsH1aGATRrMLTORr1xDek0dT8s410K0+D3/RJ4ZB9gyrD5FM1timakIDcduZH5LG+TqdzjYX4uwvIqna6ew3ikI49Kj2WM/l67VCpDJ0pIMBWvTe/khtnROj39gtA0pghBvIhH9owKdT7B2xQpWrFjG4jkTGdSuOiVrDMXhI6SvNZnF/QoQ9QmKBvN6gxlQyjjy7JD77Nx5l0BFTtqP60l+SQJTZG9Jq0rGaH0cuXAjYtsQgBybpiMZVCZK9QvzKgPpUd4Q/Bw5c+m7NIzGvB6DB5RC8m0IubeL3feCkNu0YMzICphL4qBP3m6jaJdDgfqtA/bhvTLULuzcfIavmFFn3FzaZI+6ByIKub+TnXcDUeRsz7ie+SM92wEF2Vu2opKxFh/HC4RttgyZTAaE4vHZA0mDWyQymQwZEOrxGY+YFowDRe62DG2dlcipKw017CphLtPg5fLiv9mqR9gfeEiw3IZmIwZQQrpz5RZUG9qbitI2XUH4BSIR/ZO0+NzcxMRx4xg3bgKTZy1li8NdPAzyYDfif5ze1ZdCOgsaPYqUL4/0xxE07re446oG44yk/nKO48ePS6ZreGKEXOvDO1d3ydoGFK9QIcpnAiC3pmSJLCgI4rXza2kUvSLlKR9lRQ0ed+7iqgaTcjWpGiX+g0FxKpcxR6bx4NmjjwBovlzj2uNQMK5IowY2sVwcGtxv3SFss1Pz5Zx0m49z/JonGMnR+rzD1V0NmFLVtjLmslDuzm9Nu2l7uOOu+2cqTKvaUtlcRujd+bRuN409d9zRvWTsjAoUpZC0dgvoZcyIlRy0/j4/52m+3OXOSxWkLk21SlFvDgDkVvnIky7mvSMI8SHOpn+SDNOy3Zg+axazZ89lwbI1bDt8jWcvbrF7UgOyR/dOpMwISyvTKCeN6rMbnhrA5xJz27ehTRvp1I5Jxz3QAAH+/pFXlqXC1Fxn1gMUmJmZIEOLv6/06ZIMI0srTKVfBhWfP3ugQUG6TBkltZSIlKRLnxY5Wr598QJA8/4dn9SgsM5ODt1lcAQqPrt5ErbZc2kfZZvb0KbdJI57aIAA/P21gIIsnZezYWhF0qtcObmgJzUKF6Zm95nsf/wt0rMqRZbOLN8wlIrpVbieXEDPGoUpXLM7M/c/lnToiI0M/VSpohwzALm+PnoyIEJ/Jc3HT7hrQJEuM5miPQ+U6Cnj/oxKEGKj6/wU/gGp8tjSe8AA+vfvS68u7WhSvTA2RrGdDgqUuh5N/CiTZGmrMnDOPObNi26aw9A6NlFWlkVbpmnx8wsAZBikipqsFDq/zH+0mpifY2g0GkCGUk8v7P8qNSotYd9JurAOYcvISFt1IHOibGuEac5Q6tj82LdyG+pMOcbtazuZ1qUauQw8uL1vLt2qV6Ld2sf8121Ajk2dKRy7fY2d07pQLZcBHrf3MbdbdSq1W8tjSf+CxKIJCQnbBzJlDIWDBnUs+1YQ4iP6c00Q4kiZ3jqsiSfUghId+9CnT3RTL1qUTht5ZW0w/gGROghH4IeL8wdUKMiULZs0GA0lNhnSI0eNm+trJPWvCIJ5/9YDNUoyZskEgNI6HVZyULu9wTX6FX9Qkt7aCjlaQi1K0DHKtkaYerWgdPjLPQDIMc/fgCHLjnDn0VU29iuDReh7jk8axjrnyPtCbp6fBkOWceTOI65u7EcZi1DeH5/EsHXOkbtVJxKFRRrMZKDx+shnadf1cCHueMSvWiYIMRKJSPhlcuuSFM+qAN8bOjsVxCyAh9dv6UwYGo8THL3uB8oCVKggSWDRkmNdoRx5leB/7QhHo+tm/P08p274gH5RKlewAEBuU44yORTgf5XDDm5R3j2KTI51yeKEbfYZ4r3ZP8jTFKTlzPUMLauEwIfcvCvtzPGDPA0FW85k/dCyKAnk4c27RLPkL1FkKUz+tHK03tc4c1lXp3n4fukMjrpDgpAgIhEJv06/FC2bF0RP48b+qVM56aajCPd+zAGHhzoeuGt4u3sK869FfkaC+hMOk+dy4iuYVelIm3wx92CLSFmoA12rmIH3KWYO38YL6VBFGndOTpnOAQ+wsutJ21w/mvj0S9CxSwVMtN85OWMoW59H/WEM9RdPvv74ovqlWtK8oB4at/1MnXoS3Zt9AIeH4Vvtxxvn9zp+bkMT9phGlhoz07Dt9HvjzPuoC6IJW5DUZqY6ejUmAsNKtKifGbnmM/umz+LSl8gbpXE/yZQp+4kuvwtCQohEJCQCJcX7z6Z/0dSEvNhIx2p29J+1jt2HjnJoz0YWju5AlZLVGbTvlY4uy6nJk9OXVa1q0W78CnYcPIz91oUMaVSLbjteo0lbg/GzOpMt5sdBkSmy03X+TBpklPPZYSh1qndgwrL/ceDIYfZunMuAhtXpuMkZRe4OLJrTgvQ/rwIFuXsuZJqtDbLPxxhauyrtxi1hm/0RjuzfwuLR7ahccRinwxOEsjj9Z/enaOoQXmzsSDW7/sxat5tDRw+xZ+NCRneoQsnqg9j36sdWq704MqgiZer3ZvKybew/4sCRveuZ0aMDC2+pMMjfno7VDAE1XkcGUbFMfXpPXsa2/UdwOLKX9TN60GHhLVQG+WnfsVqUUTEShzFVR06mRWYlQU9W0aZ2W8av2MHBw/vZsnAIjWp0xt7MllqZRNEhJB5xNgmJw7wyUw7sZVrjfBi6Xed/c0bQq1N7OvUcytTVJ/iQ3pYBHcsQpSOWzICSw7exorkxN1aNo2/njnQdOJVNV9wwKd6RJQe30adA9H3foqPM3YnNJ/7HyHrZUT07wrIJ/enSoSM9hs5k240A8jSfxv7jy2mcQXIJ6Oej+zYHNg+uQZbQ5zismMSArh3o0G0Qk1efwi1DPrJEqIqYV57Cgb3TaJzPELfr/2POiF50at+JnkOnsvrEB9LbDqBjmR9bLUtF+gyp+HRlF4snDKBbh3Z06DGceQdcMa82hM27J1LRGEBGqvQZSPXpCrsWT2BAtw6069CD4fMO4GpejSGbdzMxbMHfQp6hBSsOrKZ7qbQEvzzB8nF96dyxG4Om7eFD4ZHs3NaTnEpAJkcuj0u3DkGImRhrTkh0/h/ucf3OCz57q9A3TU/2QiUpnttS0pU6wlhzO51YW18f39c3uXznFV81qbHJX45KRa0T4a5fg//7+1y/68JnHzVGllkoULoMBdJFSYlRqL1duXPjPq88fFEbpiVHkTKUzmcVTZdwfz7cu86dF5/xVuljmj47hUoWJ7eldGkVX13ucOvRKzz8ZaROm5GsBYpRLJuZ5IVTUH114c6tR7zy8EeWOi0ZsxagWLFsmEkX/G0C+HTvKo5ObvjJzcleoiLl81qiDHKgV7727PavzQrn/XRKI11PSImScqw5kYiEJCJNRL+ecoQ/Q/VkFtWrzOFJlr443JpLRWmuFVKkpExEomlOEIR48OX61v08UcmxqliNYiIJCYlAJCJBECIJeXSEradf8E36opLai5sre9Nv40vUhkXp2qtmlHH+BCEhRCISBCES1dOdDG9RhvwFylK7cVu69+tP707NqVGsGHXHOvBOlon6s1czrKioDgmJQyQiIYkoSZe/PBUqliW3pTgNkxODUm0Z2LIimVRvuH3hGPu2/49dh87w4KspRez6svjYBbZ3LxC1B6QgJJAoAYQkYkzdqUc5eXw3I8qJO+vkRJG7MZM3HufOq098evOcxw8e8OjFWz69f8bl3XPpXi59lB5+gvArRCISBCEaCowsMpA1Rw6y2aTBUJQWwm8Sp+7bJUuWpHDhwtKwIPyV/P39cXV1pWDBgj9+yE4Q/n5btmwBSJLu22hjMHr0aC0gJjGJSUxi+kemS5cuSVPBbxdjjSgoKIi7d++iVkv7cQrC32v06NE4OjqycOFCSpUqJQ0Lwl8rffr05M2bVzr7t4sxEQnCv0ar1WJjY4O7uztDhgxh8eLF0kUEQUhk4vGjIERw7tw53N3dAdi+fTvBwdLfkBAEIbGJRCQIP2i1WqZMmfLz/15eXmzcuDHSMoIgJD7RNCcIP5w9e5batWtHmpcxY0ZevXqFgYF4fVMQfhdRIxIEHbWhcB8/fhS1IkH4zUSNSBCiqQ2FE7UiQfi9RI1I+OdFVxsKJ2pFgvB7iRqR8M+LqTYUTtSKBOH3ETUi4Z8WW20onKgVCcLvI2pEwj8tLrWhcKJWJAi/h0hEwj+ta9euXLt2LdK84OBg3r17R+rUqbGxsYkUmz17Ns2bN480TxCEXyMSkSBIPH78mCJFitCyZUv27t0rDQuCkMjEMyJBEAQhSYlEJAiCICSpGJvmAgICePfunXS2IPzVnJ2dady4MXXr1mXJkiXSsCD81fT19cmRI4d09m8VbSJSq9VkzZqVjx8/SkOCIAjCX2zz5s106dJFOvu3iTYR+fn5YWJiAkCNGjWkYUH4q71+/RorK6uf14Ag/AvOnz8PwKhRo5g7d640/NvEmogKFSrE/v37pWFBEAThL3Pu3Dn69+//xxOR6KwgCIIgJCmRiARBEIQkJRKRIAiCkKREIhKEFMGfjw8ucOzQQY5eeIaXWhoXhJQr6RNRiCfPzu9nw9I5TJ04nvGTZzB/5TaO3nyHv3RZIR40eJ6bRrPKlWk+/Zw0GE++HBxQksJFqjD+fPDPuRrPc0xrVpnKzadzzlMTaY2kFcK9efUpVrgEnbd8IE5ltuYbrx/c4+49FzxV0mBkGt/3PL53l3sv3PlvbyRcbPtR43GFRZ1sqdemL8PHjGXkoEWc90nM4xu7kHvzqF+sMCU6b+FDnHYoEOLOi3t3uXs3uukeD19/l64l/IOSMBEF8/rEbDrXqUmzfhNYsHoLu/bZY79nOxuXz2Jk50b02xrHQkTQQYXThbM89/TE6cwFaTDeNKoQQkNDUUXoY6lyusDZ5554Op3hglMspfcfplGFEhoaQqhaZ6fQqIIdWda9He07z+Ls96jJICLV000M6dCeThMOxL1QjkGM+1H9gb0TRrD+1jesKnZhzIxZTBvRmHyGiXt8Y6VRERoaSkiomjjuUdQex5jWqT3t20c/9Vx1U7qa8A9KokSk5uOR0XQdsZWbnkbkq9udkTMWsGLNGlYsnM6I7g0plVGPoKAQ6YpCRBpvXl07wNrlh3gRJQ/oU7bTUDrUs6XDsE7SYKLQL9uJoR3qYdthGJ3K6kvDQhzFtB/Vbx2wv+6NzLoxk5eNoUuLZrTq3JAiqX7/8U00htko36AhDRtGnWxLZpAu/dtpvF9x7cBalh96QZTLRkgSSZOIAq6xeuFp3DXmVBqznb1LR9K9RQNqVatGrfot6TFyPtsdDjC1liUy6brCT5pvx5nVZxxL993BXcdNvEGepoxbsphxTfJIQ4nDIA9Nxy1h8bgm5BE/0ZNwMexH1dt3fFaDIlcRihhHjv3245tIZCYl6TJzPvPnS6d5TG1bWLr4b6bh2/FZ9Bm3lH133NFx2QhJIEkSker1PR590UDq8rRongud99KpMpMvp1nSfEFBSC5UoYQC6Ovpvk4E4S+glM74I8IbmTUhBIVKYnHh58r1k6e4+uQ930L1schamMq2tpTLnEq65E/qby+4dPIMt55/4luIPmlzlaZek3oU1HvHg6efCUmdjeKFMxB2Q6rhq8sdXnhqSJO7DPmsoqbD4E+Puf/GD33rApTIYSYNA364Xj/JqatPeP8tFH2LrBSubIttucxIv6Xa4zm3X35DYZWXkrktCHx3neMOV3j68Tsq44wUrtaYRhUirOf/ngeP3xPg8w5vLWhDvuDseB2lEmRyS3KVyYuVPPLnls5tEfmPavz5cO8iFxyf8OrzNwIxxDJzISrXt6N8ZqPIy0ZH7cHz2y/5prAib8ncWMjDHvq/vPccj5CYniTISJWxEEWzmkS+0Yj3cVXz9cVFTp6+yYvP3oToW5G7bD2a1EmiGoJ0fwS+4/pxB648/ch3lTEZC1ejcaMKRNkc6XpyULk7cefVN4JdvqDWgvbbG25fv44+MgytC1AshxnamI4vxOscDKf++oKLJ09z88VnvEP0scpdlnpN6vBH92g8zwON/wfuXbyA45NXfP4WCIaWZC5Umfp25Yl4Kvu/f8Dj9wH4vPNGi5aQL844XleiRIbcMhdl8lrBVxfuvPBEkyY3ZfJZRb0RDv7E4/tv8NO3pkCxHJiFLyA5hqaeN9m/+xSP3WUUbjuKNoUjVnXjd1w0vq+5duYC913e4/Y1BL00NuQqVoU6NYqS/i+5O0maIX78zjK63kAOexlSsNd6Ng0rha6iPCoNX2+uYdSYNVz9LHl+lCob9ccuZ1ar3D+SSTg1n87NY9jEHTz4GrlFWGlVkUF9MrF/1h4+FR3Jif91J7MCIJgzI6sw6GgA1Wc7sqqppE0EDR+2dMJ2zj3Sd9jM2QllI0e/3mTNqDGsufqZyN8yFdnqj2X5rFbkjvAlfe37UGH8JVI3XszG0mcYNuMYb4IirCYzpkCnJawfXRlLOaieLaVZq9U462rgNqzFvBsraJQq4ueu4Mbcmv8t43OF+d1GsvXJ96ht5Kly0mLOBqbVtYlwEfpi36cC4y+lpvGKi8yt+ePL+9rTp8J4LqVuzIqLc6lpAARfZHzNvth76TytwsjMqTbNnlUtM/74Gwk4rv9v78zjoqreP/6ejVWQAQMFVxRcyB1R3EuzXMsFzVRyQ5LcUMsdf2KWC5qKaIlapiVq5hJihaJoCigqqIG4oCShIGQiiIzDnd8f4wLDgM6E4bfu+/U6/8xd5sz5PM95zj3nuWeKMji41J+AbxMpKasc+46T+cBpJ4u2Z9D8owNsGVMLWfFT9FFwgCkd/flJ5cn8wxsZWq1UF/QEVewCeo7eRqbbZPaGjaf+45sXa4/PN7Yhcuon7C8pJJZNvFkZOoNOdsXur6cd7+70oeO8Y9qnoRJIcRq2iQPz2lFYlr5G2CAUkXFwKf4B35Ko6yf2HZn8gRM7F+n6SfkUpW/C+62lnFEO5IuDi+jyzOlbw+0g99gyRn+0mQt/lbJkzOsPYvGGQN6sIQXUJK0awOB1l0rbPGDWfSkxa/ohjfyIzpN+5P5rnxG7tj+lPD/9a7x7LuaMw3C+ipjLkyW94tqvd+P78Uv4NbsIUNBp4a+Eeml7OMN0Ecg6tpJpszdxSjeVU+7GhF3bmdCwYp8l/ltb/FTpylgfD6pKCvgt1JehU9ZzLP3ZibAFievw+zCYX7Or0Wn8csIiTxB7NJxNc/vjKk1j/8KprI4vmfR9L24F46dtJuGukjbeC/n6x2hiThxm7/o5vG1/nuAV4WRWQObTEwoSWef3IcG/ZlOt03iWh0VyIvYo4Zvm0t9VStr+hUxdHa83NV2VFMq0ZUk09Avhh6gYYg7vJnhCRxxk+SRtXUBIXAEAUvsOeE/2x9+vB/VkIKnSnIGT/PH392fqxH40UejeuSRCfioX0m1o7z2TlVv2ceh4LCciv2XhQFcsCq7yw6KVROXqXvWcyJ3p4autS8kyCa+WVZEgpVq3j5g74HEQMkbXPE6uGM/0zYncVbrjHfgVP0bHEBO9l9CAAdifX83y8KzKy7hUJRE6bRlJDf0I+SGKmJjD7A6eQEcHGflJW1kQEodWybIxbzaAyf7+TOrvhjkgb9CLiY/acuzrtcsPrEbYYN7JFYyfvpnEu0rcvQP56sdoYmKi2RsawAD786xeHk7WC25Qw+1AID/1Auk27fGeuZIt+w5xPPYEkd8uZKCrBQVXf2DRyii0pizFvoM3k/398etRDxkSqjQfyCR/f/z9pzKxXxOe4TbPhyaL8KVrSHZ6h8mBS1m6YDI96z+6s4G6CH/8wPyPQjn1lxNvfryefdFxnIw5TPh3wcwb1YW6Fv+eFfTKCUTIcRmxkhD/Ljgq8kn9aQU+fXrx/sLtnC3rTT31ZbZ8FkpCvhVtp31JyOTetKhli419A9oP/4SQqZ5UUV9hx6afyX68AqlOYcuyLaQ8sKC531q+nO1FOxcHlLY1aNh5BAs3fs4g+8IKeRdEi5rLWz4jNCEfq7bT+DJkMr1b1MLWxp4G7YfzSchUPKuoubJjEz8/qeRjNORfycT541BWjOtGE0clyhqNeWPCcub2tkdalMHBiHgApNXcGeTji88wTxylILFw4c2xvvj6+jJuTA8aPGOQJK36GvO+38362SN5q40rTnY22NZqjVdAAF51ZQi3jxN12shWkdWmy4hx+Ppq6/O4eHsWkZJyF6ljH+YG9Kfm457UCF3Vl7awbEsKDyya47d2PbMHe+LioETp0JBO7wWyadVQqhcWfxL5Z9HkXyHT+WNCV4yjWxNHlMoaNH5jAsvn9sZeWkTGwQjin5EQatKwJ2N9fRnzujMmEpDU7sRIX198fX0Y2sGxnEBkhA2qL5Xwk/WzB+Pp4oBS6UDDTu8RuGkVQ6sXYmyLavISCPtkPvPn65TADRx7UgfD7QCkVH1tHt/vXs/skW/RxtUJOxtbarX2IiDAi7oygdvHo9CaspRq7oPw8fVhmKcjUiRYuLzJWF9ffH3HMaZHgwpZp9DcO0Vs4XDWfbWI8YP70W/IWAa0sjBKl9yYSE78pcG8oy8LRnfG1aEq1soaNGj1BsOmTaLP8zyW/o9QSYEIkCpxH7eOH777FO92jpg++IO4b+czvPdAPvo6vtSb46rf9rDn/ANkdfoz8T0XnYVbGbX69MXDQkPemROcfuQx6uT9RFxUIbXvyQcjm6K78iG18cTnvdY6U3l/A9Vv7NlzngeyOvSf+B4uOvO3slp96OthgSbvDCceV7L48Xpv49O3pk4nU5UOr3tgLRG4c+1qiSNGY1GbBjX1zEabutG6aRUkmrtkZNzVPWo8ubGsnBPKuYf1GLxgNj3sn5qd4bqqSQ6PIFklxb7nB4xsqqsqWHuMYZiHme7H/xyyerzt0/dpsH1E1Q6v42EtQbhzjatZugORCsIIG1QnhxORXLafYO3BmGEeGN2iBVc5vHM727frlB2RJOdqp3ANtwMtFrUboN+UW9O0igTN3Qwy7r6gttaHYM1rY0bRTLcRjdBFIpEgAdTZmWTrm0/8F1F5gQgAKTavDmD21/sJD/2IAc2qIbl7kR8Xj2LotO+5+mTUKJCdcI4bRWBe3ZI7v0YRFaVTTuWAuRRN3h/cyC4CBHISE0lTg0XL9rTRnewF7SjJpT7lLAcYhJCdwDltJbG882vpOkadIgdzpJo8/riRrXs5Zq5NaKhn8VFeozp2UtDcv6d76G9SRH7mFRJORLJv20bWLFvCrgsqNGh4WPiMIfvzIuRwaMk8vr0sofHIT5jeyaaY0Rmhq5BDYuJ11FjSqn2bUnP4oB3kONe1qzzjNnOliX4hqa4Vknv5L6ZzNNwGtX5yXQ2Wrcr2E6VzXYovaxmCxKYzU9auZ/16nbJuFr2qy4yzA12K8sm8ksCJyH1s27iGZUt2cUGlAc1DCstNnKlg5I1p1bp0IxquC1Rp9xoe1hIenv+C8RNWsu/cbZ11pX8PRppWRWNOrU5j+DQsnO8CelPP7CE3fgrEf/UZ7gOgJisrBwHIi13LRD8//HTLhCCisgWggPv3NYBAZmYOAjKq1ahRduqrXI6sgqZa1VlZ5GgrydqJeuroN4GgqGwEoOC+9pc9RYKJqZleQaQKBXIJoD+vxHCEbE5vCWDkW5607dKHd0dP5OMFy1izcQfHbxg5JacXgYzwhSzYnY5py/EsmtBaJ3AYoauQSWaOADI7qtcoU1XkcpmB76BJkEoBBNR6+rkSCBrt+ycyuV69JCammOk7IFWg0ApZYVLqYrgNPvUTu+ovyE8Ur9C4Q2c6d9YpnVpQ0wLj7OARQvZptgSM5C3PtnTp8y6jJ37MgmVr2LjjOBVqys+JxFyJnVVp8Q3XBWROXiwM8qHNK0XcOPIFHw/uTvch01m9/yL/5EPeP0HpFqtMpDY0e28pobO7YiNRcXnHZqIezRBpfUCCbbtRzJozhzlllVk+dLGXAgJFRdoeRVKeBwkCQkV1Co++RmLbjlGz9NTtSZmFTxd73av/Ie4RGzSaMYt2EJ/rRNdhE5m7OJhNYfs4FHeSUK/i2XJ/D3XqNgI+/Znb1u3xXzSWJnrmQA3WVShCK6sEabmyCs+9FQ0AUjPMzSSgyePuM7b40eTlka8BiaUVVV+2aXqDbbCYn5TfoBXnJ3ow2A4A7sUSNHoMi3bEk+vUlWET57I4eBNh+w4RdzIUrxoVZckGIJPpX78zWBcAKQ6dp7J5/27WTB+MZ10TchLDWTvNi/4TtnLxWRkv/0NUglLPQkbN3n3wsADN/TRSM9SAnGr2dkjR8NCmKQNHjGBEWWVYb5rbSgEZNsqqSBD481am3pRNgIfZ2XpHFzKFdumy8MEDPW9fC+TnFZTq6OTV7LVTaA9taDpQT92elGH0bq7vvY8Xj5AZzoZtlyi06sCssJ2smfchw995g/YtXHGqqkClUpX6XUZRmMSGOSs4nluN7jMCGeqsbynYCF1lNiirSkDI5uat0snNWlTczr6rR7dykDvh5CAD9e9cTNGX0/gYNWmXr3FfI+WV2nWoonu4kjHcBp/6SfbNW3rSxbWobuv3k4rBCDtAIDN8A9suFWLVYRZhO9cw78PhvPNGe1q4OlFVoUJlzJScTKFNWih8wAM9v1fIz6PAiNsarstTpNYudB8byFcRB/khyJsWNmoyooJY8G1q5WWGVjAvYSACCgt4UARgjoWlBJDySlM3nGSQf+Yosc+VWizDqZErdlIN907/yim9fUsuMUfP6EmllmCrtEaKwI1r10oHMeFPEs9dL/W59JWmuGkrydHnq+TfQirRDrM0Gs1zj1bVV1O4Wgiy+u1o76QTHNRpXLh4pwICUR6ng2ez7mwhjv3mEfC2k/5RojG6yhxp5GKLVJPP6WOx5OkeB8iN4eiZ0qqWi6wOrZo7ICWPuH0R/KGnEwJAlUzELymoJVVp2fbVsqeyKgnDbVCGYyMXbKUa8k8fI1Z/g5bhJxWFEXaAmqspVylERv127Sltyhe4eEefJUvRuo0Gjab0U7PEVom1FIQb17im6+AI/Jl4juulPn82huuiB2lVGvaZwTKflsh5QNLZ80ZnMr5sVEogUsWvY+biXSRk6Vl6E+4Qt2EbJx+A3NmDto7aLsykWR96uSoQsvbz+Yoj6Es6unfxAAeTnt7TxL0X3Z1kCLfCWbX2pM6ITiDr8HJW7M/SM3I2oX7TxlhJikiP/J7onOJnCGRHr2HTCT1uadKMPr1cUQhZ7P98BUf0V5IDB5MqZtHRzBILBWhyM7mVq+e79GFmjqkEhIxUUkv8BBVpu1cRprv7s8EI3DkaxJyvLyLUG0LgrB7o2ZjiCYbraop77+44SgWywlcTHHunpH5CFlFBK4jQd6NyMaHVO/1wVWi4d3w1s788Q6kZOnUm0UHz+SZFjbxuX97tYqVzwkuAETZo6t6b7o5ShKxwVgfHckfXT6KCWBGhz08qDsPtAMzMTZEgkJGaWjJIqtLYvSqMskzZzNICBRpyM2+h6zYm9ZvS2EpCUXok30dr160eI2RHs2bTCeMCshG65KenkqFnnUvQaAAJllZVKiTl/GWgcn6HOptT36xiz3ef49qyDa2aN8DRSsaDv9JJiY3m6G+3eWhan/emvY/b4xrKX2XkzPc54reBpLBJeF3py6CebXGxN0GVncaFmF+IOJyG+9KudG/y6BpzD8ZN68OR6XtJ2jSeodffZUiPptSQ55J6cj/b9ybh0K0zTpFHySxWPQCrToPpW+cXtlzfy+xRKpKHdqOR8iEZCQfYtjOZ6q2dSY+7rnOVnFdHzuT9I35sSApjktcV+g7qSVsXe0xU2aRdiOGXiMOkuS+l65NK/g1M3WjmqiAyIY4N80NQ9HPFJFeO64BulPXCtUnjLnR0+oatv+8jwNeEa4M9qW16lyvH9xD2cx7OzezISTA+dVvI/IlFATu5rpaiVFxn68zxbNU9CRnO78xj2psOSI3Q1dzDF/9eh5kRnsI3fkNJ8xrCmy2dML13nZP7w9iT5EC3zo5EHs3S/eJyMWk6mjmjj/HB+gvErfKm108deK29GzVt5Kj+/J3zx6KISc1FsHRj9PwPaa0nbbjyMcIGzT3w9e/F4RnhpHzjx9A0L4a82RIn03tcP7mfsD1aP3GMPIphLWoABtuBCY27dMTpm638vi8AX5NrDPasjendKxzfE8bPec40s8tBnymbujXDVRFJQtwG5oco6OdqQq7clQHdGiK36sTgvnX4Zct19s4ehSp5KN0aKXmYkcCBbTtJrt4a5/Q4dD3/2RiqSxF3fglgwHcyXuvZhTaNamKjKCQr+TBhWxNQm7jQf6Bnxb16UsmU0V29WOT1OtKn8ym+P3GZS3EHuFT8L0kkZji0HMBof3+Ge9iWeGSzbjuV0HU2BAZ+SWT8LkLidz09qLCl0eujGNii+GSJFIe3FhKqtmT24h0kHNrIZ4//Q8zMiY5jVhLYNpqRkUeLXfMIy3ZMCZrJ7emf8/OlCNYuiABAYl6H7lNWMUFYzqBSgQiwbsvU0HXYBAbyZWQ8u0LieVpLBbaNXmfUwBYVM6Ujc2bwlNFETgrlXFQIc6IebfHTt+xAhHk7Ji2ewu/Tgzl6djtBZ7cDIFc2Y8gnK+kaN45T+rz3uVBx8osgIm5pZ67vXDrO4Uu65wDI+bPl1CfTIgbrKnWg96JQ1JazWLLrPEc2L+HIZgAJ5rW74hv8f7Q+NAJ9spaPFW0mh7Kh2jI+W/8j51Ki2ZUS/fSwxIzqrb3w/XgaQ5q/xBvyGmyDUhx6LyJUbcmsJbs4f2QzS7QNisS8Nl19g/m/1ocYYXiDGoShdmDebhKLp/zO9OCjnN0ehNaU5SibDeGTlV2JG3dKbyCSOQ9myuhIJoWeIypkDlq3WUrfbg2RY0m7KUHMvD2dz3++RMTaBUQASMyp030KqyYILB9kTCAyVBcJptUcMMvcz97QOPY+OU+CuZMnY2cFMqmN7stK/7tUzl5zjyjKy+BSUjJX03O4LyiwVNagXuNXaeRY5RlOfp+b50+TmJrJPbUJVq/UomFTN+opy+neCzO5cPIMlzPzkFjVool7K1ztTFDFf0qf978pew8t9R2uno7nt/RcsHKicRt3XJRl9fIluX/zPKcTU8m8p8bE6hVqNWyKWz1lxQShYqhzUoiJvcDNAgV2zq3wbFWz9EuJuqiySI47zcXMAhS29WjRruWjVNrKxHBdC26e59TZK2Tdl2Jd0w139wbYPp885aP+i2vnEriYdptclQRzGwfqurXAraZVGetdLycG22DBTc6fOsuVrPtIrWvi5u5OgwppUEMwzA5UWcnEnb5IZoEC23otaNfyOewfNTkpMcReuEmBwg7nVp60KuEAau5cPU38b+nkYoVT4za4uygrbOT+vLqo/7rGuYRk0rLvI7G0pXpNV9ya1MTqBRlhZe01V6mB6GXgmYFIRERE5D9CZQWi8h88REREREREXjBiIBIRERERqVTEQCQiIiIiUqn85wOR1Ko2zdzdad2oBqbl7HAiIiIiIvJi+M8HInnD4QRt3srmgF4U+3cCEREREZF/CLHrFRERERGpVMpM387Pz6dKFe2WjpJHe5qJiIiIiPx7eRwOZsyYweLFi3UPvzDKDEQA3t7exMTE6H4sIiIiIvIvxdLSkjVr1tCxY0fdQy+McgORiIiIiIjIi0ZcIxIRERERqVT+H4QMyqsi42BQAAAAAElFTkSuQmCC" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![hstu_overview.png](attachment:495d54e1-0c6c-4d9e-85eb-39affd6c920b.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the simplest case, \"Sequentialized Unified Features\" input refers to a sequence of user interactions, and the training objective of the architecture may follow the standard \"Shifted Sequence\" approach (paper reports its main results on public datasets using this setup). Meanwhile, other approaches (e.g. Generative Recommender) are also explicitly discussed and provided in the original repository. \n", + "\n", + "According to paper, HSTU consists of a stack of identical layers connected by residual connections. Each layer contains three sub-layers: Pointwise Projection\n", + "(Equation 1), Spatial Aggregation (Equation 2), and Pointwise Transformation (Equation 3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\\begin{equation}\n", + "U(X), V(X), Q(X), K(X) = \\text{Split}(\\phi_1(f_1(X))) \\tag{1}\n", + "\\end{equation}\n", + "\n", + "\\begin{equation}\n", + "A(X)V(X) = \\frac{\\phi_2 \\left( Q(X)K(X)^T + \\text{rab}^{p,t} \\right) V(X)}{N} \\tag{2}\n", + "\\end{equation}\n", + "\n", + "\\begin{equation}\n", + "Y(X) = f_2 \\left( \\text{Norm}(A(X)V(X)) \\odot U(X) \\right) \\tag{3}\n", + "\\end{equation}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "where $ f_{i} $ is a linear mapping, $\\phi$ is the SiLU function, and $\\text{rab}^{p,t} $ is the sum of two attention matrices: relative positional attention and relative time attention. The first important change is the use of elementwise SiLU instead of Softmax. This approach allows for faster learning in a setting where the set of items is constantly changing. Moreover, the denominator of the softmax normalizes attention, capturing all the previous context of user interactions, and this is not always justified. SiLU changes the absolute value of token-to-token attention. The second change is the weighting of the classic self-attention output by the $U(X)$ matrix, which solves the DLRM problem of feature interactions.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "There is an added $\\text{rab}^{p,t} $ (Relative Attention Bias) component added to attention during computation. While position bias utilizes difference in items positions, temporal bias is more complicated. To predict the next item, model uses the actual time of its appearance. This is a simulation of inference with time aware setup, where in addition to the user's history, we would also provide the user query time when preparing recommendations. In this case, the predicted token will be conditioned on that time. In this way, the consistency of the model is maintained between training and testing (or real-world inference). \n", + "Temporal bias utilizes timestamps differences: all possible cross-item differences $a_{i,j}$ are quantized into buckets with logarithmic asymptotics. Each bucket value corresponds to the learnt parameter $w_{i}$ which then forms the matrix $\\text{rab}^{t}$. Quantification of the timestamp difference actually breaks down the user's previous history into time microsessions relative to the query generation moment." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\\begin{equation}\n", + " a_{i,j} = t_{i+1} - t_j\n", + "\\end{equation}\n", + "\n", + "\\begin{equation}\n", + "\\text{bucket}(a_{i,j}) =\n", + "\\left\\lfloor \\frac{\\log(\\max(1, |a_{i,j}|))}{0.301} \\right\\rfloor\n", + "\\end{equation}\n", + "\n", + "\n", + "Timestamps differences are formed the following way:" + ] + }, + { + "attachments": { + "e6422a00-6c6f-43f3-afde-cbb6163ba9e6.jpg": { + "image/jpeg": "/9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAIuAlgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6pooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiig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gzpv/gVH/jWd/wAKl8B/9Cvp3/fB/wAaP+FS+A/+hX07/vg/40f2cv5g9q+xo/8ACR6H/wBBnTf/AAKj/wAaP+Ej0P8A6DOm/wDgVH/jWd/wqXwH/wBCvp3/AHwf8aP+FS+A/wDoV9O/74P+NH9nL+YPa+Ro/wDCR6H/ANBnTf8AwKj/AMaP+Ej0P/oM6b/4FR/41nf8Kl8B/wDQr6d/3wf8aP8AhUvgP/oV9O/74P8AjR/Zy/mD2vkaP/CR6H/0GdN/8Ck/xrk/2f5El0rxbJE6vG/iO8ZWU5DAlcEGtv8A4VL4D/6FfTv++D/jXSeHPD2k+GrF7PQrGGxtWcytHEMAsQAT+QFdGHwyoNtO9yZT5jUooorqICiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/Z" + } + }, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "![time_attention.jpg](attachment:e6422a00-6c6f-43f3-afde-cbb6163ba9e6.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RecTools implementation of HSTU model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**In order to fully reproduce the architecture** that authors of \"Actions...\" used for public benchmarks in table 4 of the paper:\n", + "1) We use \"Shifted Sequence\" training objective\n", + "2) We don't incorporate actions interleaving\n", + "3) Therefore, current RecTools implementation for HSTU is a traditional sequential recommender (like SASRec) which is enhanced with an updated sequential transduction architecture (HSTU).\n", + "4) The important point is that unlike simpler architectures, HSTU is capable of context-aware recommendations (where context is formed by the desired timestamp of recommendations for each user).\n", + "\n", + "What's changed (we reassured that each modification still provided the same quality as the original code):\n", + "1) Jagged tensors logic was removed\n", + "2) Parameters initialization logic was replaced by xavier distribution for consistency with other RecTools models\n", + "3) Left padding istead of right for consistency with other RecTools models\n", + "4) No Q,K caching option" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T14:28:54.541177Z", + "start_time": "2025-07-25T14:28:54.536864Z" + }, + "trusted": true + }, + "outputs": [], + "source": [ + "import os\n", + "import warnings\n", + "import json\n", + "\n", + "import torch\n", + "import pandas as pd\n", + "from lightning_fabric import seed_everything\n", + "from pytorch_lightning import Trainer\n", + "from pytorch_lightning.loggers import CSVLogger\n", + "from pytorch_lightning.callbacks import EarlyStopping, ModelCheckpoint\n", + "from rectools.dataset import Dataset\n", + "from rectools.models import HSTUModel\n", + "from rectools import Columns\n", + "from rectools.model_selection.splitter import Splitter\n", + "from rectools.model_selection import LastNSplitter\n", + "from rectools.metrics import (\n", + " CoveredUsers,\n", + " Serendipity,\n", + " NDCG,\n", + " AvgRecPopularity,\n", + " CatalogCoverage,\n", + " Recall,\n", + " SufficientReco,\n", + ")\n", + "from rectools.models import SASRecModel\n", + "from rectools.model_selection import cross_validate\n", + "from rectools.models.nn.item_net import IdEmbeddingsItemNet\n", + "from rectools.models.nn.transformers.utils import leave_one_out_mask\n", + "\n", + "from utils import RecallCallback, BestModelLoadCallback, get_results\n", + "\n", + "# Enable deterministic behaviour with CUDA >= 10.2\n", + "os.environ[\"CUBLAS_WORKSPACE_CONFIG\"] = \":4096:8\"\n", + "\n", + "warnings.simplefilter(\"ignore\", UserWarning)\n", + "warnings.simplefilter(\"ignore\", FutureWarning)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "RANDOM_STATE=42\n", + "torch.use_deterministic_algorithms(True)\n", + "seed_everything(RANDOM_STATE, workers=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Results on Movielens datasets" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the original repository user interactions were sorted by timestamps without a `stable` sorting option, which means that interactions with the same timestamp could be reordered from their original order. Unfortunately, both ML-1M and ML-20M datasets used in the paper have considerable amount of interactions timestamps collisions. This resulted in multiple consequences:\n", + "1. The leave-one-out test that was used to report metrics could greatly differ from other papers (we found up to 25% difference in targets) => metrics cannot be directly comparable\n", + "2. The order of interactions for each user used for model training could greatly differ from order used in other papers => metrics cannot be directly comparable (again)\n", + "3. The sorting without `stable` option may easily provide different results on different machines => both the original test and training interactions sequences used by authors of \"Actions...\" are unavailable and cannot be reproduced even with the original repository code.\n", + "\n", + "See the reference code:\n", + "https://github.com/meta-recsys/generative-recommenders/blob/88512dbd71b053226bc4ef8ec1630e3db53e55e5/generative_recommenders/research/data/preprocessor.py#L267\n", + "\n", + "**The interesting part about the whole story is that: HSTU metrics recalculated on datasets with stable sorting (which we hope is used more often) are actually higher then those reported by the authors.**\n", + "\n", + "These findings emphasize that direct comparison of metrics reported by different academic papers may be highly misleading." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Results on MovieLens-1M\n", + "| Method | HR@10 | NDCG@10 | HR@50 | NDCG@50 | HR@200 | NDCG@200 |\n", + "|---------------------|--------|---------|--------|---------|--------|----------|\n", + "| HSTU paper | 0.3097 | 0.1720 | 0.5754 | 0.2307 | 0.7716 | 0.2606 |\n", + "| HSTU RecTools (stable sort) | 0.3226 | 0.1880 | 0.5894 | 0.2471 | 0.7856 | 0.2769 |\n", + "| HSTU-large paper | 0.3294 | 0.1893 | 0.5935 | 0.2481 | 0.7839 | 0.2771 |\n", + "| HSTU-large RecTools (stable sort) | 0.3642 | 0.2164 | 0.6194 | 0.2736 | 0.8031 | 0.3015 |\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "#### Results on MovieLens-20M\n", + "| Method | HR@10 | NDCG@10 | HR@50 | NDCG@50 | HR@200 | NDCG@200 |\n", + "|---------------------|--------|---------|--------|---------|--------|----------|\n", + "| HSTU paper | 0.3273 | 0.1895 | 0.5889 | 0.2473 | 0.7952 | 0.2787 |\n", + "| HSTU RecTools (stable sort) | 0.3441 | 0.2066 | 0.6002 | 0.2632 | 0.8008 | 0.2938 |" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Code for reproduction:" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T14:28:56.939027Z", + "start_time": "2025-07-25T14:28:56.934930Z" + } + }, + "outputs": [], + "source": [ + "def get_movielens_df(dataset_name: str = \"ml-1m\") -> pd.DataFrame:\n", + " if dataset_name == \"ml-1m\":\n", + " ratings = pd.read_csv(\n", + " \"ml-1m/ratings.dat\",\n", + " sep=\"::\",\n", + " names=[\"userId\", \"movieId\", \"rating\", \"timestamp\"],\n", + " engine=\"python\",\n", + " )\n", + " elif dataset_name == \"ml-20m\":\n", + " ratings = pd.read_csv(\"ml-20m/ratings.csv\")\n", + " ratings = ratings[ratings[\"rating\"] >= 0]\n", + " ratings.rename(\n", + " columns={\n", + " \"userId\": Columns.User,\n", + " \"movieId\": Columns.Item,\n", + " \"timestamp\": Columns.Datetime,\n", + " },\n", + " inplace=True,\n", + " )\n", + " ratings[Columns.Datetime] = pd.to_datetime(ratings[Columns.Datetime], unit=\"s\")\n", + " ratings[Columns.Weight] = 1\n", + " return ratings" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T14:28:57.317489Z", + "start_time": "2025-07-25T14:28:57.313127Z" + } + }, + "outputs": [], + "source": [ + "# Prepare trainer function for models\n", + "\n", + "# We use callbacks for calculating recall on validation fold, making model checkpoint based on best recall, early stopping and best model load\n", + "# We train for maximum 100 epochs\n", + "# This is the most common academic training setup for sequential models\n", + "\n", + "RECALL_K = 10\n", + "PATIENCE = 5\n", + "DIVERGENCE_TRESHOLD = 0.01\n", + "EPOCHS = 100\n", + "recall_callback = RecallCallback(k=RECALL_K, progress_bar=True)\n", + "# Checkpoints based on best recall\n", + "max_recall_ckpt = ModelCheckpoint(\n", + " monitor=f\"recall@{RECALL_K}\", # or just pass \"val_loss\" here,\n", + " mode=\"max\",\n", + " filename=\"best_recall\",\n", + ")\n", + "early_stopping_recall = EarlyStopping(\n", + " monitor=f\"recall@{RECALL_K}\",\n", + " mode=\"max\",\n", + " patience=PATIENCE,\n", + " divergence_threshold=DIVERGENCE_TRESHOLD,\n", + ")\n", + "best_model_load = BestModelLoadCallback(\"best_recall\")\n", + "callbacks = [recall_callback, max_recall_ckpt, best_model_load]\n", + "\n", + "# Function to get custom trainer\n", + "def get_trainer() -> Trainer:\n", + " return Trainer(\n", + " accelerator=\"gpu\",\n", + " devices=1,\n", + " min_epochs=10,\n", + " max_epochs=EPOCHS,\n", + " deterministic=True,\n", + " enable_model_summary=False,\n", + " enable_progress_bar=True,\n", + " callbacks=callbacks,\n", + " logger = CSVLogger(\"test_logs\"), # We use CSV logging for this guide but there are many other options\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T14:28:57.576665Z", + "start_time": "2025-07-25T14:28:57.574215Z" + } + }, + "outputs": [], + "source": [ + "# This splitter will cut off the last interaction for the test\n", + "loo_splitter = LastNSplitter(n=1, n_splits=1, filter_cold_users = False, filter_cold_items = False)\n", + "\n", + "# `leave_one_out_mask` passed to the model in the configs below will cut off next to last interaction for validation during training\n", + "\n", + "# Both test splitter and validation mask use stable sorting algorithms,\n", + "# As well as RecTools data preparators that generate model training sequences during `fit`" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T14:28:57.900664Z", + "start_time": "2025-07-25T14:28:57.894450Z" + } + }, + "outputs": [], + "source": [ + "# Prepare test metrics\n", + "\n", + "metrics_add = {}\n", + "metrics_recall ={}\n", + "metrics_ndcg = {}\n", + "k_base = 10\n", + "K = [10, 50,100,200]\n", + "K_RECS= max(K)\n", + "for k in K:\n", + " metrics_recall.update({\n", + " f\"recall@{k}\": Recall(k=k),\n", + " })\n", + " metrics_ndcg.update({\n", + " f\"ndcg@{k}\": NDCG(k=k, divide_by_achievable=True),\n", + " })\n", + "metrics_add = {\n", + " f\"arp@{k_base}\": AvgRecPopularity(k=k_base, normalize=True),\n", + " f\"coverage@{k_base}\": CatalogCoverage(k=k_base, normalize=True),\n", + " f\"covered_users@{k_base}\": CoveredUsers(k=k_base),\n", + " f\"sufficient_reco@{k_base}\": SufficientReco(k=k_base),\n", + " f\"serendipity@{k_base}\": Serendipity(k=k_base),\n", + "}\n", + "metrics = metrics_recall | metrics_ndcg | metrics_add\n", + "metrics_to_show = ['recall@10', 'ndcg@10', 'recall@50', 'ndcg@50', 'recall@200', 'ndcg@200', 'coverage@10',\n", + " 'serendipity@10']" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T14:28:58.300971Z", + "start_time": "2025-07-25T14:28:58.297457Z" + } + }, + "outputs": [], + "source": [ + "def evaluate(models: dict, splitter:Splitter,dataset: Dataset, path_to_save_res:str) -> None:\n", + " cv_results = cross_validate(\n", + " dataset=dataset,\n", + " splitter=splitter,\n", + " models=models,\n", + " metrics=metrics,\n", + " k=K_RECS,\n", + " filter_viewed=True,\n", + " )\n", + " cv_results[\"models_log_dir\"] = {}\n", + " for model_name, model in models.items():\n", + " cv_results[\"models_log_dir\"].update({model_name:model.fit_trainer.log_dir})\n", + " with open(path_to_save_res, 'w', encoding='utf-8') as f:\n", + " json.dump(cv_results, f, ensure_ascii=False, indent=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### MovieLens-1M" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%%time\n", + "!wget -q https://files.grouplens.org/datasets/movielens/ml-1m.zip -O ml-1m.zip\n", + "!unzip -o ml-1m.zip\n", + "!rm ml-1m.zip" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T14:29:01.642342Z", + "start_time": "2025-07-25T14:29:01.638310Z" + } + }, + "outputs": [], + "source": [ + "config = {\n", + " \"session_max_len\": 200,\n", + " \"lightning_module_kwargs\": {\"logits_t\": 0.05}, # logits scale factor same as in the original repository\n", + " \"item_net_block_types\": (IdEmbeddingsItemNet,),\n", + " \"get_val_mask_func\": leave_one_out_mask, # validation mask\n", + " \"get_trainer_func\": get_trainer,\n", + " \"verbose\": 1,\n", + " \"loss\": 'sampled_softmax',\n", + " \"n_negatives\": 128,\n", + " \"use_pos_emb\": True,\n", + " \"dropout_rate\": 0.2,\n", + " \"n_factors\": 50, # embedding dim\n", + " \"n_heads\": 1,\n", + " \"n_blocks\": 2,\n", + " \"lr\": 0.001,\n", + " \"batch_size\": 128,\n", + "}\n", + "config_large = config.copy()\n", + "config_large[\"n_blocks\"] = 8\n", + "config_large[\"n_heads\"] = 2" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T14:29:05.813236Z", + "start_time": "2025-07-25T14:29:01.676257Z" + } + }, + "outputs": [], + "source": [ + "dataset_name = \"ml-1m\"\n", + "pivot_name = f\"pivot_results_{dataset_name}.json\"\n", + "ml_df = get_movielens_df(dataset_name)\n", + "dataset = Dataset.construct(ml_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "hstu = HSTUModel(\n", + " relative_time_attention=True,\n", + " relative_pos_attention=True,\n", + " **config\n", + ")\n", + "hstu_large = HSTUModel(\n", + " relative_time_attention=True,\n", + " relative_pos_attention=True,\n", + " **config_large\n", + ")\n", + "models = {\n", + " \"hstu\": hstu,\n", + " \"hstu_large\": hstu_large,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "evaluate(models,loo_splitter,dataset,pivot_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-22T18:59:56.958732Z", + "start_time": "2025-07-22T18:59:56.812389Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1cAAAIjCAYAAADvBuGTAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAm0FJREFUeJzs3Xd4lFX+/vH3zCSZ9EZ6gITQO0hTiqCiYMG1oOLqUrbY9SdY1vIVQVTEsuJaV13Fta8NFVlUUBQVEVF6ryFAKullJjPz/P54yEAIJYEJaffruuaamWeeOXMmCWHunHM+x2IYhoGIiIiIiIicFGtDd0BERERERKQ5ULgSERERERHxAYUrERERERERH1C4EhERERER8QGFKxERERERER9QuBIREREREfEBhSsREREREREfULgSERERERHxAYUrERERERERH1C4EpFmaefOnVgsFubMmeM9Nm3aNCwWS62eb7FYmDZtmk/7NGLECEaMGOHTNluiiRMnEhoaekpeKzU1lYkTJ56S1/Klw39+58yZg8ViYefOnQ3Wp/rQVL8/R1KX308i0ngpXIlIg7v44osJDg6muLj4qOdcc801BAQEkJeXdwp7Vnfr169n2rRpze5D7KlWVlbGtGnTWLx4cUN3pcVxuVyUlZXV6twXX3yRK664grZt22KxWI4ZdAoKCrjuuuuIjY0lJCSEs846i99++81HvRYRaRwUrkSkwV1zzTWUl5fzySefHPHxsrIyPv30U0aPHk2rVq1O+HX+7//+j/Ly8hN+fm2sX7+e6dOnHzFcffXVV3z11Vf1+vrNRVlZGdOnT1e4OkX27NnDHXfcQYcOHQgICCAkJITo6GiuuuqqY34PZs2axTfffEP37t3x8/M76nkej4cLL7yQd955h1tuuYXHH3+c7OxsRowYwZYtW+rhHTU9p+L3k4jUv6P/JhQROUUuvvhiwsLCeOeddxg/fnyNxz/99FNKS0u55pprTup1/Pz8jvkBsL4FBAQ02GvLqeVyufB4PE3iez5nzhxuuukmkpOTufrqq+nTpw92u5309HTmzZvHOeecw4QJE/jXv/6Fv79/ted+99133lGrY03V/PDDD/npp5/44IMPGDt2LABXXnklnTp14sEHH+Sdd96p1/fYFDT07ycR8Q2NXIlIgwsKCuKyyy5j0aJFZGdn13j8nXfeISwsjIsvvpj9+/dz55130rNnT0JDQwkPD+f8889n1apVx32dI61pcDgcTJ48mdjYWO9rZGRk1Hjurl27uOmmm+jcuTNBQUG0atWKK664otoI1Zw5c7jiiisAOOuss7BYLFgsFu9f/o+05io7O5u//OUvxMfHExgYSO/evXnjjTeqnVO1fuzJJ5/k5Zdfpn379tjtdgYMGMDy5cuP+74rKyuZPn06HTt2JDAwkFatWjF06FC+/vpr7zlV65jS09O56KKLCA0NJTk5meeffx6ANWvWcPbZZxMSEkJKSsoRPwxv376dK664gujoaIKDgzn99NP54osvapx3vPe8c+dOYmNjAZg+fbr363j4Grg9e/ZwySWXEBoaSmxsLHfeeSdut7vaOR6Ph9mzZ9O9e3cCAwOJj4/n+uuvJz8/v9p5hmHw8MMP07p1a4KDgznrrLNYt27dcb+2Vf2t+v7Mnj3b+/1Zv349ABs3bmTs2LFER0cTGBhI//79+eyzz2q0U1BQwOTJk0lNTcVut9O6dWvGjx9Pbm4uAE6nk6lTp9KvXz8iIiIICQlh2LBhfPvtt7Xq55G8+uqr/OUvf2HatGls3LiRGTNmcPnll3PRRRdx0003MX/+fH788Ue++eabI/7hIyUlpVbrhD788EPi4+O57LLLvMdiY2O58sor+fTTT3E4HMd8fm2+P9u3b8disfD000/XeP5PP/2ExWLh3XffBQ7+Lti6dSsTJ04kMjKSiIgIJk2aVGNK5Ouvv87ZZ59NXFwcdrudbt268eKLL9Z4jdTUVC666CIWL15M//79CQoKomfPnt5//x9//DE9e/YkMDCQfv368fvvv1d7/tHWXL311lsMHDiQ4OBgoqKiOPPMMzUCLtKIKVyJSKNwzTXX4HK5+O9//1vt+P79+/nyyy+59NJLCQoKYvv27cydO5eLLrqIf/zjH9x1112sWbOG4cOHs3fv3jq/7l//+ldmz57Neeedx2OPPYa/vz8XXnhhjfOWL1/OTz/9xLhx4/jnP//JDTfcwKJFixgxYoT3w9iZZ57JbbfdBsB9993Hm2++yZtvvknXrl2P+Nrl5eWMGDGCN998k2uuuYYnnniCiIgIJk6cyDPPPFPj/HfeeYcnnniC66+/nocffpidO3dy2WWXUVlZecz3OG3aNKZPn85ZZ53Fc889x/3330/btm1rrHdxu92cf/75tGnThscff5zU1FRuueUW5syZw+jRo+nfvz+zZs0iLCyM8ePHs2PHDu9zs7KyGDx4MF9++SU33XQTjzzyCBUVFVx88cXVpnvW5j3HxsZ6P7xeeuml3q/joR/M3W43o0aNolWrVjz55JMMHz6cp556ipdffrnae7r++uu56667GDJkCM888wyTJk3i7bffZtSoUdW+blOnTuWBBx6gd+/ePPHEE6SlpXHeeedRWlp6zK/toV5//XWeffZZrrvuOp566imio6NZt24dp59+Ohs2bOCee+7hqaeeIiQkhEsuuaTa16WkpIRhw4bx7LPPct555/HMM89www03sHHjRm/YLyoq4tVXX2XEiBHMmjWLadOmkZOTw6hRo1i5cmWt+1ll69at3HLLLfz73//m7rvvxmazefvi8XgAKCwspG/fvnz//fcsXLiQ999/v86vA/D7779z2mmnYbVW/9gxcOBAysrK2Lx58zGfX5vvT1paGkOGDOHtt9+u8fy3336bsLAw/vCHP1Q7fuWVV1JcXMzMmTO58sormTNnDtOnT692zosvvkhKSgr33XcfTz31FG3atOGmm27y/uHhUFu3buWPf/wjY8aMYebMmeTn5zNmzBjefvttJk+ezLXXXsv06dPZtm0bV155pffrfDTTp0/nT3/6E/7+/jz00ENMnz6dNm3a8M033xzzeSLSgAwRkUbA5XIZiYmJxhlnnFHt+EsvvWQAxpdffmkYhmFUVFQYbre72jk7duww7Ha78dBDD1U7Bhivv/6699iDDz5oHPprb+XKlQZg3HTTTdXa++Mf/2gAxoMPPug9VlZWVqPPS5cuNQDjP//5j/fYBx98YADGt99+W+P84cOHG8OHD/fenz17tgEYb731lveY0+k0zjjjDCM0NNQoKiqq9l5atWpl7N+/33vup59+agDG559/XuO1DtW7d2/jwgsvPOY5EyZMMADj0Ucf9R7Lz883goKCDIvFYrz33nve4xs3bqzx9bn99tsNwFiyZIn3WHFxsdGuXTsjNTXV+z2r7XvOycmp8RqH9/XQ77dhGEbfvn2Nfv36ee8vWbLEAIy333672nkLFiyodjw7O9sICAgwLrzwQsPj8XjPu++++wzAmDBhwjG/dlXfn/DwcCM7O7vaY+ecc47Rs2dPo6KiwnvM4/EYgwcPNjp27Og9NnXqVAMwPv74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f/45DoeDzz77rNqo1MlUaKyt9u3b4/F4WL9+PX369Kn31xMR39C0QBFpVKpGqaZOncrKlStr7G1ls9lq/LX3gw8+8K5dqYvzzz8fgH/+85/Vjs+ePbvGuUd63WeffbZG6e+QkBCAGqHrSC644AIyMzOrVWBzuVw8++yzhIaGMnz48Nq8jePKy8urdj80NJQOHToct/x1XVxwwQX88ssvLF261HustLSUl19+mdTUVO/Uptq+56oP8LX5Oh7NlVdeidvtZsaMGTUec7lc3rZHjhyJv78/zz77bLXv8ZF+DuoiLi6OESNG8K9//euIozY5OTne25dffjmrVq064kbaVX2qGv04tI/Lli2r9jWvrbS0NFwulzfQDRgwgISEBMaPH8+6detYv34948ePx+PxkJGRwf/93/8xe/ZsZs6cWefXAhg7dixZWVl8/PHH3mO5ubl88MEHjBkz5ojrsarU9fvj5+fH1VdfzX//+1/mzJlDz5496dWr1wn1+0hf88LCQl5//fUTaq8uLrnkEqxWKw899FCNETKNeIk0Xhq5EpFGpV27dgwePJhPP/0UoEa4uuiii3jooYeYNGkSgwcPZs2aNbz99tvV/qJdW3369OHqq6/mhRdeoLCwkMGDB7No0SK2bt1a49yLLrqIN998k4iICLp168bSpUtZuHAhrVq1qtGmzWZj1qxZFBYWYrfbvXvkHO66667jX//6FxMnTmTFihWkpqby4Ycf8uOPPzJ79mzCwsLq/J6OpFu3bowYMYJ+/foRHR3Nr7/+yocffsgtt9zik/YB7rnnHt59913OP/98brvtNqKjo3njjTfYsWMHH330kXe0orbvOSgoiG7duvH+++/TqVMnoqOj6dGjR63WJVUZPnw4119/PTNnzmTlypWcd955+Pv7s2XLFj744AOeeeYZxo4d690ja+bMmVx00UVccMEF/P777/zvf/+r82jo4Z5//nmGDh1Kz549+dvf/kZaWhpZWVksXbqUjIwM7/5sd911Fx9++CFXXHEFf/7zn+nXrx/79+/ns88+46WXXqJ3795cdNFFfPzxx1x66aVceOGF7Nixg5deeolu3bpRUlJSp35V7RX16quvMnv2bIKCgnjttde48sorvV/jq6++miFDhvDAAw/QtWtX5s+fX61gCZgjO1XvobKyktWrV/Pwww8D5ubgVaFm7Nix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gAE899xzAN6y4LfeemutCxqcdtppXHjhhd4pYBMnTqSgoIC5c+fWuT+aFug7W7duPepjycnJBAUFncLe1I2+zyItiGHAhs/gy/vNQHU4/+CD658SesGQ22qWOxcRkWaprtMCG3Tkyul0smLFCu69917vMavVysiRI1m6dOlxn28YBt988w2bNm1i1qxZ1R5bvHgxcXFxREVFcfbZZ/Pwww97izMczuFw4HA4APMLKL7RoUOHhu6CiMix5WyG/90N278170e0hYF/hah2B4pKtDUr5GmESkREaqFBw1Vubi5ut5v4+Phqx+Pj49m4ceNRn1dYWEhycjIOhwObzcYLL7zAueee63189OjRXHbZZbRr145t27Zx3333cf7557N06dJqFeSqzJw5k+nTp9ep76oD0rzp+yvSzDmK4bvH4ecXwOMCmx2G3g5DbjcLToiIiJyABl9zdSLCwsJYuXIlJSUlLFq0iClTppCWluYt2z1u3DjvuT179qRXr160b9+exYsXc84559Ro795772XKlCmAOXKVlJR01Nf29/cHoKysrFFPa5OT43Q6AY4YxkWkgZXthx3fmRvu2uzmZrZV136B5m2b/9FHm/J3wbePQPE+836n82H0TIhud+reg4iINEsNGq5iYmKw2WxkZVVfMJyVlUVCQsJRn2e1Wr1Tzvr06cOGDRuYOXPmUfdESktLIyYmhq1btx4xXNntdm/Bi+N9mLbZbERGRpKdnQ1AcHCwd7NaaR48Hg85OTkEBwfj59ck//4g0ry4HJD+szl1b9u3sG8V4IPR5ah2ZmGKTqOOf66IiEgtNOgnx4CAAPr168eiRYu45JJLAPOD7aJFi7jllltq3Y7H4/GumTqSjIwM8vLySExMPNkuA3iDX1XAkubHarXStm1bBWeRhmAY5ga8W76Cbd/Arp/AVV79nLhuEN8d3JVmWXSX48B1xYHblUdv3+oH3S+BM24BfxWsERER32nwP8tPmTKFCRMm0L9/fwYOHMjs2bMpLS1l0qRJAIwfP57k5GRmzpwJmOuj+vfvT/v27XE4HMyfP58333yTF198ETCreEyfPp3LL7+chIQEtm3bxt13302HDh2qlWo/GRaLhcTEROLi4qisPMZ/4NJkBQQEYLU2im3gRFoGZxnsXGIGqi1fQUF69cdD4yHtLGh/FqSNgLCjz24QERFpKA0e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vmlTREREROQo6jxylZ6ezsiRI4/6+DnnnENGRsZJdUpalnd+Sae80k2XhDDO6hznu4Z/edm87v9nsPn7rl0RERERkSOoc7jq3r07//73v4/6+GuvvUa3bt1OqlPScjhdHt74aScAfx2W5pvpgAB7V0LGL2D1h9Mm+KZNEREREZFjqPO0wKeeeoqLLrqIBQsWMHLkSOLj4wHIyspi0aJFbN++nS+++MLnHZXmaf6afWQVOYgNszOmd6LvGl7+innd7Q8QFu+7dkVEREREjqLO4WrEiBGsXbuWF198kZ9//pnMzEwAEhISOP/887nhhhtITU31dT+lGTIMg1d/2A7AhDNSsPvZfNNw2X5Y86F5e+B1vmlTREREROQ46hyuAFJTU5k1a5av+yItzLId+1m7p4hAfyt/HJTiu4Z/fwtcFZDQE9oM9F27IiIiIiLHcNKbCIucqFeX7ADg8tNaEx3iowqBHjcsf9W8PfA68NUaLhERERGR4/B5uFq1ahU2m4+md0mztT2nhEUbswD489B2vmt460Io2AWBkdBjrO/aFRERERE5jnoZuTIMoz6alWbk9R93Yhhwdpc42seG+q7hqvLrfa/VpsEiIiIickrVec3VZZdddszHCwsLfVdOW5qlgjInH64w90L7qy9HrfK2mSNXWGDAX3zXroiIiIhILdQ5XH3++eece+653hLsh3O73SfdKWneqjYN7poYzhntW/mu4eUH9l/reC5Ep/muXRERERGRWqhzuOratSuXX345f/nLkUcGVq5cybx58066Y9I8Vds0eGg7341yOkvNKoGg8usiIiIi0iDqvOaqX79+/Pbbb0d93G6307Zt25PqlDRfX6zZS1aRg7gwO2N6J/mu4TUfgKMQotpB+3N8166IiIiISC3VeeTqpZdeOubUv65du7Jjx46T6pQ0T4ZheMuvTxicSoCfj+qpGAb88op5e8BfwaodBkRERETk1KtzuLLb7fXRD2kBft6+n3V7D2waPNCHo5vpP0PWWvALgr7X+K5dEREREZE6qHO4OlRpaSk//vgj+fn5dOjQgX79+vmqX9IM/fuH7QCM7deaKF9tGgwHy6/3ugKConzXroiIiIhIHZxwuPrHP/7BI488Qo8ePUhISGDlypW0bt2aTz75hPDwcF/2UZqB7KIKvtmYDcCkIT4sv16SDRs+M28P+Jvv2hURERERqaMTWpxy//33884777B06VK+++473n//fTZu3Ejv3r2ZPHkyAHv37vVpR6Vp+3z1PjwGnNY20rebBq/9CDwuSO4Pib18166IiIiISB3VOVz9/PPPvPrqqyxYsICcnBy+//57vv/+e5YsWcJZZ53F+++/j8vlYtSoUXz33Xf10Wdpgj5buQeAP/RJ9m3Daz4wr3td6dt2RURERETq6ISqBd5yyy3ExMTwxz/+kcWLFxMQEEBAQACFhYX069ePgoICJk+ezIwZMxg+fHh99FuakB25pazKKMRmtXBhr0TfNZy3DfasAIsNul/mu3ZFRERERE5AnUeufvrpJ845x9xHaNCgQUyYMIH8/Hz279/PM888Q1JSEjExMVx22WUsWbIEh8Ph805L0/LpgVGroR1iiAn1YbXJqlGr9mdBaKzv2hUREREROQF1Dlf79+8nMjISgNdff51bb70Vf39/AG666Sbmz59Pbm4ukZGRWCwWcnJyfNphaVoMw+Czleb6uz/08eGmwYZxMFz1vMJ37YqIiIiInKA6h6u4uDjS09MBiIqK4qeffvI+tnz5cgDCwsIoKirC6XQSHR3to65KU7R2TxHbc0sJ9LdyXvcE3zW893fI22rubdXlQt+1KyIiIiJyguq85mrEiBF8+umnjB49moceeog//vGPzJ07l5CQEL766isefPBB7HY7c+fOpU+fPgQHB9dHv6WJmHtgSuDIrvGE2k9qW7XqqkatOp8P9jDftSsiIiIicoLq/Gn3lltu4fTTT+fOO+/k0ksvZe3atXz11Vc4nU7uu+8++vXrR3l5OTNmzODuu++ujz5LE+H2GHy+qmpKoA+rBHrcZgl2UJVAEREREWk06hyuunXrxn333cf555/P3Llz6datGzfeeKP38YKCAsaNG0eHDh0YP368TzsrTcuy7XlkFzuICPJneCcfFpzY8T2UZEFQFLQ/x3ftioiIiIichBOap3XPPfcQFhbGmWeeydlnn83gwYMJCgpi9erVfPDBB1x55ZU8/fTTvu6rNDFVUwIv6JlIgN8J7Vd9ZGs+NK+7XQJ+Ab5rV0RERETkJJzwIpibb76ZcePG8cknn7BmzRpcLhcdOnRg6dKltG/f3pd9lCaootLN/9ZmAj6uElhZARs+M29rSqCIiIiINCInNZzQqlUr/vrXv/LMM8/w/PPPM3ny5BMK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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recall@10ndcg@10recall@50ndcg@50recall@200ndcg@200coverage@10serendipity@10
model
hstu0.3226820.1879150.5894040.2470560.7857620.2768610.6503780.002877
hstu_large0.3642380.2164330.6193710.2735450.8031460.3014660.6846650.003299
\n", + "
" + ], + "text/plain": [ + " recall@10 ndcg@10 recall@50 ndcg@50 recall@200 ndcg@200 \\\n", + "model \n", + "hstu 0.322682 0.187915 0.589404 0.247056 0.785762 0.276861 \n", + "hstu_large 0.364238 0.216433 0.619371 0.273545 0.803146 0.301466 \n", + "\n", + " coverage@10 serendipity@10 \n", + "model \n", + "hstu 0.650378 0.002877 \n", + "hstu_large 0.684665 0.003299 " + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pivot_table = get_results(pivot_name,metrics_to_show, show_loss=False)\n", + "pivot_table" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### MovieLens-20M" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-23T11:18:13.987157Z", + "start_time": "2025-07-23T11:17:59.391632Z" + }, + "trusted": true + }, + "outputs": [], + "source": [ + "%%time\n", + "!wget -q https://files.grouplens.org/datasets/movielens/ml-20m.zip -O ml-20m.zip\n", + "!unzip -o ml-20m.zip\n", + "!rm ml-20m.zip" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-23T11:18:51.085515Z", + "start_time": "2025-07-23T11:18:51.082625Z" + } + }, + "outputs": [], + "source": [ + "config_ml_20m = config.copy()\n", + "config_ml_20m[\"n_factors\"] = 256\n", + "config_ml_20m[\"n_heads\"] = 4\n", + "config_ml_20m[\"n_blocks\"] = 4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-23T11:18:53.380358Z", + "start_time": "2025-07-23T11:18:53.342478Z" + }, + "scrolled": true, + "trusted": true + }, + "outputs": [], + "source": [ + "hstu = HSTUModel(\n", + " relative_time_attention=True,\n", + " relative_pos_attention=True,\n", + " **config_ml_20m\n", + ")\n", + "models = {\n", + " \"hstu\": hstu,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T08:48:04.371118Z", + "start_time": "2025-07-25T08:48:04.366826Z" + }, + "trusted": true + }, + "outputs": [], + "source": [ + "seed_everything(RANDOM_STATE, workers=True)\n", + "dataset_name = \"ml-20m\"\n", + "pivot_name = f\"pivot_results_{dataset_name}.json\"\n", + "ml_df = get_movielens_df(dataset_name)\n", + "dataset = Dataset.construct(ml_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "evaluate(models,loo_splitter,dataset,pivot_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T08:48:06.708544Z", + "start_time": "2025-07-25T08:48:06.579832Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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0UcfVatWrWqMd3E6nbriiivUsmVLPf/880pKStLEiRP15ptv6vLLL1dqaqqmTZumkJAQjRkzRjt37nQ/NjMzU/3799enn36qCRMm6JlnnlFJSYmuvvrqat09a3PNzZo1c394vfbaa92v47EfzJ1Op4YOHaqoqCj99a9/1aBBg/TCCy/oH//4R7VruuOOO/TAAw9owIABevnllzV+/HjNmzdPQ4cOrfa6TZ48WY899ph69Oihv/zlL2rTpo0uu+wyORyOU762x3rjjTc0Y8YM3X777XrhhRcUGRmp9evX6/zzz9fGjRv10EMP6YUXXpDdbtc111xT7XUpLCzUhRdeqBkzZuiyyy7Tyy+/rDvvvFObNm1yh/2CggL985//1ODBgzVt2jQ9/vjjys7O1tChQ5Wenl7rOqts27ZNEydO1L/+9S89+OCDslgs7lpcLpckKT8/Xz179tS3336rL774Qu+9916dn0eSVq9erV69eslsrv6xo0+fPioqKtKWLVtO+fjavD9t2rTRgAEDNG/evBqPnzdvnkJCQvSb3/ym2vYRI0boyJEjmjp1qkaMGKE333xTTzzxRLVjZs2apcTERD3yyCN64YUX1LJlS02YMMH9Hw/H2rZtm26++WYNHz5cU6dO1eHDhzV8+HDNmzdP9913n2655RY98cQT2r59u0aMGOF+nU/miSee0K233ip/f389+eSTeuKJJ9SyZUt9+eWXp3wcAC8yAMAHVFRUGM2bNzf69etXbfvs2bMNScann35qGIZhlJSUGE6ns9oxO3fuNGw2m/Hkk09W2ybJeOONN9zbpkyZYhz7ay89Pd2QZEyYMKHa+W6++WZDkjFlyhT3tqKioho1L1261JBk/Pvf/3Zvmz9/viHJ+Oqrr2ocP2jQIGPQoEHun6dPn25IMubOneveVlZWZvTr188IDg42CgoKql1LVFSUkZub6z72o48+MiQZH3/8cY3nOlaPHj2MYcOGnfKYsWPHGpKMZ5991r3t8OHDRmBgoGEymYx3333XvX3Tpk01Xp97773XkGR899137m1HjhwxWrdubSQlJbnfs9pec3Z2do3nOL7WY99vwzCMnj17GikpKe6fv/vuO0OSMW/evGrHLVmypNr2rKwsw2q1GsOGDTNcLpf7uEceecSQZIwdO/aUr13V+xMaGmpkZWVV23fJJZcY3bp1M0pKStzbXC6X0b9/f6N9+/bubZMnTzYkGQsWLKhx/qqaKioqjNLS0mr7Dh8+bMTGxhq//e1vq20//rV74403DEnGzp073dvGjRtnXHPNNe6fN23aZKSkpLiv5fnnnzcGDRrk/jv08ssvG/379z/p62C320/6Wtnt9ho1GoZh/O9//zMkGUuWLDnpeevy/rz66quGJGPjxo3ubWVlZUZ0dHS146p+Fxxf07XXXmtERUVV23aiv/tDhw412rRpU21bYmKiIcn48ccf3ds+/fRTQ5IRGBho7N69u0adx/6eOP7309atWw2z2Wxce+21NX7nHfs6APAttFwB8AkWi0WjRo3S0qVLq3W1e/vttxUbG6tLLrlEkmSz2dz/++10OnXo0CEFBwerQ4cOdZ55bPHixZLkbm2qcu+999Y4NjAw0P3n8vJyHTp0SO3atVN4ePgZz3i2ePFixcXF6aabbnJv8/f31z333KPCwkJ988031Y4fOXKkIiIi3D9feOGFkiq7Q51KeHi41q9fX6uJA373u99Ve1yHDh1kt9s1YsQI9/YOHTooPDy82vMuXrxYffr00QUXXODeFhwcrNtvv127du1yd5Gr6zWfyp133lnt5wsvvLBaTfPnz1dYWJguvfRS5eTkuL9SUlIUHBzs7k73xRdfqKysTHfffXe1blknug9O5frrr3d3Z5QqW12//PJLd+tI1fMfOnRIQ4cO1datW7V//35J0n//+1/16NFD1157bY3zVtVksVjcY7hcLpdyc3NVUVGh1NTUOt+DTqdTH374ofved7lcGjVqlEpLSzV37lzNnDlTb775ZrVup9dcc42WLVumkpKSOj2XVNliabPZamwPCAhw7z+Zurw/I0aMUEBAQLXWq08//VQ5OTm65ZZbahx/onvo0KFDKigocG879u9+fn6+cnJyNGjQIO3YsUP5+fnVHt+5c2f169fP/XPfvn0lSRdffLFatWpVY/up/u5++OGHcrlcmjx5co0WP6ZsB3wX4QqAz6iasKJqPM++ffv03XffadSoUe4uSy6XSy+99JLat28vm82m6OhoNWvWTGvXrq3xQed0du/eLbPZrLZt21bb3qFDhxrHFhcXa/LkyWrZsmW1583Ly6vz8x77/O3bt6/xwamqG+Hu3burbT/2w5kkd9A6fvzQ8Z588knl5eXpvPPOU7du3fTAAw9o7dq1NY4LCAioFg4kKSwsTC1atKjxYS4sLKza8+7evfuEr9vx11LXaz6ZE9UaERFRraatW7cqPz9fMTExatasWbWvwsJC9/i+quds3759tfM1a9asWpg9ndatW1f7edu2bTIMQ4899liN558yZYokuWvYvn27unbtetrneOutt9S9e3f32LlmzZrpf//7X53vwW3btunIkSMaOHCgJOnnn3/WmjVrtGjRIo0ePVq33HKLFi1aVC30xMbGyul0Kjc3t07PJVUGlBONq6oKascGmOPV5f0JDw/X8OHDq40JnDdvnhISEnTxxRfXOHdt/k798MMPGjJkiOx2u8LDw9WsWTM98sgjklTjdT/+fGFhYZKkli1bnnD7qf7ubt++XWazWZ07dz7pMQB8D9PSAPAZKSkp6tixo9555x098sgjeuedd2QYRrVZAp999lk99thj+u1vf6unnnpKkZGRMpvNuvfee087fuFs3H333XrjjTd07733ql+/fgoLC5PJZNKoUaPq9XmPVRUwj2cYxikfN3DgQG3fvl0fffSRPvvsM/3zn//USy+9pNmzZ1drqTrZ+c/0eevTyWo6lsvlUkxMzAnH4EiqEc7O1vEBoeq++NOf/qShQ4ee8DHt2rWr9fnnzp2rcePG6ZprrtEDDzygmJgYWSwWTZ06Vdu3b69TrYcOHXI/Xvp1EpHExET3Ma1bt1Z0dLT7571798psNis8PLxOzyVJzZs318GDB2tsr9oWHx9f53OezJgxYzR//nz9+OOP6tatmxYuXKgJEybUCPTS6e/t7du365JLLlHHjh314osvqmXLlrJarVq8eLFeeumlGn/3G9PfIQD1g3AFwKeMHj1ajz32mNauXau3335b7du3V+/evd3733//fV100UX617/+Ve1xeXl51T4I1kZiYqJcLpe2b99erdVl8+bNNY59//33NXbsWL3wwgvubSUlJcrLy6t2XF266yQmJmrt2rVyuVzVPvht2rTJvd9TIiMjNX78eI0fP16FhYUaOHCgHn/88Wrh6mwkJiae8HU7/lpqe82e6PbUtm1bffHFFxowYMApW0aqnnPr1q1q06aNe3t2dvZpWwVPpepc/v7+GjJkyGlrXbdu3SmPef/999WmTRstWLCg2utT1QpWF6GhodW6vsXFxenQoUPKy8tzh6e8vLxqrVSvvfaa+vfvr6CgoDo/X3Jysr777rsa7/uyZcsUFBSk884776SPrev7c/nll6tZs2aaN2+e+vbtq6KiIt166611rlmSPv74Y5WWlmrhwoXVWqXOZobG2mrbtq1cLpc2bNig5OTken8+AJ5Bt0AAPqWqlWry5MlKT0+vsbaVxWKp8b+98+fPd49dqYsrrrhCkvS3v/2t2vbp06fXOPZEzztjxowaU3/b7XZJqhG6TuTKK69URkZGtRnYKioqNGPGDAUHB2vQoEG1uYzTOnToULWfg4OD1a5du9NOf10XV155pZYvX66lS5e6tzkcDv3jH/9QUlKSu2tTba+56gN8bV7HkxkxYoScTqeeeuqpGvsqKirc5x4yZIj8/f01Y8aMau/xie6DuoiJidHgwYP16quvnrDVJjs72/3n66+/XmvWrDnhQtpVNVW1fhxb47Jly6q95rXVpk0bVVRUuANd7969FRcXpzFjxmj9+vXasGGDxowZI5fLpX379un//u//NH36dE2dOrXOzyVJN9xwgzIzM7VgwQL3tpycHM2fP1/Dhw8/4XisKnV9f/z8/HTTTTfpP//5j958801169ZN3bt3P6O6T/Sa5+fn64033jij89XFNddcI7PZrCeffLJGCxktXoDvouUKgE9p3bq1+vfvr48++kiSaoSrq666Sk8++aTGjx+v/v3765dfftG8efOq/Y92bSUnJ+umm27S3//+d+Xn56t///5KS0vTtm3bahx71VVXac6cOQoLC1Pnzp21dOlSffHFF4qKiqpxTovFomnTpik/P182m829Rs7xbr/9dr366qsaN26cVq5cqaSkJL3//vv64YcfNH36dIWEhNT5mk6kc+fOGjx4sFJSUhQZGamff/5Z77//viZOnOiR80vSQw89pHfeeUdXXHGF7rnnHkVGRuqtt97Szp079d///tfdWlHbaw4MDFTnzp313nvv6bzzzlNkZKS6du1aq3FJVQYNGqQ77rhDU6dOVXp6ui677DL5+/tr69atmj9/vl5++WXdcMMN7jWypk6dqquuukpXXnmlVq9erU8++aTOraHHmzlzpi644AJ169ZNv//979WmTRtlZmZq6dKl2rdvn3t9tgceeEDvv/++brzxRv32t79VSkqKcnNztXDhQs2ePVs9evTQVVddpQULFujaa6/VsGHDtHPnTs2ePVudO3dWYWFhneqqWivqn//8p6ZPn67AwEC9/vrrGjFihPs1vummmzRgwAA99thj6tSpkxYvXlxtwhKpsmWn6hrKy8u1du1aPf3005IqFwevCjU33HCDzj//fI0fP14bNmxQdHS0/v73v8vpdNaY+vx4Z/L+jBkzRn/729/01Vdfadq0aXV6bY512WWXyWq1avjw4brjjjtUWFio1157TTExMScMzJ7Url07Pfroo3rqqad04YUX6rrrrpPNZtOKFSsUHx9/xkEXQD3zxhSFAHAqM2fONCQZffr0qbGvpKTEuP/++43mzZsbgYGBxoABA4ylS5fWmOa8NlOxG4ZhFBcXG/fcc48RFRVl2O12Y/jw4cbevXtrTGV9+PBhY/z48UZ0dLQRHBxsDB061Ni0aZORmJhYY/rp1157zWjTpo1hsViqTbd8fI2GYRiZmZnu81qtVqNbt27Vaj72Wv7yl7/UeD2Or/NEnn76aaNPnz5GeHi4ERgYaHTs2NF45plnjLKyMvcxY8eONex2e43HDho0yOjSpUuN7YmJiTWmd9++fbtxww03GOHh4UZAQIDRp08fY9GiRTUeW5trNgzD+PHHH42UlBTDarVWu86T1Xqi99cwDOMf//iHkZKSYgQGBhohISFGt27djAcffNA4cOCA+xin02k88cQT7vtq8ODBxrp16074/h7vVO9P1esyZswYIy4uzvD39zcSEhKMq666ynj//ferHXfo0CFj4sSJRkJCgmG1Wo0WLVoYY8eONXJycgzDqJx++9lnnzUSExMNm81m9OzZ01i0aJExduxYIzExsdq5jr8vTjQV+1dffWVYrVZj2bJl7m0FBQXGd999Z2zZssUwDMNYs2aNsX379pNee9W0+Cf6Ov49zc3NNW677TYjKirKCAoKMgYNGmSsWLHipOc+1pm8P126dDHMZrOxb9++Gvuq7pXs7Oxq20/0Oi1cuNDo3r27ERAQYCQlJRnTpk0zXn/99RrHnejvhGFUvhd33XVXtW0numdOdv++/vrrRs+ePQ2bzWZEREQYgwYNMj7//PMTXjMA7zMZBm3LAACci+666y69//77+uCDD9S/f/8THvPdd9+pbdu2Hp10oiH07NlTkZGRSktL83YpAM4hjLkCAOAc9fLLL2v48OG68MILdcstt+jjjz/Wtm3btHPnTi1atEijRo3SRRdddMKxYL7s559/Vnp6usaMGePt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lQ+w2WyaMmWKbDabt0tBI8U9BE/gPsLZ4h7C2eIewtny9j3EhBYAAAAA4AG0XAEAAACABxCuAAAAAMADCFcAAAAA4AGEKwAAAADwAMKVl82cOVNJSUkKCAhQ3759tXz5cm+XBB82depU9e7dWyEhIYqJidE111yjzZs3VzumpKREd911l6KiohQcHKzrr79emZmZXqoYvuy5556TyWTSvffe697G/YPa2L9/v2655RZFRUUpMDBQ3bp1088//+zebxiGJk+erObNmyswMFBDhgzR1q1bvVgxfInT6dRjjz2m1q1bKzAwUG3bttVTTz2lY+dY4x7C8b799lsNHz5c8fHxMplM+vDDD6vtr809k5ubq9GjRys0NFTh4eG67bbbVFhY6NE6CVde9N5772nSpEmaMmWKVq1apR49emjo0KHKysrydmnwUd98843uuusu/fTTT/r8889VXl6uyy67TA6Hw33Mfffdp48//ljz58/XN998owMHDui6667zYtXwRStWrNCrr76q7t27V9vO/YPTOXz4sAYMGCB/f3998skn2rBhg1544QVFRES4j3n++ef1t7/9TbNnz9ayZctkt9s1dOhQlZSUeLFy+Ipp06Zp1qxZeuWVV7Rx40ZNmzZNzz//vGbMmOE+hnsIx3M4HOrRo4dmzpx5wv21uWdGjx6t9evX6/PPP9eiRYv07bff6vbbb/dsoQa8pk+fPsZdd93l/tnpdBrx8fHG1KlTvVgVGpOsrCxDkvHNN98YhmEYeXl5hr+/vzF//nz3MRs3bjQkGUuXLvVWmfAxR44cMdq3b298/vnnxqBBg4w//vGPhmFw/6B2/vznPxsXXHDBSfe7XC4jLi7O+Mtf/uLelpeXZ9hsNuOdd95piBLh44YNG2b89re/rbbtuuuuM0aPHm0YBvcQTk+S8cEHH7h/rs09s2HDBkOSsWLFCvcxn3zyiWEymYz9+/d7rDZarrykrKxMK1eu1JAhQ9zbzGazhgwZoqVLl3qxMjQm+fn5kqTIyEhJ0sqVK1VeXl7tvurYsaNatWrFfQW3u+66S8OGDat2n0jcP6idhQsXKjU1VTfeeKNiYmLUs2dPvfbaa+79O3fuVEZGRrX7KCwsTH379uU+giSpf//+SktL05YtWyRJa9as0ffff68rrrhCEvcQ6q4298zSpUsVHh6u1NRU9zFDhgyR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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recall@10ndcg@10recall@50ndcg@50recall@200ndcg@200coverage@10serendipity@10
model
hstu0.3440530.2065570.6002110.263210.8007990.2937590.3172950.000837
\n", + "
" + ], + "text/plain": [ + " recall@10 ndcg@10 recall@50 ndcg@50 recall@200 ndcg@200 \\\n", + "model \n", + "hstu 0.344053 0.206557 0.600211 0.26321 0.800799 0.293759 \n", + "\n", + " coverage@10 serendipity@10 \n", + "model \n", + "hstu 0.317295 0.000837 " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pivot_table = get_results(pivot_name,metrics_to_show, show_loss=False)\n", + "pivot_table" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Ablation study for Relative Attention Bias\n", + "\n", + "RecTools implementation of HSTU allows to include different variants of rab (Relative Attention Bias) for the model with simple flags. We test the quality of different variant below. And we also include SASRec for comparison.\n", + "\n", + "Please note that HSTU provides time-aware recommendations only when `relative_time_attention` is set to ``True``.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T08:50:32.881667Z", + "start_time": "2025-07-25T08:50:29.116385Z" + }, + "trusted": true + }, + "outputs": [], + "source": [ + "seed_everything(RANDOM_STATE, workers=True)\n", + "dataset_name = \"ml-1m\"\n", + "pivot_name = f\"pivot_results_ablation_{dataset_name}.json\"\n", + "ml_df = get_movielens_df(dataset_name)\n", + "dataset = Dataset.construct(ml_df)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T08:50:34.295334Z", + "start_time": "2025-07-25T08:50:34.215719Z" + }, + "trusted": true + }, + "outputs": [], + "source": [ + "hstu = HSTUModel(\n", + " relative_time_attention=True,\n", + " relative_pos_attention=True,\n", + " **config\n", + ")\n", + "hstu_rab_p = HSTUModel(\n", + " relative_time_attention=False,\n", + " relative_pos_attention=True,\n", + " **config\n", + ")\n", + "hstu_rab_t = HSTUModel(\n", + " relative_time_attention=True,\n", + " relative_pos_attention=False,\n", + " **config\n", + ")\n", + "hstu_no_rab = HSTUModel(\n", + " relative_time_attention=False,\n", + " relative_pos_attention=False,\n", + " **config\n", + ")\n", + "sasrec = SASRecModel(\n", + " **config\n", + ")\n", + "models = {\n", + " \"hstu\": hstu,\n", + " \"hstu_rab_t\": hstu_rab_t,\n", + " \"hstu_rab_p\": hstu_rab_p,\n", + " \"hstu_no_rab\": hstu_no_rab,\n", + " \"sasrec\": sasrec,\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "evaluate(models,loo_splitter,dataset,pivot_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T13:40:17.042518Z", + "start_time": "2025-07-25T13:40:16.864253Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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Fi1ixowZPPHEE/zxj38kIyOjR3+XcDjMRRddRHp6Og8++CBZWVn8/Oc/Z+nSpVx44YVMmDCBv/3tb1gsFq6//nrKy8uj29bX1zNlyhQ+/vhjbrvtNv7617/i8/m49NJLuzX37Ms5x8fHRy9er7jiiuj7eOiFeTgcZubMmTgcDv7+978zffp0Hn74YZ555plu53TLLbdw5513MnXqVB599FFuvPFGXn75ZWbOnNntfbvrrrv485//zJgxY3jooYfIzs7mggsuwO12H/W9PdTzzz/P448/zs0338zDDz+M3W5n586dnHHGGezevZvf//73PPzww5hMJi6//PJu74vL5WLatGk8/vjjXHDBBTz66KPceuut7NmzJxrst7e3s2TJEoqKivjb3/7GwoULaWxsZObMmWzZsqXP5exSUlLCz3/+c/71r3/xu9/9DpVKFS1LJBIBwOl0MnbsWL744gs+/fRTXn/99X4fB2Dz5s2MGzcOpbL7ZcekSZPweDzs3bv3qNv35fPJzs5m6tSpvPzyyz22f/nll7FYLFx22WXdll999dV0dHRw//33c/XVV7N06VIWLVrUbZ1//OMfZGZmsmDBAh5++GHS09O57bbbojceDlVSUsKPfvQjZs+ezf33309rayuzZ8/m5Zdf5te//jXXXXcdixYtorS0lKuvvjr6Ph/JokWL+PGPf4xGo+Gee+5h0aJFpKen89lnnx11O0EQBpEkCIJwGgiFQlJycrJ05plndlv+9NNPS4D08ccfS5IkST6fTwqHw93WKS8vl3Q6nXTPPfd0WwZIzz//fHTZ3XffLR36s7dlyxYJkG677bZu+/vRj34kAdLdd98dXebxeHqUec2aNRIg/fvf/44ue+ONNyRAWrlyZY/1p0+fLk2fPj36fPHixRIgvfTSS9FlgUBAOvPMMyWz2Sy1t7d3OxeHwyG1tLRE13333XclQFq2bFmPYx1qzJgx0iWXXHLUdW644QYJkO67777ostbWVslgMEgKhUJ67bXXosv37NnT4/2ZP3++BEhffvlldFlHR4c0ZMgQKSsrK/qZ9fWcGxsbexzj8LIe+nlLkiSNHTtWGj9+fPT5l19+KQHSyy+/3G29jz76qNvyhoYGSavVSpdccokUiUSi6y1YsEACpBtuuOGo713X52O1WqWGhoZur5177rlSQUGB5PP5ossikYg0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bNky/H4/7733XrdaqRPJ0NhXQ4cOJRKJsGvXLgoLC0/68QRBGBiiWaAgCKeVrlqqu+66iy1btvQY20qlUvW42/vGG29E+670x0UXXQTAY4891m354sWLe6zb23Eff/zxHqm/TSYTQI+gqzcXX3wxdXV13TKwhUIhHn/8ccxmM9OnT+/LaRxTc3Nzt+dms5lhw4YdM/11f1x88cWsW7eONWvWRJe53W6eeeYZsrKyok2b+nrOXRfwfXkfj+Tqq68mHA5z77339ngtFApF933eeeeh0Wh4/PHHu33GvX0P+iMhIYGioiL++c9/9lpr09jYGH185ZVXsnXr1l4H0u4qU1ftx6FlXLt2bbf3vK+ys7MJhULRgG7ixIkkJSVx/fXXs3PnTnbt2sX1119PJBKhqqqKP/3pTyxevJj777+/38cCmDNnDvX19bz11lvRZU1NTbzxxhvMnj271/5YXfr7+ajVan74wx/yn//8h6VLl1JQUMDo0aOPq9y9vedOp5Pnn3/+uPbXH5dffjlKpZJ77rmnRw2ZqPEShNOXqLkSBOG0MmTIEKZMmcK7774L0CO4mjVrFvfccw833ngjU6ZMYfv27bz88svd7mj3VWFhIT/84Q956qmncDqdTJkyhRUrVlBSUtJj3VmzZvHiiy8SExNDfn4+a9as4dNPP8XhcPTYp0ql4m9/+xtOpxOdThcdI+dwN998M//85z+ZN28eGzduJCsrizfffJOvv/6axYsXY7FY+n1OvcnPz6eoqIjx48djt9vZsGEDb775Jj//+c8HZP8Av//973n11Ve56KKL+OUvf4ndbueFF16gvLyc//73v9Hair6es8FgID8/n9dff53hw4djt9sZNWpUn/oldZk+fTq33HIL999/P1u2bOGCCy5Ao9Gwb98+3njjDR599FHmzJkTHSPr/vvvZ9asWVx88cVs3ryZDz/8sN+1oYd78sknOeussygoKOCmm24iOzub+vp61qxZQ1VVVXR8tjvvvJM333yTq666ip/85CeMHz+elpYW3nvvPZ5++mnGjBnDrFmzeOutt7jiiiu45JJLKC8v5+mnnyY/Px+Xy9WvcnWNFbVkyRIWL16MwWDgueee4+qrr46+xz/84Q+ZOnUqf/7zn8nLy+ODDz7olrAE5JqdrnMIBoNs27aNv/zlL4A8OHhXUDNnzhzOOOMMbrzxRnbt2kVcXBxPPfUU4XC4R+rzwx3P53P99dfz2GOPsXLlSv72t7/167051AUXXIBWq2X27NnccsstuFwunn32WRISEnoNmAfSsGHD+OMf/8i9997LtGnT+MEPfoBOp2P9+vWkpKQcd6ArCMJJNhgpCgVBEI7mySeflABp0qRJPV7z+XzSb37zGyk5OVkyGAzS1KlTpTVr1vRIc96XVOySJEler1f65S9/KTkcDslkMkmzZ8+WDhw40COVdWtrq3TjjTdKcXFxktlslmbOnCnt2bNHyszM7JF++tlnn5Wys7MllUrVLd3y4WWUJEmqr6+P7ler1UoFBQXdynzouTz00EM93o/Dy9mbv/zlL9KkSZMkm80mGQwGacSIEdJf//pXKRAIRNe54YYbJJPJ1GPb6dOnSyNHjuyxPDMzs0d699LSUmnOnDmSzWaT9Hq9NGnSJOn999/vsW1fzlmSJGn16tXS+PHjJa1W2+08j1TW3j5fSZKkZ555Rho/frxkMBgki8UiFRQUSL/73e+kmpqa6DrhcFhatGhR9HtVVFQk7dixo9fP93BH+3y63pfrr79eSkpKkjQajZSamirNmjVLevPNN7ut19zcLP385z+XUlNTJa1WK6WlpUk33HCD1NTUJEmSnH77vvvukzIzMyWdTieNHTtWev/996UbbrhByszM7Lavw78XvaViX7lypaTVaqW1a9dGl7W3t0tffvmltHfvXkmSJGnr1q1SaWnpEc+9Ky1+b9Phn2lLS4v005/+VHI4HJLRaJSmT58urV+//oj7PtTxfD4jR46UlEqlVFVV1eO1ru9KY2Njt+W9vU/vvfeeNHr0aEmv10tZWVnS3/72N+m5557rsV5vfxOSJH8Wt99+e7dlvX1njvT9fe6556SxY8dKOp1Oio2NlaZPny4tX76813MWBGHwKSRJ1C0LgiAIwvfR7bffzptvvsnbb7/NlClTel3nyy+/ZOjQoQOadOJUGDt2LHa7nRUrVgx2UQRB+B4Rfa4EQRAE4Xvq0UcfZfbs2UybNo3rrruOZcuWUVJSQnl5Oe+//z5z585lxowZvfYFO51t2LCBLVu2cP311w92UQRB+J4RNVeCIAiC8D337rvvct9997F+/fposgSFQsG0adO46667ooN4n+527NjBxo0befjhh2lqaqKsrCw6ULEgCMKpIIIrQRAEQRAA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WLbuAiA6xgWdhoLV1qo17NtcAmhKoIiIiIjIoShctRHritaRnusB/M0sbK08JbCu2k1Btn/z4s594lr13iIiIiIibYHCVRuxbP9iMgr834fGuVt9vVXO1jIwIDYljIhYR6veW0RERESkLVC4aiN2rvmaYA947Qb2CC90at1wtbd+SmAfTQkUERERETkUhas2oM5Th3PDJgDssW6MqDSISm3VGg5uZiEiIiIiIj+lcNUGrClcQ9cD662iY11YW3lKYFVpHWX5NVgs0Kl3TKveW0RERESkrVC4agOW5i6lW54BQGhs66+3qh+1SkyPxBFmb9V7i4iIiIi0FQpXbcDynGUNzSxC4tytvt5KUwJFRERERH6dwlWAq3HXULxlLSFuIMiHPdKAtCGtdn/DMH5oZqH9rUREREREfpbCVYBbWbCSrrleAEJj3FhT+kNweKvdvzSvhppyFza7ldQe0a12XxERERGRtkbhKsAty11G93z/eiv/lMBjWvX+9VMCU3tEE2S3teq9RURERETaEoWrALcsb1lDM4sQU5pZaEqgiIiIiMjhULgKYIZhcFzSSXTLswAHwlUrNrPweX3s31oGQOe+amYhIiIiIvJLAiJcPf/882RkZBASEsLIkSNZtmzZL57/3nvv0bdvX0JCQhg0aBCffPJJo9cvv/xyLBZLo68JEya05EdoERaLhQElwwh1G1hsPhwJIZDYp9XuX5hdhavWgyMsiMT0yFa7r4iIiIhIW2R6uJo7dy7Tp09n5syZrFy5kszMTMaPH09BQcEhz//uu++45JJLuPLKK1m1ahVnn302Z599NuvXr2903oQJE8jNzW34+te//tUaH6fZZS9dBUBIjAdL56Fgbb11T/VdAtN6xWC1WlrtviIiIiIibZHp4erJJ5/k6quvZsqUKfTv358XX3yRsLAw5syZc8jzn376aSZMmMBtt91Gv379uP/++znmmGN47rnnGp3ncDhISUlp+IqNbZtrhpwbNwIHmlmYtHlwF+1vJSIiIiLyq0wNVy6XixUrVjB27NiGY1arlbFjx7J48eJDvmfx4sWNzgcYP378T85fsGABSUlJ9OnTh+uuu47i4uKfrcPpdFJRUdHwFSgMw+BYVz4AIbGuVl1v5XF5ydtRDqiZhYiIiIjI4TA1XBUVFeH1eklOTm50PDk5mby8vEO+Jy8v71fPnzBh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m4kVSyDxer3cc889dOvWjdDQUHr06MH999/PwT3W9AzJj3399deceeaZpKWlYbFY+OCDDxq9fjjPTElJCZdeeilRUVHExMRw5ZVXUlVV1ax1KlyZaO7cuUyfPp2ZM2eycuVKMjMzGT9+PAUFBWaXJgFq4cKFTJ06lSVLljB//nzcbjfjxo2jurq64Zybb76Zjz76iPfee4+FCxeSk5PDueeea2LVEoi+//57XnrpJQYPHtzouJ4f+TWlpaWMHj0au93Op59+ysaNG3niiSeIjY1tOOfRRx/lmWee4cUXX2Tp0qWEh4czfvx46urqTKxcAsUjjzzCCy+8wHPPPcemTZt45JFHePTRR3n22WcbztEzJD9WXV1NZmYmzz///CFfP5xn5tJLL2XDhg3Mnz+fjz/+mK+//pprrrmmeQs1xDQjRowwpk6d2vB7r9drpKWlGbNmzTKxKmlLCgoKDMBYuHChYRiGUVZWZtjtduO9995rOGfTpk0GYCxevNisMiXAVFZWGr169TLmz59vnHzyycaNN95oGIaeHzk8t99+u3HCCSf87Os+n89ISUkxHnvssYZjZWVlhsPhMP71r3+1RokS4M444wzjiiuuaHTs3HPPNS699FLDMPQMya8DjPfff7/h94fzzGzcuNEAjO+//77hnE8//dSwWCzG/v37m602jVyZxOVysWLFCsaOHdtwzGq1MnbsWBYvXmxiZdKWlJeXAxAXFwfAihUrcLvdjZ6rvn37kp6erudKGkydOpUzzjij0XMCen7k8Hz44YcMHz6cCy64gKSkJIYOHcrLL7/c8PquXbvIy8tr9BxFR0czcuRIPUcCwPHHH09WVhZbt24FYM2aNSxatIjTTz8d0DMkTXc4z8zixYuJiYlh+PDhDeeMHTsWq9XK0qVLm62WoGa7kjRJUVERXq+X5OTkRseTk5PZvHmzSVVJW+Lz+bjpppsYPXo0AwcOBCAvL4/g4GBiYmIanZucnExeXp4JVUqgeeedd1i5ciXff//9T17T8yOHY+fOnbzwwgtMnz6du+66i++//54//elPBAcHM3ny5IZn5VD//6bnSADuuOMOKioq6Nu3LzabDa/Xy4MPPsill14KoGdImuxwnpm8vDySkpIavR4UFERcXFyzPlcKVyJt1NSpU1m/fj2LFi0yuxRpI/bu3cuNN97I/PnzCQkJMbscaaN8Ph/Dhw/noYceAmDo0KGsX7+eF198kcmTJ5tcnbQF7777Lm+99RZvv/02AwYMYPXq1dx0002kpaXpGZI2T9MCTZKQkIDNZvtJF678/HxSUlJMqkraimnTpvHxxx/z1Vdf0blz54bjKSkpuFwuysrKGp2v50rAP+2voKCAY445hqCgIIKCgli4cCHPPPMMQUFBJCcn6/mRX5Wamkr//v0bHevXrx/Z2dkADc+K/v9Nfs5tt93GHXfcwcUXX8ygQYP4wx/+wM0338ysWbMAPUPSdIfzzKSkpPykaZzH46GkpKRZnyuFK5MEBwczbNgwsrKyGo75fD6ysrIYNWqUiZVJIDMMg2nTpvH+++/z5Zdf0q1bt0avDxs2DLvd3ui52rJlC9nZ2XquhDFjxrBu3TpWr17d8DV8+HAuvfTShu/1/MivGT169E+2gNi6dStdu3YFoFu3bqSkpDR6jioqKli6dKmeIwGgpqYGq7Xxj6A2mw2fzwfoGZKmO5xnZtSoUZSVlbFixYqGc7788kt8Ph8jR45svmKarTWGNNk777xjOBwO49VXXzU2btxoXHPNNUZMTIyRl5dndmkSoK677jojOjraWLBggZGbm9vwVVNT03DOtddea6SnpxtffvmlsXz5cmPUqFHGqFGjTKxaAtnB3QINQ8+P/Lply5YZQUFBxoMPPmhs27bNeOutt4ywsDDjzTffbDjn4YcfNmJiYoz//ve/xtq1a43f/e53Rrdu3Yza2loTK5dAMXnyZKNTp07Gxx9/bOzatcv4z3/+YyQkJBh//vOfG87RMyQ/VllZaaxatcpYtWqVARhPPvmksWrVKmPPnj2GYRzeMzNhwgRj6NChxtKlS41FixYZvXr1Mi655JJmrVPhymTPPvuskZ6ebgQHBxsjRowwlixZYnZJEsCAQ3698sorDefU1tYa119/vREbG2uEhYUZ55xzjpGbm2te0RLQfhyu9PzI4fjoo4+MgQMHGg6Hw+jbt6/x97//vdHrPp/PuOeee4zk5GTD4XAYY8aMMbZs2WJStRJoKioqjBtvvNFIT083QkJCjO7duxt333234XQ6G87RMyQ/9tVXXx3yZ6DJkycbhnF4z0xxcbFxySWXGBEREUZUVJQxZcoUo7KyslnrtBjGQdthi4iIiIiIyBHRmisREREREZFmoHAlIiIiIiLSDBSuREREREREmoHClYiIiIiISDNQuBIREREREWkGClciIiIiIiLNQOFKRERERESkGShciYiIiIiINAOFKxERkWZmsVj44IMPzC5DRERamcKViIi0K5dffjkWi+UnXxMmTDC7NBERaeeCzC5ARESkuU2YMIFXXnml0TGHw2FSNSIi0lFo5EpERNodh8NBSkpKo6/Y2FjAP2XvhRde4PTTTyc0NJTu3bvzf//3f43ev27dOk477TRCQ0OJj4/nmmuuoaqqqtE5c+bMYcCAATgcDlJTU5k2bVqj14uKijjnnHMICwujV69efPjhhy37oUVExHQKVyIi0uHcc889nHfeeaxZs4ZLL72Uiy++mE2bNgFQXV3N+PHjiY2N5fvvv+e9997jiy++aBSeXnjhBaZOnco111zDunXr+PDDD+nZs2eje/z1r3/lwgsvZO3atUycOJFLL72UkpKSVv2cIiLSuiyGYRhmFyEiItJcLr/8ct58801CQkIaHb/rrru46667sFgsXHvttbzwwgsNrx133HEcc8wx/O1vf+Pll1/m9ttvZ+/evYSHhwPwySefcOaZZ5KTk0NycjKdOnViypQpPPDAA4eswWKx8Je//IX7778f8Ae2iIgIPv30U639EhFpx7TmSkRE2p1TTz21UXgCiIuLa/h+1KhRjV4bNWoUq1evBmDTpk1kZmY2BCuA0aNH4/P52LJlCxaLhZycHMaMGfOLNQwePLjh+/DwcKKioigoKDjSjyQiIm2AwpWIiLQ74eHhP5mm11xCQ0MP6zy73d7o9xaLBZ/P1xIliYhIgNCaKxER6XCWLFnyk9/369cPgH79+rFmzRqqq6sbXv/222+xWq306dOHyMhIMjIyyMrKatWaRUQk8GnkSkRE2h2n00leXl6jY0FBQSQkJADw3nvvMXz4cE444QTeeustli1bxj//+U8ALr30UmbOnMnkyZO59957KSws5IYbbuAPf/gDycnJANx7771ce+21JCUlcfrpp1NZWcm3337LDTfc0LofVEREAorClYiItDvz5s0jNTW10bE+ffqwefNmwN/J75133uH6668nNTWVf/3rX/Tv3x+AsLAwPvvsM2688UaOPfZYwsLCOO+883jyyScbrjV58mTq6up46qmnuPXWW0lISOD8889vvQ8oIiIBSd0CRUSkQ7FYLLz//vucffbZZpciIiLtjNZciYiIiIiINAOFKxERERERkWagNVciItKhaDa8iIi0FI1ciYiIiIiINAOFKxERERERkWagcCUiIiIiItIMFK5ERERERESagcKViIiIiIhIM1C4EhERERERaQYKVyIiIiIiIs1A4UpERERERKQZ/D+iA7GSk4SuVAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
recall@10ndcg@10recall@50ndcg@50recall@200ndcg@200coverage@10serendipity@10
model
hstu0.3226820.1879150.5894040.2470560.7857620.2768610.6503780.002877
hstu_rab_t0.3205300.1864590.5841060.2449370.7849340.2754690.6590170.002862
hstu_rab_p0.3023180.1718280.5701990.2311110.7720200.2618270.6444380.002659
hstu_no_rab0.2980130.1685590.5599340.2263510.7660600.2577930.6182510.002535
sasrec0.2877480.1621960.5518210.2203940.7632450.2525090.6603670.002623
\n", + "
" + ], + "text/plain": [ + " recall@10 ndcg@10 recall@50 ndcg@50 recall@200 ndcg@200 \\\n", + "model \n", + "hstu 0.322682 0.187915 0.589404 0.247056 0.785762 0.276861 \n", + "hstu_rab_t 0.320530 0.186459 0.584106 0.244937 0.784934 0.275469 \n", + "hstu_rab_p 0.302318 0.171828 0.570199 0.231111 0.772020 0.261827 \n", + "hstu_no_rab 0.298013 0.168559 0.559934 0.226351 0.766060 0.257793 \n", + "sasrec 0.287748 0.162196 0.551821 0.220394 0.763245 0.252509 \n", + "\n", + " coverage@10 serendipity@10 \n", + "model \n", + "hstu 0.650378 0.002877 \n", + "hstu_rab_t 0.659017 0.002862 \n", + "hstu_rab_p 0.644438 0.002659 \n", + "hstu_no_rab 0.618251 0.002535 \n", + "sasrec 0.660367 0.002623 " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pivot_table = get_results(pivot_name,metrics_to_show, show_loss=False)\n", + "pivot_table" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Context-aware recommendations for HSTU model\n", + "\n", + "Since relative time attention utilizes the difference in timestamps between the target item and the last item in user interactions, it is necessary to feed target timestamps information to model when calling `recommend`.\n", + "\n", + "Since timestamps are just one specific form of context that can be used by recommender models during inference, we accept the optional `context` argument in `recommend` method for our models.\n", + "\n", + "`context` is just a pandas dataframe. In case of HSTU it should have columns \"user_id\" (`Columns.User`) and \"datetime\" (`Columns.Datetime`). Please note that other columns will not be processed by HSTU model (but they can be processed by customized models implemented on top of RecTools backbone models)." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T13:47:03.825917Z", + "start_time": "2025-07-25T13:47:01.918517Z" + } + }, + "outputs": [], + "source": [ + "from rectools.dataset.context import get_context\n", + "\n", + "users = [1,2,3] # users we are recommending for\n", + "query_time = max(ml_df[Columns.Datetime]) # for example\n", + "context_df = pd.DataFrame(\n", + " {\n", + " Columns.User: [1, 2, 3],\n", + " Columns.Datetime: [query_time]*3,\n", + " }\n", + ")\n", + "context = get_context(context_df) # context preprocessing. You can also just pass full test interactions df here if you have it" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T13:47:04.513157Z", + "start_time": "2025-07-25T13:47:04.474821Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_iditem_idscorerank
0128580.2359281
115890.2297042
215930.2247033
3210.2546601
429190.2356812
522600.2187323
6310.3289471
7327160.3252332
8321740.3160633
\n", + "
" + ], + "text/plain": [ + " user_id item_id score rank\n", + "0 1 2858 0.235928 1\n", + "1 1 589 0.229704 2\n", + "2 1 593 0.224703 3\n", + "3 2 1 0.254660 1\n", + "4 2 919 0.235681 2\n", + "5 2 260 0.218732 3\n", + "6 3 1 0.328947 1\n", + "7 3 2716 0.325233 2\n", + "8 3 2174 0.316063 3" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hstu.recommend(\n", + " users=users,\n", + " dataset=dataset,\n", + " k=3,\n", + " filter_viewed=True,\n", + " context=context) # provide context\n", + "\n", + "# Model processes context timestamp during inference:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To check if model requires context, there is a `require_recommend_context` attribute of each model:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "ExecuteTime": { + "end_time": "2025-07-25T13:58:12.816026Z", + "start_time": "2025-07-25T13:58:12.812378Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(True, False)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hstu.require_recommend_context, hstu_rab_p.require_recommend_context" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Please note that when context is required but not provided, `recommend` method will raise an error." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.23" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/examples/tutorials/utils.py b/examples/tutorials/utils.py new file mode 100644 index 00000000..2a9cc185 --- /dev/null +++ b/examples/tutorials/utils.py @@ -0,0 +1,317 @@ +import json +import os +import typing as tp +import warnings +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import torch +from matplotlib.axes import Axes +from matplotlib.figure import Figure +from pytorch_lightning import LightningModule, Trainer +from pytorch_lightning.callbacks import Callback +from scipy import sparse + +WINDOW_AVG = 3 + + +class RecallCallback(Callback): # type: ignore + """ + Callback for computing Recall@k metric during validation. + + Parameters + ---------- + k : int + Number of top recommendations to consider for Recall computation. + progress_bar : bool, default=True + Whether to show Recall in the progress bar during validation. + """ + + base_name: str = "recall" + + def __init__(self, k: int, progress_bar: bool = True) -> None: + self.k = k + self.name = self.base_name + f"@{k}" + self.progress_bar = progress_bar + + self.batch_recall_per_users: tp.List[torch.Tensor] = [] + + def on_validation_batch_end( + self, + trainer: Trainer, + pl_module: LightningModule, + outputs: tp.Dict[str, torch.Tensor], + batch: tp.Dict[str, torch.Tensor], + batch_idx: int, + dataloader_idx: int = 0, + ) -> None: + """ + Process a single validation batch to compute Recall@k per user. + + - Computes logits (if not present in outputs). + - Filters known items from recommendations using a sparse mask. + - Computes top-k recommendations. + - Compares recommendations with ground truth targets to calculate Recall. + + Parameters + ---------- + trainer : Trainer + PyTorch Lightning Trainer instance. + pl_module : LightningModule + The model being trained/evaluated. + outputs : Dict[str, torch.Tensor] + Model outputs, including logits or session embeddings. + batch : Dict[str, torch.Tensor] + Batch of validation data, including input sequences and targets. + batch_idx : int + Index of the current batch. + dataloader_idx : int, default=0 + Index of the dataloader (useful for multiple validation sets). + """ + if "logits" not in outputs: + session_embs = pl_module.torch_model.encode_sessions(batch, pl_module.item_embs)[:, -1, :] + logits = pl_module.torch_model.similarity_module(session_embs, pl_module.item_embs) + else: + logits = outputs["logits"] + + x = batch["x"] + users = x.shape[0] + row_ind = np.arange(users).repeat(x.shape[1]) + col_ind = x.flatten().detach().cpu().numpy() + mask = col_ind != 0 + data = np.ones_like(row_ind[mask]) + filter_csr = sparse.csr_matrix( + (data, (row_ind[mask], col_ind[mask])), + shape=(users, pl_module.torch_model.item_model.n_items), + ) + mask = torch.from_numpy((filter_csr != 0).toarray()).to(logits.device) + scores = torch.masked_fill(logits, mask, float("-inf")) + + _, batch_recos = scores.topk(k=self.k) + + targets = batch["y"] + + # assume all users have the same amount of TP + liked = targets.shape[1] + tp_mask = torch.stack([torch.isin(batch_recos[uid], targets[uid]) for uid in range(batch_recos.shape[0])]) + recall_per_users = tp_mask.sum(dim=1) / liked + + self.batch_recall_per_users.append(recall_per_users) + + def on_validation_epoch_end(self, trainer: Trainer, pl_module: LightningModule) -> None: + """ + Aggregate Recall@k results from all batches and log them. + + Parameters + ---------- + trainer : Trainer + PyTorch Lightning Trainer instance. + pl_module : LightningModule + The model being evaluated. + """ + recall = float(torch.concat(self.batch_recall_per_users).mean()) + self.log_dict({self.name: recall}, on_step=False, on_epoch=True, prog_bar=self.progress_bar) + + self.batch_recall_per_users.clear() + + +class BestModelLoadCallback(Callback): + """ + Callback for loading the best model checkpoint at the end of training. + + Parameters + ---------- + ckpt_path : str + Path to the best checkpoint file (without .ckpt extension). + """ + + def __init__(self, ckpt_path: str) -> None: + self.ckpt_path = ckpt_path + ".ckpt" + + def on_fit_end(self, trainer: Trainer, pl_module: LightningModule) -> None: + """ + Load the best model weights from the checkpoint after training finishes. + + If `trainer.log_dir` is not set, a warning is raised and no weights are loaded. + + Parameters + ---------- + trainer : Trainer + PyTorch Lightning Trainer instance. + pl_module : LightningModule + The model being trained. + """ + if trainer.log_dir is None: + warnings.warn("Trainer has no log dir and weights were not updated from checkpoint") + return + log_dir: str = trainer.log_dir + ckpt_path = Path(log_dir) / "checkpoints" / self.ckpt_path + checkpoint = torch.load(ckpt_path, weights_only=False) + pl_module.load_state_dict(checkpoint["state_dict"]) + self.ckpt_full_path = str(ckpt_path) # pylint: disable = attribute-defined-outside-init + + +def get_logs(log_dir_path: str) -> tp.Tuple[pd.DataFrame, ...]: + """ + Load training/validation loss from a CSV file. + + Parameters + ---------- + log_dir_path : str + Path to the directory containing the `metrics.csv` file. + + Returns + ------- + loss_df : pd.DataFrame + DataFrame containing training and validation loss per epoch. + metrics_df : pd.DataFrame + DataFrame containing other metrics (excluding loss) per epoch. + """ + log_path = os.path.join(log_dir_path, "metrics.csv") + epoch_metrics_df = pd.read_csv(log_path) + + loss_df = epoch_metrics_df[["epoch", "train_loss"]].dropna() + val_loss_df = epoch_metrics_df[["epoch", "val_loss"]].dropna() + loss_df = pd.merge(loss_df, val_loss_df, how="inner", on="epoch") + loss_df.reset_index(drop=True, inplace=True) + + metrics_df = epoch_metrics_df.drop(columns=["train_loss", "val_loss"]).dropna() + metrics_df.reset_index(drop=True, inplace=True) + + return loss_df, metrics_df + + +def create_subplots_grid(n_plots: int) -> tp.Tuple[Figure, np.ndarray[Axes]]: + """ + Create a grid of subplots with 2 columns per row. + + Parameters + ---------- + n_plots : int + Number of plots to display. + + Returns + ------- + fig : matplotlib.figure.Figure + The created figure object. + axes : np.ndarray of matplotlib.axes.Axes + Array of subplot axes. + """ + n_rows = (n_plots + 1) // 2 + figsize = (12, 4 * n_rows) + fig, axes = plt.subplots(n_rows, 2, figsize=figsize) + + if n_rows == 1: + axes = axes.reshape(1, -1) + + if n_plots % 2 == 1: + axes[-1, -1].axis("off") + + return fig, axes + + +def rolling_avg( + x: pd.Series, + y: pd.Series, + window: int, +) -> tp.Tuple[pd.Series, pd.Series]: + """ + Compute rolling average of y values over x. + + Parameters + ---------- + x : pd.Series + X-axis values (e.g. epoch numbers). + y : pd.Series + Y-axis values (e.g. metric values). + window : int + Size of the rolling window. + + Returns + ------- + pd.Series, pd.Series + Smoothed x and y values. + """ + df = pd.DataFrame({"x": x, "y": y}).sort_values("x") + df["y_smooth"] = df["y"].rolling(window=window, center=True).mean() + return df["x"], df["y_smooth"] + + +def show_val_metrics(train_stage_metrics: dict[str, tp.Any]) -> None: + """ + Plot validation and training loss for all models. + + Parameters + ---------- + train_stage_metrics : dict[str, tuple] + Dictionary mapping model names to their training metrics (loss_df, metrics_df). + """ + n_plots = len(train_stage_metrics) + models_name = list(train_stage_metrics.keys()) + fig, axes = create_subplots_grid(n_plots=n_plots) + + for ax, model_name in zip(axes.flat, models_name): + y1 = train_stage_metrics[model_name][0]["val_loss"] + y2 = train_stage_metrics[model_name][0]["train_loss"] + x = train_stage_metrics[model_name][0]["epoch"] + ax.plot(x, y1, label="val_loss") + ax.plot(x, y2, label="train_loss") + ax.set_title(f"{model_name}") + ax.legend() + plt.show() + + +def get_results(path_to_load_res: str, metrics_to_show: tp.List[str], show_loss: bool = False) -> pd.DataFrame: + """ + Load and visualize training results from a JSON file. + + Parameters + ---------- + path_to_load_res : str + Path to the JSON file containing experiment data. + metrics_to_show : List[str] + List of metric names to include in the output table. + show_loss : bool, default=False + Whether to plot training and validation loss curves. + + Returns + ------- + pd.DataFrame + A DataFrame with mean values of specified metrics per model. + """ + with open(path_to_load_res, "r", encoding="utf-8") as f: + exp_data = json.load(f) + + train_stage_metrics = { + model_name: get_logs(log_dir_path) for model_name, log_dir_path in exp_data["models_log_dir"].items() + } + if show_loss: + show_val_metrics(train_stage_metrics) + + plt.figure(figsize=(10, 6)) + for model_name, tr_results in train_stage_metrics.items(): + x = tr_results[1]["epoch"] + y = tr_results[1]["recall@10"] + x_smooth, y_smooth = rolling_avg(x, y, window=WINDOW_AVG) + plt.plot(x_smooth, y_smooth, label=model_name) + + plt.grid(False) + ax = plt.gca() + for spine in ["top", "bottom", "left", "right"]: + ax.spines[spine].set_color("black") + ax.spines[spine].set_linewidth(1.5) + legend = plt.legend(frameon=True, edgecolor="black", facecolor="white", framealpha=1, fontsize=10) + legend.get_frame().set_linewidth(1.5) + plt.title("Validation smoothed recall@10 dynamic") + plt.xlabel("Epoch") + plt.ylabel("Recall@10") + plt.legend() + plt.show() + + pivot_results = ( + pd.DataFrame(exp_data["metrics"]).drop(columns="i_split").groupby(["model"], sort=False).agg(["mean"]) + ) + pivot_results.columns = pivot_results.columns.droplevel(1) + return pivot_results[metrics_to_show] diff --git a/rectools/compat.py b/rectools/compat.py index 2c4496dc..3185a148 100644 --- a/rectools/compat.py +++ b/rectools/compat.py @@ -34,6 +34,12 @@ class LightFMWrapperModel(RequirementUnavailable): requirement = "lightfm" +class HSTUModel(RequirementUnavailable): + """Dummy class, which is returned if there are no dependencies required for the model""" + + requirement = "torch" + + class DSSMModel(RequirementUnavailable): """Dummy class, which is returned if there are no dependencies required for the model""" diff --git a/rectools/dataset/context.py b/rectools/dataset/context.py new file mode 100644 index 00000000..433b58b8 --- /dev/null +++ b/rectools/dataset/context.py @@ -0,0 +1,35 @@ +import pandas as pd + +from rectools import Columns +from rectools.dataset import Interactions + + +def get_context(df: pd.DataFrame) -> pd.DataFrame: + """ + Extract initial interaction context for each user. + + For each user, finds the earliest index base on datetime and uses it to define + the initial contextual data. If the item column is present, it is dropped from the result, + as it's not part of the user context. + + Parameters + ---------- + df : pd.DataFrame + Input DataFrame containing user interactions with at least + user ID and datetime columns. + + Returns + ------- + pd.DataFrame + A DataFrame with one row per user, representing the earliest + context data for that user. + """ + df = df.copy() + if Columns.Weight not in df.columns: + df[Columns.Weight] = 1.0 + Interactions.convert_weight_and_datetime_types(df) + earliest = df.groupby(Columns.User)[Columns.Datetime].idxmin() + context = df.loc[earliest] + if Columns.Item in context: + context.drop(columns=[Columns.Item], inplace=True) + return context diff --git a/rectools/dataset/interactions.py b/rectools/dataset/interactions.py index 2acd9496..557f48a4 100644 --- a/rectools/dataset/interactions.py +++ b/rectools/dataset/interactions.py @@ -55,7 +55,21 @@ def _check_columns_present(df: pd.DataFrame) -> None: raise KeyError(f"Missed columns {required_columns - actual_columns}") @staticmethod - def _convert_weight_and_datetime_types(df: pd.DataFrame) -> None: + def convert_weight_and_datetime_types(df: pd.DataFrame) -> None: + """ + Convert weight column to float and datetime column to datetime64[ns] in-place. + + This method ensures that the specified weight column contains numeric values + and that the datetime column can be converted to pandas' datetime64[ns] format. + The conversion is done in-place, so the original DataFrame will be modified. + + Parameters + ---------- + df : pd.DataFrame + Input DataFrame that must contain the following columns: + - `Columns.Weight` - interaction weight; + - `Columns.Datetime` - interaction timestamp. + """ try: df[Columns.Weight] = df[Columns.Weight].astype(float) except ValueError: @@ -80,7 +94,7 @@ def _check_ids(self, _: str, df: pd.DataFrame) -> None: def __attrs_post_init__(self) -> None: """Convert datetime and weight columns to the right data types.""" - self._convert_weight_and_datetime_types(self.df) + self.convert_weight_and_datetime_types(self.df) @staticmethod def _add_extra_cols(df: pd.DataFrame, interactions: pd.DataFrame) -> None: @@ -125,7 +139,7 @@ def from_raw( ) df[Columns.Weight] = interactions[Columns.Weight].values df[Columns.Datetime] = interactions[Columns.Datetime].values - cls._convert_weight_and_datetime_types(df) + cls.convert_weight_and_datetime_types(df) if keep_extra_cols: cls._add_extra_cols(df, interactions) diff --git a/rectools/model_selection/cross_validate.py b/rectools/model_selection/cross_validate.py index 510c48b1..69215bf8 100644 --- a/rectools/model_selection/cross_validate.py +++ b/rectools/model_selection/cross_validate.py @@ -16,6 +16,7 @@ from rectools.columns import Columns from rectools.dataset import Dataset +from rectools.dataset.context import get_context from rectools.metrics import calc_metrics from rectools.metrics.base import MetricAtK from rectools.models.base import ErrorBehaviour, ModelBase @@ -120,12 +121,17 @@ def cross_validate( # pylint: disable=too-many-locals test_users = interactions_df_test[Columns.User].unique() prev_interactions = fold_dataset.get_raw_interactions() catalog = prev_interactions[Columns.Item].unique() - + test_fold_context = None + if any(model.require_recommend_context for _, model in models.items()): + test_fold_context = get_context(interactions_df_test) # ### Train ref models if any ref_reco = {} for model_name in ref_models or []: model = models[model_name] model.fit(fold_dataset) + context = None + if model.require_recommend_context: + context = test_fold_context ref_reco[model_name] = model.recommend( users=test_users, dataset=fold_dataset, @@ -133,6 +139,7 @@ def cross_validate( # pylint: disable=too-many-locals filter_viewed=filter_viewed, items_to_recommend=items_to_recommend, on_unsupported_targets=on_unsupported_targets, + context=context, ) # ### Generate recommendations and calc metrics @@ -144,6 +151,9 @@ def cross_validate( # pylint: disable=too-many-locals reco = ref_reco[model_name] else: model.fit(fold_dataset) + context = None + if model.require_recommend_context: + context = test_fold_context reco = model.recommend( users=test_users, dataset=fold_dataset, @@ -151,6 +161,7 @@ def cross_validate( # pylint: disable=too-many-locals filter_viewed=filter_viewed, items_to_recommend=items_to_recommend, on_unsupported_targets=on_unsupported_targets, + context=context, ) metric_values = calc_metrics( diff --git a/rectools/model_selection/last_n_split.py b/rectools/model_selection/last_n_split.py index 44faa0ed..d5505bf2 100644 --- a/rectools/model_selection/last_n_split.py +++ b/rectools/model_selection/last_n_split.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +"""LastNSplitter.""" import typing as tp diff --git a/rectools/models/__init__.py b/rectools/models/__init__.py index 7733f42c..eec51bfd 100644 --- a/rectools/models/__init__.py +++ b/rectools/models/__init__.py @@ -57,14 +57,16 @@ try: from .nn.dssm import DSSMModel from .nn.transformers.bert4rec import BERT4RecModel + from .nn.transformers.hstu import HSTUModel from .nn.transformers.sasrec import SASRecModel except ImportError: # pragma: no cover - from ..compat import BERT4RecModel, DSSMModel, SASRecModel # type: ignore + from ..compat import BERT4RecModel, DSSMModel, HSTUModel, SASRecModel # type: ignore __all__ = ( "SASRecModel", "BERT4RecModel", + "HSTUModel", "EASEModel", "ImplicitALSWrapperModel", "ImplicitBPRWrapperModel", diff --git a/rectools/models/base.py b/rectools/models/base.py index d2a4a0f4..234dd0cd 100644 --- a/rectools/models/base.py +++ b/rectools/models/base.py @@ -102,6 +102,19 @@ def __init__(self, *args: tp.Any, verbose: int = 0, **kwargs: tp.Any) -> None: self.is_fitted = False self.verbose = verbose + @property + def require_recommend_context(self) -> bool: + """ + Indicates whether recommendation context is required for predictions. + + Returns + ------- + bool + Always returns False, indicating this model does not require + additional context information during recommendation generation. + """ + return False + @tp.overload def get_config( # noqa: D102 self, mode: tp.Literal["pydantic"], simple_types: bool = False @@ -352,7 +365,11 @@ def _fit_partial(self, dataset: Dataset, *args: tp.Any, **kwargs: tp.Any) -> Non raise NotImplementedError("Partial fitting is not supported in {self.__class__.__name__}") def _custom_transform_dataset_u2i( - self, dataset: Dataset, users: ExternalIds, on_unsupported_targets: ErrorBehaviour + self, + dataset: Dataset, + users: ExternalIds, + on_unsupported_targets: ErrorBehaviour, + context: tp.Optional[pd.DataFrame] = None, ) -> Dataset: # This method should be overwritten for models that require dataset processing for u2i recommendations # E.g.: interactions filtering or changing mapping of internal ids based on model specific logic @@ -365,7 +382,7 @@ def _custom_transform_dataset_i2i( # E.g.: interactions filtering or changing mapping of internal ids based on model specific logic return dataset - def recommend( + def recommend( # pylint: disable=too-many-locals self, users: ExternalIds, dataset: Dataset, @@ -374,6 +391,7 @@ def recommend( items_to_recommend: tp.Optional[ExternalIds] = None, add_rank_col: bool = True, on_unsupported_targets: ErrorBehaviour = "raise", + context: tp.Optional[pd.DataFrame] = None, ) -> pd.DataFrame: r""" Recommend items for users. @@ -409,6 +427,9 @@ def recommend( Specify "raise" to raise ValueError in case unsupported targets are passed (default). Specify "ignore" to filter unsupported targets. Specify "warn" to filter with warning. + context : optional(pd.DataFrame), default ``None`` + Optional DataFrame containing additional user context information (e.g., session features, + demographics). Returns ------- @@ -430,12 +451,24 @@ def recommend( If some of given users are warm/cold and model doesn't support such type of users and `on_unsupported_targets` is set to "raise". """ + if self.require_recommend_context and (context is None): + raise ValueError( + "This model requires `context` to be provided for recommendations generation " + f"(model.require_recommend_context is {self.require_recommend_context})." + "Check docs and examples for details." + ) + if not self.require_recommend_context and (context is not None): + context = None + warnings.warn( + "You are providing context to a model that does not require it. Context is set to 'None'", + UserWarning, + ) self._check_is_fitted() self._check_k(k) # We are going to lose original dataset object. Save dtype for later original_user_type = dataset.user_id_map.external_dtype original_item_type = dataset.item_id_map.external_dtype - dataset = self._custom_transform_dataset_u2i(dataset, users, on_unsupported_targets) + dataset = self._custom_transform_dataset_u2i(dataset, users, on_unsupported_targets, context) sorted_item_ids_to_recommend = self._get_sorted_item_ids_to_recommend(items_to_recommend, dataset) diff --git a/rectools/models/nn/item_net.py b/rectools/models/nn/item_net.py index 5020a433..f94350ca 100644 --- a/rectools/models/nn/item_net.py +++ b/rectools/models/nn/item_net.py @@ -262,7 +262,6 @@ def __init__( embedding_dim=n_factors, padding_idx=0, ) - self.dropout = nn.Dropout(dropout_rate) def forward(self, items: torch.Tensor) -> torch.Tensor: """ @@ -279,7 +278,6 @@ def forward(self, items: torch.Tensor) -> torch.Tensor: Item embeddings. """ item_embs = self.ids_emb(items.to(self.device)) - item_embs = self.dropout(item_embs) return item_embs @classmethod diff --git a/rectools/models/nn/transformers/base.py b/rectools/models/nn/transformers/base.py index fcd97735..2183005c 100644 --- a/rectools/models/nn/transformers/base.py +++ b/rectools/models/nn/transformers/base.py @@ -20,6 +20,7 @@ from tempfile import NamedTemporaryFile import numpy as np +import pandas as pd import torch import typing_extensions as tpe from pydantic import BeforeValidator, PlainSerializer @@ -488,9 +489,13 @@ def _fit( self.fit_trainer.fit(self.lightning_model, train_dataloader, val_dataloader) def _custom_transform_dataset_u2i( - self, dataset: Dataset, users: ExternalIds, on_unsupported_targets: ErrorBehaviour + self, + dataset: Dataset, + users: ExternalIds, + on_unsupported_targets: ErrorBehaviour, + context: tp.Optional[pd.DataFrame] = None, ) -> Dataset: - return self.data_preparator.transform_dataset_u2i(dataset, users) + return self.data_preparator.transform_dataset_u2i(dataset, users, context) def _custom_transform_dataset_i2i( self, dataset: Dataset, target_items: ExternalIds, on_unsupported_targets: ErrorBehaviour diff --git a/rectools/models/nn/transformers/data_preparator.py b/rectools/models/nn/transformers/data_preparator.py index 40993d40..1582646c 100644 --- a/rectools/models/nn/transformers/data_preparator.py +++ b/rectools/models/nn/transformers/data_preparator.py @@ -127,6 +127,9 @@ class TransformerDataPreparatorBase: # pylint: disable=too-many-instance-attrib get_val_mask_func_kwargs: optional(InitKwargs), default ``None`` Additional keyword arguments for the get_val_mask_func. Make sure all dict values have JSON serializable types. + add_unix_ts: bool, default ``False`` + Add extra column ``unix_ts`` contains Column.Datetime converted to seconds + from the beginning of the epoch extra_cols: optional(List[str]), default ``None`` Extra columns to keep in train and recommend datasets. """ @@ -149,6 +152,7 @@ def __init__( negative_sampler: tp.Optional[TransformerNegativeSamplerBase] = None, get_val_mask_func_kwargs: tp.Optional[InitKwargs] = None, extra_cols: tp.Optional[tp.List[str]] = None, + add_unix_ts: bool = False, **kwargs: tp.Any, ) -> None: self.item_id_map: IdMap @@ -165,6 +169,7 @@ def __init__( self.get_val_mask_func = get_val_mask_func self.get_val_mask_func_kwargs = get_val_mask_func_kwargs self.extra_cols = extra_cols + self.add_unix_ts = add_unix_ts def get_known_items_sorted_internal_ids(self) -> np.ndarray: """Return internal item ids from processed dataset in sorted order.""" @@ -218,10 +223,15 @@ def _filter_train_interactions(self, train_interactions: pd.DataFrame) -> pd.Dat ) return train_interactions + def _convert_to_unix_ts(self, datetime: pd.Series) -> pd.Series: + return (datetime.values.astype("int64") / 10**9).astype("int64") + def process_dataset_train(self, dataset: Dataset) -> None: """Process train dataset and save data.""" extra_cols = False if self.extra_cols is None else self.extra_cols raw_interactions = dataset.get_raw_interactions(include_extra_cols=extra_cols) + if self.add_unix_ts: + raw_interactions["unix_ts"] = self._convert_to_unix_ts(raw_interactions[Columns.Datetime]) # Exclude val interaction targets from train if needed interactions = raw_interactions @@ -341,7 +351,12 @@ def get_dataloader_recommend(self, dataset: Dataset, batch_size: int) -> DataLoa ) return recommend_dataloader - def transform_dataset_u2i(self, dataset: Dataset, users: ExternalIds) -> Dataset: + def transform_dataset_u2i( + self, + dataset: Dataset, + users: ExternalIds, + context: tp.Optional[pd.DataFrame] = None, + ) -> Dataset: """ Process dataset for u2i recommendations. Filter out interactions and adapt id maps. @@ -354,6 +369,9 @@ def transform_dataset_u2i(self, dataset: Dataset, users: ExternalIds) -> Dataset RecTools dataset. users : ExternalIds Array of external user ids to recommend for. + context : optional(pd.DataFrame), default ``None`` + Optional DataFrame containing additional user context information (e.g., session features, + demographics). Returns ------- @@ -381,6 +399,18 @@ def transform_dataset_u2i(self, dataset: Dataset, users: ExternalIds) -> Dataset # Prepare new user id mapping rec_user_id_map = IdMap.from_values(interactions[Columns.User]) + if context is not None: + if not pd.Series(users).isin(context[Columns.User].unique()).all(): + raise ValueError("No context for some target users") + if context.duplicated(subset=Columns.User).any(): + raise ValueError( + "Duplicated user entries found in context. Each user must have exactly one context row." + ) + context[Columns.Item] = PADDING_VALUE # External index pad element + context = context[context[Columns.User].isin(interactions[Columns.User].unique())] + interactions = pd.concat([interactions, context]) + if self.add_unix_ts: + interactions["unix_ts"] = self._convert_to_unix_ts(interactions[Columns.Datetime]) # Construct dataset # For now features are dropped because model doesn't support them on inference n_filtered = len(users) - rec_user_id_map.size diff --git a/rectools/models/nn/transformers/hstu.py b/rectools/models/nn/transformers/hstu.py new file mode 100644 index 00000000..5e689f05 --- /dev/null +++ b/rectools/models/nn/transformers/hstu.py @@ -0,0 +1,729 @@ +# Copyright 2025 MTS (Mobile Telesystems) +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import typing as tp +import warnings +from typing import Dict + +import torch +from torch import nn + +from ..item_net import ( + CatFeaturesItemNet, + IdEmbeddingsItemNet, + ItemNetBase, + ItemNetConstructorBase, + SumOfEmbeddingsConstructor, +) +from .base import ( + TrainerCallable, + TransformerDataPreparatorType, + TransformerLayersType, + TransformerLightningModule, + TransformerLightningModuleBase, + TransformerModelBase, + TransformerModelConfig, + ValMaskCallable, +) +from .data_preparator import InitKwargs, TransformerDataPreparatorBase +from .negative_sampler import CatalogUniformSampler, TransformerNegativeSamplerBase +from .net_blocks import LearnableInversePositionalEncoding, PositionalEncodingBase, TransformerLayersBase +from .sasrec import SASRecDataPreparator +from .similarity import DistanceSimilarityModule, SimilarityModuleBase +from .torch_backbone import TransformerBackboneBase, TransformerTorchBackbone + + +class RelativeAttentionBias(torch.nn.Module): + """ + Computes relative time and positional attention biases for STU. + + Parameters + ---------- + session_max_len : int + Maximum sequence length for user interactions (padded/truncated) + relative_time_attention : bool + Whether to compute relative time attention from timestamps + relative_pos_attention : bool + Whether to compute relative positional attention + num_buckets : int + Number of buckets for quantizing timestamp differences + """ + + def __init__( + self, + session_max_len: int, + relative_time_attention: bool, + relative_pos_attention: bool, + num_buckets: int = 128, + ) -> None: + super().__init__() + self.session_max_len = session_max_len + self.num_buckets = num_buckets + self.relative_time_attention = relative_time_attention + self.relative_pos_attention = relative_pos_attention + if relative_time_attention: + self.time_weights = torch.nn.Parameter( + torch.empty(num_buckets + 1).normal_(mean=0, std=0.02), + ) + if relative_pos_attention: + self.pos_weights = torch.nn.Parameter( + torch.empty(2 * session_max_len - 1).normal_(mean=0, std=0.02), + ) + + def _quantization_func(self, diff_timestamps: torch.Tensor) -> torch.Tensor: + """Quantizes the differences between timestamps into discrete buckets.""" + return (torch.log(torch.abs(diff_timestamps).clamp(min=1)) / 0.301).long() + + def forward_time_attention(self, all_timestamps: torch.Tensor) -> torch.Tensor: + """ + Parameters + --------- + all_timestamps: torch.Tensor (batch_size, session_max_len+1) + User interaction timestamps including the target item timestamp + Returns + --------- + torch.Tensor (batch_size, session_max_len, session_max_len) + relative time attention + """ + len_expanded = self.session_max_len + 1 # 1 for target item time, needed for time aware + batch_size = all_timestamps.size(0) + extended_timestamps = torch.cat([all_timestamps, all_timestamps[:, len_expanded - 1 : len_expanded]], dim=1) + early_time_binding = extended_timestamps[:, 1:].unsqueeze(2) - extended_timestamps[:, :-1].unsqueeze(1) + bucketed_timestamps = torch.clamp( + self._quantization_func(early_time_binding), + min=0, + max=self.num_buckets, + ).detach() + rel_time_attention = torch.index_select(self.time_weights, dim=0, index=bucketed_timestamps.view(-1)).view( + batch_size, len_expanded, len_expanded + ) + # reducted target time + rel_time_attention = rel_time_attention[:, :-1, :-1] + return rel_time_attention # (batch_size, session_max_len, session_max_len) + + def forward_pos_attention(self) -> torch.Tensor: + """ + Compute and return the relative positional attention bias matrix. + + Returns + ------- + torch.Tensor (1, session_max_len, session_max_len) + """ + n = self.session_max_len + t = nn.functional.pad(self.pos_weights[: 2 * n - 1], [0, n]).repeat(n) + t = t[..., :-n].reshape(1, n, 3 * n - 2) + r = (2 * n - 1) // 2 + rel_pos_attention = t[:, :, r:-r] + return rel_pos_attention + + def forward( + self, + batch: Dict[str, torch.Tensor], + ) -> torch.Tensor: + """ + Compute relative attention biases. + + Parameters + ---------- + batch : Dict[str, torch.Tensor] + Could contain payload information, in particular sequence timestamps. + + Returns + ------- + torch.Tensor (batch_size, session_max_len, session_max_len) + Variate of sum relative pos/time attention + """ + batch_size = batch["x"].size(0) + rel_attn = torch.zeros((batch_size, self.session_max_len, self.session_max_len)).to(batch["x"].device) + if self.relative_time_attention: + rel_attn += self.forward_time_attention(batch["unix_ts"]) + if self.relative_pos_attention: + rel_attn += self.forward_pos_attention() + return rel_attn + + +class STULayer(nn.Module): + """ + HSTU author's encoder block architecture rewritten from jagged tensor to dense. + + Parameters + ---------- + n_factors : int + Latent embeddings size. + n_heads : int + Number of attention heads. + linear_hidden_dim : int + U, V size. + attention_dim : int + Q, K size. + session_max_len : int + Maximum length of user sequence padded or truncated to. + relative_time_attention : bool + Whether to use relative time attention. + relative_pos_attention : bool + Whether to use relative positional attention + attn_dropout_rate : float + Probability of an attention unit to be zeroed. + dropout_rate : float + Probability of a hidden unit to be zeroed. + epsilon : float + A value passed to LayerNorm for numerical stability. + """ + + def __init__( + self, + n_factors: int, + n_heads: int, + linear_hidden_dim: int, + attention_dim: int, + session_max_len: int, + relative_time_attention: bool, + relative_pos_attention: bool, + attn_dropout_rate: float, + dropout_rate: float, + epsilon: float, + ): + super().__init__() + self.rel_attn = RelativeAttentionBias( + session_max_len=session_max_len, + relative_time_attention=relative_time_attention, + relative_pos_attention=relative_pos_attention, + ) + self.n_heads = n_heads + self.linear_hidden_dim = linear_hidden_dim + self.attention_dim = attention_dim + self.session_max_len = session_max_len + self.uvqk_proj: torch.nn.Parameter = torch.nn.Parameter( + torch.empty( + ( + n_factors, + linear_hidden_dim * 2 * n_heads + attention_dim * n_heads * 2, + ) + ), + ) + self.output_mlp = torch.nn.Linear( + in_features=linear_hidden_dim * n_heads, + out_features=n_factors, + ) + self.norm_input = nn.LayerNorm(n_factors, eps=epsilon) + self.norm_attn_output = nn.LayerNorm(linear_hidden_dim * n_heads, eps=epsilon) + self.dropout_mlp = nn.Dropout(dropout_rate) + self.dropout_attn = nn.Dropout(attn_dropout_rate) + self.silu = nn.SiLU() + + def forward( + self, + seqs: torch.Tensor, + batch: Dict[str, torch.Tensor], + attn_mask: torch.Tensor, + timeline_mask: torch.Tensor, + key_padding_mask: tp.Optional[torch.Tensor], + ) -> torch.Tensor: + """ + Forward pass through STU. + + Parameters + ---------- + seqs : torch.Tensor + User sequences of item embeddings. + batch : torch.Tensor + Could contain payload information, in particular sequence timestamps. + attn_mask : torch.Tensor + Mask to use in forward pass of multi-head attention as `attn_mask`. + timeline_mask : torch.Tensor + Mask marked padding items. + key_padding_mask : torch.Tensor, optional + Optional mask to use in forward pass of multi-head attention as `key_padding_mask`. + + + Returns + ------- + torch.Tensor + User sequences passed through transformer layers. + """ + batch_size, _, _ = seqs.shape + normed_x = self.norm_input(seqs) * timeline_mask # prevent null emb convert to not null + general_transform = torch.matmul(normed_x, self.uvqk_proj) + batched_mm_output = self.silu(general_transform) + u, v, q, k = torch.split( + batched_mm_output, + [ + self.linear_hidden_dim * self.n_heads, + self.linear_hidden_dim * self.n_heads, + self.attention_dim * self.n_heads, + self.attention_dim * self.n_heads, + ], + dim=-1, + ) + # (batch_size, n_head, session_max_len, session_max_len), attention on Q, K + qk_attn = torch.einsum( + "bnhd,bmhd->bhnm", + q.view(batch_size, self.session_max_len, self.n_heads, self.attention_dim), + k.view(batch_size, self.session_max_len, self.n_heads, self.attention_dim), + ) + # (batch_size, session_max_len, session_max_len).unsqueeze(1) for broadcast + qk_attn = qk_attn + self.rel_attn(batch).unsqueeze(1) + qk_attn = self.silu(qk_attn) / self.session_max_len + + time_line_mask_reducted = timeline_mask.squeeze(-1) + time_line_mask_fix = time_line_mask_reducted.unsqueeze(1) * timeline_mask + + qk_attn = qk_attn * attn_mask.unsqueeze(0).unsqueeze(0) * time_line_mask_fix.unsqueeze(1) + + attn_output = torch.einsum( + "bhnm,bmhd->bnhd", + qk_attn, + v.reshape(batch_size, self.session_max_len, self.n_heads, self.linear_hidden_dim), + ).reshape(batch_size, self.session_max_len, self.n_heads * self.linear_hidden_dim) + + attn_output = self.dropout_attn(attn_output) + o_input = u * self.norm_attn_output(attn_output) * timeline_mask + + new_outputs = self.output_mlp(self.dropout_mlp(o_input)) + seqs + + return new_outputs + + +class STULayers(TransformerLayersBase): + """ + STULayers transformer blocks. + + Parameters + ---------- + n_blocks : int + Numbers of stacked STU. + n_factors : int + Latent embeddings size. + n_heads : int + Number of attention heads. + linear_hidden_dim : int + U, V size. + attention_dim : int + Q, K size. + session_max_len : int + Maximum length of user sequence padded or truncated to. + relative_time_attention : bool + Whether to use relative time attention. + relative_pos_attention : bool + Whether to use relative positional attention + attn_dropout_rate : float, default 0.2 + Probability of an attention unit to be zeroed. + dropout_rate : float, default 0.2 + Probability of a hidden unit to be zeroed. + epsilon : float, default 1e-6 + A value passed to LayerNorm for numerical stability. + """ + + def __init__( + self, + n_blocks: int, + n_factors: int, + n_heads: int, + linear_hidden_dim: int, + attention_dim: int, + session_max_len: int, + relative_time_attention: bool, + relative_pos_attention: bool, + attn_dropout_rate: float = 0.0, + dropout_rate: float = 0.2, + epsilon: float = 1e-6, + **kwargs: tp.Any, + ): + super().__init__() + self.n_blocks = n_blocks + self.epsilon = epsilon + self.stu_blocks = nn.ModuleList( + [ + STULayer( + n_factors=n_factors, + n_heads=n_heads, + dropout_rate=dropout_rate, + linear_hidden_dim=linear_hidden_dim, + attention_dim=attention_dim, + relative_time_attention=relative_time_attention, + relative_pos_attention=relative_pos_attention, + attn_dropout_rate=attn_dropout_rate, + session_max_len=session_max_len, + epsilon=epsilon, + ) + for _ in range(self.n_blocks) + ] + ) + + def forward( # type: ignore + self, + seqs: torch.Tensor, + timeline_mask: torch.Tensor, + attn_mask: torch.Tensor, + key_padding_mask: tp.Optional[torch.Tensor], + batch: Dict[str, torch.Tensor], + **kwargs: tp.Any, + ) -> torch.Tensor: + """ + Forward pass through STU blocks. + + Parameters + ---------- + seqs : torch.Tensor + User sequences of item embeddings. + timeline_mask : torch.Tensor + Mask indicating padding elements. + attn_mask : torch.Tensor, optional + Mask to use in forward pass of multi-head attention as `attn_mask`. + key_padding_mask : torch.Tensor, optional + Mask to use in forward pass of multi-head attention as `key_padding_mask`. + batch : Dict[str, torch.Tensor] + Could contain payload information,in particular sequence timestamps. + + Returns + ------- + torch.Tensor + User sequences passed through transformer layers. + """ + attn_mask = (~attn_mask).int() + for i in range(self.n_blocks): + seqs *= timeline_mask # [batch_size, session_max_len, n_factors] + seqs = self.stu_blocks[i](seqs, batch, attn_mask, timeline_mask, key_padding_mask) + seqs *= timeline_mask + return seqs + + +class HSTUModelConfig(TransformerModelConfig): + """HSTU model config.""" + + data_preparator_type: TransformerDataPreparatorType = SASRecDataPreparator + transformer_layers_type: TransformerLayersType = STULayers + use_causal_attn: bool = True + relative_time_attention: bool = True + relative_pos_attention: bool = True + + +class HSTUModel(TransformerModelBase[HSTUModelConfig]): + """ + HSTU model: transformer-based sequential model with unidirectional pointwise aggregated attention mechanism, + combined with "Shifted Sequence" training objective. + Our implementation covers multiple loss functions and a variable number of negatives for them. + + References + ---------- + HSTU tutorial: https://rectools.readthedocs.io/en/stable/examples/tutorials/transformers_HSTU_tutorial.html + Original paper: https://arxiv.org/abs/2402.17152 + + + Parameters + ---------- + n_blocks : int, default 2 + Number of transformer blocks. + n_heads : int, default 4 + Number of attention heads. + n_factors : int, default 256 + Latent embeddings size. + dropout_rate : float, default 0.2 + Probability of a hidden unit to be zeroed. + session_max_len : int, default 100 + Maximum length of user sequence. + train_min_user_interactions : int, default 2 + Minimum number of interactions user should have to be used for training. Should be greater + than 1. + loss : {"softmax", "BCE", "gBCE", "sampled_softmax"}, default "softmax" + Loss function. + n_negatives : int, default 1 + Number of negatives for BCE, gBCE and sampled_softmax losses. + gbce_t : float, default 0.2 + Calibration parameter for gBCE loss. + lr : float, default 0.001 + Learning rate. + batch_size : int, default 128 + How many samples per batch to load. + epochs : int, default 3 + Exact number of training epochs. + Will be omitted if `get_trainer_func` is specified. + deterministic : bool, default ``False`` + `deterministic` flag passed to lightning trainer during initialization. + Use `pytorch_lightning.seed_everything` together with this parameter to fix the random seed. + Will be omitted if `get_trainer_func` is specified. + verbose : int, default 0 + Verbosity level. + Enables progress bar, model summary and logging in default lightning trainer when set to a + positive integer. + Will be omitted if `get_trainer_func` is specified. + dataloader_num_workers : int, default 0 + Number of loader worker processes. + use_pos_emb : bool, default ``True`` + If ``True``, learnable positional encoding will be added to session item embeddings. + use_key_padding_mask : bool, default ``False`` + If ``True``, key_padding_mask will be added in Multi-head Attention. + use_causal_attn : bool, default ``True`` + If ``True``, causal mask will be added as attn_mask in Multi-head Attention. Please note that default + SASRec training task ("Shifted Sequence") does not work without causal masking. Set this + parameter to ``False`` only when you change the training task with custom + `data_preparator_type` or if you are absolutely sure of what you are doing. + relative_time_attention : bool + Whether to use relative time attention. + relative_pos_attention : bool + Whether to use relative positional attention + item_net_block_types : sequence of `type(ItemNetBase)`, default `(IdEmbeddingsItemNet, CatFeaturesItemNet)` + Type of network returning item embeddings. + (IdEmbeddingsItemNet,) - item embeddings based on ids. + (CatFeaturesItemNet,) - item embeddings based on categorical features. + (IdEmbeddingsItemNet, CatFeaturesItemNet) - item embeddings based on ids and categorical features. + item_net_constructor_type : type(ItemNetConstructorBase), default `SumOfEmbeddingsConstructor` + Type of item net blocks aggregation constructor. + pos_encoding_type : type(PositionalEncodingBase), default `LearnableInversePositionalEncoding` + Type of positional encoding. + transformer_layers_type : type(TransformerLayersBase), default `STULayers` + Type of transformer layers architecture. + data_preparator_type : type(TransformerDataPreparatorBase), default `HSTUDataPreparator` + Type of data preparator used for dataset processing and dataloader creation. + lightning_module_type : type(TransformerLightningModuleBase), default `TransformerLightningModule` + Type of lightning module defining training procedure. + negative_sampler_type: type(TransformerNegativeSamplerBase), default `CatalogUniformSampler` + Type of negative sampler. + similarity_module_type : type(SimilarityModuleBase), default `DistanceSimilarityModule` + Type of similarity module. + backbone_type : type(TransformerBackboneBase), default `TransformerTorchBackbone` + Type of torch backbone. + get_val_mask_func : Callable, default ``None`` + Function to get validation mask. + get_trainer_func : Callable, default ``None`` + Function for get custom lightning trainer. + If `get_trainer_func` is None, default trainer will be created based on `epochs`, + `deterministic` and `verbose` argument values. Model will be trained for the exact number of + epochs. Checkpointing will be disabled. + If you want to assign custom trainer after model is initialized, you can manually assign new + value to model `_trainer` attribute. + recommend_batch_size : int, default 256 + How many samples per batch to load during `recommend`. + If you want to change this parameter after model is initialized, + you can manually assign new value to model `recommend_batch_size` attribute. + recommend_torch_device : {"cpu", "cuda", "cuda:0", ...}, default ``None`` + String representation for `torch.device` used for model inference. + When set to ``None``, "cuda" will be used if it is available, "cpu" otherwise. + If you want to change this parameter after model is initialized, + you can manually assign new value to model `recommend_torch_device` attribute. + get_val_mask_func_kwargs: optional(InitKwargs), default ``None`` + Additional keyword arguments for the get_val_mask_func. + Make sure all dict values have JSON serializable types. + get_trainer_func_kwargs: optional(InitKwargs), default ``None`` + Additional keyword arguments for the get_trainer_func. + Make sure all dict values have JSON serializable types. + data_preparator_kwargs: optional(dict), default ``None`` + Additional keyword arguments to pass during `data_preparator_type` initialization. + Make sure all dict values have JSON serializable types. + transformer_layers_kwargs: optional(dict), default ``None`` + Additional keyword arguments to pass during `transformer_layers_type` initialization. + Make sure all dict values have JSON serializable types. + item_net_constructor_kwargs optional(dict), default ``None`` + Additional keyword arguments to pass during `item_net_constructor_type` initialization. + Make sure all dict values have JSON serializable types. + pos_encoding_kwargs: optional(dict), default ``None`` + Additional keyword arguments to pass during `pos_encoding_type` initialization. + Make sure all dict values have JSON serializable types. + lightning_module_kwargs: optional(dict), default ``None`` + Additional keyword arguments to pass during `lightning_module_type` initialization. + Make sure all dict values have JSON serializable types. + negative_sampler_kwargs: optional(dict), default ``None`` + Additional keyword arguments to pass during `negative_sampler_type` initialization. + Make sure all dict values have JSON serializable types. + similarity_module_kwargs: optional(dict), default ``None`` + Additional keyword arguments to pass during `similarity_module_type` initialization. + Make sure all dict values have JSON serializable types. + backbone_kwargs: optional(dict), default ``None`` + Additional keyword arguments to pass during `backbone_type` initialization. + Make sure all dict values have JSON serializable types. + Let's add comment about our changes for default module kwargs: + + To precisely follow the original authors implementations of the model, + the following kwargs for specific modules will be replaced from their default versions + used in other Transformer models: + 1)use_scale_factor in pos_encoding_kwargs will be set to True + 2)distance in similarity_module_kwargs will be set to cosine + if not explicitly provided as others options + + """ + + config_class = HSTUModelConfig + + def __init__( # pylint: disable=too-many-arguments, too-many-locals + self, + n_blocks: int = 2, + n_heads: int = 4, + n_factors: int = 256, + dropout_rate: float = 0.2, + session_max_len: int = 100, + train_min_user_interactions: int = 2, + loss: str = "softmax", + n_negatives: int = 1, + gbce_t: float = 0.2, + lr: float = 0.001, + batch_size: int = 128, + epochs: int = 3, + deterministic: bool = False, + verbose: int = 0, + dataloader_num_workers: int = 0, + use_pos_emb: bool = True, + use_key_padding_mask: bool = False, + use_causal_attn: bool = True, + relative_time_attention: bool = True, + relative_pos_attention: bool = True, + item_net_block_types: tp.Sequence[tp.Type[ItemNetBase]] = (IdEmbeddingsItemNet, CatFeaturesItemNet), + item_net_constructor_type: tp.Type[ItemNetConstructorBase] = SumOfEmbeddingsConstructor, + pos_encoding_type: tp.Type[PositionalEncodingBase] = LearnableInversePositionalEncoding, + transformer_layers_type: tp.Type[TransformerLayersBase] = STULayers, + data_preparator_type: tp.Type[TransformerDataPreparatorBase] = SASRecDataPreparator, + lightning_module_type: tp.Type[TransformerLightningModuleBase] = TransformerLightningModule, + negative_sampler_type: tp.Type[TransformerNegativeSamplerBase] = CatalogUniformSampler, + similarity_module_type: tp.Type[SimilarityModuleBase] = DistanceSimilarityModule, + backbone_type: tp.Type[TransformerBackboneBase] = TransformerTorchBackbone, + get_val_mask_func: tp.Optional[ValMaskCallable] = None, + get_trainer_func: tp.Optional[TrainerCallable] = None, + get_val_mask_func_kwargs: tp.Optional[InitKwargs] = None, + get_trainer_func_kwargs: tp.Optional[InitKwargs] = None, + recommend_batch_size: int = 256, + recommend_torch_device: tp.Optional[str] = None, + recommend_use_torch_ranking: bool = True, + recommend_n_threads: int = 0, + data_preparator_kwargs: tp.Optional[InitKwargs] = None, + transformer_layers_kwargs: tp.Optional[InitKwargs] = None, + item_net_constructor_kwargs: tp.Optional[InitKwargs] = None, + pos_encoding_kwargs: tp.Optional[InitKwargs] = None, + lightning_module_kwargs: tp.Optional[InitKwargs] = None, + negative_sampler_kwargs: tp.Optional[InitKwargs] = None, + similarity_module_kwargs: tp.Optional[InitKwargs] = None, + backbone_kwargs: tp.Optional[InitKwargs] = None, + ): + if n_factors % n_heads != 0: + raise ValueError("n_factors must be divisible by n_heads without remainder") + if use_key_padding_mask: + warnings.warn( + "'use_key_padding_mask' is not supported for HSTU and enforced to False.", UserWarning, stacklevel=2 + ) + use_key_padding_mask = False + self.relative_time_attention = relative_time_attention + self.relative_pos_attention = relative_pos_attention + super().__init__( + transformer_layers_type=transformer_layers_type, + data_preparator_type=data_preparator_type, + n_blocks=n_blocks, + n_heads=n_heads, + n_factors=n_factors, + use_pos_emb=use_pos_emb, + use_causal_attn=use_causal_attn, + use_key_padding_mask=use_key_padding_mask, + dropout_rate=dropout_rate, + session_max_len=session_max_len, + dataloader_num_workers=dataloader_num_workers, + batch_size=batch_size, + loss=loss, + n_negatives=n_negatives, + gbce_t=gbce_t, + lr=lr, + epochs=epochs, + verbose=verbose, + deterministic=deterministic, + recommend_batch_size=recommend_batch_size, + recommend_torch_device=recommend_torch_device, + recommend_n_threads=recommend_n_threads, + recommend_use_torch_ranking=recommend_use_torch_ranking, + train_min_user_interactions=train_min_user_interactions, + similarity_module_type=similarity_module_type, + item_net_block_types=item_net_block_types, + item_net_constructor_type=item_net_constructor_type, + pos_encoding_type=pos_encoding_type, + lightning_module_type=lightning_module_type, + negative_sampler_type=negative_sampler_type, + backbone_type=backbone_type, + get_val_mask_func=get_val_mask_func, + get_trainer_func=get_trainer_func, + get_val_mask_func_kwargs=get_val_mask_func_kwargs, + get_trainer_func_kwargs=get_trainer_func_kwargs, + data_preparator_kwargs=data_preparator_kwargs, + transformer_layers_kwargs=transformer_layers_kwargs, + item_net_constructor_kwargs=item_net_constructor_kwargs, + pos_encoding_kwargs=pos_encoding_kwargs, + lightning_module_kwargs=lightning_module_kwargs, + negative_sampler_kwargs=negative_sampler_kwargs, + similarity_module_kwargs=similarity_module_kwargs, + backbone_kwargs=backbone_kwargs, + ) + + def _init_transformer_layers(self) -> TransformerLayersBase: + head_dim = self.n_factors // self.n_heads + return self.transformer_layers_type( + n_blocks=self.n_blocks, + n_factors=self.n_factors, + n_heads=self.n_heads, + session_max_len=self.session_max_len, + attention_dim=head_dim, + linear_hidden_dim=head_dim, + dropout_rate=self.dropout_rate, + relative_time_attention=self.relative_time_attention, + relative_pos_attention=self.relative_pos_attention, + **self._get_kwargs(self.transformer_layers_kwargs), + ) + + def _init_data_preparator(self) -> None: + requires_negatives = self.lightning_module_type.requires_negatives(self.loss) + if self.data_preparator_kwargs is None: + data_preparator_kwargs = {} + else: + data_preparator_kwargs = self.data_preparator_kwargs.copy() + if self.relative_time_attention: + data_preparator_kwargs["add_unix_ts"] = True + self.data_preparator = self.data_preparator_type( + session_max_len=self.session_max_len, + batch_size=self.batch_size, + dataloader_num_workers=self.dataloader_num_workers, + train_min_user_interactions=self.train_min_user_interactions, + negative_sampler=self._init_negative_sampler() if requires_negatives else None, + n_negatives=self.n_negatives if requires_negatives else None, + get_val_mask_func=self.get_val_mask_func, + get_val_mask_func_kwargs=self.get_val_mask_func_kwargs, + **data_preparator_kwargs, + ) + + def _init_similarity_module(self) -> SimilarityModuleBase: + if self.similarity_module_kwargs is None: + similarity_module_kwargs = {} + else: + similarity_module_kwargs = self.similarity_module_kwargs.copy() + if "distance" not in similarity_module_kwargs: + similarity_module_kwargs["distance"] = "cosine" + return self.similarity_module_type(**similarity_module_kwargs) + + def _init_pos_encoding_layer(self) -> PositionalEncodingBase: + if self.pos_encoding_kwargs is None: + pos_encoding_kwargs = {} + else: + pos_encoding_kwargs = self.pos_encoding_kwargs.copy() + if "use_scale_factor" not in pos_encoding_kwargs: + pos_encoding_kwargs["use_scale_factor"] = True + return self.pos_encoding_type( + self.use_pos_emb, + self.session_max_len, + self.n_factors, + **pos_encoding_kwargs, + ) + + @property + def require_recommend_context(self) -> bool: + """ + Indicates whether the model requires context for accurate recommendations. + + ------- + bool + """ + if self.relative_time_attention: + return True + return False diff --git a/rectools/models/nn/transformers/lightning.py b/rectools/models/nn/transformers/lightning.py index 15eeba8c..15e5f7b0 100644 --- a/rectools/models/nn/transformers/lightning.py +++ b/rectools/models/nn/transformers/lightning.py @@ -64,6 +64,8 @@ class TransformerLightningModuleBase(LightningModule): # pylint: disable=too-ma Name of the training loss. val_loss_name : str, default "val_loss" Name of the training loss. + logits_t : float, default 1 + Scale factor for logits. """ u2i_dist_available = [Distance.DOT, Distance.COSINE] @@ -84,6 +86,7 @@ def __init__( train_loss_name: str = "train_loss", val_loss_name: str = "val_loss", adam_betas: tp.Tuple[float, float] = (0.9, 0.98), + logits_t: float = 1, **kwargs: tp.Any, ): super().__init__() @@ -105,6 +108,7 @@ def __init__( self.is_fitted = False self.optimizer: tp.Optional[torch.optim.Adam] = None self.item_embs: torch.Tensor + self.logits_t = logits_t self.save_hyperparameters(ignore=["torch_model", "data_preparator"]) @@ -283,6 +287,8 @@ class TransformerLightningModule(TransformerLightningModuleBase): Name of the training loss. val_loss_name : str, default "val_loss" Name of the training loss. + logits_t : float, default 1 + Scale factor for logits. """ i2i_dist = Distance.COSINE @@ -297,9 +303,9 @@ def get_batch_logits(self, batch: tp.Dict[str, torch.Tensor]) -> torch.Tensor: if self._requires_negatives: y, negatives = batch["y"], batch["negatives"] pos_neg = torch.cat([y.unsqueeze(-1), negatives], dim=-1) - logits = self.torch_model(batch=batch, candidate_item_ids=pos_neg) + logits = self.torch_model(batch=batch, candidate_item_ids=pos_neg) / self.logits_t else: - logits = self.torch_model(batch=batch) + logits = self.torch_model(batch=batch) / self.logits_t return logits def training_step(self, batch: tp.Dict[str, torch.Tensor], batch_idx: int) -> torch.Tensor: diff --git a/rectools/models/nn/transformers/net_blocks.py b/rectools/models/nn/transformers/net_blocks.py index 7e56256a..947b278b 100644 --- a/rectools/models/nn/transformers/net_blocks.py +++ b/rectools/models/nn/transformers/net_blocks.py @@ -70,6 +70,7 @@ def forward( timeline_mask: torch.Tensor, attn_mask: tp.Optional[torch.Tensor], key_padding_mask: tp.Optional[torch.Tensor], + **kwargs: tp.Any, ) -> torch.Tensor: """ Forward pass through transformer blocks. @@ -217,6 +218,7 @@ def forward( timeline_mask: torch.Tensor, attn_mask: tp.Optional[torch.Tensor], key_padding_mask: tp.Optional[torch.Tensor], + **kwargs: tp.Any, ) -> torch.Tensor: """ Forward pass through transformer blocks. @@ -263,6 +265,8 @@ class LearnableInversePositionalEncoding(PositionalEncodingBase): Maximum length of user sequence. n_factors : int Latent embeddings size. + use_scale_factor : int + Use multiplication embedding on the root of the dimension embedding """ def __init__( @@ -270,10 +274,12 @@ def __init__( use_pos_emb: bool, session_max_len: int, n_factors: int, + use_scale_factor: bool = False, **kwargs: tp.Any, ): super().__init__() self.pos_emb = torch.nn.Embedding(session_max_len, n_factors) if use_pos_emb else None + self.use_scale_factor = use_scale_factor def forward(self, sessions: torch.Tensor) -> torch.Tensor: """ @@ -289,8 +295,10 @@ def forward(self, sessions: torch.Tensor) -> torch.Tensor: torch.Tensor Encoded user sessions with added positional encoding if `use_pos_emb` is ``True``. """ - batch_size, session_max_len, _ = sessions.shape + batch_size, session_max_len, n_factors = sessions.shape + if self.use_scale_factor: + sessions = sessions * (n_factors**0.5) if self.pos_emb is not None: # Inverse positions are appropriate for variable length sequences across different batches # They are equal to absolute positions for fixed sequence length across different batches diff --git a/rectools/models/nn/transformers/sasrec.py b/rectools/models/nn/transformers/sasrec.py index a3f0c73b..e99c452c 100644 --- a/rectools/models/nn/transformers/sasrec.py +++ b/rectools/models/nn/transformers/sasrec.py @@ -74,6 +74,11 @@ class SASRecDataPreparator(TransformerDataPreparatorBase): get_val_mask_func_kwargs: optional(InitKwargs), default ``None`` Additional arguments for the get_val_mask_func. Make sure all dict values have JSON serializable types. + extra_cols: list(str) | None, default ``None`` + Additional columns from dataset to keep beside of Columns.Inreractions + add_unix_ts: bool, default ``False`` + Add extra column ``unix_ts`` contains Column.Datetime converted to seconds + from the beginning of the epoch """ train_session_max_len_addition: int = 1 @@ -101,6 +106,14 @@ def _collate_fn_train( batch_dict["negatives"] = self.negative_sampler.get_negatives( batch_dict, lowest_id=self.n_item_extra_tokens, highest_id=self.item_id_map.size ) + if self.add_unix_ts: + t = np.zeros((batch_size, self.session_max_len + 1)) # +1 target item timestamp + for i, (ses, _, extras) in enumerate(batch): + t[i, -len(ses) :] = extras["unix_ts"] + len_to_pad = self.session_max_len + 1 - len(ses) + if len_to_pad > 0: + t[i, :len_to_pad] = t[i, len_to_pad] + batch_dict.update({"unix_ts": torch.LongTensor(t)}) return batch_dict def _collate_fn_val(self, batch: tp.List[BatchElement]) -> Dict[str, torch.Tensor]: @@ -124,11 +137,30 @@ def _collate_fn_val(self, batch: tp.List[BatchElement]) -> Dict[str, torch.Tenso batch_dict["negatives"] = self.negative_sampler.get_negatives( batch_dict, lowest_id=self.n_item_extra_tokens, highest_id=self.item_id_map.size, session_len_limit=1 ) + if self.add_unix_ts: + t = np.zeros((batch_size, self.session_max_len + 1)) # +1 target item timestamp + for i, (ses, _, extras) in enumerate(batch): + t[i, -len(ses) + 1 :] = extras["unix_ts"][1:] + len_to_pad = self.session_max_len + 2 - len(ses) + if len_to_pad > 0: + t[i, :len_to_pad] = t[i, len_to_pad] + batch_dict.update({"unix_ts": torch.LongTensor(t)}) return batch_dict def _collate_fn_recommend(self, batch: tp.List[BatchElement]) -> Dict[str, torch.Tensor]: """Right truncation, left padding to session_max_len""" - x = np.zeros((len(batch), self.session_max_len)) + batch_size = len(batch) + x = np.zeros((batch_size, self.session_max_len)) + if self.add_unix_ts: + t = np.zeros((batch_size, self.session_max_len + 1)) + for i, (ses, _, extras) in enumerate(batch): + ses = ses[:-1] # drop dummy item + x[i, -len(ses) :] = ses[-self.session_max_len :] + t[i, -(len(ses) + 1) :] = extras["unix_ts"][-(self.session_max_len + 1) :] + len_to_pad = self.session_max_len - len(ses) + if len_to_pad > 0: + t[i, :len_to_pad] = t[i, len_to_pad] + return {"x": torch.LongTensor(x), "unix_ts": torch.LongTensor(t)} for i, (ses, _, _) in enumerate(batch): x[i, -len(ses) :] = ses[-self.session_max_len :] return {"x": torch.LongTensor(x)} @@ -242,6 +274,7 @@ def forward( timeline_mask: torch.Tensor, attn_mask: tp.Optional[torch.Tensor], key_padding_mask: tp.Optional[torch.Tensor], + **kwargs: tp.Any, ) -> torch.Tensor: """ Forward pass through transformer blocks. diff --git a/rectools/models/nn/transformers/similarity.py b/rectools/models/nn/transformers/similarity.py index 006f1ba0..1333a203 100644 --- a/rectools/models/nn/transformers/similarity.py +++ b/rectools/models/nn/transformers/similarity.py @@ -95,7 +95,7 @@ def _get_pos_neg_logits( return logits def _get_embeddings_norm(self, embeddings: torch.Tensor) -> torch.Tensor: - embedding_norm = torch.norm(embeddings, p=2, dim=1).unsqueeze(dim=1) + embedding_norm = torch.norm(embeddings, p=2, dim=-1, keepdim=True) embeddings = embeddings / torch.max(embedding_norm, self.epsilon_cosine_dist.to(embeddings)) return embeddings diff --git a/rectools/models/nn/transformers/torch_backbone.py b/rectools/models/nn/transformers/torch_backbone.py index 6a78dc94..c01c29bd 100644 --- a/rectools/models/nn/transformers/torch_backbone.py +++ b/rectools/models/nn/transformers/torch_backbone.py @@ -256,7 +256,7 @@ def encode_sessions(self, batch: tp.Dict[str, torch.Tensor], item_embs: torch.Te attn_mask = self._merge_masks(attn_mask, key_padding_mask, seqs) key_padding_mask = None - seqs = self.transformer_layers(seqs, timeline_mask, attn_mask, key_padding_mask) + seqs = self.transformer_layers(seqs, timeline_mask, attn_mask, key_padding_mask, batch=batch) return seqs def forward( diff --git a/tests/dataset/test_context.py b/tests/dataset/test_context.py new file mode 100644 index 00000000..8807e8b5 --- /dev/null +++ b/tests/dataset/test_context.py @@ -0,0 +1,70 @@ +import re +import typing as tp + +import pandas as pd +import pytest + +from rectools import Columns +from rectools.dataset.context import get_context + + +class TestGetContext: + @pytest.fixture + def context_to_filter(self) -> pd.DataFrame: + df = pd.DataFrame( + [ + [0, 0, 2, "2021-09-01", 1], + [4, 2, 1, "2021-09-02", 1], + [2, 1, 1, "2021-09-02", 1], + [2, 2, 1, "2021-09-03", 1], + [3, 2, 4, "2021-09-03", 1], + [3, 3, 5, "2021-09-03", 1], + [3, 4, 1, "2021-09-04", 1], + [1, 2, 1, "2021-09-04", 1], + [3, 1, 1, "2021-09-05", 1], + [4, 2, 1, "2021-09-05", 1], + [3, 3, 1, "2021-09-06", 1], + ], + columns=[Columns.User, Columns.Item, Columns.Weight, Columns.Datetime, "extra"], + ) + return df + + @pytest.mark.parametrize( + "expected_columns, expected_context", + ( + ( + [Columns.User, Columns.Datetime, Columns.Weight, "extra"], + pd.DataFrame( + [ + [0, 2.0, "2021-09-01", 1], + [1, 1.0, "2021-09-04", 1], + [2, 1, "2021-09-02", 1], + [3, 4.0, "2021-09-03", 1], + [4, 1.0, "2021-09-02", 1], + ], + columns=[Columns.User, Columns.Weight, Columns.Datetime, "extra"], + ).astype({Columns.Datetime: "datetime64[ns]"}), + ), + ), + ) + def test_get_context( + self, + context_to_filter: pd.DataFrame, + expected_columns: tp.List[str], + expected_context: pd.DataFrame, + ) -> None: + + actual = get_context(context_to_filter).reset_index(drop=True) + assert Columns.Item not in actual.columns + assert pd.api.types.is_datetime64_any_dtype(actual[Columns.Datetime]) + assert set(actual.columns.tolist()) == set(expected_columns) + pd.testing.assert_frame_equal(actual, expected_context) + + def test_wrong_type_datetime( + self, + context_to_filter: pd.DataFrame, + ) -> None: + context_to_filter.loc[0, [Columns.Datetime]] = "incorrect type" + error_match = f"Column '{Columns.Datetime}' must be convertible to 'datetime64' type" + with pytest.raises(TypeError, match=re.escape(error_match)): + get_context(context_to_filter) diff --git a/tests/model_selection/test_cross_validate.py b/tests/model_selection/test_cross_validate.py index e449aa3e..1e90f910 100644 --- a/tests/model_selection/test_cross_validate.py +++ b/tests/model_selection/test_cross_validate.py @@ -14,25 +14,33 @@ # pylint: disable=attribute-defined-outside-init +import os import typing as tp import pandas as pd import pytest +import torch from implicit.als import AlternatingLeastSquares +from pytorch_lightning import seed_everything from rectools import Columns, ExternalIds from rectools.dataset import Dataset -from rectools.metrics import Intersection, Precision, Recall +from rectools.dataset.context import get_context +from rectools.metrics import Intersection, Precision, Recall, calc_metrics from rectools.metrics.base import MetricAtK from rectools.model_selection import LastNSplitter, cross_validate from rectools.models import ImplicitALSWrapperModel, PopularModel, RandomModel from rectools.models.base import ModelBase +from rectools.models.nn.transformers.hstu import HSTUModel +os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8" a = pytest.approx class TestCrossValidate: def setup_method(self) -> None: + torch.use_deterministic_algorithms(True) + seed_everything(32, workers=True) interactions_df = pd.DataFrame( [ [10, 11, 1, 101], @@ -373,3 +381,74 @@ def test_happy_path_with_intersection( } assert actual == expected + + @pytest.mark.parametrize( + "as_ref_model,expected_metrics", + ( + ( + False, + [ + {"model": "hstu", "i_split": 0, "precision@2": 0.375, "recall@1": 0.0}, + ], + ), + ( + True, + [ + {"model": "hstu", "i_split": 0, "precision@2": 0.375, "recall@1": 0.0}, + ], + ), + ), + ) + def test_context_preprocessing( + self, + as_ref_model: bool, + expected_metrics: tp.List[tp.Dict[str, tp.Any]], + ) -> None: + splitter = LastNSplitter(n=1, n_splits=1, filter_cold_items=False, filter_already_seen=False) + models = {"hstu": HSTUModel()} + ref_models = [] + if as_ref_model: + ref_models = ["hstu"] + actual_cv = cross_validate( + dataset=self.dataset, + splitter=splitter, + metrics=self.metrics, + models=models, # type: ignore[arg-type] + k=2, + filter_viewed=False, + ref_models=ref_models, + validate_ref_models=True, + ) + hstu_no_envelope = HSTUModel() + (train_ids, test_ids, split_info) = next(splitter.split(self.dataset.interactions, collect_fold_stats=False)) + train = self.dataset.filter_interactions( + row_indexes_to_keep=train_ids, + keep_external_ids=True, + ) + test = self.dataset.interactions.df.loc[test_ids] + test[Columns.User] = self.dataset.user_id_map.convert_to_external(test[Columns.User]) + test[Columns.Item] = self.dataset.item_id_map.convert_to_external(test[Columns.Item]) + test_users = test[Columns.User].unique() + train_external = train.get_raw_interactions() + + hstu_no_envelope.fit(train) + reco = hstu_no_envelope.recommend( + users=test_users, + dataset=train, + k=2, + filter_viewed=False, + on_unsupported_targets="warn", + context=get_context(test), + ) + metric_values = calc_metrics( + self.metrics, + reco=reco, + interactions=test, + prev_interactions=train_external, + catalog=train_external[Columns.Item].unique(), + ) + res_no_env = {"model": "hstu", "i_split": split_info["i_split"]} + res_no_env.update(metric_values) + metrics_no_env = [res_no_env] + assert actual_cv["metrics"] == expected_metrics + assert actual_cv["metrics"] == metrics_no_env diff --git a/tests/models/nn/transformers/test_bert4rec.py b/tests/models/nn/transformers/test_bert4rec.py index c6ad64d2..e78f3e9d 100644 --- a/tests/models/nn/transformers/test_bert4rec.py +++ b/tests/models/nn/transformers/test_bert4rec.py @@ -634,8 +634,8 @@ def __init__( train_min_user_interactions=train_min_user_interactions, negative_sampler=negative_sampler, shuffle_train=shuffle_train, - get_val_mask_func=get_custom_val_mask_func, - get_val_mask_func_kwargs=get_custom_val_mask_func_kwargs, + get_val_mask_func=get_val_mask_func, + get_val_mask_func_kwargs=get_val_mask_func_kwargs, mask_prob=mask_prob, ) self.n_last_targets = n_last_targets diff --git a/tests/models/nn/transformers/test_hstu.py b/tests/models/nn/transformers/test_hstu.py new file mode 100644 index 00000000..78bef0b6 --- /dev/null +++ b/tests/models/nn/transformers/test_hstu.py @@ -0,0 +1,592 @@ +import re +import typing as tp +import warnings + +import numpy as np +import pandas as pd +import pytest +import torch +from pytorch_lightning import Trainer, seed_everything +from pytorch_lightning.loggers import CSVLogger + +from rectools.columns import Columns +from rectools.dataset import Dataset +from rectools.dataset.context import get_context +from rectools.models import HSTUModel +from rectools.models.nn.item_net import IdEmbeddingsItemNet, SumOfEmbeddingsConstructor +from rectools.models.nn.transformers.base import LearnableInversePositionalEncoding, TransformerLightningModule +from rectools.models.nn.transformers.hstu import STULayers +from rectools.models.nn.transformers.negative_sampler import CatalogUniformSampler +from rectools.models.nn.transformers.sasrec import SASRecDataPreparator +from rectools.models.nn.transformers.similarity import DistanceSimilarityModule +from rectools.models.nn.transformers.torch_backbone import TransformerTorchBackbone +from rectools.models.nn.transformers.utils import leave_one_out_mask +from tests.models.data import DATASET +from tests.models.utils import assert_default_config_and_default_model_params_are_the_same + +from .utils import custom_trainer + + +class TestHSTUModel: + def setup_method(self) -> None: + self._seed_everything() + + def _seed_everything(self) -> None: + torch.use_deterministic_algorithms(True) + seed_everything(32, workers=True) + + @pytest.fixture + def dataset_devices(self) -> Dataset: + interactions_df = pd.DataFrame( + [ + [10, 13, 1, "2021-11-30"], + [10, 11, 1, "2021-11-29"], + [10, 12, 1, "2021-11-29"], + [30, 11, 1, "2021-11-27"], + [30, 13, 2, "2021-11-26"], + [40, 11, 1, "2021-11-25"], + [50, 13, 1, "2021-11-25"], + [10, 13, 1, "2021-11-27"], + [20, 13, 9, "2021-11-28"], + ], + columns=Columns.Interactions, + ) + return Dataset.construct(interactions_df) + + @pytest.fixture + def context_df(self) -> pd.DataFrame: + # "2021-12-12" generation moment simulation + df = pd.DataFrame( + { + Columns.User: [10, 20, 30, 40, 50], + Columns.Datetime: ["2021-12-12", "2021-12-12", "2021-12-12", "2021-12-12", "2021-12-12"], + } + ) + return df + + @pytest.mark.parametrize( + "accelerator,n_devices,recommend_torch_device", + [ + ("cpu", 1, "cpu"), + pytest.param( + "cpu", + 1, + "cuda", + marks=pytest.mark.skipif(torch.cuda.is_available() is False, reason="GPU is not available"), + ), + ], + ) + @pytest.mark.parametrize( + "relative_time_attention,relative_pos_attention,expected_reco", + ( + ( + True, + True, + pd.DataFrame( + { + Columns.User: [30, 40, 40], + Columns.Item: [12, 12, 13], + Columns.Rank: [1, 1, 2], + } + ), + ), + ( + False, + True, + pd.DataFrame( + { + Columns.User: [30, 40, 40], + Columns.Item: [12, 13, 12], + Columns.Rank: [1, 1, 2], + } + ), + ), + ( + True, + False, + pd.DataFrame( + { + Columns.User: [30, 40, 40], + Columns.Item: [12, 12, 13], + Columns.Rank: [1, 1, 2], + } + ), + ), + ( + False, + False, + pd.DataFrame( + { + Columns.User: [30, 40, 40], + Columns.Item: [12, 13, 12], + Columns.Rank: [1, 1, 2], + } + ), + ), + ), + ) + def test_u2i( + self, + dataset_devices: Dataset, + context_df: pd.DataFrame, + accelerator: str, + n_devices: int, + recommend_torch_device: str, + relative_time_attention: bool, + relative_pos_attention: bool, + expected_reco: pd.DataFrame, + ) -> None: + self.setup_method() + + def get_trainer() -> Trainer: + return Trainer( + max_epochs=2, + min_epochs=2, + deterministic=True, + devices=n_devices, + accelerator=accelerator, + enable_checkpointing=False, + logger=CSVLogger("test_logs"), + ) + + model = HSTUModel( + n_factors=32, + n_blocks=2, + n_heads=1, + session_max_len=4, + lr=0.001, + batch_size=4, + epochs=2, + deterministic=True, + relative_pos_attention=relative_pos_attention, + relative_time_attention=relative_time_attention, + recommend_torch_device=recommend_torch_device, + item_net_block_types=(IdEmbeddingsItemNet,), + get_trainer_func=get_trainer, + similarity_module_type=DistanceSimilarityModule, + ) + model.fit(dataset=dataset_devices) + users = np.array([10, 30, 40]) + if model.require_recommend_context: + context = get_context(context_df) + else: + context = None + if relative_time_attention: + error_match = re.escape( + "This model requires `context` to be provided for recommendations generation " + f"(model.require_recommend_context is {model.require_recommend_context})." + "Check docs and examples for details." + ) + with pytest.raises(ValueError, match=error_match): + model.recommend(users=users, dataset=dataset_devices, k=3, filter_viewed=True, context=None) + actual = model.recommend(users=users, dataset=dataset_devices, k=3, filter_viewed=True, context=context) + pd.testing.assert_frame_equal(actual.drop(columns=Columns.Score), expected_reco) + pd.testing.assert_frame_equal( + actual.sort_values([Columns.User, Columns.Score], ascending=[True, False]).reset_index(drop=True), + actual, + ) + + @pytest.mark.parametrize( + "target_users,context,expected_reco", + ( + ( + [10, 30, 40], + pd.DataFrame( + { + Columns.User: [10, 20, 30, 40, 50], + Columns.Datetime: ["2021-12-12", "2021-12-12", "2021-12-12", "2021-12-12", "2021-12-12"], + } + ), + pd.DataFrame( + { + Columns.User: [30, 40, 40], + Columns.Item: [12, 12, 13], + Columns.Rank: [1, 1, 2], + } + ), + ), + ( + [10, 30, 40], + pd.DataFrame( + { + Columns.User: [10, 30, 40, 30, 40], + Columns.Datetime: ["2021-12-12", "2021-12-12", "2021-12-12", "2020-01-01", "2022-01-01"], + } + ), + pd.DataFrame( + { + Columns.User: [30, 40, 40], + Columns.Item: [12, 12, 13], + Columns.Rank: [1, 1, 2], + } + ), + ), + ( + [10, 30, 40], + pd.DataFrame( + { + Columns.User: [10, 30, 40, 30, 40], # Added some timestamps just to show that it changes reco + Columns.Datetime: ["2021-12-12", "2021-12-12", "2021-12-12", "2000-01-01", "2000-01-01"], + } + ), + pd.DataFrame( + { + Columns.User: [30, 40, 40], + Columns.Item: [12, 13, 12], + Columns.Rank: [1, 1, 2], + } + ), + ), + ( + [10, 30, 40], + pd.DataFrame( + { + Columns.User: [10, 30, 40, 30, 40, 40], + Columns.Datetime: [ + "2021-12-12", + "2021-12-12", + "2021-12-12", + "2000-01-01", + "2000-01-01", + "2001-01-01", + ], + } + ), + None, + ), + ( + [10, 30, 40], + pd.DataFrame( + { + Columns.User: [10, 40, 50], + Columns.Datetime: ["2021-12-12", "2021-12-12", "2021-12-12"], + } + ), + None, + ), + ( + [10, 30, 40], + pd.DataFrame( + { + Columns.User: [10, 30, 50], + Columns.Datetime: ["2021-12-12", "2021-12-12", "2021-12-12"], + } + ), + None, + ), + ), + ) + def test_u2i_context_preproc( + self, + dataset_devices: Dataset, + target_users: tp.List[int], + context: pd.DataFrame, + expected_reco: tp.Optional[pd.DataFrame], + ) -> None: + self.setup_method() + + def get_trainer() -> Trainer: + return Trainer( + max_epochs=2, + min_epochs=2, + deterministic=True, + devices=1, + accelerator="cpu", + enable_checkpointing=False, + logger=CSVLogger("test_logs"), + ) + + model = HSTUModel( + n_factors=32, + n_blocks=2, + n_heads=1, + session_max_len=4, + lr=0.001, + batch_size=4, + epochs=2, + deterministic=True, + relative_pos_attention=False, + relative_time_attention=True, + recommend_torch_device="cpu", + item_net_block_types=(IdEmbeddingsItemNet,), + get_trainer_func=get_trainer, + similarity_module_type=DistanceSimilarityModule, + ) + model.fit(dataset=dataset_devices) + if context.duplicated(subset=Columns.User).any(): + error_match = "Duplicated user entries found in context. Each user must have exactly one context row." + with pytest.raises(ValueError, match=error_match): + model.recommend(users=target_users, dataset=dataset_devices, k=3, filter_viewed=True, context=context) + elif not pd.Series(target_users).isin(context[Columns.User].unique()).all(): + error_match = "No context for some target users" + with pytest.raises(ValueError, match=error_match): + model.recommend(users=target_users, dataset=dataset_devices, k=3, filter_viewed=True, context=context) + else: + context = get_context(context) # guarantees correct context preprocessing + actual = model.recommend( + users=target_users, dataset=dataset_devices, k=3, filter_viewed=True, context=context + ) + pd.testing.assert_frame_equal(actual.drop(columns=Columns.Score), expected_reco) + pd.testing.assert_frame_equal( + actual.sort_values([Columns.User, Columns.Score], ascending=[True, False]).reset_index(drop=True), + actual, + ) + + +class TestHSTUModelConfiguration: + def setup_method(self) -> None: + self._seed_everything() + + def _seed_everything(self) -> None: + torch.use_deterministic_algorithms(True) + seed_everything(32, workers=True) + + @pytest.fixture + def context_df(self) -> pd.DataFrame: + # "2021-12-12" generation moment simulation + df = pd.DataFrame( + { + Columns.User: [10, 20, 30, 40, 50], + Columns.Datetime: ["2021-12-12", "2021-12-12", "2021-12-12", "2021-12-12", "2021-12-12"], + } + ) + return df + + @pytest.fixture + def initial_config(self) -> tp.Dict[str, tp.Any]: + config = { + "n_blocks": 2, + "relative_time_attention": True, + "relative_pos_attention": True, + "n_heads": 4, + "n_factors": 64, + "use_pos_emb": True, + "use_causal_attn": True, + "use_key_padding_mask": False, + "dropout_rate": 0.5, + "session_max_len": 10, + "dataloader_num_workers": 0, + "batch_size": 1024, + "loss": "softmax", + "n_negatives": 10, + "gbce_t": 0.5, + "lr": 0.001, + "epochs": 10, + "verbose": 1, + "deterministic": True, + "recommend_torch_device": None, + "recommend_batch_size": 256, + "train_min_user_interactions": 2, + "item_net_block_types": (IdEmbeddingsItemNet,), + "item_net_constructor_type": SumOfEmbeddingsConstructor, + "pos_encoding_type": LearnableInversePositionalEncoding, + "transformer_layers_type": STULayers, + "data_preparator_type": SASRecDataPreparator, + "lightning_module_type": TransformerLightningModule, + "negative_sampler_type": CatalogUniformSampler, + "similarity_module_type": DistanceSimilarityModule, + "backbone_type": TransformerTorchBackbone, + "get_val_mask_func": leave_one_out_mask, + "get_trainer_func": None, + "get_val_mask_func_kwargs": None, + "get_trainer_func_kwargs": None, + "data_preparator_kwargs": None, + "transformer_layers_kwargs": None, + "item_net_constructor_kwargs": None, + "pos_encoding_kwargs": None, + "lightning_module_kwargs": None, + "negative_sampler_kwargs": None, + "similarity_module_kwargs": None, + "backbone_kwargs": None, + } + return config + + @pytest.fixture + def dataset(self) -> Dataset: + interactions_df = pd.DataFrame( + [ + [10, 13, 1, "2021-11-30"], + [10, 11, 1, "2021-11-29"], + [10, 12, 1, "2021-11-29"], + [30, 11, 1, "2021-11-27"], + [30, 12, 2, "2021-11-26"], + [30, 15, 1, "2021-11-25"], + [40, 11, 1, "2021-11-25"], + [40, 17, 1, "2021-11-26"], + [50, 16, 1, "2021-11-25"], + [10, 14, 1, "2021-11-28"], + [10, 16, 1, "2021-11-27"], + [20, 13, 9, "2021-11-28"], + ], + columns=Columns.Interactions, + ) + return Dataset.construct(interactions_df) + + @pytest.mark.parametrize("use_key_padding_mask", (True, False)) + def test_warn_when_use_key_padding_mask(self, use_key_padding_mask: bool) -> None: + with warnings.catch_warnings(record=True) as w: + HSTUModel(use_key_padding_mask=use_key_padding_mask) + if use_key_padding_mask: + assert len(w) == 1 + assert "'use_key_padding_mask' is not supported for HSTU and enforced to False." in str(w[-1].message) + + @pytest.mark.parametrize("n_heads", (2, 3)) + @pytest.mark.parametrize("n_factors", (9, 10)) + def test_raises_when_incorrect_n_heads(self, n_heads: int, n_factors: int) -> None: + if n_factors % n_heads != 0: + error_match = "n_factors must be divisible by n_heads without remainder" + with pytest.raises(ValueError, match=error_match): + HSTUModel(n_heads=n_heads, n_factors=n_factors) + + @pytest.mark.parametrize( + "similarity_module_kwargs,pos_encoding_kwargs,data_preparator_kwargs", + ( + ( + None, + None, + None, + ), + ( + {"distance": "dot"}, + {"use_scale_factor": False}, + {"add_unix_ts": False}, + ), + ), + ) + def test_kwargs_preproc_hstu( + self, + dataset: Dataset, + similarity_module_kwargs: tp.Optional[tp.Dict[str, tp.Any]], + pos_encoding_kwargs: tp.Optional[tp.Dict[str, tp.Any]], + data_preparator_kwargs: tp.Optional[tp.Dict[str, tp.Any]], + ) -> None: + + def get_kwargs(actual_kwargs: tp.Optional[tp.Dict[str, tp.Any]]) -> tp.Dict[str, tp.Any]: + kwargs = {} + if actual_kwargs is not None: + kwargs = actual_kwargs + return kwargs + + n_factors = 32 + config = { + "n_factors": n_factors, + "n_heads": 4, + "relative_time_attention": True, # if true add_unix_ts forced to True + "similarity_module_kwargs": similarity_module_kwargs, + "pos_encoding_kwargs": pos_encoding_kwargs, + "data_preparator_kwargs": data_preparator_kwargs, + } + + model = HSTUModel.from_config(config) + similarity_module_kwargs = get_kwargs(similarity_module_kwargs) + pos_encoding_kwargs = get_kwargs(pos_encoding_kwargs) + data_preparator_kwargs = get_kwargs(data_preparator_kwargs) + if not pos_encoding_kwargs: + pos_encoding_kwargs["use_scale_factor"] = True + if not similarity_module_kwargs: + similarity_module_kwargs["distance"] = "cosine" + if not similarity_module_kwargs: + data_preparator_kwargs["add_unix_ts"] = True + model.fit(dataset) # creating all instances + for key, config_value in similarity_module_kwargs.items(): + assert getattr(model.lightning_model.torch_model.similarity_module, key) == config_value + for key, config_value in pos_encoding_kwargs.items(): + assert getattr(model.lightning_model.torch_model.pos_encoding_layer, key) == config_value + for key, config_value in data_preparator_kwargs.items(): + if key == "add_unix_ts": + assert getattr(model.data_preparator, key) is True + + @pytest.mark.parametrize("use_custom_trainer", (True, False)) + def test_from_config(self, initial_config: tp.Dict[str, tp.Any], use_custom_trainer: bool) -> None: + config = initial_config + if use_custom_trainer: + config["get_trainer_func"] = custom_trainer + model = HSTUModel.from_config(initial_config) + + for key, config_value in initial_config.items(): + assert getattr(model, key) == config_value + + assert model._trainer is not None # pylint: disable = protected-access + + @pytest.mark.parametrize("use_custom_trainer", (True, False)) + @pytest.mark.parametrize("simple_types", (False, True)) + def test_get_config( + self, simple_types: bool, initial_config: tp.Dict[str, tp.Any], use_custom_trainer: bool + ) -> None: + config = initial_config + if use_custom_trainer: + config["get_trainer_func"] = custom_trainer + model = HSTUModel(**config) + actual = model.get_config(simple_types=simple_types) + + expected = config.copy() + expected["cls"] = HSTUModel + + if simple_types: + simple_types_params = { + "cls": "HSTUModel", + "item_net_block_types": ["rectools.models.nn.item_net.IdEmbeddingsItemNet"], + "item_net_constructor_type": "rectools.models.nn.item_net.SumOfEmbeddingsConstructor", + "pos_encoding_type": "rectools.models.nn.transformers.net_blocks.LearnableInversePositionalEncoding", + "transformer_layers_type": "rectools.models.nn.transformers.hstu.STULayers", + "data_preparator_type": "rectools.models.nn.transformers.sasrec.SASRecDataPreparator", + "lightning_module_type": "rectools.models.nn.transformers.lightning.TransformerLightningModule", + "negative_sampler_type": "rectools.models.nn.transformers.negative_sampler.CatalogUniformSampler", + "get_val_mask_func": "rectools.models.nn.transformers.utils.leave_one_out_mask", + "similarity_module_type": "rectools.models.nn.transformers.similarity.DistanceSimilarityModule", + "backbone_type": "rectools.models.nn.transformers.torch_backbone.TransformerTorchBackbone", + } + expected.update(simple_types_params) + if use_custom_trainer: + expected["get_trainer_func"] = "tests.models.nn.transformers.utils.custom_trainer" + + assert actual == expected + + @pytest.mark.parametrize("use_custom_trainer", (True, False)) + @pytest.mark.parametrize("simple_types", (False, True)) + def test_get_config_and_from_config_compatibility( + self, + context_df: pd.DataFrame, + simple_types: bool, + initial_config: tp.Dict[str, tp.Any], + use_custom_trainer: bool, + ) -> None: + dataset = DATASET + model = HSTUModel + updated_params = { + "n_blocks": 1, + "n_heads": 1, + "n_factors": 10, + "session_max_len": 5, + "epochs": 1, + } + config = initial_config.copy() + config.update(updated_params) + if use_custom_trainer: + config["get_trainer_func"] = custom_trainer + + def get_reco(model: HSTUModel) -> pd.DataFrame: + return model.fit(dataset).recommend( + users=np.array([10, 20]), + dataset=dataset, + k=2, + filter_viewed=False, + context=get_context(context_df), + ) + + model_1 = model.from_config(initial_config) + reco_1 = get_reco(model_1) + config_1 = model_1.get_config(simple_types=simple_types) + + self._seed_everything() + model_2 = model.from_config(config_1) + reco_2 = get_reco(model_2) + config_2 = model_2.get_config(simple_types=simple_types) + + assert config_1 == config_2 + pd.testing.assert_frame_equal(reco_1, reco_2) + + def test_default_config_and_default_model_params_are_the_same(self) -> None: + default_config: tp.Dict[str, int] = {} + model = HSTUModel() + assert_default_config_and_default_model_params_are_the_same(model, default_config) diff --git a/tests/models/nn/transformers/test_sasrec.py b/tests/models/nn/transformers/test_sasrec.py index a5eaad87..9cb6e658 100644 --- a/tests/models/nn/transformers/test_sasrec.py +++ b/tests/models/nn/transformers/test_sasrec.py @@ -239,7 +239,7 @@ def get_trainer() -> Trainer: pd.DataFrame( { Columns.User: [10, 10, 10, 30, 30, 30, 40, 40, 40], - Columns.Item: [12, 13, 11, 11, 12, 14, 12, 14, 11], + Columns.Item: [13, 12, 11, 11, 12, 14, 14, 12, 11], Columns.Rank: [1, 2, 3, 1, 2, 3, 1, 2, 3], } ), @@ -344,7 +344,7 @@ def get_trainer() -> Trainer: pd.DataFrame( { Columns.User: [10, 10, 30, 30, 30, 40, 40, 40], - Columns.Item: [17, 15, 13, 14, 17, 13, 14, 15], + Columns.Item: [17, 15, 13, 17, 14, 13, 14, 15], Columns.Rank: [1, 2, 1, 2, 3, 1, 2, 3], } ), @@ -355,7 +355,7 @@ def get_trainer() -> Trainer: pd.DataFrame( { Columns.User: [10, 10, 30, 30, 30, 40, 40, 40], - Columns.Item: [17, 15, 13, 14, 17, 13, 14, 15], + Columns.Item: [17, 15, 13, 17, 14, 13, 14, 15], Columns.Rank: [1, 2, 1, 2, 3, 1, 2, 3], } ), @@ -366,7 +366,7 @@ def get_trainer() -> Trainer: pd.DataFrame( { Columns.User: [10, 10, 30, 30, 30, 40, 40, 40], - Columns.Item: [17, 15, 13, 14, 17, 13, 14, 15], + Columns.Item: [17, 15, 13, 17, 14, 13, 14, 15], Columns.Rank: [1, 2, 1, 2, 3, 1, 2, 3], } ), @@ -411,9 +411,9 @@ def test_u2i_losses( ( pd.DataFrame( { - Columns.User: [10, 10, 10, 30, 30, 30, 40, 40, 40], - Columns.Item: [13, 17, 11, 11, 13, 15, 17, 13, 11], - Columns.Rank: [1, 2, 3, 1, 2, 3, 1, 2, 3], + Columns.User: [30, 30, 30, 40, 40, 40], + Columns.Item: [11, 13, 17, 17, 13, 11], + Columns.Rank: [1, 2, 3, 1, 2, 3], } ), ), @@ -439,7 +439,7 @@ def test_u2i_with_key_and_attn_masks( similarity_module_type=DistanceSimilarityModule, ) model.fit(dataset=dataset) - users = np.array([10, 30, 40]) + users = np.unique(expected[Columns.User]) actual = model.recommend(users=users, dataset=dataset, k=3, filter_viewed=False) pd.testing.assert_frame_equal(actual.drop(columns=Columns.Score), expected) pd.testing.assert_frame_equal( @@ -452,9 +452,9 @@ def test_u2i_with_key_and_attn_masks( ( pd.DataFrame( { - Columns.User: [10, 10, 10, 30, 30, 30, 40, 40, 40], - Columns.Item: [13, 12, 11, 11, 12, 13, 13, 14, 12], - Columns.Rank: [1, 2, 3, 1, 2, 3, 1, 2, 3], + Columns.User: [30, 30, 30, 40, 40, 40], + Columns.Item: [11, 13, 12, 13, 14, 12], + Columns.Rank: [1, 2, 3, 1, 2, 3], } ), ), @@ -480,7 +480,7 @@ def test_u2i_with_item_features( similarity_module_type=DistanceSimilarityModule, ) model.fit(dataset=dataset_item_features) - users = np.array([10, 30, 40]) + users = np.unique(expected[Columns.User]) actual = model.recommend(users=users, dataset=dataset_item_features, k=3, filter_viewed=False) pd.testing.assert_frame_equal(actual.drop(columns=Columns.Score), expected) pd.testing.assert_frame_equal( @@ -791,6 +791,28 @@ def dataset(self) -> Dataset: ) return Dataset.construct(interactions_df) + @pytest.fixture + def dataset_timestamp_preproc(self) -> Dataset: + interactions_df = pd.DataFrame( + [ + [10, 13, 1, "2021-11-30"], + [10, 11, 1, "2021-11-29"], + [10, 12, 1, "2021-11-29"], + [30, 11, 1, "2021-11-27"], + [30, 12, 2, "2021-11-26"], + [30, 15, 1, "2021-11-25"], + [40, 11, 1, "2021-11-25"], + [40, 17, 1, "2021-11-26"], + [50, 16, 1, "2021-11-25"], + [10, 14, 1, "2021-11-28"], + [10, 16, 1, "2021-11-27"], + [20, 13, 9, "2021-11-28"], + [10, 17, 1, "2021-11-30"], + ], + columns=Columns.Interactions, + ) + return Dataset.construct(interactions_df) + @pytest.fixture def data_preparator(self) -> SASRecDataPreparator: return SASRecDataPreparator(session_max_len=3, batch_size=4, dataloader_num_workers=0) @@ -817,6 +839,68 @@ def get_val_mask(interactions: pd.DataFrame, val_users: ExternalIds) -> np.ndarr get_val_mask_func=get_val_mask_func, ) + @pytest.mark.parametrize( + "val_users, expected_batch_train, expected_batch_val", + ( + ( + [10, 30], + { + "x": torch.tensor([[5, 2, 3], [0, 0, 1], [0, 0, 2]]), + "y": torch.tensor([[2, 3, 6], [0, 0, 3], [0, 0, 4]]), + "yw": torch.tensor([[1.0, 1.0, 1.0], [0.0, 0.0, 2.0], [0.0, 0.0, 1.0]]), + "unix_ts": torch.tensor( + [ + [1638057600, 1638144000, 1638144000, 1638230400], + [1637798400, 1637798400, 1637798400, 1637884800], + [1637798400, 1637798400, 1637798400, 1637884800], + ] + ), + }, + { + "x": torch.tensor([[0, 1, 3], [2, 3, 6]]), + "y": torch.tensor([[2], [4]]), + "yw": torch.tensor([[1.0], [1.0]]), + "unix_ts": torch.tensor( + [ + [1637884800, 1637884800, 1637884800, 1637971200], + [1638144000, 1638144000, 1638230400, 1638230400], + ] + ), + }, + ), + ), + ) + def test_process_unix_ts_aware( + self, + dataset_timestamp_preproc: Dataset, + val_users: tp.List, + expected_batch_train: tp.Dict[str, torch.Tensor], + expected_batch_val: tp.Dict[str, torch.Tensor], + ) -> None: + get_val_mask_func_kwargs = {"val_users": val_users} + data_preparator = SASRecDataPreparator( + session_max_len=3, + batch_size=4, + dataloader_num_workers=0, + add_unix_ts=True, + get_val_mask_func=leave_one_out_mask, + get_val_mask_func_kwargs=get_val_mask_func_kwargs, + ) + data_preparator.process_dataset_train(dataset_timestamp_preproc) + assert "unix_ts" in data_preparator.train_dataset.interactions.df + assert data_preparator.val_interactions is not None + assert "unix_ts" in data_preparator.val_interactions + dataloader_train = data_preparator.get_dataloader_train() + train_iterator = next(iter(dataloader_train)) + for key, value in train_iterator.items(): + assert torch.equal(value, expected_batch_train[key]) + dataloader_val = data_preparator.get_dataloader_val() + assert dataloader_val is not None + val_iterator = next(iter(dataloader_val)) + for key, value in val_iterator.items(): + if key == "unix_ts": + assert torch.equal(value, expected_batch_val[key]) + @pytest.mark.parametrize( "expected_user_id_map, expected_item_id_map, expected_train_interactions, expected_val_interactions", ( @@ -1025,7 +1109,6 @@ def test_get_config( expected.update(simple_types_params) if use_custom_trainer: expected["get_trainer_func"] = "tests.models.nn.transformers.utils.custom_trainer" - assert actual == expected @pytest.mark.parametrize("use_custom_trainer", (True, False)) diff --git a/tests/models/test_base.py b/tests/models/test_base.py index 02c6bbee..db862358 100644 --- a/tests/models/test_base.py +++ b/tests/models/test_base.py @@ -28,6 +28,7 @@ from rectools import Columns from rectools.dataset import Dataset +from rectools.dataset.context import get_context from rectools.exceptions import NotFittedError from rectools.models.base import ( ErrorBehaviour, @@ -55,6 +56,20 @@ def test_raise_when_recommend_u2i_from_not_fitted() -> None: ) +def test_warning_when_recommend_u2i_has_context() -> None: + model: ModelBase[ModelConfig] = ModelBase() + model.is_fitted = True + context_df = DATASET.get_raw_interactions()[[Columns.User, Columns.Datetime]] + context_df[Columns.Datetime] = "2025-12-12" # for example + with pytest.warns() as record: + model.recommend(users=np.array([]), dataset=DATASET, k=5, filter_viewed=False, context=get_context(context_df)) + + assert ( + str(record[0].message) + == "You are providing context to a model that does not require it. Context is set to 'None'" + ) + + def test_raise_when_recommend_i2i_from_not_fitted() -> None: model: ModelBase[ModelConfig] = ModelBase() with pytest.raises(NotFittedError): diff --git a/tests/test_compat.py b/tests/test_compat.py index 984e51cc..fc439e27 100644 --- a/tests/test_compat.py +++ b/tests/test_compat.py @@ -19,6 +19,7 @@ from rectools.compat import ( BERT4RecModel, DSSMModel, + HSTUModel, ItemToItemAnnRecommender, ItemToItemVisualApp, LightFMWrapperModel, @@ -33,6 +34,7 @@ @pytest.mark.parametrize( "model", ( + HSTUModel, DSSMModel, SASRecModel, BERT4RecModel,