diff --git a/README.md b/README.md index acf1060718..51e24bdf95 100644 --- a/README.md +++ b/README.md @@ -1,144 +1,14 @@ -|
:information_source: **[Announcement: Porting Smartstore to cross-platform ASP.NET Core 5!](https://github.com/smartstore/Smartstore)**
| -| --- | -| We are currently working hard on porting Smartstore from classic ASP.NET MVC to ASP.NET Core 5. For best code quality we decided to port class by class and adapt the existing code to the new environment. Therefore we have created a **[new repository](https://github.com/smartstore/Smartstore)** where we do all the work. Of course, work in this repository continues as usual. **Give our new repository a star** to stay up-to-date, get involved or just watch how we're doing. Learn all about the latest development, participate actively and last but not least, don't miss the day of release. | +# Deprecation warning :warning: -
+This repository is outdated and no longer being actively maintained by the Smartstore devs. +Users & developers are encouraged to check out the successor built on **ASP.NET Core**: +**Smartstore 5**. -

- - Smartstore.NET +

+ + Announcing Smartstore 5 - - -
-
- -

- Smartstore.NET -

-

Ready. Sell. Grow.

- -

- GitHub release - GitHub All Releases - GitHub repo size - GitHub closed issues - GitHub commit activity - GitHub -

- -

- Try Online ∙ - Docs ∙ - Forum ∙ - Marketplace ∙ - Translations

-
- -Smartstore is a free, open source, full-featured e-commerce solution for companies of any size. It is web standards compliant and incorporates the newest Microsoft web technology stack. - -**Smartstore includes all essential features to create multilingual and multi-currency stores** targeting desktop or mobile devices and enabling SEO optimized rich product catalogs with support for an unlimited number of products and categories, variants, bundles, datasheets, ESD, discounts, coupons and many more. - -A comprehensive set of tools for CRM & CMS, sales, marketing, payment & shipping handling, etc. makes Smartstore a powerful all-in-one solution fulfilling all your needs. - -
-

- Smartstore.NET Demoshop -

-**Smartstore delivers a beautiful and configurable shop front-end out-of-the-box**, built with a design approach on the highest level, including components like `Bootstrap 4`, `Sass` and others. The supplied theme _Flex_ is modern, clean and fully responsive, giving buyers the best possible shopping experience on any device. - -The state-of-the-art architecture of Smartstore - with `ASP.NET 4.5` + `MVC 5`, `Entity Framework 6` and Domain Driven Design approach - makes it easy to extend, extremely flexible and essentially fun to work with ;-) - -* **Website:** [https://smartstore.com](https://smartstore.com) -* **Forum:** [http://community.smartstore.com](http://community.smartstore.com) -* **Marketplace:** [http://community.smartstore.com/marketplace](http://community.smartstore.com/marketplace) -* **Translations:** [http://translate.smartstore.com/](http://translate.smartstore.com/) -* **Documentation:** [Smartstore Documentation in English](http://docs.smartstore.com/display/SMNET) -* **Developer Extension:** [Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=SmartStoreAG.Smartstore) -* **Azure Marketplace:** [Azure Marketplace](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/smartstore-ag.smartstorenet?tab=Overview) - -

 

- -## Highlights - -### Technology & Design - -* State of the art architecture thanks to `ASP.NET 4.5`, `ASP.NET MVC 5`, `Entity Framework 6` and Domain Driven Design -* Easy to extend and extremely flexible thanks to modular design -* Highly scalable thanks to full page caching and web farm support -* A powerful theming engine lets you create themes & skins with minimum effort thanks to theme inheritance -* Point&Click Theme configuration -* Highly professional search framework based on Lucene.NET, delivering ultra fast faceted search results -* Powerful and lightning-fast media manager -* Powerful rule system for visual business rule creation -* Consistent and sophisticated use of modern components such as `Bootstrap 4`, `Vue.js`, `jQuery` `Sass` & more in the front and back end. -* Easy shop management thanks to modern and clean UI - -### Features - -* NEW: Media Manager -* NEW: Rule Builder -* Unlimited number of products and categories -* Multi-Store support -* Product Bundles -* RESTful WebApi -* Multi-language and RTL support -* CMS Page Builder -* CMS Menu Builder -* Modern, clean, SEO-optimized and fully responsive Theme based on Bootstrap 4 -* Ultra fast search framework with faceted search support -* Extremely scalable thanks to output caching, REDIS & Microsoft Azure support -* NEW: Tree-based permission management (ACL) with inheritance support -* *Trusted Shops* precertification -* 100% compliant with German jurisdiction -* Sales-, Customer- & Inventory-management -* Comprehensive CRM features -* Powerful Discount System -* Powerful layered navigation in the shop -* Numerous Payment and Shipping Providers and options -* Sophisticated Marketing & Promotion capabilities (Gift cards, Reward Points, discounts of any type and more) -* Reviews & Ratings -* CMS (Blog, Forum, custom pages & HTML content etc.) -* and many more... - - - -## Project Status - -Smartstore V4.0.0 has been released on 25 June, 2020. The highlights are: - -* **Media Manager**: Powerful and lightning-fast explorer/manager for media files (commercial plugin exclusively bundled with Pro Edition) -* **Rule Builder**: Powerful rule system for visual business rule creation - * Dozens of predefined rules out-of-the-box - * Supports logical operators (AND/OR) and unlimited grouping/nesting - * Cart rules: can be applied to discounts, shipping and payment methods - * Customer rules: used to auto-assign customers to customer groups for 1-to-1 content targeting - * Product rules: used to auto-assign products to categories based on filter definitions (e.g. price, brand, color, stock etc.) -* **New permission (ACL) system**: Granular tree-based permission management based on customer groups. Supports inheritance to allow or deny entire permission ranges -* **Personalized product recommendations**: Replaces homepage products dynamically with personalized product recommendations based on customer interests. (commercial plugin) -* **Geo Blocker**: Restricts shop access based on visitor country or IP address ranges (commercial plugin) -* **Dashboard with charts**: New dashboard widgets display key data like orders, customers, bestsellers etc. in nice graphical charts. - - - -## Try it online - -We have set up a live online demo for you so you are able to test Smartstore without local installation. Get a first impression and test all available features in the front- and in the backend. Please keep in mind that the backend demo is shared and other testers can modify data at the same time. - -* [**Frontend**](https://demo.smartstore.com/frontend/en) (User: demo, PWD: 1234) -* [**Backend**](https://demo.smartstore.com/backend/en/login) (User: demo, PWD: 1234) - - - -## How to install - -* Download the latest stable release from the download tab and unzip it to your web folder -* Setup a website in IIS and point the file directory to your unzipped folder -* Fire up your browser and follow the installation instructions -* Enjoy ;-) - -NOTE: Smartstore 4 requires [Visual C++ Redistributable für Visual Studio 2015](https://www.microsoft.com/en-US/download/details.aspx?id=52685) which is already pre-installed on most systems. If, nevertheless, it is missing on your web server, just download and execute the installer or ask your hosting provider to do that for you. ### System requirements diff --git a/SmartStoreNET.Tasks.Targets b/SmartStoreNET.Tasks.Targets index 3664637951..f67aba4987 100644 --- a/SmartStoreNET.Tasks.Targets +++ b/SmartStoreNET.Tasks.Targets @@ -39,7 +39,7 @@ x86 $(BUILD_NUMBER) - 4.1.1 + 4.2.0 $(StageFolder) .$(Version) diff --git a/assets/ready.set.go.jpg b/assets/ready.set.go.jpg new file mode 100644 index 0000000000..e69e37758c Binary files /dev/null and b/assets/ready.set.go.jpg differ diff --git a/changelog.md b/changelog.md index 0f3d0df0d2..8ba63a78f8 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,44 @@ # Release Notes +## Smartstore 4.2.0 + +### New Features +**Dimension Pricing** (commercial plugin) + +* Freely configurable dimension templates +* Price calculation based on user input for predefined product dimensions +* Shipping rates based on dimension and weight calculation +* Freely configurable shipping formulas for irregular shapes + +**File Manager** (commercial plugin) + +* Freely configurable tabs for product detail pages +* Unlimited upload of documents for each product tab +* CSV Import + +**Digital Product Advisor** (commercial plugin) + +* Product presentation based on configurable questions and predefined answers +* Product filter based on rule builder rules + +### Improvements +* Web API: added RewardPointsHistory entity +* Added canonical HTML link for blog, forum and news page +* Better semaphore handling +* Several OpenTrans improvements +* BMEcat: use stream writer to write large xml files & fixed catalog structure + +### Bugfixes + +* #379 & #264 Login failed if login type is user and email and if both username and email are an email address and are not identical. +* #2197 Web API error "The specified type member 'MergedDataValues' is not supported in LINQ to Entities..." +* Web API: fixes OData Connected Service error when accessing MediaFiles and MediaFolders lists +* PayPal Express: fixed order may have been placed even if DoExpressCheckoutPayment failed +* Roxy Filemanager: icons were not displayed anymore +* Azure CloudBlockBlob stream throws on Length access. Fetch Position instead. +* Fixed the uploaded file of a product attribute is lost as soon as another attribute is selected +* Fixes display problem with uploaded media files which contain a + character + ## Smartstore 4.1.1 ### New Features * **Page Builder** diff --git a/src/AssemblyVersionInfo.cs b/src/AssemblyVersionInfo.cs index 1433e9a57c..9ca54df467 100644 --- a/src/AssemblyVersionInfo.cs +++ b/src/AssemblyVersionInfo.cs @@ -9,7 +9,7 @@ // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("4.1.1.0")] +[assembly: AssemblyVersion("4.2.0.0")] -[assembly: AssemblyFileVersion("4.1.1.0")] -[assembly: AssemblyInformationalVersion("4.1.1.0")] +[assembly: AssemblyFileVersion("4.2.0.0")] +[assembly: AssemblyInformationalVersion("4.2.0.0")] diff --git a/src/Libraries/SmartStore.Core/Domain/Customers/Customer.cs b/src/Libraries/SmartStore.Core/Domain/Customers/Customer.cs index 45f0535f87..c0582bce24 100644 --- a/src/Libraries/SmartStore.Core/Domain/Customers/Customer.cs +++ b/src/Libraries/SmartStore.Core/Domain/Customers/Customer.cs @@ -247,6 +247,7 @@ public virtual ICollection Orders /// /// Gets or sets reward points history /// + [DataMember] public virtual ICollection RewardPointsHistory { get => _rewardPointsHistory ?? (_rewardPointsHistory = new HashSet()); diff --git a/src/Libraries/SmartStore.Core/Domain/Customers/RewardPointsHistory.cs b/src/Libraries/SmartStore.Core/Domain/Customers/RewardPointsHistory.cs index a0fdc20f1d..f4ce336430 100644 --- a/src/Libraries/SmartStore.Core/Domain/Customers/RewardPointsHistory.cs +++ b/src/Libraries/SmartStore.Core/Domain/Customers/RewardPointsHistory.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.Serialization; using SmartStore.Core.Domain.Orders; namespace SmartStore.Core.Domain.Customers @@ -6,46 +7,55 @@ namespace SmartStore.Core.Domain.Customers /// /// Represents a reward point history entry /// + [DataContract] public partial class RewardPointsHistory : BaseEntity { /// /// Gets or sets the customer identifier /// + [DataMember] public int CustomerId { get; set; } /// /// Gets or sets the points redeemed/added /// + [DataMember] public int Points { get; set; } /// /// Gets or sets the points balance /// + [DataMember] public int PointsBalance { get; set; } /// /// Gets or sets the used amount /// + [DataMember] public decimal UsedAmount { get; set; } /// /// Gets or sets the message /// + [DataMember] public string Message { get; set; } /// /// Gets or sets the date and time of instance creation /// + [DataMember] public DateTime CreatedOnUtc { get; set; } /// /// Gets or sets the order for which points were redeemed as a payment /// + [DataMember] public virtual Order UsedWithOrder { get; set; } /// /// Gets or sets the customer /// + [DataMember] public virtual Customer Customer { get; set; } } } diff --git a/src/Libraries/SmartStore.Core/Domain/Localization/LocalizationSettings.cs b/src/Libraries/SmartStore.Core/Domain/Localization/LocalizationSettings.cs index 49d790dcf3..ee8df7af19 100644 --- a/src/Libraries/SmartStore.Core/Domain/Localization/LocalizationSettings.cs +++ b/src/Libraries/SmartStore.Core/Domain/Localization/LocalizationSettings.cs @@ -22,7 +22,7 @@ public LocalizationSettings() public bool UseImagesForLanguageSelection { get; set; } /// - /// A value indicating whether the browser user lannguage should be detected + /// A value indicating whether the browser user language should be detected /// public bool DetectBrowserUserLanguage { get; set; } @@ -42,6 +42,11 @@ public LocalizationSettings() /// /// This setting is ignored when SeoFriendlyUrlsForLanguagesEnabled is false public InvalidLanguageRedirectBehaviour InvalidLanguageRedirectBehaviour { get; set; } + + /// + /// Whether to display region/country name in language selector (e.g. "Deutsch (Deutschland)" instead of "Deutsch") + /// + public bool DisplayRegionInLanguageSelector { get; set; } } public enum DefaultLanguageRedirectBehaviour diff --git a/src/Libraries/SmartStore.Core/Domain/Messages/MessageTemplateNames.cs b/src/Libraries/SmartStore.Core/Domain/Messages/MessageTemplateNames.cs index db219751cb..83f2dfe962 100644 --- a/src/Libraries/SmartStore.Core/Domain/Messages/MessageTemplateNames.cs +++ b/src/Libraries/SmartStore.Core/Domain/Messages/MessageTemplateNames.cs @@ -33,5 +33,6 @@ public class MessageTemplateNames public const string BackInStockCustomer = "Customer.BackInStock"; public const string SystemCampaign = "System.Campaign"; public const string SystemContactUs = "System.ContactUs"; + public const string SystemGeneric = "System.Generic"; } } diff --git a/src/Libraries/SmartStore.Core/Domain/Orders/Order.cs b/src/Libraries/SmartStore.Core/Domain/Orders/Order.cs index 1298c88f0b..d32337103c 100644 --- a/src/Libraries/SmartStore.Core/Domain/Orders/Order.cs +++ b/src/Libraries/SmartStore.Core/Domain/Orders/Order.cs @@ -498,6 +498,7 @@ protected virtual SortedDictionary ParseTaxRates(string taxRat /// /// Gets or sets the reward points history record /// + [DataMember] public virtual RewardPointsHistory RedeemedRewardPointsEntry { get; set; } /// diff --git a/src/Libraries/SmartStore.Core/Domain/Orders/ShoppingCartSettings.cs b/src/Libraries/SmartStore.Core/Domain/Orders/ShoppingCartSettings.cs index a8301c4dcf..0c9fec1eca 100644 --- a/src/Libraries/SmartStore.Core/Domain/Orders/ShoppingCartSettings.cs +++ b/src/Libraries/SmartStore.Core/Domain/Orders/ShoppingCartSettings.cs @@ -26,10 +26,11 @@ public ShoppingCartSettings() ShowBasePrice = true; DeliveryTimesInShoppingCart = DeliveryTimesPresentation.DateOnly; ShowShortDesc = true; - AllowAnonymousUsersToEmailWishlist = false; - } - - /// + AllowAnonymousUsersToEmailWishlist = false; + AddProductsToBasketInSinglePositions = false; + } + + /// /// Gets or sets a value indicating whether a custoemr should be redirected to the shopping cart page after adding a product to the cart/wishlist /// public bool DisplayCartAfterAddingProduct { get; set; } @@ -172,5 +173,10 @@ public ShoppingCartSettings() /// Gets or sets a value indicating whether to show the quantity of linked attribute value product /// public bool ShowLinkedAttributeValueQuantity { get; set; } + + /// + /// Gets or sets a value indicating whether to add products to the basket in single positions + /// + public bool AddProductsToBasketInSinglePositions { get; set; } } } \ No newline at end of file diff --git a/src/Libraries/SmartStore.Core/Localization/LocalizationHelper.cs b/src/Libraries/SmartStore.Core/Localization/LocalizationHelper.cs index cebbe01c4a..1449395774 100644 --- a/src/Libraries/SmartStore.Core/Localization/LocalizationHelper.cs +++ b/src/Libraries/SmartStore.Core/Localization/LocalizationHelper.cs @@ -54,7 +54,32 @@ public static IEnumerable EnumerateParentCultures(CultureInfo cultu } } + public static bool TryGetCultureInfoForLocale(string locale, out CultureInfo culture) + { + culture = null; + + try + { + culture = CultureInfo.GetCultureInfoByIetfLanguageTag(locale); + return culture != null; + } + catch + { + return false; + } + } + public static string GetLanguageNativeName(string locale) + { + if (TryGetCultureInfoForLocale(locale, out var culture)) + { + return culture.NativeName; + } + + return null; + } + + public static string GetLanguageNativeName(string locale, bool englishName, bool shortName = false) { try { @@ -62,14 +87,74 @@ public static string GetLanguageNativeName(string locale) { var info = CultureInfo.GetCultureInfoByIetfLanguageTag(locale); if (info != null) - return info.NativeName; + { + if (shortName) + { + info = info.Parent; + } + + if (englishName) + { + return info.EnglishName; + } + else + { + return info.NativeName; + } + + } } } - catch { } + catch + { + } return null; } + public static string NormalizeLanguageDisplayName(string languageName, bool stripRegion = false, CultureInfo culture = null) + { + if (string.IsNullOrEmpty(languageName) || languageName.Length == 0) + { + return languageName; + } + + // First char to upper. + if (char.IsLower(languageName[0])) + { + languageName = (culture ?? CultureInfo.InvariantCulture).TextInfo.ToTitleCase(languageName); + } + + var bracketIndex = languageName.IndexOfAny(new[] { '(', '[' }); + var hasRegion = bracketIndex > -1; + var endBracket = ')'; + + if (hasRegion) + { + if (languageName[bracketIndex] == '[') + { + endBracket = ']'; + } + + if (stripRegion) + { + languageName = languageName.Substring(0, bracketIndex).TrimEnd(); + } + } + + // Remove everything after ',' within Region part + if (hasRegion && !stripRegion) + { + var commaIndex = languageName.IndexOf(','); + if (commaIndex > -1) + { + languageName = languageName.Substring(0, commaIndex) + endBracket; + } + } + + return languageName; + } + public static string GetCurrencySymbol(string locale) { try diff --git a/src/Libraries/SmartStore.Core/SmartStore.Core.csproj b/src/Libraries/SmartStore.Core/SmartStore.Core.csproj index f2738cabc8..cd84ae4268 100644 --- a/src/Libraries/SmartStore.Core/SmartStore.Core.csproj +++ b/src/Libraries/SmartStore.Core/SmartStore.Core.csproj @@ -86,8 +86,8 @@ ..\..\packages\log4net.2.0.8\lib\net45-full\log4net.dll True - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll True @@ -96,8 +96,8 @@ ..\..\packages\Microsoft.Web.Xdt.3.0.0\lib\net40\Microsoft.Web.XmlTransform.dll - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll ..\..\packages\NuGet.Core.2.14.0\lib\net40-Client\NuGet.Core.dll @@ -118,13 +118,13 @@ - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll diff --git a/src/Libraries/SmartStore.Core/SmartStoreVersion.cs b/src/Libraries/SmartStore.Core/SmartStoreVersion.cs index 5b57af214c..b34a1f8625 100644 --- a/src/Libraries/SmartStore.Core/SmartStoreVersion.cs +++ b/src/Libraries/SmartStore.Core/SmartStoreVersion.cs @@ -49,7 +49,8 @@ public static class SmartStoreVersion new Version("4.0.0"), new Version("4.0.1"), new Version("4.1.0"), - new Version("4.1.1") + new Version("4.1.1"), + new Version("4.2.0") }; private const string HELP_BASEURL = "https://docs.smartstore.com/display/"; diff --git a/src/Libraries/SmartStore.Core/app.config b/src/Libraries/SmartStore.Core/app.config index 9657a5deb1..67916a0819 100644 --- a/src/Libraries/SmartStore.Core/app.config +++ b/src/Libraries/SmartStore.Core/app.config @@ -14,6 +14,18 @@ + + + + + + + + + + + + diff --git a/src/Libraries/SmartStore.Core/packages.config b/src/Libraries/SmartStore.Core/packages.config index 0c8d7ea5ba..efb4850fdf 100644 --- a/src/Libraries/SmartStore.Core/packages.config +++ b/src/Libraries/SmartStore.Core/packages.config @@ -9,13 +9,13 @@ - + - + - - + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.Designer.cs b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.Designer.cs new file mode 100644 index 0000000000..db9463e650 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.Designer.cs @@ -0,0 +1,29 @@ +// +namespace SmartStore.Data.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.4.4")] + public sealed partial class V420Resources : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(V420Resources)); + + string IMigrationMetadata.Id + { + get { return "202112171231491_V420Resources"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.cs b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.cs new file mode 100644 index 0000000000..9dae67f2b9 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.cs @@ -0,0 +1,46 @@ +namespace SmartStore.Data.Migrations +{ + using System; + using System.Data.Entity.Migrations; + using SmartStore.Core.Data; + using SmartStore.Data.Setup; + + public partial class V420Resources : DbMigration, ILocaleResourcesProvider, IDataSeeder + { + public override void Up() + { + } + + public override void Down() + { + } + + + public bool RollbackOnFailure => false; + + public void Seed(SmartObjectContext context) + { + context.MigrateLocaleResources(MigrateLocaleResources); + context.SaveChanges(); + + if (DataSettings.DatabaseIsInstalled()) + { + var logTypeMigrator = new ActivityLogTypeMigrator(context); + logTypeMigrator.AddActivityLogType("EditOrder", "Edit an order", "Auftrag bearbeitet"); + } + } + + public void MigrateLocaleResources(LocaleResourcesBuilder builder) + { + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.SocialSettings.TwitterSite.Error", + "The Twitter username must begin with an '@'.", + "Der Twitter-Benutzername muss mit einem '@' beginnen."); + + builder.AddOrUpdate("Admin.Configuration.Settings.ShoppingCart.AddProductsToBasketInSinglePositions", + "Add products to cart in single positions", + "Produkte in einzelnen Positionen in den Warenkorb legen", + "Enable this option if you want products with different quantities to be added to the shopping cart in single position.", + "Aktivieren Sie diese Option, wenn Produkte mit verschiedenen Mengenangaben als Einzelpositionen in den Warenkorb gelegt werden sollen."); + } + } +} diff --git a/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.resx b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.resx new file mode 100644 index 0000000000..a16bcc4ba7 --- /dev/null +++ b/src/Libraries/SmartStore.Data/Migrations/202112171231491_V420Resources.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + H4sIAAAAAAAEAOy923LcOrIo+D4R8w8OP81M7G2vtbo7ok9H95yQdbEV27bUkmyf3S8KigWp2GKR1bzo0r82D/NJ8wsD8IpL4g6SVV71YpeIRAJIZCYSiUTi//t//t+//s+XTfrmCRVlkmd/e/vru1/evkFZnK+S7OFvb+vq/j///PZ//t//+//219PV5uXN9x7uDwQO18zKv71dV9X2L+/fl/EabaLy3SaJi7zM76t3cb55H63y97/98sv/eP/rr+8RRvEW43rz5q9XdVYlG9T8gf88zrMYbas6Sr/kK5SW3Xdcct1gffM12qByG8Xob2+vN1FRXVd5gd6dRFX09s1RmkS4G9covX/7JsqyvIoq3Mm/fCvRdVXk2cP1Fn+I0pvXLcJw91Faoq7zfxnBTcfxy29kHO/Hij2quC6rfGOJ8Nc/dIR5z1d3Iu/bgXCYdKeYxNUrGXVDvr+9vcm3Sfz2Dd/SX47TgkAxpD1u6IvBkuxdU69s//uPNxzQfwxM8cd3v7375d0v//HmuE6rukB/y1BdFVH6H28u67s0if8Lvd7kjyj7W1anKd1T3FdcxnzAny6LfIuK6vUK3Xf9P1+9ffOerfeerzhUo+q0gzvPqj/89vbNV9x4dJeigREoQjSj+ogyVEQVWl1GVYWKjOBADSmF1rm2rl/LCm3I775NzH9Yjt6++RK9fEbZQ7X+21v88+2bs+QFrfovXT++ZQkWO1ypKmqka+q8bBvrprRt7UOepyjKgDGqkX2qNulIp8n6/CFfvR6X5XEaleX0BMritF6h8+w6wWSKtr40Oi8vcbef82KFCyoUY/7wRdkjnJwWN0mVTs+S1+u8qHRN/emXIHOL1bqikd/+9KdA7Do50b6gKsIqjLDB9DJBGjtBZVwk23aFmaG9eXjvc7LBYr66yRsNXvpK5hXKVqg4Kn8kqwdU+WJrsfwjz6anQ9vUjyLaYouqwquW0HeT+liSn5l58xv5B8zcqAigL4skL5plWL2gGyjDm+hhen1Y3/0TrxM3+VGcBlh9iAlVrv2peJznjwkiOAYKYMP5Hf2ZRvDX96MZqTYuo5djbDU95MWri4kZvbyjMBysTHlbGvvyj7+YLbGWbHOSlNs0er0gomwjgMb8c42qqhmLNe9gVXefPNRFA/2uw3PgoF3joO9RWodYAS2bbWilp64Tz37O4yhN/o1WfZsO3NvhaJlXQHhgY3lb7XTYTS1gOkbZQx09WLIIgIdMHcL0+Vjk9XZ+8RraX6rpueT7a/SUPDQMJJnJt2+uUNoAlOtk29k3gmTdjuBnRb65ylNIoAeo2+u8LmIyvlwLehMVzbbBTacM3fJUJR2egwaRt6VZCH+dSFy6memornJkTNI+rv2vGl2j/BjjULUeYBN0lkYP5xs82LMkRRpyB/ENXVXem63AzoRgOzdXE1ypMxvV3U7GFSobHVfKFSgHKdehMsBBNzJqVArdK11364xDHcRA43AeNKxe1/laVz2tNSrkt2k0dt/6QluY85JI12VaPySZoER0VW/yOoaUTziryl8pgLaVVoU4KYVLVGySkgjnFYqbwxdrhXCN4pr4Id/xuA6KQN6W0dmo6cGN83JHzRhmtC/Rdou7AK93IOityD4jj5vVEFZAw2peSyHYRiDWHxEe+F/e1lGa5s/epiTHFL6r6nEz/6ggc2iNSypkNFZQtGiAW5lIjnJlAC4IlUkdSKIMlUcn+3OqDX6NtNQ2TmqDnUl7x3xXvWRm/KAl5G3NtD7ym/QCoWvMwu2i4KeibqKX0xe02XqfmmNE3YaXPqvspkCja+MqefI+vO5DrFrm98MV1PpRN9W4B24wP6ZfkizZ1Ju+xRMUJ5soffvmssC/unDPP799c01s7cbbY4w4evFCHMI8m2AN4TWszbpjOsKrGu9rUGUwphFSMooeQN3vAcprIeiwnHZKzGglIHXKfilgEBxWAHlbgRwcGk+iURCY6WmRTo2GUcfXcc6FrDQ81X61V+31HXNO5+wrzh8SrOYutmS684LpX1dGujmW21roBSJsdJF9q4Yw3xP85SbZODj+t6twyD5HZYU/xagspSiNdwxt2E8icT33UUGwTuQLxb2AAGFr+dMaNajqVm5bnLuL7aY4rzPJKtOXgt0UCoUuihDW+6jodYOV4RdUrfOVxPlCg4AdhSFE5woMZtvlZi0De0pK2lWtx073UiwVegiA2Paut91VFGVhQJJKQIQey+C8PFQesYO4apTmD+8OwYO7Gvp1hsEDtRzCsAl1naXCfDpni6cvZLKj9HOSPU5//SFaPaAb9FJNT0jS0nX1Om6z3byZzT3AAOEcGous0zI3aLPFWtb7ZNPwBkgY+djFGyBhRnYZFVgD9pPjPymrJCIhKwIiXS8wJyf/tnRXkaOBwVd6k+P1GsUVj8rwwLevdtFMsIqjwmwlL4skRldR9oCm515yL+Ui+4TJdNkcL/tt3T5F5WAoH223aeIfoRPyysfORiFh7gxw+dEjmGlvtsgn6D7Cdub3BD1/UYfaOWpb6Y6g42fDjWAHfZPT+3BgTwjAybeHELDtxmZQw2q3AAUG+AWGUtFRKoKE9efa+S2k3Qvjw+1nxmGHNfDR8Ouwx5K3tUyMWj8zpF1f8+dbiS4R5sWsCrDO9h0TMWoOjv7o3NTRpmX0iZq5rjDrk1XBxOkpXFpZOda8Qv+qE2wJHOf1Ns/o2G33q6A8psl2Tf3MNFZNI2Xe920GTIR4pSUy3crJroVTLZ68xjdaaa1H8iXK6vsoJrq4MB0MV0c1HgbUYEgsvPOo8PdVHRubNiO4aiw9lMEwBtCgJoOlc17azTAmAz1VHo5ZGs3BcJC3tYxz9uf2mdK8d3DZ7ZTL7uBk20UnW2C/U0iX2MGHNb8PK4SXNLSbytk41TurYGM2jL+Kxg37rGAIwcqTgPmZemN/rO28pu67AcPBxJO3dZanWFlYLngau/APQfT+Uao66Q2ztsxjV5Bj8qxU20pB7pp/wQqVDk6fL4VAI2uapqdJHgAYXrarOO5Tam2/EbN01aT7ndj+/ZGsqrVV1z6h5GFdWVXZ3fX+vLwpIiw9UO7AZaysT8kKK1dfLN0KFCAsgKwA0I12UyOhXQJgC2FYy3sgyjbgykSrgAewdUzRo9N0jwWFOklDKLrKgNl2uHPBDdgksaQcFGx6yaHEmFI5qK3BeBNJrrfQrbM3WdgSBWmbYluSYuGPHxVdasolxitQLtAOBPIKHG3RdOLiZbo2OA7Gq7ytNsYqrPE60ZXG67RWZXgNEyJ5HGUniOQC76XGb4mazcRpdOUxfUTqfeV7naSrgqzSUl3WrkktC4n6jC6FlQYLYqto5cuD1ZoL9wxYlM3vQrT0CEE2eCkAKeuuaY/SO3Lz00fRNiiC6dk3H6ISUbeu6PVAc55eqrMlhlES3UMEWNmufRUE5Gh0n8nBfPOZyw7JYdWUt3VCqfQPSRaROy4mKj1MilreWPU4xuVRHSZd3lZHq+ni0Hcgd6Da2+297RISnuh3aJYbR7N+D8CKXncf9H3uAf1ymPU98hXlgwRrJThEOGVrfDX3zZt0wSE0w/ekTDD0ebZKnpJVHaXpq7eLjKBMUuqFDVog6FLrOEPcSyZ4gcJLFVqiXSZcpnnmaM6ADHJ5cs72jlabJDvONxvKBTxZY72UBYrMCXxDqMMT7pz/EDkU6KySCua5Qk8Jevb2vhxtt0X+hFZXEXk+5HpMb+Q201/zKjDGHl2TgokbtHcfwyHd4Ttw14/19EJHxWbgdb/6Wm/uRq0xWbMfq0Ql4KFS+XxM7qvjqPA+0+vxhLCuunsRF9UaU3yI8vbrX4dzNNY098qDKLWa2PIVSRmUvh6tVlwfvMd0Xp7kz1maR/5xbx0e72tGWdoKeI/Q34UevbQCd3Ev4HTcOHdoTl+2SfvC1En0yuM0Q9HkwWpvrARg+09ReR1hqwmFmlUWm+UpD+7NtxIVRw8FQpsAsQMMslmyUJyXVyS5cREgB+aA6Pg1TlHbKV8dR2O8REWSe0vfgLNZ+xvEnrJyXpLUQKcZqeLNjiTpfbi0pFifNpvMKO0xHq+JC2ayO4LnZbBMqOflaelNTupxRW+nZJSR+JfsCYsmRtemgfLeuVV5/Pj3Oup8MwF8nQ3Go6cowXUZr4ZnuDfYU+cFK8kCjvxz/tyOmqw0Ad5GwxuE5P61cQic5UXfxw+ISmXuhvhDFD82r8KSvAi+vWx2gwTjeUtLvAMZNr3eFkWz6e8y6YaZpBZjm0I3DMYey3WFtiEwvZLHg4s8ZQJMicuub4gptw/nQxweb+VOGACtOqyJ8pJMIGMd6wLSwQ/164e6qkbnioduIdA/knKdJmUVBmmn/FKEhReva4z/yvnOON6dNOiS2Nu/xiAJvgJfpKtpGxgc2OWEqQa2GE+UWg7EHOeQyoAECzskJaBxdakNHDH17rzTrEJFGYS/OrXNYEYTM0Wn2GdtE2++bhLUyqT3godtCFRWRxVWnXd1hY7zzV2SdYeoAZlwbGCdY7Qf0Dp6SvKazaAsB1o+19cPJuo/+Jyyu8bg6JlbDuEZclraDOuar/YaEPmprnDnQ7t2w7V/A2OIOPB0MZk8gxHGV727N2zw1CRPqHgllS29bL3djClhG4bdLkjlTVQk9/faQ4k/BJkCom6L14v7iyJ5SMSEP7otYok6syKIP2nA9wVFZV0gQkMFBYJcEBzatE1IZYiW/GBRm5G2zlYpao5qNa7VMLLYtneJinMs/aE8egxSQo3QOK/XeesoxGuM/7lEkl0mzamgvWMdcwk5l+3qW3cl9O37S7tMSvo79wOo9bMMrIJRhfPdCrBCNB8PIgvmE+Bsow/pBUDZZxZQ7DBdLu0tA+QYKNnKBREK5RW7Eey2kyRp6KQMVHbZTgpvfeGi27Srs7uxUK+KGFAeRDYAAc6x4/pkbgCgKoYVAJPeeIRgHcfRaTPDK5uK/ktDa7UxuI49H6Jk5B1vQRS9ZgFkXeagHPvbuGjuk7gBGXbUyv7DVRTjUVeQjU9Ty3G80ju1PV4GTtSqVLFUqdIwjjr1O7bEsTUPOVqU3VfUU0yQQS3ZLJlUdZwqHrXVwC1GaztE53HRGzQlD7KAIhPS5VIuZIBs2ZAPHlF0lgcVu8tCSDvMgVlfTqecnEB3h2KIM4RCgRdECL8HjVor0SnbNt4WkpP1dx2OwzUNeVsaZ9JE+XeaE8fyQ5KmIWJTGmTBHuB9zj8jQsTzMtekdv4tREqndYGQaYN/CNDg13qDsJRyjXnGKn+PvLf44Vy3wbzJHabjPH9MUBu1433+Gzgk+2i1wljKs7zYRCpHVJgYv+5BjuO6KFAWi+Ex5jt4Bg/8+EOru28FWOoJCBhEfAhCAme95GOVSzbOT0kmW0MZkNthDaMeCYQAxCcCQSi/9XQgoM+C2iE5rKgKBateUQ0d47ZhJd3EaBaQSXLFXGEyGbrm/+yqgz/nBMHU5w3tIU+rTCvKlpiqvZ19o+p3kJi31W2n2ap96n7qgLcrrMNXDUEbN3CgQ7kGK7boOrHzjD8f+9iEtIfs44j1BGX5hvg/xte+gwc4cE2SxxyYuJheWzZweMJbgDAJQ5il22uxZTAdVlyFkmntI+9o7WW2wnd35Hwy0lwxDvOM0C6sELrjyJB2Nb8TUFvfTvLOHjJ6iDuN6CDtzmI6kX2dp3nxCb18j9J6/tZnNYLDGX/nZbfjFrSNNu7Y+pIopoKmjm16oPHI3D9R0IjrINnyti7DpPZhAhx8kQW7UheHjGCTvwnpuqDPElQ6f+6fJMUsSJ+P+lGJXL66WdebuyxKvK9ddSmoDrv+KXf98ui9nilaHjEMzOJq3dKLhCJIS15NH7ClqGt7vM5FlU0biSY5xNZGrlnGQBgOw2gA5l1Xddrd0OCmOqTdwaE+mCHytkaied+s7okeDFGz//DFdk5CotsH/EK+RkbrwmV0qVZuDfSwjyT3Qar+gttjOsipvK1AFn6otB7n5Rm2euox49Tu2GP9NbQvkVuIjNxlNzC8QRD4CCyPAh9+SERZBJzAbHAJW9f1N6TBEOhZaQDbQd1Mrm5ocv9MKkee5pzhVsMLF2wl9a0L5g9ZBnFphSlyn3tcHTHpf0hd0t6R8NciLZ7JXiXp80GQjDckPd4ckqrLxRvGRdUSbpYUfW0iXT+ifELp9r5O/xuVzdF6EGRfcxdcPhJqe8FIIpWSa0hOF6I6WmSoLLGs6m7WCXVuOXmWjEhaQ32HSl7NMyaxlWoX9dM/RT/8Otgu8rZ6Gn2sk6HV9retM7bE7eoOYIM8QryhPOyTtXIZlSVJJj9bQ21sof+DGC2260j56HSYrs/6nkHAtJ9H9/dJmgR4FKHJBul9TBM4o8xRzBwoTppRJgwffY7K6nzbXViYPNIp6BEU6frn/IGEJVQuCY5I/T6nqBSF7cxFaV3posaCBITo7OAwE3aWFGWlYcTffgvxoiCZjVkaIi/P6M7Vw8St55ttlE3/FmNvRmjzH4VhiQ9JUa1P6NsFhvKGDaWVsn9hFqvvUfc8BQkrrEv//eYG/SPPqPVqsp7jRbZz9ZCGfDtOBAobNvWGRDRULsqxTVc/h4HRt3aCty9x42EI36Q85qBd/CRbu166bikw6rKbUCrecxNBbLek3ZXcYZVWdZOHBfrKgsg7zMHZ9pr3Dqm63cHcjntPsd88jLA5lgJap2DqH2HCaLvTGTXVKUDlECA46TBAYNuhnL6QPWmUHtXVmuxK27QkVyhuH+sCxqSqAQ7OqIIwSrNa1i9iE4V3mZeSvF9DMTgQsVToNQDi1MWbfJvEij425fJOssVwLzkY2242pw1wD5sisHNsidAvrti2S1eoqouMvCCEZBPMgIBdhCGErkrA7Lv8HBWryzzJqvJTUlayU1kATtJ7ORwwBgWw7Uj6TA5Gi5AADKxCHIx8GeIBrS+IUykP5dneeCiQ/FIg8a64FNKW8D+iNEWVinkYCLDfMITQaQmYlzd5YAF7Z3K+2eTZuw7BwZEsb8vI6xBojzLL8ZuJ2yHczmOWhnSu8zCt6H0OodqBL3dq+JS+6Geb6pl+wXm6V4IbXfPrXA39NnlD/0i2xFyNUk0OikAPH6/zDGn9UIF0RP8q4vTM7uW1drpZ29s6wJ1arkiwm/hyr3w6ys5xkGIX2Yu9so6yUF7hM4LLIcAJdofrYH8oBKQjlXfknMFB1G+BHv3t34j2Pavbh1tV45YgtAtOtmmT+uqcxPpDmj8MZ93WIk1ql+8oHLsRD9d1ZpYYMzJ4YgZYC6jcJd1hBFmKovXtCDiyE1QusBII5M1GbVc8eIggOKwFKs0a7OprqL2m9Qt4TRAddRQ39KGN9ROLbaPN+6ztlnugrmnX6tcoJjP8QZVBLVBKyo440UN5nnW99o6xIa9qTq8p81WIbaZLstxO2flnH+0smw7fMfCSjm0agrwKj7TNVD/xdA5vqTnEB3XPpznU/IKqCOvk5/aMTR5mEsSUJY3Nmb2BtKfTzGFGFjgR4+coe6jJG9+Wjqdpdv+UeQMfSDgZUbxHX2lpmXa1J5y0mw3WEYrtI1MIWnkshK2/YlgN1d2jwID+je+oSDs4gtjfKGCXbXVHRWigvzyQvNsCZLj7SdT9g1BXlSiUu7FLY3rn69/4EZXdAMNd9uVumMx5OUV5/0Z/p8WJAYcAjO85iUC05rqmfvmOQbMbnDZ0yZfLWsqE4q+hW+qAGtLoLQULRNWwIAL3yODCsEsAVjns+uVtNcFG3jkfArmRA7nUbPenl3t5iyJo+m5314+b79o6nk+qdNSeaiMFSfSWJuzQXktKAxAl2tQ+ClFDWBoQIi0VaygnLgXkr867znjp8wbHQaHL22qotDMKncxWiDsR3dNIAa7+2HrQhqhkL8uufaLT91ZICCOzxxNqint87bJj5247rIceseOg0pbEl1stLroOdkBg75qfqq61AP5riecyclhB5G01BPpY5PV24icgTCNCrK+Gz+dT/zreCPEiVJBVhqjiIPu5n3Gt+X2lYx5lWK7Nb2kgTptTZbA2pwH8tXnXCS+V3uA46HWFkvnptfFPKePTnq0Ob84exQHPNlq59Fc9oBMF0k1Oqucr3pS5RyeS2u8oFLtxGNEHJ85y22fOSEhCaack4lIm7TGCbEpN7O0IOLIqVC6slCCQ12o5dsWdXw/v5uxk9GLzmsv8zZ41Kmf2UM1QoaZLRWQuEp72e4w2DGzvBDXsDuGCgVLZmcX3ucW5DQsvFOcmFIJrOAsRNs5twA/GjYml8g66x7lRdgpstDtZQ7zxrjSZgobkDdhVIXlSIDmFA4fk5Wn6PSc5pNvkOQ42HUFRvuMR7cZOhPTqKCufHdx+8tkfcMIBcxwhbml4KkpODiaGxilgvWe/75rHvLcoDua8mg8nPsiYyEhub8lf3HfxKT4DmOIlCkJYqRh2ItLCsKJHFYHiRpdbR2xz4irJ+u6vJ4T87gY6xVlPeGmIg26QtyW1PPdCP7TZprsNyOT7gWBb9ut1/nyRfcKGxGWAl3abPfHHJrHcTe4UQT3ZIcIyTgLfDbPbLqvR1tAOiykA9b37zmrUsXI9b7gQQfocWqicdDiQGDRIhhMK30HLy9sKFX5Ak93/rbGp3hA0SRnilfZWljpEmSPXtvsEmfUQ2kpmwyDfrIbSVPDa8qky53rpAxXig2KYXjHMkyKwn+V2dPfJDAnU+iY7m2jGli8ILzfcN09TR3GMynKeBi9JyjRsXRq9FhM6ab5yfZgohTivZu0Sjzvp2s58t1aqbfbs9r+D6lQIDSHQTGkcm7a831prBrwrF2PYFxq8b8ewibYtz7Ib8oZ5c6XvSBhsl9ErOSwKiuwLqtb5akrNK+GY47ooUBa/zpLOtW/sin7tB8XJhjwLelngX40We/vrn9++uY4jQsQ/O8tC2NdvhleA5lEr1/VdRV5LPc/i9IagNSLWH62HxTR2+jJPY807sHhumrft5hoh0+g8I+20zjwj7BqbdWS4IQtRtm+MUY54FUmIiRClZwhNTVN5y1MTWN7y1NTu8E+fRK3hocmZtJf1yVo5LhCenQ9RGjXpqqccS6O8rvBoVpRTbsKmJmsC7yTwINDqaDPp1NAv1fxABcJyFCAz8xrFj3ldHVVYMO7qCs0Z9iY0Xv6vzQzPP3S2VKgDyWCv9Q4bnu3kNGhO8sgujby+04j8MeYt1hh0ZimMiWCYfiJJl2fZVwi0mS4SNCof0Uo2JZOO8PjpafqnNkhDpy/bpGg8I1/yrFrP3OZ/o2h6etLydZLgBaA6QXfjA6Pu5+UDqu4V7U95Osd7sWLDMzEm1fCHKHucZUfPtTmLiqHbPD+es7nh9ZT5mjy/i2YwLrrVtDEAh6uHU8t9jXc4RfLvRtPcFFFWRk068RkeRpY1PYvIyBq/QmWdTk/242hLTgbmJbjY6Eyjva7vBht93iFf1kW8jko054nEZZS4hmf1Lp3W7zD9vHTNEYcDeWOue25wdjf4CUpR9VM92qPYCV8hcpZIeRCMzmE+ReVX9Ny5pb7m5KA9Zt6GdA6RjGO0rW7WCe5fhD834Qqfomx18eSws/J57Lx9R1j+0jlULpweg0CucUZ+7yTDXXMOfuo9ad/K6AGpHo6FAG+7I++xs3IoIdxRAWp7Q+tjct/sErWDgABvv5Vo9SOp1sJg9NDCoAyqOD2uLX+LeCgWJ4Mrgp/YpsqdevZVmsl0KJb0bCyCe0aV2z+lvUJog1a0hjyVPqAIvX0tZQotsNHT2n4sQVZY+c3JvlQkO1sCvEPNFE/x6neHWf7kNwggUXq+j33bvpYt0BMo1ryTLaescZgRrLGto456NCWo2Q9xSPK2htNtTz93q359neXTvDgzHrCZmgJjDY010H8UhFoNbSvcnbBOYckYdZzVBk6SDps1rvGFELaDmMvb6unlK6HMUh8C2fcorac7k55IofTUNDfLxxoai7z/KMilGtpWoXAW4Ry7C6MBwcanl8LxVzIHxSJvq/ceUloBSjJnpp1CxD9OHLBxXvadPYqr5CkK4JPrER7n9XYm1/4VJsY2IW6yOXyXQ2vz3PO5RhnZcM8xsrapeYb1Be8Kqfvek7VzXo7c0ThRl/Y6T+Qps1+SjfxjwgJuOhpYkyrHcyurI45IAipdlWXw/peKHNNv0heLDhk4TTbjmEjel36C2PmX7SuIvmj+Xkfd6L02HVlSXRZJPHlk9tDQ5IHYc4xmlpFMHTje+zZaG3FqkrGtTU27RYJ95w3yPcmfszSPVgGyop6XPbJgZvxnLCBZiXq8llsgoq1/oORhbbF10VyRrLNVirCZFU0fztEq+OPmab+ppAmlyRMqXonNaEnb7nYdjSHcqf1RWeYxiRRf9aYTfFgU0GaT2aE6G8/f22xxPguecgHnt8bmcctjmm4NUFDHukJF13oIfyv3q9srzbSV+zXkC80/rZXrm3mOyng2X+a5/r5vPsbI7OQOW6MJzOIhQHED4iWchA2IR/BKBQTgO8iggu8C5XNoCR4CB3fN0f1kamJH8lzuvIk0gzL+DwoSgqIBVXCC2lAChz//ChxHZTKagIdfffSTgy7sA5GG0KuD/pO3FcQGuSmi+BFTfKbg+765b4Vqy/7bL0HepmhuaYfd2DYMilzvD/S7QMfqsxtaxgGQvIaRxEfahmXKg3VpiNtR4YgdZACkgZoslFdUIY0yhAY8nDfoJbKhU5AgQpdH6sIcFWiFIaQcyOQVlhYnOeBigj22RQymgygoRGGXsuTB1smi8TMt+qlz0TCtXJLsfHhWdjTKUAiWiUrq5GYM3CcPdzfPY7TlvrvLX8PYd0erTZLpb2L/0bE1t/0ne00B2nnCEIJOloCFC992uJOh7mMQlxrW3NkV+hd5FMLdh82gOSwZ8raCLBnBTKdQa0+YaI1W253lRctN83vqO/5FzTlxkBN1vw6o71ybTS3/Aup04ZFVdH//NZ8jVd/E65AwKZRuC5Nft004d5O36lw4D5rRAvG71u/qMaYIKvEVQxCAXxUE83Sm5o0/4BivYH7Rizymw7KoUh4BlsXLqOi21JbboDZ6xqEiPcUh7jMEO2ELE4S5TFpHLJKowDxEghAn28aFsVj2QRWPzC1xaLFa6paGp91aUjDAuSWHDZp6RGgIWkukQPp+O+8BVfFLQitAGJMMRt/lIEFNHZLrLZa1Pq/OoAtcXItRFaX5wzsl3sPyOLk+hwl/sWWTjzmuFSRh5lmS4oFBT7Rp19Hni6wbJfjQpVGIlcszlE4yrGRkSKCNKogPPhrVsj7sU3CBw2jV6ExJoMJiSRclKr+9gXKozmpRhfagFW3V2X4+T3yUJpHKcfKHEJ6McK/1ttEr0+Zz+IJWSYRXFP9dVZ7mqkibXwMfVyjVk+Tx3aVVrPCkr7+29luPYNtZ2a4ED2VW21cXLW4HHBMsOsGXm8NCc1gS/DYXWhs+7I7CEttZFKPqOi8qClejU9gCF6w3aINpWKFPCXUcMaBmS22vLmYr9NIqF/Ih4AP1Kj0mCQGcX/kK4YMeCtzHE3ITOb1Bz7o9MJKDknVWsn80NNJsPeWEuOXa4UawzvxTGnq3I0+UgAVHF8tMMwYmBJN/j4okysa3nI7zzV2SRZ6bWz3yg1DI27p+rAPIhLqNj3jlm7yRL1FW30cxmcSC5FXXXn8I06zlIZIaWduRUNh+JKtwyD6FzSYQlaihnG18qCFa8oNFbRatWpbJQ4ZWlGNAZR8HCnr0yEXQHzKS7DC2KSLKJleFtxG9lyfBWGnGj2FOaJtNxEVdXdw3SNvQjHBrPZtmQr7eK5a/WxaHYAuYVpV5yY3rhzzkNGhbfkpiUMtlsK7nJbQUuw6WxWE1Yrqqy7CZ+l6eKHYQDnnbyfthefH6jkZ0sP7kbWm2RH+aZEdE/r1M6yJS6flpmjbLZmXYtpHf63NObJeZGgvgZDsvT9B9RL1RZraE+W4Fw+//DmIvbyuQzdahCXYweoNeKvxps53hOcCG22ZJZ0Yy4P6rxkuTd044avXNqiJPQwSELhTYwkurhbFma6E5m2U8e7uMB3RUm9axHaH6PNBgqDzi5vhd6WYEa9xKCg1ooKwvc1TaIQnhyQy4bh0WLIMFS3dS6RhgsROnsLNmWA164hnO6tz5U04O3+nLNi+qL1ETGj3BdTTjNak7Tr1G6tMgAN5khTKpJlPKRnWD6uKxoYBaeUR60M/OmjPUUYvndiOIpTelKEnsPSsx9NQkFkMX+kALoI4AisqGGkWFYQK9ElynHPSJuaiPU+t/i2QHLMlA98Z3PX5ZmFRy4Lv6JxYj+l598LDuNj/gDA2dlxgTVpAoDpDwP5wx3Wx/Q/iGPifZI7kmu+R7Kw6W8C4sYWYruckiGNLL3l2nCO1qb9AeljOV5gPp9lOsZaGeozssZUA7h6Xsd7SUie7yXfG7G55DmDnvnRa0/h0kh8WrUS3vegSHZUohtx2NvN/5+zY+XEWlBXdWJyKqCQ9rb4ooKxNK17p22y/bivH6qHFUNxPvq/BaLBpDIMzKSsbYCeTUN9OO11H2gLBdO6P/fphHULn3nH5LgY2qWywVFDMA4qV2bxJUdBHuzpuGAcdB9crbCmSZBM0XTVjKMR7dN65oysRcx1Ea163ofUHVOh9G2IjgwK0AmHeyQkJRUPCHVm9Z0FH4YQhBAUjAQkZej00MUFA3LyVROiKEl4ZqFJ3b7cnWMOwRHLSTvK1AK7+z/AyrGXw8RS927G1HtkQ4WOKKvU6NWj4ij+F4siJBcWBGeVvBXEVH6V29mT0EfUaL/Lc//WmSG83dnwFaDmM2j3IDG85QubAugUB+TvjolfjseuvBWil09ct3DKKDalBwJk2o69eyQptQJ7G2AW0Y3CywL1QO8bzOVo3HtXkj7TQjnQ3wCvkmwRNxkzcTE/Ba41WdInnQGj2NtyMo5cUEIUQ/JQzm954FxnLacaORSJMKZS/TY+2DHCuYuZ0p7yT4GA2pP4PpyrV8sSUjVx5E/TZJw0zCvMm8pFNcGunmHM7nP0jN7QBG5fIXSsU8/iKI94OoJPTXeW1nHgUcMR2UgrytQDGmOxydH/AW50OGaX28JjzuHey+jBHACgZoBUhAwLcQITgvFXC8RvFjXntdBere8RBQHdTArqmBGa+mhrsv2vA9ge88raHwnpc30cvpC6Ko4YoKIzrGbPCQF94ukR27HSvQLEy6ncmUsaCEFJc/YdhbQCWOytq0juCkNa7o5b6FWwmo0w9BktrjeI5iE+dZnyrf4yE0cBaF6hoRM3eudkApzq1ReXvYWhWHcdNLmgVd9jpY0zEFcuVfobguCKt0HkX3R9CH52xBhIf1Qd4WT7JpnjO3DSbxep9NvjPmxip55RLkoVuxMv3upVkd4CVMw4pB5SycgB0kS8HEr3GK2NyzjtJAEF2iIslX3rmgyClWg6/0Q3Rd4WknIhkiDDfULu4Em1MBrKnzLKmSKN1lTUZ30UiL3bI15KqLAdTqKxba1rCRrv9zq2V+c2ytz53UcsP0+NPn3CXODtd6IEcdFJaDNpa3RZEphAsr1Iu/+tfQJ8qPNJFi4sgMijIFcyvAj9KrABP0kgo26NO1dEPQq7VQubK3YV4/F8gYQp0Q+INKkbfVhkLhHj3nxSqA7yOsI+63aVp1CoEy5mO/pfCwBKoPOfKHz+gJpd7XYdYkSxsqS+qxsJmDAPWtBzo13B6tVgVuLICgORoUutjMB6S+wfnrn8JEQqJ7VBSomKUxP+NEZPuHIE/WWLb7qaq23FUoaG0IQK5vJSoCXSYJYiTJjCOlURTQGLq/T9IkcoodGeqW48/DmiJvq1OP3hEBYTw3jm4k+W6mV/7QTqBnj9sBitoG8IXiHkCA8NwApFcobuxQ+6hJ4tXA6N4NSA4cL29rxptGEy1MypvI1q7b81UaUOK0d3oHHpXe6YUhgE04COYlhdg48pDC/N1Q/yCAP7MAXqe1KjvGRK0Gi5WLsocabzvsZsBYhhrGSGKvtwDyzSbP3vGYDkI1tVDhEX0s8no7P3PjludvNNS1oOnTkZinplmjDWqSjN2lLqLX1C/fMWgOcidvqyFUAM6dJWbTTxp+C3Mld0rub3C72G5N1Hj734HbJ+dD25RxSpflVDZeGeq2eLM91zh5w0jwWY53SLjj+P+jNCWuZe9bbp/ysprhsefP+UMeLIPJWfR0HpP8VG6h0JfZg0/1o+02RTd5Ha99sHwpb0ilDZ5DPxS6wO5du6P5qdqkH/IVZcpO99phnlVY7/WPMX9F1XNePE4upZdFgheY10YVH9dFgbLY23DvcJ6+xE32xius3Z1RK9KfSRuB76qSEd4qa1G3VnXA4v1VbQ37/G7izOhHxoFLhsRAqcfCgvrdyCeouge5PO2iDsvBPJK39RN4tqY0zuM1WpHcI1H56H5ThNTGHCniOjCmYlopcvmfGFzVWRbgncQvUbxOMrQUo2NeCRWhcJZkSbmWYtP0pI5jhFaOtU+LYgbzDv/5QM44LxFetcZoVzNzuqurD/lx3UtI13Oa7eF1XFQjt2wlajXXwIpruq6C38rOdDOAGj3oT3lbGh1lGjRlnYlT/ZBNqFitPDt92RIRVWfzCbTVb+Obpa38eYfCXsF9Vl5Qmbzb1M9YesYCe4tre5Exaty1c1/RS4XXZodV5Lz8lKywLPj2ALeOl4huYQ8XVABajlOrc/5OkbH+d1Lnf69RjVanWDenR1WFCeh4z7NbZct3IMKDjpe3RREsxHsDeBI+53HEZEgjPMrNiABqq5Ci8XbqdDrb1QW5zBWHL1jjaVaZqVomdOqmVEcqx3QRoFzD2SI0oILBqoN3ynvRUcN2LEM1o+F00DYj6qvYDopCaTEmppZuSNRXwxHRNbx2FUw/gyw+hyVHobw5a9LxuAuz0/ybk5t8/jav0DZ9DdKwZkt0PHkTH+J48jau67t/olh1NzmQeUDO66Y/rQt5p+gaC+hNkXhn0cBo3Nx2jQKP47z2z9iDO7H6EmV1lKav4fZc4+oCX58IvM7xuy3zldF0QDTJdSO6ZYHBgTAwqnWaBfRantluua/PNJ7DAq0RU9U2YpqnZLpoCt3uye01GSDAZ/4RXuYFf4pgGxRW4pkMQyDrLXdZajIGTNRy68S8Lr3fjiUv0aL7CEs1XlUbWcC1JkoJcBxttlHykPnoqx7HQVfJ29Joi6li2bU25kQNB7I5Z826wwc9eiathqfiJj+KLRWExWt+jUDeoA1en5yu9gwizaE6SLazZE/ky/yZN/hfMGSTCX/649XPUVm1zRUohH7WuhVa2769k64cX5i8Jz+XkyHUHcuQ+/vQy4SPu0DqJPjVJVJ+qP2bV+0/aGsbL3Bf0XP5GRH9jPmaeuLIfZ2DMR6WO3lbMMU+1snQh/a3i0jOv2cLo0/COj/tg3xFJD/y4hGTcOLL5Gd5UW88RbHBUb4TUB1kUMEiISUvVK7VZgb9M2hvk3hHs0Irk3IJ/Aum6JJDCS5qBajfA89F8oRpMcT7ugosi+cgrQppDaHQCQ+FktSbPBQm/fbij9M8SE+etpvfv0ReuYsCvETX5WP78HpUV2v/yFIK4RWKk21CXQJYxqSR6lCajeFntBm1csvCU29py8HEB7UVsLbxRaPomPSehpb2fQTS9ZyC9FoCvqCoxIq4fYzLYQU4SQos9Hnx+o7BdFgD5G1pnIQT5bBeOIX2FSHdoDzUT7z92fUY1vpSu62YnGCNl5VumxtBUgZkB2E5CMvPJCznm21ekNeG7xOnzFZM/YNw7JpwnOXpKlgWbOv7u2lzYSDMzf0wmIJcV2t5vjEj0Qob15H34cFjsvXcGkaPyA/Dt+0KD+ci8z++wFJ3lqB0Rf6aIclRz2bHeXafPNQFezloqiOt0xesvei5nzCfTlpvsiHbyMStXaESK+jz7F51XBymqe6aH0bulEDB/X46s2ZJrzLKoYT9ngLU7zb6axa7p5kh3Nkn8HlHoTqs0gqxDpJrpuUPdfLVX6dxsBmluZlowW8yf71UC20DGpp/ikrVxc0/hnuT5twyYUdbq+/T1GtG0xhZwIXFXLeZymI376F5tP0LUZYnaJvmrs/u8igOGk3eVrcq+aq0ZYQ6kME+o1EzMmWIDYtBOH6g7In66PswDWkTtoZohLwxdVNEWblJmvQrIaYCwjmMpElB0CglGMxh59y6tTSJCMLMyXV91/oJJm/JOIoyECM07RkcdgYcXJjoRCKPyRMiIa4BbqW43G1RpPPsfIXAzopfmG8H4HFfJYMRdlVSQL/Lfi9+Dk+m/sHwkLe1ww7PibIfErVNfnWkml5vN0tEoLFqrcinBBPWtMmJnurpFsVeeD2jycMYl61CCOkN9vOLiUyJmXGOTSf+k6yzc3hfe3Zsfb6zuGFn3ENc3N+XyPMib3O9wQ/Fh6iK19fJvz0PFi6x1mgfEPGUs4Dm1XG+2TaRVzYGabBsG/9ItkdFvA4RwE5qjQ9L+Rt3o7UF56fwMvD4bBRaSzCYx58x2qQefzmUxDYN7/H/EMWP5xmWl/jRMz7/GCvFNH94J8F4sFzlbQUJ/MV/rurYX1MFivhdIrZewnpghL0OVpBAbQX7ZyqaCbMayVBHP5AO1HgcPbxfxCheHe6jmEhx4XG9vNclELqDIpG3tcw29HuCngP5DXctWg0zInrIi9cAvMyjOvDxgY9n4+NOuQdgYw7TgYsPXDwbF3c+r8EIcmZiFtGBh+VtDbuKXwPtTn7zwzP9il/kZYlt8NSfy3hUBz7bVT6zuOqT1VcobgIX7PliQ/Jl9QgO3CBvK+hBk+OhD5kpX3fpaG9N7Of9kazwpv0feaZpKsjLP0mVTj+ihtPJa2y+cxDuTdudSfSn8iqdY9aFXemEoUlpq35uW/4e/UhAseBAh2C83sthEXro1BHJQa/K22oo5R0pVODGCL0DeKybQ9VAgRuaoZPkfZOfpM6jG6/XzTEWdVoztTJGRRdeSP5WHVsGOm7fPeX/AT0k2ccidzj8FGfv+fRlG2Ur//F9zc/yNM2fvfGg5x9JtvJHdB7rHh8Mwf/Vq1LKfg3RCBnJcZ4qn2UNM5xP1YZ6q2yyZo7L8jiNSs0NyRC5UvfBTmrNnzBmEn/EpjKlzMykekO7JPL8MemeQjsvz9LooRyGa24wXaY11mDluxFbMEsJswfWr+kriSCjVCw7E1/Q5g4VgyfvX3VSEP33PUpr/OEXYeYY+KMsSl+rJC6HCr+qK9yskwLbRwWxiboaQDLRlswK0l/VKbqOc2fKk/rluwHLghQ/jshTDWbUHs/LYdLx8IOrrAP/gwOlP+cPSRylhFQXW2LeEsXrQXMA34LUP8qMWf2ikPG4ER27ufielMldkjZ7AnedAZ/9jLgXpOhZU82MpNcoKuJ1G1BJaRBNrW60l032w14QNHX693d7QfjFfQaP82yVtNZ96AkcUC84f9jiNJ0+vL+ui7tuP2A4ed9KClg3ayfRBk/yym/a/l5HzWJOLiUXeeq7XHMzB2BfcPKut0mWUeuDjr7Y9MJ7i8xLsR1V2F69qyt0vM6TGH1Aa2zaYcMrIJFlTSxI6Y8F3r3W1bcseoqSxtI1JfrXxhnsw9HHdVGgLH69ymusL7IHspYGoPaY6wxqYEmjlHTjS7La5klWndD8qlNQdMVvW1Mb9Sh9jl7LpjLTmsbaoqpRbbnYXJcFekrQc+ckCaSxPmBJIll/edQLTuyHqDAWm+5BLQsroRmo+VrT4r9uL658eJCKqKQhseIftdYPX+NPLtrgR5SmqLrMy4pIKorKMJZJt9Uo3wH4lzTYV5vEWP4v8fZ/HZXIVPCxQZNQ1qtG3on5Q20f/qDpCyZYgvc9bKU/6pjyLhlZ/k8O3HEWxai6zouqcSm5s0Vrqr9r0JXvaKwLMsOnpCqJu92UHxqoIwpeww+fozuU0vAajmC92h4LQEPf/pD6U0JyowSdOhr1kr6PNYof7/IXVJrOYKuWTOfva401WBJfkcRXXu6mmwQVlxgTOo7SuG5dk19Qtc5XAa1ceSNLbueJ09lY36IiRlkVpTKVJWrzf2Jqtcl/JOu62fxE5eP42rv3jBB05Tsa6ZIb8rzYRMYulU/Jw9pYveWjefSfLls/7v1oQh28X/+cx1Eg/wj3orKspSVN2DS/M50bkhYAr/+I7K2MbZI2ZNhDd6nS0fjvGenUgvKWlnSJJOSG72XzDLPZNH3BHUm2uLtnWPLIAJnKRnJyVJZ5nDQkHGSNZH5uj/auUNkcTN32rztx/T/NVm/aAytlrfF463XIPQRVePumHREmJtZkf3v7fwnDN21wCDuiGuyHwDXyKzsm3MhF1j5y8eao2faQk48yjlbi0SCm6Ir90gkNsZ+P86zE7IHtFjHqJ8liPG+pzVA4JIbBQ6STQ3N8yQnaoozE/djMoUk/6LfAxP4MzXLE1NHur+8pZjXg4eTfTXx+0zdDBgarSLmXhrZmXbip/eNb5TjmYlrlvO0Fx/ZeDDKo2zFYivzZ5cAtpaxrUBfiYbrapMxl11NABEBIvcQ5MbUFMWfgbguCmfSGRrcYq58kZZMR5fZoiyePRPl0F1sTJOdxVSWIuXt4G72sbANgy/4+rqYNC9J8QaskavOB3bZRslKCiKAQGSgoG0oAyIHxK5D/8u6duFtwkkd5V2YQPzmRTRrv4pyXkrO28yTZSzdH6tkeAeWMlIgrhZ6NKMTLMpHYkdlYSCSuSdNtjR1goOZX58owYCMafAJmYtDLWKrv7Qw8BfVnVs6C6G3SAbreYlzWRRRxo2m4Q8YK8ioQt/HQNkynaEmqy4Amlt+r6QcyA8fq582Ya8+SBS3YY2IlFq+33Ul8H4Qi36DB8OCmrAW14VEZdshi7Xs6mVbUdGaOLZOa2CY94KouxmfXFd5hNHfcshjd9qwh4wMQGuIxBtCG0+AWID6DuXh5NagcwQzMqZwjox18W2Xp1brv+sX9RZE8JJluqebhFeu0w/IsYDdnyXCaT9OX+ZZXGa0t2KuvujibYe2QPKHitcn5qOMCGjgwgzGoAe5i+jk5i0G9mZG/IDqbLatjvaU560OdrbAFWaHNELLdph2/HUt0DGeCQ8GH0uoODGrUFcizzlffvSXbYYTzyYINC5j0aqy1OwLSDaXXnsacyNYzEgQvzufak3P7HvA4PJYl+BqeRXNeHtJp7Qw72zPyfCzswrwhTQt5VxbhPQeu2xF+688Gb4dDQg0TCBUU3GZ48GjWjMXB5s4oSuko5uNS6XwZbbO6OjvDpYY6kYefmEf3eCmXjWEBBt1fJUon77+l/9CeDMkqqs6HaPwOR0TSJqGDIkVbO8PC2hHNx8va+TTpCl1vpzjbUPlCdWbi5z1WxKpxLMTAe6iQu/fGtGdQHBzEnh2IDUvyWJdw70v6MAMLSWhq4c5fnG3YE0fdNLOHZGFZiMUNMJLycDQ8O4H9mZGpQFqbtM9UXDxs/nZ8EFHGASKoKijeKgBDxAwwlhnTuoz9Q5KSp1f7BrTdZOGDU4FDb04KUbocqEHSG5E43WEIuv7yFVT06GBdyCI0A4bnwGRf3pjSjWIGjaWbL6P1kHqacBF9RVLbkEua+vtoAiTElz2QDUOKiC0unYVbAKXdmIGVpLQ1aXvxq2JD7/WBsiJocC5yC4idgI+WCGiV09fIIbF4IOvQ/y41lAVH8TWCM5bQwML8JevPnGwmI7qZC4GtuyjTHeeb5vnsgUNU7MADy1itg7PlNgE9wGgyTl7eMlONYCbWlM2PSfN9naUdsleNcHxC6fa+TjOyb2EKdL5ZTXWFm1ao6eCr1bUud9t2o9s5rrYb2Hx+XMN5tnDpthUXY/+zvKg3jdBqN8wiKMTWA5QNHwOorbbHQVZ6eSdm4C85cfdiX9t0/ybfJrEhH7GwUkZqwKw5iUO+ECvBvZiLl2AC7w8z3Tb/ts8lKSebApSykTUH0UgB9qH6tnNLp6z/czEeMB8mTY+1dkGJtVxjoGTaIU+hvlrMMubbUb4Duj6vwmPmw5jvdsD8ovhFbyVRAw5vglHIZdwH8vWOsKBkDLPacOL8mDTfVFieFb/nFbodeUjLMCy8kiEJqBNTcm3I+HI3XTSaUczJmfBcGevJRT01X9Fz2dwK0J6dCZAQU/ZANvwoIl7k7EzajRlYSUpbk7YXPzsbeq8/6RBBg3PR0mcb8o7MyUh7enY29N/47ExaIzhj7cjZmbY/c7LZT3F2RkbTH7cMHKJiBx5YxmoOZ2cgeoDRZJy8vGGmGsFMrCmbH5Pm+zrLnZ3laaq3xhgo8CQsJ/nyLU69GIR7lTIb7PoMrAbOwV5YbKTnR1n5TO5NED5RMQUFJ+OzFsSW22jE0GEqwMC7wWtAx2fiNmAujFZaDL8or+EdcvP8QfPuOsUxKvaQ1JHxIA1uy4mypiRcCbP7bvCmZigz8alm7kx5tq21+D0IMq4uMbx5BDxUSfdggHESfsPm9jIaXjWSGdjXZP5MurH4ga9qIOSbEweTbzNzcdOkgpObsewVN9MjWpij6fm04WpSbzHOPn2pUJFF6VFdrQnG9hW4brXRKmij2hCPqyraMLtZB/ZKd1sNaQaWt5rjvdDmzaOyppcSIWCIo7uXas1ZF0RsfhcxkAdU1YsZmEtFXZPm2ZoLc5RWXbJgAbloPzUd3PfZuG4vdVf/BNQ38pjrpwT3hmSS79+SknGJspbqdSq6gstLVXCDUH5iyXNYy3Op0VBmYFqjOTTpR19nt3i41XxW/NSK8Vzc27YGsC6os3eUb5lBLMW0zLyZdKKpsOzi3hx9qXmUg5Mu77aH5jze/WFBSc/nWuHFudgnZtMlXRMgJ2C4fUyrJu39rGy3hynUPib31XFEDhlwl9dRiVY/kmo9cpCMXTT1ILbsq9hwpa4ZmVqEuD9cBJFhr2bgPcNpMOJEEMPijMkYEQML6fgFrKViSlerUd0gwJ4yKVhehxoNZUaeVs6hST/6OrvFw99oEbNjZKbqbNzMtro/hqj5YJZianA+TTrDVFzWbP1K7m4Y7JFGOKnJ+tXyHg6Pd39YU9LzuYxVcS52f490hZ6x+FzmGEHZy4/W966qBLEhAG/DkMrm9spLbzKSGbjVZP72woMPDcTMENDWNFZ74P7HpiE3gfHKn3q9TrZNJLqaSCwY+LpsB2H1sCyLdX+WF7jjM8grPA+7v7j0/W73zD2r6PiCgVYxna0vDm4ASgsu4erdYUFwCDNyIjhHJu0PCJYNLyDd2BpHrHDQAYMNeMw++bO9rGZZT+aynWU0NuWp7Q5ErvyIUqwLjK1oGBxiLgbShskkTeyVzawewwz8qZ6nvbCT2SGojT4AdkKeDGBrB+CquQ06BY1336q7QlVdZFfoXzUyySQJg8O7HgrSzkEANrFXak49hlmcAqp52gs1N3ba0LyTVQj+TEpIO89qA5Y3zR5HRUW976w8glbUgTdjLLjdhkzelMv79eGWB4OezbLb0k6FSS924J15YSTaZUNaY3Im3M/1QzuMJfh1L1cRYRS66DFZhck5dR9DynSDWIJN9zDAjM1Er+NQEFr7ToHz4wR7yZjKEczAlco52iOWvN6iOLnvrjYeVVWR3NUVMmVRdW0Fy8IVHVhY04M9ZGmzEc3H4mZzvA8sD4/kYkv+vJVwpHR1t8cFGhgKNFbGhkN3oKM0I7FcXlQ8hjuHxeLOG0YHKCCGHV1IlAzuptvV5F1syVF2y1jWYNFfXuL8x774imXCN+7y1+JZWgr7ZfkmepD7UQFYhdw4SAiDWW6C4eJwT253OL9HRRJl1TAtx/nmLskawFssMckTKl5vko0iJaYdHgXhFCgcaGrcIeiKOT3wybywjh2dTy/YzqlJz+h6Swu/anyGGzoDFDvB8Xu8v7MY1m6Ixh7u9AxG9fcal2DO+JYlXlJB49kJ0WA6BMgHM/AlFwOoo7vB8dCcmvSMrrdrvO+6Ajio/QAM/TMp+N3R6nusyrl9VnmNhl2G3llngUPB5kB1B0436oSc63fYKecwwPlEwWbuLcRiZ9xvvD9DwbN2DKrAZC4r/nKi6oaBtMhFdlflxmDAi0mPAU+4yNCIZWlpki2cxkuNFsEy5tTPscIYj255S+unWFv4wX2P0noYocCtlqypRGYhJQ2eAKKi7o9cbHRSu7PSYzTg5STJiD8spIpHsbRwWTmiTL1NLmc2O+U3Wtg5tN8eoJP8OUvzaGXwkqoICmaV7aCsMsmKmJd56VLekRn4SU5fk8aXf9RycBhFm22KBj7Q6RIWPLCi4pBD550Sfg2vpuC+zKioYEqbdICtuRiH3SSowKOOkdmzQjA4xGEDpA2PSdBbPhzU8NnS5p56KDOwqHqqTDqwE+8EjcPQnaAIkBOw5T6ei0h7PysT7u/Zx2g7GJ7hCRUUK7DUAjNYisV29oktdYOYbxWXztc+MCltViuCDlkwiCGdOJFDK9tiBA01bDEWUfxosMOCgKWjb+Csh89jt9lnLS+GqiHMIIKq+dmPPdqXKKvvo7iqC1SYMCQIDrIkBWnFlHALy2z/1Z2Zg8GU9N4PFhseWzra4ilCq5ucHpVc6WvqqV4wcnm1SNYMxHnmvO1Fp251tiFRX2U66gwtmJtrAWhyVafoGpmQoocMToEBMTDwruy08d+GG/5xVKEHkjdKr5lFUDCzTQdlldlGxLyMNpZ3ZAZNLKfvfmjhof9aSRIggzPSApJ0Gb2SXKRfULXOV3oawODgTpiGtNoGw03MRxKCtsXZty5P7CaAgkndBiirjG4iblsaLL8PkQ9iBtUknx2Txrsqi2aOJilaTEVTAi/LHj2C2uaPhhqZcemn3d56nQ1Bq1LbQScPJunt2AZm1N+o2CRliT+QHnyJmtm5pb42D6vL9blRdVC/QzWt9LxZ05A1zY9u59Se3djm8IlazbORh5Sru5wBt0bxY17zwU3CZ7mOMEQAqg2wrpUCMW0dOi4VxrhzkmA7vDl2LJbzbdIlofKuiYPBRllTcVb2X3xLbdit5dh1T7fbeLGoCzz0h26bd3ueJQSv7qkiRS04jzZbwS6Vtqox87d6gjCiUWfm2EuZzIBRP6h6O8OFfRp6gW1MeUSGwIQ3nZ6DM2we2ohoRGN5m8F2dAuwv26+jRwMXN3FpIFM6xOe+8/5wy31m/CMVAAUdSCep0Bs+FzVCpQ/nuv8znG2wXhmYGaDuTPpBVd1J9hXm1MdAp6IYfczibpqBDPz5l6mTjfiQh33WXKdK7ftREj1Qoy2twx2dH+fpPgLutU97SJAgoquB7JScwJm89dcAm2MpF2YQ0nJCGu0bC78RN9RnHbeXqO7ITA4vGSmsD9evWCC6C3vhiyvxdTjmGXhVM2TjWZb9GLINd5WkYjtZBMVr6cv8TrKHtAVFrVjvFdCWfwqP//U1QRPQkklqwNQbSsg63Z9n0YVGvdpBjY0ngWTvijQ7AaDNn/YcSZTJTxLsugX5kWwM3MzIUhwC+5j6i/HdvEareoU3UTlY+98or/JmU9TEWRBsY4VQ+qahBK302PZudXddERz8LbhfJp0ha63GGf/vUY1Wp1uoiQ9qqooXjd+VP15paYexNdgFRvO1rW5zGGlYa9mYE7DOTHpyfJHlYrBkDUhenDiza7q3OzZNyvj0H5Eu+ghMh/WsizOTa0xl3f1doHRb9uBxe1tEAM+YypomNqRldkmAAZm+rxztoNuJPPyLDhfJl2g6+0Cp1LCR7OYnWqkCTOfQqZbBXOCSSVmp7hZPaLFVDEwpyZ9oaotxt5neVFvruu7Mi6SNies9iRJXgViaAHahpkVTVmdcAaxefWdmYEB9cS38bsumBEleYoq9AWVJTFfzop8o+U7RR04LwoNbpcVRd7Q/Gxn0JsZ+M6A+Ca9oOvtCvPd5LasN9aYlPGoZhZnO7Ev8zOdSHaTPoy1FmO48802LyrctfvGI2HiQ5VXgViOgbbhOEUz1h7TIGyn79AMfKcnvoWrM8keFnV2nr5YM5+8CsR8DLQN8ymaWYb59B2agfn0xN875sMNpXkbrNyziZonxApyxhth7XkPaAdy9qgYfPn9sW4os/GsfNZMutBVWYxVP0Tx43l2XeXxo91+WFcRYl1JHRsO1ja7VzHApqOZgZlN53MvNtqywegykGrqzczT+5iW1HAsCzL0XiYpzerzCm26uEPypyJjpwALJ+ykweySdooNgIedWb2rWSMUQ5iBMRUzZNJ6U30eTjxtcqjgOhWugYreyN5ERXVx908UV6QIveCJjxuNH2VZXjVY/vKtRMdpQfih/NvbqqhF25egvkbV4K/YJnH59k37nc44TgoAduSqRy9dcq8EgViG8lctLvyrwjsICE1XpEXxOY+jNPk3WnXTB3eKh9J37XOUPdTRA4ytKzPrHLquyI3IK1Q2nCftHgenRc5nK4EQi2llzJGOSVU0mOlcORr0dDw2hJUNiNcgo9MPwdPOJSjSdU7F1sY83eeQhJCMOSk1SNisqSIiNiupDlkfdgRiGmO5jNDk6UrSpbHYDFUXIiLFNYTv6FiWy40OcquQw94MqQKXnp3ITMu4qSkzYMk2RleCZAh71qlZvFIg3O0nvGyCmBgAPYejNHlCxetNsgGx0eWmhP5QZyu8N8drtYLkI5A92iHVCJ7+CuZgXR3TRpV6hIXRz13PuRqFAIAZK2OVItYi6a5+gWMdbssZdqSxcWDNyYFoUX5I84fLvARx9WVaJM1ZuAzLUGiGRmp1jaUmiCIZBrNefCzyeivtRVOqRfQVPZcyQe3L9Gydp+lRVj5LuHkoNUIkQ2FljihsHQBMi/r0BWuMLEqP6mpNNgRxY6zLLTUVvLaxJvMMhLVL42Nosnwjp6BtAD6svABAvQb7mNxjdVestNgBQHPsKoRm9JPx9FBohuZrXoGjGwr1di16xp2+zPHWsVTRS4QzMAXWyXYj0bF9mTESGcXoci2yH1Gaoko1ThpCP8IrhFc/LDj/qhGsuBkAg7HmjcBjPlKMl4UxXdSvtyhO7jtRH4wNxfIOV9CPAazWvaIOjUcB79iYeTOmxGseEZJSqnnHxwwR/9Dvcb65S7JIRhx9LW3D9OOvUBPsC7puo7DoumkTJrjdkXbs2KQ+1qMfoV0bMm7EdQaanIYW09DlmdSt1d07nODyPDxnqvPh9Y/dgQ688eFBk228RA7H17SMkJB3leRo2teudNNAJ9kH6c6m7zfwLmlcS4Z+JTbBuGzBpJOX68xWPn0maLSKiXRt0Uo5WJYjVbs0QxnnZMaNJKOgZRsmuPWb3DGDE7jPpRNrmaNqXPZqdG3KN62XGeyVUW/6rC9gP8Y0OtpBpfKdDZVDRYPmW6FAMxTqtwQoQ1h/KaWDh9GrzDXaoEZl38EuRgbAwCWXFxJXXJMqwaS6YsdKl+uRCdevYZEEr9Bb4NbhNLCbgMsxsAEFXnIyR69Bqt/9UzfLwN0+c71Pey6x2UbJA2iy9GUGy2wT43yDNttUIu8ciJEj6DOqKlTQp/4yt5AIaeay0uEG7v9o7TU66hu20NgIey1to7Iu0A+UPKzB6WYATNGdJJhrS8moeRgtUibkGMLIhXjr5Po1i1X6Zyw28JSxsX2wd4yPxDRCqhguF3OpcyfDES6gd1kWpWRx5KeUUgDO9GjzVYWYhzHeiCtwciAG1hsBWylO31gI/cCLvMS7xDRVoORhDAS0D7iBRXMMxzFANManyJDRwUMcQiqaRB11cDvGLFB1FOEHYwU++IXO0amoN4RCDYOWxkMI8TWmTfTBUHQTY9wGH9HEEsuUkHTUiJ6KMLRmfGAlKf34YBcd9WDsE5OOSdgnCyoRaWhSTT5cg9oQVbmgFAU9TRoACCsbvzeVxRdb6bNnkbxKePmwVdUgglIhMApiKrECVKSH5k05Klrl9jIqGpNCpBcAJR+PCAzRho2iUZAHQAcQRYXOmSzkYkUfySMjCgWjG8MIKidIohM9AdWcxGDjkVQkkadSkowGTKDkQx4wNRKPcIy98qYSH1pFpTkDKKWAlg9OXgmiGBAPpiCcAreUwyCkLmtkGwR2e4LuozqtxnAuYF2UgCqWKrgGuP6NgWqqtU+CENLUVNSaN5WY2LTbIXBOpBEMKB8QCA/Rhw+fUxAJxgmRSEZzdwnsm7u4vyiShyRTiJ8AqpUPvoZC8IzkTcA3E43Y2EQ5gRg4/WhocG/SMMgAunDxl6FoI417vKXjLqUkM6quHbwJFgWBVfGeesobNQ7Z90AMa/hZ6ToxOCkMZoKrYkEAtqYRxS1JzLUgJ+s0xLQiowsBpyTdrETr/YK3Y8yylGYirHZYQhUFxeRbQDPMU+8q+Yb1TCaAmo9Kz2CO5JqVu2h39i0bvi7fPUjr6O18WVXVToKNvTfYTEgbgbYUKuyB6KrnQxDcbqB6fvQj5Dxs2b9+o9ho8CDyYXCQEGmo+xMKevCIJraWhyeA2HtBclKwgPpxsPskb7Kw6ADiqLdwHv7tW6qjcnc2BaV3Lo/AKme1maOawgVQRUpkH4J8SFKSFWi4+6OgCgdqMBy2RgD6cAhnIlJ3i2lM/aKgkgCrHxVfRUWn8c6VAbkExKDzRzIBDvTqb2opz91EIPlABFiINNTdMQVNRFQTH6kNDSodrACUwRiUDlVLesznQB2avCzQU4KezQgjABuMia8TgEwCyjmodZxvmvRZ4xVImFACnHpAPLi3wgGRAgSS0tzdcL5qpuUTSrf3dZqRRYEpUNjQuppac1eDwJuqhs0olLqsGQdyD/dnlasgACUfnwgMkYy+1asgFoBs4tVuvAmsJwkHphkGCy0lSn9HWUcVDt0cZLmlLyhLaELDaEZAgUqoEenJQCMBaMBcuA7JHN19byVntDBG89iOJQxPtLhgYggU9VIa9LV5ldqg4ExknRpLCNVBoZNxCExgH9p8zyt0S6UnUJCHAzUYElvDe0mS4ZVRK9Ri3ycqUO4sRCD5QARYiDRU6gQFTURUE+8shgaVBjQAZTAGpclsSY/5bOWhSZOdhRzYYEwmOwtLMs2+syAt99b6mAEEJpQApx4QD+6tcECkAIGkNHfZWeRpqlQ0LIDCgKfhQEd7mw1FtQdgUEysWMY8LrdtPhZ46DSIuucUpGz4Q1YZDRFoVNCRAkRJRxLgta0JX2+SUNK5bWByyMDV45HU8t80KnBL6CaZAs8w8i5u2shpCsLr/ZtQNV3EuCyc27yBifdPqrbbPIt2dGzquA21iZufmp5NIwqagmH+DnRVZWxSMqlZRfngjepDZNbkpFLQ26zJiRm5yaBkcL4EwsnHBoFD1OuTbCnIBKKa+EypbVPFbxyErvsqDjKmwVw8AWUkux3TrIrEUFeQD0tZT3UJhk97ZnAjBm4DigSVXbQJRckuf5whGVtoy/G1/DIhAdsGAOrBzOwqgs1GQkovHkQjPyOkVAr1G0Ie0zwkUMQaiUAmnVfEFVkTYp4Yoj7v4O0l7vE6KtHqR1KtqTyCIml0VeSD09SEyEblTFRQTYdYxk6hds1QOsjbMaWjnIZwBf1AwXoq+lloJnUbACmlcxSKkt/oCTUmJ1vLcrxM5SkJyzY0ud4jWT01qp8C0eipEVKq8boUozqNR2GakgRAGlKlOaqElw9JVQ2ilCSLqoJoyhYmtmOhtrUSqq9kN1hHsbHE6zpXLncHu0S0cuHkIOTjYgHBa4Jjal3VDUEWz5SCSafhvR2T+8qJwALqx8DAq0iiN9FglFAkr4zKzlvnPvmi1qPAA+r2wBy8136axzWxU4FJuazU5hJI+XjgChBxhMzQCipJsE6stdlWpUoGAjMdilTduFNnDpOASrGtMQZASNX6AlWAFxU2Ebhy0QKRzuSYN9FAUli9j9xED1lGzc+sjfj86poLySpw1QokrQUvbUJeeOXyJkc+14VioQ8quZQDWwxSJZ2e9JtLRoWGFe4tKazFuBTOLk+KzXqrs4sk1t875AAVx9AQfNiI6HlJBL9+YEAyTUXtYNX1Fdc3pS876AmsaXNagques7iVPUIBiLcDGoV82mMDlYL6aQ+VgnDoALQfM2OK4HKifqPEVniU2Fy5W03hGcVM2RHjOZUwlUcynu7/9gUJ6ZQxYFoS0NDemXhoXHId1fY/FFUUD8uYZi8yRqGlgCkmBaXVz+voJ8G4C/NlSlJ1Sb9+m9T2oop+JZ9yTmY1olQdYV9RcpoOBoUXVWhMC00M0wVgdrhXqaaaIgcJcRcLB1lwovO8XA+8gnXLFynIa1RdSwITLAqyw+9+6Slv1Kx8FqawUHmLSt5T80lRIbGlkQKXxQQ5TI6qYYMpUnBGeHVkIjj6us6Kw0RkgmqqpYQFfPXuVlJoMRdqPNZkUqKzmKP+CTX7iVL3QD5pWi7x2LAZmlSWdpOpcWS2Z5vbzOkfXVRfngSg5EMRgcH42PElSFVIrIhr6uuAg80VbbYpGh+llPMLB6mfZLaCN89w6KCdpIzYDvQZHtjUXsORQMoHBFeA6EM/AaqgkAThDNdrxpYVGwYRyGQoik2BNVlmNfxHGdZvokRYrRwIVSZIrz8PvWhlBzsXOQj5CFjAIE80yPyJ1Hu6YSjQPJyrXphAOM0gOHApTfpXfXVE4fFNvUCx+VmV1IEhFeMBK4AUMk6GKsE5NZXE93m4LstvBcmqKMwUdc2QrwyxiGfIyCt2YdR0JjQcoG1G2VcKSbkB57TKe2iYvLHd7v4VZBqADEbSwwYgyoAKoEVX1nwJE8g85OZWaisAShHMJQCD0RRmKcQBZJO/ntM3qeISEchgDCousaXHvGzCvHCvJIwEUmHIgRVAA5GG1FiHMNJZaEUwtg30DYPxqSKUfDgiMBiX2kNp76OI6GahTB/dacBGMlBVXBpYQ3Z7YATV3x+A0M6jnemtsVIdgYAKNQLBB3zCcmbtBD2DST+j2b1xC2grs5oKRWOEANRmRm93ujSmfigUTsrhwpxrFD/mNe9YFj6D/GpaV8FvhihArgbravjbtD3IhcUDTUh/tSGnq2M9frWRF47O89l/WELqgjwL3RkRt+cZVlRRqrgtqaqgWIZV9eCLJ2wF3d0TFfppb+mwLff3g/jvJsSU1jUfuAyFCYlNL/gatggth7pJdXlmJa6SJ9zA5/zhlvpNnn8HH1tRgMsHragFPrwygqiJqcIL3QdiQUKTT3WXBYQzG5jqBosTpea6t6KjiSEtdDTQjn3OMR/d3ycp/ohuFRfpRCDFxPGwIBv0QBomEHBNfGnuKE65/GyyU0YJpIqhoQqwjKQm6eUkCGc4ZbzGCwA5lEo2UfF6+hKvo+wBXeFpUr3GrK+k2Kjq6sIvEONKmg2wFu/0DzVTPWj+MKYhC204SKZSCKqxCCcnV7xGK7zHvonKx94Qob+BRNPVUYxUUxUkoFBHZ2FpW4Fum1DlIQj79xrVaHW6iZIUb06ieN2YdMr9lq6KfMCamhBVwSpqsupamXqvpWifCI0kq7VBLachd5Wnp23fkIy8XXlgCt+2fYmlKSylsEaDZKpoaGhMORYpQC+6fDqOpL6aMyRdyZZNaBJMyY50O2BMo3zKXF8Sua7vyrhI2kBu7XtEMLR8mPJK0ndXaGg1DRXIJ96CYEviCdtcX7ARTxTHWZFvVKRTgatiqqS14IAtGlwXriVHPS/pbnILwlHAxmMb6wQmGoV4YpKdb7Z5UV0W+X1jamiMRwW0fGzyShDVGGg10RSIZ7ART19sKKeAlg9QXglOzW5MOQXi2Sh3grZp3vpKu47I6QbA6gYnVpHTbIQ1IRuAGbJWlLPh8vZmFD+eZ9hejB+N11VtHflYdVXB50vhOmqiahua+oFgSfuK8GhdFfvBKoKlgxJ1rtDprCYJgzqHHPkTjhsWweRDAqDhqGEaTBc5LKIEN2pZbX+Y/tf3LQqSRChKMlQMZX99TzTqJuo+/PU9BonRtqqj9Eu+QmnZF/ShAmPN7sub620UkxPU/7x+++Zlk2bl396uq2r7l/fvywZ1+W6TxEVe5vfVuzjfvI9W+fvffvnlf7z/9df3mxbH+5jxW/+V6+3QUrtB5Upx07inZ0lRVidRFd1FJZ6F49VGALveREV1cfdPFFdNNqUXTjr+OtC5b7C7utE+aSjOHYEmpz89OPndecNIU40D7h3p0zvwxcaRhmd4WESJNyNE1HRL6uGa13GURgUWlC0qqtfeglrhkedpvcnGv3mek9e+fi0xA5LfLBb6uzm287Kt1z1qyXSLLTLH+anapPwY+2/mWD7kq9fjsjxOI3KmQuNiSyzGmsVpvUJYyyV4WNGWG65QakPFS9yXZyzvuKDCnIv4KYYAzPH3lVmk41dzTDdJlXKM032y4MA1tlMARPR3m1mpipyfiuaTHa+IPGKD4Quqov9Cr8+tyqYxsSV2GE/QsJCKSJlCO7wA8anP5rg+JxvM7KubvD+1oDEKheZ4r1C2QsVR+SNZNUsjjZYvM8fa1vhHnnFDp7/bYvtRRNsuaR+ElCm2xY3l4RmYKaHQFu+HnATj8CqGL7PQLkWSF3gt47TL8NVSu9xED4CCab5a6Ji6sQBu8qM45bQMU2Klo+u7NCnXgG4eC8zxHef5Y4LasBkaHf1dxPbX95wxwdsr7wWDhTMfefPHzDiKXqhLBF420oBJODM1sZRUtaexl0RLydZGOknKbRq9djF+NCa2ZGdmG3+omoBhn4nukDhMsrTmrk5wE0XKoug+WSgsQgR+IMPHnWGNzznufPJvtOq676sOeHwuSsEAxzSc0/aBxzF+tTCkuveLeVz0dwtshCAIG50fi7zmtil8mQNWCUJ7XIDcMAW7w/XD89JevC55K9uExaVVd1Un9j0+rlNyJxlm66HQHO+3LPlXja5RTtxBLFauyBznWRo9nG9wf0joiTh0oNhiK1Nx9mfzYfktlsSYdTJl987AabXMdVU0D4SXjU83wDrGYXRdyrRoppH5sGtQ33tRnNgSe4zAqsEV2WzqSLTAZVo/JBm/q6NLbDDe5HUMbBKHzzsjBeLFPR8J0F1sNOB+PYpdcokvP2v03c5AUzei9Js/FZ5pJvEoTfNnFkH3yWJR5BiQ7xFUbuHxoa4B8Jj5sp1hN/bugg+Xqe5pGDCXuvqumsFnBUL9NX/OqmRKLHyk0cvpC9psOX8z9dkKV2ehiX5IvsxCEsnVMQ5b/83+ZLG9AAQdLLYlS518NjbtTV5F6ZckSzb1hkUKFDvhjl6UuPvindEXfAYGH41B43JxDGnq76rOkJ76OZ74nZeQRI5fLSQoznk10X2ykuv6DnBM0d9tHEkPCf5+gb9FePZ5ZxJXaLFWFyjCO+uL7FvFhTWwJRaOi+1KgpEtsdmwlSTcLyaXLyG8UPnO6IlAx0keZ0n7d5B0Vqcp4J4avi6nYj7kFTbOpFiBYgsv+0uFiixKPyfZI+dpZ0osehutHtANiQxjezl+tsR1Xb3yRgr93WYTk0Qlv4lpPlmoro6vb7A1mOLfwlYDKD8EuqhxXUYFViE95YRtoVBq08vuyiOPlCmw6Slmu+TfiO9h/9VyQz3EPd/k1yhFcQXj18Ha9394wAMahvR1DwVekvj6itwv53HSBVZBbM8X2Sc83svmJikXyMaUWYQ+RuWQ0rPLYMrFQUIAS4bF7MX5BOZGIaRy+DjHOcc+m5kn6D6q0+p7gp6/CGduQuHOGJhjalwf+7LH4mBfyqvuqn3Z95iQg+8LX2bBkSW6REWMSSQoSq7IvqcyxFC5PfajTXubHcLcl9lE+GDWwkyFBMlkS2ziT1YgPvq7zfnav+oEa+ljvAXPM/F4HSq3CXeEsbph62ehWWCaqzAyfmUhLNe1pl73DqewrtGFO6P1dKnrzTUfjclB+6mr76wG3KN9MU1h2V5PBnPY7+lwHXZl+7grm2o3En7fdNjf7Mr+JtSee6kVf8yZ5bXcy/KGmaz18rrTLPRneYoZkccxfp3TZDhKK17r2p3BB7hRSRzhWSksptRni6UPW7RiNMD41XIRBVCNny0UsLC4WS9hyQtKgTV4/GxnamBlE4mWRvvVHNOPZFWtWTTdJwsFhpKHNceE/befS1WflzdFhDlauG3JFMy/cH5KVivECV//zRzLd2ykCTI8fLSUuy6LAmi/UmU7tow1GtxuIcNTj39f3P8f8IrWYPw/nRe1pvpcy1p7jgSfLs29rF2nNRew1n6xOYfMThDJVdC/qMgeQnKFSyjfxmo6Fn189PfwAuJimB2ld/VmP5j4CpXCHbH+m4Wmb7NpXEb86sgUWEbUAVF0EhzHebZKyG72TXOloCNkOwuCm7HA+8pMFmC0BLfIJnxhdoGJ2jU3L1V9Fqkhga73PEkSCptOlLT6NIJ9IujcE4m+XepmhPDIs88M8dhc7kNoUUxkR7TtCobE+Hk5T+je3RW8lD9ka81M7jw0M+tAJ8Bcka1Z24T2Nnf0Qd6UwFjsnpIyucPciNeYp2RVR2nKGSEggCX+JBXy3NDfbY5Du7WQPw0dPs9q7K+bLKOSMxmx1C5kVYpYKLTwuq2wdXCcbzaCK4Atsed8yUkaULx4sFhXR65SYYjD4Z+Gt+hjsyv0lKBnISYXgrBoYbst8ie0uopIoptrflMBFFtog7zSoIch7Hvf3ECC6QNCOI1B3ogU6GcMh7x+rLkOkg9uwQJ4ra2+1ps7XlvIYMxb+Vjx1+jbLzYe3o/JfXUc8bkq6e8W/enqQOYMX2YdKHVRrVExWIdQqBQHYd3CaAjB+JlyC/mtsd7Cgh8TE+hoteKw8bKshbaZ3ZP8OUvzSJjd8bvFVqKrI4R+Ud8tTiuytBXPvjpHB6jcRv5eWnG6uJfghyHsqXH6sk2KJjbtJHotYcrwMPatNHcH2wg4KFhUCmV1LH8dYWMLwSwDFFtoU6amkHVNKLXq9bcSFUcPBUKibSqWWoXRjhXFy0tAsY1cDi/F8oJJFdjor67S8Wucos8oe+DduDCEawuXqEhyYR5lMA6tNAZGg0bQxBCEDeVJDoDTLMI7U0EpMkU2OOVZB/gymx1XuzON0r728Zpkrud3XzIoq1NeOMcBU2CD77QUaNt8sojSGBOP8mzGFVnZZOQUNnvCEosr473KWmRiKZBN4HkeP/69jtpr8FzkOVNk7cZr6h89RUkaQb4ROZRbS/AgYAibiJdMgV0stdgN5M/t2LvHlIXUWkC51S4puX9t/B1nedH37wMS8uAoAS2CmaP4sUkPTW768EMRCi332/JHR4SNt/n7JPI2G1dIl5kDnncYwraFNj+HqgUewryFvs51hbhcCmyJLcbmNY0iT8XQLajcKkoG9T3rUAghMyKAJR+hVYch4ZdqoNhKC5F1+EP9+qGuKuF2gFBqjflHUq7TpKwU6HkQC8q0ujdFWPwv8b5U9BTCEDbBHmnaVE1i/oIPU2IZGg4EhVvJYLoC0Ixfrb3Dx3lZ8X2iCizW5C2KkygFeseWuGEcLpSR60nidTMlpFuL3ZUzbXs8nAWHde7W06xCRQkxGgRgZQUQRcxgQRD7KAGtPAKG7akArXamNwlq5ZDTjFyRlX2Dyuqoqorkrq7Qcb65IzEbeDEGxqEFttBnA5J1jqt+QOvoKclrXqdJoea/HCDD/wOI3f1hHbsL7bDt99S7E4s8rEZqRaYAc2hLpcKkQHMEPkjXpB28QtTn5uvDFniPBltosdYEzd23D7HumPjJEypeCasJ/lWuzH7P8C1LhBgMvsx2bS5voiK5v4eOlkAAm2gJrF6L14v7iyJ5SIS73kCxza62RJ1pAjjhxFIHzF9QVNYFInSVYGcgHFqAMhUIhQ54yQ8lbhrAAn+drVLUvuskpuHiC23xXqKCvLEJO0AlII5tEBqomxggnEeRt25UvMIpR0KD2VihSXaZNGe+oueRKbKymfAWkhzGd9UFi4kv3plgv1aTeCclbPWRS05CWc1pov3E9dR2JW2cKuWHJE0FMeCKbHHC4suXWXjwn/PPqMJ7p/MSeDtELLXAvC4QUuEGyi3mqMabviQGMfNlDpEv3yNOrbAlC1mjwW3lrl77uF57pgJj5iCWj/w5Wq1wjfIsLzb8VHFFNrZlk7XruC4KlMXCsQRQvDsauu2Ut4ruxuaUiF5WdVeVdN9jIPsSU2JxMI63NNxBePPFWiDbB29ASeyLbLchrThUwtIhli4v3LutNPdim5xvsJ16mq2aV1C4KCSmyIK7sRW2aqhFTOsS3BjKYCxbwSv4CYqTTZTygSVCqUv/m6gUTf9ZGOdWTlCWDzf2FC0xcM6tkdT+ymZagJ1Ztq4rzN14SE9J5vvUGIPK5XlVdf1pFrFuYyPx3My+a7m7IzvQSLyCwJbsmyJfKtUq5Y70TLdKYXJJuaqsvrPmWZ7mxSf0AjxsxxUta16FNzDOy26rIYSD95+tzm/FgOfho9W5LICn/7gzMtedobROwMYECXFBdUTnflVVhWMaEbwMeN+586rCGIVC+4MX+MjFUgxjeV5iF0yXk2RR9leME15LTdIKFUOAACftYqldkNvNut7cZVEChLdRReY4u5vLLLbh474ZKfuw29wVpT7wYMuSgXU8hz2EyteinGYFGDsAq+y+xCHEiEfIFDjga0w5KdKh1MaIuixQm9pXvELCFO0anwd6A4zF5uLS1WLYfbtFdjvF7WrKeXmGVW49XvPk+UooXnYb0YYB9S8Og0FHQ+GuSUG4lP0AQo+sRQsk8A8pEHT/VWnxfwbBWPhtaHJXA/m+tNMRrM3i4M62svq7z7AhEkG3oxdjqujvVqd8gjrtv9mEBKfb+zr9b1Q2jnk+NpgrtMb7NZejHcrCi4yGu6VZaTmZcclMy6GYzYXfNSt7ut5SkW676AWuS+NnG6XcJ4LhtfH4/fe5D7XUwR/S/KFPnWXPl8raUx0rbeB0CEyBxT4SD+EyL0XHH/V98VliVrpO02VEZDwXTSWqSdfPtn3JKjoWWlxlicpuNNx9Fur74vN4lhf1hnDV97xyOe3S1J9mxoZGxdc3qAIL32bORxK1Xxafna/ouXTXhcra0+pC0YxkS5bTroQokI+O/r74vF/maYpZEANdoTgvVi5aVYtiIm2K2z3KymfRRmNLdm4D6RvL2WLxMKXntqE/1onEim5LLGzLEhWZcNI2fjXHdLoRTqy6TxYcGJUlyQnKcd/w1R5TG68ppgvmS+0xX0d83AFbYhOiHToZbegUSEf390maAGltmQILfCRhDZ/6qftmE4Ye9tLpUQwcjAuFFufPQS+dfo6wbQTvermiJfeqpCuf8wcSNwO8LCyW2mHuEx1JkQsAFrMVpXUFhPTR3+f1xp0lRVmJ7EN9tqOeiGr8atGrOk2BTg1frezDbZS9CrZh+9F+VZTfHB7LLPbySVGtT4SLCtRnc1wfUSY45ftvFnudqMupS0Jw65LXxUCxDb9u0D/yTFDw9HcLbNFLd+YApfcUS+34uNkqkviVSuRmuswOa5sBU1iCuSJ7nCfoKYmBJxGh8p2xrLu1xPNkvV+R7A1rac1p7OqD7jfDFMLGD6b1A14JYO40CPl8+UKLPgoRm8eW0ZqdIPzK7wv6r9aYfgMx/WaD6R/JljjqolS8EMgVWeyq1niRgRZwpsBCfvp02Jz8jJ/nsJIX0t79cYOf9u6xOB7lwFWn0d/npSQ2lSmYV4N3SSooS4c/nhDLLcJTAr+r1fVGihYqt9CvKCaL6Af+SdDxs3WYy030UJ5nXbfAcBcOwoKbSOpQjo/aTxa7h3zFaf72i4W+bh6JaX0/4PsxQ5EFzu48u6sLvF0KQ1j46MdXVeSNSIFsdhj8dd32i9Wa3yZ9ExNOMiUW1lGb3E3AR3+3kfDf4+NJU92U/xxlDzXwoDX9/Se2CIbTVT+TYEDjc9w8l1Fwk2+TWPA99B+XClwST0OtX9u4hEOfLnfCARw+RYPLtaMlxaxhsQBy1uBxFTRJ5QmDOsCAjkUljZAA9D/SBRYGQ5vZirMV+o8WJlKviVmbaPhq4RAWX7X7bvuGHXEDQfE49Hd7bLKZhMrtsTf380G8bclB/y2n/yJ/xeeq82ZVd81bw6DOG0osVILgnbX1zErtekeb/uuwjvFaqv+8hMIjYg6adUzBQfkZ8szhDvZEJmCjAgKYgA0eV3UoqTyNTtw9DfZzc/fc/hP3p44XksM+KNhPCnssjiHcc2axCXFm0eRE4aa3/WQXHyTGBk1t8P4k5yQ77pM+nEmo2plK94Zfd36nZwtOZwBLZXcYrlx43osf8DjeRJFVnmYVIy1Ct0/mtkb7t9TJbTJx40oXzWGRLsiD/tznyHdzcVzYk0F/zmtvB3Q6GLo4MBQtY1Fhg/D5IvuUb9ClkPGPL7O0LD7WqKzKm1y81AkUL7kT3HU7zdcSWfg+31We9mjDXO2jEHrc8lNimUY5hT0Rowciw9iX2QTf7WX6rNOXilxyTI/qao0bTeImzru9cevHdSrMDuxnh24f+DBEGHlPlfMVocl9wqt2qNwee7dA6BoBwMzbuiATe5M/Im7XRH+3xHYUx6gsZTiZUhvXR/6U4IVSdq0RKt8ZaW+WeD+xbq0Ee/mV1JtGUJvGoMh3psASn3jdnPpsYzXl4jOBw8ellFH3wlwXPCVk7hFKbSzl9pk5CWqg2HJe4HuAXJF9f2G0YqmF6oheiWjAiIVCa7xfULXOV1K9JAOy5zjVS1gQhE0LbT3xZSy2xL7P6ruYciiLMKT+4ikXijR+tuXr+q4iiffOszjFHYPYm4dwbOH0RdfCAGHfQvteUZcEXzkWGNKzReXYYEjbFjuVoBgbD+HYgmIsPIRjC7iuKHswhKN+wno+IZZ7lJ4hBJLMADxE2yAxDcBDtA2S2QDc5mZIU0W4HdJ/teQPmOtcOA1+eIMrsjoVwoT6gEvIO1z8sRBdZDvi5v0z8hyasJuHyl2wy7DaYLtC97gLaAW9L86X2WB9jorVZZ5kVfkDFQhzo/D0HQxiMXNrFD/mdTVk7ZcenKkhPVos/9cm1TTVgtjbGzJ/OlRu4R8OnIFo2CtsJXuIrbX3muxksES0wneMWQQyitSQFv3HtcQ7peNXO0yi0Tx+tcQE5WBxGuGXqHxEKzU1ZTB2fT5+evpN7HH71Q7T6cs2KRr33Jc8q9YiUgHAFf9/owigMl/uxsEnSYHi6gTd8QlWpEA2ZzFDtS6j1qc8Bc5lZFA+LUEcJIdyaulDlD2Km0MQwBm/KKwggBv+82M5alLmhLXLySHFPJQ7YT+/i/iIUb7Qfl1obBIwJx8MYSFpNbZyi+TfjZjeFFFWRs0teGFhU8D5tyYyqRrSv8UrVAovNepgbbTjlryboaAnDOHTAjQiOZRVrO1g5SkGpACziQwo4nVUIqnfGASw2Qkm8ME2U2Dvo2z3irCHsi+zx0q2iCQVUZf0Se1XNK5kEwMfJqPlPkSq09uoK0SeWhe2mxIQ8zY+ReVX9Ny5F77m5GwuBtJ8KcAs9F4co211s05wjyP8uTnR/BRlq4snYROgBt2ZQ7PeLfGtxPu1T0lZ+T+2BqB0eXHNDM00R2yDn5aXU+q7pVMEPML5yVNSfEzumz1bQOYCULowlxmaaZirb5vHQn+30NolWv1IqjXIZEKhHV7guXHq8++AccPwqgd/zhaT3ZmAFLcArzDIoey5Hzqp5MssVmbAQ2zvGT4v+x40SaYj4LVUAMB+7HgzvIX2Z1C5jbUVJ9uEmDeCHcsVOeAE4rn4MgtbvMmLDJjb1HdbbEAHmQKb+yhlKYQ9Dx9tuGkke2NwitwEAPzEWnXQGAGCtBxvbCrqThisRRqUBFiNRfPbk5cBn6b8ex01VGZRjV8tDI8sqS6LJIbPz8VSB8zg6bhYakNJWX9d+yrvp2sfwWN5h8P3fg/ULq/goCUgrm2AZJCAWJgM2qNZ3yNZxVGs8xHsSf6cpXm0Aq63ckU2C1VfVWr2AAA2V1VilJWoxyHcwhKLLfqO9ecPlDys+TddqO8WgaJ1tkoRWWW4EFHqu7V+PSYJESEN2xZYuQ6TJ1S8kiQwgmeCK7OSNRITSCMQJE0E2C2j4mtzT9PbqPjq9sqiou6URoW/AfBVuIT31e3e3U0+PJMGsQ5d/BPbt7QvO4y3S8To4uwywjINp4aN42+HwOnS7pstFjCqjiuy85ZBPgj6+/w70L2TIHLe1mYX8ZGaHouDqMir7rYmvymi+BEPDDre5cvssX4rUhhlU2CBjwSAQtYaU2B5povgw2e+zN7MAtEKhb8DafR32dCYPKRyTsfN0CYQgdB/d3ADwbJu7UW3d7csxEM/ojRFVRhriMblYgdp6k/ERzt5IzLUuhPm3KWtAVpkXJEjzktyWxKTXIF7BFkyBucKRSXvhuq/zW8/ur9avNgOrKqL7Ar9q0kj47n1olA5bbqU9Xdb2YRersIqr3BnDa1oneVFO1uQ3FGFNnibaUeNv1SUZ67QGa88Yk8JaD9vcD5IsdSGU6P7+69i5jX6+xyKSk5pSnzhS+0SEJs2yBW2m7y1S3jkbNl+BoYutnHJmz+PsUoPsXlhsTltYHQodns9uIyKbvslZnagS2xPWiCMbInNhm2kMRRcBJUv5sgMePI+xSljPyrMwqhAq+bIGR43C7HEGn7Qdz3fXG9RPMS1j3Pvl91Thdol7acdvmnUYkjxg0dysQWv82hgLYSeXNM8S1IsfMKVCr7MSoU+X2QdGWSpP5li65PC/cmMq5osT4NCgdnFuLBCN5GhAfbBjP8tz6wj3+y7R2kSCZntm09zcLN0XM3pDBBxzxTY+IDCvoqAUeT8dfT2045L7BSyGkxK9+ftnt2UmilXrGnW2LMoRtV1XlQCTrbEEuMN2mACVuhTwntAgGKL8LpshV7apYR84N+jFUp3Rhd0c968GB7A/sV43I1dsPKuyvkePUXZkfd7VCR42zjo1ON8c5dkkb+dpsfvzhNWSCey2R5rTluSDxa3mbCi4u4vNV8sbJQoq++jmGRTKMgtaTj/DwxjGUoPxNBbhTCj7IFP9tN/M8fyI1nxSLpP5jg+AeEzn+wDnaMSNUSADnCFQge85IcSNw1gsSaXZfKQoRVlxPJGCQixdJB179gil0x4rHyZTeB+E4/PMff49edxSGItGj/CPkOuyNK+u6iri/sGRZc+XDTzRJCdWQFp1vFb62hMDquauvqu2jrk38u0LvhslfR3G80xyeumn3NcCF/J6IuW3IGdlyfoPhKSJFGfd0ZaJKbXJEZiOMtwH53iXSWpIxAqtwgjRi8V/rTZ8lHE1Hfbsy7xzhf93UYcSEBAUkB3vfvvDkvpcZ5VRZ5C55oymJ/YNc+zTxAJDiC6s8tsCKec/zIaeuGbxvEWfunbbcebDPPpyzYveoHi8PJlOyvx3TEchgsr+yPeAFpAhWxXTeIwK/ducckEHBKMO2a27gDe1M0wC7lva9OSx6BKh+TR6p/YwBQDVoVCC/di4waUIRZLbazaywJdoxTFQG4IpmjJ9bg5I4dMZKbAwumbZI8ktA3cFwmFP+HlLcmOtCHnJLvmNsoh2NZZgm5SDcv3QaJeIbCDbj3o1oNu/Z3o1j7dkWeu5Q6LS35ladVp9GPfnpgIjy2xiNMek0YJGQr4Mvt+Cigd8Z2XTeb+RFAaTMEc0elz6fGWyXhk41dbTOJKRX+38NfgkXxHRSn4qZgCi/VqHWUPKM05FxX1eWe0zU2Cimb181M3AxoHfaOou/sHGqFv8V/lorTxZUtcpgkRK3McpXGdUg9lcMMUi3dGTBqF5x0z2GNxEBJ51aUdhovOCEk3FGJOCB7nWYErTzMvoZfko/Su3vAbxubT/i/r/Z+Cmu++7gwvM2/gevpPaFQuDhN1/YkW5Jmecj+r01R6JikUmuNtHsQdX7I9zaK7VHg5VgJjszPeJNiKv8mbOSv5nTFXuDPMfVWnLYN557zsETmlulRUnoapSYvAKQr12Q6X+OLr+NUc0wX+I6p4b9r41dLxA7h8fuoAE/aZOf/cdyMux+x3KgRLW4bSWZ8mHjJk7OJDhkmN9+vFgxBhwRb99OpbfBvci+kFdA58b4BjV1k/bIRi2JjCRp0Qq6RzhMC45VBWns/o5fQFCWRgCiyoGr0cRxV6yAthF8IV/TwRlnLahrr68bMorACn0jDOEKpr1pNooXXB0wgBzBtldjilnUIr/A6TPlyhuC5ILHDnOAj18AKE1e3xBUNME21PuebFJIZiucU28/f6si1PtrDcFoDNZltrXuMUQbejmQJLfJeoSHLhnSiuyMJuJJ64pjZn3TAFNoeBePrgRweYkiWsuVDPy59nSZVEKSjgfNlPLOfNBOCCz7nnmSCFyEG6lbWnEWyqSXBPJBbbn4KHSaYJ5v11SPm7z8xJMAdj0MbZ7MWkMIZpGLU9I/ov9PqcF7wTgy2ac4cDHg4pToMWYiFvveamz2bUY7ipz+gJpUKMKfXdxnlG7sdBzyuwJXaHlSBCpsBi4d4erVYFrscRbfy8lJ4m+deEoMrho82W5h4VBSoEXEzBHHpfwXMP/Ja+/2aO5VNVbaEAKvq7VbAs8OL6+HVnVNLR/X2SJpHvCcSAxmUlk9edyNhqZVMwssbP8+8AoB2JfD+ymAmU4p0vXt19jZ8OjZPZI607DbPsahzWNLGt55j9+fQ3/bedYUO84oRgwwGNAxsq6v6+2PA6rbmA/PbLImdrUfZQYwtHMD6p7zvDxB9RhookDhQBwGNzYGk9il3nbLz1/Fjk9ZbFNH61wiQgmTuMy/YSxFJ3XdZog5r7tXep730XGpXLnRd1/WnYt2mUc3S3n+Z0gPyOGK6LjfBhtPbpSXsGk9SbhrH8mUK8pmm3Vb8u4ahr+rsFNnJmJrokqM8Wbpy8iBHuBv7/KE2JV4NzwIAAFs6AvOSf3+s+WbklcmmEgFBoMfbo6Twmt7kkqKFyC7dR9qDEDpVb7HK32xTd5HW8VjaiALOIzihvSJ0Nnnt5oIYExrYVIHKDKVgySuVTtUk/5CvBwqK/2xz/ZBVWjX1u5q+oes6LR/40CIaxiljCKvu10bfHdVGgLBb6L4OxbuX0JW7uEF9Fla4xGehuLY7dpwBrZAfmulRKq+/6TiLwHnlPDKt4jVbk9ktUPoaJ6xIxusR0GWGZ6LSTalqYQK7MKsK8zrKET7ZJfbZYf6J4nWRIZFWmwDLaBjyeYUss7JUka54yAVByRRa9rOMYoRXcT67MQuqLgl/Fu09W12MfyCnCJcIGqBhryxXa4wUPL4XCndQp4XSJpxLZnx1ciMxjx0Wenb5sCX8Id8P4Mgu3h3Bx0vbSpG3MhsKKwyuVeCG9/2q1Tm8vMkALMAUW849eKqzSBQ1Ff7dZNT4lqxXK+EWj/2pxpF9nWAN1CwR3qM8W7Ywe+XuNarQ63URJelRVuHv+YcAgSqfHOIzwTKNiqMZ5RFyRnbmKVxHy3IV4m1QotIlI4aOW2y/LXbjwV9Bfkg1wh3z8ajm2jrrg8KiyXRTLYMLoJ4LzpbsKteqcFTmXK6b9YhNxzwfa2wV4bdNXHsXw0cLOOOZsi2Ob2h9ibpFsPtjsCO7+ieKK3wp0Hy36ka+4OW2/LBngdo15/qbZjHOe8+GzHS5o0zR+trDgmjUvjsmzcoLXhSuz6uGKPEMYpSn/9hhTsjNKkB6qnxakMTmoQXX1iXxujdIVp97B5y2uxkyB3emNeHhjpd3zgt+6N1/sAkAzYUDjVxuzqSzFYPvxq+2O67rk52v8bDW+7skxrNX+//a+tTluHEnwrzj86e5iY9x290TsTXRfhJ7tirMtjUq2d+dLBcWCSlyxyBo+9JiL/e8HgC+AeBBPklWlL7aKABKZQCKRSCQy4fkDPVHKGWJ5VWazbs+C7S6INpYZKxooJu/WhU3nao845F3WNjLDwJjdpidh/+qbKpnNuqitiE0uJdtIkBQwo3CQAxDmuljmoZZ/Tdcgrh6s0WdK4ruOi2VeVC0z0BueXpGW6l9pLpX/fR9RTvE+Cix3bq5+1G5v4s9YnRcaxVsr20eu8whbbAL7kxz2JxvYv8ph/yqGPdGW8A08519AUYAMrp02nJzdzsCHabBBqALytE9we2fTLsjqjXvc0ntqNKKZw1HU959p9gj5RfQagFM8m3V2mWbl1t0SY8AZrC4FGH4Wlnw52Switw9t8QAxTpjNRx11cReFfTjtxzEW5mR5z6IniFet59tmOiNhGeU2kwPwxOuORB+6ORBxd79MhzNFMOmS8dVyFOGzhxH+ouWLBYL+3NXfdKDUT35PX0/K4qHvP8ApNoJ9A8Jox0ttxKtxwBLjKwjyMgNVhEFb+wQBysg6IW0/V9uEjzAuN8gjoGevqD6N4f4+LSueR7DL3Fph60MzZ0gJiDeePHCeXGxRXnlIxX1k+ySTAmXAjQPt58qKl2m85gVwIb/reEDH3GSe5Hfdtwk8eHTJ+J6Y1WTfAGSmXyP26U0iW6whHB6j3rvu6ouGrhg89j1W8ReNO0+c8fEq6Rsyye/q0KA0u4xAvEa/eubWXpE+p52lyX20KTOOA5+giga3vBRZwM4u8VnnNRkC0DwT6j0io4p0Lk7yMi4WyT1zd9J9134BAnGQvAEhSmezCSxfk9DNQ7AOkInfvay1H/Hv7hnYMi2zEDDBIIjPulixW4rZkzL8xPKlYMFRBbqUfg7yBx6p1XddA9uCiRLafdaFtSwyVkJQJboQT9M05sGrvutorUnIf4dEFsxGLFy8oE34HOzi1EEo7T40E6e1QRB+pEStk7IPfdvPYyqcrlQwt5tfNys8dZMt3W/3ONtwGShSJM4xvo3wcyremInq2PUy3IeuElkduNkXG/0yLZNvdXpijL7NZ10PCL67iLmvCG7JtUzTJVN7aiDejp4A8rVhmb4t0FqLjE9o821m+5YTmwYFynjHerNp4OGFYqCAQpuVElShrhGQxdIsNy38+RRB6oTpbznlOjcztSisWaF3KdMrHF8ZqBhVaI/hFI95LpZwFmQaRtsnPmvNP5LZjBGE/K7PTZXphB1QXvlUqtvV/X0OettY803TKZDjCqjlOhkU4cMy+ldvfRCfNWYALlUcg40e9/br1FvzWbrd4ZtYmYYirKR7Y/uPaHeShQ+MMxdbqgE5BkHSD6HZfpyNOnAahI+LBM56+OjOXUoA1EBFUIY0b3eS6yobKeeM3Hyeyulq/1wW4AK6D8KizEDm6GUFB6LJfbESmLkqtT8i8MyeUruvB3zL22TgdcNNfWhGz9mGQLxx0ey4qJblbpioB8zI/XIAwhsLzY6F6hNkPXW2uTlJWEaZOeUAvF0mVBrRR4Gm9NEI2icBtE8HzU9nWZrnSxDHTjiqD81kYxsEcbhcNZlbZVK6yPHSwTFypRQ39nRwc2r9bEyQiA6+cbIq0fG3r/flns9981XjkVa03oDiH2k/AB35XQOvqOjbX+tPGuujvItxNNLe8ug+jyFzpZa4t+gE1aJcQNZ1JR06WIYSQgbAj5TAvTIh4qpvOteIGSQJYc/Yd6gSffs4K7/oEg1KUTyBHqHVp3FlA043eg46Qx69UphSLYt2fU2PfvfWNVN4KNLsFGyihJOrifyuNTvPFy+7IFkzmUqoEo3zYHqZxnH63DsTtl81IIHnn1GyZkB1nzX287DPedUXHcPwa38t1J/0sDhj810Qn3WcWbZM3NLmm4YxOM/P4qCfg7f7+rbLinfZkzxPwwg7gTNbLVzd+A5sdbLbxRGivDbx4ZiD4m1V3q6/hza1G/MhZ0dfswJJ2MGqclnlbOZKO3ELmseCaDBbXCzRvA0yqOiaotkMliaav3/gzrc6SzS3NSvi2lJy9ubUZg7XdZ0mYfbwsLJQLee8BehgzjnI2c10DWeyiT6NYuTH0eYzV5jtfhPRlOvMNQ3Tckx7wFxOew+0HWNqI3aWJusIzee7Rf6tjOM/3t8Hcd73vBii3pp5bsBzkK2v0ygp8jpjy+p7DtY/o+Kh1hVlJuDBxqzRl2miwFuDHVlyGQ3LAZMNIzxHdhsaBneiavkQ4e86sopp40JY9YBa8lEfmktx1Yc9RwYapt+ahWob+Kq5fgw2Uu7hVhdcZXZ1FDiIA9hyShqIDpiGh5wdZ3eQxlZv2oQRq6G57tdkTYB1Of5DbZppmJYz3AFzMMc9zOymtxmRsSeXPXeRTk6aR9deU9HplaxmdIKl+pn1IZbG1JJFCFjTs0l74azFIV0rEXMI7o2VRruBPmuWaJF0sh9Mxgg3ZQxgqdr8d5VF017XqEp0Jr8BPcc5b3Gzm2pqbEY3bjTWM5UJ51QWeT7qTjgD2taQZWYVVMRtjyf8OsDvlL+C4iFdK826qAWj5ZP1dOef34mtxk8BdaH387HcY3ZoTpQa/CBswgQ8oSrqcoSgG0uW6EF1wBMiPPeYKRqbyE0KTz9KGwO/gciAhKppbxC8LhzddmCYDm1JNI5zZoTmThTFygmiBOU7pau0l671l/Z33nxYVskYsTNK3rVD7163ASYq3wUhGh1Y4zLK8gKxzF2Qg6rK+3eNS0zj3FeLmX/GZ3EVv7WpAI9I0T3Ii9v0ESR/vP/0y8dP79/hLMAohUJ8//7dyzZO8r+FeB6CJEkLTPof7x+KYve3Dx9y3GP+l20UZmme3hd/CdPth2CdfoCwfv3w8eMHsN5+6DevwSpB+eV/N1DyfE2lYCTcsRp3HBTR+v27fnd/WyRr8PLH+//37r9ppvn9/wKGCZt5vwH3BAP1bYL9hr9zmA4h9sf7CI03Xrd/AsgO2IG8erqOaoFqtb5DBkr0Brs1Un6Qgid9NqtukqcgCx+C7H9sg5f/ScIrsnIQXOOyWY9fBfEOPcXVxKvxr3CAE8qB0rlZuCAyCeNyDRbJMoKkBjsbOhd5EwQGFhQgLMDaBlwXUcYBnbUDmgNI2PeMC+79u6/ByxeQbIqHP97/9Rf9qSiyVArz01//asIwTsiGekdQh4N1w3kIIOXC5wimu5lm3I/MefkGQGGbneSVs7UNJNJd2wGNFbifWbDDcewSEW7qsJAHIDUH5lSepugG01KKtAmCiZ1HEwYmB100OJEflP+ZlbTtXEvNwZyl6WNU587mjhBLE+kBJ9c8gpfWx+wI9A+e5kHJ799++UUbKO3wq8rDylME1fUCh3g51ukR043q/+3d4j9W9Rit0Ac4GrYz+iOIy2HhrabxNhEmiGHTIKhujmhyw01fUnjWjP4F2nPiMfBVF+dWbxaYwVqhODVpmaz/7R1e7n9793FwajhaC5FmyzlCv5kghMCi4L31MwODFaiA2a/v/lvagMbCwTJuAfqi6JMzJI0ljvrCr5nuGNb74Db/0WSi6gE8K2N0NS8/BuqD/55E/yzBEqRnOFSlDLiuPnsZB5vFFqLexCB0fCy+KazUZIeHOCf6tmd9rlrwVYjuG5BXdusjWJQWu17bspW8vxjscs1gD66ATwbSoQHuUHVc5Cg93XVcbqJEwM9qRtLbtAzFa8Li9HjdvsWsH/seARuLTdhy6iVWQhtpQkxBGjev3Q5kqE+qh6UW20GPP/VFDwvBSgSR94L6yNCtNRBR5iayh2NYzMNbweBK5ahbGQCNL4AN994GLxcvYLuzMkZDILU+o2VA5CzGOhs2gYpU3GlvdpVgrThPrRPB0lh1InpFgqWPbeOIfVMUP8p3DJUJw5BuIUrx1yiJtuW2QXwNwmgbxOg2Hf6V42vxj/8OFxfSSw2OF0RHwYu7jpSFlsSB5IAF0y/axzTJVZ7MiqGmY2qJh3ZN0D4tyxACtdpfMQTdbVWGhIl5Dy7o8o6ypDmXll/STQQX0dUO8VuqcUrlqCRUbOB64cIvRYQ4UNeIgbP+OQL2JcjRK4EQvRgfBmkhQN5uwCxtmJewui5gS4ll6JtTwOl1DfXiBc1JEH+JkkfnziHBegOq/O0u6EfQ6uA25hID+9npmFdVUOsHSu4tA00UZa4wtkw5qleMLbJV2LJmcG0HtX4HqX9yJZqK9nc1aiD74vQY5scYZFNoVPH8Nl2CGIRFH7CBma0BcVUnXXCsvF1nUQhugmQDnDM0cge6Sj6nKDfRxson6HOQN2+i8vodnA04V344s7tgADjViTft0OwCY59Uw3NwH5RxgUKJf+VclynIYGXlsGHoN+XQ8GakGUAE1m4D+p6Da5CFkDhLOdW+QWagDZgsfjPu6mRbMZGnbpZFkKHnFED7lMTzllk7gnQD/llGUOKewbMwioS4tpo1Foor5bOZJLxR4LVtx6gdnNto2204Di+RqdAKb5LJ0HFzL46XvGREb6cjR8i+nWiGcdu/E41DhV94BnGpsL+dKmZxqrA6vqpv3Y3kOIZ9u0qkbCheV8iymiDtmBSxTK2mD2mlKu7WK32/xNRCP6UVrqMXECOhKK01WIFkW5vtQ/c+WkZu/8r5V325exIzdmpbUe5l32/5ymLsWN78qMR2fZ9xfXfbr1C2kc4czjycW2QthoUlmHFl0EeM0ZCU0aFWosllbrvgXUmwT0pc8quS7PmoLzGQLr3GWbgdKOY/ozXK42esun4G0eahsAAwX11ikd9mAZx58XtdD0rdIPPx2IrZPtXk2G9D2yeP0VkW5tUarMDdPk28uj5Ha6jZ2EzQD3jmIjYS43u1OniKoabUtlZXJjT1Vcwkx6Cx1ometOcB/dG07Wbh394t8uplz9/e3cI5GFHF4yL0kYeQpb/rMi6Zd/e2fg9nQXIOUIASKEXDR6sTvNMdD53bkDk7Ee1aqo9FuK8S7casDhRT5dY1tvrIzveqtvQs2kYJ6ZjGV1E//bvTM3UtBI9BSJ0T/AyH9g6Odvbq9LnodRV29qiMFddN1lftVyJNQyvnVb/W6Dk8fazH6Yh4yf7Su9rCsTtxm8LbDuKPKI9gbTjk0VO0LoM4frXSgBG4KO4H8HFpem5TYtiQ7eUKkU1z6ULJgLVdwzxZwy35LN1uiQOpFcCGwZ3cSDp0QathuLqteLsr5V0z3oCnCDxbqeUnu12WPoH1TYAC3Sy7V0NGazstnMJrgOFXTT1iLfFzBXKGzpHLx9L5EiGcH+BOWHwrt3eAc6xQfXltgMKfRaR1T2Dd4SL/M7ovzoLM6jq4gWGvgdReXFfFA8iuqWwgppEWMbxOmRl8TKAvrEo0OQV6IxW/nqzXvS6t0F/k5+lzEqeB3W19DcPSIzKJq+XbgLOzlAQv1fq6umfgmWDXALl42UUZXiXnwasIopJtoQaIHxtW/nXW3P05yJcB1GGAi1mlIRmEfeu1t7kbhoR9z0F2sskA2FpeQ1CAnD1HWuQ3ICyzzPKdfAvk7DWMQSU27OQdCe8aZFFquUxbiHjzx2CtFtYiR/EFLhLUxIpfUYgZN8EKoJDFJ7QgbqCdPaBw9948nhe5k/gIi/witxpCIoKqpVdmkKArnOQJLjEIrMoiYXmsKtLw8e9lUJswLCR5dZrC8E6eggi2pU78FmG2uDga7V5R4ozeL+lzRSvaaNjQkfraf3T/ik/gl2nW4HcKiOg2JmBPg/ARh19GT2DsMMSHOwRvUY0hPFy0x1IrlQJvX3X8CRcTU8Grwky4gNfAWBZgZw8HZ8/I0pj0oTHSSaI1aDCrQVrJZjS7YF1DjAb8bU30bbiWUeXT8vW0LIrU6ka9hvUzyh/iKC/sAdYCKwZw8cHdhzIJGb1DgYcKDCoKrUxVFADn++NVvPbbQX2WOktzj8+adhBOEBsTovT8leijfUaF3u04eABFwq6fVTmC3FjiLpICZLk1L9YimoIKPDNQLcZH7RMeim4jUK1dq40NagggL06KIovuygKcpVt0CYv2S6/M2nX4kMJuTsFD8BSlpZWJ2/Gr7Z+UU5/zGaTPd87BUy6N7tnP79i0O51rOdYCdivEXF3S8N/PqF/cr1oAq9rhso3KVtew8iHWfJljhZ+JF2QP1ih4/sptzwmL54JAs+B9Jtj1nd0NzP/z9WmGcxo9gewVrX592ybd2say2RyNvieRgbMO3doGj0pzyW+DLLq/F91MUS9qtHtAm3L2enV/lUWbqP8qXSVkbB+ADb2nQQ5qVdba8tjC+gqCvMwAmg3p4Om/k2m7MI+9oNUN+oPuyuCK47RM1jGo0llx7Oy2wqUCfw2yBRReLuy+FEA0DC7hLR/SypQMtRm7i60ouY7wLbLQTqZ4pQKZBl3d19DUkVIPRlit2GPwkRv0yDJ5xIaNXflpFMe2NxoYkJNAzs/pF4AGa5F7yO5x+5ABoA7/V134cGMDcF33YFu5rPwIrJbzhFk+hHCqJH3VHY6VddGhP87Jeg0h5Jdptg2YncToxraOu3VWZhlIQoOMWgwADw+WGuBvIpRRm9Ts2/X4DYoS/adCN5BqRT1s6G2IcCVW+XUc65KVql+tpILYDhyBn12EwoOP9XEO5UKUXCRrlMHe+X3YDUoTh0cPqbG5g/MShgi34vNq1Vi5j3TYYX8UV9h1EM9BkvZegDm3dfa6REHc1cdEPfkq3Djg6S59ipLjyNJVHz+MLQ2WD5D8HAnu7tCpLRjMfGAQOnAfMs6Rlrdj4GEvSlEap9ln8MLN72YL3Kfm4morX+S17i5gdLXINbYewHAotCDoPk2szE9o0z6GhXI97YPX2tZnikSvuRUqjpwkQ5+GZnHUYpM9Z1BImkWS9/AaMoohm7eOD1aHI+RYd/tQbu+SILJyqavf0L4d1HjALA5q5vK6ZZCKX45BfHfEmwrPqq2V5GzH3dIDuQGDFSw7WAt0S1OFwfUSwbPxfDyitFETawqCFxYqx9K2pRUCi/wSCsiye0Ko6iQzmURvPFSalMBu8NWOHxMcV5z6idcJOdwGUWSo1ge9XrQzIqNnGOA4ssA0JJsnqLZlnl19cym/KDdKU1pHYbB6/7FvunIzLcfEvH+WUdtRieMdRhjkfYTGQXeScpTgcdCoqB+HekscQ10BvQ7yHIWr8QW3ugS1DWpVwVoGAxHDDfB0HunI0Uvjk/v7KI6sQyVxEi2P5o7eLC7Gu/skxJYp27TJJCyf6I2YAN6Wm1ESZMl+qLEpryhQPcxMMrZKt0EdxFpIJpmwIVEoG3biKGUZgte8+haC1B31BqAJ2wVxWQzfXOrfCw0HCTPgicsoy4tBy/KnT9qxbdEo+oArzlytM8cNlP7jDwM/o3S7CxJOaGCt9VQBkYd21nlkqh91i4MUBcte/JxGWfFwTvqTGS3PFoz+cwiota7ZUTFSMX4EdWQz5G9S5nYaArrm/0eaEHqGFW5Q+anP2AiYZWJEuIyh/lhu0f1J4UJWV5GJXKl6DcRz8BSF3CQrZokBK2/0eutdGVjr+wBsnvE0Lu3m6LAQPLjxtjrP4R9axZu82Yrlbe2Gd6+C/dx4dTkDxj07G0ES7LmGsHy5zymtbNJb0WBZ082tnkYSvhSWcYuxFPjoEtgnJ8D+Ee2u0xzFczPLQM6xijzAXZuva5mt3iaeoxvWNjd7Ksv80zjdXOOAMocv9Be5Ew8QNWGveHmF3zYS2p6NrjeD5LoVPRaIsBCsxDMIUT+nzOsRs7dY9TQFm3yR1IjaMNICxRlzo+6m62Hhr/4Gs7blOok2XsOyzuBDBPR2BRJNpJPhb4O/ODCH1fFeHEB6C6TfaMHu3np9CZJNqZM1Tl+PG2HTxwaBY9n1b9NdFOpvRHUzOyeqqe/1lQJHq+1V1yoeAiNeaugPhtPXjLoBsJy5eeG1i5nzGBYvplZ/+dTNuuhYe76M0XRzbMGqYqxqii/GkNRH5morfOqwEubXsr8ZPNn6Vm1ZucnGq/jCwDJBTDO+9hZ7BEXAdYbQqpeIBvc2gwxkkBL7SGS+gjgadtvQ2xiOZk/A6fkMN4a67Yp0ZPX7hvqTwRtq18erb7XaYJdWiyeEDUQSTyk/eGlrZG1i3aydsLmJv9jeueF2w3AMcnEvpJABV+8vo+qZolyOgDBX4Qgn1G9QjT6W9/wO74LwU243oJB3nKMLKhcXZm/3UvtxYXBMdz8O7wSc7jZvlzaeblrU39GmcXyS5M/H8XoLUWsgDXEr52dmsz2qyaD6Iy3skjx6ftiKBu0YWEp75bZs1bWcCWtVT5BqeezG48yFQgVVxeer5HO6BdeWMYnwlv9nCfIiv03RArIB5iqQwjy1I2ONQfvV8E0agyaIxGGIhMlv0MihNUeiam0ZpmHSICEXL2gmg/ikLB7QXIa4oxsQYvl2+HvT5Izozom+mcoF8creIdhamDuGfoUY7zZ9BG5OHxjcSRiCPHcH9Br548MJFr8/VgCrvCLr3fLwlx4m1KF3PIbnNOgEptjuAmhy+UK/W7N992aJTO/VmvWzNzujG27p4rlng5ULWNfBK7JnOQRVpbG3El5ivpZlqjAEXAH0mqeiwd7lw9r2AbE7YbYs7woUWX+RhDFEVXE4fjOTxE1nFy/jdFalKagD6o5FIdXpOJTWsmEcCuvORqUMdqSxWPU7o8QYFPwR2huC+BIA32Mq7tn3AIt79j3aNXw372Cq5CC+GdEm6rfqhQ6cgdMgDhKPidGJTCoosQphDPDYlbcu4NEDEgHW5pk/Fbt5DrL1dQp37PwnyABcK5ahBR9A+JiWXV551xdkTAf5f2wdvaKvtRqBvV3XEuwmWFp7jNk5oRHbp9G5DOUkxcvyDM4/rXgZTTuEglq7mQiEkjNNm6HP7n42yB/BWjR01piePT25eduPgF287KIMHwW/pknx4AHuf4LADe0kX55HULgV5+Cui69jdnvSgqmj531OY1fhjljgDhmBAH4aJI/OzoY9uM6WGAl3ceYaZJtO2C3YxV3gaEOqJTRWClxG7US2WLgg/oVX2m0WJHmAX987ioolAu+M3UQd3IC8ZIOmGkqjHQrR7X5wWMAOsYYH6VYnco/6dYna5sC1ffg6iFxd/TZH3+p85mZMa5Do8IXCIdXRqLwY7zTDzx6QuzV5XLgBKP8occwyS0f/DTzXp/VvKbpnCKkoYkY+GGEIdsXtQwQxDeBnfEX4OUjWV086Sq56csL6/Pw9h4eGzxHkg+PIqNIaH/VzaLctra5DqvS02r3Xzez8H0aIKvFndI+PGMfGVw3d+jPbtbSa3O85WP+MigdD/uo1t0aFStjpwzg3GicfA/c26hfBAkbpzURwbG5sm3mwv63zbJZc5A2qOPB4oJUFTUw3PEruHB5wbiCxuwhpLq40yxaiO7emJY7x7AzDCpw79L6CPCd8bi3TXHQzgnXJybLk6HkrHcvjvpZYp15GE2qB19PmSnOR8vd7EhXXWRR6vwxuO/J+9zsGNaNQ4vuuujmGVZu57yGje/M9dt7uH93fO56nz0mcBmvrN5iLvAHlRGv6Alk8yUEDU6gwKm3NUOr/BNHmwUhnVArZitMBnwdF4MppGWfIxUEdfa0IEEdPIHtF0U2sRrd2wiPhebBzVQZl/KbpWHSVSbSKb8SzMbvndo1zZtrlT5y3Okzal4/I4jW5l3s14lbO0hhCz8fLSCHNvTs9uTxzur2rIc09Bllt+u095LRB92zbI0kjPOEecJsF4WOUbBze3zYgv2fyhK2fftEPLoF9If3qd/iCF7i6gW5UJUfgxtgbm5V3LNaill6jV05VSwfXi6zx3ruVRpklfgZxDIojUpR4LwqV0kLhZl2a1v0OX+1nX1IyfvhVzCrwvh8KUL1coyeMkDsmul+1Yl6TmKM3IMg7S5iBrUGgPPfTFjhNet6PfTUAXOO4WZRZcgP+iQK2HKv8nGZXnFyIurg8qRbTZZpVjOTGaFOzI8BGXAWjtQlQVadArafMvUCHthmg7u+/pa4e0jkULryxJaSIi4fn1duv27RS7wQ2u/GNEyMEmF4+pNiL9yzIjuecYy+Tr4OsPhhaXSNUVyhm7kpkW7vUzh0H2LspTb7LTOwh4O+RJFy6IIPsj+7BvenOLvbovZOB9cwvd3AMG3f4dh6PQSBOvGb4A3+1o5/oKJsepNDsFjd6M3kZxXC4+5HvtGXu81VSj54kAqZVPgJHCoJkOI9hbfDpd8WWs4kTexJHgTxc96/aarqraKrVlYxfp3xRYH3dvS+NU+bySC/BpOXKPIY1eRxsr7pJ2G5dLh9SXgYhKJZpVohfKarDuQVbOJAF+BxZeukheqodC33wEfi4nqXbYHOs60+WLUHxGY9hbsJu7Lv0hO7iDdfQfwRZBI9GrZg9S7d3URIcjRb0WOpMuNLTKCgjWJjK+VcNkocESXkfhCjKQIaeKfM9PbyiYHx4VwrvjvHyBf1ntPYH/LNfR+UgB3jkzS9TtbpBf9BdGZgGT/I82iRgTSimg5nL9VUVsT+0yqNyqrWNDbIxO6EnK/p40K1t8Fjk2I8feNOPDs46CTea8JFrNVS7aO8ar7CKelUWV/f4OyYzt7p650LUVS90kPzkTu8gmfoYNIxBndIk4Tr89zous0Duf2kAWfLGSQJa4/T4JUW7kB/Y1ifTRX4O7gMiOJP7k1Rf3z6GJWC7OTT/t4O2qnO0dLuHu1TK/b6MsXZlC70FLwX8tN0x/gYW127OXrehl/L/LKPM7oEgcfxMiiyNOfe1LrUVmwTetjzpcCvto3AMsmTYsDloiPZpd3X+Rngc8+Youb9nYvtkYV287NKsqNeviZuY8YqtCMiX4E0VNrY8TbpdW878Mcy6mOft54qEZekBMdK2Yu0jOp8LXYEZ+GT9X3AiSf9Y55fa1fvAETpa5BDSEsQgtIyA4eqEip0F7L0Zv0TJI3K5453L5vMoTXBkrh0mjkZy9uk3FpvcgRQVujxTj620G6eifxO3vH4OSNyOvFiGD/vqIt7lUWw/5H8TL+oYZH1DqzygoUse+N4F5CICORitNhaMpU0R5zKICFGjeqnVutWvCCBWe5fcUd8aJZPDimhPUkCGaGpzn1wtVf3um3b1H+i7Xc7uFoyOu4sSOh97XjEG+zMa5x8gy4cu0/RdMc8egmQD4nRjsN6Uxe8tFDm1Y8/hy9+JHRgcPN1r3lPdpCaCgW7twufF6hmi18dgZ0EcljGR1cWD7oIF7VG7zaruRsi/FX2Ry1v7uUBBq45hNmy1AzxQK5T5KM2jgtif/+3dIv+OVdK/vbuFgsDIEHBXbo1YBbfssYiBf4up4iIdmY8ORsZSk5Hi94mHHxmn7a9/Ndkv8U/32P6qh63NbRyZ2/kYRANFsDiVmfSOQu2qF1ZXdSUzCpSB8jJ3uZMvEtTUMkT1FjLh+jbFY+7jKc1NGYPq44FwEyLI6BavbWilMiMoqF8jCYSenZ2WEcriumoAaSsgLE5XOzS4A5beT/pwqTeilnlLLSyjxKCRcNzdkvfTOR6+SNb1iZjEC8mZf+0mgaN3BtHY2Hns+JfWTHL4N2Y0ZEbH/qtuHE6xoEH1a/ONC5iL/DZ4uXgBBKUmYCCQMzidmzTrn1PcO9VO5MXAfY40fxFwNI4HDOUG9kQWhPOIIPZPs98u0D2v9OmvqsaMXHIDwjJDjtr1QfuI4mn3STc4FTIQnIe21hWDo+Spoak+Bl45ew1jQL/qN5oeBOYaZFEqziimpnEhGxKGZpW4ZlkEWaGQBmI0FekcbgSW+8AiiYooiA3jxNOtZ58mHY84/PQlPYprO4JcLXez7k6mD2C/kyEIojqbPQQbmV8rQ+jh82x1aQGReE6ztY5W5+aQ8ckAqPblhPL8H4mcgmR+AU8g1hcMsOUKNyWvFC9RnyYuOg/okaBCzgrjGzOnGcx3J+t1BgHq8LNO2GYfYlrJ6R2O0FDisY9/NYm9fw+yDGQ+YDuNHA2ZeqMX3oteD7g5d0FYWlM+F8WO9qcSCGbd4fueg2xQNLs7xZ/c30dxFByHyb+WEgbKX9PQSudycETRPSdpqFcxPJ1jPePw+YDrGOXQh8lStozh3Kp4Ll+sYx/cBvedN26bCbct45LxrLcG6uTSK0g2JVSAdEZOmQPx/EbhUd14u2BESMKfWVrunHMMBGyk5vUncgUBOdDv1JyQ/Dx3UH+08gC2AD/PvIuPgoMxwTqs5ypyhS5MLvtY54v2x0nLKpnn4XOQly106BhttC3nLjx9l+jGbdCEYMDgl2kWAogj/P8kjpGdwsrH7XOasykQrSMjw+N/6iimwWXwtAjRE6ohaEpmnWTjDtjJbheD27QMH9zB/JrfIhBbOK0uAXLdEyZ10vxcbOPTdE0oRXbxJtOkgIKpian9DRTPafboeu1dZ9E2yF6xaDwrswwkocErHz4Uy7R9GOTFS4if7N5AkW2NHx+Yj6hleCTqwHjHsBXO/VzqT9kJH8AavYMI8scj8loiyTZIfUa1tjQr3ZRJoh7is8XhaxA+RAlAv1ctEKuAFwREs8d9Uox+cXAQxY42NiE5agCryyjBWXWspq4B4gGdj/rXY8syDAFYO8rIfZFljrQT+HOD7guuAVSSrRKINJBUrmKHNWQjCXkMonFwA/urwcodDgRndLuaJhcvO8QTQ29NTU5MlWuNgSDEzENLu3935D+i0Ps38FJA4buqm1vGxI/SzDKkB+TP3VVCCRSTU3FNlqmoFY2KUU6dz9Eari4baiAqUCDWO6aHS6W/l6AE64ttEMUnRQG7ORYXY4Jwk7xLRGPrsD5wj0JJT8jHmEYhcYLOW9qZbJv+ecbgNmPicvcVigO+2LYFjIiuJ9VwyNrW6qNmstyPYZG72JYus5QTkMZSzblNnYO8Abv4VQ+uku505hriaRi6Brks7/4LhIxjtrX0Q1ZONzZOl/59S7gabrPI8i0KBOLmBIh1hzBEWR8N4j1Sre22UpCsUabTII5fPWhKJKbHIDvrTUK2PxpEharvIIY39aEYTvzrMOf4XqeZyBShdsuZw1nQJFZR28vzwScOJoCrg88ytwr4i0IHV4nyoOTDHAhbeViUZ8F2F0Sbo0iTwlszhs41/O3SDJjSHun7RRTnGts0+oNwuG7Tk1BjUWgEn8Rmyibv1bGysvXRa3906q/pGuBgK84tnV+CvKigZ2BYWChq65XmU3nzD6Bs8Fxo9rq7C7dciZI8oVwzUpg5NvvWcPjR3jGnhfXJIaxfNWEpy+5v4Dn/ApA4hGxMhFQ7AhHOpVyenMLNCUTJiP+cxwxy1WFzVftICOP4myjNHAnhMhOHW/MBx0fE9ZiapLX5mWaPUbLx+oLhMs3K7bEtVW8LdPKADHg6bUO77KJw/lGArrPoCYJsXRqOgGvtE14g0705j9Kt7TK0p+ZokG3t7KMKivZvBhHzUfhONwYAFLkzsIywWb8XPn09KYsHO08CAtgNCKMdk25qhnLiKwjyMgNVPMFjEBODpgSTMC9+g8jcoKloGUAe4fHfTS3sml7+ugx2Dnk2yY9EgXrjsXF5bLHdpRkKCX0fHccTTS8MdpmiOPx+QEexgxzT3bzbwmH9H3W3esxxNwAZ4NfnQRFY2dUeo53VkSR4BDbtq3ySV4mdVQ8uicsIxGv0y/0rw4aDztLkPtqUGeX9ZmWuvXgpsoCcQsvHaXG5TdoHTg4g3oC8jItFcs9cKxiBq73OIXZWT1Ta9l4eib0m4bG/EVOZim6YVqevFRSnydWWaZmFwDRoBI1eBUuOHh0UzXAc+RuY7XByMrKpkspN5ma5oeI3sC+FH1o52d1UaR1KDGek+OIuPge53Fv5N8PAgwurt0MVjGWRuRL3FcDTNBW5DigJeThHng0HFy9IAzoHuzg9mjDj9QnDKKXvvdSxfTqt34Ey7FhD6XjKXtVXcqcziQ6g4k1nAFchiIg2TBRFE6eJ30b4PZv9qPIgWtnd4dqozBuDb1IMxnRZ3lVHW9eANfxcTOYNg1cywpui7sK/BK2E6AkgJyJLB1AtF1LNferNNjSKbcjk7T1a/OivmnLnq185Ka32HpClTxEcFZ9pbxd5LRcb/rVwKbPf6Ku15MrqNZ0hgsuEkPlc6fDwJxLarixUDaNVti9npirHatvV/X0OrN4+YFdFGwCnQRE+LKN/WSkj13BFV4H65uC+ibKZ4ztlPWVD+9SJr5r/Ee1OIDhL39WzGARJF7zU4V5+GoSPiwTOTvh4dD5Z9t4t11ViUqPTa9Vwz7PxjOFOATn/PgiLMgPZ2wMN2/DAEXjWPRDO4Tq6Sbb7xgBHygC1wHyb/yOd//qEVLPBMUx/qyJ8dKKhfLKB4lu6Z2meL0Ecv03vCNOr4WeYlHW6k8MYc5lZSSk0UFKuOhirxpKEvjuNnUkCVnzQpIekSXy5but1e07+Ga03oPhHmgxC1o8KGBWxc3yvy7sYRwA1mpm2tUkeLkfBw2XvV1Xp6MEwfwvBPulXZnICgDtHKQR6AdfLQQk+TJRBKDTUyi6yepBBlNF4GnYPW65IIEaBMStbr+4tjnIYASe2Xi+yCqdDPQeEWc+xLARZfV+NfjMmVDPTvI18rfjFh4zVQYAEYoDDKdhECZWtyugy6CF9vnjZBRBNqxuqb+llGsfpsxUM8PwzStZ2QFCaENfrd1m8Dqw6/UyoCE9uxhBbZFHSDzbhhy3Uszw/i4OBHMQGcB1oGXgxTa9pYDT8aBtQUuAbrca+aaJvNDBWrOLBrd/0xak/rKhQnemJR6Kp3aUDib/mtUfX1IeTfXOr0mT1NpjMBoTqZNZdGc0l1ZfZ/ZHtXJLo62HQtfQxk7VdpbE6BxuTuaxbq05l15nRbJK9GV1G2s5lD38jHKrGPma0DYWN/zCc0RaI6pw2nRnNKN2bri7atbWaVYoCAxz8zWizn5AXxGPsn2R/+7qHMjRozizd3OfsNlcCI0ysWF7vxZyOvAFoz+RNGYMlKKryMeaT6nBfZ5UlQg+Pfnsvem+tVlvPsORo4mmGRz9M7OcMXwf49dBXUDyka+tppqCNN9dst5pistf+4Gd9+RDhR6mOpp0GN968c/rV9IvvAzj4mW/O9zdpDOylOgFsRMne79XMwlE3P/gZv07j+EdaQC6f9OZTYTRs1WRI6EmSP5u4TZNtfUwCCvB6lm7x4+9DHf+aPu59p2F8mAqgSgxEpWxncBLMbqy7lj6Y4zRON8fCHK7mEo3ZdZobvNDoWvqYSxw1F4GHIhcc7Gy2VBpEfu2aWqGAx9f9s6naYnIDniLw/BnEu/syTgyvfPZiKimCjS1MTXMrVH4GeT3ivif20Gdzqndr7vb+ap6cbRcoZGf3YNkojkfFmf8J8ls4irEDUN9STUgiXj/J8zSM8Mw2Lhopij5aRVq6ATkOCrVqgv/3mP8iWb9DZyGU4KauUGO0BPH9X7qPX8u4iHZxFEIU/nj/8X1/yVwlVUjndyf4OTcyweVhsGaHA5KxFuLAwZzGh1uBxu1/MV3CZQyQr2EUxGdpkhdZAIebXfNREka7IO6PR6+ionhAlLYg+yXnYAcS5PUpo1ulXzKlA9t/201vBobG4/cPBFMp8Fr0L/yEB+O2R4xGos1yGV16GCxG0bQX/EXZazq/VPSzDq3XV866SSbbUvNLF4zCcFzUKaQENbwwHjUAIzAfnzaVjklMJ2PC9tLvZAdnAjkt1pdEEchXS460Jia+aUvNdfdxFOZj3BF5uHSFXliuJXkEdpO7Xwr6lF9DT85mt0G2AX0LESHreFMrmtIDZjOtKZ+CzeR34WOwWeVDhsOU1W9whFxFVKUmk/pOz+Mvf/nLR2YquRARJFWojriD7GEEBukTq9Jl/SpqWuZADoa8YRqBNaKerkZ8PRyWiBTVrgqvGTAD/gu91JAd7KhKzBy2BfvCFFxy58AVJHaT8UZtMuyxCEuD+Vz6Oon1EKcPYUyhR6GjOt+2h68+Tco81uT2nebkj1QrqCedg/sAzsFZmUHAYd9ThTzt1xXok37zUUvq1H3ToJpvnk7kPPL8MERDidKpiB79ybhhWUC9+Ro9+U5CsOJSYDZ/nqQMhS+FR6/EDzdpzLAlM9HkKJ2AKuSm3rkaJrq6v8qiTZS4YKYBsdI8euDsOPvPCNwXHXIWaIZ+claACz56AtnrLQpwKTRvkJUo0wZVMHOOEJM6PVuQuE3NE6dlsobaTwG2J0WRRXdlAarQ16uuRMgqDAzeBJOlY2q+QsrkSDKVvbAnOzbj8aiYVhUcutbzYd2aV/mP7Yyk0Fisqbdg3DLfJCynwWOEm89M2Mwpgw3ulm9cIu90JvzR3nQIoqDM6/KqhzSPsw7o6qpPkZLSXleeDV/tzbY2IVONL6y0eGomoooKfCAJPEHYsslKlDmbKhjVoi1CiVvux64tHDqvLKfdLdlgVry3NyJtBsw2vmjT5rOpxVsTTcuhvXzAoNXESCMhtd/23cTJDQAn6GpqK3cz9RL7vP11xeyYQf82YkSWoJCb3KN61aZIG3JhbVpwfahH2nb6MRh5qHiWMw3BI3CVNOKkoEt5iMmJOGvAa1VDQBwsX+nM8QRsJY5EOjZXnUYxymHKj8JqxFNDXiA6cm9/uUHN8kwN/vTcAOEUEOKKT8RMN68aaS4qbdnBbF4NRTqb12R81cSFcPx8cUDCNL1SsLqPe//osCVFpa/J3xq2PODclXWGbDCqC6oWH0zvetoywnWGAxG88cOU/NCfhMnYog1e41zrELNC2ycFifi69+pCR8teKAoY3dt0F4VjcwHulGWD+vNh8EFFzP4wQhXQqkrqJJ08Ku9TN3n151FOIbhDFgVPrCMaGI/Mo/ikrsFrDiKEg7f+jPnklwmEjvpcjitxcPUZKB8itG2mzicLja69aM7rqPoLRmsyJmoimY5r5Wh6pWB1H/feytGSshdWjpYHxj7VTsEGo55qtfhg+uNsywgTWTne+GGWVg4UDH0/gvghTGnfM/xh7/cTTMZe7CVd4PwVi7TuTHnkkgpHBoPmsx/3RNVZdMAtNSFKcgZWn/z2FmFeRwHcrxtcAnFhRMlxQjeOeZNLUrUXtjkZn6Fvg7yGK00cMnR+PMcO3Tz5DrWbjPcuXgqQJUF8UhYPCGKIC6vsO/sh7GQUUHjJK+69+JOStxdyEAfz9+A4JzvW4T4pIPWXffeXq8hQ6Yge8Ilnfy9EzrhMM6YQUeeayaVFE8/2ew7PlJ8jiA0Kv8aN2zzTANck5lx86AoHE+iaIkul36bhvHiNs1b0ZcQRsJi6TJmKvzCG02582LQ9Z45qsWQx8GgBH413OkL2iWHm/wB7GrYZ8bG1HuNM/cT6z+i+OAvg0f66RAnKcrD+GRUPAhrMp3HgLq3BggLWffQnScYK0dbSosQT3KmYnEUoXYdPkOmUepI1PMy5+Iyg9GhxgCNu09Z7mobz4rXv5FKYqTY0J1YbTUcy5jNqRqdVm76lBZi/nv2NSBjcYVB93W8e6giZv559A54ht1+nEEDeCKe9sE9yEKfQ4Zbvve2SR9VeWDJ5fOZ0ExxQx+fDLqOJIVNeoaZlurgCy4dot0UBBea8kzVI0gGa2o/7zUAtHfPfxhpUscWIj7fprHnmHMbgQBf4icmlM7GOmEjZLNE2mPaSFqGxGzW4zds1/fveoE/GAj+DGC7wvdKHKZQpRHole68D0/TshfZL89MY+u607DCaiqLPC1Mft4syS27AP0vgIWiFp4M2gXLvzESV7L1goenZC8HShuIbX115i8Un1FumPDSnGJGzICuIdEM+U2MNsEkfo95Zp194OCmsGNpU+pxByiqGhfZil5oDm425Vxlx1+TbFcNb83fumQNjjejqY8RXU3v81P0vdyCM7utHIW3CwD3gMSn+PLxENfed++Tk7QMr8lG/2qGfKxW6SNEzzA9qjOBLNEpoVcCyqejHxG3OQrYSVEas0mGCC2CmwlWdWt+Mc5Sy2ZrZJhfYMgqm5vlGdbgNNoMpWWajRXQ483AhSw9EWyBI0tAQprPR8JhrICuLfE45k3kMLKY64VNyGaw+OaP9CLIoSIpWtp6l27sowRVXkCeiJ5C93kZbsWijKlEP7KgCLbPgMG481pJW9/N2VDhAXrlNRqgKFiTac+a/vTmbz55Rx993bXl06qO6Anv+vYQlcJa+J5GYR6lKJC/QBQcpHsUDNGvWI9GeG//tr0xUYcmDlX77JPJ6x+x8CdrTyLBVkqnImfWxLZFiuqTYkdV8suWo9kcJkRosOhu7Y9+GrkqeT+4YlYsVcByJezU5yQsfG/Fwh/jU3Cza7Pda7M5PD5hC4NooBLORtn0ifgRx2TKpnEI/fDEu52JyVdCsK/rkYSN+8sPKFbUa/NwHMDVbT36QVzms7feRfH/O3efpcxKnwXr0dCtNx7QNvf24/+k1WlpU+ppBXo1aOCyD7S4GfORNp292YkFrbkYUCfTgT8YLtxHIIH0h8BiVHvOEF3WmxZ7Chfh6EEHoO3pUOptF6PmOreZv1Z2GiUa03Orxz0xste02uQcc1EeZh4pQedo/fmIo2ge26vhJxatNUwH2xFdtf/iPvtsRp3T/VWmWKC2dejqnox5/DTi2iSd0PKe2GXHXSC5tFsw1qUNbhUEWhI/uz+4+mQujzGHx6vOBCKuKmv04+X8NkvI+CIsyA9noZiCycxogVXAAbEHSsx+M0aRXWJ3s4NCD9W1KEjGoLs0p84qQzfgVDibzijbXtXM+W64bUqJMBMoRcJ82J0zFgdR2NCMurM+qeyX2eFYQpuxghJ2OtWOOcq7lMLUHUBPatqbnrxEtWybs1dymTc9dN2UMlmC/xFaN8wW+Huci1KtxMCKMpmvPBFnLagPySzy90mk9CqbTZ4DJOI9qMR37nQUF2KBIomObLpqO6Svv9uP+myxaWvbDXNEyguqWpzWBnqRP051Y+ghq+HFi0JlxR9ylL3jaiZ4Rq+3Vljcvpht9yzPnvJlsedfBK0oK8BUUD+laWdxRrejDI10yjnsE2aeYEWXV/BwsqbEYgRslFCqdNClemBtL7pVYnCtLji4gLVlyJlISoVHjUGO0J3zYIc6gclh8RlCkwVeT5lVC4WA19126GZPeiCwaLdlS16mY9aX1vKViIoZjBA6U0ajSfY8lZseae7X/zpcxR5eMtnw5ky2YfHagbpYxeU7i66RMdCk5LYtrHcRbEzF9SuYakglmxop7JR/nyYzjm2+suHEmkvEaZNsoz+EHRMbXAEv7FfEVhGkmfn7JVKQOqEzhOMdnHkkixMgafuw40qH0w5l8+pSsOD1spxOTDyB8TMt+0Avms3j3ZmpSwoktHUd0csmSo+YzrMXAePphTwGFSnt4v+ncGHT0y9+ZMdS4F8PmjDT9NTEUsGUGKd3UVs7VIokQXEeZ1cUs0++4lz6yX7jfuUgZepT6JGZiNvzRJKqVU+Rqnr3lLeUSJUXNb1ZcMwZxy5Q6qXL7bSfjT8QGT3AmvqSbFfE3mkghS/brUQlP+2WjMCTRqwgbX2lTZWPmh+9IolS666E4C1bbi8SX03HVmOkuddlp8kyX7vnHX/SgPuscBsvsDauc3N9HMfwCVg6Td8u08rZDGlD3dd9zd3ekKG09FWITbjlxZQHzGHrM2+YTc4yxxNeDuAvq6NGRJ6jtdJfjUMlHEaOibZC9XryED0GyATdwRZxBjR4k4auEveoKNGs1H9WlDEaBvsSuvnjiCR5dfvihokOlI8kEzIM18I83npiAJ6iRn44ZwgewLmNwG+SPjdWH/Cb28CIrURNKFYzjRMMSIUTJr4VHPHSeuI5DmUq3ZLvJeO/vJSjB+mIbRPFJUQThAzZNj32rwcWiF/2bW2P/7zT4hKl0PP2VhoR5kGQNNgP801RiWKgtGOv0PUMG5I7gLHmwxnQObLiqiAg5D+iJ2aYqkZNMF4yybxLIi/jNE5eJh8o7lyl1R+I3B94iRJyQFLuJPQrhpssGk8k2ouVk7HeZZuV2Wd7lYRZVqddc34eIlTKmbwoip3TvrdUsTTq2pgmDlEdPQQG+gjyH2/DqMku343EJ3XkvNhRdtPf80SNIpUdyMubCILfpG3vMhD26qZiMORbbXZqhIGP3KF64T7uTmEsoHCiIvZKDMBjRNGmYiqJkM6mx6OJlelahcKAPby+Hxyo0TXvHKrCjOK28Xbk02M+rpyNTH30OQmShn/O59tw7YTaCLpU+a/wmY7TTIHxcJMsiDR+9npO8sJkAeQolYZ2915dElO3FoUvEd/NPEDU/phsxqK4Nz02fNSopFwXY1o5K6KfkfiUpOV5B5OeRUq+QODO4kEWerlJagkfgrh5JKj3iJpMZBtI4/pEWUFmseQpNTwcUm5LanRR+L5Amd5uu+u0GN9m6LXevbcs0rAr9/ilpyhQq3EVbbZYNBWPYGKQjr9XnFPyFPpwk+bNELyOq9Ge1+TzOs3IbHnO1MQqGa0a81aE4GZd9A8/5WbrFx0xFAUY0GVt2kV2TIKnvBySxhEOt1d3IbIT+Rhu5kDnaCv0prD6OIqEMOMmRXOIPzzz4p8FtupNhnG40xRHRZGxxRHZNnQDJ7wckjoRDrdXdyGyE/r5OczFztBX6U1h9HMeuoM9JjsQRf3jmwT8NbtO6kCAMoGoHVAUS1WhskUR3zjiddCUHJJYkA67V4egM1f4ScklXgzuVI0knQ6ZyJKEEozQXXmpbTOiigm2rN+ApAs+fQby7L+ME5LmyRUrQfnTLlAgPjr2fU+mAJJrajGj1PSUfUgVDtzt1LeGcT8ZRbi9seIMxQ2aiGs+Ds4zE2qSyTJ2ZD0dq7ZGo2oN7Z0N22r87Zn0eGvdm+QLHIEaLCrYAWeNRka7BZZTlxXlQBHdBzh77UKslKFrX1V0Uvn9XfSYms/6O/NC2wR/v13cpnOvgLu6aMAKnBzh46ZLhseDJUm4nZIWBruBfBQ4FzHTTlvC6aAsHwH9JwyCO/gXWzYxzOuLU4XXJqTbUeZBsSuxYzfbZFnG7aktVyAPLIsM3RnkVXV9AIVNNSCRTcwALNuo0gwFbhdc7W0u955QIKy3rnqw3gANZdQAROugM0z9dzOuWrjHQWy+4O9Ndr5zXX5MXaZAwsRyQCwFlCdBlmmZ66Ip4PXSlAz18DZLyPgiLMkNX10wvdDGvJ7rGUG/dC3y2q66M209XrNRJGq/5FJGl4o7qCipdtc/B+X21xcLO2hpDK7rah2WDyFbhruM6D3tbbaW6lludTNSztMPhFYV4lr+gmhLuemoKByVRE4+GI4WaIr4EakqHtuwCLm1I7RNUxnjz0yvnbt90lSEJAeLoCWSvt9GW1x9dzJUUVA216T8tk3UMqrtkESOQdSQsQVbT7bwNtA1ZuOAu9uEmSqgxrdQwlewPTA3ZMu1yeeut0gHZzq0lFRdETWVcmBO+UAFoa8h0gLaSYreS/uQdDfbQRlVkOmhLePDbwgHw3fUoA78r4nXQlQ70QNxxMF0QZbw+cHG+Uu9GdBwjCyUdqR3NcGVRJ1L4dQ0V+H9mabkTdVIXSnqqawz01LnqMP10RbxeUOmweCCcFVmpQBRyhQFRrtCPoAcxbK3jhPhUw601dLhQlWkXL3AXSIL4pCwekIkjxEYM4QFPXp2HlLzFAHZ1CgYGjfo7r7+6SPE08h09IG6jpAlPJnQ12SmFrjmAxZ/RPdw3s/UAFvxqPCz4NRWxkPQs701tGgVCgCgTTqeSToVrfsM3y/xOqjJhJ1Xx0JEcPEOCr9MoKXLxhHFrcY/nvIpDevlDtNvy1Y+uiKuNt6WKPQhmjC6W9aQ0bz+DOAaFeDB75bz+elUG5xCqfVAC/bMEXIWhV86fN6rK4HimWBjDtSIe034V/rj2a6lpz8sdCKP7WvQSmblEerSovkyj5rdR1q35za/qx3DseEmrc8dO2sIIO2W8dDBSndPbgGsBJQols4XL1fr5EWRRkHSZoM7S7V2UBIJ5UWkkwUvabgDfv5cB/vI9iXirmi7m4UDXMBsd9SGRr6b6f/111G8oRkgNE22+7C2tHFufB3EgK6tgQ9Y3wksZJx18TLmmzhunyjp1dY11VLcYUorT5yROA54i2BVxld+2dOjGMQLZdRZx7YlEGfe2sStWsWTzxWNXJLRgq4jGqmIWhI/CPqpCcS9V+RC7VJmoqhzhPP6gy7kMQVdRuHG6kF03NYWiuyYl3bLLey7QLskKIv2SrDN0zGZzkrKHbLYO94jNVtPtXLTYRRWV0FBb4MIEcBwdWFCTrw0LKmuio4CHGgLDBk8yXRRr9CRLuYZPsoJ6V6gLeXdVjYEuq0qDLgM8yoQUKVHSpcxhaejKuNh3xYPDFQuNT0QZf4hiRbPS90zcCVHG64QoHjKrgATA/UomdNgqXDMLU2tol4UwAFYB7rg3q71y7m5LVxm8KsRpLVhZXn3nXw3iIhXAYssoXSzsRvkMysucwHbKq8Xtm1dRA4WBvoc7VTgycaMRc85O3Hr8QxS3qjoi8u4HOx02eFORx1kDN1XMNWhTNQb9ara7INrwjhtdEd+vpikd1EVxEMxbsN3FfNnM1OBrpb1KCtc6X0BRgIwOW8T0LqoouvLh1VW5zBpAg1NHcrWl1X0/vCrnGEdXkF1D9qoOTn6Qlxn4CaLNA4+be+X8iaeqqHV4HsFlnfNHmq0i6ZaoNdBzLz4p022vnNdnr8qQKH5NQsnWQ5ZyBTFZYfASrh/nkJVLTBX+ZVu/llLP4lHtlYv7VB1VYbwzpmthTa6ngKiyhs+gTIRyqw35ECoL08YrRoIBW0Xmjancc2MPFnfM1JCZlVW7vQGo2lrsgtevwD/10XWGBjlL8xwCj8W9slW4g8zUGhSaXSw4jrjsCvmCsitX6IeM88bti6wg6o+so3iRLnEQY6vILtBXJ7tdHIH1bVrXj8CwG0jj+SB2ZGJqyBwo6koKHdcsoHIno3g1s+rqKRv9W+fXIdMnXUfqm7zSQaCZvAE3PX41NW4g2wzPS9NevNaZGmpo1NXVMRhy4hfUkzjzr1qslB0X65U3hIugngwXfYdO0iA9hJCssgwrqp36HTRlVh7CTVpbhhzdUNv7FHl3DU6kuK50Molm6hPKROhjp5GpInKZo2spnEHbeDfcg2dbKjptthUUXFjFXVGlIkdW1a56UTL4J9muXHiY7Kqo7WGcJ+2irYxTVbKjcWrrYDSEhkLfTIfEe03SZM4+ilt1b/SINq01XdaA6vEd+T63/2AQoiB+DEi3lDwErKCoPOz7QJOvOjTko8jhceHX9jYovMef3YhI33PqDwclJ7kvCXPeuKg0E5PJe3uIKZS9KaQgSJ9RYlBqryL1B0ym3K+WNZeyA6bSTExu/8UhplD0mpDbsn+ooSAIXz46Hp7bINsgNxfN4ambSfiJR5yIqEmHh3jGCDW7DG+i7GhwaolJ4DysxNhLXkyK2qPOVWEYE48OZA1IEelEHd+ERz0RJH7RakMw/aJURrYsj28f+d4b1w5/wdvVkcnvP3slUoRzhkBS2xkR9B4ieLhbbR9Mof1WW72HXZ2D+6CMi+71Kmd7FVSVban0I9p6O+U/kKVb0q97q4aCp7v6RFPvZlctXJZkfkUnaFPtuG+BcWv5E19j9m9oubq/yqJNlEh4n6nqnvyeFYnkdYck08+XxfRS9SS7NOc5dbVDS55Jj0+28GnyinxPLRwNpeaDJLKvwElixQ+75bAEj7r5oIceZjsY4HpI2ilUGNReEye84nICnAyL1oAc4FC0NtxOZxeOBFvXxwlDEHWAHAiH54s+acP8wFT1xg3jDkEvLAJ5SyPWPYVtJBoo556oUkIlIXi4eqgIELfcyzANcwu3ujeOGXlI6rtSmZbar+JeQevd++J2ougU5iT2dF0xoXRF52r1iKQ3tsVVeyUuMdeJKw9bNbkWTfkRjH/nTwHwOhBiw5y4spN5nMMwnEYxSn3cQpYMQq+qvyFQ4iELoptwwR1oMdVMXZ9LoBeQiAIgijKkPwxNNB7p3Q9byceVTz+iEG4pjBZkQarU+Map5cfoNhq51xm+L1Wjmqm8n8S3l+XSdc2p5WNFM4GscFPiqxtycRCqYXp71bwRTIXU6ijmh8oyJHlFRrUS0EvWGUCZip3VocyNicW2Zhu6ndkapHRaqzrWiE4zm3glkmBlK5ao5xD1kddtEyxNuvuylXzsvv2Qbrhl99EdqdJ9iFPLzwY0Grkqu6+48n4Sj5z+pCxNV/DBzmRsv8pQwovdZ0ZaFV5wVUHkE0dWsUSSaUGHRmzbCYIe2jlC1d5CSqcjbn2fJySRw5NKyES3w1J5aekNDW6jRqSZZ9g0wyQLDSllI7WGPvhJJVwmhqYV9lJ/6HDEQgUjDLeeewsMFacTt+KH4TQlVMYMvRo+Zt0febywoavOR1Hs88dvIPEGsHaG5AUppaBIg446Gpp63BXHpaptPa+zGI42EKp4DPpV3BLOBHHt2jnSBTv8JXdqbCX3N2n+SW1C566uyyx8CHKw/hkVD0QPLOFDTZyRQ7XtBwfGTYWBf80Hglq3HXzxMPAbOCKE21K44pWiLjsamu/kvCuPD93KrVyYanjaoM0DApGo4kEgkgGnu3bcWNL6JHLCQ0tVIWl9H4qRJBw2BqIS39rNsAyui+FGbrljmqFpIm+L10Svhlui+7HJcTNh3HFz8vD+38EVU0lXdIQ4tyWzv0qDoJsehJq3w4NHvn7FfTrzUeHcpQJPUNOHqOOGqcfN5dHnbckXLmReNbereTySqXj6A1sct6afzY2TJ6CW3bLw/xZeNQrLW1jX/Qr37VfTT2cw4PEvqz54BnTi4S9K5FDL+4HkDA4GSLYyxJV9LI7Jh0JiIhDWdW8pGHsYrmUJOhRckQcauh8gab88aIpZMQw4SJIARJC9hMtcBmAk/DM8LmoDogCVTnwggS1IZuCaW+Wd67KwFNrIQzXTFcBGGJN5c0tqexMTbBw1EgJZ6mUwxB7dktqDRAmo4ZAxjyGRJOFRfaOqDEJyz+Lq+apCAiNyRHVSEHkZ4uFNXKW1tyW6b8NJZ3UyGlMKhHiAeAmo8FDIEkvt6xAbsOn4vKkyWu6GiJOcisnjJRkupeaDQyClXU17FOMjhSlJyeVqSJnxIPtUHVgZkBEHRQG6AmT/C1yFdYfbjsi30woBbua1lbBb5SGVwxllUFTgUsmtZMD5CavM1XjFbX70vVxlKzNxjqoz7sld5Dm1xAjbeIn3MwdWirooK6D5LC+D7S4GHWDxPPdqOkJ9xBlu8x0Oeg4Lag5bfc39hZk8jri5OEWjDfkSRZOt5F619E9qE5ehjeGmEFGCqetNpx4t0hsVeV5mmOJX9CPYhJH1aRjCzKHWwyA2SfErDpDCpWDIEjXRIOAcqfINjlvPIydQOV+JAeRmczUgmwqlIyWcX9MT6SbRepyEwaWSPmgFCua2lGgB1u7xwkHiV/A+WDphg7ktHfPDTAet3sj0mKvfyCdf8bZvpsznwOgwUr+Re61komGpM2QosUm/rk/u4CYCocD0angYEgUG6dcVEyYmSErITAany4Yj27w5tfxs3FoBGG3IVVgewrqO0Oe2FHOAoIaHIZGECRPV9bs8phscOi2TAtPIG0h2F7IdvcfQJbLz72CiKhbgSAMm8VOQNvDLV3MYMASvAtYQz3UiZmv5HZquQwaAM9J7acUUVtdACzE5dEPm1QNZNPByYiDdGgeka44RDYJ4jQ208MtJ8xg0KpORyuYvq+/TUD2YNI8BN85QDccO5db3rBhMPljc/FNkqqw6fgZn41NrKdm9mE7IPYsplO2Dk6XZOnsA4WNa9m+Nmc9cvlNtK+Efth+Sb9hSGS9y0ZEDdHWnLBgK+ZluqI2nE96EwwSXQpmhRIO1RrdaJFERBbHkCa6sgZhIs+e3dF+991v9QueD0bzLY7saHhdhW0/kSiHx3y4L6lgP40lYRE+wmy/pZkX8jXJ/cgOuS6qLSWQAE6QxZZKhIuqKYDgeEtn7L2694c1e/+nXOGQPkeudzD55jmbz/j6K4UewkrzxZCtJZsPwcWfbB92y++qAceNeSDaRB4ugps+DQdtlj4VjZyHallAkIv+MaBtkrxcv4UOQbMANHFpZDrvhRrJBMc1mh3ulj4/VF7eDgH8oU0/X3jOywwewhmej2yB/bHZz8huX+KE2EkIo0CQ9VIFsKNjOhYDc7fZ/L0EJ1hfbIIqhdhqED1grlOrZQ038qNncXnt+odwaPodoKc6MqtBqYKBa4P2xagvmPlyrCnooDKUorCsmjAZJ0EMXqA2NaEC8cQ3VhyrTkI2ckjUTjsEx2pflXR5mUfU+ZDAtAr+2Dx2U6Y4CwSl14IwaPUF14ytUH+EqX11m6VY2HrLqPgaE7q/nPUIXuR6K21RjIIjK+z4Mi+0uzZBPzT3yNR3SYiS1feovVLcUiF6J9XBcvOgMh6S2z+GguqU3qhcfw3EOdnFa2fRa0KLB4NR1TggHRtctBwxZaD0kp0H4uEignhQ+Ku8rg218SBFBpxQgYR1vwyR5/TDURCYwzdwNpx2iryApUeCg2jiCfvK94NlqMvU+KTmmD/Kz1A2e7IuBQBbZb8BpHP9IiyjZ1JQhi+xZmuRFFkRQfCBto10hTcK923TVbyfKvOEE9vDCNMjOR/MuQw7JxEyh+2EnU4YojCRRXU6UVnaSSYcEJbw5S7d401JkFKKJKI+PBUT/XEfhT8Cgvjsd2C6rkHy42npy5JWzFk1ANkpfqDn7RBNRVkYLiP75icKf3D3J704HtssRKR+utp4ceeUclBOQ3Saa+4GCnSvOP9VImkHPHKp/vupR0TePdCWOB5nI7Tc0cl1VBTL4JMxkCGqV+QannvsM4t19GSco47mq9iRoL3nq7L6vETQ2IZns8YNTyd80UQVag063VCRdTO/+DJ8Ruw0OrRnUkTlXffqsB3k45EGvovujvnvSf/9QAUEDD2cZZG3Z7x+QKW8b1B/gz+pW7Wu6BnGOv/7+4aaErbeg+nUO8mjTgfgdwkxAiPrsgDZ1Fsk9eom5AxkmgMSoqdIUt4aGIlgHRXCSFRF6bguLQ7iWsFcqdhdEN1x3YL1IrspiVxaQZLC9i6k74N8/yPv//QOD8+91eCwXJEA0I0gCuEpOyyhet3hfBnHe2/pEIM7g6P8J4PdqLuHSLMDmtYX0LU0UAdXDdw52IFnDJXcLtrsYAsuvkmXwBExw+56DL2AThK/w+1OEvR9FQIYngh7238+jYJMF27yG0bWHPyEPr7cv/+f/A8qaeqbIAAsA + + + dbo + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs b/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs index 8f7d627a9a..9afb1372cc 100644 --- a/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs +++ b/src/Libraries/SmartStore.Data/Migrations/MigrationsConfiguration.cs @@ -40,12 +40,6 @@ protected override void Seed(SmartObjectContext context) { context.MigrateLocaleResources(MigrateLocaleResources); MigrateSettings(context); - - if (DataSettings.DatabaseIsInstalled()) - { - var logTypeMigrator = new ActivityLogTypeMigrator(context); - logTypeMigrator.AddActivityLogType("EditOrder", "Edit an order", "Auftrag bearbeitet"); - } } public void MigrateSettings(SmartObjectContext context) @@ -55,9 +49,11 @@ public void MigrateSettings(SmartObjectContext context) public void MigrateLocaleResources(LocaleResourcesBuilder builder) { - builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.SocialSettings.TwitterSite.Error", - "The Twitter username must begin with an '@'.", - "Der Twitter-Benutzername muss mit einem '@' beginnen."); + builder.AddOrUpdate("Admin.Configuration.Settings.GeneralCommon.DisplayRegionInLanguageSelector", + "Display region in language selector", + "Region in der Sprachauswahl anzeigen", + "Whether to display region/country name in language selector (e.g. 'Deutsch (Deutschland)' instead of 'Deutsch')", + "Zeigt den Namen der Region/des Landes in der Sprachauswahl an (z. B. 'Deutsch (Deutschland)' statt 'Deutsch')"); } } } \ No newline at end of file diff --git a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs index 9b0d787a88..8f1ac6d219 100644 --- a/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs +++ b/src/Libraries/SmartStore.Data/Setup/SeedData/InvariantSeedData.cs @@ -517,7 +517,7 @@ public IList Topics() RenderAsWidget = true, WidgetWrapContent = false, Title = "Welcome to our store", - Body = "

Online shopping is the process consumers go through to purchase products or services over the Internet. You can edit this in the admin site.

" + Body = "

Online shopping is the process consumers go through to purchase products or services over the Internet. You can edit this in the admin site.

" }, new Topic { @@ -553,7 +553,7 @@ public IList Topics() IncludeInSitemap = false, IsPasswordProtected = false, Title = "Imprint", - Body = @"

Put your imprint information here. YOu can edit this in the admin site.

" + Body = "

Put your imprint information here. You can edit this in the admin site.

" }, new Topic { diff --git a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj index b4701e6ebe..fb594ed6a4 100644 --- a/src/Libraries/SmartStore.Data/SmartStore.Data.csproj +++ b/src/Libraries/SmartStore.Data/SmartStore.Data.csproj @@ -82,8 +82,8 @@ ..\..\packages\EntityFramework.SqlServerCompact.6.4.4\lib\net45\EntityFramework.SqlServerCompact.dll True
- - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll True @@ -97,8 +97,8 @@ True ..\..\packages\Microsoft.SqlServer.Scripting.11.0.2100.61\lib\Microsoft.SqlServer.Smo.dll - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll @@ -108,11 +108,11 @@ True ..\..\packages\Microsoft.SqlServer.Compact.4.0.8876.1\lib\net40\System.Data.SqlServerCe.dll - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll @@ -541,6 +541,10 @@ 202101251149352_V411Resources.cs + + + 202112171231491_V420Resources.cs + @@ -975,6 +979,9 @@ 202101251149352_V411Resources.cs + + 202112171231491_V420Resources.cs + diff --git a/src/Libraries/SmartStore.Data/app.config b/src/Libraries/SmartStore.Data/app.config index 68a1994474..a625161735 100644 --- a/src/Libraries/SmartStore.Data/app.config +++ b/src/Libraries/SmartStore.Data/app.config @@ -14,6 +14,18 @@ + + + + + + + + + + + + diff --git a/src/Libraries/SmartStore.Data/packages.config b/src/Libraries/SmartStore.Data/packages.config index d2fafe90f4..bc852168b3 100644 --- a/src/Libraries/SmartStore.Data/packages.config +++ b/src/Libraries/SmartStore.Data/packages.config @@ -3,10 +3,10 @@ - + - - - + + + \ No newline at end of file diff --git a/src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs b/src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs index d6de776ade..6fb44522a1 100644 --- a/src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs +++ b/src/Libraries/SmartStore.Services/Catalog/ProductAttributeParser.cs @@ -180,6 +180,11 @@ public virtual void ClearCachedAttributeValues() } public virtual Multimap DeserializeProductVariantAttributes(string attributesXml) + { + return DeserializeAttributesXml(attributesXml, null); + } + + private Multimap DeserializeAttributesXml(string attributesXml, int[] includeAttributesIds = null) { var attrs = new Multimap(); if (String.IsNullOrEmpty(attributesXml)) @@ -195,7 +200,8 @@ public virtual Multimap DeserializeProductVariantAttributes(string string sid = node1.Attribute("ID").Value; if (sid.HasValue()) { - if (int.TryParse(sid, out var id)) + if (int.TryParse(sid, out var id) && + (includeAttributesIds == null || includeAttributesIds.Contains(id))) { // ProductVariantAttributeValue/Value foreach (var node2 in node1.Descendants("Value")) @@ -326,6 +332,11 @@ public virtual bool AreProductAttributesEqual(string attributeXml1, string attri var attributes1 = DeserializeProductVariantAttributes(attributeXml1); var attributes2 = DeserializeProductVariantAttributes(attributeXml2); + return AreProductAttributesEqual(attributes1, attributes2); + } + + private bool AreProductAttributesEqual(Multimap attributes1, Multimap attributes2) + { if (attributes1.Count != attributes2.Count) return false; @@ -383,9 +394,14 @@ public virtual ProductVariantAttributeCombination FindProductVariantAttributeCom if (combinations.Count == 0) return null; + var listTypeValues = ParseProductVariantAttributeValues(attributesXml); + var listTypeAttributesIds = listTypeValues.Select(x => x.ProductVariantAttributeId).ToArray(); + var listTypeAttributesMap = DeserializeAttributesXml(attributesXml, listTypeAttributesIds); + foreach (var combination in combinations) { - bool attributesEqual = AreProductAttributesEqual(combination.AttributesXml, attributesXml); + var combinationAttributesMap = DeserializeProductVariantAttributes(combination.AttributesXml); + bool attributesEqual = AreProductAttributesEqual(combinationAttributesMap, listTypeAttributesMap); if (attributesEqual) return _productAttributeService.GetProductVariantAttributeCombinationById(combination.Id); } diff --git a/src/Libraries/SmartStore.Services/Catalog/ProductExtensions.cs b/src/Libraries/SmartStore.Services/Catalog/ProductExtensions.cs index 52ffd8cd80..8ecf7912c0 100644 --- a/src/Libraries/SmartStore.Services/Catalog/ProductExtensions.cs +++ b/src/Libraries/SmartStore.Services/Catalog/ProductExtensions.cs @@ -377,7 +377,7 @@ public static string GetBasePriceInfo(this Product product, { var value = Convert.ToDecimal((productPrice / product.BasePriceAmount) * product.BasePriceBaseAmount); var valueFormatted = priceFormatter.FormatPrice(value, true, currency); - var amountFormatted = Math.Round(product.BasePriceAmount.Value, 2).ToString("G29"); + var amountFormatted = product.BasePriceAmount.Value.ToString("G29"); var infoTemplate = localizationService.GetResource("Products.BasePriceInfo"); var result = infoTemplate.FormatInvariant( diff --git a/src/Libraries/SmartStore.Services/DataExchange/Export/DataExporter.cs b/src/Libraries/SmartStore.Services/DataExchange/Export/DataExporter.cs index c1f09c939b..076b161bf9 100644 --- a/src/Libraries/SmartStore.Services/DataExchange/Export/DataExporter.cs +++ b/src/Libraries/SmartStore.Services/DataExchange/Export/DataExporter.cs @@ -1715,6 +1715,7 @@ private void ExportCoreInner(DataExporterContext ctx, Store store) var publicDeployment = profile.Deployments.FirstOrDefault(x => x.DeploymentType == ExportDeploymentType.PublicFolder); ctx.Store = store; + ctx.LastId = 0; context.FileIndex = 0; context.Store = ToDynamic(ctx, ctx.Store); context.MaxFileNameLength = dataExchangeSettings.MaxFileNameLength; diff --git a/src/Libraries/SmartStore.Services/Localization/LocalizedEntityService.cs b/src/Libraries/SmartStore.Services/Localization/LocalizedEntityService.cs index b5a92c3263..2371b71bc7 100644 --- a/src/Libraries/SmartStore.Services/Localization/LocalizedEntityService.cs +++ b/src/Libraries/SmartStore.Services/Localization/LocalizedEntityService.cs @@ -218,6 +218,7 @@ protected virtual LocalizedPropertyCollection GetLocalizedPropertyCollectionInte where x.LocaleKeyGroup == localeKeyGroup select x; + var splitEntityIds = false; var requestedSet = entityIds; if (entityIds != null && entityIds.Length > 0) @@ -243,7 +244,15 @@ protected virtual LocalizedPropertyCollection GetLocalizedPropertyCollectionInte else { requestedSet = entityIds; - query = query.Where(x => entityIds.Contains(x.EntityId)); + + if (entityIds.Length > 5000) + { + splitEntityIds = true; + } + else + { + query = query.Where(x => entityIds.Contains(x.EntityId)); + } } } @@ -252,7 +261,20 @@ protected virtual LocalizedPropertyCollection GetLocalizedPropertyCollectionInte query = query.Where(x => x.LanguageId == languageId); } - return new LocalizedPropertyCollection(localeKeyGroup, requestedSet, query.ToList()); + if (splitEntityIds) + { + var items = new List(); + foreach (var chunk in entityIds.Slice(5000)) + { + items.AddRange(query.Where(x => chunk.Contains(x.EntityId)).ToList()); + } + + return new LocalizedPropertyCollection(localeKeyGroup, requestedSet, items); + } + else + { + return new LocalizedPropertyCollection(localeKeyGroup, requestedSet, query.ToList()); + } } } diff --git a/src/Libraries/SmartStore.Services/Media/DownloadService.cs b/src/Libraries/SmartStore.Services/Media/DownloadService.cs index a51fd84193..89297b15b0 100644 --- a/src/Libraries/SmartStore.Services/Media/DownloadService.cs +++ b/src/Libraries/SmartStore.Services/Media/DownloadService.cs @@ -64,12 +64,22 @@ public virtual IList GetDownloadsFor(int entityId, string entityName, select x).ToList(); if (versionedFilesOnly) + { downloads = downloads.Where(x => !string.IsNullOrEmpty(x.FileVersion)).ToList(); + } if (downloads.Any()) { var idsOrderedByVersion = downloads - .Select(x => new { x.Id, Version = new SemanticVersion(x.FileVersion.HasValue() ? x.FileVersion : "1.0.0.0") }) + .Select(x => + { + if (SemanticVersion.TryParse(x.FileVersion.HasValue() ? x.FileVersion : "1.0.0.0", out var version)) + { + return new { x.Id, Version = version }; + } + + return new { x.Id, Version = new SemanticVersion(0, 0, 0, 0) }; + }) .OrderByDescending(x => x.Version) .Select(x => x.Id); @@ -178,7 +188,7 @@ public virtual bool IsDownloadAllowed(OrderItem orderItem) return false; var product = orderItem.Product; - if (product == null || !product.IsDownload) + if (product == null || product.Deleted || !product.IsDownload) return false; //payment status diff --git a/src/Libraries/SmartStore.Services/Media/Imaging/ProcessImageQuery.cs b/src/Libraries/SmartStore.Services/Media/Imaging/ProcessImageQuery.cs index 10194e75d1..1c754697e7 100644 --- a/src/Libraries/SmartStore.Services/Media/Imaging/ProcessImageQuery.cs +++ b/src/Libraries/SmartStore.Services/Media/Imaging/ProcessImageQuery.cs @@ -148,7 +148,7 @@ public string BackgroundColor public override QueryString Add(string name, string value, bool isUnique) { // Keep away invalid tokens from underlying query - if (_supportedTokens.TryGetValue(name, out var validator) && validator(name, value)) + if (name != null && _supportedTokens.TryGetValue(name, out var validator) && validator(name, value)) { return base.Add(name, value, isUnique); } diff --git a/src/Libraries/SmartStore.Services/Media/Storage/MediaStorageItem.cs b/src/Libraries/SmartStore.Services/Media/Storage/MediaStorageItem.cs index 8a8951add8..9fb06c72a4 100644 --- a/src/Libraries/SmartStore.Services/Media/Storage/MediaStorageItem.cs +++ b/src/Libraries/SmartStore.Services/Media/Storage/MediaStorageItem.cs @@ -33,6 +33,20 @@ public Stream SourceStream public abstract void SaveTo(Stream stream, MediaFile mediaFile); public abstract Task SaveToAsync(Stream stream, MediaFile mediaFile); + protected static int GetLength(Stream stream) + { + if (stream.CanSeek) + { + return (int)stream.Length; + } + else if (stream.Position > 0) + { + return (int)stream.Position; + } + + return 0; + } + public virtual void Dispose() { if (_sourceStream != null) @@ -82,13 +96,13 @@ protected override Stream GetSourceStream() public override void SaveTo(Stream stream, MediaFile mediaFile) { _image.Save(stream); - mediaFile.Size = (int)stream.Length; + mediaFile.Size = GetLength(stream); } public override Task SaveToAsync(Stream stream, MediaFile mediaFile) { _image.Save(stream); - mediaFile.Size = (int)stream.Length; + mediaFile.Size = GetLength(stream); return Task.CompletedTask; } } @@ -121,7 +135,7 @@ public override void SaveTo(Stream stream, MediaFile mediaFile) stream.Position = 0; } - mediaFile.Size = (int)stream.Length; + mediaFile.Size = GetLength(stream); } public override async Task SaveToAsync(Stream stream, MediaFile mediaFile) @@ -138,7 +152,7 @@ public override async Task SaveToAsync(Stream stream, MediaFile mediaFile) stream.Position = 0; } - mediaFile.Size = (int)stream.Length; + mediaFile.Size = GetLength(stream); } } diff --git a/src/Libraries/SmartStore.Services/Messages/MessageFactory.cs b/src/Libraries/SmartStore.Services/Messages/MessageFactory.cs index aa657d8b32..7c2ab26c7b 100644 --- a/src/Libraries/SmartStore.Services/Messages/MessageFactory.cs +++ b/src/Libraries/SmartStore.Services/Messages/MessageFactory.cs @@ -515,6 +515,14 @@ public virtual object[] GetTestModels(MessageContext messageContext) ["Address"] = "VatAddress" }); break; + case MessageTemplateNames.SystemGeneric: + result.Add(new NamedModelPart("Generic") + { + ["Email"] = "john@doe.com", + ["Subject"] = "Subject", + ["Body"] = LoremIpsum + }); + break; } } diff --git a/src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs b/src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs index 6fb1b6a323..37045b041f 100644 --- a/src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs +++ b/src/Libraries/SmartStore.Services/Messages/MessageModelProvider.cs @@ -1152,7 +1152,7 @@ private TreeNode BuildModelTreePart(string modelName, object in return node; } - private IEnumerable> BuildModelTreePartForClass(object instance) + private IEnumerable> BuildModelTreePartForClass(object instance, HashSet instanceLookup = null) { var type = instance?.GetType(); @@ -1177,11 +1177,25 @@ private IEnumerable> BuildModelTreePartForClass(object { yield return new TreeNode(new ModelTreeMember { Name = prop.Name, Kind = ModelTreeMemberKind.Collection }); } - else + else if (pi.PropertyType.IsClass) { - var node = new TreeNode(new ModelTreeMember { Name = prop.Name, Kind = ModelTreeMemberKind.Complex }); - node.AppendRange(BuildModelTreePartForClass(prop.GetValue(instance))); - yield return node; + if (instanceLookup == null) + { + instanceLookup = new HashSet(ReferenceEqualityComparer.Default) { instance }; + } + + var childInstance = prop.GetValue(instance); + if (childInstance != null) + { + if (!instanceLookup.Contains(childInstance)) + { + instanceLookup.Add(childInstance); + + var node = new TreeNode(new ModelTreeMember { Name = prop.Name, Kind = ModelTreeMemberKind.Complex }); + node.AppendRange(BuildModelTreePartForClass(childInstance, instanceLookup)); + yield return node; + } + } } } } diff --git a/src/Libraries/SmartStore.Services/Messages/MessageTemplateService.cs b/src/Libraries/SmartStore.Services/Messages/MessageTemplateService.cs index 26d9f53c5e..ee5e0689ad 100644 --- a/src/Libraries/SmartStore.Services/Messages/MessageTemplateService.cs +++ b/src/Libraries/SmartStore.Services/Messages/MessageTemplateService.cs @@ -145,7 +145,8 @@ public virtual MessageTemplate CopyMessageTemplate(MessageTemplate messageTempla Body = messageTemplate.Body, IsActive = messageTemplate.IsActive, EmailAccountId = messageTemplate.EmailAccountId, - LimitedToStores = messageTemplate.LimitedToStores + LimitedToStores = messageTemplate.LimitedToStores, + ModelTypes = messageTemplate.ModelTypes // INFO: we do not copy attachments }; diff --git a/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs b/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs index 2a081b6d4b..66041200a3 100644 --- a/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs +++ b/src/Libraries/SmartStore.Services/Orders/ShoppingCartService.cs @@ -1099,7 +1099,7 @@ public virtual List AddToCart( existingCartItem = FindShoppingCartItemInTheCart(cart, cartType, product, selectedAttributes, customerEnteredPrice); } - if (existingCartItem != null) + if (existingCartItem != null && !_shoppingCartSettings.AddProductsToBasketInSinglePositions) { // update existing shopping cart item int newQuantity = existingCartItem.Item.Quantity + quantity; diff --git a/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs b/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs index 6d14641314..6310fbbfa4 100644 --- a/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs +++ b/src/Libraries/SmartStore.Services/Search/Forum/Modelling/ForumSearchQueryFactory.cs @@ -144,14 +144,20 @@ private void AddFacet( switch (kind) { case FacetGroupKind.Forum: + if (_searchSettings.ForumDisabled) + return; fieldName = "forumid"; displayOrder = _searchSettings.ForumDisplayOrder; break; case FacetGroupKind.Customer: + if (_searchSettings.CustomerDisabled) + return; fieldName = "customerid"; displayOrder = _searchSettings.CustomerDisplayOrder; break; case FacetGroupKind.Date: + if (_searchSettings.DateDisabled) + return; fieldName = "createdon"; displayOrder = _searchSettings.DateDisplayOrder; break; diff --git a/src/Libraries/SmartStore.Services/Seo/UrlRecordService.cs b/src/Libraries/SmartStore.Services/Seo/UrlRecordService.cs index b8231ef5db..2a723529ee 100644 --- a/src/Libraries/SmartStore.Services/Seo/UrlRecordService.cs +++ b/src/Libraries/SmartStore.Services/Seo/UrlRecordService.cs @@ -70,7 +70,7 @@ private void ValidateCacheState() protected override void OnClearCache() { - _cacheManager.Remove(URLRECORD_ALL_PATTERN); + _cacheManager.RemoveByPattern(URLRECORD_ALL_PATTERN); } public virtual void DeleteUrlRecord(UrlRecord urlRecord) diff --git a/src/Libraries/SmartStore.Services/SmartStore.Services.csproj b/src/Libraries/SmartStore.Services/SmartStore.Services.csproj index 072564b9fb..377945466a 100644 --- a/src/Libraries/SmartStore.Services/SmartStore.Services.csproj +++ b/src/Libraries/SmartStore.Services/SmartStore.Services.csproj @@ -104,8 +104,8 @@ ..\..\packages\MaxMind.GeoIP2.3.2.0\lib\net45\MaxMind.GeoIP2.dll - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll @@ -119,8 +119,8 @@ ..\..\packages\ncrontab.3.3.0\lib\net35\NCrontab.dll True - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll ..\..\packages\NReco.PdfGenerator.1.2.0\lib\net45\NReco.PdfGenerator.dll @@ -144,14 +144,14 @@ ..\..\packages\System.Linq.Dynamic.Core.1.2.1\lib\net46\System.Linq.Dynamic.Core.dll - - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll diff --git a/src/Libraries/SmartStore.Services/app.config b/src/Libraries/SmartStore.Services/app.config index 252642d5ed..446c32df9a 100644 --- a/src/Libraries/SmartStore.Services/app.config +++ b/src/Libraries/SmartStore.Services/app.config @@ -34,7 +34,19 @@ - + + + + + + + + + + + + + diff --git a/src/Libraries/SmartStore.Services/packages.config b/src/Libraries/SmartStore.Services/packages.config index 79508508e8..4046ac6a7f 100644 --- a/src/Libraries/SmartStore.Services/packages.config +++ b/src/Libraries/SmartStore.Services/packages.config @@ -14,17 +14,17 @@ - + - + - - + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.AmazonPay/Description.txt b/src/Plugins/SmartStore.AmazonPay/Description.txt index 6f3f684f5f..937624a4ec 100644 --- a/src/Plugins/SmartStore.AmazonPay/Description.txt +++ b/src/Plugins/SmartStore.AmazonPay/Description.txt @@ -1,8 +1,8 @@ FriendlyName: Login and Pay with Amazon SystemName: SmartStore.AmazonPay Group: Payment -Version: 4.1.1 -MinAppVersion: 4.1.1 +Version: 4.2.0 +MinAppVersion: 4.2.0 Author: SmartStore AG DisplayOrder: 1 FileName: SmartStore.AmazonPay.dll diff --git a/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj b/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj index aa30c693c3..90e38591eb 100644 --- a/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj +++ b/src/Plugins/SmartStore.AmazonPay/SmartStore.AmazonPay.csproj @@ -93,9 +93,8 @@ ..\..\packages\Common.Logging.2.0.0\lib\2.0\Common.Logging.dll True - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll - False + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll @@ -105,22 +104,19 @@ ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll False - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - False + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll - False + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - False + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll diff --git a/src/Plugins/SmartStore.AmazonPay/packages.config b/src/Plugins/SmartStore.AmazonPay/packages.config index 36f4b6da90..bfadbe9d06 100644 --- a/src/Plugins/SmartStore.AmazonPay/packages.config +++ b/src/Plugins/SmartStore.AmazonPay/packages.config @@ -7,10 +7,10 @@ - + - - - + + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.AmazonPay/web.config b/src/Plugins/SmartStore.AmazonPay/web.config index 46a5771064..e3e561e6ca 100644 --- a/src/Plugins/SmartStore.AmazonPay/web.config +++ b/src/Plugins/SmartStore.AmazonPay/web.config @@ -62,7 +62,7 @@ - + @@ -86,7 +86,7 @@ - + @@ -160,6 +160,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -167,4 +187,4 @@ - \ No newline at end of file + diff --git a/src/Plugins/SmartStore.Clickatell/Description.txt b/src/Plugins/SmartStore.Clickatell/Description.txt index daa3c4c49c..ed2cde9ffe 100644 --- a/src/Plugins/SmartStore.Clickatell/Description.txt +++ b/src/Plugins/SmartStore.Clickatell/Description.txt @@ -1,8 +1,8 @@ FriendlyName: Clickatell SMS Provider SystemName: SmartStore.Clickatell Group: Mobile -Version: 4.1.1 -MinAppVersion: 4.1.1 +Version: 4.2.0 +MinAppVersion: 4.2.0 DisplayOrder: 1 FileName: SmartStore.Clickatell.dll ResourceRootKey: Plugins.Sms.Clickatell \ No newline at end of file diff --git a/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj b/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj index 6913511e9e..a7ccb144e0 100644 --- a/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj +++ b/src/Plugins/SmartStore.Clickatell/SmartStore.Clickatell.csproj @@ -93,9 +93,8 @@ ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll False - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - False + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll diff --git a/src/Plugins/SmartStore.Clickatell/packages.config b/src/Plugins/SmartStore.Clickatell/packages.config index 362bbd54e5..0470997544 100644 --- a/src/Plugins/SmartStore.Clickatell/packages.config +++ b/src/Plugins/SmartStore.Clickatell/packages.config @@ -5,5 +5,5 @@ - + \ No newline at end of file diff --git a/src/Plugins/SmartStore.Clickatell/web.config b/src/Plugins/SmartStore.Clickatell/web.config index 1ae1189cd0..06bf37d3c2 100644 --- a/src/Plugins/SmartStore.Clickatell/web.config +++ b/src/Plugins/SmartStore.Clickatell/web.config @@ -1,9 +1,9 @@ - + - - + + - - + + - - + + - - - - - + + + + + - - - - - - - - - - + + + + + + + + + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + - + - \ No newline at end of file + diff --git a/src/Plugins/SmartStore.OfflinePayment/Description.txt b/src/Plugins/SmartStore.OfflinePayment/Description.txt index 96a97773e0..680ab03804 100644 --- a/src/Plugins/SmartStore.OfflinePayment/Description.txt +++ b/src/Plugins/SmartStore.OfflinePayment/Description.txt @@ -2,8 +2,8 @@ Description: Contains common offline payment methods like Direct Debit, Invoice, Prepayment etc. Group: Payment SystemName: SmartStore.OfflinePayment -Version: 4.1.1 -MinAppVersion: 4.1.1 +Version: 4.2.0 +MinAppVersion: 4.2.0 DisplayOrder: 0 FileName: SmartStore.OfflinePayment.dll ResourceRootKey: Plugins.SmartStore.OfflinePayment diff --git a/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj b/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj index 752242a26f..b392fe891f 100644 --- a/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj +++ b/src/Plugins/SmartStore.OfflinePayment/SmartStore.OfflinePayment.csproj @@ -93,9 +93,8 @@ ..\..\packages\FluentValidation.7.4.0\lib\net45\FluentValidation.dll False - - ..\..\packages\Microsoft.Bcl.AsyncInterfaces.1.1.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll - False + + ..\..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll ..\..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.3.6.0\lib\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll @@ -105,21 +104,18 @@ ..\..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll False - - ..\..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll - False + + ..\..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll - - ..\..\packages\System.Runtime.CompilerServices.Unsafe.4.5.2\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll - False + + ..\..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll - - ..\..\packages\System.Threading.Tasks.Extensions.4.5.2\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll - False + + ..\..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll diff --git a/src/Plugins/SmartStore.OfflinePayment/packages.config b/src/Plugins/SmartStore.OfflinePayment/packages.config index d772d4d4ca..1e0b785b88 100644 --- a/src/Plugins/SmartStore.OfflinePayment/packages.config +++ b/src/Plugins/SmartStore.OfflinePayment/packages.config @@ -5,10 +5,10 @@ - + - - - + + + \ No newline at end of file diff --git a/src/Plugins/SmartStore.OfflinePayment/web.config b/src/Plugins/SmartStore.OfflinePayment/web.config index 1ae1189cd0..06bf37d3c2 100644 --- a/src/Plugins/SmartStore.OfflinePayment/web.config +++ b/src/Plugins/SmartStore.OfflinePayment/web.config @@ -1,9 +1,9 @@ - + - - + + - - + + - @if (brand != null) - { -
- - @if (brand.Picture != null && brand.Picture.ImageUrl.HasValue() && brand.Picture.PictureId != 0) + @if (Model.Sku.HasValue()) + { + + } + + @if (Model.Gtin.HasValue()) + { + + } + + @if (Model.ManufacturerPartNumber.HasValue()) + { + + } + + @if (brand != null) + { + + } + + +
+

+ @if (Model.IsAssociatedProduct && Model.VisibleIndividually) { - @brand.Picture.AlternateText + @Model.Name } else { - @brand.Name + @Model.Name } - - - - @if (Model.Sku.HasValue()) - { - - } - - @if (Model.Gtin.HasValue()) - { - - } - - @if (Model.ManufacturerPartNumber.HasValue()) - { - - } +

- } - - -
-

- @if (Model.IsAssociatedProduct && Model.VisibleIndividually) - { - @Model.Name - } - else - { - @Model.Name - } -

-
- - @if (Model.ShortDescription.Value.HasValue()) - { -
- @Html.Raw(Model.ShortDescription) -
- } + + @if (Model.ShortDescription.Value.HasValue()) + { +
+ @Html.Raw(Model.ShortDescription) +
+ }
diff --git a/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.FileUpload.cshtml b/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.FileUpload.cshtml index fa1c08e954..988f78cd63 100644 --- a/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.FileUpload.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Shared/ChoiceTemplates/Choice.FileUpload.cshtml @@ -15,7 +15,7 @@
- +
@(Html.SmartStore().FileUploader() .Name(clientId) diff --git a/src/Presentation/SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml b/src/Presentation/SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml index 694a1a0788..41d0b05cdb 100644 --- a/src/Presentation/SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Shared/EditorTemplates/Link.cshtml @@ -118,7 +118,7 @@ @if (allowedTypes.Contains(LinkType.File)) { @if (Model.IsEditable) diff --git a/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OffCanvasShoppingCart.cshtml b/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OffCanvasShoppingCart.cshtml index 5342013a14..ca4ebd86c6 100644 --- a/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OffCanvasShoppingCart.cshtml +++ b/src/Presentation/SmartStore.Web/Views/ShoppingCart/Partials/OffCanvasShoppingCart.cshtml @@ -103,6 +103,8 @@ }
} + + @{ Html.RenderWidget("offcanvas_cartitem_desc_after", item.Id); }
diff --git a/src/Presentation/SmartStore.Web/Views/Topic/TopicDetails.cshtml b/src/Presentation/SmartStore.Web/Views/Topic/TopicDetails.cshtml index c38110ddc2..fa8c29238e 100644 --- a/src/Presentation/SmartStore.Web/Views/Topic/TopicDetails.cshtml +++ b/src/Presentation/SmartStore.Web/Views/Topic/TopicDetails.cshtml @@ -1,6 +1,7 @@ @model TopicModel @using SmartStore.Web.Models.Topics; +@using SmartStore.Core.Domain.Seo; @{ var isPopup = ViewBag.IsPopup; @@ -18,6 +19,13 @@ Html.AddTitleParts(!String.IsNullOrEmpty(Model.MetaTitle) ? Model.MetaTitle : Model.Title); Html.AddMetaDescriptionParts(Model.MetaDescription); Html.AddMetaKeywordParts(Model.MetaKeywords); + + var topicUrl = Url.RouteUrl("Topic", new { SeName = Model.SeName }, this.Request.Url.Scheme); + var canonicalUrlsEnabled = EngineContext.Current.Resolve().CanonicalUrlsEnabled; + if (canonicalUrlsEnabled) + { + Html.AddCanonicalUrlParts(topicUrl); + } } if (Model.HtmlId.HasValue()) @@ -33,16 +41,16 @@ @if (Model.IsPasswordProtected) { - // For popup topics, use a minimal layout that includes the Ajax and jQuery scripts - if (isPopup != null && isPopup == true) - { - Layout = "_RootPopup"; - } + // For popup topics, use a minimal layout that includes the Ajax and jQuery scripts + if (isPopup != null && isPopup == true) + { + Layout = "_RootPopup"; + }