From 65e49ff8ca77e72d01377a7d6627e954e7a4bb8f Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 14 Feb 2020 11:17:38 -0800 Subject: [PATCH 01/38] Add spec for TFMs in .NET 5 --- accepted/2020/net5/net5.md | 499 +++++++++++++++++++++++++++++++++++ accepted/2020/net5/pic01.png | Bin 0 -> 103014 bytes accepted/2020/net5/pic02.png | Bin 0 -> 63221 bytes accepted/2020/net5/pic03.png | Bin 0 -> 7868 bytes accepted/2020/net5/pic04.png | Bin 0 -> 9835 bytes accepted/2020/net5/pic05.png | Bin 0 -> 5896 bytes accepted/2020/net5/pic06.png | Bin 0 -> 7467 bytes 7 files changed, 499 insertions(+) create mode 100644 accepted/2020/net5/net5.md create mode 100644 accepted/2020/net5/pic01.png create mode 100644 accepted/2020/net5/pic02.png create mode 100644 accepted/2020/net5/pic03.png create mode 100644 accepted/2020/net5/pic04.png create mode 100644 accepted/2020/net5/pic05.png create mode 100644 accepted/2020/net5/pic06.png diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md new file mode 100644 index 000000000..ed5eb7420 --- /dev/null +++ b/accepted/2020/net5/net5.md @@ -0,0 +1,499 @@ +# Target Framework Names in .NET 5 + +**PM** [Immo Landwerth](https://github.com/terrajobst) + +We'd like to drastically simplify the framework names (TFMs) developers must use +in project files and NuGet packages. This includes merging the concept of .NET 5 +and .NET Standard while still being able to use `#if` to use OS-specific APIs. +This document explains the motivation and resulting developer experience. + +.NET, as most technologies that are two decades old, has a lot of heritage, +especially in product naming and editions: .NET Framework, .NET Compact +Framework, Silverlight, .NET Micro Framework, .NET Portable Class Libraries, +.NET for Windows Store, .NET Native, .NET Core, .NET Standard... and that +doesn't even include what the Mono community built. While this evolution of .NET +can be explained (and was properly motivated) it created a massive tax: the +concept count. If you're new to .NET, where would you start? What is the latest +stack? You may say, “of course that's .NET Core” but how would anyone know that +by just looking at the names? + +We've simplified the world with .NET Standard, in that class library authors +don't have to think about all the different “boxes” that represent different +implementations of .NET. It did that by unifying the *API surface* of the +various .NET implementations. Ironically, this resulted in us having to add yet +another box, namely .NET Standard. + +To make the future saner, we must reduce the number of boxes. We don't want to +make .NET less flexible, but we want to reduce nonsensical differences that +purely resulted from us not being open source early enough. For example, +Mono/Xamarin/Unity are based on a different set of runtimes and frameworks than +the .NET Framework/Silverlight/UWP/.NET Core lineage. With .NET Standard, we +have started to remove the differences in the API surface. With .NET 5, the goal +is to converge these lineages onto a single product stack, thus unifying +their *implementations*. + +![](pic01.png) + +While we strive to provide an experience where you don't have to reason about +the different kinds of .NET, we still don't want to fully abstract away the +underlying OS, so you'll continue to be able to call OS specific APIs, be that +via P/Invokes, WinRT, or the Xamarin bindings for iOS and Android APIs. + +Now think about developers who start on this stack and can write any application +for any of the platforms that .NET provides support for. The branding we +currently have makes no sense to them. To find documentation and tutorials, the +only two things a developer should need to know is the name and version of their +technology stack. + +Let's contrast this with some of the NuGet packages that developers have to +author for today's world: + +![](pic02.png) + +There are a lot of names and version numbers. Knowing who is compatible with who +is impossible with a decoder ring. We've simplified this greatly with .NET +Standard, but this still requires a table that maps .NET Standard versions to +.NET implementation versions. + +The proposal is to reuse the existing net TFM and model OS-specific APIs on top +via a new syntax: + +* `net5.0`. This TFM is for code that runs everywhere. It combines and replaces + the `netcoreapp` and `netstandard` names. This TFM will generally only include + technologies that work cross-platform (modulo pragmatic concessions, like we + already did in .NET Standard). + +* `net5.0-win`, `net5.0-ios`, `net5.0-android`. These TFMs represent OS specific + flavors of .NET 5 that include `net5.0` plus OS-specific bindings. + +NuGet should use this next syntax to automatically understand that `net5.0` can +be consumed from net6-win (but not the other way around). But more importantly, +this notation will also enable developers to intuitively understand +compatibility relationships because they are expressed by naming, rather than by +mapping tables. Yay! + +## Scenarios and User Experience + +### Vary implementation + +Ida is working on an Xamarin Forms application that supports Android, iOS, and +Windows. Her application needs GPS information, but only a very limited set. +Since there is no portable GPS API, she writes her own little abstraction +library using multi-targeting. + +By doing so she's able to encapsulate the GPS access without having to +multi-target her entire application, just this one area. + +```C# +public static class GpsLocation +{ + public static bool IsSupported + { + get + { +#if ANDROID || IOS || WINDOWS + return true; +#else + return false; +#endif + } + } + + public static (double Latitude, double Longitude) GetCoordinates() + { +#if ANDROID + return AndroidAPI(); +#elif IOS + return AppleAPI(); +#elif WINDOWS + return WindowsAPI(); +#else + throw new PlatformNotSupportedException(); +#endif + } +} +``` + +### Vary API surface + +Ada is a developer on SkiaSharp, a cross-platform 2D graphics API for .NET +platforms based on Google's Skia Graphics Library. The project is already using +multi-targeting to provide different implementations for different platform. To +make it easier to use, she's adding a new `SkipSharpImage` type, which +represents a bitmap and be constructed via OS-provided data types. Ada uses +`#if` to expose different constructors on different platforms: + +```C# +public static class SkiaSharpImage +{ +#if ANDROID + public SkiaSharpImage(Android.Media.Image nativeImage) { /* ... */ } +#endif + +#if IOS + public SkiaSharpImage(NSImage nativeImage) { /* ... */ } +#endif + +#if WINDOWS + public SkiaSharpImage(Windows.Media.BitmapImage nativeImage) { /* ... */ } +#endif +} +``` + +## Requirements + +### Goals + +* Use naming that aligns with product strategy +* Merge .NET Core and .NET Standard into a single concept +* Developers should be able to understand compatibility relationships without + having to consult a mapping table. +* Provide compatibility with existing concepts and NuGet packages +* It would be great to get this into .NET 5 Preview 1 + +### Non-Goals + +* Replace TFMs or expand runtime identifiers (RIDs) +* Support multi-targeting between OS versions + +## Design + +| TFM | Compatible With | Comments | +|-----------------|------------------------------------------------------------|-----------------------------------| +| net5.0 | net1..4 (with NU1701 warning) | No WinForms or WPF | +| | netcoreapp1..3.1 (warning when WinForms/WPF is referenced) | | +| | netstandard1..2.1 | | +| net5.0-android | xamarin.android | | +| | (+everything else inherited from net5) | | +| net5.0-ios | xamarin.ios | | +| | (+everything else inherited from net5) | | +| net5.0-macos | xamarin.macos | | +| | (+everything else inherited from net5) | | +| net5.0-tvos | xamarin.tvos | | +| | (+everything else inherited from net5) | | +| net5.0-watchos | xamarin.watchos | | +| | (+everything else inherited from net5) | | +| net5.0-win | netcoreapp1..3.1 | WinForms + WPF and probably WinUI | +| | (+everything else inherited from net5) | | +| Tizen, Unity... | Will follow the Xamarin model | | + +***Open Issue**. In case of Xamarin, there is a discussion of whether the +convergence with .NET Core will be a breaking change for existing NuGet packages +(for example, there is a desire to change their namespaces). In that case, we +should not map it to the existing TFM as that would be pointless.* + +***Open Issue**. Will the above scheme work for iPad?* + +### Mapping to properties + +There are three existing MSBuild properties: + +| Property | Meaning | Examples | +|---------------------------------|--------------------|----------------------------------| +| TargetFramework (TFM) | The short name | `net4`, `netcoreapp3.0` | +| TargetFrameworkIdentifier (TFI) | The long name | `.NETFramework` or `.NETCoreApp` | +| TargetFrameworkVersion (TFV) | The version number | `2`, `3.0`, `3.1` | +| TargetFrameworkProfile (TFP) | The profile | `Client` or `Profile124` | + +***Open Issue**. The SDK has this logic duplicated from NuGet because they need +to do this during evaluation where they can’t call custom targets. We could make +this an MSBuild intrinsic, but that seems like a lot of work. Maybe we just live +with the duplication. But bottom line is that we need to make that change in +MSBuild too.* + +* [@rainersigwald](https://github.com/rainersigwald): We've made it pretty far + with duplicated logic, but it results in really ugly MSBuild, since it's not a + very expressive programming language. It also creates the potential for drift + between the two definitions. That said, exposing it directly would create a + new tight coupling between MSBuild and NuGet that hasn't historically existed. + It would probably require a direct dependency and update flow plus coherency + requirements on both .NET Core SDK and VS insertions. If the logic were in a + separate package (we've talked about pushing it down to the framework at + various times) it'd be great to just expose that. With the logic in NuGet, + it's reasonable either way, just different tradeoffs. I'm amenable to exposing + a property function, but maybe we should go down the road of not doing it at + first. + +We're going to map the new entries as follows: + +| Framework | Identifier | Version | Profile | +|----------------|---------------|---------|---------| +| net48 | .NETFramework | 4.8 | | +| net5.0 | .NETCoreApp | 5.0 | | +| net5.0-android | .NETCoreApp | 5.0 | android | +| net5.0-ios | .NETCoreApp | 5.0 | ios | +| net5.0-win | .NETCoreApp | 5.0 | win | + +***Open Issue**. Please note that `net5.0`+ will map the TFI to `.NETCoreApp`. +We need to announce this change so that package authors with custom .props and +.targets are prepared. Link to DavKean’s doc on how to do it.* + +***Open Issue**. We should try to keep the TFI out of the .nuspec file. It seems +NuGet uses the long form `.NETFramework,Version=4.5` in the dependency groups. +We may want to change NuGet to allow the short form there as well and update our +packaging tools to re-write to short name on pack. + +Specifically: + +* **We'll continue to use .NETCoreApp as the TFI**. This reduces the number of + pieces and build logic that needs to change in .NET SDK. + +* **net4x and earlier will continue to use .NETFramework as the TFI**. This + means that net4 and net5 aren't considered compatible by default, but the + compatibility will continue to be handled by the AssetTargetFallback in the + SDK/NuGet restore. + +* **We'll use the existing profile concept to encode the OS selection.** It's + worth noting that profiles today make things smaller whereas this use makes + things larger. We believe this can be handled in the NuGet layer by using this + rule for net5 and up. While that's not ideal, it reduces the number of + concepts we need to add. + +### TFMs are a closed set + +One question is whether third parties can extend the TFM space (i.e. the part +after the dash) without having to rely on changes in NuGet/MSBuild. Due to the +expansion of short name into TFI & TFM this would be non-trivial. + +We may open this up in the future, but for now the consensus was that we'd +prefer to have the specific list of names that are expanded by NuGet. + +### What about .NET 10? + +Due to the fact that we're planning to bump the major version every year, we +have to think about what will happen with version parsing in case of two digit +version numbers, such as `net10`. Since `net10` already has a meaning (.NET +Framework 1.0) we need to keep it that way. To avoid suprises, we'll by default +use dottet version numbers in project templates to push developers towards being +explicit. + +| Framework | Identifier | Version| Comment +|----------------|---------------|--------|---------------------------------- +| net5 | .NETCoreApp | 5.0 | Will work, but shouldn't be used. +| net5.0 | .NETCoreApp | 5.0 | +| net10 | .NETFramework | 1.0 | +| net10.0 | .NETCoreApp | 10.0 | + +### Preprocessor Symbols + +* TODO + +Today, impliicit `#if` conditions get generated based off the +`TargetFrameworkIdentifier`, so users today have: + +```C# +#if NETCOREAPP +#elif NETFRAMEWORK +#endif +``` +With this proposal, the `#if NETCOREAPP` condition will still be available when +targeting `net5`, `net6`, etc and will also be turned on for `netcoreapp2.1`, +`netcoreapp3.1`, etc. Is that intended? Do we want a new implicit condition that +is versionless but targets all TFMs above `net5`? i.e. `#if NET`. + +### Persisting pre-requisites + +We need to require a minimum version for the iOS/Android/Windows SDKs. + +* Probably like how we did WinForms/WPF + - WinForms/WPF uses a framework reference which by design doesn't have a + version number + - We'd need something with a version number + +This work is captured [in this document](https://microsoft.sharepoint.com/:w:/t/DotNetTeam/EavsPfFy7lFLh7eQrdMN8QwBl05cGLPwrSzJeT8vEu32mw?e=knNQ6W). + +### What would we target? + +Everything that is universal or portable to many platforms will target `net5`. +This includes most libraries but also ASP.NET Core and EF. + +Platform-specific libraries would target platform-specific flavors, for example, +WinForms and WPF controls would target `net5-win`. + +Cross-platform application models (Xamarin Forms, ASP.NET Core) and bridges +(Xamarin Essentials) would at least target `net5` but might also additionally +target platform-specific flavors to light-up more APIs or features. This +approach is also called bait & switch. + +### Target Framework Names + +There are some places in the IDE where targeting information is displayed: + +![](pic03.png) +![](pic04.png) +![](pic05.png) +![](pic06.png) + +| Rule | Affected UI | +|----------------------------------------------------------------------------------------------|--------------------------------------------------------------------| +| For most UI, we should use the TFM short name (e.g. `netcoreapp3.1`, `net5`, or `net5-ios`). | Solution Explorer Editor, Context Switcherm Debug Context Switcher | +| For cases, where we use branded display names, we should use the name .NET 5. | Project Properties | + +### Related work + +To support multi-targeting end-to-end the TFM unification isn't enough. We also +need to unify the SDKs between .NET Core, Windows desktop, Xamarin, and +maybe ASP.NET Core. Without it, multi-targeting doesn't work without having to use +3rd party tools, such as Oren's +[MSBuild.Extras](https://github.com/onovotny/MSBuildSdkExtras). + +We should also make it easier to catch cases where some APIs aren't universally +available anymore. This includes fundamentals like threading for platforms like +WASM but also version-to-version differences in OS API surface. We already have +[an analyzer](https://github.com/dotnet/platform-compat), but we need to expand +this and make it a key capability that is available out-of-the-box. + +## Q & A + +### Why can't we just have a single TFM for .NET 5? + +Moving forward, we can assume that the base class library (BCL) of .NET is the +same across all environments of .NET. One can think of net5 as .NET Standard but +with an implementation (.NET Core). + +However, net5 will not include .NET projections of OS APIs, such as: + +* WinRT +* iOS bindings +* Android bindings +* Web assembly host APIs + +We *could* make all APIs available everywhere. For example, we could create one +NuGet package per OS-platform and include two implementations, one that throws +and one that works. The package would use RIDs to select the correct +implementation, but it would have a uniform API surface. Callers of those +packages would use platform checks or catch `PlatformNotSupportedException`. + +We believe this isn't the right approach for two reasons: + +1. **Number of moving pieces**. Imagine what a simple class library would look + like that just wants to provide an abstraction over a single concept, such + as the GPS. It would transitively depend on all OS bindings. Regardless of + the platform you're building your application for, the output folder would + have to include all bindings across OS platforms, with all being throwing + implementations except for the one that your app is targeting. While we + could build tooling (such as a linker) that could remove this and replace + the call sites with throw statements, it seems backwards to first create + this mess and then rely on tooling to clean it up. It would be better to + avoid this problem by construction. + +2. **Versioning issues**. By making the OS bindings available on top of the + .NET platform the consumer is now able to upgrade the .NET platform and the + OS bindings independently, which makes it hard to explain what combinations + are supported. In practice, the OS bindings will want to depend on .NET + types which might change over time (think `Task` or `Span)`, so not + every combination can work. + +We believe it's much easier if we enable code to use multi-targeting (i.e. +compile the same code for multiple platforms, like we do today. + +### Is .NET 5 a superset of .NET Framework 4.x? + +No, .NET 5 isn't a *superset* of .NET Framework. However, .NET 5 is +the *successor* of both .NET Core 3.x as well as .NET Framework 4.x. Starting +with .NET Core 3, you can build the same kind of workloads that you can with +.NET Framework. Some of the tech has changed, but that's the way it's [going to +be forever](https://devblogs.microsoft.com/dotnet/net-core-is-the-future-of-net/). +The remaining delta will never be closed. Existing apps can stay on .NET +Framework and will be supported, but we already said we'll no longer add new +features to it. + +Thus, new apps should start on .NET Core. By branding it as .NET 5, this +recommendation is much more obvious to both, existing customers, as well as new +customers. + +### Why are the OS specific flavors not versioned by the OS? + +There are two reasons why this isn't desirable: + +1. **It results a combinatorial explosion**. A TFM in the form of `net5-win7` + would (syntactically) make any combination of .NET and OS possible. This + raises the question which combinations are supported, which puts us back + into having to provide the customer with a decoder ring. + +2. **It can make asset selection ill-defined**. Suppose the project is + targeting `net7-win10`. The package offers `net5-win10` and `net6-win7`. Now + neither asset would be better. + +Developers will want to target different OS versions from a single code +base/NuGet package, but that doesn't mean they will need to use multi-targeting. +Multi-targeting is a very heavy hammer. Yes, many people are using it to target +different versions of .NET (e.g. `net45` vs `net461`). But that's not +necessarily because `#if` is the better experience, it's because it's simply not +possible any other way, due to .NET runtime constraints (i.e. assembly +references and type/member references need to be resolved by the JIT). This +problem doesn't exist for OS APIs. Developers can generally build a single +binary for multiple versions of an operating system. The calls to APIs +introduced in later versions must be guarded, but this is generally understood, +and we have some limited tooling already with plans to extend it. + +Also, this isn't possible on any of our TFMs today, except for Android and we +believe it's acceptable there. + +### Why is there no TFM for Blazor? + +Based on conversations with the Blazor team we decided to not create a TFM for +WASM in the browser. That's because Blazor wants agility where code can +transparently work on client and server. Thus, they will continue to use `net5`. +The browser-specific APIs will be delivered as a NuGet package, using RIDs to +provide a throwing and non-throwing implementation. Other parties will have to +do the same thing. + +### ~~Why is the TFM called net5-browser and net5-wasm?~~ + +*No longer applicable as we won't have a TFM for Blazor.* + +WASM isn't a platform (in the OS sense) as much as it is an instruction set +architecture, so it's better to think of WASM as something like x86/x64. So, it +might not make sense to define net5-wasm. Rather, it would make more sense to +define net5-browser. The rationale is that the browser will run WASM in a +sandboxed environment which equates to having different native API sets. + +Any host that controls the JS runtime (e.g. node.js) could decide to expose +different/less constrained OS, which might give rise to other TFMs, such as +net5-node. + +### What about native dependencies? + +We don't plan to support varying API surface based on runtime characteristics +(x86/x64, AOT/JIT etc). This will continue to be supported via +the `runtime/` folder. + + +### Will the new TFMs simplify the project files too? + +[@cartermp](https://github.com/cartermp) asked: + +> Does specifiying `net5.0-win` obviate the current three things you need to +> specify? +> +> * netcoreapp3.x +> * Desktop SDK attribute +> * UseWindowsForms/UseWPF +> +> IOW are we going to have to support both formats moving forward? What about +> converting apps? + +Generally it does not. The idea I've heard is that all project types will be +unified to use `Sdk="Microsoft.NET.Sdk"` in order to make multi-targeting +easier. Customizations (e.g. specific targets and references) would be brought +in via `UseXxx` properties, akin to how Windows Forms and WPF work in .NET Core +today. The reason is that in many cases the TFM alone isn't specific enough to +decide what kind of app are you building: + +* `net5`. Is a class library/console app, an ASP.NET Core app, or a Blazor app? +* `net5-win`. Are you building a Windows Forms app, a WPF app, or a UWP app? Are + you using both Windows Forms and WPF? + +The nice thing about properties is that they naturally compose. If certain +combinations aren't possible, they can relativelly easily be blocked. + +However, at this point it's still unclear whether the SDK unification will work +this way. One concern was that SDKs also bring in new item groups and might have +conflicting defaults for properties; this works today because the SDK can bring +in .props before the project file. When we rely on properties in the project +file, we need to bring those in the .targets (i.e. the bottom of the project +file). WHile not impossible, this might force us to have knowledge in the base +SDK that can't be easily extended via optional components. +[@mhutch](https://github.com/mhutch) is working on a document specifically +around SDK convergence. \ No newline at end of file diff --git a/accepted/2020/net5/pic01.png b/accepted/2020/net5/pic01.png new file mode 100644 index 0000000000000000000000000000000000000000..d4fcf80fc670226bf4d15cfb23e505cd8d4d51dc GIT binary patch literal 103014 zcmYgX2RzjO|CfYvILVe-vYox>S!I-ly^k}`$S8zzI^)cQla-N@%oAm1ud`*3P$DGR z`~Ozo-~apVfgB&7&-?v;yXBGId$c7W{h=@uIovaV=uaqQq#W_JKN0fDuV^ z2%YPj@Nn|&7)lLSZ*_m#p^e~rhv2n`L3n)E&oYYY`oN4Mh0GM$!5%`|UiXI5K~GAs z*jK^IQc;#ri8?v#&e=oj8zZA8Q%|YJ6TV?eEtxn&*Lnt^w$ARqRp)t?);*f($$4j3CML{e1=)2IJxxnDWu zd*JZ*cX@X43yxQ?5;rX_g;vC5A7l&DPd%Wt?RS6t=Q*~4Cb=R>aT+gP3mZyAQhfk_ z-`7&M*!a%_&toODxJ`2Xeq?i$`&^o0@F`uabAkT$2NZlt@8v8${?V14 zVAP&XVZCqHSb9z<=??kYh>Tu&+3;HH5iy`O*H5V;|YBzH1&jMz_Dl3+z>>0{G zE1i(SO284uxi-!=@jTAtW>+HlP1)(wUq)$Mlk3gKnl?+0m~Wg!{5c-s7!A2>CBXqc z4e;#q*v;F4yyS&68mNy-f>jU1zy>u0t74b`y|plQQw?m?AksM3@4n!G?v@Q!&EOok zfc9DGV(5a2x94xcs@;E2eke@C^lC3xcS4D_$mg(-K4ycVBye@WHAH`4vP1uo84EUu z`(LZR!TxhOA|Cmc+6)rOZ^VMt|75FS-QV$m-lARMy^Yo9Nm%8Dtl($;`lUR%Vw^l#P7FN`(y4T-BSpDyhnRxkTy{{9u{22aP8Pte(dS- zven6c(|+If2KWC5idsf~kM@?q zZ@6odTKBzyrF=?;srkT-cpjZGLEdqLPG&kiYJSBphaHcXI&QRB_q#anCAcpqTfE#P z9^VeKTNX^ZEa$y@^WSCO@YZ-Me)}kX|7hv*9Pp`U{XT(wq*Y#}}^(4|19<-`^$SZ#57h2`v;O22#9pAbSNXqYxQ z?dR%qS7|5YzG$g1$T3qIQS3|Vm7ppACSFT&N9bPe$BXn%5)KJDj@S5H?!pw~Hi5RW2ax6M++~J; zdUO~!U0LDgt1Lgrn7t^?d2?bR_Kz#N$_oyh)$rDf7yHbb&r`ZO%nW}hg&!R5mWUIw zVuXLXdy~$oC{%;Fdn}iCT(z?-@)cQ}@`ue&gS3t3-@50i`k#3zWR`UOmbU?_mYH(S zJ@{ZE_;1|Pmuk!Bj&prxbBwQ1dQzcZsMbGb98bQ%{H~d+FzGfli9T}Ns*`zDdZx8@ z_4SU1fBnOk_Fb1+p?$;opYQ6g&2JuKDlDUCh>SM_I8RT(cEUd1Qaj}b_HKYo|CM~h zQXl7LX#Vi}J7oE-8)kK|nD*rYE=r`}fHPk*xdw}_NsgM+(?Rt5SzYSMb6MEN8mM;_ zwA`L+gMmwg2rInpTu`{Jyj)mm$%Il?{+k;FZ7ro=UcHTqcaG&MU937snZSUpIMUsC z`Q*0VSGkU)f@GD@b1&X$SH8Lwx}a%L?X@uBLWy9?Tg^E5v=+S?RO)A+C$^J3xF(-! zRS@sm^_dy&(fb`iKA|q~=?CP|oUZX}ncT+cPF!ebx%q@CJW6u(v!T#J}bmLiDy|_&_&eV?psq-2(0$j(z)`jpgD8D zZ;2-lR^N{Z=M+|_{l#>ejjA(3@y^)s=IrH54B^N8=9a8#3}NqUw~<{#u#`K6-vs;Y zG^&JNaY#r540u6wL+zoDHbB<$XcL(LHxO2VO%VWwWYhD za7=p}RNt%!)3H(-DrAL(!AI`EiYp@}QcAU}Wm%qPQ@#=`P%&*N{~e?f^f;fleD5g} zS4PPZvq{@|6+&z9g47DuM%U09*1j4diuFDhBKP+2Zgryagzw$kxBDrBNk@L2 zlEcP`z3~tGKMGF%q{fy`WIXBPd`s>3q0892x>Z!A_FW{1{YZ2EOAHQD)rKMYDxnp+ zDcZV{IPuqmk>%z$R2`i!y%)z-bhVdH4P>NGx7JQIJz}-lSf+!k{8au4kL5nJeD7z! zes;$PSjBj=`V2P6;ZL4-of7n4kjHwfz2#2ZVbDT)Te04GDz<7I2B*AUbvXAILFqUAIX+Y5CwT-AFA8X#LXBk_2RqgViB)?3kTqf6|?Ao#(dDI%Qs&*P=Y_Yybc3)XM25Gb1N zLe&^T`)(3nYhJKtB9khH4Swo$!F3)oaL|PWi5{uJCl)Sv6uuwczjtF|xOk)7$LKG^ zK#3NU-LCy2M_g4=;v=@cC`Y0lEPQZ*4#Haq5?p~)*rfO5+=y%Akb}@9$9w2d!9Q>q1hD@)H!{1vInf8!M= zna5&Q*f9rr$mz#jm}V4XDVjoq0n2C%&B8^hOQ+I=SLhF;H2E*mgbV-qOjhAo@JYV| zeZj1;D(HfBl7H$1IirZ-;NYLK{Bsv_x`^uuJQmMlITd2GyOD$1W2y0M@Q19kNbwWz zVj&Fg4MVU->$ek88dX%ME;o322!_i~8x$Z2pbmakuTkrK*MpL%LP@f?)>rVoKkb-# z0~CAIr!VB++8kN8xWYv><=8`^-kjxBz-&UkC7NRM1Qz=LzSK2ttAz3JHv>en(+);) zx};nEIG9c2tGwV&Tk^p}6JK#nFJ|~?nP?7EUI)LMSZWY|7qZA568{5#w-V6GRp!vc zPJ8)w3V1PVZrR-zXX6?KPY+1#6{0@!cA#V7?6Ro7SmJ{^ypqE2E`~zePh^Afiq!<+mhK!3yzU zg{fAfThnvT?lIelF*qqW6!Mxf4nxB%&uBlrZR2P^MkZS^6LfGQm@W;BrwR>?Z2t7* z><;Y7juve|ut&V(+|NpAyrU@}K!BLy+K(#Dr)FdbgRKg4yNeA*KVB9Qh$W`U?sldL z>#6CX4ZW&SrzeZ|HOgdcoF^ZbM*ZjL>UQU_T|%0>cbMVU5&@7W{b{XG#%?z7BGt0f zHhgQ?te9XYrFV}TqvG(f0sOM4`=v`oh;g>|^5@9xr#6Liagjq;A@=_`$kM~z*{~h4 zh8>4NC4u6Kapzz$&K)g=2&vj<6acQcY0r4#UJx>#5YdEfb*QvcG@Ghti5G8>*j$fy zzti(>imn9;i{>0yu^$gu+P-+|yQ*)rqnN}OZeY(I+m2tua>7y-F(pg8hPmCnRXx8L zxn@?`c<^mdLweeK3Yf=^g2qEr8OwNy7~b%!k>!?@mxP{|t-O~qPKA~K=7m_W`mT(w z*WdUzF8biqtB6K7I+E;&I!B3WmGY&T0G<#E^)l$B9S=oAlF)%im;=X$hBTyDPH~@! zqwt88FqMrZqguInyI``QyA8^w^|BuXuz44VmaWcP<&VWDZt-78ze}{xl9kx9!c6sPc+YdG z=6`<9_UKnb&%Jy1f+e#mnYn22AGNQHKcvhVJ7?Qp;3f>6a`b%?-gEy6dGale3u=hC ziY%_A7Mf`uPSm9ZMEH<-USYDE$p1X5jXn5Lbj$f*9R&H{k!Vf|V`JV)c*hFxRnpRB zMcaRZX!|sxk_51vea3x=@O|&fN*rTjN|s|DUY9X%uJ1wGg{DIn6zeA{`ITQYuQqu8 z;NPwI4{LP?+tN=eF%k8jX(9@W>-Mc^B6tpM4aJH3%MG?WQ==V-(+%l>2NjW3t$n8=4`hEs7ia!wdR+e_K1~ZX-$XgH$69)1B(LqU4j}caErFr&i9GqxIo>)!ajvi(gpPqmmW+cT=flEW2Q@J=M>aQO$00D)(Wjjf1ECMh=MD{dQjUF4wdSfxdzEjdds z_}*4>AAw-z5lwt4=4Ye5FG*I?LT`4M>plIyld1$TH_Nj! zEOfrvH!rM{B%2c{UftnpZ&FXlOYW@dDkJECWQ{0Ap zS>VFCtTVjM@RA-zV!&1U@&GP41-5DYMa)+DwHhzHQ^uC=NgHFMvHiX>Qi2w490kRv zfa~mycrYbpqayf3`xF9>&w#yF=X9oOe{{g5;-wBk3?iZA`t$X00^74x}%a2vc*BvFep?Y7B zrdkm*1S#b%H5HB*L6OB(V>Nc)s7LDvEsO_$JZYsJ)j2K6aesi*uI3fdP)fXe_3lJmGc+$H2oAAfc0OlI zUWS{fbkE#s13p*O$wDY;VIl}aI2+?G-0`Hcoz-TB(_Nr*7M7w zu12$D@pf(!Hb>C+Nj*8SEo8gEbI z&Cd?}u7k=8L~_0>yTSj7k-de~SV@}7l!z)ly+xEOu{(TFZJFuRZOz*jHmb~$o?3S` z>n_x&l-nb$oXOP(@AcbNl&v5xyNLym0`Moug)8Bg#L!GqDy(X%#;lR!l!92m!hT7a z7(rA&AqGW(tNGxs{UI|N^U>1Ni}vFV8xoij&nV=Ye{m;9QY;09^GUXu9}7ECz?8J$ zsl#aDFAIL$xVz4n%^TyW0x`&WiQ)CO!7+qA!l7^E&h_Qt31@K&0_DCOjdOIV$C4qpwZ*p{V1|g2D<@f?b6V*nyPb!58+qz9h3AD^I*96QQw8 zv#vXL^{wV#M+%Wz1vr)P5BbuV-x{%6L&*gfNMK-Y04oz)+;(n=HZx11@O5j#XvRiN zFbAdt#~C#El(8|158V1R!TN!u)ir6YSzuy9uOq>Md1G*^02W$D>wDuIM`D)kU8s%Y zVCjrR=O(~0M->7%9Y^Mp{jNSK!ahQibzH8r z0Fo;FXA=u2?Bkty98K7s(PW>!MkDke8~jG`pp5Lty80%#Q3<{mobaHixz1niMVvLT zdi9^Q^YCbE`sbn{e2USfq5P>7$EY_!rNrJ=*_nqJFNi#0mSCnR zw4Yz6la|0yz!}1dMqHVg2x?xOGspqodrj8Dk(}?+jKuJaAyTNW<`sJ;!e0_EX9*-F zdA)-*yDA5=!NZ9Z`p%2@-qpOTh6watya!oFX=BfnsVBaD`xf^`4Pw*PrcP%T$pK`!bqQ6P*Zm80$yPyoCOnhAlB$*XrA%E8Q`yAl%3hzticF)b9Hc>kq$+pWq@f5Xdgu>;h%*%yxH{w)U`=H;cu2vY^lg8~Qv^CA+%o%=(C zy-#}x4yi9ErpkMZq$WEy`>3QQhd)Gn>In2I9Xf23)eS-H*$?rvnR;I}JRO^MBU6_O z=v@8%Qct|f6BAnmk+iX(aJG+llzM&QUJm7{yCnaE3N7M`1`HbJ#SE-oq?iHG8*@4wf=c1Q4;FGusT6GLL6$EWfvcWwLl$$AxhWZ-7|z z(lyh-K8M)Tj;XPQevsLutd_BREliakhlPi7(p3NwE4|P-nH#u))1S&DCekgW-L@^v!X8Q~p21tXKKuur_afN4Nzl3PMxfA7b-D zdHE0IEuU`keK@Dnq7gSKBS+o0w)*Ub_@W`kX{`6j<9L#0}$a2 zuub;?y1UEL6K``kn#n>itYAg5Ru!~c_XMA-I@8$4NB%zRO|9K3A3OXLNGwaiuhR!C z3s3cW1LAM0mp!*9BwOcN_ zCFlO<5kQDwQ}j1?lzW3eFT)T%R^ZmUs@L37H}p;rg#W`sB~7@Q$iI@u zY*W~bJ9yGl;)78S5tg5BO{3p3oK99z9||e)!0|w)7`%SWW4GcK%h)J!?{JhIP@ws? zI6e+MpGOCshr)5S#ILdz8o-a+b~LY8hS1h4HGkFGLliwpgqGl>7raBDJHT zlV|b*xA8U-DJTWHaLKC9k}^tHP~zj4@^LM$raxj&Q|$^*)51}wgy9MgTDloF3k}2F zuW)_T((P@^Lj{s{cX;;p?NjQeT8%#CKPe5a^ZnM_0Oj-`s?RR`ExG$T*QXxLJk`L` zKV=d}+NDXmTRQz5IOAjd!NUe8?x4TBzg(>I3Y>WteG`TU1pFA|g2; z@2PK@r|tqsVe{*$!hnMBI?Ru0HAQf`2I>CEackh)k5;ts(M=IRI?BqVIX5EsDZ_zA zMApSq_VkAf%*WVZJ0N|MrmmquDdp@2&hVnh9#&3BmXr#${<;_`V&8-u}dpD(z zXc6QrN%mr9lhEqUl6650EU-L(DKGk+LXgB{D}o-7P)Z|w8Npf~0aA-oG4qt2L|8*w zx3|G!V_!>_`(%ra1*y0ybwljsGzd}^_RHFJv1z?qdIqA!>ZvaCjTL=_T})SH*^tjmg6ZB z%dzB_dJc&Z08SdkG{^NXoQj%`4}d1}u0|i6W^{wA{eBGgRy?D;ud9UYs%5ysk2g8C zCRfoii-|^-=TG*FPncJBxDM-2c1{}mwb(6QOdN7}?PUb~JgVT$GA`XHI@QAE?q7=B(M zW^dA~H+n;A+%e}vt-_en`uWz)%MT`Lx}43VdMTwwIacaVj%|K_?eGlN`0|j=e=*Ct z_i-btM5My&TcQ#Fg!!9?3I{9rvx1~D&lwxNkI%FU8nk%#yGc!sG2(I2>w4OQ+AI?f z4>Pb%C%ZhSwatmMeQ9bGNczg7Fy91KP|m1X^;0r=hAx$4K4guT#_e%vSg zhJpvX^RZ1&$k-THq_bPs?<+xXaBD_|bDb59x8iwqG~B$JdB2lyY)pNy-JuE znHji!o?79T$|Vb-Gvo>f>oICOznZ9%A72bLjKT_6EsD{4gpIlPHb_NT*pI^M7Lb$O zd3dAAmCD|F(sbY($SJ$gU1wpcLcwKtH>Q+YQXE1 zAk{B(qMe}A;ZW)>Uqp`9s1}4IuI^98c`y6?yWfdttx{Yv_U#n!E6n}YAL~8osJl(1GJua95 z9Qjw6@*(Hp7cymX<-=L(`CpmGOPO;`31q&eF-!XmWbC1;Xi^PyiWp(U{@jn>-<3~f z14bYG7~+d!SFVF`r;bb;V@}@OOqCK!ss(P;&zN^;b^Oh$4B>OUsHJ=%R&m?-k)GS$ zx8&Z=lcSjvMcT{Zw?rHQPh$OPpyFn(r5fh3f)OXjYbR7E8_FlNBU`IB&+Cu(mwoE0 z-b*}Q)SA5gTG*nh-I^YF0sy&^u!st7-2*!wAR6tyNR6o4ZBPcK5p#L8yYt3en4IgR z@(|6zExd#3O4!(NR~a=lOe%_fAI=K;PxZvn5hFyNxC`*t97CA$bkNsk)9U*PI##)) z;%D>>AU2f^zYX)KpHk4BFVkOD3g4%GW>W=zSCw`Jo1ibphn0mfnngaTdPj-;B+FBZ zc$H`vd0v28Y1i6Gze_8=0TMyCR=rlo?5--@V?B+CRV?#s);ihCJYkxD^?aL!bz;aq z*@FIfC-_8K;93P&p3cZMaRrOy=8P%`vZ_sH?`r~nG)iXmwepcu>&Zd=3HD0M~7y$T!QOBvjH^FXc%%Cyan6z#IDSO=SD0oiZqRk!OSZWgPV&WVZpPuU@r+3yMz zy%Y6BtnS^Tn+ZMbM!N*k0%6VivM7nJkIm{_pR}#KV_bu7AN&^@?zViA2kL;V?vRn` zpC9I9M%PC4q^B-{v_o^e`C7S!?Cq5DETEyW-$pDRSUd`(F!%)mypkO4H}uA!;pc{~ z`r+4W%I7Pm{at3mWVb;M=e@MD!%Zt{r@)Mv9sSr#nnqgH)VUc;bD4fLj7d5=g@Oq+Y}qbsmau?0wISJulHE*PqMz zrrVlldhC9e5JE69o0C)=19Q*1h`uN;d#ZXeuGNA)*nhin&QBiQ?9yyvM>r5WOGfo> zBig{0!&Y>-?Hvz>6=tmx<(ICT@Mh>mQ38hqDI5dw8}jZo$a@k4iw=IXl!q3il6ee- z-5sf)8DJ=2y1%t+I<(ve^mCYhtV!_(&<^|@VJ5{V9!a>vCf3v`(PQ)E5|;%}i4KJe zLs%WnglZwFcmsq^4MfH6mIL7Cx2V+VsI{)0P)^$==w&l?3EViQId^WSm?PcpDy2=J zNrn|y%p?7jnA^( z8*$g#hz7-qRt?QiiG?SrGlx7pcfKVTteT(cISM*hWf-|OTs;>lFekcy44V3{&Z5W4 zk3?G~uzMbI_RCX>y&fmyUk_tS~jO>s-3MoS-;PG3Moj z*k(%f2n<&!*h+KmAB2db{2=3P)Baa(w}10oi1t9Ad$AO4mT}e?XjZ{yr`6B%#~z;O z6fy-{k=UAss9PVw*aiH1PkIgq{Oh{?lme`P=H6)|MdHyCHIqT;2WJ9&oDyjnJ;!~; zx3~@Rg;rlC3!`nC)&LqeWFzt}xVrg6I%OsGSuPJx4|K}W$A%S^Lr=)I8H1ol^nnM5 z^TWjD9{IJX@5zW+ZY&^Y(PLEM_sOy&HliNqx;<(q9;jqFadI%@Gfu91(^0pO6CK9p z@3=TpY;`Hsdqg#G(wav+VE5OoXlnX$k65@;(Y57gQ+iAj>f{Mo-JZWo8O2Ct)|Px0 zs=O#irMvoC&QEZubOfiQ9K}6R37CDPyff)lderw|%fum_?rdr{!ABLE-SFtWQzk<1 zgN>L26S>snOy{;_tI?z@qwP{Hx;sf%f(^dCAF@sO@!4d1_EA_+ zZc~yOo2O$JvbZvBI-C!#M^6{JJ5cN`X0<`lZce_VxatnpbUR7{LlJ5w8|NYMJ zWey*%hMb$3N(LhVO#Z3+Iq4CSGDzD@3498wj9phZGkDtXd*XuOSyUwE8*ATZxT#Uq zTu!moresQ28pTWx7{{d@X^VP4^KPXkPP^&jRphUIwS&u8_uM?W%>7t4MLFTrpQ#_t zuR=sU#$GE{=2W;rev^tHm_C^D!Pmuq+)g_?vPCJ1lVt!P7_sr=Y(=^>E~1{9xT18q zsJeCQWV!xWU=pCMDAikm2yG}o9h!`q&GE%|nS)j3af!Zosh~HM)KVAW&C;CFCZO&F z96EJ+sB=CwPU`*zIV{52Q6Hqtl~-QioLEe{8gR14b~MibAmA(d_+e` z`+jSTqkQ#g2R*N<#MiUEGmf&f|Lz}cU)Avnvn_0+Pw{ATunC!pqPMcicDJoIY68n* zIB32hP6xb4FjVrRyN3LiT zJn5UM?c}&SQo+FucE_sDxw~$a6G|ofHI5e}d*Yh8-!~#TVb|_k6YSJOm#t9S!?=*9 zm9)3l8_ZUGc>)=*5{B?BQ4Hk|H23NO^MW(2Rks}~Zf5#;BeLuINV0f(fHvf!d%)^I zEF1~1t^`sh;u`J4b@*kepX@)vi$9D7S`O=x&Uw85Y=}LAaZ?#t_QDk@b`Zez zB0vs+w)QIG59^An&^(m^R3|nWv!&2uNqevKmf^E%8rj0=6!*}V2fSJVWA4Gjg_aqN z;h91EP6S?i7L6_yi0w3~I{R-=l*qN7mn@XhA^qXFl0|zZT>6UwzcMOKS7+SCguYjo znX4TAY{|R@2lE?rk>dVI_a*q5C!UP8vxGfA@E_`a;+scNYjyO)Xsqsb*>uFU48~}N-0;*NHkk7JPg?RdAVAknegD5r$y*hN!-W0D?fJ4(#pk)WKT%41T>CI z*8zS#zq$j8-KHQ0HtBA!kflt7?)L|!>rHy!*=_x2@VG%~P9WI0DquNX<+huEQZw&z zsv*4Y+_x!u`?hmB^a|!n0E5(&7zD|HSz-0me%hYFiN)OL1Wc%^ABtw;41LmpPJU-} z+~l%j`iNtLdD6_imM-~PSJKHOB8H32#J4$|X1#vfl?)xPglBf9%CoR5QL;UYxYTdI z9-B@`DV@?xf&){vpw$O$sR5odW}?QY%bhWJ@d%8%|7KjaqK%xwA487a9a=@ zae04djlJr@8e6v`Lou)vJ&9VPQR|AdB(iAZ40Q-mGye$A3%)=cXq>>O7GQh%#4#IN z2C}+L1;sdJN`H-TxKnop&4%kpwAVP-)^}C|=^l9>`;(xca`(y z3=9~YywqmRUhaG7SQnZP^S+>l(w?|(b2@|c_^<0Wwgv;^3<9^7LIXS|+=a+zYOz}H zXvl00-9aQ1Uy<5XC`0vUEjsS^wQTBiTR<$T=HQh%JK@rOb4u(};Z#>y=+X4iS}Q6@ zk*b+w?iiKSXTNNBJd-55;*Nv+#}@U=4~m12mR%J$`6DjB(;~$elP!zk{LBWQFkK(H z>;@6{MyISeLChcn-qpCGnkQt}`#3u=UYkJ5u^Ss@-O*sMxKxR@`C+lBS`M4|`e>sS z>92^>nrWzMxvr~`mWX`l#TKjZyWInD>cm2_>ys*B(xiUql;tQJ{hE*ny_5$6?OQ;$ zCdgik2n|Mlx@Tk|iR%e(GYrjx;g)Wng)0=E9U&Q@*BuN6LScDNP};ey+m9Pu$G@x3 zm*xe|rN-s$9OYWw(CbV^jKc9l^XhEkxcgguoN6%2ur~uph}Ra z{?R1>rcMMhvClEKE5va&#)gS-wH-LLI;!7|-}4l|cO_WM+U zg&@ml6%e>@G+!9&1$)a}l;QdrLLnTkMjQ8$ zAglKBnPOZKyrRlIGm6?Lk(2yeNx+inppG58-CUn>flT>Q6=Xqjgm3qP#2gg$v{lVz z%smN$v@zlMLk2b(iBAK34Tw5R7=W57!M_mu*)4r8xPl^w{&sH^WChr|CfcZLk&*;jCnWLW%N^1cm3UhrY@~S1*vw_iCjk`Y@Q`-1y zdf)>My@5G$Q?MB)LyuK=$TVWYm=Hz*c}KMcwH7Gl{Xzc z8>|Kx8y5gYMFnkV)$cPCiZ)i1gd(pxGlac^j6qp?K&S4Qn;!s|tMahG9|ij=cs!D+ znY*!9m4~0W@#olRCKFd%eX|a!aNv6zF1edZdtYUGfA;R~-+{9Yf&Q&^8CNGvpGMz~ zliQ8K0fva=a-|uF^DJYIjH%~?Al0w%2xZ6l$49FSd+*P9h(+z)R5YPu#4q`gZl>${ zk}eNgiOsQi)Ew?yUJw72a{%49$*Wt5-RFKJ%P{m5_0SNH_EML(4vKFetaHD;JoI_F zG5BaHd7|O|b~Q`o(+`@5XNn|O(aSMQdKFS*6XE8eEU2d9L>59#8AdccB(^y&Vs%7X z*$O%?2XaWwvR+BL-HuICi|c%8Dg*)44sQeS1tUKpF&7tvtAw@2dXFmX+r+Rhsj!aU ze@cqS!liMm(%aXF}rOec1*ruLb@mf#LX4Ds@8P()B1D*>c)C zrhAI9gH6;v_u0X0H{0c=DlBAq?a92jmiUr(br1SI%S9AtF@L7Df4UA;t~ezqGfK+y zu8q-At?c2Q^cX*#wAr!t#d}I~-7GQ37Br4K4^lApigoL=%R>1L1pmz`g4u)TIX5GO zoOK@mLKMU{=+>w-MxaMSDoF#C{BiRw4|l|3ur4j0a9 z&0LL-jndPE>lS~Wp-Fag@#Gc5ojFj~<|2lQk)Kn4!xATK3o7IqYZb)k{X>saVff?S zDA}YTYt2g=rmT%AUZI>_q8t~jfPTZPdu9%56MC!qwdQ%wtn&LyLZ0v z#YU{t8mai!OA+S-RLoqwKiAwxw{Y(=y+hNF4TRr&8_~C>fLb-@_bbX@65;BA1r z4R!wi3LYgA&FPq0ZZQ5f8qAoDvjUjUQME|ON{%>RqeEg#vR{aL*PzS5vUs0t!ur5b zV{e^tmzQ3qvPrXPq;Y&!x&V9n<_$Ob`!|^&+ z%p&axu~cSIk+bX^+vimz|W+oEyLIt75#nX&n1#~@e2{Ak~5or2GHMH~Rt zfYhJA+U>5nJ&t-EA;|Zl(fYIuRAkGE+Gu${4P*m63bDOGe{}<-IKV6X7cUKNi(%<+E`F> z_LIo`Wl}y{T6l)i>LL|4bw7VaA%_gTZ3o&(3Ecs(=QIsBbUXQ}uqPEi2``yh8~t{!bsscIn5?F9 zDCh{w<3Q)&oB7UkU^`=Og~|UYM6R}i-XpD^=>)P&w&201R{W{y?b-Lmhn-+%dseqW zC2Ln)`BA2PW|WkP;3z-hfA#2lHtf~^#MaaKPs?f0dj^Bf<@Z3?=u0vI<>qs>ks0uo z^mN}lZBp75zk)JEZ6YrJo^e<8$|Ds&67($B&7e zBG+Q6l5~&_7#s3?TC91TTE6F0_O~nsiNIaH9|&rW3|_nM#X?|Z8QBJdtlbN=v3==T zH}5#OQvj0lFriX(84GyrGI5|;!r014gl~hVS5(NY{F2c}aZ6cu^d>R^-a#M>+|gk# zr1+Pei!Z_ZK3f9meJ$wF_=BDUDSoy%ukZpTlBKn1yU${=_?0aT&t=Cg3<2q5qU@B* zC`%nJgZZc32Y)(==k-vqjjNUryS!QfOsi7(#`0$*?5sLx@lDSAP|uV}n88g#eu z^}^xpy;zav0_-|)anVMT;h=;ZnH`rd$=Q4Lz?kE9$8zz7w$yKojeZ!-Ec241&TY&4 zBrIhNt^~<m)mMlANNS(6d{Z?No&}I=3p$)5;F1BD@ zphTu7*G?nnL2bS<2fLuI`sSRIyooF13?N5fLZbMybw$NV>fijaAch+&YMJw7^QWSG zQKy(JjqCr3drejGv=dk*ddm@diKg`26W8u_>-QJ{73y*c>UJ61K5^C1pw6 z^>CmC1!lu96JFo6iD?^YvR*KcTU4uWdoIp?lqubGrtMtnfORYGd%#so%~~1ip^*k( zYS3zQO#z-Ul!zk|qxvC+yKElZQ!SG4Os?`0It4MOu;+8VVT-%s>wXDp`r@l8P>=!j zZ1ZGEGnn=_BMY1TSG{&1q9cZ>@t$U>KOIHYfZe?VQmwwXH5!32+7&b5Md8$Xb1HE1IxdH5D`6XZD4HnyCd(M)l*tC->={g!u#9@qwdxeD}g@SZmIg-D#_JH~IKPKQej z4c*aWWjfIoBFGc)0wQO z(J5Ptd5u9LWqyu#%fk5_GKUyeS0WE)Hb0!$;e#A(rMgqx>jv5EOB6;NaGd?WQyKY8x zK@Q|DbJ@`sbVtRfKo8kx8r!N%YFbq&2Cd zRn`3sKi83>od0o%Glb)ynn8Xd3qfW{H^Lq}7v?elX|ar;FF@6u$iqVV3` z#U0Cl)qC_T4PXeknXlQ)744;B5s{#6n;+Xi*g}{TC9)jp|5))?b_dKNygyv$!!Xdo z_CO~#)h%*4*AWy;qg_E8^DK$p5x`M;9b>C&EKf!6;bXuQ)zDl#kqWogM%qhiBwNPOIN_6{7v%bw3=}?(c^yrES>_ zQE_w1U-;Uyec;be?sCh}&@uLIqvI8S-Km0hI9!m2-guNttqPZ>CO0M#u;Au^!LDG{ zNxvv>g{#jn9H|}%_#HlApO-Jx$zXizmvEUT{DV!sL%NS4<=HB!Uj|f4bz!`!C7??F zqF`VYdi4sN=}9EhT8QG+?@h{{T22zzU+?(sP!3wCfB!~R1`A;&!K=wTNb#C! z^4Az}zcJ-fh7MUJk*lpT>n~XH0Nj6!xzdP*L0rT$`S~3Df-BBp`hwVMu@J1SY5}o z#>3CPZutV)hu}?Mkt1lYaP2&$a6hqUqE;RI-B^|$I#RKa#Bc4;U@#jp?=$zprunrR zwko0HQ77N)(Au48`64YVhcxcv_)i~g0$h{#?<>7g4vhK8NFwgg6V-J`>v$s*>4VV4 zE3`Gcpn{HR+RbUp_#A1?DJ->ej!G~8`1YOmsGYs|*rtlzvzbP8Fcp!F`n*kjLDg|t zX89f7P4oyYLr@y9nNN`^2X8K)1g+m)I>*!=Y!d*_xxPM*Q$_Ez;&?&vCtrbg)c+kt zI~@ceIYTK*f&%Z{NlI)GysNOt_LyKLc8_yBPVDh;tMP`PBLQRsH;&~5Ki}Ta>DmAX z;8pcmJMAP_Q=a_nh7t7-I%-5|1ZXyIU2o^e<0bBT)}gx~n(~1$-Ic;CReCpEWY^K^ zZ7kEZe)Lho|55i|VNGz|)~LQJpp<|O5J*52R9fhr2neVkpeVg}r1u(7T2Q(O1Ze^S zBE3i_lmI~qO_Uyx-g_sMf8qCjd++bv|HZjD7w6pg@W`XdT5GPg#vF5uxjY(=S=czf zU72(8Hg7?ehHrKOm56x=F65#zq0PtKFKkmC`bLm*b&(c|>vZBFZz$?5Ni0@UnYUcVpE!YPgFGs+rSPjmlBJIBIhQx=UYy$Q6DAL&nHKZ0%NA#5?{a zJbl+9;U-^~Z@{G6#z!erRQ4>#N#xt=`<(0FISQLU(JQ%E&;73LQGZylk>?y{BW+3E zU?`;Lm&FV6A3SE-SmLKZ&uh0XTx1Z#8y2_Xu^%Pir*;bS8oxnZI^;m1~oF4LMXub z5CUZHcq-)P?FyFkKx<2^F^cE`ajbwk}glFPRqrZil=J??L7lkvelCRp#cb@p>G_z<<;66GN9S{_B_jqGzZaKqZzB)aag$y@ zab4|zrH{2G<%c@x&%NvHB4_jaFwi9Wc-EP!ceC~2R-uF40M8?4&VWa$=KjO>I=c1T zAAdcXW5&h@G6|RDARZx-VCB*bzdc^c9_#kDz_!nqu~!o&Jw#w~rcA+Qg%X;n&dDi- z)k9CAjO6Vx=K~%^I4TcMR7bzUmMPZyR%Wbsj)dKwD?DvTfuV(76p|V0}1~p|VXP&LGo=W=D zVqf*M@uEGMR8Dak#p%VU(kl&k4v$cf+@2N<7(n8quAU1-yRoNPPw|OBb6N)vKf0fL zJ5@ctF$^BaO<^S2Y;-lmUzPla+qQ7!1c#V(lNxQN!Rc<60lq_hxz*|Hlv#Eo zNnw1S79~qU=M@u|mO)XY60e&z4B;yUO7@LY@k@#j!LNMXr5BM+S9-d2Fw;QPzv(WR zUzQPTYi-8Fl`?=gA>#n%I;+pWY-_s>g$Ter(AxWT9riEl-iPyBJi8gNqdUHyI)6rG z2TvpcnfpbIiEZ`i(%qr51qq8~{@?fMUqAXR-A{2USu9!gO=8rg%(S@qTjDr`oe zQpM_b(3>ic9juY2IWPS%nhtM)K6VTc_2nEv3!`_-_5lp!7;dXfc~Vg^|MiLN;M{`W z*Y)~=O0a~~=Z)t7iuM5)15RqSHdRQPdI5DaV6YY7?hFwDz-eo<{?8eE4;1$@xBV&1 z!_0`3d5wPi@qQO~h}Z4vkKAtC0gpAuTMF~u!*D({7u)AwhVmMNeD&pHw@>GlOlGr* zh)_dV`gc1B{4kVfGzZp0R;tsP2Mcy8)@9WXH z%hq=qyB_JqQY4$@tv?O*yRu3lF6e^qU_wrk!wW4JasP#e|E(@sw1yYfZhYr`)N-mj zI@OS?uD8+Svxn9m2%~Ke$xMJ^C(E6$uN|DJ+w3~(e}AHk^?h6LJz!=MBj@$Q`-j7{ zc3uN1zmVjMMN+Z90r$T@0;J(Uxc+DMrKyMb0Jsu8l|HpbmOE0+$cCMw_R-FPa*7!s zOZ^S`Z*SN`iWw!w8#E}-fT|c^TZ?5qtv!I$u1tJ@E?_X2Blf=?vH;jhH47YzX6<$f z{E-bq?eXBhb$?YH6T55%ehlR)fA=r@gukjZs3O_)K4rWC2AogxhjKnWg{A+j8<+t> zmH@4P4-;@lG7K{RCGPzbl&7ovq|Gqy@Bc4KnxwQlII29R>0dzbG-&?JBhVH7J*CX1 zrz{i8r{z!Z;589{H`0Iq{m(!O^M8LV{bLg6LE4Yuba({@@cY=n{}KhB9zK7}J|FJD z(JCcrU_Srt1xb{B-RSd<7eIOm5Dco)f69WuIJ8U!g85&T$2UOI@*zB%WHVZx9+&|c z{{BVUM6pP~Ac(uqSN|{Ht9b%M_C6o5LJ0jm9+?)||Ch!I!owEiV<0^KKQZn9|N1&y z=Ry9Ux3`mMk4+C63*6tl9$ZygPvvaR9b)R!co<~VlWyMxyt)kW*Un2@QUUg3i2A?9 z#vq^j6G<;Yu$%@}91A>j7Ozd+iWK9j-P{;}FZDpMtaW1)M+L~+Bcqc+4#O?1GKF@m zGGp!fWV`yikLf&ShmD#iGq6N^C9;^-PO{Be?lRjp8*o0&GlMf+_CF&qE%UX<1dvr; zB&X%3I91ti&UO__e^02l?74Y6m(0JL6YPxBv(M~RkO9x7)X3v|60T!4&9yXpp=p|R1hqw z?^U+&MEcTHFw(fIrv>qUY@|3rIEwc@Z@5KQ3e%}=0du&~4mbP$9&YvH6C79-WcX62 z&GBfO8GOPO%<+MBLWe)I0KF-^-LT*+6s`=_J&cb*#q%HW+?hh8an3^6vzf`J_sn}L zj9PzIjc*&J2I+7!LX}7Mk1ZM93l^AmtozxQ##ngYFEY0;k6|M7d&OO}v)x53v6%6& zI?}+J0$LIR>OEQEt@4x~M&qR-zvMQsA*G6DM{_Y0P&uiT> zYaL0V{8A2kJhM~ZVkXb!g&eZKCmkuX>Yc#ajn;ZPGT10m2QKvYW%-G+*TUx}9XhOJ zn|OyuuIyMx=8T9hjisriz0oyTskcilO0~^!w$efORk$%hM}3b&2i!}~r!$jL27!Z~ z@{i)|&q04Dpo&c*xPi0v^UYvpA!grKDUu1o<;0NK6`mEE zmG~`v?aL7`gw#9l=;e2VN;eZGJfuHgggzp#KW6h0byOD!CnfCa&k>IH9p-yfg89WI zuSSfGW4bdZ38z7J31#DAA!0fyj-^Q)yJm8t=H>^-AbmQlx&le6*-s154rOo{e=BF_0Y}h+?rQMk*+?K>q%)l z4)e5Bn(<20Qsb|@%sGSuZQ}7W=lbg#tSA#M_LQiCC7z5&D|1VfNSK=_c22vTZ_!KHATfOcQ$EW46=BL0FhH zX~bCIh;?6ONt_u#G3wagH<8+DAEji1ri~6!;=4>866=5^laXE9?hkE>I)(+txYr?E z(iy^j$Y!=N+C5fBw0+_K)Fu8qdacztRpY0hJcw%j|8*4QzAjK0i^)k6j_uVneDsJ> zT0S$3J1zgUkjk+A_ps?;YQOuuwcUN|$t~S3em$!nG}3eMI#{?p8*R&!oKpYmzS^HwL@t-SMr>%#{x^*d*;^6s* zwf(T}3LN=(8`lc=cHzijt5eD^NdD-$Ycg)dLtH75PeC4_s?dK#;y@gw`Ib0+3tE}3 zKBstuaZAKM&wRAxQ|Or%8kx+1on@_d#SL{wwWuRCNZljmGC@vl)Ad7(UTg+(j4FF| zu)bR7`?L7>a*n(2qEJ`{m|(H=rsUT+Vz-`uNeA>p^l`8g_FT zT9CVGmrwmlt^F1S2xm(X53Km(69T6%nv?RtPu|mz;5n^m^kaaYFX4jpXMi^T=TT>< zBZTIy>t63T`r>PQD<(#m=h1r_fH2p29r=pAdL)ZD=iV5<9SbV=zpzOg+@EqJuqCqc z&0&DeojbWAYCoiY`5d(3sBU~ESD(rR=X33-rtdsG-nPv!%khW8P>ELu+wFv2Q`GxBwySbvk(O(l%}J%*MUs0KoEpeMJFu&*Ge0 zHTKSrZN(TnHzPN4nas0SDsGQh$bHi1O9*;QV(YyV<~iPju@5q-s2BEq2y?EwgR$eD zfKgY#YM+id%=4-QKec~y=U0L2eGsj1bk$Rje6zkhtsqFKnY6w;EAcE=r?C2B?3tmp zPsRLL!EDHzqdPs(em$}#TJKQ5SQy4=4)lmlXi?jg6>(|mO91=*&pWJK5EKKI=CVKoeJ9tdh z$g>VJix1y8K~q}iSsx~7jfts$`#EgQRkc6S|rTmo~!!Lr@QnTl#Ib&RZYcT~F14Bduz@kS6$Ah`7Qr*);D>8FI30 z^9b^3=poa-z2&Y6Nzi(#G7r-mfW`&?^Tuo}H-u-{wo%y4&y=Xq$I4h=*uC*ay?L>@ zS#G)JHuzXC4mVnDeoG8MO=P=zCocyIzo;x-&$!*X;Zj#+Kpe*A)a*iF7|G)2#5geP z*IvSj*q2(!=_=kStlxs-6H8mPq_uD5{-F`qLWb}5`0?^VbK!)P%P_l zNSyD6?r#BH0k*|+T0#H+m3wdy4CNtvs74(V`OK}bZtbX1>-<=kmYgYgnxMZMalIx6 zyH6@PG|^$kzD{gp*rIgTJvKfx^ivF^n7IVRZN>KUdL~nELNYr+9~4VUG@q~eoa4yH z0gc{w5@<1iZkB4?3il4kdwUM^7nsE8cMU3r$VM&lhxzy-r+fJ{>wMOw-abs8@0$dd z9!05nCl6CBNMV`&aeieo;9a!(Ka9Ro$_aa%_VtxVvYn;&V%^NAeM#-+)b)hiv zb#yD06PXTfvnbif$&|OfNN>8k^@o`b$I_94dn|)i%lhM=l2;+Hd!Yc#Uj9csJ{Cgn zTlNE_bZOhuI*spMP~RB=VcV~tDTUuRAMH1nY@Iv7XCqwOL^gl$SycPVwvnD(l_kr+ z7<%3JiavDXk%-U5i9Iv9!*iFrxe@C*aBul`Me3MFT_Y0yrYJkMx4wtgtO;1T!Uj*z zp4ypPkhZ~6i$&?%WtK`OPRethJVvoCm1;5OhKL2h%5r&t?M&aRw1tlVhMmQ7vZ0Y|O!B_7}in{)5T z9dD8)Y29W3G6T+SkFr%AqfuS6Q#Jw|plbh}1gL*$47)3CKUynet52(=&G_0e3oPgD z0Pk?2>RVX_F}Bnvvxuv0sN+XN>0wj+E4CBXO11|+S=Ll>EIFaB@y$zFRHqC6*GfH5 zT2sZRiij-LD6cx)M@`UG-HsWkYmYl>a*jk^#gx{^fg9?YDZB=*bYh|fE2;I>JuXwH0(k9&J_ngBJ^ayL0 zJIZLcdTcBZ!;Ai=z2e@%@oTW791-l`p15mT?~b*lMZhYsJ8ySNMc&;;PJ@dNTrCsD z7yY}-|8aesj=tw78bXX-4~vd9fMmpbQWEslRKcO7NTSW4R`GdR=zTNZ=MFW5xo&I# z17hAA>x5TaRakk7w@96xro2sT$m^42FC&SnJ8b$GIf+|gNW4{^_XrQ+ncsMTmilVu z%EJ**1vo0-pES?GkiJHvE-o_P>qU{vDp@FvW^z#>4J7Ey+%9s_NT7qM_LyDf+h{G~ zM+~7ZUEbpb;Cer|N=Ls^zy7so@ry7@DjuV14o3{lE;|gR9AUrJNKsP}2B0BKb`bA^ zQT~GA#dotNGfq8H3$jWZYVNDBQ9q>rQN&!zmB4bUe_T+P0b~-ASCfr-K2qB>@*Q_+ z&SNIij5CINcGAkThi~2mpyfp7vIkL)Bi-maAupZTRM`<{UkGrF0=FGUP5g)NhQYPc z9gY{lY;{#9^v_Z8NAy3p-KTP&Ednn59rxt*&;O zY>7N{myl*8DiN`CV`I%23H9<)y~st$pVdjJkt8AV0V{{t+h&0X9y>3PY$j{eGPc_< z9{70di~}YCIU1qWk9;iuEamzN2XYD$Kwp}GdAF;-SuQg5`Um)$!P}G;h~bF? z$IF1U{wJJx5I`Suu{0-*ErvmxuA%u%GZ_>D2YQP3XW){(GBc`X>imCL?Vw?gJtinuJICi3M;5ij^JNYmMD}`Bn=xY_^`DZt0 zxysN7nMHngkGbB4>Reer7eQDVT{|f1(#F@Z|JiMP5RZ_nN5A{!ployv-Exc&Ht1ss z8+a6f(VV`^Wd}v`SG3d2rlE<{^v@vILAG{*oyMSnpQPskp$>!H&!l%(Jhge+|^)Mal1%v=mPYl7nhS?e3pkaIrt z6uf;beVR#)O6ivti*!w5p4Uq8)dt3$AIiWDD#{o;uTY+lQpu*q^Oz)gFgm3=syM0e zri!E*nXD8`43@75r`FI4Q6<(-}){s-h{;bG@LPN@gvgnby1qrqPQm#&u$NJ6aUb)gm5)pU_2o##W>@Hf(eG2sslQPW0@6;7$N6>4R^$bmGK%AGKarZB6`#|qUpEPpm) z^9|#?IUI(2Lsj~Wm)jX*{0YOtrmleT&duXHCP`*=08R169~{%9 z`ggxuJB)#$GAi`>0;+EJP|lR@{%Jc02KwYb2)Lvq`>aAQ(nE_kc$dIh{jEZ_DbERYkw#Y>KvCEi!|8d@@w%_*>#@jEJhL<+& zb!DNTI0%(@zNgMO=DK2TyBUu1Qg4>PlK5kAOp!Uy3LK$C&EOiq8{~IL^DL(_mq!cN z&vBzL91~{Gu1EU%Vc%JQK|KtMDM)w0W#29)tiqY{ScSM9tan6HuFtW1`yPRbQo<;TL{9VT3=rEkoVW+DK z?^)=O27OrXO@yTHQ?kgXQ1GPP24x{;P6kfxttWKr&2tWOZ0?+n@90RJV1Y8RaG2d?apS?B(~rC#(cI8Y(CaC9z#4U>3F$6L!=}7f z@(tt7_9s^SF67@1kzHsEi0Pk-`=p#VTi6A_Ra0AhYjBJk@}ob+j8u;yX0H47di`f` zaQYa+Q@y_n8Xf)GrK+*5o<=Oi3~>zNuD|azV7;v)o9*h=vhU*ltyUv-pL4|L*!gwj3C|dY>8umx?2FL8(u2iCcUn2cCHrk{w5JzTl2JA8$~Wuc+jRUw@1dsw0Ao>9|^9 zz&-m)hG7!I@0-*X04kqJe{9y=((QY=`0qw8T#be^$Em!@tDo?i#>$C8{BDl@&nV2d z>PszsW%qvlENm((G`|k57jaS25Qez8^ zZB2vJ!>FvkP|QReHF1D=?N44;n)|i9zot1B-2*xV1g}!gWW)BD!@Qi0JwELYkH1bF zCDSXf6?gfvaE%HuZ)-!{U05z!s>nzBiW|}OmT=g*$KF=Pn;@Jn!#8c;>7eNGPu%f= zUl6M|gmQ;?l6()RjkZ2_J${_w7}Z!yK{+#<;(0r1Wcr80cU}V43a8(9C&kHS*I}Vp zvZ++1-ZXrQScp?U&(4=bx3WyMlu%G~N@(V?_STI^wsa= zhCz6K_~9Bh-IFrSo|THB@=4)22wdtxR6+Zm^x`&UJR?Xlr)r0nqd==>f! zaL>P#_EJs^X#Z>enEYQ2nTmjdy*Imq0yn(c;+Dt=bsITslXpaQge5|0BBb{G*VgA$ z+7Dz4&cE~6+z7RArO3Z6s$$&Edh(oL)Qi<&su-T?E~@#8V^NWWWhq(h;r4aJP!fVS zmnvJLjfhXEI3$ii7a?IuPMeBiJ^tdGmCN#|Ajxt`Azg2y69;^s;&C*>c-9h**tDvg z`N=Xqmw(WLiLHShnN|`P;<0)fm?YQe^#icCr3k4INuC=t5d((>Y{KYqQPLeqwoBDb zo3F>xK{x}33Sr8kI!Rdn(PBy(_N8~AtNN&*P2b9^?%BSxMmu@I+w)8RT00cfLu{$& z8;wzRM@?XIg~*quQ!MQVyM!Z;7&EGht2Zg?_l#{S)2&s+JGm8Iz`7~u&yQwK_89f6 z%lp6QkEpq)>oFxe-mrae{kSbV3=;OE-?(&sgb%>{lFr4gw}n4+J?8FnSfd-2f;X%H z$Jw7OD!^EN_ecVHV%Xv!WfN1=WR@*;HDcsMqGl}Oj>L{SEDC~GH=B)tQzm3g2^i*W0 zTU|bv|KuTbYj15Y&hBZAt+JC!w~CX=n3pnQ#Xul6u)>7ODziW96%OX+D01vjeA7d- z-(jJLfMpV3cXnoBy^9%L@yq+$F5Nm1JDGx=cf+qJOeuylA* z)UguQi^k$nc9%;zlZn_eiQyDUpB?Qw3%Z>-g>}S7bRPz00L>a+=a!%w^X^C)f5)v7 zn7xAJVf^|_($O1(oPpIWOO7X?#vrL-(BXT9iYy2xUzWGmzU_|fi;OrEO?oV6w#)N{ zMMQM{T9Vg=-5L*D{kDLNNma&+D*krjm3iO4Tcn-t$T45p`fvPAQ;%8-F@5oQDjMQj z$#3VMe`;A&Tuy)CN!WAj$IgfG2l{tKtpEiK;Ge0!a2 z#qg}Tn30+ko27E|jt{ZO1_Z)>W9qI^Ygj_2wVKaJeuP?9P>%6*cZzGO4_q_}zT**m>qrayXhsy=Vb zr?*nW=R#UlgY~S0YQ)%U4V&+!A-t}T!O!+0Sm;fht)IP5B`6gHtu1tSHMJ;6(I7Zq zHTr-&DY$oM2{yZFIR9gP#o?#=QB(2oh{+;VNP9~GXBem7cRNTRYeg*w1=8a=-~`tO z=94qJ)B*z-CJvtaIrWYU)3&{D3-m0NS{kH2Y+;a0cP z*q!wpfAktPU&+804-*(ts&|jNCkL{dMy!JV<7vaAZ((B$ zCpiS+)?prRUUNQJNe`1z+c{XEwK7A=0}}p4BOAof?sAc#@6l@g1#%2kzso8^xY?+W z#L1R5wz4>;WVM#_B4FnM1jR|gO*Roblq|5_-`4G$GaaGnco{NVGxsD! z+yLd2s-U;vrO6e6fu7urgN)j48ur&~w-Ev}>Vz=q7w;@A!(5+y!*U)41n~8P#tc&-Y>w3sqUkFcA%x*1h z{X@mnCkpn?Dk8o(;)EX})!W8}&ZVp7l$tORrbpSkX;jV*X<)n0!dj(LNw$1gT}rCg z9#hTi0?0uroJ`c6L(Y@`QG2NE*3*u9tc1c3iz6qnAkA7(uCuT4@IW8GnA8uV0Stx7 z5^YS=Q&N5Eow4Pg-6tv1ysTex05A7~MY40o+{-sHK#rIPi9bK@R#N@xUotL`Me!d< z+KUOkZ>B@-B6jg^8kwCe1ru0Fo3E3E0cE&e%kTA zd{exi4RI7M7FtGoqxL>{2e>9ctY-7#;~Zh0q8BYOk}F)m!4SctB5KCDYL+KU?}#bv zasx8I^-Ch$AYe4%_C}SH-{Wr_a%H?nSKA5Ah8ulw0R4j2DGsi&zSqE7Ct)0y!v1;g_Xf7yt&G5^7AbA9)u-4W*NKj?QA- zQ1#DK5S^4r(u{NbUYlg(YY@sxG}D8cf+9!UpV|e{-iJ%-;~vi)#Ku;k3s$rXknme| z&`Sz7zV3KV%uJa@Q#T5631{bSFyKd!8V^iffmpcv-WqXgTw5C|>T0^{y%j0HrWk;@ z$iBRBA1~o+)Qv{3kDT-gH#LYWXlvE)X?J)RDuJcA%9KY!qZ%)qLU0=e&g2^FJI;crDdpjl#`zA65C zE10{QDTB@{{Y^Zu^NPsEsq9X(p;fMktHK7*B7YeN&T~BkYdauRNBiuuipfHjqrh%3 z`#au_qrW7%XZ4NgBgd?W%`17USw-{QnuQNoxg$-NhHIBS{*e9UhFbjLa#bk8UP$%ZSGXg)#%{swFfl3xHx|j5YNlO~A z$UPj0tA86KjP^Y9bj4KCpc5v>ebsY7wX+&TZ0PZqaHzVB;`!wbLOc$2#l7~#yR=+y z)nTdpsOgG(-IY;KE8WWJL!;utDGrqzmxC$x;BHSENq4|@;y+Dz(OQQqxszCWZ^YG( zF$H@VJ<&8hF`NYwcBwx_O5l%91}lo4DBsm8wV*p_yEDAvFx*wg%lg4)mXoyFzSp!0b$an?uXR04)DG zDGCL*CE9A3Tc6M2tggj14-`zt~rv1K!Q(wWLP9po`?v8@Nlu9gcd$ zl38zms;B@3((-v+W0)1Pt<@bsC_jV2_CICV5zdE;rJU%LM6X`3UrH^# zv+C0X#$8$wwcqqSkZd?=mi$)9fFBVaG2leK#*0kb!TB-3YPdg=nj+8&w}-2xwC*hN zAeK!H!1J&TNMVx&#?Xx1n2NVy!+kP%vueE0@wZ6Df7MbzH3_c?y?)p|>$kUv{b^{9 z^jo{%>Ny8bMKPXqOtH*BIQvv!Vt5PDzG*RCy(SY>$#uXAA%mPbX`@I^JjWA)%n*7;}=V1td70zX@T7a)QPK=i2($ zx9RzKkaI;C#CbKEDv=T?2%ltLVBZ-&KiI;yyok?c%>-^^&S1Zq9~GR~1uUA9zoQ+x z50F?E1_C{|xSeX{c%B8|jz?*^B}@%{k~4AZDlHq_IwMTV!`}BrPCnu$NKZU0b$yyA z9S4t=S)6*(&Q0#@ef~YoF2$rgSm!5@&Lg_;%~Gf|d<92w31#o4fe)5)UR~(-9iT$; zs=;=isBg=m5K!P$1}2&F^Zt{GY%BFIr~~^b>G9$6)m@n_TWAJ3gx@yHtoI|WGQv%5 z!UA7%Xr~+!tsurTjOlM&RMN>HG(HwUpAF7StPN+;MhIq)R5rbTOlclxhKaH2d$jvR zwEc=7b^M;wHp^nMinQhYZs34BN&Wh|Ki9F0k0^W~M?67f~_`4tTFsZMQZ$jqh4GJ!o>{?dNeBxyg{ zwoSy`f$@e`oa>H>P9ALbg?;2QzcQ@jSNnT=_PAn+#n|$5by9h>6%6g(D2${&S!q@m z$G^2P!Z+rn;z@cZZ3T`FxgwGlvy6LoHp{BHC}Tvqy2_Vb*A7k%7e&t~&AW`HR4VFYHyFq`6#wJgS^ z82^pG-p01Q-$L9qpPaxBmX)LgoeC2WJFU>r$YW&44k&E7|D}|O#;Ri-AJL! zco2Cq5i%#+#v3s(S)Vw6uK9^YYXZu{C2JyTeXIU+h)kdva&cm~2m9C(7*-)U!ohym zmB(`Z%=u^~skQ&gVK8^D$Veeetwjv32%7PbgZ`oPcuM)|!d7^`drWVair$n2cZ6?e ze4yMgm+@03qn>s8&`v8P*^hafL=2)3;+hR2N)Qb?Tx+$aJa`66-{cLUS2!`DuE}C= z45aht%j(%n$$R(VC4P4=z%hXLlLxnT5;pd8{X3s`f|x3YPh3 zK@;D~ZU5P(v)377l3rXDu6XdQf3m!u$8EFc@}vilC|JTbWh1MGsT~I{hkSlOxA0Xc zP0;vwBs+w_IOY^5?ol(Yh&%@PxpmPF6Nrpfd#I}((PQE9yf@MnL zmmDJ1HF^{CiF3#3P7h1KLwKfsr+r^Kl zmukP>5g_H~_z82X{PU_=+Sk_u$<6r(nDv^xH@F5wx+yn#K7DP_;kZsr(_nILO&sUj zWStx9v~$X(ySG`J!V2e7vZe_E009Fp;yLumF|FiP?RzxAE-frZcgobeVVeMf24_?( z^iSwljK6-6tUO%m2QZ0*#5NkzcyYch{U3Dhht!faXB69Lu0h^tH2_y0R zBWDsoGlgLL)~drT*w?-=61>5Rw$_T0H(~2WFDcj(c%;s2%dnLuwr4LL+^1XLvozxd z;l*wW?WE|SYwlk75S?Qv~mu)1vYN;4&@cRzA< zp~ZMc9QQ+c^$U)DpE*j@andiEOAH$CSERypz98FA)mTF4Dx<^p4mrr1xckEK-^8M- zIG_JjxoWPQNJ}y*$On|gN9_Zq1*5_eHJjM+AZZxN)A^Ud2WB!?F#iv#eNE7PnIv_c zuF)pBp}tga+eE)W)Jkc=yL-HoQp<$~!#ir&JHfh%gj`&#nIwbdKXqSrA-bJDE;3tdGPn|0!v{2x*2@Rl_32`|J=F3;0^g=G)#J!+B z+OuYzwRBW^qL*ze&hIB)vAU_B?bbhRxh>Fd_-KCkvDWj*vJ^R-1sKjvNqf238Zeym zp}=#i3to%8ort&N<_M;~ccIMeWH!Q2!dWZEYfU}?Z($U!l&jIV*ZT6jgK9f^eo?mac({&*VDvR$-f7OXLl0bNe_5 zND>1(U)24PnXl9x$FBV{t?LA@I~)PXZbJx$6a47wBJSpR>us6jg(sng&>y~fdIgs( zX9N$nd%CTRrS-cL-RJfjQ>=BhTFRC;N$)Ou9XUAS3uElY5(>}VAS`}>#^k3m)o{fp zXCHcUfoH*2qvxei%1__zCg`cv! zXw~`OT6|_rc@B$mT`$~Yi^HCnS1-(s6u66+4|_L-yoLn@kzfD%mI(Y%%VEjtC5;r8 zVIgqnv+bjMF3#`7)@WoTivk~$E+-b&Qk~LGZc|sr*E;q>Ub*W%J-lxPw-x_2jBQxC zg5dMmzN>=jMW~Xo&JDHK9tF(9#LXz_CTB`Vt%8$Vi~_Go*&NzTkI^}Uq4tM zE*Y#UF)MMt)VrzYV*8l0+LsfSP_Ms)+a>f-n7@ix6TTVm%Gh{3udTuxs5<`<*&B3A z&zy6)f@}ar%xtHUw&eJo!pgh&I#C~TO2J((?GLF-OfXdiR8ex;aC9U}IQ69V1p&o} zwzXLL*}@Y0s3nc*p&T9l6+^Jicmlr#cdrKF2WebjTDN+UWsk7YVRkQ8ZMTk=TYM+y z)PT@qICHk-R^fOzrM#=TOR7VjBv~QC+VV6@H(L0lH9l;=W&R2{Bv2GHC9bqMm(*ze zREeD2-bI545rrXkC1Rqqo=z!mEr+@Ioz#XryC@8XyCRe9;Mk+#v7I643k|!eR^I+B z%$6&2fA59*-reNByZPd{ScIESp?Zv{W2TI(bo)r}Fz=BuD(b*;k`z~G3m!5as$-EGwWPN9g|A(=<_U^C zi53j!`NKjk$JbFyF$re=`sd`doK6mjNxbj-IJtU!t$7A%T(^4TQHABW@ObWB=O$~c z6nR~BI9c{`4}#GWQlR{zPL|!1S&{?%xdy3 z42J;lLq5j&V=)~#cc8WdhRXd~jJ-%XFUh2zTq=daQzCECH*#Ff?l>!hM~>qXaLVG~ z0lK9!q+CFMc`UDB0BBY?#BcGF+uGp!*CR(0EmNsdgN5k6j=1pcoyiH0WGJJEZI##) zbBi9qc3ysTudQ_XD$zQZgddpuxcNg^;h7(X=DznTGNyUgzr>?Q=JZb=I%fQutKXmH2vD4(-(ru zRiVFpuO4Svhj&^-Q|f1ji8^3o81_3Te7dpt&;ijW39!O<7a~3KM0sIq%S&cqS&8x)J8ovmBe~qp{GRx-?k{*O z%Pe`8c|Jp>vQ9l`?m&lr2$kD)dc4DlTSZ-^bxi?-Q~nJZ@wik?CRQYDi9bKIKiUgS zV3<%L5RA+c66%HE?ngi7ExBb4QkO-MFg|oW=}-zVMavFcII~`NT-5G*uXp z>KkF}E2}hf=<%trz5Js+u*Y&M+)$|e7L+jkh6AejQ$7+FA_;GR$8LYX07E|1o_N%D z6qB9!O<9`y2FXg|sRQ#A;6(F8P@Y@$5Fc^rEFJd`fRVE=dH9Lgl!~9G*ECe4MfM^d z0WYDZleN(!X1O(3D{m??LL~iFAS-WK8)<-;Obmn--dp7I`_FwoL20gV(2y3rIi`B> zvejXxK9vqvpQ6@vX|z=Bd1+0)TJV^I(MY9Z=3Vdz^$fTqw6$bSvOaO= z%mn`YH7|c>%j7kq&SRaz?&mYQBG&xxc||uL42#){Yh5pnakg7DCxHjU^V$uAlXJbo zhpdvFg|%FNz3@|~ttwC+D_;#oo|?p?e|9a}Y`*L;4;Dg{Uu+ZI+I-pm{wt+L&-OjN z_At&0@3Tu$*-M>x9vY7Qd{f%w zzfZobwR?0>^bWL9acfmJgZEROPdyQKnd?q70#AS>P+vWtw(rm-xf=+qkY5GBdz0OV zK=v9SSe6-cBwnZdvunPUecP@2*k#DE|3h+;a5UjnkfnNd{*?}60nS;ticUrF>!qn$ zS>eFkFJFAk7Y}_vr?8PitS!&#bJv|2H$A_n49nU)tEM$J^=%$I)lL+Q%Z*O60f*^x`HX7ipd^lLE)7d&XXVZ2->y!h$!<^L zDi&ktvD>`pam)+Ju@SRn=Zb0VtTGeLMyu_U%+u}RGe*~`Z-JnS=!qQ6YOn76oited z-i+TlC5;rKoM@1df4?Th^EfoJlyl3qcln#49b*WC2l)nQ#B%BqS3C>+#YTf?0`_-? z?IEc?d|A(bxc%2M!FI>|{7#?!+%CEtn0e;Z_Rb0XWZWjz9ekjt-mGBOqEdGMpdfqM zBqx7-XqXxPG5gR}Cw&owvQB}r>>&TUw0xp-n`gOms@YZ98n&LbuSmIbbOdtH!T_th zY=2~#{l&SWVmZ&!^}zM9aMEdKJcIpmq`^|Wm};RwZi31B2T*ybzWqO3}8VtKXWAOL;B;R#Kdwc7N3Y?WYh*{eziT950&X8E!$5>za zQ+(OSg8p0iGG{2A?V`)Mf%4RZrt-tLpn;*$tXoCxSJ_`yIy!Z}i9dFB8Q6!nkwq%v z$9RVwF=q&TxPzi4$y_22I;0^gwu0%6_VigZxLcT1rbzo| zG47uly#XKc3fR3hy-t78^dp#JrtOB;4?(jp94y<8$a&XKm;(MZCLJveI>yArcDfj9 z%4+b^upHBO&sX3zWYw9&tFHD&vn9c4cu`m52{D3_GNqZ0uUxk6u5kH?y^$=X`9Kwc ztI)2#^X{+%GP%4k_M?6L;tJ8^L?6b%({8E!#2f)jV(7dwOF6W29J+Z)6sNAkzS2`)lsUU+FLA{r?&&F-vHRa$YW5HXm#$AAMZjxtdhIw3@bj0tx3uvk=T| zDt6{;hIdZpOueIQotFpy4`J^C)l~MbjsHeQPytaHrG%m~f=UZ5bTY~aI--n?-a;UN zB(y;2paMaKfQUfoA_^*)ho zt2#Tg^Cc>qYBA+=7pvZ3L@q9tgF+vuOX1Sm6k{bUU`)+bB^sGu36Du6Ug1$+ zx@`_qicKYV!G}D8pAbM%pa9FF>$#Rr6=|B)7~yMgfpFAz?Ca6H#r}xdhM6nLiM%i?Hl{FmJ{_?6J47 zYoCRE@Ssopb(}s)NH+zC=vBz1Wf{K?H1WSQ2cz^C#B><=y93>NQ?$2G=i1PaN;L5J z;ya~y>D?StT-vrNs34%qxpM$(d~X-zyB4YH^!JZNNB<7)og_s<@+a)6@9-tsl5 zkBJ}L%oi}6e8mI?76CAoU^)J}OEGZaNnyzy1Xw>SfnG0em0vwYX+_AE+^)&a1=p(T z&nBnq7&;3sfn^hBmK!B=wRlTr--5>eNWN<#&ET62Lk*=w-yPILYvGa+?e>-^8|7ZB z=aucB9LY04+BaF8L_9ZeY;UPPtar+OpueS8QEIOKs||To25{(FsQxeabuPqrg_AVU z)D{F1{Gj2o*=E%;vrO(0`&|2h;9C>IxEfij_ni-Mv57EShL=60tCIRUZ_o#&NcY)T zft$^mu$e^XnG#=MwuSze{qa}ka{H}o0gU(Phw!=ULezDK zY@BK|&94J_yqHNoekG(d#8KH?(_|!TAC(EjsE6t=lc{a}cD7^G5`ia2o#92+C}+(g zpl=*~B}_KfE8%gE^F-0!px1LwrIKPtsBT@=k&OGPhU{Z09~e6Oezod zX*=h^F>1GQ`OjZ#ba3HBJj@OnTp(_#TikVD_b%V8ofjL#2RqpP<2AJuyHSrkie?Wi zm)A~DNm6N{ap?LyEabN*8@3%&hOo#zMf!GUW&6b$=AabwV@|%XQlb;w$f{qQWSK*? zyG@UQG>f6tDn@a8BqySr^#5*A^&p@aZZ8q2nJ;PyFNP09&!<htHznl3c2=(jHH|IcK`tU{E!{By* z^W4C%=Wt>JrLQwMFip)Pj#eQsh6(@G$|8=fatJgqa0z&71UeACsam4PeSiX2(E&Oc|IQdOX#S=AWZiSSCDbXwGp|g<14wA-#pt zTG8#f=qq|acb+K@UP4SVbyS=bCm)_~cng&;G|-tfN40A3OgtReJ21-@Q@%OsPXUsXW=W?&QWgYawtm7qz3q*HlUH2*aOiLug;zq= zn)xjx*V0as#Jk7w$a&D0om`q)XXXn&K5I=Xd6UZ-F5MG_HZ`zV^P9g+;ow!SiF2^D zck3v}b+_48U2d}jW&UaAfwZ4>Ca;a$0drW!g`YyU-$ckAFgM*45~K$1tQ|!*M_!66 z5&djKPA$53;8aU~j}%t9Y>=e<;lE=2GM5rRJ!H}SGQdCPBK*a&8Rjg0gVkVX)iv}- zd@K4QYdO8cIuU2bv^_&Ay8!8@J>c|9cWzPnVRrT4H{L&gM#kg>Ak-2%F!iri)(5P^ z8R@|~LEf+PfO`ah=K+OM#)U(7E+Q_1aO!t+6(TJ@7DE#MtdlXPm&4%0X!J$_!-NMQ z?RsizyCK<@Ch)yE~g{BxS?#+0OG+R-eh)c-2Ny%Ru+WA zy;-?3bC*NFo}Cc(kgdpiF_(-|tSX|GhFcv6DlblTMg{xGx`R78NXu{jo16SiCS(UC zS#FFc#RO(2#c147O^&L(!-?%BVZ)P0$NV}Z_(&VYk5d_5PWrIOL@JSruQOwP=y`zW zH7*%H29xJjg9bPmTS$W~Dd(z)4ZIgZqbK#Y1Cp!1n2JJ^fO9!^=D@if3>Sa4K~?1o zwAy;r9Ki&|*PwgBGRJ5dTL#1)=7$XVcJ3g_8%6QF1BI(~ru1i)_Jb;)b+(KjJb2)2 zO?9ez_`aSePzVSHA_D>SZ9(PiNBCbeFQBw$4tgHwLYkle5LGfpELkGHQS9#a0NgT5 z(STnE&)#E&A1I*$QC)4s_r_;MyFh@C=Rj>!hQT2U(5a(iK`hMf`89A|V6m39Sk80M z=D92Q4KS_?=9hne4)yr)c^Qy-H2Q)E;k^c^DoB$7mID#_LYDHt=0+IRiDykIW}Qzu zczyYDir1T(i|$p8a&Nq^oY!%NB%5l|8u3J`X)v`!s_G1EODBRhbc<@+Y)2k{o|9YL zR)97EqF0y*@D7>eYdoL4N{ba^6X(*hyAtXxG`r;;Pb(i;6MX%CxL(bkT99XPA~fln zm}!aQoye1C#m{8&oPzub17q4g;@hi{_nNu>6KJ|vw9RCMgHiGp-%18}?J@@utsDoR zkl1bO!1V`2Mf*R9I)Q!xzxi&1(RSO4WXnffebhuH3ebKo<`T3KZ8HrIPY2{k-^7HK z9sg9@`WEuH5O0fug=f#TJ8PC8_eC%}RQakFE1lne{CJEHzUu}k#N``iveU)by9{`^ zEP3#Jz}9&9N*YAN({a$HYM}w>BMaRIdMQx5&nHH(0AmvdsTVJ5gD)=#FfJy=?6ldq zXy9hMofjA9Ec})If3$~GgqbfLOr|=4n#t)v!6xXURgDS?vpCymseWETl`~))&LMu`1fe#JRWb-1vFF&F-vv(K>`1{)5#IZb(-%i z{;95*ZF(@<*9VXoW*#xPCClb$^LQ}{KANi`D)_rWnwI*gb*iTK@o*83>%Tk&Jf2?D zL#58u1sb?{!P}Y(B^OVz)@Jw*)ekEV*Xb54;V|B<91F%{0fw3kb8`soTL|o9wv*~TG0yM(y?!fHBM$ZD3Y(RxKaNLut z`76*ESBw>s;J(M5chx{4Xm?9c-~@8H%X4(-Jl+Q=Ufb@D4~6+W+4>I7P-Ht`lR2&$ zu6;8xc&ZwBrxkJ73l`zrl;WgJi?XC*?{GFc#Os-8c~`kqMK~bRJ#rO!?jN|wIE3ri zn<%a`e1dF=wqV7R;Y4#mgw|^x#}ymf;eGz+m!`mk@c82m0ATpE+U1KI5U zouLh98c|A?*gd=$nm1jA;)Z=93U#T%Z9=` z_sC-(+yJR)b1>BgS^$*zz+il`&4G%yJ`iR9C3+a?km9bVO!R$Sve#ORy-N#KoCg9=>% z5C3rx!33ow2vdJ{-Q{ou9D=+pB3OfJ1~g%&_b;|fLKx4KEzm#wfPf+;aR9h*T)k3f z**~*$JzNDQ@okXOxscxv!xfJohYjOxD0p*0)uN44^jC3Sg>xrKL`->Qhk3`)Eg;6= zdB$f@1F(8}>fj4IqA`(bkLI}ZWXPqJ)9uA#uRyZ?^k}zu;|Wjq$EJ}k=k$Ifow#=b z2^f2vetQVzH$LHCSnHq>o7>>`T;k^pkzsSkU|UbatK(vCBmF;DbzWa8s|Jj^I-40| z5wB)~_(O;4NwYEfVn?&?Oq9hKsOo2y-%OB0WD;P{H_x&MzSW0hx>EzMHB4qk>j>ld z#Kk(Mv(tk#f{-&ia|O|Q>tMO~W2xoQ=1Tu~H~yc+_|ChWqT02UU-8+pL9G;immF_y zg-~5?Gt>Vh|D^DFIP%QTrYQ5Qb0bTeoX@ZhcPQ+xVF!`kY1u^69qK z;Xc#L=jvq3h82as9J!|WIxvv6aBOd9Jz^4s0EEXpQyzJa>(5bdoUf_!8(aBKI!b~p zr?>Rl)Q57P#mbFq9Q3@Ra|=%5&XBblgEP!dSmZ)$r|Wz~BFvr*_uYn+?ny)xViS(m^}=aJG729SAnig6nc6VSW2UDP5Lanw2z3tyGJ z(92P;j2gtzF%yA$S*r)CqzNh`CptCea^2Q?^us3;taX}K%SLeK8)$Ui0j5#GqvZ*W zIO(Zncj7UzZTNS)6K=?}TRvOmgA^N-Si1y|@1t{q+_8LYizuGh^)vF(q_yA7yTNyy``hRRK1q;? z%i2NZM{V?^0ayk;dK`GSt^#jU#v3U|ecWwL^QystL*X@OKX1rb6JB8u2u(#KKB6?M z7On82eR-yE{kVSexG-$V74{SZ!Vu?&(lobg&bmD|8yog>axJC0OITSjcaUnauVvav z{~6Rqcs+GE6`SLwl5AWu9G=QUD=sq8_FQI9C#xfP!s`@nT#Y!0nXJy8k#b>-K56{! z`K(@RQR=%78xf0p&>DCxU~v=jL+nDlgZXpXVZ_Q=IVsj)$#2xVQwz40AGE-fUQiVs{7AQyrGVefgc`*C-%REqSNDL9{15vJW!aDSS~D%!)$RmKkTu|3Zw-bq>SKxm5)N7Y=0KtlaI}# zCaWEY({H8kZ>J9uF1W7RoK1#3qjdz_d=~A9TN>348r%nI?Q=u!g z$MuZJwS)xl21Ggdqyf3Tt2GRLDumW<(n$vt!+&LM=AUdNowtFc&NIu;FAZ8-6k4xl z<#0F8Fm^%t27pSN^E4&g70N2`#nvgotrrqP4}=#s4nfg_g>FDPp>a{coRz%)SA)y_ zgPO;|WAjW^8XdB6^@Fp$R*NE9)GyPi1n^)ivAl_hMjLRD8Heq1%hnXB_BC z(yb*VWiTz*a^99AiW$WL9(Px6S7TUhZQejV{=q02y=4r^w`BsNY-SM1+YUBWjn+Wh zl)OF!oFq|<2KR5}oiJJ8aY2w8DtWEPd@pV*tL~rV?QiDgvmxpQr}L~zf#MQ))g!~{ zd^@F@n;&q_E*{S}{@q@HiJb*jB^D4j1c=em4|0iT4q&^_jaZE z&q3aF=>G#N4%SSO$TaJjy%17yGPl!0C;hhxK}}bE$c)&;5oeBY`tph7s1f9#n)o*T zFS}D7&g)&O_=HzywTzI;h$7EV!D^qCCJ2jflP333l&u(e@;-o9{GA`JNCfxejSA-; zprF`=ZWe6xH4r0~VPO6x2|r-T`@f&)W3SC<&d6ly=7L)<#^1ZV$T)jLb$zsKj}W-w z5=>cOd6w5M)h^^$A=5VoMk~DgO1&vHL)L*^Rtp8y-b)+CV`auwIg4YYkx9PAKK66A z|9wjxn=YKT*ia4lrzKM_T4q&Q)mqUAeccBXSrT-Pd%Fg=^84TS3ic?&CGZsc8rF|| ztkmZ92DaqLaH(aP!#9_O%Hss|nAh~;f_%`KMYBFHBDM@C08e0af-7Brp`_A^QFD~Q z9GBF(2@M9Hl{4YE6kQ#QRY%F2L!OQxO=wqu0J=$XeRV2tSrJ12&~eCEW3y`Ex@}c4 zkhK?vxh4ux|E2Q=x&OcC4ovZ>Qf;ypaaxIqCK~y10N7;P^m@{k1(NH88K3ZW!}%D- zV;&1dch$mT0tS*iJ{0V8XYyLE;@lI07wDCi$2m$3d=^LwFT*S%joU_-4U$#cJMs8PD5tf`LKxv~{JJ}ZwiMB)ymN+Pj+xCWEmA=W#kjTr8=xt+; zIQ|Z6v>Am5buSHPf9xOraepigBhhX~Mz-%*l2?lJ6(R+vik9pl9x0k8HDsli9X0QG zk%b86Lpyo;vMVmi_`-DIB>VS%HO6SXWlxp@3;C@FRL;{q^2$*M>6L5#g`M=dw)Iks zKK8#j_9+J*`EP%66;FN$t+MjWJ39etqB+OBh*4Z63tn z6;zV6N$Rf3nyt_%p-%GXolf9WtBfqS)`o(u6Y^Ewe6aX_@?Buh1-$7Mg@ApMQ#Z}8Of8u z5fHsa&ODl&#R+AFGlTKyfIv-GJ9%Ro*>=NYMk^oH&Tfj&D42r}dZLYCqE#)gE!{C_ zEAV`?NGNtM)!<)$cM;^Pe<7)VJL7Ii-l_LOw0LK|fe2Ae+^*^Y)CoNB46$h*f8MJM zX*L=qKdYC#?`$rIi$yTobv7I*bu=gn6jDH;0B;IF@`%V0M@9MuX;Bd!#2ZU%Yu)WI zKq0B1FxlCirI3V#cMz+)+n9+Ro%0fpn<+r?a%mugQEmBAF2EyC1*R51dD9cA-fo6U zpC4;RmI=aclfA$Twm*2@DN*$GM9(gOwHJtbXf`aoOx?L-=ys+dgZal;K&Q+=#b>LV+LUDgTFW%eTmQTXE6 zg`z;n*qESF0%kf;E+MfU)~F^wCrrV63N%za4V0%B)`)U5oNo=q-rDc$ytP}NUUtbK zFuA$=T2)Il%N>)8R$tQ|pf=Ab6Kj?hwEoBEI{@S7DJq$B*BqIdD9_l6`va5E)9Rd> z`Nb}Z^Dho?m4aM(l(`N{0qcVP(|!_Y)HV;4oin9EARvG0z?gt)3|($6fhI@*8X%%W zYhthtuh!zEJf6&o&*&&TDK2(A#a^8P#Gozd-lFI^`>bM&lJM7=9UR)UzxbB7;!D$- zgt!4{0!GXdxqOF0tU>EW`SWWg6#4Tc8;-Rv%xg8)CfsDmnp_hF+CQ=V#o~4;dV?R3=t*HvZSk6b55NpyT%P-=XHupz`BNSCL?Ob~t)P zHor-x=0iTHuD5iTAlnV5z9^sq73i=76Qr12x?^S}#zK;d=QD%JVu6aTwi79aJOi>A zwh>H>l$aNwX)X!QDk)zH_;ei(Gt>DTT3dVN7q_A6L2sp!?ILGhP@U+NZO&hi6Ly?? zXWHF!9i~Sa8j!~*ZIq&W{fmMjEheJ`jiIgEIISXc9>``;f_n2Huu&7?duZAg0-h{4 z=TGbOrCO0!i)#}WDjVnRUGEv4Ath88xyUiVx7xHC3p=R4I*=t7?YDr)uZU{XZ1THmWzjSzNt7WE)xe1Azyzw=3b*ZO?AEq6(1j$k zAjcsQx2V{!(#*F{E6lY-i4^w1-?eZf!laR({KGdlxC`&|K>7N_L*~AM^o+D`n^FXEQSM zWK~n)qRzh!z*BEZO8#Zvc-Y1c3!JN&oxG~XvL-*#c}o{$ntusN~nclvUN_q zf%tHDI|9h@u@J!}_WwBBk_-R;DE%BA1%DA(91LD})|iwG^;ctZGUXl!z{#DnknZeaNRJQ(QW8RZ zH(yd&SyY{KE7nw$U_WsjW|dqa0-trTH?3=j{aWP@8YucDfqTx?0s+hF*idl_12`)S zZga_?;b`Z^((g%N@V*pmEez<`z#$LZZHZODrsWatsbI(y)#}&hLISeI_;W|Dk`5Zi zrtF`1OGa@UYj1j%&(pH6Mk7L+V4aJ)TwxGv;ggb`Nv03ajUk)AZjVo9!}%y;?2B5P z)6*Be7oLikdM2Ar5fc(kE5$8$wogz7xX;9yU011PZO}m$DTUaO=EKwEhxt);J_UpQ zP75}p@5jfJ3m9=`&;GP7c@RpO^?W{>~SrNC4C$_M*>ztNAJJ+dbPGCd+8Qmf~bmeN;UJ5 z+t4Ck1csQsxbdf&6N3#{XRk{~gY{qS zv6E}FBd?=lh#l3E44yld8o@{A9hK>xz!N(~n&|v220KviKwosQffvA z#V2Zt)IqOzqCdq$IkDNtYZ!}n`$~hWRA7Vjcr3q$QYJrYlDv?5mTu#3gs%V_eAZ^T zEsKCCOAwL$CZ|0i=yJ1f)X&msr?nJFy^CSGQg*GV&?sYu<1-!d(*LYvemp8 zC}OXNz~E$Q)u<5*AQe7uUn_!Fp7YaO7JL%u1F-=B2Ix_>UCh0f(ehy_?3S^J2zhJo zL=gc?8q*fV75K?juYXqtR-xPApcZ%YpHZHtU}zjqOw`Iz<>ifbu$~ze2VK7L&;OpJ zI03-HN25J9IvTr_*6^@kwe_c26PL&}vBy7*E?y!gyh7NBnGGcnkPnqC#i!;3%F@l7 z%hKg<4urhQUVmaBkQa;TjS5>qYh)z!`Q=swZYg$`#mFVd%^3`|x@J2jHh+o2g2QmE z;42C$t_{vWJ2(Skd}WSll`P$&G$}xmN|3Uzx~sRB7oZAp5Xz2AFE)3o5iz_$zK4XP zNhJo#HWOO$`$2o2BPCjORzX%Nu3oEN=Eu|*V{tR$e%5yr>Z@-FdY|K*khFy`%DG`j ztVjH_c&7AT%L-Gw%O-|;)-#>;Hx`C^W`#Sh%`!Mi&ex;rvl1xNKg#D#+AG^W*^%89 zT|q9=o=^2HTIgP z!h)ZS&d{R?1wSzF-}WKL+QsbLM9U?~1{?11d`QW57^l*JFz8ze?T;p-pe^I#_^%hc zrcM)^ONClXe`(U18x%DWQH z*_i#hP8}FJm_eCdev7;}-{ATFn^ zxy$cm3-%4~eo*rr#DJ#DQTke~&h9rV@?$i8Di1dqmJyLhTIn#x?-y1!O&S(yqOM7a|?#@4nrKEX}7+E^dm+CjiP6oO6d_eS?7aU6-^Ya?kVQn{E%MJ_NSw9wB zvAbIy9jv|ZxsWDn9F~_C1TV1`&?7MO(U7eZ=X*t0~_GR4tNhjW+#2EH&%c3(W3j*A4hc@Et-H?*vqYcoh4bEhON$f+1g zn@w31qD?mZRlI|y-RKZ5e^|wZ(XOK(eyJw;-*6mMj>Shwh1qNUjZzvowbMzDo2LwQSHT-M1I%MoWyH zz?uvg7w$w7+(Cv5mSqa>|g5aKC2cr9NZ|#`(LK ze^X#H#-hqNSHHHCa4@$4CVOv%(AFhb-g}Pgc`;4%8ZRfH=S1K;;XUXUh*DzDE3(DB z9Hl>c#D35t_*;sJuW}N`3PgTP^r~xc*|tJvBKFxJxmX57`nCeXMr64XdnJm{P&IE} zK<26TNC%KWZCiYwB2&-YHkU(b(>;0~-F9k6p*+nN=L9EUf6&+Sp>K-Ny^tYKsu_9Z zIH*Om<)B57>OtLI%|LQkO_kVgWHgZ(1lv!5S)t^xyya(LV)T;(Po3?VbMwNKg3{8* zp!4-fw_lGD&y;L1{8y1WR?hgOLmiK*_3oX)`LYm7e6ZjtoH?UnnJU3gdEgLmf^5D{ zTmG%93k+3u9VyUJRjF1)KP;bo*)!gzG|E>Hy>+>IWw!*n8s`Mty{rZI`9lqrU`#>P zeaK}>g0v|KjG|#2KB&D_{Ge9C5mP_R<9H@yyPSj4uU){4%nB0X4BWEX8oA&Q8mu<{ zdbuh;JIq0c4NYM;K3eX@Msb(bXq^vOoBZKc)i)lWfY+Z8xVM8BNaO8_+P+97!sU5< zHuK!Ju^|+V0jt%(_{C@8p`}u$c zKh8~o3t?En@Z2vG)w5oCR>{L(B^H?v%uyZE^2L6lB5WGjmrB{hZ(GarbkQ`V^_8kL zZkE?9Y<8?5DY=K46qKs9P(NvAQ|i{!_K}BPwcjhUDXvwiC*_0{p<276bVO5rc6cy( zZ$5AngV?3cWYCoi@%w5EPnVOq4UZZIuU#p(-RebbV-0y)c*>=!;l8$lyFIM&dhgLA zOSeVDcWSmDZcV&%xYk>~U*(Edu)cj%8zU~mY%Z5?m?H0|r+A^YviC*yOz1MI z{KGaS4Uce*0lw&sn*pNIpKNpxE$p7*y@#tQ%T3cxSuE@4X!{f!Z|XO22Js zZvtJ=+a(;j_sqHBjnf2W*U*Zai5cT=t`)DX+#fDa7c#Vh%qguTX;Tus(@&kby?36< z`c`4m<<4+D(QHk|5Lt^apjgL(mp3BMS!w7+TG5-o`gcC1fBH)BvQyV2tGj9o)g~%+ zYy^9?ULRG9)ULAJnjLp3(!p8;-M9=C;&WLaG1 za!N@HTSz@pUW;#pX$S1qWh@FtUxjV&>HkFVl<( zb1>EP6ECL1@haV;sGabN955fmF~y**jcGXeY{7u+RcGzM{7&L9y70Dh*vi?bPl;%|0<4zC! zoQ&wFh9OqBe8=AgT5%_{QEr3IBPS8_QrHH|fnZ_W7M(O+%E-cZ>7?g0JYUu7*k)va?C$I^e*+(;CRls@^Rg>!cl=U# zSmw^yX^<`p!KyR#w|+9MK?`6j?4apz9~(h+goVjm8}~%ze$dcK#3V2n3Gn@2Eq3N# zFHiJF@o0|XFoLRBKec6cZI29Fe?mnf?PympOtM;MF~aTl{i@8By)JSczqtQdgA{d% zqz2Zom-$w(ooKp`o7zkdYXVlAq$-8>o$EtT<|_3kc0d2*9ll=@xcg}8LP$$Nv7$V|nyUR7p)BdhuV`+gFCamY&4gRr`p)R^nUM=rL64gzTay9`y=ubm7@md2$&`jx@$j(T=CFbt>-!j<^fD_VyD@H@?n|Pa zH}{?mWSAtz(P4Fd@6An=ogZ$Y*tyX4{8)<52KF`!%B-MM2Ke>qILX0P2mO1$fT_s4 zI@@FlB{avIj|unHri!baM`?8h>|_XU&4EtM zvmHUzZTv~p^!Rgl@vDDV33JDnsFGVCnu(bJ_A*yssSK;EDQ28Icgpf67>cnu`GGFP3(jhowjN?)5hte@_{#9>WHq zcMM^!_KhWZ3HHkL-CP#WL6Jju1M!>VT;%~qtceNYa%_L)RWx2=Urcq#mW>te4qLOo zTb$n!K`(VOSoF&4Oe+$pqJYYYnN=*Z2vpB|gG-%?%l3g%d!QUP{}0Q^S6&h0Q^lBq z=J37lEenbKxQ?!&yAS19>s~|a^2r->av-QN;~Pq<2jg26<0AtOp_^kwF`OyZWH57N zdAW(`5wcAX$OPyx2ncMpNpls9MpbR4kTDb?<1c+$ov3u&&L;Zec4GFYMi+3aL= zt@ju#Zm%*CRO5RMMr9VK*={{fh(RfFP!Z!8_1D~8|AK8e#z_Aq=!d0Iil?L6e0^0z zsHsvz<$!l|Z=$=IBC*SVwrIJt(LIBrGSaZ0=7rwM5T&$P8b)wpqZypxlezPc{Qbgv ztZzq+=@qJ|b9tpEl(!v$WfV0$iM41^K{*t?! zLi%CpDZc1(W=8^rKXa7O%rw$2I0~`wcB0DY*nbNd9}q}66%;i3Y<%Ce#;9Vxdije$ zI-X-`jz7p_HYQ`tyr5}a?^dFq#-K(jYyFt(Z4ro3*<@$%Y!9(@uPUOe5UF0iL(Dr~ zR;{Ilve{oL#!^1TO8)^xh6=J#o2Je!enf|IV;Wu~3JGri{~ zkVs{unFL0Caqc!TdQq?C^?iPM_C*&Zw95gnSrDL-GBVS%+|Qg)4B0NKT?&mJ+g3#V zlJ5QOliOlY^tFjsa&mr_yH|;dE;wqajxPhmf~~eX*-Yek2csD;uV=_tk8e_J@WgZlXWwC#0%>c`J+om=s^A%2 z)PK|uvHQ+Ed^^4NB&u%hH{xceQeRe1+%=?6cj@?CYkFuwORXz&iO;h@f&DTHK&*R| zCtYL5xU&g-_gJaI9gd3l)<RiVjk+7 zna0N)6+hE4q8K8?;WhQcr0Xzp>}agN*hBiDBDHMBHpG_#-R{>#_OBT8r2yAWO?IP^ z5u;UIp@-8=wd;0eT>R(N7bvfE^jlbgVh4Ch)}kk-YS({PPG(eZm-n&4ptUVgeVjEhxl0Av0cVun zNm&#FQ3(4`7z(QS&v@evZ43RYIV`@OmoNOxO$m#NYC4gBM)h@4h7qF9epiJdM-=4Tr&A)oCjl?{9q)Gvt%8OqaKk{O2Z_2y_UTo>DoDRP)c{&_-7R|i!?HS4Me#wq2xX5dt*`RA9y2rq@m6$_ z)+MbC_UGj`f%LFmu_bZ#95s^yAJSlr^lAoZEVLIcdW}%5yhnvc6P0z)Zn~SxT~cBq zoj$gJGi|1&D2LFZ<0G}Z4o-2u(I%H(txzXK3u-`Am$+RJyzp+Eaw+zWd&i19Pu(02 zWiq<4@>+DFsY^?!zjPwtTdL|+hQEI}pQK@Ai^s|fDO+zbxF&0GaN%(CGT(P!c~SZb z7hWkX;9}Bnj`fJjTJR>XCVK|)jZ1=}$=?z_XDxUp$hW?==R|gp5~GXT+F<|kJg%if zfm>4(ezWblB9RdqG*Ep8kZflXPaEvFxe~TUZGuWbj)UFVU7mUWp(vSqM>orQvPp<) z$>*;au)CNrP8dgK(x|I_OwLB0$pcx!=n?j9Wkl;$NeN-nR_taL{>o;xIPby@qyv5> z-GDE1H077(s6?^FnvGH)s{##QN1~RC5j9PWIhp|MO6`#ZvGx1I%gXxh+HiR19?z~x=X-whXieTWKM&7k-~gl#A20Ucm-K}=SG_9L!XR#Ft%0uvFb-5QX_Z|ZKX^c z3-0f)QljqJn9O$`()9=O-i>HR#S+g^?3kaTa4WY?paeC5?7hB|;u<-dpR7j-SWGr- z#4QV`X|X2FZ%_%ORXr? zs^lMr^S|P#QHl1nm+1C*S$grW^p_XR&nST}f}p+xDqatI76raY994`u2CmM-%aEY_ z=BEzrG4J~iqGunhJFnL`xQu+cFOpOlg7j>Y!l-^@?K!)BWa!_WN@jU|`FRQwev~?J zhM1`F80${{b!PsCl;S-%Puzuqn?t~6Y-!XuqDDDBFn>qQ%w1Ey$qK*Wv~*2{DfUvi z~MEB?ZUg!Ya0BQH8hVA9V9en)uB74Lrz14oSstqF(}pzeRtOS zr3S&|j82zVz3(51!|~baKU7-T);_7l`-SuHUjx_dgNnt8XLN^Vx%Yh1v6F3+la`W` zN|jmV^Zl{GmaPu1he-7=nqou`PkC$`W$4FR3bzh_{BlNwwpl6#Eim`^DWP-!(cycB zw(Lg!_r_YU{s=)5KcS(5E{6?lHq?JEc0GjE7{?u>N=J$O)=9kWlY5g}M!Q5j(D+wG zUrdN&ty}ytDpEDCC!nE#ZyKNNM{X*he>KGZjGeoNb^q3&em@4cM3@ej@+)bYNKHaa zj&l$T?L~ztP0&k3Ej+l)*c>(3Fz@6b#GDKg4_!ShcPp)T$N8lHC1(M4raq3plRYpn1ba zhspcBGVe;lEVs&KAItA2=V_jt?F_bHeSpvAVIEA?)n21N)lmC-*HBguY+TF{Iyj7$ ztX5`B7yHPR74Iqco#_Mir_22wTmaQdbo-a+-McGtdgDUaru~e7Whi0}~j0Kcm64k>lEv8K` z$Lq-{9p*gjIHk^Rv96;`Hig_j+jnHDm&*-tmpdTXMq93P_KEZj$^(-cXdWSpU^8kL zMfuFAOVxaGlj-;IJuBK(ZsN=QqVSCW1;kUb{VRE_OmG#ZsMcrc_jcpu3v;`Nm;(Yp znnE`vA}6fQTI&Ka~d1#J(^aJ+ePd$obB2*`+zdyia(E}7;Z+IVN0 z`XIDct+dplOXqZ9ohh7u%*FEco#x1IY>y_j3S(c-fKjEX`)qc%3bE2Gi94dk^kxKCz;7#dh6&U8P6I?sKb#(=wtP~ zwM|0dIZ*!jX0TfOWm)oF!LiP_Ys}xlX??dN#Gbe_bnR(Z)R)nS0Le+M%coeE7VbZd zlH1&561KIvuB}!d3VbHcxHOPi5&v!pSq=Np`%3U`c1-)-pn`d>tfm)%h8FSeDzcod zT~~J4nwRz@Qn(p5FYYq-ema+wPngr)IgI-9Gb-d9_IuPBqWFz339K5~fsM|PqhRIe z?9*-4rKiNTtA37fNNE^)%T&WnLn0TvuOCKbeI6t)DjsVKdMx#Fg^g5frexd~l!QWf z@a8}96Dh|ZAEnMjm|uosd5&e3wtxIYwP>l}^rRR*jK6zs>+`#a^3{>e%j~;0Vs*Z< z%^1^YYt@{LlhtW2QaB%1EPVGJ^qW;no9*e(;hVJ4$+exAe}~C#+&1ywg^Dcp4&qc8}^w@|NIBz@mHB)B~Dvse33Ytr74oIr3HiX!SU=s-*oSbvjHlP69a`#?`_txEwL)9TaFsDv0>RE zPB3zwPR7YLOJ_MfZFTQFzAT&7M}*6l`7mW)ZpPFn9D}_mDl1U`fWG5F)>Bm)^0P?i zeQ)lTWM!zEXt?nUQCGfR6JBwcz0r5L!Ke{)93aCiVpn_z{IVw?8B*G5?1`>yUIBm!MThJd{_BPnMa#D3Diu_&t+8 zKQknfKkR3)gn`-6^-Ge- z)@Cx#sM6#$`RZ@&&1;;AgLMQK3@Xn1WdIlMNB-H~Oyr(v9m(*qP01E>5~K7t904Q{{#kIztCfAQ zQcHvOVUzC3!#Z;z;SA9aif%@ZXxwJt6CFWI)nNp^UkhV;`gqEJPnO(;8M5)7Inbsx zCCbnYb*Kbim~Nbhn(Y4CSa&@($$BsD&H}2LXqhOH+WVpN_M)eLMHF+Q$0lg^kOn&3 z&SHzPNv7~=0aKF4Q|`@&`p*kLuNakc;pXB+Y)#`~hBJG*2a%c}2<{tF>BXjyp~Hr~ z(u%zqbEAtZ2{LK{-0L@W%_cHTrR=pbv$-)#QB9UA1byM$SqZx&)d}`FyhCL4Jf~ZL znX4p+=OVo#kT7VuQaEVwd#s|M`cfqWINqIWsf|#(*6FjqJ|#H|bme^Gb&-UBB|N8f zYnU&J07holH2wDD{nv5kF6rb{b3spsvM+9f{K_Wpf(k11`Su@Op}UqVJWj7%BBOUj zJ=Y@@3Dp^E@j(8ia_N=so!CuF9Xt;~++|%KiLf=%3po&(o@7%~>k+B&;SbqRJhxW%k z9pLH}B2x(DsgkGKc$kCkXoG9T&iR+NX`!C(Go`xUO__Zh1tw{;_~2_e3AdVaT$F&g zt>3+ZKC|lGKD7%MvDR`pm$Xb{nWE73?t*3pwLS-#=H-T1%pcP9C~EHL{Puv`ln{}Q zjf=p;xN@E!GXXzd2Z^1{=TKrYXYyACLLE;f2IyeB%k9&&2pbPx=%@#c^#e36{56Mc z)8)wWu0ilM2D&U%=gtVg)O5Squ zq%9$HS@XrY1Ux%7Kd%Q?Qgt0BVlI!xpCN8C*^mWZR53R2X~v9RBjIhz~lXf9Q=R?UTAoT`vEu21X^ zFRhi(j>=!$U4-+~ldCv4#G5DZr%BR!^sh<>22}b3M?YCs1=&sfql~yCbLG z+3DG15R6gomNSAf1)E)i54$Y~@1}poE0giDR;SJaQ7}++*+C=7RzXawXYxF?nNz5; zVMO~iuQ>eSQ05hbocOL>N8y)vNyC7H;m}v|b!Z7!kL&3oEwdQl zu^}sA<~UUu(X2wjVu7weK0uQnz8m%`60zoB*dCKTo&Ublywx~d0iG-3cRSq=TN)sZ zclI&8R6@OF6XMey*SKfggwr)$`urr7v?c?zK|OJ6F^Q}D*2)zzj(f-};2N6uaP!te zIZ%0)=4iAux1`_QE9JSXl7p&4rjf_4(loDqC%4utFXwVj?{loGkJTA>N(S({{jo$@ ztItc=W%FTq|_)G%RRCT z|7YrV2Mx>C^!RnF&JBt>-RnNPyI%nxuyf0*OjvtZ#ZMig%cFn=5}N+m)H!SM^)$<* zrvK@?%zbd}XN+cf^Fmw}&3&vz+fb2^Jqd>@ZPc}mu3X<5%b~zw_ybkhX}EL(t+_6F ziltg62Tyx5pTuaPCcoc=s{B}W%O~56pB8Kis|=nb@sgl&g1#Mr>P3Q|(K4TE@RbsQ zFLBC-zdGdLJ^PXT=_7lSkb**P5pwb{5++~xgOCq&4m@?5g-$oV;q{3|>-y4t5@MMk z)+sLOXmYpM!@z0#Ji**diPth&_AbZ`jvx^pK0}m@I(;SeqCJnU=G>s|*W(Sz^mlT> zsUP4y?4>86e%4Bp6LejLeq>W`9>6FsH@;{#N=;V%iu|Qw4U}uq)>%PH%EB7*+HnsG zE{WNbTY(LXJr;^j1*ZAOwRvUum=fEpu2%N&ga*4Kbj$5HBFZf@P#`2yblD-R&|>#+ zs(f{4gupHEu%5Sqn%l-$QtgEMgL|&sR@CtjL|5-|8cK|H4P56>%{{ogf)69hroNBG z=ER5(w@;87FF}(zA!}n9Wqyk)?j2&hJc9dMUlnexqm@>1P375ked#kunZ64>h4#Dp z-EYnk2zeE*<)GqF=1AQWpu6qkoYEQMn=A(RO}!SOwL(%Y@0ynQW)Eu_B{im_=|XQx z{GM6xY=Q*IU}Ts9qW}}^=#v<7I|uBX`lVm9?a(e31eqLUpl$)-Y%JH&B@;#&a3wC)`Y}-3h>G!R_~ut7k%X)*zhfS zKVsy?yB7P`mF2W?Ae7MN?sX$E#-7pkh0x}pq~uC5`0#L&nVM2@jBhLa1?0wS5CWd zt;DF+?Qq=Dt4a8<7cD*+*W@_=-}Eds%!ysampT+Ua|OAq}{BZzS+wX!q*?_H$rt&*?QC zx4UBy%Z5w>^0$z!;p6$EMg!=f(PG;xiP(;dhAR;m7YDEQ0dsmFWbHH6{BhMRv1c@n z(_6_mQ}VI1WwVGXsmd1n0pVz2C#_2;NQRb>o!R}~DG2=RTF^sU56X9(vEoLL9H-8y zs0l2J=Am?;$!ek;T<@48ygzCwdVRs3=7^UjV>JY; z603j%3Mv?7UuZy1E&Wm_dvWdzo!x+|Ea>BQzIw8YzlfU816ENAr2djJx~Vaip9Mif z;n3pRIXcO~OUNz>ZV=Qp?S!(~40^-7q$|sZ`b11)*C3wmr?Fj@0p^Uv&Z`0gG zCxzY=;8dNiG`}lrPTmU;SCn?X*CG=A)5_P!MC27|iZdMx?=?`X#2Zm=4`S7P))z$8 ztxfw+ih8*=?5vOc@)k%_je+;YhUK}u;`a=b3B1jIw#)G4>=i__B6S_hl;1|V0js8o z9fOc&();e`XA(34!JLwavTeMtHD@e@Hh@f!(Y-jXW15|gfmSSD64|{ zlm``ax#^t!t9wg~wh0B*RLnAjLEL%n950Je-JoKWwBZFz)l8Ub@8QB0&jrYjP?3?d z>pMTSX1NEHeQS=t(7pSR{;%eBo`^JMcqG!`>AEr>RAU|q?PA%W! zS%JtT)+eh;t?3CemQk9-^jO+B6(*R0Nig_#FXadn;(cx*?*}B+AlK%tbPXl&DB(H8M68; z`9{-(eZ!sjU6;{$Lxv)GU{h)5xGTT0KuF$l`0oo9U<&wIGumN^L>G((4lsBCVg>i6 zWuL$IKcgm3NuTaEuIXPbv&;YZw9625`aNJzXuu|R(;gotBtsXq%@|7-d)GN;Hezz! zyR9hfJ(#|+9c#*BFjNWq8!r^SOR!tVi7Hw1zALs=Y@N%Kj&Y_r!g@5;!*R7#5| zS;HP}tT%(nr(siLdWsa_%hyy+cT~)h5)SiNcnf(fM9MmN=7rjU8Twr|rr@GitS$@8 z(G!`oSJ`W2EINnKEJrQ!6wH)i$Tps04s5>A}G)|K@8Ki|&zuU188KRHpfJFfEteReX+lAFt?semC@J-;-2 zE!~;h++$ESjWJ?b4E$O7#k?XOn1)r} z^+q0weVImreE0p%(;CxM0LLw`q_lIft|@1__V%5}$Td6!!r_*MNO>1elVFGO3Fq%J zf*u#W26b0G-&vX}%8Ld)p3tVZQ=N>M+O9_JKXFiH15_hsq;`~P?~nFRRGdF=lSw=&-L!B_UrpsR2W0}3$2)Bxu3Q$CnF=Q zf`j7`N6_X4#g(&~{pGRXx#Kw*aE5C$zdO{*nMJO%R z;|Ygy)0;UgkuoOnEIiSR*f-sGpN@J_MXP8dFs5Ju1MFR;xmL3Gxp>w}w)+u~;?d=$ z7&*6_$&{Dpa&OIOYhqy^x8LwYNgo9D>ifm{EH6l{V-qU{H;j_p_TAmHa|3FPB=YL^ z=jwx;=>Fos?BCS*Di8$JW0!QZ zfAz)0O_owYvo*!=rIr$l!_PDNFKQt>3PF29uhzzqW~AF>S)T|l zFeNkkD=k+L2Z-DLsX}RI?r1?biOM!T7ca;ghj$&c<9s6i#SX5)GR{(1h&6{s*QLBXWChvRF0{(L*M8!?=hvHZHlRS1o#uMp)P zmOEN-lFnd63?e`K=RLq-4-~RUU2kz+tvqhn%NWSR?5v}r3jk=)MgQ?9H*ee3Z#K)U zI~Ip?EleLpM6WRx@yOQr-ltgVK1^8j#a;sFGbSkMPIcRw%}p0$!W(R$21!V3&uHZh zo-Gm#o=s6qYj;rL1i+VXN;}<)>l8im6lD>fq0x9R>#NHPCN}|zqq+4)9X8KI;Wm%s zsKLDIxQ7|oXtmOnUjOaF;}dzCFP&vf+S;Ox9^|9(BS*8oI38~|_mPmb^UG#mH4&m> zJ@eFcp@XzMqv>GMBwzLQtOA-E6>&sxBKo;&YT~d!+TTg3@_V~VN3!gZk{FBm8<>>} zRpTwt9Va;`df;G5VC{{~gKck}{uE!v2)R}$^!KDp%=1|yD+~0d@i{YsdHr(jesuE2 z|C>Q(e7JJ`x|b2;#vPQNux>KTa_~%Rx+}bUI)x46yBF8P38o6x z>*_qPKMRYU4WGaQOrB9cD>5A7{kHS|t-eM4$4YvP}OaG1(XvdfL-X6#8k7h2% zySsUyn8lo}!_j^AM+wv0Y*?I7>o2Dz*=p~-jtNI&`PIHXQpHSbLbU!&TSpM9ZXxkU zZFAbnjS>jvodU9k2Vcx>TdTQUY3)b!Yf(P#L@m{0di>dTCI8glZmC(>ybky-EpuHF zIgp1$K%Oj~-vofcEdv9yG9#Y{+@_Zd8%xQ2nFn@sx^B(1&hF&B>k%LgBauwN{ zC#cV7E207Cmp&7mHGganz!dkVN;EMjANmsG%=}FwuoywB=%3|STV@lm85svfT8POr zy&Q!N`E`GX=%EDE{l-|B!cEI?`~e^4#-BAo9i9=rESgBj7knYyj%$?*q%RN+FwcCY zg25MXAVK{2dn(n321W_Ow>a?om(r)-RPt{~mwDUU6>q>ymmE z^uQY<7Gu-cjZKJ1@T^%cO>aMrd%mpu!NvyTNW&<>1cx-EeR5`d9~2?5`PBYW*#Jf2iBm5-{M_zPM_3q}m(WpqWkv1EQiZc=6{Q*)|zqE5zSVriGb zCPO`gqcUJyN;WQuSN_gYpS2j-xD#Gvr^m75S}Da2pg#X2n4zPkD{Vju@b9mCLP+8qKr7QKQ3>n69VCo@G;qljAG#J@qP#mLL&; z>`?4=MzzuZ_GCS!@nVWjex9d_LAqnG!H-{%K>DPf_UKN$8W#~ z1JIg9T)DF^O45mmD2bTL_|nG)btLlOdaR$I`!JtrEMa8d1=!DoLVt6C6h3md#s^{2YfFO?7JRU&B7*4xz{F#OUmh=FdUA+Wg*v+AEc|;fcn6@ z@S=B)7*^%Fv3kbwhqqll4&`uQc;)_ZCoNGdTGQ-`i75q4mXfZk(!CO>cd#_R_W5j7 zlzB+{lfl}VO;d5MmxbMq+F%Flm@2E?NRnY*Bx~}R##u_3Cd!K8`LeM6!PtJ-_t$IW z`W2gO(t}cXN)L=6SBsSKqGu1kAQ&O*#1fk8lYKX97Iyc)OiX2UJFFoIBPhSO+~0uo zS#b^7-WNO)-!}_xxNO2|3_*|hufKUszh1g^q#K($>&r?AQ?4;dYG@_vNxn62!Xp+d zvh<8bplTc!o~|TJkwSkNSgvp_CeOyir~4sX&Q)I!^=OJqDmczG^&@+(m-%vR6vw64&$@f2;ERyf z>Np%!JXTN8FV%t%4?e4A7P}bHEfx+;v}PJV(_1rmz4Nu@J&Iw;_bIjZhhzKUwhRdJ zs5rYU_)}Dz*;OL;rc9Cr`96tU&!EdH&+p}>x+l~57YVT)EvE)?rt1$)X%C?NY>8); zinyNO2*=P)w#&uXubg>uu4HorodOVh0%7;Atx~}gqb(NHASckg(8_-G6=ZcM{^9|7 zO6DI%C7Zm0-1OlP%TgiH3 zP8C6WjY&tO)xMeMeB7@_PjfEkFFecy(?0CKhHH9TBZN#QuA1*4o4$6=#rCY9_c%P} zPj3%E0eIm1{>cdVii~(L$ZcuVV>*$>cM(`4^ANT*rB6f5`^CA@*#K195IDp&(;6au zEN#k@3q@rQTvI1F?TrmLDcT}{#YtFYP+UfA4l~0hqy@@bko%C0iv_wH!1#ByMlYt$ zG{edI;n@*%XZMtf0|W#W6sr0oiVOmzy`03upB^d+^82FF#?wx}>mK?H#${ahRrsLd zHK}CY(JCG;;*!6yYk^qdM5e3AseAO7xjSOgu5a8Ci-v7{0}6n%xi~#jS}fh3Mrsy*OoE?SbP5OlsG_5O0nSJ~Lp!Nd8vjl-z^Y|!%~*?Y!c-kVOd zxntKX6_z@11ahOSyGuLzaw%PpW}aq9yW*o*%anF4y2=b6!hLiI?klEmlWG*sxV%A| z{jpl;Ab*sxTXZ#QMxGUdUQ})d;lXKmER;j0UAcU5S|z|Z%Nf$qUXv)FsDkM(D>-#5o~ z+Xh(?^!&8OoMllL!aVn1mhz<8^Ggqj;X6x-)8J*%#z_+O`o6ow0oLbeTv|P@OCm0A z)V&ouV-s+&b3W3%zSMHPBN}iDc|#wLumEuX{o5goEW87KK3b$H=d5FA%begG=r#LETbb@F zrbIBuF5&6s`&`PQT$i@8^SYy+!}-Rq2kGKp57fsHlw()c{NC%ca-&;j>px-!VJJQ(yl8zdQ@YU zIa7MiM0@RDchqYI2m2Xa$n6n5-}rD#v*y6;O=4x`{;@(~qxLT_g8kT8K(7Zmm;FGm zLTm#3h@+qCt4yMF=xwAZT~*pKLf>IcUjb5j8XwJhQU)885J0I>q$CUVN1^7ERwmNK z^ye=G=uCJ?z?eNwhdn)2Jor;j6T+H&Q6q#7^K_7qhvPzd0_p4R4HEdMFuqQ9Ptprd z7uPcyhfMobhVnyOqWs{}l#u-y9fbt`oWu_X? zo2NNzjCkf?e{j<`?5DK@U*8PRe`1kYT==~gx|At*Se|u)m1oxmk!G`3i{}m+>XIYh zI2w6ULJ)I;5Mxs^*@l^pA`!j^ZKc`_rB-T+;SJ-XmRDS`xynDkDiU>t#Mqnle(5I-m>lH2qkx z0e$4V((`FAiciW*XgirIA|fOiw3K&0MZ#Q4xJ>kYy|gmTNwZnMVu0_K z;m(53J-$-JqcZ0&6Hk8>NwTm|qgcwI&G^V)L9;>8jMZdocX)cx8<-l?t}hjASTECK zJ88lQ_gV|pBNLUl1XQ53Y|r*L`(B6UaXdKTyxwn{PJQykx(CJKZ9$&+hIb}AASN5G zg05V;wH%+;=gQ5NtFvYVDhQKAg6`b0I_>Ic2yuC*NjK!A)?I6UzvBCazi5jWcTl|> z1EQAMJn(F6MxueXmdN=#h%sf-6mJLAN9yWiPjafZ9UW4IUb#Ho5T%o$8%S@?Ma@Z9 z;;WTq#Ev7^^1^5Ot`1!_G0;af4bv_^DXDK6Zf?S_ly0^8`W^?IS?2zb&)r@ zeG88?Mb&KR;XBLV)F(%ca(71jI~-s$^%NmVT##(!o9+QeTF~N3h)VEDZ>2`Pjc;`K<;Y8Q5DpDgzAH41~`N#M> z>8D}c0PB~HYbs~8M$gU5Iy@V;7S3%pT0J;ZfAmQA>E4Sjt=y5EDdr3*Pdx10kla=s z`ccr4qJx3^-NAvlj_vLi04dz_t4oQQU7K3j>~OcybAJ-%5ebdxqU81L<`~?{5cQ}1 zf^d?nkq!Cf(D7hrDS*y+TeYLpHeHY&fETYv+jfoU7CdQgNx<|D{RXz>K1C_ZmT;{7 z^4xvgefsM21;A;&#F)~lO9T9N zB{Pip=s69^+AruiU7g%Xgpawx*Iu)1Uqw>vgZA^v&bK$6b{Lk4fiNhIAH9RPr)Y6P zsq<30&XQgDr1;}F6268^!2GiJu-~DX*B!1ZcGii>X!UR*t%VBrOm%o3PDWs7gsXE1 zU7ieoPahD%lDlx+m+uDqE{+Ah zOli@9Zce#~4`nrfaEd9&HI9jxsY8+Z31>zCgq+gq&r*GU?;gA8MAU&UhH+w!Ux+S5}OtXje7gH@Y_uku>jlm<(YZW2Y z_zr26)D_B;kCKsK;2p&#sQkP(AWOcAk3!%n!d}f>0}qDc`YgE@-k-nf;bKPQ9brxng}}J;)e|~7xx7z zqix02ul`|c8_V~jzSR=G)I98$Vmct1{|JpJYtuw)zpIxVo@U}j`T5W<+@35Xx?!Hi z2w8a3+cO^bZnN{FS-IQGei;eR+BUvPueuyhP$ zok9C=`5*d>&-vszS;CfUsk85GMv%yXexZL$PteN{^sJ{?f^9V^z59G|${$x90**&H zc79#1rI<8@FpH&+Co@gExM_M+xfX{P0&d3iaQmi@sfNFVxOfG6@Ip=DCVNXZw}&$7 zqxWL0zXir90}(gNm6&iS72I%O7Gq|$?pE9!_{MChcJEWcO3_;vUg2`_kHk_Gx#}ge zqJ9UG1<0yzR@VDdMe71n;c83LKZ#o2Z}^<`IlidX++eRAK(Q4Y0?Q4Io|?tx~3#65zuGK)>q8 z66Vf2hsgC6f*XkO;GQ$m-|-&|GDhwX(Ra17OZ^J;0qsOP22bureuUfOxYxc1jOF*Q z8=O8~`7V$=z2Rvdr8=)YEvs&8<~GV%sW&`s^I zB1>VvYDINZdDvIte3ePdwKzif7Mfpv-eo&q#Rae)3FQ7OE$(*ZDj(@C5hlOJh~m4}XGqOW z<+*ja`85KK(=Nggt#BQSd^qh)XwqPXP z`er8eAkJ40Xx|s6Pb*xW4sMdm&@!IweHae!?v?xjl!y)w98_dz(=TCPo*xtpc|7Z& zV_x?sbw4B@gr8+~G(N@fHae5U?#L8=|7B_h7bQy>&TRbve5vPK{;?QyAQkyy0UB4e zZ3P#;5#?nudd!Fi-$lN-%{=wTA75T6%fEOd2Rc;vU^q<&DUwz$G7J!{EtQG>XkeH( zNJpNTo3;P0dbyeMUR8L4Wq3R1_kb$A4MR`%bV|{6Q|A5mOeUXQng8MUUoa`vTI@lx!b6stm(U>`I>a0>b?50(UcJohl}+;GxNOCbiEA5tGM~Q$Q^uMLaeU;cJ#SRWWE77Y*q(N$1O( zzr9``#v6$Fk2XAsJY^u@Lmc|-dBx+v0~E*8gK>U^&vpL(fnv+f_DOQBS@gVa7bJq2 z(tip;q2JdJuFe_R%lWt|@IZ|#%l(0otZCCPqNo!N%yQGteK&XjAjcd1wt;N_Z1=;L zF7#T|%B_RzJoStCkmDY3fcf(4-SnKHywUT(U4nDR82&j{r9z5x>*9gQ2J+i1Jl!9K zI5oX3GFmT(O^%W)fYAIrM0kQ11VHYwH&n*k>RsKB2Lu`2ro+YsYkGe2+4Bbd*6Kc0 zlg(W1>bd*6y*(D?nPIg7F;iTiQT6UfzKGdQ_%vAZz^*Z>BXgDS<(v*T?;moFT=H#R zC=K{-D~EjC9<)O78vyUnU)qPZt?cEE&f7xZ_6>-Y?KQ(u~>qhX8)>3{K@sg8*Qxc}A)=1g@o4gr=MF zd=?><&}iYC5TO57hUip%KSThzR#9Oswi9h1{Op$f6V0I-YuP&vd!};Q)(+donrIKr z;BX+FiAAngJgf8t!`>?Ep=VI;YV*usj6AQ9|JFc_c3{WGsV>S=)@XOF!N4d zaWU{LOVO3T##G#@vly5Y=*=l+2_o}qcuJdO@)0Y+^W8jEK|eEquFKD%JL=k*%>-35 zfO^g)K4DleIx5##N@@BV*H6&2cuPz=z#Ip1Zzl3&K;2?A`c{#KnQ$aL>q9AWX!WRP zzv5j7alk2DP_QKN+XrtXO&`^)Kk1TRqU_nrW1CtMskc8TdUuver+Q~t`2vrf$OeTJ z5Jn|FlDaH(a#w{=6QN4<>Axs*d>HiyE_PlCe(@9>ZiLEF$^`a_rpHFB@J7BfbulLb zSq|0ObB6Nop)$(UFjeaHEy!U|Ee|RpQP~%dJub`JiWvdELja4lMD?&OX0VHEkG!dS}lfclvYuTLyb{wP9s7tk*~$eB>S_5 z%44y3$9LJFkB|+Yu~m?}15U?76zmaX+js7VHRD#eyZZFGS%P^EA#M+a&v!#i0@jAa|=N0fiq$P^c()1Z<6iBO^ zjTm4)6SL}|gn;HDRrPLL{*D-QNUjF+^gD8o%)5h|>%|ooGT;-vds~fvl7=~TB`1TQ ze~p8G)88xR@R`P1{7Eq+`5xd`4?3#WcpZ6W~y1Lw+KtR%Boc(j$K2sshiQA9xx z-&9IOMlYg%M5IWW^L#ir%nSS3Pc-Dv0_Aj~uK2LDn>?DMp1}}P?@#Rtr*8OqY zxNYsEeR-I6c`y_?a6$a$MVF&S zF?)dEJ-+S#7$_&k%^!(X}GR|oj5g8w~_Eo0Is3qQADhNFIKJuEhC6UHi zlBy5~l~hw$^Yffm+w}@ow>e`*-6;4r_~~J|P|t1CC-qJj_)^Z}uOjrndeH4lNvWYY zO4=p8h)k{)dGBr3KOih%Y~MNb=d)jMigAI@0M+byI?d~m;*O)wK7Y}JFi|dJ7kTK7 zI#*u>czOTVf#1Heub(_#E^dfh%RV5$1Gpx@E|~@(?g^w zmUIl-X42khLl4JBoV9R=>E3k_M(TWQZJ9(V@o>gk?R{$vcuT4eYDF}9uZ>&)x;J_` zq$8ac72?lrm&mVe+RTkelQJi&?eh#c@APQ~_|HTidm6WXp@1}h{wZcgrG_)>w~_Zk zRvrM$dUHJMzo}Q&?C0eu-4QU+c=`*JGNJSBE7#_R^T50RzRG+Gx3yKfPv$?YND1e3 zr;q<~M~SIE)2!>pAx}(|1?_dWuw8d>#kg3B6ShV>1AYMX2g%4TC&@j8e?WBWgfkK? zpx*>^m8!Fa#C?b3r@1e-G_tH~LH$v!j#FlS3r>L-%YaDST^XvR(KaDFfp!R1e8yww zB98};=LPo#M)Ajn=xu^j0G7C)QEJYEncb!O_4V=olE$7#PYXtyiT%b&S1^$c! z7Q7hS{J&{}D!R+*G?U|HWV-pt3~+;JFqqESB#5!|-*-D{iu)oZNh&9KT1eqkT@vz2;r`!UfV2I^uae$ zZ|$|X-5|+U-R#6@Cq^-oW3iW!TX?1!MOzX_GE%y6SjTbTEYbh4YQPcKH#bffrW*kj znDu2z6|*6)gXIz!WFCNDIR6oI@i+pZ5MmBtD?#>Fz(zrwrY%-bH#Pw|^g8J3fq2vKjw^A&n=4a_KMU7c}=bC|!eP znBnG`^LPK|0ex`Xv61y9vV03Vd*h#HY+xqq2$L4FJv$v_8jkyJC+Qm_?lY%orx9s#x-!}?SD5BC&Rs!X){o6oC7W*k*@@}z67`TIC4Hp~F65$@+h1Rj!#7{4 zEVMA$NO3hI;u-AwJmkI&dMiMXL;M+R3$Rp$9W{t>O6xJDu$su3waz@{iLDNl^PNc9 z^{F4E6`g12xmubB&Qpg1FT;3w#wV3(a*!=B67CX&J5B$WQAOxCF8o8B15`0XG6b*#ol$ zxm#dhW?~D2+{1@)0&`Ii1H=t4@RvNCYpE7`*xmDC#!Wd5nL;`n|u;oB=02V}fqliG?5_zySgf@S=clZ$dmcDP-2i7-+6;4v;*i z?Pyc`&k$ELyE=$3JwK@Mgg6YIu$`al{uO(GBld=a24XK=yuL(1bz$;n7@tIyWoZck z42vvRidu~t*{NzU9}=(7F}{tP-e+W`qrKS%(A5|W>$i3gQuF`V2p@6b1;D#JThQ4c z1ondVf=+7+pG0M+b$yBE2Jl|DXdL8sWl1%z7K7N%obL4__N`%7To^UR2`;j5;iq5t zD$XYVu`6Qe`n%I0I}n9Q)6OK8@|E(IrQ2{|cA5U`>;?ny-m~`vp}*ef{Lv+kZ{8Kx zZJ9D0C$3a(R?`1Jw#Z{%J?s-MK?)HoCEZIpZz14Z2_%o3m&oB4z9)gYeCQ=s$KmIJ z2^g?%Hh5#c>#mI2Xj|a37|WS0EpK}=Pr`Ck$}C|{Dn*ARwZcNd7gj+2{4c8(6fAa@ zt%R>c0E(H7Wr{}(=ia=<*q?v%dpF?+0EWM!?Vm=Z|MnDMJ>>qKpt&(HDc#hdZ~xYb zg*o6}i{l?Z&S32DRJsYVclUu1yZ7&a~LO?ch7r~Z*H z{r(x<|MVU@^eP^dCp`c6N(UrY$iu$|_zwc}{~zE#pzZ(HE9k9z-xEcqk5 zw~Y8HpzAX)PU>RLdbT|m`caLTTtjLMV9LDv6-DE`BGn{z6Egn-IZikN&}W9nN=c*z z$tk--zMR8|vYds&`VtuH3TU=%5}~YaxUz0zwaa```)f;(R72k?GsoU z0^~*IE-N$#WkuN`m5T?@qv3f{j3#_pcH!pY8IzGc_6o3s_Gy3;=e@oLUeluvQ_`apyh)c6$RQ?0)iGv%^q#mZ%Yp?RbmY< zV~UFow*s249wEp^_Jltp0s#PIqxJaD9@Fe6(=Rkd>mA?rwl=&oT(9Y~F%ZHBd^m#A z{e1Y7kwXc{NQGjcJwsNVr%Ml)<^Z+fU)|r0=^)_!Y4tU z?u%-CNuXpj)g&bLIkpdUkgfB2>GGmK@CV9C*b(Q|{r$K*v^q-j2IB`tNJSsrGUw+< zIFg*x$xlP!TwJ^ot__;S`rXx8AyX=#*W&J@+z7%JLE<~!rt-;Q1Bcs; zN}HayYg7s4&TN>|^pv}2wM}#N%lfEBTM z7`v94MgL~zR35&0_&pA5IXb;l>u0P9txGe|Fthr|pBrHxD1OhKwTyBNC3(6p8G&t5 zGY3@nqQkxsjqbyyoR^?4DBS|KTpt<(_>i`+={46V)_Q_mK|g(q3f z-j(Ch$#^_?#t|!5T!%h~kh(34Fi;0Rm>%McDkD5QH1$^G&&7pzZ}XS|lwEzj|FfX; zBOI@2hcJ1?lc@me*R&fw#X{}}V7I-@TtnMbMGU%l)%oQgv0QC$jbFvToxhj^B7~4t zZ?H4IC%1;1kIr}J<)4z@9I{B+Y$di30*WR;aJ|AQSaDw0xH^!sDXGebi z#=;4BGXYyqJs;p(Y!WsI&T9au9``kkgPsWfAsa`z)Y!wQt;J$70ktvbJ5gXtcymhbIL5<*3k-J2Zc%r&jfVhu>N%`EwvkscFm*%Iddw%>a{iVG@T40y%aY z(6beDt`_5)K!odC3j}S6DC`@w%O!?Z4=PYf`+KFJ<}lkWmTouwyM~I0uCAVGfeK-9jwmXSX%+gT{|`T4Wc_XZIJx6k)jE< z>QX-9`<4TTX^HePt)*7>n0~z5e$&0Z?+9QLBJ^E=aX}L^Zoc`(n&1amkc!Fg>F<%O z@y)kjjz+~EyVUHG~kF*$gPve*IMj&z3!XUSK zW~Q$4xHxWdSNerkeVhmpxvRU);?!f$iVAN$F8fOgwVx?rOoX7CU7#44S49t?zdlUzt*yG)|TIJz50(hq} zEu8%e_I>)<$eBJ*w{4*^J45|>txu*?o6j7!4e<=`Oy4(M8_>F{H4!P#4%Dl|$|I`s z_U!$zoM{`-wAh|Ef^Fna0G{A~t0Tn07d05gAMcyZAb)Zh`^XOfa;2!-mAR-Lxb=_l zQxn;f@2HVVKN7ggLR5U9Flg%o6P1KbNn{(D3j1&FEZ>Ky!X2f;+XL|ebkA-yNkGXO zNE@djufhYAQjpyOH`#!I!ti9v)+<nj-BdLZLPv*VpA;$QU3ht^8@L~L{v3%9@ zw_yo8XDM6LT3^ht6Ch#E50`^Me{hRSZE z;YVE1y{FL;@I2gert$P1+S{na0$p97$q&T`J|hJPwqa)rA1}1ea)P!({W9HIce^^N z?~MLX{LTjYR{aLZFCFICh{V1zU)O;Wz=z%Yqs(BzoUjn zQa~TJD52?j%quzmox7mSG(>z&X(hXjEqXZYxTiYC{>EScSWp zsvxfzNI0~^6r9I#Jmr%;optKDTBK@z$G2Ce&CXowwqzN#8d@6@&xM%vIDQCso{#qS z_g2jAK@r!v;RhL(3fe_S^<l0kJnmaDAlkc!EZRU3icCoofr66KG9ulQ0+8r0g}DU?{Jk@}clhiz`HTuQ z+bT;hSDvfTSCFvA8MkLWgSu{SDo7RhG`q}M?IZ+2A7pm*X5oLb6{7X8%LYyggunAA z>1uj5)oU5ML7AciWzN;BG7xRv2PCPq=*PwstFXQSi)Q*8BTP?y(}&T(gf}W`88te? zt}bV`-6yKuWMXHvo(|r)O?6q%ksNCy&8zx=QSZ&X!?Fui6|}qy@Z;&cf%{TNNck^_ z^Hhp$O6Rc(=$ZxHNj@!u&JIS@{{lUo^5zWv_)2}HJ(?;bp>lsHyS;4G@mF;Rt!Sf< zV5_v}!{k%PZjnMFi{b8}mp`yH4+d#J420LN>_Bh>0t3op6;{%|?-Wl~9d5*D*0Uk% z-F%uNt6<=t?nQuj^g}Yru`As!ec(>r@6J6T{pl7mHLmmzU4%+c8usi((|9SYMV|hS ztQM;i!{;;%{A3K8Ul{=XU+legSk>9~2Rx!E0)j}lfKt*aEg;>YfFRu=!Vzg0B&AC@ zv@}RbgS65dx?AedA{_b;y)ckaD&f6x0o@4xRq;~<{z+26g_T6@K3eU|%cuW2rd zL@`bHQ4Z!%^7P4e4^P`osaaLcT>zGcdyQ(sM5`a(CjS!OKG!Akb6ZEpWN3BoqPNUj z5k9Ov?5j6XNv4Hk8^y_QsL}MvF-3C4L*Y%T7S2xd)S*GqI8tq>SEzEo7iYNfcuzs z{>^fYyNh45$6}|J!$}sOP@3tK|z6_S48K>q{9dcpIF$sJjjpz zg<_JeCLje+*xvN(j}a?`6b-NS+h*T!&i?FIKT7&SxLY?x=wRUcNp`Lr9{`x1R+fG% z-PzJv-X0=r%KJ(B<1~X~BQ&CIF=cvJz2MZP)(*c=um+d9nJ!cYMiu>6v%lG7dB<4cgP=eaHeE%^UXd5! z9aHMXv=sWH^hSA=ZS%J~1&i~`XJSR2Hn*i@g?wt4lC4~dB)PZ5+;39%2+wVe+>=?J z+E5`Y^86G*8om_IMys+qwkB*(UqvPMPHT#PSk_FMZvJKUy;NI0N)7%(>1uSyPqE5w zqxHsFl2YN@m(LooFSN_+F?XEI>Mx@-cLsi$$6n9iNy`~GeZXn@0vYujl}En?8@EYf+yI94(d z;Xllm4rh?$v|DE8gdS#0$w;cwpM8D8z!C9YPFk@*;4ws^J)fUYvW}%yORMo)bNFuF zvA8!2v`kLJyrM|-S^@r%;W&JWEJbhK_gda%ElFWpK&H~@?TI?2Q0)Yj9_FRji$7fn zqevZQ-@PkOws?Yc%|lLN*uHSOdp_MO1(00odfw6;AliQvSoQsTJunJ-TGwO~lJTdtWX79m`qb>>&nOJ2CetN&G^`(tyFT;ZUJ0B3 z3Wr)BFBB+Dkd9*tN%OQBG&N=|aqK17HHy|!BXjnfyT|WVWMS43$m?n<4Rx+iCiPqKu%ZuYbTmmc9d6#8b}pYd zGf+6E2Yr_Kfk*n%<;?G0)}6lz`y?=NksQF*OdD_5zaBr3g?h^NiQO9wfk{!&C9P7m zXJgG5V9Zo+zetYa416>D5wGo;SgLQ+<+*pM;gnY^C?q-m~6Z) zrzE%AO)Y&tHxlgtMZq;rP2vB=fTejtd|I;}jJUTUbVqja?o2!3oeLIWoBx&?^)Qsz9JaN>Krig`>j{9S*8exhGI2v?fr6YbY_fY16*{uFL$V7hI|5 zJ1vPfGp*WgC{k2W+Qd`ELsGQx645TY{Y=R2^fH=-H_@NeNXzlZK-k`ky#wu}#EF4B z2rN`n^}mucWG(d;44=Zu-XX0&$ka`0l)8-b2~SlJiT;?!=e&(IVA4XdB?fs>tx}yA zC@vTB*|LMLB2@t0`;)E|U6gb3-*F z55B6qu<4Lok0v%A>3(=@k|NJYEQE3W9On_rXIeD*f}`Gn&c$KIi3Zf)B9`V~I&DNSu76`+~?3_}us z5bfyiA?{$f?q(DTqoFrSl@>uvdA-a61}4`a5W z3p*Azt!qFJy$^wkx%vi=7ubtawvgz63MP!cIShy7^KJb?Euj*wyYcsdxLXcERW z33*f0byR)3uxij`$^Mw6x-Mr+sdsDsrLceR`KLwgp~qo!FV%%|b3zPxcH%BZc{7e% zgV#|2Cg7W7s&x>*E&d9yPnxd*#EFGZq0U~J`fCpKlOT0)i{eXhpA*%y*9r4=k2wmc z!x>bXft&NQH-T<~E3XQ!-uT%Qz0XeRYo8h`Pj=g!Tng_7bo_Iv%EQ`rRl)Fr+pu~z zxVd?Eh}6pEJI`U{chG_`F_6j9C|ar&fp1fvg?8jMDc1Pro^rSF#l?9w*<=HE@k10` zaM<|4b62AG&(gj{NoDeQAEe5?d~MW$S@=rpX$k8Zca1(MY=BO=e<&OIkSj$+?d)S}q+f8MP<+{l{?FXRo^9bvCzjQx?3 ze4NXTYuvU-2RdHyz{pAdP-dDZsgHuo7Ob`bm3rRJ;tKB=29K!-O^P8F!u0F>@gFlE*ve zk~l4fL}3(lx^!70=|UUaigN#!I#Dq!_V=3=`Z?LGe{A*sT^^4$M%?zSKYv|yTOr^* zq=%iwifO?YH^N|MNWj7y!B5LHvidIaw~*X6wjO1z~fYc#RsqQ9~8mH2)@ z9(^3HCq2%tICuIGoyhMx>f=eqbdCs4TZrK8Nk6QK(xydtq&qDQgdmG)Ik=_TFUoUw zCkIH*DqswGf^LjBDPkdd>T@Owwyh7?nw#Y212?n=N60HXBEBv;_Qs4A@7;jAPV=QN z=7}H6xvXJ&_cizs&{_h~ec-8Cn4>jgjPYrVn<({*1QOg_}JdgSi z1yiJSIQtn-GUVwSoI>DF+M>t__>2-_3^JVyc=NOzul1!}-1M!p8=z>R++-h)U-xfS z1q|W@P2X*>x9X`<$XUKAljiCUf5+>XMQ?9=9XtrYGD!yA@ehC0=P_|X;Tb-$oKon+hRZb_w_$X2=6eLx1B^d=ZB%T$*5Y@l!l7?%o^_UJ&{CB%Y_(jZ5dTyQ zmvg)b(j`ko8(HLfkSwWz>;VVgItdj9_-XVFlC|EbvI`Ft;*3#?{@x~3 zoqm+zN>asxhs&3bcTZ1X$5Ben*b=+(>`?c?)(lnf+4khM^B5xI{qBdSWsPAnxJK)# zDJ0cy0>!d*aoh~)$B~Vvw9RuNaO2gkr92L6j6|iRk7`4TYEd=rLR7ERheLwl3fFYz zTz_CMZwx4EczN6-g5su$1-@iZFo_O$cN`_cG>#RA2?0_a;f8Y}*NQkTzC z6mI0$8=3`oQa99RJjxi#Ye{WBE0=%x=2d(Xp|ALlYZ}2bas5HCcW4ksb%C2oJrQ`4 z+dPezhb0U3-K(W<=5Um}OSv5Q*;0|1Hql3m`@0I-Jf7vjZI6hyzn;A(=aEP-;S}5Z zpfGRz?CYzrS5&j?ItZ#5SQ|{Vu9~8QgekY#<6=J^a2CHLUP!WU1jGorpRHEJmEt*H z4XBSW3o6p3TZHKpWH|K5n>d)xllG3*zwOeuIx3Rp(J-8=Jt6tRo49Zrw$<~NxXEO4(v1zq89$kHgozn@c zZ|#U~Uqbd+IGC4{?CHiEdmeEyb5JJ=Jsmdoa55HCw%5zb*mfpXHj>eM)EnqwJ4ui{ zU8UKrWh5Cf^f>Xc^6Fk?h1f&H0@h8s8*mXDP>;c6=D0lAe3aPjYXaslOKk<& zGvHd9@}rvv55oFkYjB8AT#w9N(**Aq*0*hyaVOgcH_S1+fI|?4=-0fK%8qVoiYSte z5dS~?0DP#V6&J~F&si&X$4=WE+yhF7WT zX3{fxO&XVRID}-vsv+(K9iG^>#5?3Vm6!6kCTX2*ah1ZXTcX+~B#%v-XuXT$$g_UAjD)2q0 zi$;mJ!pJLL_FsaU45#y+XbMB7PY3Q)K!ia`D4=G^@9bH#kS2`3G^`5VLav-SoL5_l z#cw8nUiMrdeUX2d2>OO&Pp-@OJb6Z;SS{PmN6Ur^UCZe{^Q;anyQ zq1WAdIk(3w`_@ps-(UF*2xK|uZ^KSjMD1TVVFGrF0fBn@qn69bY~_D*2c!(+IK6d> z2r%2;NUqe-I$ixHVq^ zDy$x?1ksG=gEWcvOyJN;=wnlX7h0qx5L4w9kaUngA;Y%hryj+`m99PGBy*T4Zhyeh zD_!e+nl9hc!c4(Uyf<-8VIXVEQe|Q#POa6WmRiG+2NXlDZLiv3hUE+u+xJYq;CDTi z-?tYc{vby2d+<=B&9`++4bOLdz6ew0H64@jZee)3O30)oy~!xEAVEW7{}7{f&d^6_ zFGT$}gKAT1Yhp@swDQPBHUqzoH^hkysGVckY5mIdaF)L^w=pOJuM?KPMXby8 z8~4#3XgAL8KiZg~`mUD{Hn~yj4 z=2#QnLyX>7XeA7~4x?;J!nVJWn*i>N(oelI6M_|9#}B<|T0GSJo7O5-H4VnJ;SM1~ zCV=e*g?HpLr8^#fU+s1FcLX4 z%(r`&VXH%YuT=7!seTX2#89(C?Q1qC&~O_0+XZuv*{i};hh+f?#5m_yyEn>4f`ij3 zF~+ROn%aOq!Y}%)F`SwsE3RMdyoARi5J(4u)2;&tTdF#nH+B^%TTS$KP

3<~$`! zvFB2oZU!u>rOE6^J$QZF$$b9?Az?$~?s8xX7mUNg%6=dM9#|E0lDQZD!n?Dz4VioBYQkPm|hR*==ethvV%0pz(7tqnAd3uqgQm z`J=-f@$L7SKe-#X2FREAI6^>s1c6aP#yd1txdkX>WbZZU=CiFk@koE&xDzC|MoBkC|}W z&Gyl%Ip_lCvYuFY%jp0`W{1-@AUB1dEeU)zaopU7oDFCThI4%it2=y=9<(_ipwoxA zm=M#cW;c>5KLRZ}8hSJ3$_C+`@yPtn?WCUGfnWIgf65sZHY*DH#Dp^9j-O1Q_>YgA zN{vfZ%PE|Uc4v^z(p!pEmW{Lr@BxiGN z(v%(`6(S~5L)6y4`53hb)_6*D(1D%^R$BD+4R%Y+a0U0Vh35T6GNxYQ8#k+({*T*C zmxhC!J5JeoL3J@3eHThJR# z4&HzZg;qk`q6T~p_{INcV&4!fU6QzRE5bur=-<(40{Ag${$5n;`w7tIWTsB!rz1Z6 ztM7NdYwsW*YWY7eVib;(=I`PTAajG6UxPgA|KJJS|2BV9Ah_QwGu=lQ(P_bPkKJvv%`@9=qQOf+s+|V@!4q_KmEKK35ZfH?0nLpM1J1*C^sKFF7 z(!UT=hRg7SCzj;CMK#-+D}LdJ$ZmuW^-@U#VkuC+eXD!NU+=p2&N=yrRv*}pXj2UGyIt^bP4xx^UnrwV%9 z?iEY)HNhs>SYKo(VoPrwmNY(mx3<4B!dF2CvroF9bhWpJjatK*6{F6AC_oIzh*9?CAZ^Hs8}% zcmi;*W9UlwU`MfHhmn{;1Npc4=RN0krUw1QY>4oNbLwg9hB%o%fiDJ6k*{6fBwS8$ zN24rZHDG!|u`7T@K|jcutaIzsWeLGwyk)05+hSKIrtdlL$l|Wj6VvLu5G*cX-JCtq zPMbObqwpGnF1GOba4Ol{DD1`+*5M_HpWTylv|^z;e@wyoZ~Kd&D+g5_!-7Tu45g5c zj1dTpZvE-Br0Szf)mV=z_80L~Vd2j@GVT0J^LED!E0~0CZa<39sAA&3N$7}!F}cEp zbENBq7l@;-b@^?pgKza4&mVT#r2U*1}GIXl69v5Ug*y6*+rEag{ zMq`%}PXa$Kb9)Y!WrZ@BR4|F%6gtve;joFvfaIot=N4kNVG(X)jbHGY!Lv5cfsPl(5mp{&bVNJ>5Dry{!1wN6+;x zW?QFE9CvzyL#4*MhX;$g72lNb;TI_=K20FDwDoWOPUad&m($|0Z%+~N<-}xA58LR_ z3`sR=p5AgRQ*~pKgy)eU4(}X6<`4FUl^XWM9)}cXnT-<#v2m4EjrGx%ui|UkUd&&* zY7@J(%?vhnr08Q^#jyuf7(SkoOO8HfLFk2&%q{JEY|E=iNC8%(sMNd^`x{?0lW8DO zpLXi7K?J0jEx5%JhWUTUmbxL4P~zd^wxu>i{70Q#HO50r`#1Rl*BZ!`q))U?jmG@i zNXA@=-1wlOf;+fU5vMU6o?EnvVY)%ZmGmDSQ^l=g;_s1rJ=wG(8MWX$;(E(e@0~4@eP#&@uM&JQ5@b(WS(3SXP5%T{BnK# zavo4GsGv1XK=(=Do8)w4uV@4S#17e9=kT1N4W;B@-wJ8{Xn7$f$_eWU?@&#^Zu~Yt{oZ=Ctt1hZ*0tk6YRA_7c(E zON|fNVAKtG4V$o*Je;nHvNI00$mGUkNPrjN~fudv~Ya;-Ju2({A_uQhd(`ry{k!|eM#7)$q5{L+j)GH`EJ zrTBRD<}NOY9buq*2oDmk=x+q7dBXGZ&Jres9%gM@L>x$e5WfEGd(qzM69V^|_~1?r z8TQsSFUVj`r)*^yqozhhDwpFm=Ef-l^i};k44E@M=N!^g&pb`;28W~#cCfJqOp0r@dg#lh`8EcE4>&p^=0Y9WaUv18&5Q4K zIg628lopEP*@As#lXX0&wWs9YK0E%Pdh>~ca$8=heaauH%G-Z8)HXh7{rb4&8;KP? z-^$+aaI8_rJ71`!O|H1RaQ+E*e%85#h8PIv9%wq?!L}B=K5MP=WT!pU@JGaC%)Ptg zU}O?cLLpw8hrHwGiuHNx#A6H^p&1dii89S(%#Om6gTA{5bf21dNg%loGX#fqW#`jV zEHVsw^4Ik3X~C(7t55@QpJ$S?lp=!Z#aO|hX&5x8S-9#_SSg`}fs&knEd8rP_RMw8 zvQ^u#H}GU+<=rN!A50x7kAa$imdOJVx3Ag!o)G{lG+7LSNdU zcl6|Km~e5NbL7ph9IJ?+ALRod2VN`HaatXtDUz3CKl%e>;$mUikxYUsi3Tc4fUj4D_KCh?)9A}_ZF zQ=volyzOsa2I%uzEKJNnCK@*w*;3CjZ^u+w&sj?IL~NHmMc-&)B}yNl7BW$c2P9eX zUd3X;qBGZbP57)d0noO+5cF{UuVYC7JtIA#Yj(P?D&WuHA;_B*3B~LaCYT}F?|U@! z%x?UI?S>3ykKN!w+QuH^URT{)ZzQ`W{L#tu1|)&lWT158aRnPUnWRwvz&@dw{#xLM z>n)Ru(5EAv{7*L%WD>rzqg!CMzO)Y45{C-J1DBV)cSX4CeGl(DP_bH$!s7W_t2=ue zN&~Ta=E&p5pP022AMaq@$gP=KD5Oc6Yb7H1jGP^^k*Nj){*cu4o(ZSPj4|OLlX5>r zHO2=>pd*LHew`jF?E0IF%2}XB7vA=BQ{6$(dYLj{^4oa2{kbdSel8oyv>j6)MMLP1 zXBHV3w@R6()D>T87-#I0=Bahs5dQ!)1ImW*Obf-L!P-S09;7Kn9Bksf!)&~~E45Ns z%MM0QOzx|WvZtYG-){q1A|`sQwfb>HokS8O6uJ)}&%dFvC0aJM!*ibQWw`DqR^SC?@e zk{O4a)=m71t9_azz1boVmcaHHum1LrFa1lIMK#unPT}_tXqe#?AK9@@Z}7BPV2-8* z_^%T^l+Lf2`I(7lsmDXq)>h1pkO+-cdNRCN%6On>5GGGGW)_DzcVJqaj4!n;O&u|k zXCAz0*ApRLw`XFur9HyVBTPV{;c{b2iz4I;dVo>h{%ZY~vBW&Q;e@vND?WvP`T6aI z(wH!y=Pf_SZd)E3B?p%%iBUb0*2UHIhCro{`J(r_OYXEoi+gy`po=UJdhXHIk2zR_ zPp9f+S~U&5+#fFrJ~V+xRwhy>M0K^bxhyLnpk zm{}XI)Au%0h+VwMgN~W%R)JZ>sLnlGv6MB}*JDHxbhD z9`rXoH(*i){q!HViDNh)niJ9=y?md}N}R5Ip`F4_`o{kMwt4H09AcCF`vj&FsW{t# ztrkabvZ(6Le{v$f@LlYl*^O5J9Ib17bw-W+Jk$R=p$eBUvsB(M=G!H zVB8_Q35=JjKXhbSePidOD8Sz{`WY);s@i#VT+l#>GH@wMG;^?$m#iG^e+yfVM^_rB zpEegPLvz zmW@ia|9_8yF=2u1={ixRj2D*d2LfS}No~}dVSBZ3BP7|?djFsdWl1Q#o}CtQ`||q{ zCwSM)-MGDB8Mh2~Ua)>t&-;IMU!MTT608*9J{<&s^RsDDkE|H?A0B21 zK73PB9+iSBZ@K!x_trmna;SghOY<<}hWP=FsSR5B*40Q=)Za}5){Xy4zkpw~7|Oo? z&8N1}R>?5V6Fd?1Hyoxy|B#kI{elFW$$`~J#}bV@OmY&Hpg?`!Lb!~!;VUL=0%%(^ zAPIh*+x)L~dwyDup560>lK5YX{zm!!`1trn>F&8WvzJeTI5R!R@Z;ERPp&@61*G}a z(^_83&^|FNX4mx5(SG>Ekc}23H6jTYP_6$rx+>d$bz`Hxwk7hOk&nRFz{sN8Ffg|L z*R}-M-b!np(cDUxE^|VI+(|buyjW}_Heg{h11|3soQ6Y) zS_0iX{boMcgFjYuYk>$8R`Qvw5(Y=D&Ch9*mRyqHg%(h@Ret0eaS= z9q$MQDI-5zn!}hQg5}B^=95~~@7{i>-~`d*)l+G>Go?a^zO`wG5J7Ev8VwBDSgX`N zp_Rurv6(S*C`@7vqLq(`J(*^~El97`Frl zMXfJoPsW)1d730#bc`G!lp_+@RU;ntQ=UIU0!xZPNjj&GPhxErpWiPgwbU-m@xH2XoaWt2FP`p z-n`O(amPRT$gadH%TL8H{3lK8SP4xifX&M_FmPbefgzxch#Th0W5Cc|3CScnt8Ntq z{aaNmBYe&|vhKKcBUU57W)>FlCDm@)8|Fs(78Jp(*{I#2LjqOdBEKS6xL-R~^P}^= zPlC3k4~Pb--wWpfK+5K#e8J5qC4#5E*PN(_N?OcZa#V7 ztGi?YU6j(6%7J0!Y}nD3%;YdGii~Q-K?jiEf?M+_mXKc;x06M%ah4n z22=oO3V_hpA1ocw$QJV!3vm^pl~G0bv&ejC&r|kinzS%)5u_s z(cJqh+UVw`C8-}gRSa`*7l5FcvjN}Tfzi$jbzPu@C15L@i1h_FAu=~%LNv^5`bm|O z20qk3t$VlQ>pOKK8V)Q2Lb@F@f#*ItKmEYaXDDR3b61Gz5-3K%n*i?=m(7kH$w)mL zJ!df42b|I^0aTJ0C57K8BTf*j?Dy&#YX=ZCrkf{sjW30$7a=sBLF7cxG?&HqVsZ(@ zSrW()(Hq;GtC9oC2;|)a3Bw!*MtqbL^2amo16|cP%tSZ0pvbukZJX#>!iT1T-$%*; zC7V0lMczdTS_)w9z^SFLZp2Zj;l!ZUQZ zCACEOXkg?ykjH%*OYgzJk0OA>ZnZyczNblXsIe{pH|mSS+D(Um^!dljVAL2iv6-dg zNd6ZEJ$T~G;7>4I(p1+#Tjr37LyPcv?0K2-%!k->01vmlPLnq*s=bV}dVlHvLip2y=S2ZQ=lHA~6PTvIpK>y8OXa!;#^mL*V!hgnB<}}*8a>Ikk{%vs5~Z6-m?^kw z3RS#*z*OR@KGz;Pxm%{`MbnyOP%lvQ38N<1YoCOebf6Uf z+Jw7AP+sRm+u0rgMvl$tw6>t(YOxSCExqs%46Gi9Yn)qq3bWJ3{0%f6sm&|_AGbu0 zDz?PfkXA&{lRX}?K-877@b(uoOtekdX5R^3U*PwtH==%9?r7ZOdoe1aCql*cItXB5 zu1>#ZN!&+gi-tIB5oifgE3Sw*i&hf|DBU~FR(*LIj-HEQV_jDj@u9%TvciWPLQ9b` z*$#}Je=hiSN2XE|pKt4r_e9Wwt_wg7b0Xs@Z~^8VU+E}d#Q8%<{@gtk@W>ZU9e)|K zYeqggo*1P*8{LiZ-a59Kdu2|dPdW27fbKmBM}#zFiTcH^Mwe-slGAV?fsFyWHR`NU zo;@pte58N@<8tN2nRnYPy7l#M61X{5bSt<8p4|~y({~7D%>lKV zW(K1x4&(Mu?rfK=-TyGn40aNffq&f%0fv6)=3&C9)%K=&*Je#f6=iXnJludF6hOM+`AKm*eFXN`9`I96*yPH8RM64V#%gXq5 zLF=5s-G|`%{)t|iy}#YBo(irNuHF;?y!rFyUiSzZxnW-XZ1PXTDOn|@ZFq>ht5~{< zo*%Tm)9_s-Ji%MQAD6~X|HEl~Tk76BO-9sF<{u4hnY{oCfJ!~1Os?cx>FFvvWJt?% zVA;0l*_{)&+-rwh+0=b>4i8o+jJc)i&nHO(%P!xM_@5qHSUF3AE#aNA?ejwUXIQ^H zAFv+OZ8>rq=D`z#6Taonjumg>8Lx1>X@>d^PgKb{miUj=XI1PChYW` z*e>}#C0k!$TRe3#Tr z@0#ySEo7d$(f-%XitYShs>+U>jxSQ0DoAaW%C6vkdkWluNK$p!q_eT7X{#YwG90{$ zV%F%pr%=_x6)SX@*acP|Td!8#6SfoZe9?)d1iRU+|OxYxgFmMb9-gSSpi2+Nluc+pK@`r)Q z1O~#E+Osyzwjda9H6xx^BtSJY-fWXJ@T+rM4MP9tYN%vssVV;h4zYs~jYJ`(Ztz+J z(Cqoyips2QdusQs(jZ{NW}TFLCha%AXFKTSV3S z-qy1oYl>jcZ1&Z=nLi!C{(JstNNiU8rn*%O=&01;qyeTA7ZB<6w40LFSDZ%gmR~F- z(v>{qfZQ1#Tu97WqO;N0*!FMI|4S6UqLt4F=H2I06_~WxFH;{(0>Nvo+jxHQNONmau*(GAIgMn}|#B2V{;p&G1dlv5lxM0_Tf zaD+o#TFZkvBZ^$$S9~!Tq=Jb0Q6S7W%mdsPC&c?PKFc^5=(gIs!b zzyzGn{~09F)cp=@r^sk)yTuPPPwx=hS^P*mc8vJ*pnVd@ts|P$+~%z-19*CO#CBa$ zF9Q6CA(M7ztr|;%A18(GYs+Is(gz$6F2^m>z&};AQ`vI9(G!<*Dg%-8A$EJUjFo=5 z=X}4n-}rbvDa~x2G%%4$5@qq!FDfQ9@Yq*@fsA~Aw?be2_#V)ebJ3@f%`je;l|<|Q z+raM){5jt9m-D5rKEzV$O*^#tzIO+BA0=Ryi6cD^X#8Bw4A9LdLE+Xve)(8nQgq29 z2;6qUEM~ZmuOhgxyU-L|2N58BaI9f_TxklIuvfsuIIMvn=3={gzUp80U@%=W@Q3k@ z4PD@!Xe_CQHxNTQFFMN1+(OZek5}T)J<8Iw4iTMR!82CCy0NW9bX`dD;Fyu`I)=X% zEHel};WlX+@GA6aueL6FQ@z`(r7|%Qyp*yGsgoK^Fe}V7v!-k!8vC9w&R43-Sw} z6yn*68iD0bEVt+{CM*_$z+tBx{22VHqMmLsuMzngxmC%+u8xmf7hB)kE$=RMRAV_) z2)(ssaNS=Ue7PJ&C-XKY5SMz6Zd#;lmb_Oo5NA6C-r{@fh#ZyMv8;!Xo=;Po(ha=D z(Ad5`G)Ypy|Fx>kLz{AM*esP9< z02JBnX%+7KFsCNlolIPsY4>DY8c%P@x*m3rSa|n>eZC=Hn)==Tv@hN*{mcqXSn>^q zZ*u6M5AH7K+>0(HTRQ&QA`g;nT#Cm74nX)*-tNrJN=-NcRTimwH9H0AiDPZxe>F4V zyggNUK31s1{p9iMgN;#NtztcaHI)>dK6cj+SPirw`YudA(4B zjzy#x6cLfeI4xI}BGH#7=Dktxipc3r;I_Ca;C{H3@Kq%By|GI9RHo$s36jVa8&S9kl~9JYd+J$JbAV+vlC0DTB6SE**c z`kmIi;bg0_bBU@`?WBpPY)5;6WlAV>vrZJOPvkC7higd@yt^tz6%+;p1PqMsG`vw1 zk3mga1blCn@nQ;;56*{fUhKq#%p940WVaK)bn8Th_$2&Hsu5R3zRn^m)H^oaHMq6f}cqoSJEprlkjn02<}>F4*cyo7vo*~PV={bQ>mm*PaL_DU;J5S_4g7V*oS>dYf#-~8E6 zdvAz94(pSok4)Rwr*5my$%d0-T8WL|52fa@I`R6Ss)H+5MKst`L%K>aBz@;q6lI1R7vm}2OgRm)T?(Qy?Ai4d$8CQC}T8MqrZ%s zrA3LHn5IREqMN3D5($$G2tou5J1pILA`?C+LFfl_Ujr9~fyUuxXI1g%)GhwIe6gOq zIA#XKJ_Gg?eDPl_mj*a3qe!oG07ka&HGHDG(>d?OgtA+s90YCw>03hIK8JsfqZn?? zV=H7{v8IqGm11VMAhRQ6GO-RN80;xKm^))ZmUMfyCZ$=?$qCqH2et(a?UPhwTWSne z-E)_xwp*e;IB%zE6SSZJ?nX@*#tU{Pk0492uP1la<3PaDk!T$eVc+d6j&6R!_OrB4 ztfv$cHgw22DM~YsMY?D;DSVV+3y~EQd{LXdO>`N0{6k<;YrQGJ!F=k3W)11#rc(dzJ4^QP}Jnj47%@&f0WGCP+PC{PtySVHv0 z{5Hm^_xy=FyV*XeaFb80-~pxI!Aec4s=rzKDXx0Sh3}U8h3^E9nW=%sX4e>co~4@z zjfRPfsNaO*8QmArYfR_$#C|=EAZm@s+Rhy6S13Jd#aFQm7RhhY-FoO57*c`cJcz-6w#?YN*hZE#oJv!7{tM*T8i ztLY(fN7h}%G>!`#SpgnK*#Yg{tQ6_{ouXnajh2D-kX(l~DH;qWp5Z4C$h#frXfD5g zjOBb2C7Z$^jAXLY^y9lqTtl5m4%~lSG#9qhcq6m#Y+qB+BpQo1VPAZrt#Fv~SrPe8 zf&h_STS0=yet=~F7%m%%eVWuEHYy!MGBQsC!vk%}VILV}2@L81^o z>=Xw^GcqYR!X=I=q6c>ZY-rqikHGnoAf+}UQA-+5!T6h&h@-&kFqG-jmrmiR4jkP zVp=-ROcvRlRGV_SJi3D4S;F-8FU@5JkuO*68!ATUJ!$NIJ0Q;re^(~P*mk=oRQv74 z^~!E}iGJ_MGWD`c{|TD3t~k-Bc%`~}Kw{SqOvS1z4l?4~*rJuzZp%)(F&$d+%OTxQ zI@|;rb-TUU&w1Q*Y+1}xf3}*H_IfdO0KZci_+tpVWD#ctbn_w7KrbJi?)`_9eUHIh zllr@YQjQvVi3oIF%|YtukP$|60WbB9{3?)3>3a-&h%D*xYNdOnF1-{PPL}CoNg*wB z|CkyAX{Ql;O59s0QO*IBKZJJbaVX#2bLh%i)& z^r*&%TG{xw)ff!k%wz?Dt5D{^E^|AmlgpA}k4x+)?v~_l5I3~)LH1ysjfN+LllsFEktT5A<)!>NjVSdU^g@h+9tTYCcd?Fl z3~5#-*ac;diGQuXoZ`G`^#}hPdU_sIQ9c1dKH?l%mMFo%g1{Ynwyb@A%Lvl}T&BMf zmP*zCMmX8XK7D3957cYY;`iXjCaEesQNM~oV!vVKXii%F9}EY0>zu9hAY%+d8UbY* z;I^(xKK7ij*p!;~F%5o)@oj)K@Rgwjg+3@~dd~6kWelh4OAM<=Khu107ACCHcl^~ z1EXMzcjROzkIpcx+(#K`%nE#%)um-N39WL~V2%_EGM$H>Cu{;ylL$IfWWosdYWmH> z&c;=R&NwUXHHG6gxV3tp7~hE}CWBysJK-uzSGQGkVf7$jz4Fa3Vc2FIu;kt?p8DtCM~w4 z1;v+^6o<|j!KFxi%zMzb-$uX@^`4fAF@YnsppdVH8^^uvhj&ITq1V!|cZCh;!OBKu zW=w(6Q(w*QzUv15{6Tv+xf3RvQ6>>45n05IlQIC}8w&RT8YZ(ZPy8;VmPp@w$s?QF zEPlN#gk$X}scF*)oL7oN-pz~(4I%M7@ByuRLjD2i(yTqD^N%$hbgB{|I#p@1y2Q1L zNm5~wrS6Pub;L-kIUa%MORD$jdm$=4jiOWZRnekT(n)eta|-10;SDm=S&CtjQ+gE* z$;~V)T4BPk|Kl`2p+QtXVrE(_gDk(mA=v=E zeS4k*H`Xo~Xq+8w>hG~2dA+Qi_PYo3zG%I>rOIG&bQy+^0HdtbR+T0?oKcs33g>|a z!BdieKH!=lo<0CUClvp?sp))(Xy=DV=vP<&DtZ$@&3n9Z4*7cTTfkSZ4Ic%nJ zMsue43}XE_Q63y#H1UlFj2n~E!f<-z>2u3TE@N4L^K@w%*;;8H1#05KEz+Q@Sb>(w zLGF9!u@`f+m>;Vr{&+o>>t4BZBpxwS;#NoyC1n~3GNC08+md2W;tcH5xXese?{!BX*qy}{W02PNxxanj z?>!_+izXi4&@q!$_L@3$j3U>L`At@P>HgU|fdML$jvzFezPyL+_Qnod2h*vyN+W4I96L5>if3 zYDykpN~eHyZPG(UBot{BkPt*LQ!!M zLYNzl^GIVQ^8%J9D~)25JXV4e^F{ZkmCAT0JCC?l$9r1(48X=k0P=0@3Iygx-zgjF z+&R_Ta-_d{`Cjs|pq+TAc9jEz9of?ZX4}reJgn|)&`;o{jepmNeaN(3%dpmUq5FoU z6Gt7RwaSq5qb^xmxhzJJteU$P8EOTE`?=!c(>+l-C;t6cKA2sgL&jBpy4lEexG-7m z92%ZStywx`ov{>w8G3|dD{l|}vNURiD> zGm%UWd%*0=vaoJyoCr;M`3tTNvq6M#+urIu-NUkDANgtBm(q=3n{PeFK6Wu{qO2B0 z71R=LHg_?P`Tq2%szf$Dj8#A3Cr5Tt>RXInzp_t)XQ6EJoj^P_pcby3< z5}zA5SH(*AE4>%tEuS!ygD8GHqxsu%0{`Q-<&4p}kt|Z8c#Z1F^1~T3xT6Bbp@#xl z?Pk&n{8v3Y%BOViC-#4j@ z9WjTSN4Si|2o_6+OHz7}`Hx>3FN@w|6QY498|{^cl#P7ac_iRXkx7)=OFK2tsqZ?54dMC*gB%uGIQz`CcV1BZVM`o}%o?$f}}Ih6(2z zK8204eo4ROa<0E>F}WK3f(gX>QZ6G*0tlpS)jw_vB;w!Pk~{QVSh)>6og&UL8$eD| zK_6@M7{Kbi$e)LwbXD=clci5+JGW7|(ywzzc{N=Stez?>jYh>S&OFf4y3rTETf6vl zNcJ}8a@Zk*geaKCQ{nGF8lRvv$V*?a$#Zj}rcHQO9z2w+6+?XXza!X%z|^ z*}M4>dBCJ^Odj+*1F~DdPdVE`8}t9H5}=;-F7=@WJa4>(G&gqG#y}i1rK~iHau11s zbyBb~=@DU%N>rUH90j(wbrM@Onwce6pdNV|Ij?rjq~n&4imJECye?K35`6~PK!2Ne zR2$k_xrg@^KUj}Y2qL@(?a zWC%W5%~-r~p7R^-I!-YnHaFN|)LDeE*@k5Nt|NLNWUhr?e>vESSgDbfZe@sleb$Wp8LtdQ#H$ z6Eg_l+5<@0$X(8W!qH|?kNj+ho~_HU0ObO;$WhCU?O9m5ktI%yzKp2%675k+H#&}+ z+LA!_AO(^^hF_YcHSI#R<46BNK9)#`*H~{E8sz zOkUi#0Mr(y9DPpIpl8vicjQ;J#coe$w?5k=ySKn5s0psco^h+{B^#E6yEBGuz@qPBS4#qmGUnmF0L`Ww82` z%_+KruVYXChSu7d7?(+b1;fWa2+kRjnRD#p(bc?a-0qM*DdOW86< zOvC6ZO_~lCXFtQX{bM$cjG$6MtB}R$3Zyv{DseCA={6(?x~0pnX$3g69&ttc&2j>9 zSjH3OHL1-vYX-;h0hdN{7-{O;Pk?T&cf*SmN(^hD^mtGH*KJ*%{9i1h+HCg*v(!)P z0@@<@>H424OPN;ph4C}7vi3glj6k`xOg3^R2HE5d)CCus2&Enda|1fA#e4cV(;f+z zd9%jEjm#}BTF|XZs>`DEZQ#U+BL|L`E0jB%2>0q7gxxNDZ86~=otLJ_jR-qdxZ>L( zc0ACkkRNg~`k&MsVThQrd40>8wf`mHxdKWT7gF~Q{j{yK$DcFwexNjQ^loM&8aV^v z|4w0+mFwFd0lL0dxXc8f-V)mWqxu$|#gv?ak?Bq+wBdGcz)BL3)5*QWoSpC0pDsbrtOfuMNl`ia zh7(F^7TP$g>6{4*217!t)F)t&FDar9RsW#AyuP-+1Mwofk{WYyR#p?#ymniVpULp; zi9<99vK*!oH*XHV8mWxjXifryUz(wFDl+O3=zctQq+*3*aNd3kwzQ+0Kok6f8V;33 zwS!6lr*Hu>hE|Uu2HW;bWM{ZG8jf58QHPskH8R&-MHLC^+U<3XFrmtEh{xFB3qv!? zKLAwkv562|DoJYUB}sjs`bsh#SxA;EKX`gz7xM#XGC5rLP@btso6_Gywyduo1j=;o zPbPr&DI#dKiOnTVg*zN=00Q}u0PX+`_<@T5!mD~T+|Hv&>>I?E4J2OuL5tP}B`l@T zR?G8wsqmFFV?nA;rQP}FI#K+DVCrz13;fSzaL1y?o4c4WwScmN>{1cWW#AZtbsJQ~ zy0yAKOjS=_yzw@Aw9-{(e5P$9RhK07Bf^%o`ejGSC!Ks1%XvExWVyoa5Y;(&Q-N1)B z)M}61r>cl=X7KIQpv8Oak%Os3YRn}#jEek)Mou68n{7_=E_xt?WV%NYCAjP<{5yI( ze8+2OPkY(x6SvKC+ncPfAaO!ThUde5OM~P!Kjdz8SLJdWZ8Yab_kxlX?reO8vnso3 z^e!Q^7y_e^^fTPp0QEDgcNak~uV2VOTRdHJK>Ud0I6aXpt&h^U|9KmO{5zg)3$BfyDi?~A^kXhLf*?t^DN4TEfV&D{kR5t=p8hRM z_l1%?A+r*G)q8P^PhUf81HevgAStj1ruGZ?z@Gxl&?9h6Y8E0%(-EiC$jbQVZ^ z^q&=UMwq(6C*2h$TX>~C;MhTtdK|D&M9ACf^7gEaL6QslONIL$J6VZj%3x*rK^j0a zSOtp3ry!N<_~zU&hYe;sH=CC^cNKJ4{FJ~18p);6Rz&x1B`cyclE^`~%vLcJb|4LZ92(B$-abdiWkgof|6dc{0OB)Ww zGyq!$%;I~s3b#)-nzV73%P97n>Cxtl(mW}>w*8UFasL8sy%@?tEd)w0M!e=;C(>9s zvDH35)Ote#Bu|?p&#ub@xkLO1&*$;Km%Z@D0Susmq_tW9gqcspo_$u(spF*xpP9Gb zf1*>?PmM3uyC3LL^a35xrGl(y>ajKq7UcXz8!3WQBr9yBm=ClQf_8|DwG5K%Z(@QBxyTg?j^)FvrC$notkI;b7l zv^FT17!=Di;;|w{+VA1pYE0Z3+e|akl-erUD$8Gw<@FWff?2=Um-IL{2*=jaauc4~ z(kd>y|8_9{B4x(f-Ui)|X>LI<9#2e9QWYhf6Tjl{7{W@l{FiCT27xw#pWxW$DnV&p zzXz!Kco%Q34?m*upIn-A?^(RgbXvQ2V}HO1d)bl>5Gretdo9;+j_RFtF4bp>+gx(bW| zWL(*cIA5TZieHQBx9ter3&XFd{eeN2w5aiu+qh-a9wRim<~Y8H%-sehU1COhyJdkw zfq97smg|p>2Bn>CFQ*k+*)rK++;rojQ+dA;Fjk2j*12r)S1!J~aS^m%mr{DU4br>x z+q0U0L!WZts{v>v9-v7LeKH=NYv7d%Xv8`Yu7yu;?$>jt-DXp@?~F`c<}%itmKHY| zG*0T@`Fh9~3R+9a1NhMeR_pUo0S0hKY2%6<*a_V4e3H|3XgNfb(aJ#K{uyI;#l7Lh zA}Yg7ON0`xdjY6MwDd0Ps@gm&%w;q;V{#JS4BUCA%YcU$lq4SnLa7Z5bm}kRv5XjX zdtX57zf9N7#SL#1zPVMF>+fRr~;SQQz3DM}ci>lx1OQdVT# zrm-!5Vv*u@#HlrHk@6YotO1v!D@A;$Sgek@76tegh3gI-N$^Cmb(aAFB9}_B$S5~CBu!)?a=yRGp~9C^yMPWRrUBZKYaGx z`FraP8a#8`6@ElK4O9ex0>3xCVK?@cjf`NHhjfdSoH8%(ejPGikWbTCg0 z^!RNA7Eq=n5Ax}t9X3CHvLbTtz*3&*4;ymj>%}x9GMt#RWfrb!RRfeF8qJEQl=GU7 zN3gW_i{G_G@2bsgA9E_gJH7-yBT5mi3=sXkr_8+d<}|5;DuFa_>|Dl;-k1m5%MzM% z)s4t^tj#bx+|)){4;oey#>V#u0RTQ6Pkf)`rAK%+tGAw4I~#9MkK_kLaQ=c*d8DM} zj3t=5%@qnb7VrS{_QY1oSEpB{sGjDHW^mL2Yzd%)x#i^koda72 z@YW>nL#S(bqCK-d`JM9|+Cb^%XeZ?8S#6 z>cA^UR0W8Za579e^a&857EdL2*5$=xvbUV$Fap-v7*8t3p~zt z#Sve(`(hdl6=r@Vhb}nv=;#^tfS`x6-f4-urx4X!aiEmJ=JWF48Itt(IXKE}+c~E? z5kB{FZVT@7G^Pd{p&S3`2fLY1S<7LV+w2|$torWqiXF{tN92FYPK|T%Ly_0+zn>&C;jM!&53w`m|>SJ==|4`-PlGTvY&jL6WX#4Md6BrMhg4 z`=W$_zxbh9o>JT~d0Q~?k!*J|m{WTw+|6+t!q#+9-kAlqq{|pFt#Vd72JbB9cMi-hqWKcU z5I?fiQ?ZqS@Dg)!IEZ~fkUdo?y#^q!zE~-gh$_np33a${I}6T8khAWH!NQq$S{D78 zw=%5Ow4LFtAf;o0O%-;@GLZPbubXKU4b<`$0X=G9W);J87($X!;*t-r=OlWtLM|Zmo^85e1b4@24(N$@wMdM_6=&?e$@%$qKtF_6 zLeo}Sv5^BEG^meV<;$!`ljIfi^VWouND6KG*lN9O$|d_9CBXAHLoc}1maFX`xx4ok)oJ9h=K4R%%f*2+yvPbB@G|mUqJ1I z-wOZb*DP}gqhZ%0!D)oipa>>N>OoO({2Ia)x@xpBB6ncFuqX}0{$k=U`r{ybizy*` zWlINJo4+oyAv;nOj}mmn$@=q1fkdLK)7$8@C7l6NoEdpObqDUn?|eos0lcZaoGojH zLG4K&#m}b?J%3sJ>fsY`M~Gj=yUe5v&*`va${Az^uvaZF6gn?tH*W1Ci0L$wBmjl1 zC9{xw_ltJ-_~CQB-@J@R7?eLmB3K!KAT`tRgLsM+5E2mvpQ})3LEwzYl?*XI@q4VK zN%Oju~v6%#%8FTaqDdQ|<|E zKxnsTO~#{};GnyU`$yPtmF1UdJyEbJoHUVYxB`MsfG*7M{aMK`tdfj#!wxh?9`^1s zv($EpS$67o-+f8_7fSw*q*l`mk>tDE!`_*2=OgV|>S+hqD=vl3r1jYk^RIT;q8d0c6!sajm54UIjD%KRPSu2U>3km)DK#Ajt_*aApBhH9mYy0p+6vUuXkQyhs-PZ|F-8D2AkPEBY4X z_s~HTRbZ`gS-?+vYbj|#iF@jtuKLEKAutMi1B6gO&(Sgj&c00SV92R0e{F)+$ z13wNwK9t;xA9e0cyv13)(6wMVbO3c%dd)hCcg>nCm?&8w5mtiaheYc)umQqhm(<@> zg*^4EOL&eCX*G<9DV0PJjXO(f{P&U1rmf0!o*H z0`ZxPWh+&kr|7TJvfE@VQe7Wj89gZI2Rx68NbJqC`=S8Qb-JQXw=6PAR4*okaUJ+RX0ir%nvxttfdRfR*XsgVPj88_DEah3?p1RGQL{X8pfLJt&F54$6JTUl2 z1RK^VyzAEIx)di(vXP)YdcGi~Zyy^y(Ywt80H5nD{GFbRvRM8u503N7Q3EVBA}ah3 zbXOBt!=38)9>1SfEAq(i+agyh*Z0L^py!aV*IE!^?vHgSmD%C>!C5(@SDM{emJL78 z;VkR$fRF>BWJf2IBFQFhgBsizpVC;@#P$J$^%^;-sj}Tn#f`RaeV)u7ue+;HIjas{ z8iy7HpABy4uh;#^`*Fw9eNFrsswKjQ@V+)G>b+|7mGQ+>XX~_n)^6Qkh@7`OITQ6< z@64sOZE*y~g*7rtWNtaK=dgj`b;S4N}i zftG+KhjOa^Jwo@zs(&`HwjIyO#;;y$`di6# zP4YxN6Oz>2BqK(51-P~AB-=v@^S&w0Kis;e`E#pAz@R?;@`tk2=`mm2)8JEPgUhp; zB6HC$s_zG_J{+4P%udYjy)EIl2ajvo*rSIA_qn|At4kcH+Sq-fCqdIIl0=Z`^Wf|c zjr1K;@iLytEYpjI6nJP+Bo{^p_g+pK&M|D|y;aPOr*h=HLUteK;WsqH z?Y2oqQ*f#LsACeo^z6C^Kco#yJic63T_$%oEotg}gec8K(ZoD6N7ea7)ISb}wf;5c z>*!?tc1L)?k0E>c{jU`jV~k|8NDtFUzJ%w%<&Rv$+mhjbjS+$^X7b4_A9<8MazC$a zUVjr*w)mmNDdg|DN#kku8KxiuJ9&(u>)L_$q2orLM-o-|)Q=?Cc8-6sX_$MS5u0ra zUR0y!uwVZ%#sdQ0F@it=v#UGppzT&)g&q*>HqkHq3fO8aMb`6Ey8($Ru2 zZ-&iyR0s2Pm&rzaCp3$;jZjSE^u{qe(~IKTi-qm!-!1)BmB6)mm82>5-&CqGTZK#F z`ko=_Hw8UCaRb^_EbWh%tYcjJ(q2u!G!z8NS(7^L>NxYuUk*~k+MscL!(wxorXKus zDNt^BI*R+yfV|4!XjR=z#q*6X z%0qqd8>lPPizS?Ozt3<7RxyRE3F~}=>zU@Ap`jOsV_P_QB+zU1%z z#Zgf=TW*O5>!(eq!B=LsuHI0v8SE>}Z$44OGk!17qjdL$+xM9_5<@c>NyJ@lntu!H zR8nytWT984YWm@0w*bwG_q&eVS89+p<)^W&m#pQqqThGN_i+?3LsT!TK3@1ogrS*k zKAT{Ukp!A3u@F01%xUCMv7sl-8LND;Wbsw?Gke+mr@Z}}aD{7`eY&N(WvH}Q0Tr@a zmu~Mg4tb@6x0PEviAo*d!YWAhNP%~~)H$(g^(@@G+wx40)1+C7m3t{i!`4&(bQTrw zl{r&q|9OIvP^cE;)Q z0R4}tW-gH>$+Q#m!gr^{dJqQn^N(_6w5pCf%j(|rSIy%65|`}%HLRHZFJLQ~EfuXC z9+}D2=4GFGu{kHORhJ&DJA(bhQ)r^xB8sf*&SfYa!)65pCWNc!M6OM!&y5L(>fw~2 z_nHcJAwg!dZDAh_Bvd~Q>htOY|0hM0k7DVO=baMK*PKuCV04t$TRhe~x;~zAcjLsG zg9HMjE9{ZrXyfT%y8*)%`2RwhNZ*NLaZ6-D4{>e#t0n`tuu!u6%d5Drx^#zG#_VL( zGm4XHMW)S5Xz6a_@%4IefF>5^Z!+dt{Ky#PF&qyqd828}9LfIW8Ulllu$exa7}PI_ z&C9s_p^>kDSz=Tp@v(G(Nf9%U<%~`F>*F4{=%8cUuT1!ZIfRI*v!-z1$e2B{Ib@if z+p8z)y$7zQ(iX+%y}+w^J(gX~xovE7;tGRS3bqsC`fL(Xw(nu0tGf?lqhGi>EW4;K zi^Six1&f9q%C^S(lSj`8O_qkUp{AR%R1*9?0fck7C{3r==WCtXvJ? zDxQ`(1#|V%CQA#mz)w|mat)Ue7|8-JhYxP4Gz;*8#~pZ13ps()2)pL+ftvd7oBV&j m8$7X20RL)DBdk-R_E_UyHkX~$5uZN*J`g5W#xD%7#rzLscR}C) literal 0 HcmV?d00001 diff --git a/accepted/2020/net5/pic02.png b/accepted/2020/net5/pic02.png new file mode 100644 index 0000000000000000000000000000000000000000..ae8d452546c1d43c540bfe4b565ae059b11e8804 GIT binary patch literal 63221 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 HeDXg4K^BSh literal 0 HcmV?d00001 diff --git a/accepted/2020/net5/pic05.png b/accepted/2020/net5/pic05.png new file mode 100644 index 0000000000000000000000000000000000000000..0886ab665bddf877a0144f57c71872fb400bee08 GIT binary patch literal 5896 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 Date: Fri, 14 Feb 2020 11:35:47 -0800 Subject: [PATCH 02/38] Add link to video --- accepted/2020/net5/net5.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index ed5eb7420..bc60ca798 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -1,6 +1,7 @@ # Target Framework Names in .NET 5 -**PM** [Immo Landwerth](https://github.com/terrajobst) +**PM** [Immo Landwerth](https://github.com/terrajobst) | +[Video Presentation](https://youtu.be/kKH8NzvtENQ?t=694) We'd like to drastically simplify the framework names (TFMs) developers must use in project files and NuGet packages. This includes merging the concept of .NET 5 From 2314c3326cc3d8972a432bf0817ee95462da3d72 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 14 Feb 2020 11:42:14 -0800 Subject: [PATCH 03/38] Call out the desire to persis min OS version --- accepted/2020/net5/net5.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index bc60ca798..3af941f59 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -428,8 +428,10 @@ binary for multiple versions of an operating system. The calls to APIs introduced in later versions must be guarded, but this is generally understood, and we have some limited tooling already with plans to extend it. -Also, this isn't possible on any of our TFMs today, except for Android and we -believe it's acceptable there. +However, we do want to allow the developer to express a minimum version they +require for the OS. It will likely be a property in the project file that is +being persisted in the resulting NuGet package as well. There is a separate doc +that we're working on. ### Why is there no TFM for Blazor? From f5a603282f489013ae7238624fa342e7811e52ba Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 21 Feb 2020 11:11:44 -0800 Subject: [PATCH 04/38] Apply typo fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Joël Tankam Co-Authored-By: Nick Craver Co-Authored-By: Kai Eichinger Co-Authored-By: Shawn Rothlisberger Co-Authored-By: Maira Wenzel Co-Authored-By: Yaakov Co-Authored-By: Joseph Musser Co-Authored-By: FreddyD-GH <12990709+FreddyD-GH@users.noreply.github.com> --- accepted/2020/net5/net5.md | 52 +++++++++++++++++++------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 3af941f59..b73e7041d 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -68,7 +68,7 @@ via a new syntax: flavors of .NET 5 that include `net5.0` plus OS-specific bindings. NuGet should use this next syntax to automatically understand that `net5.0` can -be consumed from net6-win (but not the other way around). But more importantly, +be consumed from `net6-win` (but not the other way around). But more importantly, this notation will also enable developers to intuitively understand compatibility relationships because they are expressed by naming, rather than by mapping tables. Yay! @@ -77,12 +77,12 @@ mapping tables. Yay! ### Vary implementation -Ida is working on an Xamarin Forms application that supports Android, iOS, and +Ida is working on a Xamarin Forms application that supports Android, iOS, and Windows. Her application needs GPS information, but only a very limited set. Since there is no portable GPS API, she writes her own little abstraction library using multi-targeting. -By doing so she's able to encapsulate the GPS access without having to +By doing so, she's able to encapsulate the GPS access without having to multi-target her entire application, just this one area. ```C# @@ -120,8 +120,8 @@ public static class GpsLocation Ada is a developer on SkiaSharp, a cross-platform 2D graphics API for .NET platforms based on Google's Skia Graphics Library. The project is already using multi-targeting to provide different implementations for different platform. To -make it easier to use, she's adding a new `SkipSharpImage` type, which -represents a bitmap and be constructed via OS-provided data types. Ada uses +make it easier to use, she's adding a new `SkiaSharpImage` type, which +represents a bitmap and is constructed via OS-provided data types. Ada uses `#if` to expose different constructors on different platforms: ```C# @@ -252,7 +252,7 @@ Specifically: ### TFMs are a closed set -One question is whether third parties can extend the TFM space (i.e. the part +One question is whether third parties can extend the TFM space (that is, the part after the dash) without having to rely on changes in NuGet/MSBuild. Due to the expansion of short name into TFI & TFM this would be non-trivial. @@ -264,8 +264,8 @@ prefer to have the specific list of names that are expanded by NuGet. Due to the fact that we're planning to bump the major version every year, we have to think about what will happen with version parsing in case of two digit version numbers, such as `net10`. Since `net10` already has a meaning (.NET -Framework 1.0) we need to keep it that way. To avoid suprises, we'll by default -use dottet version numbers in project templates to push developers towards being +Framework 1.0), we need to keep it that way. To avoid surprises, we'll by default +use dotted version numbers in project templates to push developers towards being explicit. | Framework | Identifier | Version| Comment @@ -279,7 +279,7 @@ explicit. * TODO -Today, impliicit `#if` conditions get generated based off the +Today, implicit `#if` conditions get generated based on the `TargetFrameworkIdentifier`, so users today have: ```C# @@ -288,11 +288,11 @@ Today, impliicit `#if` conditions get generated based off the #endif ``` With this proposal, the `#if NETCOREAPP` condition will still be available when -targeting `net5`, `net6`, etc and will also be turned on for `netcoreapp2.1`, +targeting `net5`, `net6`, etc. and will also be turned on for `netcoreapp2.1`, `netcoreapp3.1`, etc. Is that intended? Do we want a new implicit condition that -is versionless but targets all TFMs above `net5`? i.e. `#if NET`. +is versionless but targets all TFMs above `net5`? That is, `#if NET`. -### Persisting pre-requisites +### Persisting prerequisites We need to require a minimum version for the iOS/Android/Windows SDKs. @@ -308,7 +308,7 @@ This work is captured [in this document](https://microsoft.sharepoint.com/:w:/t/ Everything that is universal or portable to many platforms will target `net5`. This includes most libraries but also ASP.NET Core and EF. -Platform-specific libraries would target platform-specific flavors, for example, +Platform-specific libraries would target platform-specific flavors. For example, WinForms and WPF controls would target `net5-win`. Cross-platform application models (Xamarin Forms, ASP.NET Core) and bridges @@ -327,8 +327,8 @@ There are some places in the IDE where targeting information is displayed: | Rule | Affected UI | |----------------------------------------------------------------------------------------------|--------------------------------------------------------------------| -| For most UI, we should use the TFM short name (e.g. `netcoreapp3.1`, `net5`, or `net5-ios`). | Solution Explorer Editor, Context Switcherm Debug Context Switcher | -| For cases, where we use branded display names, we should use the name .NET 5. | Project Properties | +| For most UI, we should use the TFM short name (for example, `netcoreapp3.1`, `net5`, or `net5-ios`). | Solution Explorer Editor, Context Switcherm Debug Context Switcher | +| For cases where we use branded display names, we should use the name .NET 5. | Project Properties | ### Related work @@ -385,7 +385,7 @@ We believe this isn't the right approach for two reasons: types which might change over time (think `Task` or `Span)`, so not every combination can work. -We believe it's much easier if we enable code to use multi-targeting (i.e. +We believe it's much easier if we enable code to use multi-targeting (that is, compile the same code for multiple platforms, like we do today. ### Is .NET 5 a superset of .NET Framework 4.x? @@ -400,7 +400,7 @@ Framework and will be supported, but we already said we'll no longer add new features to it. Thus, new apps should start on .NET Core. By branding it as .NET 5, this -recommendation is much more obvious to both, existing customers, as well as new +recommendation is much more obvious to both existing customers and new customers. ### Why are the OS specific flavors not versioned by the OS? @@ -419,9 +419,9 @@ There are two reasons why this isn't desirable: Developers will want to target different OS versions from a single code base/NuGet package, but that doesn't mean they will need to use multi-targeting. Multi-targeting is a very heavy hammer. Yes, many people are using it to target -different versions of .NET (e.g. `net45` vs `net461`). But that's not +different versions of .NET (for example, `net45` vs `net461`). But that's not necessarily because `#if` is the better experience, it's because it's simply not -possible any other way, due to .NET runtime constraints (i.e. assembly +possible any other way, due to .NET runtime constraints (that is, assembly references and type/member references need to be resolved by the JIT). This problem doesn't exist for OS APIs. Developers can generally build a single binary for multiple versions of an operating system. The calls to APIs @@ -452,7 +452,7 @@ might not make sense to define net5-wasm. Rather, it would make more sense to define net5-browser. The rationale is that the browser will run WASM in a sandboxed environment which equates to having different native API sets. -Any host that controls the JS runtime (e.g. node.js) could decide to expose +Any host that controls the JS runtime (for example, Node.js) could decide to expose different/less constrained OS, which might give rise to other TFMs, such as net5-node. @@ -477,9 +477,9 @@ the `runtime/` folder. > IOW are we going to have to support both formats moving forward? What about > converting apps? -Generally it does not. The idea I've heard is that all project types will be +Generally, it does not. The idea I've heard is that all project types will be unified to use `Sdk="Microsoft.NET.Sdk"` in order to make multi-targeting -easier. Customizations (e.g. specific targets and references) would be brought +easier. Customizations (for example, specific targets and references) would be brought in via `UseXxx` properties, akin to how Windows Forms and WPF work in .NET Core today. The reason is that in many cases the TFM alone isn't specific enough to decide what kind of app are you building: @@ -489,14 +489,14 @@ decide what kind of app are you building: you using both Windows Forms and WPF? The nice thing about properties is that they naturally compose. If certain -combinations aren't possible, they can relativelly easily be blocked. +combinations aren't possible, they can relatively easily be blocked. However, at this point it's still unclear whether the SDK unification will work this way. One concern was that SDKs also bring in new item groups and might have conflicting defaults for properties; this works today because the SDK can bring in .props before the project file. When we rely on properties in the project -file, we need to bring those in the .targets (i.e. the bottom of the project -file). WHile not impossible, this might force us to have knowledge in the base +file, we need to bring those in the .targets (that is, the bottom of the project +file). While not impossible, this might force us to have knowledge in the base SDK that can't be easily extended via optional components. [@mhutch](https://github.com/mhutch) is working on a document specifically -around SDK convergence. \ No newline at end of file +around SDK convergence. From 811edf1a50ea34c61ace26ed33ca889b5c36d459 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 21 Feb 2020 11:26:34 -0800 Subject: [PATCH 05/38] Fix typo Co-Authored-By: Kai Eichinger --- accepted/2020/net5/net5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index b73e7041d..85c70506b 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -52,7 +52,7 @@ author for today's world: ![](pic02.png) There are a lot of names and version numbers. Knowing who is compatible with who -is impossible with a decoder ring. We've simplified this greatly with .NET +is impossible without a decoder ring. We've simplified this greatly with .NET Standard, but this still requires a table that maps .NET Standard versions to .NET implementation versions. From 5500ba0c125f53905642bd1513f60923f1625e08 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 21 Feb 2020 14:33:46 -0800 Subject: [PATCH 06/38] Replace *** with _** in the hope it fixes the GH renderer --- accepted/2020/net5/net5.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 85c70506b..c07a337cb 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -178,12 +178,12 @@ public static class SkiaSharpImage | | (+everything else inherited from net5) | | | Tizen, Unity... | Will follow the Xamarin model | | -***Open Issue**. In case of Xamarin, there is a discussion of whether the +_**Open Issue**. In case of Xamarin, there is a discussion of whether the convergence with .NET Core will be a breaking change for existing NuGet packages (for example, there is a desire to change their namespaces). In that case, we -should not map it to the existing TFM as that would be pointless.* +should not map it to the existing TFM as that would be pointless._ -***Open Issue**. Will the above scheme work for iPad?* +_**Open Issue**. Will the above scheme work for iPad?_ ### Mapping to properties @@ -196,11 +196,11 @@ There are three existing MSBuild properties: | TargetFrameworkVersion (TFV) | The version number | `2`, `3.0`, `3.1` | | TargetFrameworkProfile (TFP) | The profile | `Client` or `Profile124` | -***Open Issue**. The SDK has this logic duplicated from NuGet because they need +_**Open Issue**. The SDK has this logic duplicated from NuGet because they need to do this during evaluation where they can’t call custom targets. We could make this an MSBuild intrinsic, but that seems like a lot of work. Maybe we just live with the duplication. But bottom line is that we need to make that change in -MSBuild too.* +MSBuild too._ * [@rainersigwald](https://github.com/rainersigwald): We've made it pretty far with duplicated logic, but it results in really ugly MSBuild, since it's not a @@ -225,14 +225,14 @@ We're going to map the new entries as follows: | net5.0-ios | .NETCoreApp | 5.0 | ios | | net5.0-win | .NETCoreApp | 5.0 | win | -***Open Issue**. Please note that `net5.0`+ will map the TFI to `.NETCoreApp`. +_**Open Issue**. Please note that `net5.0`+ will map the TFI to `.NETCoreApp`. We need to announce this change so that package authors with custom .props and -.targets are prepared. Link to DavKean’s doc on how to do it.* +.targets are prepared. Link to DavKean’s doc on how to do it._ -***Open Issue**. We should try to keep the TFI out of the .nuspec file. It seems +_**Open Issue**. We should try to keep the TFI out of the .nuspec file. It seems NuGet uses the long form `.NETFramework,Version=4.5` in the dependency groups. We may want to change NuGet to allow the short form there as well and update our -packaging tools to re-write to short name on pack. +packaging tools to re-write to short name on pack._ Specifically: From b9222bd34b6695580f37d1dadf58ecb5fbf50b58 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 21 Feb 2020 14:44:52 -0800 Subject: [PATCH 07/38] Consistently use dottet version number (except for net4) --- accepted/2020/net5/net5.md | 77 +++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index c07a337cb..d94079f00 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -68,8 +68,8 @@ via a new syntax: flavors of .NET 5 that include `net5.0` plus OS-specific bindings. NuGet should use this next syntax to automatically understand that `net5.0` can -be consumed from `net6-win` (but not the other way around). But more importantly, -this notation will also enable developers to intuitively understand +be consumed from `net6.0-win` (but not the other way around). But more +importantly, this notation will also enable developers to intuitively understand compatibility relationships because they are expressed by naming, rather than by mapping tables. Yay! @@ -165,17 +165,17 @@ public static class SkiaSharpImage | | netcoreapp1..3.1 (warning when WinForms/WPF is referenced) | | | | netstandard1..2.1 | | | net5.0-android | xamarin.android | | -| | (+everything else inherited from net5) | | +| | (+everything else inherited from net5.0) | | | net5.0-ios | xamarin.ios | | -| | (+everything else inherited from net5) | | +| | (+everything else inherited from net5.0) | | | net5.0-macos | xamarin.macos | | -| | (+everything else inherited from net5) | | +| | (+everything else inherited from net5.0) | | | net5.0-tvos | xamarin.tvos | | -| | (+everything else inherited from net5) | | +| | (+everything else inherited from net5.0) | | | net5.0-watchos | xamarin.watchos | | -| | (+everything else inherited from net5) | | +| | (+everything else inherited from net5.0) | | | net5.0-win | netcoreapp1..3.1 | WinForms + WPF and probably WinUI | -| | (+everything else inherited from net5) | | +| | (+everything else inherited from net5.0) | | | Tizen, Unity... | Will follow the Xamarin model | | _**Open Issue**. In case of Xamarin, there is a discussion of whether the @@ -240,14 +240,14 @@ Specifically: pieces and build logic that needs to change in .NET SDK. * **net4x and earlier will continue to use .NETFramework as the TFI**. This - means that net4 and net5 aren't considered compatible by default, but the - compatibility will continue to be handled by the AssetTargetFallback in the - SDK/NuGet restore. + means that `net4x` and `net5.0` aren't considered compatible by default, but + the compatibility will continue to be handled by the AssetTargetFallback in + the SDK/NuGet restore. * **We'll use the existing profile concept to encode the OS selection.** It's worth noting that profiles today make things smaller whereas this use makes things larger. We believe this can be handled in the NuGet layer by using this - rule for net5 and up. While that's not ideal, it reduces the number of + rule for `net5.0` and up. While that's not ideal, it reduces the number of concepts we need to add. ### TFMs are a closed set @@ -288,9 +288,10 @@ Today, implicit `#if` conditions get generated based on the #endif ``` With this proposal, the `#if NETCOREAPP` condition will still be available when -targeting `net5`, `net6`, etc. and will also be turned on for `netcoreapp2.1`, -`netcoreapp3.1`, etc. Is that intended? Do we want a new implicit condition that -is versionless but targets all TFMs above `net5`? That is, `#if NET`. +targeting `net5.0`, `net6.0`, etc. and will also be turned on for +`netcoreapp2.1`, `netcoreapp3.1`, etc. Is that intended? Do we want a new +implicit condition that is versionless but targets all TFMs above `net5.0`? That +is, `#if NET`. ### Persisting prerequisites @@ -305,14 +306,14 @@ This work is captured [in this document](https://microsoft.sharepoint.com/:w:/t/ ### What would we target? -Everything that is universal or portable to many platforms will target `net5`. +Everything that is universal or portable to many platforms will target `net5.0`. This includes most libraries but also ASP.NET Core and EF. Platform-specific libraries would target platform-specific flavors. For example, -WinForms and WPF controls would target `net5-win`. +WinForms and WPF controls would target `net5.0-win`. Cross-platform application models (Xamarin Forms, ASP.NET Core) and bridges -(Xamarin Essentials) would at least target `net5` but might also additionally +(Xamarin Essentials) would at least target `net5.0` but might also additionally target platform-specific flavors to light-up more APIs or features. This approach is also called bait & switch. @@ -325,10 +326,10 @@ There are some places in the IDE where targeting information is displayed: ![](pic05.png) ![](pic06.png) -| Rule | Affected UI | -|----------------------------------------------------------------------------------------------|--------------------------------------------------------------------| -| For most UI, we should use the TFM short name (for example, `netcoreapp3.1`, `net5`, or `net5-ios`). | Solution Explorer Editor, Context Switcherm Debug Context Switcher | -| For cases where we use branded display names, we should use the name .NET 5. | Project Properties | +| Rule | Affected UI | +|----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| +| For most UI, we should use the TFM short name (for example, `netcoreapp3.1`, `net5.0`, or `net5.0-ios`). | Solution Explorer Editor, Context Switcherm Debug Context Switcher | +| For cases where we use branded display names, we should use the name .NET 5. | Project Properties | ### Related work @@ -349,10 +350,10 @@ this and make it a key capability that is available out-of-the-box. ### Why can't we just have a single TFM for .NET 5? Moving forward, we can assume that the base class library (BCL) of .NET is the -same across all environments of .NET. One can think of net5 as .NET Standard but -with an implementation (.NET Core). +same across all environments of .NET. One can think of `net5.0` as .NET Standard +but with an implementation (.NET Core). -However, net5 will not include .NET projections of OS APIs, such as: +However, `net5.0` will not include .NET projections of OS APIs, such as: * WinRT * iOS bindings @@ -407,14 +408,14 @@ customers. There are two reasons why this isn't desirable: -1. **It results a combinatorial explosion**. A TFM in the form of `net5-win7` +1. **It results a combinatorial explosion**. A TFM in the form of `net5.0-win7` would (syntactically) make any combination of .NET and OS possible. This raises the question which combinations are supported, which puts us back into having to provide the customer with a decoder ring. 2. **It can make asset selection ill-defined**. Suppose the project is - targeting `net7-win10`. The package offers `net5-win10` and `net6-win7`. Now - neither asset would be better. + targeting `net7.0-win10`. The package offers `net5.0-win10.0` and + `net6.0-win7.0`. Now neither asset would be better. Developers will want to target different OS versions from a single code base/NuGet package, but that doesn't mean they will need to use multi-targeting. @@ -437,24 +438,24 @@ that we're working on. Based on conversations with the Blazor team we decided to not create a TFM for WASM in the browser. That's because Blazor wants agility where code can -transparently work on client and server. Thus, they will continue to use `net5`. -The browser-specific APIs will be delivered as a NuGet package, using RIDs to -provide a throwing and non-throwing implementation. Other parties will have to -do the same thing. +transparently work on client and server. Thus, they will continue to use +`net5.0`. The browser-specific APIs will be delivered as a NuGet package, using +RIDs to provide a throwing and non-throwing implementation. Other parties will +have to do the same thing. -### ~~Why is the TFM called net5-browser and net5-wasm?~~ +### ~~Why is the TFM called net5.0-browser and net5.0-wasm?~~ *No longer applicable as we won't have a TFM for Blazor.* WASM isn't a platform (in the OS sense) as much as it is an instruction set architecture, so it's better to think of WASM as something like x86/x64. So, it -might not make sense to define net5-wasm. Rather, it would make more sense to -define net5-browser. The rationale is that the browser will run WASM in a +might not make sense to define `net5.0-wasm`. Rather, it would make more sense to +define `net5.0-browser`. The rationale is that the browser will run WASM in a sandboxed environment which equates to having different native API sets. Any host that controls the JS runtime (for example, Node.js) could decide to expose different/less constrained OS, which might give rise to other TFMs, such as -net5-node. +`net5.0-node`. ### What about native dependencies? @@ -484,8 +485,8 @@ in via `UseXxx` properties, akin to how Windows Forms and WPF work in .NET Core today. The reason is that in many cases the TFM alone isn't specific enough to decide what kind of app are you building: -* `net5`. Is a class library/console app, an ASP.NET Core app, or a Blazor app? -* `net5-win`. Are you building a Windows Forms app, a WPF app, or a UWP app? Are +* `net5.0`. Is a class library/console app, an ASP.NET Core app, or a Blazor app? +* `net5.0-win`. Are you building a Windows Forms app, a WPF app, or a UWP app? Are you using both Windows Forms and WPF? The nice thing about properties is that they naturally compose. If certain From 25af800d59b3823484d458016ab26cdf5d0ad4d3 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 21 Feb 2020 14:51:07 -0800 Subject: [PATCH 08/38] Replace "short name" with "friendly name" --- accepted/2020/net5/net5.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index d94079f00..55bd94267 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -191,7 +191,7 @@ There are three existing MSBuild properties: | Property | Meaning | Examples | |---------------------------------|--------------------|----------------------------------| -| TargetFramework (TFM) | The short name | `net4`, `netcoreapp3.0` | +| TargetFramework (TFM) | The friendly name | `net4`, `netcoreapp3.0` | | TargetFrameworkIdentifier (TFI) | The long name | `.NETFramework` or `.NETCoreApp` | | TargetFrameworkVersion (TFV) | The version number | `2`, `3.0`, `3.1` | | TargetFrameworkProfile (TFP) | The profile | `Client` or `Profile124` | @@ -231,8 +231,8 @@ We need to announce this change so that package authors with custom .props and _**Open Issue**. We should try to keep the TFI out of the .nuspec file. It seems NuGet uses the long form `.NETFramework,Version=4.5` in the dependency groups. -We may want to change NuGet to allow the short form there as well and update our -packaging tools to re-write to short name on pack._ +We may want to change NuGet to allow the friendly name there as well and update +our packaging tools to re-write to friendly name on pack._ Specifically: @@ -252,9 +252,9 @@ Specifically: ### TFMs are a closed set -One question is whether third parties can extend the TFM space (that is, the part -after the dash) without having to rely on changes in NuGet/MSBuild. Due to the -expansion of short name into TFI & TFM this would be non-trivial. +One question is whether third parties can extend the TFM space (that is, the +part after the dash) without having to rely on changes in NuGet/MSBuild. Due to +the expansion of friendly name into TFI & TFM this would be non-trivial. We may open this up in the future, but for now the consensus was that we'd prefer to have the specific list of names that are expanded by NuGet. @@ -326,10 +326,10 @@ There are some places in the IDE where targeting information is displayed: ![](pic05.png) ![](pic06.png) -| Rule | Affected UI | -|----------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| -| For most UI, we should use the TFM short name (for example, `netcoreapp3.1`, `net5.0`, or `net5.0-ios`). | Solution Explorer Editor, Context Switcherm Debug Context Switcher | -| For cases where we use branded display names, we should use the name .NET 5. | Project Properties | +| Rule | Affected UI | +|-------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| +| For most UI, we should use the TFM friendly name (for example, `netcoreapp3.1`, `net5.0`, or `net5.0-ios`). | Solution Explorer Editor, Context Switcherm Debug Context Switcher | +| For cases where we use branded display names, we should use the name .NET 5. | Project Properties | ### Related work From 8338495170b4e297c9dbabff7c568e788ead32e7 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 21 Feb 2020 14:56:34 -0800 Subject: [PATCH 09/38] Remove WinUI and UWP to avoid any confusion There is no publicly communicated plan around UWP/WinUI and .NET 5, so release time lines are entirely speculative. --- accepted/2020/net5/net5.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 55bd94267..5d76e23cf 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -174,7 +174,7 @@ public static class SkiaSharpImage | | (+everything else inherited from net5.0) | | | net5.0-watchos | xamarin.watchos | | | | (+everything else inherited from net5.0) | | -| net5.0-win | netcoreapp1..3.1 | WinForms + WPF and probably WinUI | +| net5.0-win | netcoreapp1..3.1 | WinForms + WPF | | | (+everything else inherited from net5.0) | | | Tizen, Unity... | Will follow the Xamarin model | | @@ -486,8 +486,8 @@ today. The reason is that in many cases the TFM alone isn't specific enough to decide what kind of app are you building: * `net5.0`. Is a class library/console app, an ASP.NET Core app, or a Blazor app? -* `net5.0-win`. Are you building a Windows Forms app, a WPF app, or a UWP app? Are - you using both Windows Forms and WPF? +* `net5.0-win`. Are you building a Windows Forms app or a WPF app? Are you using + both Windows Forms and WPF or just one? The nice thing about properties is that they naturally compose. If certain combinations aren't possible, they can relatively easily be blocked. From a8c06c98a96db26c21b9f4bef9a5b9d5fa8423d2 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 21 Feb 2020 15:16:34 -0800 Subject: [PATCH 10/38] Fix line breaks --- accepted/2020/net5/net5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 5d76e23cf..ef2daac23 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -287,6 +287,7 @@ Today, implicit `#if` conditions get generated based on the #elif NETFRAMEWORK #endif ``` + With this proposal, the `#if NETCOREAPP` condition will still be available when targeting `net5.0`, `net6.0`, etc. and will also be turned on for `netcoreapp2.1`, `netcoreapp3.1`, etc. Is that intended? Do we want a new @@ -463,7 +464,6 @@ We don't plan to support varying API surface based on runtime characteristics (x86/x64, AOT/JIT etc). This will continue to be supported via the `runtime/` folder. - ### Will the new TFMs simplify the project files too? [@cartermp](https://github.com/cartermp) asked: From c041a0359583e3beb7b7bf48f9e9697c16b14a68 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Wed, 26 Feb 2020 13:46:28 -0800 Subject: [PATCH 11/38] Externalize link --- accepted/2020/net5/net5.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index ef2daac23..e9ad00f4a 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -303,7 +303,7 @@ We need to require a minimum version for the iOS/Android/Windows SDKs. version number - We'd need something with a version number -This work is captured [in this document](https://microsoft.sharepoint.com/:w:/t/DotNetTeam/EavsPfFy7lFLh7eQrdMN8QwBl05cGLPwrSzJeT8vEu32mw?e=knNQ6W). +This work is captured [in this document][os-versioning]. ### What would we target? @@ -501,3 +501,5 @@ file). While not impossible, this might force us to have knowledge in the base SDK that can't be easily extended via optional components. [@mhutch](https://github.com/mhutch) is working on a document specifically around SDK convergence. + +[os-versioning]: https://microsoft.sharepoint.com/:w:/t/DotNetTeam/EavsPfFy7lFLh7eQrdMN8QwBl05cGLPwrSzJeT8vEu32mw?e=knNQ6W \ No newline at end of file From 494aaa930063fc47e681f7a603d6ff96a22f3357 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Wed, 26 Feb 2020 13:47:01 -0800 Subject: [PATCH 12/38] Fix typos --- accepted/2020/net5/net5.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index e9ad00f4a..409852cb4 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -329,7 +329,7 @@ There are some places in the IDE where targeting information is displayed: | Rule | Affected UI | |-------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| -| For most UI, we should use the TFM friendly name (for example, `netcoreapp3.1`, `net5.0`, or `net5.0-ios`). | Solution Explorer Editor, Context Switcherm Debug Context Switcher | +| For most UI, we should use the TFM friendly name (for example, `netcoreapp3.1`, `net5.0`, or `net5.0-ios`). | Solution Explorer Editor, Context Switcher, Debug Context Switcher | | For cases where we use branded display names, we should use the name .NET 5. | Project Properties | ### Related work @@ -468,7 +468,7 @@ the `runtime/` folder. [@cartermp](https://github.com/cartermp) asked: -> Does specifiying `net5.0-win` obviate the current three things you need to +> Does specifying `net5.0-win` obviate the current three things you need to > specify? > > * netcoreapp3.x From c4309a0030168d538ef7cac708349f80c0744456 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Wed, 26 Feb 2020 13:47:35 -0800 Subject: [PATCH 13/38] Call out why the TFI is mapped .NETCoreApp --- accepted/2020/net5/net5.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 409852cb4..37deb6cbb 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -502,4 +502,23 @@ SDK that can't be easily extended via optional components. [@mhutch](https://github.com/mhutch) is working on a document specifically around SDK convergence. +### Why is .NET 5.0's TFI still mapped to `.NETCoreApp`? + +In MSBuild you can't easily do comparisons like + +```xml + +``` + +because that would be a string comparison. Rather, you need to do comparisons +like this: + +```xml + +``` + +By us mapping `net5.0` we break less of that code because existing code will +treat it correctly (i.e. as a future version of .NET Core) and also avoid +misclassification as .NET Framework. + [os-versioning]: https://microsoft.sharepoint.com/:w:/t/DotNetTeam/EavsPfFy7lFLh7eQrdMN8QwBl05cGLPwrSzJeT8vEu32mw?e=knNQ6W \ No newline at end of file From e88b4c22b238a7ff6c782ff6c4238254b45b687d Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Wed, 26 Feb 2020 13:48:50 -0800 Subject: [PATCH 14/38] Include more details around OS requirements --- accepted/2020/net5/net5.md | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 37deb6cbb..7cc80fc5b 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -407,7 +407,7 @@ customers. ### Why are the OS specific flavors not versioned by the OS? -There are two reasons why this isn't desirable: +There are a couple of reasons why this isn't desirable: 1. **It results a combinatorial explosion**. A TFM in the form of `net5.0-win7` would (syntactically) make any combination of .NET and OS possible. This @@ -418,6 +418,25 @@ There are two reasons why this isn't desirable: targeting `net7.0-win10`. The package offers `net5.0-win10.0` and `net6.0-win7.0`. Now neither asset would be better. +3. **A single version isn't enough**. Logically, you need at least two version + numbers to support OS targeting: + + * *Minimum OS API Level*. Consumers of the library must use an SDK that + support this version, or a higher version. This allows library authors + to use types from the OS bindings in their public API surface without + causing type resolution issues for the consumer. + + * *Minimum OS version*. For OS calls, it's common to guard OS calls with + version checks. This allows library authors to light up for later OS + versions without having to produce multiple binaries. In order for that + to be sound, a project generally cannot have lower version than whatever + its libraries support. + + Some platform, such as Android, also have the notion of a *targeted OS + version* that indicates to the OS what behavior the author tested for. When + running on a later OS version, the OS might "quirk" the behavior to preserve + backwards compatibility. + Developers will want to target different OS versions from a single code base/NuGet package, but that doesn't mean they will need to use multi-targeting. Multi-targeting is a very heavy hammer. Yes, many people are using it to target @@ -430,10 +449,17 @@ binary for multiple versions of an operating system. The calls to APIs introduced in later versions must be guarded, but this is generally understood, and we have some limited tooling already with plans to extend it. -However, we do want to allow the developer to express a minimum version they -require for the OS. It will likely be a property in the project file that is -being persisted in the resulting NuGet package as well. There is a separate doc -that we're working on. +### How can I ensure my NuGet package/project can express OS requirements? + +We do want to allow the developer to express a minimum version they require for +the OS. It will likely be expressed as additional properties in the project file +that are also being persisted in the resulting NuGet package as well. It's not +decided on whether violating the perquisites will always be an error. For +example, we could decide to make *Minimum OS API Level* an error (because it +might result in compilation errors) while making *Minimum OS version* a warning +(because the consuming project could guard the method calls into the library). + +There is a [separate doc][os-versioning] that we're working on. ### Why is there no TFM for Blazor? From 43567a975b74572d074989c279d0cdfc2c4d56ba Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 28 Feb 2020 15:48:52 -0800 Subject: [PATCH 15/38] Add some clarifications --- accepted/2020/net5/net5.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 7cc80fc5b..0b570a06e 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -430,9 +430,10 @@ There are a couple of reasons why this isn't desirable: version checks. This allows library authors to light up for later OS versions without having to produce multiple binaries. In order for that to be sound, a project generally cannot have lower version than whatever - its libraries support. + its libraries support, unless the consumer guards their calls into that + library. - Some platform, such as Android, also have the notion of a *targeted OS + Some platforms, such as Android, also have the notion of a *targeted OS version* that indicates to the OS what behavior the author tested for. When running on a later OS version, the OS might "quirk" the behavior to preserve backwards compatibility. From 5e74f6c48ef5fdeb85ac69fcef72feae882e4fa5 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 28 Feb 2020 15:59:17 -0800 Subject: [PATCH 16/38] Add section for why there is not net5.0-linux --- accepted/2020/net5/net5.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 0b570a06e..9bf22fe9c 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -529,6 +529,21 @@ SDK that can't be easily extended via optional components. [@mhutch](https://github.com/mhutch) is working on a document specifically around SDK convergence. +### Why is there new TFM for Linux? + +The primary reason for OS specific TFMs is to vary API surface, not for varying +behavior. RIDs allow varying behavior and have support for various Linux +flavors. Specifically, TFMs aren't (primarily) meant to allow calling P/Invokes +under `#if`, most of the time that should be done by doing runtime checks or by +using RIDs. The primary reason for a TFM is to exclude large amounts of managed +representations for OS technologies (WinForms, WPF, Apple's NS APIs, Android +etc). + +Also, Android, iOS, macOS, and Windows share that they offer a stable ABI so +that exchanging binaries makes sense. Linux is too generic of a concept for +that, it's basically just the kernel, which again boils down to the only thing +you can do is calling P/Invokes. + ### Why is .NET 5.0's TFI still mapped to `.NETCoreApp`? In MSBuild you can't easily do comparisons like From 5c2ca38c51505472c1b7c2148b41f1c16b73cfe9 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 6 Mar 2020 18:09:05 -0800 Subject: [PATCH 17/38] Rename `win` to `windows` --- accepted/2020/net5/net5.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 9bf22fe9c..2843e1fb2 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -64,11 +64,11 @@ via a new syntax: technologies that work cross-platform (modulo pragmatic concessions, like we already did in .NET Standard). -* `net5.0-win`, `net5.0-ios`, `net5.0-android`. These TFMs represent OS specific - flavors of .NET 5 that include `net5.0` plus OS-specific bindings. +* `net5.0-windows`, `net5.0-ios`, `net5.0-android`. These TFMs represent OS + specific flavors of .NET 5 that include `net5.0` plus OS-specific bindings. NuGet should use this next syntax to automatically understand that `net5.0` can -be consumed from `net6.0-win` (but not the other way around). But more +be consumed from `net6.0-windows` (but not the other way around). But more importantly, this notation will also enable developers to intuitively understand compatibility relationships because they are expressed by naming, rather than by mapping tables. Yay! @@ -174,7 +174,7 @@ public static class SkiaSharpImage | | (+everything else inherited from net5.0) | | | net5.0-watchos | xamarin.watchos | | | | (+everything else inherited from net5.0) | | -| net5.0-win | netcoreapp1..3.1 | WinForms + WPF | +| net5.0-windows | netcoreapp1..3.1 | WinForms + WPF | | | (+everything else inherited from net5.0) | | | Tizen, Unity... | Will follow the Xamarin model | | @@ -223,7 +223,7 @@ We're going to map the new entries as follows: | net5.0 | .NETCoreApp | 5.0 | | | net5.0-android | .NETCoreApp | 5.0 | android | | net5.0-ios | .NETCoreApp | 5.0 | ios | -| net5.0-win | .NETCoreApp | 5.0 | win | +| net5.0-windows | .NETCoreApp | 5.0 | win | _**Open Issue**. Please note that `net5.0`+ will map the TFI to `.NETCoreApp`. We need to announce this change so that package authors with custom .props and @@ -311,7 +311,7 @@ Everything that is universal or portable to many platforms will target `net5.0`. This includes most libraries but also ASP.NET Core and EF. Platform-specific libraries would target platform-specific flavors. For example, -WinForms and WPF controls would target `net5.0-win`. +WinForms and WPF controls would target `net5.0-windows`. Cross-platform application models (Xamarin Forms, ASP.NET Core) and bridges (Xamarin Essentials) would at least target `net5.0` but might also additionally @@ -409,14 +409,14 @@ customers. There are a couple of reasons why this isn't desirable: -1. **It results a combinatorial explosion**. A TFM in the form of `net5.0-win7` - would (syntactically) make any combination of .NET and OS possible. This - raises the question which combinations are supported, which puts us back - into having to provide the customer with a decoder ring. +1. **It results a combinatorial explosion**. A TFM in the form of + `net5.0-windows7` would (syntactically) make any combination of .NET and OS + possible. This raises the question which combinations are supported, which + puts us back into having to provide the customer with a decoder ring. 2. **It can make asset selection ill-defined**. Suppose the project is - targeting `net7.0-win10`. The package offers `net5.0-win10.0` and - `net6.0-win7.0`. Now neither asset would be better. + targeting `net7.0-windows10`. The package offers `net5.0-windows10.0` and + `net6.0-windows7.0`. Now neither asset would be better. 3. **A single version isn't enough**. Logically, you need at least two version numbers to support OS targeting: @@ -495,7 +495,7 @@ the `runtime/` folder. [@cartermp](https://github.com/cartermp) asked: -> Does specifying `net5.0-win` obviate the current three things you need to +> Does specifying `net5.0-windows` obviate the current three things you need to > specify? > > * netcoreapp3.x @@ -513,8 +513,8 @@ today. The reason is that in many cases the TFM alone isn't specific enough to decide what kind of app are you building: * `net5.0`. Is a class library/console app, an ASP.NET Core app, or a Blazor app? -* `net5.0-win`. Are you building a Windows Forms app or a WPF app? Are you using - both Windows Forms and WPF or just one? +* `net5.0-windows`. Are you building a Windows Forms app or a WPF app? Are you + using both Windows Forms and WPF or just one? The nice thing about properties is that they naturally compose. If certain combinations aren't possible, they can relatively easily be blocked. From 9080304bcdaaaa35eff2924c959c3759eb31b60b Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 6 Mar 2020 21:10:58 -0800 Subject: [PATCH 18/38] Update proposal to allow for OS versions in the TFM --- accepted/2020/net5/net5.md | 422 ++++++++++++++++++++++++++++--------- 1 file changed, 323 insertions(+), 99 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 2843e1fb2..69278010c 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -1,3 +1,6 @@ + + + # Target Framework Names in .NET 5 **PM** [Immo Landwerth](https://github.com/terrajobst) | @@ -38,7 +41,7 @@ their *implementations*. While we strive to provide an experience where you don't have to reason about the different kinds of .NET, we still don't want to fully abstract away the underlying OS, so you'll continue to be able to call OS specific APIs, be that -via P/Invokes, WinRT, or the Xamarin bindings for iOS and Android APIs. +via P/Invokes, WinRT, or the Xamarin bindings for iOS and Android. Now think about developers who start on this stack and can write any application for any of the platforms that .NET provides support for. The branding we @@ -56,19 +59,19 @@ is impossible without a decoder ring. We've simplified this greatly with .NET Standard, but this still requires a table that maps .NET Standard versions to .NET implementation versions. -The proposal is to reuse the existing net TFM and model OS-specific APIs on top -via a new syntax: +The proposal is to reuse the existing `net` TFM and model OS-specific APIs on +top via a new syntax: * `net5.0`. This TFM is for code that runs everywhere. It combines and replaces the `netcoreapp` and `netstandard` names. This TFM will generally only include technologies that work cross-platform (modulo pragmatic concessions, like we already did in .NET Standard). -* `net5.0-windows`, `net5.0-ios`, `net5.0-android`. These TFMs represent OS +* `net5.0-android`, `net5.0-ios`, and `net5.0-windows`. These TFMs represent OS specific flavors of .NET 5 that include `net5.0` plus OS-specific bindings. -NuGet should use this next syntax to automatically understand that `net5.0` can -be consumed from `net6.0-windows` (but not the other way around). But more +NuGet should use this nex syntax to automatically understand that `net5.0` can +be consumed from `net6.0-windows` (but not the other way around). More importantly, this notation will also enable developers to intuitively understand compatibility relationships because they are expressed by naming, rather than by mapping tables. Yay! @@ -119,7 +122,7 @@ public static class GpsLocation Ada is a developer on SkiaSharp, a cross-platform 2D graphics API for .NET platforms based on Google's Skia Graphics Library. The project is already using -multi-targeting to provide different implementations for different platform. To +multi-targeting to provide different implementations for different platforms. To make it easier to use, she's adding a new `SkiaSharpImage` type, which represents a bitmap and is constructed via OS-provided data types. Ada uses `#if` to expose different constructors on different platforms: @@ -141,6 +144,89 @@ public static class SkiaSharpImage } ``` +### Upgrading the OS bindings + +Miguel is building Baby Shark, a popular iOS application. He started with .NET +that supported iOS 13 but Apple just released iOS 14. He downloads the updated +version of the .NET 5 SDK which now also includes support for iOS 14. In order +to gain access to the new APIs that Apple has added, Miguel opens his project +file which currently looks like this: + +```XML + + + + net5.0-ios13.0 + + + ... + + +``` + +He modifies the `` to be `net5.0-ios14.0`. + +### Lighting up on later OS versions + +Miguel doesn't want to cut off his users who are currently on iOS 13, so he +wants to continue to have his application work on iOS 13 as well. To achieve +that, Miguel modifies the project file by adding +``: + +```XML + + + + net5.0-ios14.0 + 13.0 + + + ... + + +``` + +However, since Miguel also uses the new `NSFizBuzz` API that Apple added in iOS +14, he also modifies his source code to check for the operating system version +before calling it: + +```C# +public void OnClick(object sender, EventArgs e) +{ + if (Environment.OSVersion.Version >= new Version(14, 0)) + { + NSFizBuzz(); + } +} +``` + +### Consuming a library with a higher `TargetPlatformMinimumVersion` + +After using `NSFizzBuzz` directly for a while, Miguel notices that these OS APIs +are a bit hard to use, so he looks for a .NET library. He finds +`Monkey.FizzBuzz`, which he tries to reference, which succeeds. However, when +building his application he gets the following warning: + +> warning NU1702: Package 'Monkey.FizzBuzz' was restored using 'net5.0-ios14' +> and has 'TargetPlatformMinimumVersion' of '14.0' while the project has a value +> of '13.0'. You should either upgrade your project to '14.0' or only make calls +> into the library after checking that the OS version is '14.0' or higher. + +Since Miguel already guarded all method calls, he simply suppresses the warning. + +### Consuming a library with a higher `TargetPlatformVersion` + +After the success of using `Monkey.FizzBuzz` in his Baby Shark app, Miguel wants +to use it everywhere now, so he decides to use it in his existing Laserizer 5000 +app. However, when he adds a reference to `Monkey.FizzBuzz`, he gets an error +from NuGet: + +> error NU1202: Package 'Monkey.FizzBuzz' is not compatible with +> 'net5.0-ios13.0'. Package 'Monkey.FizzBuzz' supports: net5.0-ios14.0 + +So Miguel edits his project file by changing `net5.0-ios13.0` to +`net5.0-ios14.0` which fixes the error. + ## Requirements ### Goals @@ -150,15 +236,20 @@ public static class SkiaSharpImage * Developers should be able to understand compatibility relationships without having to consult a mapping table. * Provide compatibility with existing concepts and NuGet packages -* It would be great to get this into .NET 5 Preview 1 +* It would be great to get this into early previews of .NET 5 +* Support multi-targeting different versions of the same OS +* Don't force multi-targeting for different versions of the same OS. It should + be possible to produce a single binary that can use newer APIs when calls are + properly guarded with an OS check. ### Non-Goals * Replace TFMs or expand runtime identifiers (RIDs) -* Support multi-targeting between OS versions ## Design +We'll have the following TFMs: + | TFM | Compatible With | Comments | |-----------------|------------------------------------------------------------|-----------------------------------| | net5.0 | net1..4 (with NU1701 warning) | No WinForms or WPF | @@ -185,70 +276,209 @@ should not map it to the existing TFM as that would be pointless._ _**Open Issue**. Will the above scheme work for iPad?_ +### OS versions + +The TFM will support an optional OS version, such as: + +* `net5.0-ios` +* `net5.0-ios12.0` + +A TFM without an OS version will be interpreted as the lowest OS version that +was supported by the corresponding `netX.Y` version. + +> *Note: One assumption here is that developers can always compile for the +> latest OS API set and run on older OS versions so long they guard method calls +> correctly. This is how P/Invokes, WinRT, iOS, and Android bindings work +> today.* + +For example, say that when .NET 5 ships, the version of iOS that we include +bindings for is iOS 13. That would mean that `net5.0-ios` and `net5.0-ios13.0` +mean the exact same thing. Now lets say that Apple ships a new iOS 14 before +.NET 6 is ready. We'd release a new version of the .NET 5 SDK that adds support +for iOS 14. On machines with that SDK `net5.0-ios` still means `net5.0-ios13.0`. + +Please note that this mapping is specific for `net5.0`. When .NET 6 ships, we +could decide that `net6.0-ios` means `net6.0-ios14.0`. But even when you use the +.NET 6 SDK, when targeting .NET 5, `net5.0-ios` also still means +`net5.0-ios13.0`. So these mappings are immutable. + +We have done this to simplify the experience for application models where the OS +version is largely irrelevant, for example WinForms and WPF. Whether or not the +template will put an OS version in the `` is up to each +application model. Based on conversations, it seems we'll be landing on this: + +| TFM | Project file includes OS version +|-----------------|--------------------------------- +| net5.0-android | Yes +| net5.0-ios | Yes +| net5.0-macos | Yes +| net5.0-tvos | Yes +| net5.0-watchos | Yes +| net5.0-windows | No + +Please note that by being able to put the OS version into the TFM one can also +multi-target between OS versions: + +```XML + + net5.0-ios13.0;net5.0-ios14.0 + +``` + +However, it's a bit misleading to think of the OS version number as the version +of the operating system you're running on. Rather, it's the operating system's +API you're compiling for. + ### Mapping to properties -There are three existing MSBuild properties: +These are the relevant MSBuild properties: -| Property | Meaning | Examples | -|---------------------------------|--------------------|----------------------------------| -| TargetFramework (TFM) | The friendly name | `net4`, `netcoreapp3.0` | -| TargetFrameworkIdentifier (TFI) | The long name | `.NETFramework` or `.NETCoreApp` | -| TargetFrameworkVersion (TFV) | The version number | `2`, `3.0`, `3.1` | -| TargetFrameworkProfile (TFP) | The profile | `Client` or `Profile124` | +| Property | Meaning | Examples | +|---------------------------------------|---------------------------------|----------------------------------| +| `TargetFramework` (TFM) | The friendly name | `net4`, `netcoreapp3.0` | +| `TargetFrameworkIdentifier` (TFI) | The long name | `.NETFramework` or `.NETCoreApp` | +| `TargetFrameworkVersion` (TFV) | The version number | `2`, `3.0`, `3.1` | +| `TargetFrameworkProfile` (TFP) | The profile | `Client` or `Profile124` | +| `TargetPlatformIdentifier` (TPI) | The OS platform | `ios`, `android`, `windows` | +| `TargetPlatformVersion` (TPV) | The OS platform version | `12.0` or `13.0` | +| `TargetPlatformMinimumVersion` (TPMV) | The minimum OS platform version | `12.0` or `13.0` | -_**Open Issue**. The SDK has this logic duplicated from NuGet because they need -to do this during evaluation where they can’t call custom targets. We could make -this an MSBuild intrinsic, but that seems like a lot of work. Maybe we just live -with the duplication. But bottom line is that we need to make that change in -MSBuild too._ +We're going to map the TFMs as follows: + +| TF | TFI | TFV | TFP | TPI | TPV | TPMV +|--------------------|---------------|---------|-----|---------|-----|---------------- +| net4.X | .NETFramework | 4.X | | | | +| net5.0 | .NETCoreApp | 5.0 | | | | +| net5.0-androidX.Y | .NETCoreApp | 5.0 | | android | X.Y | X.Y (defaulted) +| net5.0-iosX.Y | .NETCoreApp | 5.0 | | ios | X.Y | X.Y (defaulted) +| net5.0-windowsX.Y | .NETCoreApp | 5.0 | | windows | X.Y | X.Y (defaulted) + +Specifically: + +* **We'll continue to use .NETCoreApp as the TFI**. This reduces the number of + places build logic needs to change in MSBuild files (both built-in targets as + well as third party targets deployed via NuGet packages). -* [@rainersigwald](https://github.com/rainersigwald): We've made it pretty far - with duplicated logic, but it results in really ugly MSBuild, since it's not a - very expressive programming language. It also creates the potential for drift - between the two definitions. That said, exposing it directly would create a - new tight coupling between MSBuild and NuGet that hasn't historically existed. - It would probably require a direct dependency and update flow plus coherency - requirements on both .NET Core SDK and VS insertions. If the logic were in a - separate package (we've talked about pushing it down to the framework at - various times) it'd be great to just expose that. With the logic in NuGet, - it's reasonable either way, just different tradeoffs. I'm amenable to exposing - a property function, but maybe we should go down the road of not doing it at - first. - -We're going to map the new entries as follows: - -| Framework | Identifier | Version | Profile | -|----------------|---------------|---------|---------| -| net48 | .NETFramework | 4.8 | | -| net5.0 | .NETCoreApp | 5.0 | | -| net5.0-android | .NETCoreApp | 5.0 | android | -| net5.0-ios | .NETCoreApp | 5.0 | ios | -| net5.0-windows | .NETCoreApp | 5.0 | win | +* **net4x and earlier will continue to use .NETFramework as the TFI**. This + means that `net4x` and `net5.0` aren't considered compatible by default, but + the compatibility will continue to be provided by .NET Framework compatibility + mode we introduced in .NET Standard 2.0. It's handled via + `AssetTargetFallback` in NuGet restore which also means consumers from + `net5.0` will continue to get a proper warning. + +* **TargetPlatformMinimumVersion is defaulted to TargetPlatformVersion**. + However, the customer can override this in the project file to a lower version + (using a higher version than `TargetPlatformVersion` should generate an + error). _**Open Issue**. Please note that `net5.0`+ will map the TFI to `.NETCoreApp`. We need to announce this change so that package authors with custom .props and -.targets are prepared. Link to DavKean’s doc on how to do it._ +.targets are prepared. Link to DavKean's doc on how to do it._ _**Open Issue**. We should try to keep the TFI out of the .nuspec file. It seems NuGet uses the long form `.NETFramework,Version=4.5` in the dependency groups. We may want to change NuGet to allow the friendly name there as well and update our packaging tools to re-write to friendly name on pack._ -Specifically: +_**Open Issue**. The SDK has this logic duplicated from NuGet because they need +to do this during evaluation where they can't call custom targets. We could make +this an MSBuild intrinsic, but that seems like a lot of work. Maybe we just live +with the duplication. But bottom line is that we need to make that change in +MSBuild too._ -* **We'll continue to use .NETCoreApp as the TFI**. This reduces the number of - pieces and build logic that needs to change in .NET SDK. +> "We've made it pretty far with duplicated logic, but it results in really ugly +> MSBuild, since it's not a very expressive programming language. It also +> creates the potential for drift between the two definitions. That said, +> exposing it directly would create a new tight coupling between MSBuild and +> NuGet that hasn't historically existed. It would probably require a direct +> dependency and update flow plus coherency requirements on both .NET Core SDK +> and VS insertions. If the logic were in a separate package (we've talked about +> pushing it down to the framework at various times) it'd be great to just +> expose that. With the logic in NuGet, it's reasonable either way, just +> different tradeoffs. I'm amenable to exposing a property function, but maybe +> we should go down the road of not doing it at first." -- +> [@rainersigwald](https://github.com/rainersigwald) + +### NuGet pack behavior + +We need to update the .nuspec format to allow embedding target platform +information per TFM. For that, I propose to add a `platforms` element under +`metadata`. For each `netX.Y-{os}{version}`, it should contain a `platform` that +ties the TFM as specified to their corresponding `TargetPlatformVersion` and +`TargetPlatformMinimumVersion` entries: -* **net4x and earlier will continue to use .NETFramework as the TFI**. This - means that `net4x` and `net5.0` aren't considered compatible by default, but - the compatibility will continue to be handled by the AssetTargetFallback in - the SDK/NuGet restore. +```xml + + + ClassLibrary3 + 1.0.0 + ClassLibrary3 + ClassLibrary3 + false + Package Description + + + + + + + +``` -* **We'll use the existing profile concept to encode the OS selection.** It's - worth noting that profiles today make things smaller whereas this use makes - things larger. We believe this can be handled in the NuGet layer by using this - rule for `net5.0` and up. While that's not ideal, it reduces the number of - concepts we need to add. +We want to make sure that we preserve the TFM from the project file: + +* **TFM doesn't contain an OS**. If the TFM is just the neutral `netX.Y` TFM + then the .nuspec's `` element shouldn't list the TFM. If there are + no `` elements, the `` element should be omitted as well. + +* **TFM has an OS but no OS version**. If the user omits the OS version number + from the project's `` property, all usages of the TFM should + not contain an OS version number, including the project's output directory, + the `lib` folder in the NuGet package, and other corresponding entries in the + .nuspec. However, the effective OS version will be recorded in the .nuspec's + `` element that corresponds to the TFM. + +* **TFM has both OS and OS version**. If the project did contain an OS version + for `` this should also be reflected by the project's output + directory, `lib` folder, and TFM references in the .nuspec. + +This means that in some cases the `platformVersion` attribute will have +redundant information but it will also always be the source of truth. It allows +NuGet to know the OS version even if the OS version isn't included in the TFM. + +For cases where someones wants to pack two `lib` folders like this: + +* `net5.0-ios` +* `net5.0-ios13.0` + +and `net5.0-ios`'s is mapped to be platform version `13.0`, the `pack` operation +should fail because both `lib` folders are representing the same target (the +same applies to other usages of the TFM in the `ref` and `runtime` folders). + +### NuGet installation behavior + +The TFM part before the dash will behave as today: projects can reference the +same or an older version of `netX.Y`, but not a newer version. Trying to do +should result in a package installation failure. The OS portion will follow the +same rules. + +The rationale is the same for both: when the library author compiled for a +higher version, it had access to more APIs, which the consuming project doesn't +have. This can cause compilation errors due to unresolved types as well as +runtime errors due to unresolved members. + +The world is a bit different for `TargetPlatformMinimumVersion`. NuGet should +allow installation of packages whose `TargetPlatformMinimumVersion` is higher +than the consuming project. The rationale here is that the consuming project +might only want to use the library on higher versions of the operating system +and can conditionally call the library code. The behavior should be similar to +`AssetTargetFallback` where installation of the package succeeds but each time +the project is built a warning is produced, which must be suppressible by using +the `` property in the project file or on the `` item. ### TFMs are a closed set @@ -277,7 +507,7 @@ explicit. ### Preprocessor Symbols -* TODO +_**Open Issue**. Figure out preprocessor symbols._ Today, implicit `#if` conditions get generated based on the `TargetFrameworkIdentifier`, so users today have: @@ -294,17 +524,6 @@ targeting `net5.0`, `net6.0`, etc. and will also be turned on for implicit condition that is versionless but targets all TFMs above `net5.0`? That is, `#if NET`. -### Persisting prerequisites - -We need to require a minimum version for the iOS/Android/Windows SDKs. - -* Probably like how we did WinForms/WPF - - WinForms/WPF uses a framework reference which by design doesn't have a - version number - - We'd need something with a version number - -This work is captured [in this document][os-versioning]. - ### What would we target? Everything that is universal or portable to many platforms will target `net5.0`. @@ -313,7 +532,7 @@ This includes most libraries but also ASP.NET Core and EF. Platform-specific libraries would target platform-specific flavors. For example, WinForms and WPF controls would target `net5.0-windows`. -Cross-platform application models (Xamarin Forms, ASP.NET Core) and bridges +Cross-platform application models (Xamarin Forms, ASP.NET Core) and bridge packs (Xamarin Essentials) would at least target `net5.0` but might also additionally target platform-specific flavors to light-up more APIs or features. This approach is also called bait & switch. @@ -323,8 +542,11 @@ approach is also called bait & switch. There are some places in the IDE where targeting information is displayed: ![](pic03.png) + ![](pic04.png) + ![](pic05.png) + ![](pic06.png) | Rule | Affected UI | @@ -369,23 +591,23 @@ packages would use platform checks or catch `PlatformNotSupportedException`. We believe this isn't the right approach for two reasons: -1. **Number of moving pieces**. Imagine what a simple class library would look - like that just wants to provide an abstraction over a single concept, such - as the GPS. It would transitively depend on all OS bindings. Regardless of - the platform you're building your application for, the output folder would - have to include all bindings across OS platforms, with all being throwing - implementations except for the one that your app is targeting. While we - could build tooling (such as a linker) that could remove this and replace - the call sites with throw statements, it seems backwards to first create - this mess and then rely on tooling to clean it up. It would be better to - avoid this problem by construction. - -2. **Versioning issues**. By making the OS bindings available on top of the - .NET platform the consumer is now able to upgrade the .NET platform and the - OS bindings independently, which makes it hard to explain what combinations - are supported. In practice, the OS bindings will want to depend on .NET - types which might change over time (think `Task` or `Span)`, so not - every combination can work. +1. **Number of moving pieces**. Imagine what a simple class library would look + like that just wants to provide an abstraction over a single concept, such as + the GPS. It would transitively depend on all OS bindings. Regardless of the + platform you're building your application for, the output folder would have + to include all bindings across OS platforms, with all being throwing + implementations except for the one that your app is targeting. While we could + build tooling (such as a linker) that could remove this and replace the call + sites with throw statements, it seems backwards to first create this mess and + then rely on tooling to clean it up. It would be better to avoid this problem + by construction. + +2. **Versioning issues**. By making the OS bindings available on top of the .NET + platform the consumer is now able to upgrade the .NET platform and the OS + bindings independently, which makes it hard to explain what combinations are + supported. In practice, the OS bindings will want to depend on .NET types + which might change over time (think `Task` or `Span)`, so not every + combination can work. We believe it's much easier if we enable code to use multi-targeting (that is, compile the same code for multiple platforms, like we do today. @@ -405,18 +627,20 @@ Thus, new apps should start on .NET Core. By branding it as .NET 5, this recommendation is much more obvious to both existing customers and new customers. -### Why are the OS specific flavors not versioned by the OS? +### ~~Why are the OS specific flavors not versioned by the OS?~~ + +*No longer applicable as we decided to allow that.* There are a couple of reasons why this isn't desirable: -1. **It results a combinatorial explosion**. A TFM in the form of - `net5.0-windows7` would (syntactically) make any combination of .NET and OS - possible. This raises the question which combinations are supported, which - puts us back into having to provide the customer with a decoder ring. +1. **It results a combinatorial explosion**. A TFM in the form of + `net5.0-windows7` would (syntactically) make any combination of .NET and OS + possible. This raises the question which combinations are supported, which + puts us back into having to provide the customer with a decoder ring. -2. **It can make asset selection ill-defined**. Suppose the project is - targeting `net7.0-windows10`. The package offers `net5.0-windows10.0` and - `net6.0-windows7.0`. Now neither asset would be better. +2. **It can make asset selection ill-defined**. Suppose the project is targeting + `net7.0-windows10`. The package offers `net5.0-windows10.0` and + `net6.0-windows7.0`. Now neither asset would be better. 3. **A single version isn't enough**. Logically, you need at least two version numbers to support OS targeting: @@ -436,7 +660,7 @@ There are a couple of reasons why this isn't desirable: Some platforms, such as Android, also have the notion of a *targeted OS version* that indicates to the OS what behavior the author tested for. When running on a later OS version, the OS might "quirk" the behavior to preserve - backwards compatibility. + backwards compatibility. Developers will want to target different OS versions from a single code base/NuGet package, but that doesn't mean they will need to use multi-targeting. @@ -517,7 +741,7 @@ decide what kind of app are you building: using both Windows Forms and WPF or just one? The nice thing about properties is that they naturally compose. If certain -combinations aren't possible, they can relatively easily be blocked. +combinations aren't possible, they can be blocked relatively easily. However, at this point it's still unclear whether the SDK unification will work this way. One concern was that SDKs also bring in new item groups and might have @@ -529,7 +753,7 @@ SDK that can't be easily extended via optional components. [@mhutch](https://github.com/mhutch) is working on a document specifically around SDK convergence. -### Why is there new TFM for Linux? +### Why is there no TFM for Linux? The primary reason for OS specific TFMs is to vary API surface, not for varying behavior. RIDs allow varying behavior and have support for various Linux @@ -546,7 +770,7 @@ you can do is calling P/Invokes. ### Why is .NET 5.0's TFI still mapped to `.NETCoreApp`? -In MSBuild you can't easily do comparisons like +In MSBuild you can't easily do comparisons like: ```xml @@ -563,4 +787,4 @@ By us mapping `net5.0` we break less of that code because existing code will treat it correctly (i.e. as a future version of .NET Core) and also avoid misclassification as .NET Framework. -[os-versioning]: https://microsoft.sharepoint.com/:w:/t/DotNetTeam/EavsPfFy7lFLh7eQrdMN8QwBl05cGLPwrSzJeT8vEu32mw?e=knNQ6W \ No newline at end of file +[os-versioning]: https://microsoft.sharepoint.com/:w:/t/DotNetTeam/EavsPfFy7lFLh7eQrdMN8QwBl05cGLPwrSzJeT8vEu32mw?e=knNQ6W From 3f68a4f1ea3145199f662f8f355122cc12d59523 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 6 Mar 2020 22:06:34 -0800 Subject: [PATCH 19/38] Replace xamarin.macos with the correct name of xamarin.mac --- accepted/2020/net5/net5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 69278010c..02f81af51 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -259,7 +259,7 @@ We'll have the following TFMs: | | (+everything else inherited from net5.0) | | | net5.0-ios | xamarin.ios | | | | (+everything else inherited from net5.0) | | -| net5.0-macos | xamarin.macos | | +| net5.0-macos | xamarin.mac | | | | (+everything else inherited from net5.0) | | | net5.0-tvos | xamarin.tvos | | | | (+everything else inherited from net5.0) | | From cb45bdbc20e76c2dfacb1dc42e0d2b4f6a89f3da Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Mon, 9 Mar 2020 19:40:15 -0700 Subject: [PATCH 20/38] Clarify pre-processor symbols --- accepted/2020/net5/net5.md | 50 +++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 02f81af51..c2a6bbb36 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -507,22 +507,44 @@ explicit. ### Preprocessor Symbols -_**Open Issue**. Figure out preprocessor symbols._ +Today, SDK-style projects automatically define `#if` symbols based on the +friendly TFM representation. This includes both versionless- as well as +version-specific symbols: + +TFM | Project-style | Automatic Defines +----------------|---------------|------------------------------------- +`net45` | CSPROJ | +`net45` | SDK-style | `NETFRAMEWORK`, `NET45` +`net48` | CSPROJ | +`net48` | SDK-style | `NETFRAMEWORK`, `NET48` +`netcoreapp3.1` | SDK-style | `NETCOREAPP`, `NETCOREAPP3_1` + +For .NET 5 and higher we plan to define the following symbols: + +TFM | Project-style | Automatic Defines +--------------------|---------------|------------------------------------- +`netX.Y` | SDK-style | `NETCOREAPP`, `NET`, `NETX_Y` +`netX.Y-iosA.B` | SDK-style | `NETCOREAPP`, `NET`, `NETX_Y`, `IOS` +`netX.Y-androidA.B` | SDK-style | `NETCOREAPP`, `NET`, `NETX_Y`, `ANDROID` +`netX.Y-windowsA.B` | SDK-style | `NETCOREAPP`, `NET`, `NETX_Y`, `WINDOWS` -Today, implicit `#if` conditions get generated based on the -`TargetFrameworkIdentifier`, so users today have: - -```C# -#if NETCOREAPP -#elif NETFRAMEWORK -#endif -``` +Specifically: -With this proposal, the `#if NETCOREAPP` condition will still be available when -targeting `net5.0`, `net6.0`, etc. and will also be turned on for -`netcoreapp2.1`, `netcoreapp3.1`, etc. Is that intended? Do we want a new -implicit condition that is versionless but targets all TFMs above `net5.0`? That -is, `#if NET`. +* We continue to define `NETCOREAPP` for backwards compatibility with existing + `#if` code. +* Moving forward we'll use `NET` as the versionless symbol (for .NET Framework + we used `NETFRAMEWORK`, so no conflict there). +* We'll follow the rule-based creation in SDK-style projects which takes the + friendly TFM name without the OS flavor, makes it upper-case and replaces + special characters with an underscore. +* We'll only define versionless symbols for the OS flavor (because + multi-targeting between OS versions will be rare). + +_**Open Issue**. Review defines with Xamarin folks._ + +_**Open Issue**. Should we also define symbols for previous versions? For +example, on .NET 6, should we define `NET6_0` as well as `NET6_0_OR_HIGHER`, and +`NET5_0_OR_HIGHER`? This could simplify `#if` logic._ ### What would we target? From 15cd9f56b2666458ac3c12d93004aa721ab1a12b Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Mon, 9 Mar 2020 19:42:40 -0700 Subject: [PATCH 21/38] Replace TargetPlatformMinimumVersion with TargetPlatformMinVersion This is to mactch the actual name of the existing property. --- accepted/2020/net5/net5.md | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index c2a6bbb36..1127a02dc 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -170,15 +170,14 @@ He modifies the `` to be `net5.0-ios14.0`. Miguel doesn't want to cut off his users who are currently on iOS 13, so he wants to continue to have his application work on iOS 13 as well. To achieve -that, Miguel modifies the project file by adding -``: +that, Miguel modifies the project file by adding ``: ```XML net5.0-ios14.0 - 13.0 + 13.0 ... @@ -200,7 +199,7 @@ public void OnClick(object sender, EventArgs e) } ``` -### Consuming a library with a higher `TargetPlatformMinimumVersion` +### Consuming a library with a higher `TargetPlatformMinVersion` After using `NSFizzBuzz` directly for a while, Miguel notices that these OS APIs are a bit hard to use, so he looks for a .NET library. He finds @@ -208,8 +207,8 @@ are a bit hard to use, so he looks for a .NET library. He finds building his application he gets the following warning: > warning NU1702: Package 'Monkey.FizzBuzz' was restored using 'net5.0-ios14' -> and has 'TargetPlatformMinimumVersion' of '14.0' while the project has a value -> of '13.0'. You should either upgrade your project to '14.0' or only make calls +> and has 'TargetPlatformMinVersion' of '14.0' while the project has a value of +> '13.0'. You should either upgrade your project to '14.0' or only make calls > into the library after checking that the OS version is '14.0' or higher. Since Miguel already guarded all method calls, he simply suppresses the warning. @@ -341,7 +340,7 @@ These are the relevant MSBuild properties: | `TargetFrameworkProfile` (TFP) | The profile | `Client` or `Profile124` | | `TargetPlatformIdentifier` (TPI) | The OS platform | `ios`, `android`, `windows` | | `TargetPlatformVersion` (TPV) | The OS platform version | `12.0` or `13.0` | -| `TargetPlatformMinimumVersion` (TPMV) | The minimum OS platform version | `12.0` or `13.0` | +| `TargetPlatformMinVersion` (TPMV) | The minimum OS platform version | `12.0` or `13.0` | We're going to map the TFMs as follows: @@ -366,10 +365,9 @@ Specifically: `AssetTargetFallback` in NuGet restore which also means consumers from `net5.0` will continue to get a proper warning. -* **TargetPlatformMinimumVersion is defaulted to TargetPlatformVersion**. - However, the customer can override this in the project file to a lower version - (using a higher version than `TargetPlatformVersion` should generate an - error). +* **TargetPlatformMinVersion is defaulted to TargetPlatformVersion**. However, + the customer can override this in the project file to a lower version (using a + higher version than `TargetPlatformVersion` should generate an error). _**Open Issue**. Please note that `net5.0`+ will map the TFI to `.NETCoreApp`. We need to announce this change so that package authors with custom .props and @@ -405,7 +403,7 @@ We need to update the .nuspec format to allow embedding target platform information per TFM. For that, I propose to add a `platforms` element under `metadata`. For each `netX.Y-{os}{version}`, it should contain a `platform` that ties the TFM as specified to their corresponding `TargetPlatformVersion` and -`TargetPlatformMinimumVersion` entries: +`TargetPlatformMinVersion` entries: ```xml @@ -471,11 +469,11 @@ higher version, it had access to more APIs, which the consuming project doesn't have. This can cause compilation errors due to unresolved types as well as runtime errors due to unresolved members. -The world is a bit different for `TargetPlatformMinimumVersion`. NuGet should -allow installation of packages whose `TargetPlatformMinimumVersion` is higher -than the consuming project. The rationale here is that the consuming project -might only want to use the library on higher versions of the operating system -and can conditionally call the library code. The behavior should be similar to +The world is a bit different for `TargetPlatformMinVersion`. NuGet should allow +installation of packages whose `TargetPlatformMinVersion` is higher than the +consuming project. The rationale here is that the consuming project might only +want to use the library on higher versions of the operating system and can +conditionally call the library code. The behavior should be similar to `AssetTargetFallback` where installation of the package succeeds but each time the project is built a warning is produced, which must be suppressible by using the `` property in the project file or on the `` item. From 0a74a338ec0a1e017f7a8fd976e65fbffa119f37 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Mon, 9 Mar 2020 19:47:53 -0700 Subject: [PATCH 22/38] Call out that NuGet manifest encoding is a strawman --- accepted/2020/net5/net5.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 1127a02dc..f4d9e787e 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -400,9 +400,16 @@ MSBuild too._ ### NuGet pack behavior We need to update the .nuspec format to allow embedding target platform -information per TFM. For that, I propose to add a `platforms` element under -`metadata`. For each `netX.Y-{os}{version}`, it should contain a `platform` that -ties the TFM as specified to their corresponding `TargetPlatformVersion` and +information per TFM. + +For that, I propose to add a `platforms` element under `metadata`. + +> **Note** This is just meant to be a strawman for NuGet so we can talk about +> semantics. The NuGet team should specify the actual encoding. Once spec is +> available, we'll link it from here. + +For each `netX.Y-{os}{version}`, it should contain a `platform` that ties the +TFM as specified to their corresponding `TargetPlatformVersion` and `TargetPlatformMinVersion` entries: ```xml From 8bcb35a8c75d0ee35b7e359b40dfefd270a88a49 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Mon, 9 Mar 2020 20:28:43 -0700 Subject: [PATCH 23/38] Include Windows-specific behavior --- accepted/2020/net5/net5.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index f4d9e787e..9a4460e68 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -397,6 +397,20 @@ MSBuild too._ > we should go down the road of not doing it at first." -- > [@rainersigwald](https://github.com/rainersigwald) +### Window-specific behavior + +_**Open Issue**. Review with WinForms/WPF & Windows folks._ + +* We need to define what the Windows version number is. It should probably be + the minimum for WPF/WinForms (because that makes the most sense until we ship + support for WinRT in .NET 5). Generally speaking, we expect UWP flavors to + burn in into the project file, just like iOS and Android. + +* When would the WinRT APIs be referenced? Should they show up by default + (assuming the project specified they correct version for the WinRT bindings) + or should there be an equivalent for `UseWinForms`? We probably don't want an + opt-in for the foundational WinRT APIs but maybe for the UI layer. + ### NuGet pack behavior We need to update the .nuspec format to allow embedding target platform From 518207539432c60d9a26beb7cc4fa65e353084c6 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Mon, 9 Mar 2020 20:55:57 -0700 Subject: [PATCH 24/38] Call out issue with MSBuild comparisons --- accepted/2020/net5/net5.md | 165 ++++++++++++++++++++++++++++++++++++- 1 file changed, 163 insertions(+), 2 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 9a4460e68..566d89669 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -397,6 +397,167 @@ MSBuild too._ > we should go down the road of not doing it at first." -- > [@rainersigwald](https://github.com/rainersigwald) +### MSBuild version comparisons + +In SDK-style projects there are two kinds of MSBuild files that are +automatically included into each project: + +* `*.props`: These files are included at the top of the user's project file and + are used to define a set of default properties that the user's project file + can use. + +* `*.targets`. These files are included at the bottom of the user's project + file, usually meant to define build targets and additional properties/items + that need to depend on properties defined by the user. + +Furthermore, MSBuild has a two pass evaluation model: first, it evaluates all +properties and then all items. + +Why is all of this important? Because it controls which properties the user can +rely on in their project file. + +Often, a user wants to express a condition like "include this file if you're +compiling for .NET 5 or higher". Logically one would like to express it like +this: + +```xml + +``` + +but this doesn't work because that would be a string comparison, not a version +comparison. Instead, the user has to write it like this: + +```xml + +``` + +This works for conditions on item groups because they are evaluated after +properties. Since the user's project file defines the `TargetFramework` +property, the SDK logic that expands it into the other properties such as +`TargetFrameworkIdentifier` and `TargetFrameworkVersion` has to live in +`*.targets`, i.e. at the bottom of the project file. That means these +automatically expanded properties aren't available for the user when defining +other properties. This happens to work for items because items are evaluated +after all properties are evaluated. + +Concretely, this means the user cannot define properties like this: + +```XML + + + + netstandard2.0;netcoreapp3.1 + + + + Some .NET Standard specific value + + + + Some .NET Core specific value + + + +``` + +In the past, we've seen people working this around by using string processing +functions against the `TargetFramework` property, which is less than ideal. + +Ideally, we'd expose functionality such that the user can do version checks: + +```XML + + + + netstandard2.0;netcoreapp3.1 + + + + Some value that applies to all versions of .NET Standard + + + + Some value that applies to .NET Core 2.0 and later + + + + Some value that only applies to .NET 5 + iOS 13.0 + + + + Some value that applies to all version of Windows + + + + Some value that applies to iOS 12.0 and later + + + +``` + +The idea is: + +* Property groups, properties, and item groups get new attributes + `TargetFramework` and `TargetPlatform`. +* The value can be prefixed with an optional conditional operator `==`, `!=`, + `<`, `<=`, `>`, and `>=`. If the operator is omitted, `==` is assumed. +* `TargetFramework` supports comparisons with a friendly TFM name. This can + include an OS flavor for symmetry. If the `TargetFramework` property includes + an OS flavor but the attribute doesn't, the comparison only applies to the TFM + without the OS flavor. In other words a condition of + `TargetFramework=">=net5.0"` will result in `true` if the project targets + `net5.0`, `net6.0`, as well as `net6.0-android12.0`. + +Alternatively, we could invent new syntax that allows parsing of constitutes +like this: + +```XML + + + + netstandard2.0;netcoreapp3.1 + + + + Some value that applies to all versions of .NET Standard + + + + Some value that applies to .NET Core 2.0 and later + + + + Some value that only applies to .NET 5 + iOS 13.0 + + + + Some value that applies to all version of Windows + + + + Some value that applies to iOS 12.0 and later + + + +``` + +And lastly, we could just define new intrinsic functions on some type, +but this will make using them a mouthful: + +```XML + + Some value that applies to all versions of .NET Standard + + + + Some value that applies to .NET 5 or later + + + + Some value that applies to iOS 12 or later + +``` + ### Window-specific behavior _**Open Issue**. Review with WinForms/WPF & Windows folks._ @@ -814,14 +975,14 @@ you can do is calling P/Invokes. In MSBuild you can't easily do comparisons like: ```xml - + ``` because that would be a string comparison. Rather, you need to do comparisons like this: ```xml - + ``` By us mapping `net5.0` we break less of that code because existing code will From e51280216c538337743282c1f5fc1939dcac149c Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Mon, 9 Mar 2020 21:09:17 -0700 Subject: [PATCH 25/38] Clarify error behavior --- accepted/2020/net5/net5.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 566d89669..8fe89801b 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -226,6 +226,18 @@ from NuGet: So Miguel edits his project file by changing `net5.0-ios13.0` to `net5.0-ios14.0` which fixes the error. +### Using a higher `TargetPlatformVersion` than the current SDK + +Claire has the first release of the .NET 5 SDK that only ships bindings +for iOS 13. She clones Miguel's Baby Shark repo from GitHub and tries to +build it on her machine. Since Baby Shark targtes `net5.0-ios14.0` she +gets a build error: + +> error NETSDK1045: The current .NET SDK does not support targeting iOS 14.0. +> Either target iOS 13.0, or use a version of the .NET SDK that supports iOS +> 14.0. [BabyShark.csproj] + + ## Requirements ### Goals From 7ed2bf0743f1831a3aef4a2bd49bfa54431037fd Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Tue, 10 Mar 2020 12:32:20 -0700 Subject: [PATCH 26/38] Remove section on MSBuild property evaluation This is now tracked here: https://github.com/microsoft/msbuild/issues/5171 --- accepted/2020/net5/net5.md | 163 +------------------------------------ 1 file changed, 2 insertions(+), 161 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 8fe89801b..ce85b928d 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -409,167 +409,6 @@ MSBuild too._ > we should go down the road of not doing it at first." -- > [@rainersigwald](https://github.com/rainersigwald) -### MSBuild version comparisons - -In SDK-style projects there are two kinds of MSBuild files that are -automatically included into each project: - -* `*.props`: These files are included at the top of the user's project file and - are used to define a set of default properties that the user's project file - can use. - -* `*.targets`. These files are included at the bottom of the user's project - file, usually meant to define build targets and additional properties/items - that need to depend on properties defined by the user. - -Furthermore, MSBuild has a two pass evaluation model: first, it evaluates all -properties and then all items. - -Why is all of this important? Because it controls which properties the user can -rely on in their project file. - -Often, a user wants to express a condition like "include this file if you're -compiling for .NET 5 or higher". Logically one would like to express it like -this: - -```xml - -``` - -but this doesn't work because that would be a string comparison, not a version -comparison. Instead, the user has to write it like this: - -```xml - -``` - -This works for conditions on item groups because they are evaluated after -properties. Since the user's project file defines the `TargetFramework` -property, the SDK logic that expands it into the other properties such as -`TargetFrameworkIdentifier` and `TargetFrameworkVersion` has to live in -`*.targets`, i.e. at the bottom of the project file. That means these -automatically expanded properties aren't available for the user when defining -other properties. This happens to work for items because items are evaluated -after all properties are evaluated. - -Concretely, this means the user cannot define properties like this: - -```XML - - - - netstandard2.0;netcoreapp3.1 - - - - Some .NET Standard specific value - - - - Some .NET Core specific value - - - -``` - -In the past, we've seen people working this around by using string processing -functions against the `TargetFramework` property, which is less than ideal. - -Ideally, we'd expose functionality such that the user can do version checks: - -```XML - - - - netstandard2.0;netcoreapp3.1 - - - - Some value that applies to all versions of .NET Standard - - - - Some value that applies to .NET Core 2.0 and later - - - - Some value that only applies to .NET 5 + iOS 13.0 - - - - Some value that applies to all version of Windows - - - - Some value that applies to iOS 12.0 and later - - - -``` - -The idea is: - -* Property groups, properties, and item groups get new attributes - `TargetFramework` and `TargetPlatform`. -* The value can be prefixed with an optional conditional operator `==`, `!=`, - `<`, `<=`, `>`, and `>=`. If the operator is omitted, `==` is assumed. -* `TargetFramework` supports comparisons with a friendly TFM name. This can - include an OS flavor for symmetry. If the `TargetFramework` property includes - an OS flavor but the attribute doesn't, the comparison only applies to the TFM - without the OS flavor. In other words a condition of - `TargetFramework=">=net5.0"` will result in `true` if the project targets - `net5.0`, `net6.0`, as well as `net6.0-android12.0`. - -Alternatively, we could invent new syntax that allows parsing of constitutes -like this: - -```XML - - - - netstandard2.0;netcoreapp3.1 - - - - Some value that applies to all versions of .NET Standard - - - - Some value that applies to .NET Core 2.0 and later - - - - Some value that only applies to .NET 5 + iOS 13.0 - - - - Some value that applies to all version of Windows - - - - Some value that applies to iOS 12.0 and later - - - -``` - -And lastly, we could just define new intrinsic functions on some type, -but this will make using them a mouthful: - -```XML - - Some value that applies to all versions of .NET Standard - - - - Some value that applies to .NET 5 or later - - - - Some value that applies to iOS 12 or later - -``` - ### Window-specific behavior _**Open Issue**. Review with WinForms/WPF & Windows folks._ @@ -782,6 +621,8 @@ WASM but also version-to-version differences in OS API surface. We already have [an analyzer](https://github.com/dotnet/platform-compat), but we need to expand this and make it a key capability that is available out-of-the-box. +* [Making it easier to do TFM checks in MSBuild](https://github.com/microsoft/msbuild/issues/5171) + ## Q & A ### Why can't we just have a single TFM for .NET 5? From f043368e1f01dbe5435037249782f311db21b9b9 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Tue, 10 Mar 2020 12:36:51 -0700 Subject: [PATCH 27/38] Fix property name --- accepted/2020/net5/net5.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index ce85b928d..ce98f7fed 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -420,8 +420,8 @@ _**Open Issue**. Review with WinForms/WPF & Windows folks._ * When would the WinRT APIs be referenced? Should they show up by default (assuming the project specified they correct version for the WinRT bindings) - or should there be an equivalent for `UseWinForms`? We probably don't want an - opt-in for the foundational WinRT APIs but maybe for the UI layer. + or should there be an equivalent for `UseWindowsForms`? We probably don't want + an opt-in for the foundational WinRT APIs but maybe for the UI layer. ### NuGet pack behavior From 699d7829f27163c1f7670b7bee1175a005ed40e0 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 12 Mar 2020 15:46:56 -0700 Subject: [PATCH 28/38] Apply Drew's edits Co-Authored-By: Drew Noakes --- accepted/2020/net5/net5.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index ce98f7fed..ddc0814cb 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -70,7 +70,7 @@ top via a new syntax: * `net5.0-android`, `net5.0-ios`, and `net5.0-windows`. These TFMs represent OS specific flavors of .NET 5 that include `net5.0` plus OS-specific bindings. -NuGet should use this nex syntax to automatically understand that `net5.0` can +NuGet should use this new syntax to automatically understand that `net5.0` can be consumed from `net6.0-windows` (but not the other way around). More importantly, this notation will also enable developers to intuitively understand compatibility relationships because they are expressed by naming, rather than by @@ -604,7 +604,7 @@ There are some places in the IDE where targeting information is displayed: | Rule | Affected UI | |-------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------| -| For most UI, we should use the TFM friendly name (for example, `netcoreapp3.1`, `net5.0`, or `net5.0-ios`). | Solution Explorer Editor, Context Switcher, Debug Context Switcher | +| For most UI, we should use the TFM friendly name (for example, `netcoreapp3.1`, `net5.0`, or `net5.0-ios`). | Solution Explorer, Editor Context Switcher, Debug Context Switcher | | For cases where we use branded display names, we should use the name .NET 5. | Project Properties | ### Related work From af57437e042eeb49e72f48dacf1de968d617aaa4 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 12 Mar 2020 18:06:54 -0700 Subject: [PATCH 29/38] Cosmetic fixes --- accepted/2020/net5/net5.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index ddc0814cb..93101390b 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -230,14 +230,13 @@ So Miguel edits his project file by changing `net5.0-ios13.0` to Claire has the first release of the .NET 5 SDK that only ships bindings for iOS 13. She clones Miguel's Baby Shark repo from GitHub and tries to -build it on her machine. Since Baby Shark targtes `net5.0-ios14.0` she +build it on her machine. Since Baby Shark targets `net5.0-ios14.0` she gets a build error: > error NETSDK1045: The current .NET SDK does not support targeting iOS 14.0. > Either target iOS 13.0, or use a version of the .NET SDK that supports iOS > 14.0. [BabyShark.csproj] - ## Requirements ### Goals @@ -463,14 +462,14 @@ TFM as specified to their corresponding `TargetPlatformVersion` and We want to make sure that we preserve the TFM from the project file: * **TFM doesn't contain an OS**. If the TFM is just the neutral `netX.Y` TFM - then the .nuspec's `` element shouldn't list the TFM. If there are + then the `.nuspec`'s `` element shouldn't list the TFM. If there are no `` elements, the `` element should be omitted as well. * **TFM has an OS but no OS version**. If the user omits the OS version number from the project's `` property, all usages of the TFM should not contain an OS version number, including the project's output directory, the `lib` folder in the NuGet package, and other corresponding entries in the - .nuspec. However, the effective OS version will be recorded in the .nuspec's + .nuspec. However, the effective OS version will be recorded in the `.nuspec`'s `` element that corresponds to the TFM. * **TFM has both OS and OS version**. If the project did contain an OS version @@ -590,7 +589,7 @@ Cross-platform application models (Xamarin Forms, ASP.NET Core) and bridge packs target platform-specific flavors to light-up more APIs or features. This approach is also called bait & switch. -### Target Framework Names +### TFMs in the UI There are some places in the IDE where targeting information is displayed: From 075ce4f0fb4843fdd027480fb1fec8aa6753dd45 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 12 Mar 2020 16:19:23 -0700 Subject: [PATCH 30/38] Properly case TPI values --- accepted/2020/net5/net5.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 93101390b..d0833784e 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -359,9 +359,9 @@ We're going to map the TFMs as follows: |--------------------|---------------|---------|-----|---------|-----|---------------- | net4.X | .NETFramework | 4.X | | | | | net5.0 | .NETCoreApp | 5.0 | | | | -| net5.0-androidX.Y | .NETCoreApp | 5.0 | | android | X.Y | X.Y (defaulted) -| net5.0-iosX.Y | .NETCoreApp | 5.0 | | ios | X.Y | X.Y (defaulted) -| net5.0-windowsX.Y | .NETCoreApp | 5.0 | | windows | X.Y | X.Y (defaulted) +| net5.0-androidX.Y | .NETCoreApp | 5.0 | | Android | X.Y | X.Y (defaulted) +| net5.0-iosX.Y | .NETCoreApp | 5.0 | | iOS | X.Y | X.Y (defaulted) +| net5.0-windowsX.Y | .NETCoreApp | 5.0 | | Windows | X.Y | X.Y (defaulted) Specifically: From df0cc672a3eb7de6725bf511610cdad424fc46a2 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 12 Mar 2020 18:10:23 -0700 Subject: [PATCH 31/38] Remove open issue regarding mapping Xamarin TFMs The POR is that the OS bindings will not be changed in .NET 5, so it makes sense to map the existing TFMs. --- accepted/2020/net5/net5.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index d0833784e..364262313 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -279,11 +279,6 @@ We'll have the following TFMs: | | (+everything else inherited from net5.0) | | | Tizen, Unity... | Will follow the Xamarin model | | -_**Open Issue**. In case of Xamarin, there is a discussion of whether the -convergence with .NET Core will be a breaking change for existing NuGet packages -(for example, there is a desire to change their namespaces). In that case, we -should not map it to the existing TFM as that would be pointless._ - _**Open Issue**. Will the above scheme work for iPad?_ ### OS versions From 8cd5bc4638ea48b5072fd6b362e230c17725ee19 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 12 Mar 2020 17:25:12 -0700 Subject: [PATCH 32/38] Update preprocessor section based on feedback from Xamarin folks --- accepted/2020/net5/net5.md | 40 +++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 364262313..1dacfde78 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -546,12 +546,12 @@ TFM | Project-style | Automatic Defines For .NET 5 and higher we plan to define the following symbols: -TFM | Project-style | Automatic Defines ---------------------|---------------|------------------------------------- -`netX.Y` | SDK-style | `NETCOREAPP`, `NET`, `NETX_Y` -`netX.Y-iosA.B` | SDK-style | `NETCOREAPP`, `NET`, `NETX_Y`, `IOS` -`netX.Y-androidA.B` | SDK-style | `NETCOREAPP`, `NET`, `NETX_Y`, `ANDROID` -`netX.Y-windowsA.B` | SDK-style | `NETCOREAPP`, `NET`, `NETX_Y`, `WINDOWS` +TFM | Automatic Defines +--------------------|------------------------------------------------------- +`netX.Y` | `NETCOREAPP`, `NET`, `NETX_Y` +`netX.Y-iosA.B` | `NETCOREAPP`, `NET`, `NETX_Y`, `IOS`, `IOSA_B` +`netX.Y-androidA.B` | `NETCOREAPP`, `NET`, `NETX_Y`, `ANDROID`, `ANDROIDA_B` +`netX.Y-windowsA.B` | `NETCOREAPP`, `NET`, `NETX_Y`, `WINDOWS`, `WINDOWSA_B` Specifically: @@ -562,14 +562,26 @@ Specifically: * We'll follow the rule-based creation in SDK-style projects which takes the friendly TFM name without the OS flavor, makes it upper-case and replaces special characters with an underscore. -* We'll only define versionless symbols for the OS flavor (because - multi-targeting between OS versions will be rare). - -_**Open Issue**. Review defines with Xamarin folks._ - -_**Open Issue**. Should we also define symbols for previous versions? For -example, on .NET 6, should we define `NET6_0` as well as `NET6_0_OR_HIGHER`, and -`NET5_0_OR_HIGHER`? This could simplify `#if` logic._ +* For OS flavors we'll do the same, i.e. create versionless as well as version + specific symbols. + +In order to make it easier to update code, especially when doing +multi-targeting, we should make them additive, so that when targeting `net6.0` +both `NET6_0` and `NET5_0` are defined. The same applies to OS bindings. +Examples: + +* `net5.0` + * `NETCOREAPP`, `NETCOREAPP3_1` (for backwards compatibility) + * `NET`, `NET5_0` +* `net6.0` + * (same as `net5.0`) + * `NET6_0` +* `net5.0-ios13.0` + * (same as `net5.0`) + * `IOS`, `IOS13_0` +* `net5.0-ios14.0` + * (same as `net5.0-ios13`) + * `IOS14_0` ### What would we target? From f7b02f49ed1aaae46ec1a475e69df75b4881d260 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 12 Mar 2020 18:10:14 -0700 Subject: [PATCH 33/38] Include open issue regarding versioning of bindings --- accepted/2020/net5/net5.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 1dacfde78..ebc16f278 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -281,6 +281,9 @@ We'll have the following TFMs: _**Open Issue**. Will the above scheme work for iPad?_ +_**Open Issue**. Can we use a syntax that differentiates revving the bindings +from the OS?, such as `net5.0-ios13.0-r1` or `net5.0-ios13.0A`?_ + ### OS versions The TFM will support an optional OS version, such as: From 4284705c22ed180753e0efef2ca72698de8e27b6 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 12 Mar 2020 18:27:51 -0700 Subject: [PATCH 34/38] Fix casing in table too --- accepted/2020/net5/net5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index ebc16f278..0612365ee 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -347,7 +347,7 @@ These are the relevant MSBuild properties: | `TargetFrameworkIdentifier` (TFI) | The long name | `.NETFramework` or `.NETCoreApp` | | `TargetFrameworkVersion` (TFV) | The version number | `2`, `3.0`, `3.1` | | `TargetFrameworkProfile` (TFP) | The profile | `Client` or `Profile124` | -| `TargetPlatformIdentifier` (TPI) | The OS platform | `ios`, `android`, `windows` | +| `TargetPlatformIdentifier` (TPI) | The OS platform | `iOS`, `Android`, `Windows` | | `TargetPlatformVersion` (TPV) | The OS platform version | `12.0` or `13.0` | | `TargetPlatformMinVersion` (TPMV) | The minimum OS platform version | `12.0` or `13.0` | From 8174e6923b88c65c84656bb00145be92fe3959aa Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 13 Mar 2020 11:42:39 -0700 Subject: [PATCH 35/38] Fix name Co-Authored-By: Drew Noakes --- accepted/2020/net5/net5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index 0612365ee..f037d166b 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -621,7 +621,7 @@ There are some places in the IDE where targeting information is displayed: To support multi-targeting end-to-end the TFM unification isn't enough. We also need to unify the SDKs between .NET Core, Windows desktop, Xamarin, and maybe ASP.NET Core. Without it, multi-targeting doesn't work without having to use -3rd party tools, such as Oren's +3rd party tools, such as Claire's [MSBuild.Extras](https://github.com/onovotny/MSBuildSdkExtras). We should also make it easier to catch cases where some APIs aren't universally From 707b1aad8d6ccb80e78865532d256178f21aa240 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Fri, 13 Mar 2020 14:34:58 -0700 Subject: [PATCH 36/38] Fix URL --- accepted/2020/net5/net5.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index f037d166b..b70843b87 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -622,7 +622,7 @@ To support multi-targeting end-to-end the TFM unification isn't enough. We also need to unify the SDKs between .NET Core, Windows desktop, Xamarin, and maybe ASP.NET Core. Without it, multi-targeting doesn't work without having to use 3rd party tools, such as Claire's -[MSBuild.Extras](https://github.com/onovotny/MSBuildSdkExtras). +[MSBuild.Extras](https://github.com/novotnyllc/MSBuildSdkExtras). We should also make it easier to catch cases where some APIs aren't universally available anymore. This includes fundamentals like threading for platforms like From 9151e3bbbdd44c44d2d9a50d35f6e06e018e7e75 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 19 Mar 2020 14:39:29 -0700 Subject: [PATCH 37/38] Remove open issues 1. Validated that the scheme will work for iPad 2. Decided that the duplication is an implementation that MSBuild/SDK will figure out. --- accepted/2020/net5/net5.md | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index b70843b87..eea9647c6 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -279,8 +279,6 @@ We'll have the following TFMs: | | (+everything else inherited from net5.0) | | | Tizen, Unity... | Will follow the Xamarin model | | -_**Open Issue**. Will the above scheme work for iPad?_ - _**Open Issue**. Can we use a syntax that differentiates revving the bindings from the OS?, such as `net5.0-ios13.0-r1` or `net5.0-ios13.0A`?_ @@ -387,25 +385,6 @@ NuGet uses the long form `.NETFramework,Version=4.5` in the dependency groups. We may want to change NuGet to allow the friendly name there as well and update our packaging tools to re-write to friendly name on pack._ -_**Open Issue**. The SDK has this logic duplicated from NuGet because they need -to do this during evaluation where they can't call custom targets. We could make -this an MSBuild intrinsic, but that seems like a lot of work. Maybe we just live -with the duplication. But bottom line is that we need to make that change in -MSBuild too._ - -> "We've made it pretty far with duplicated logic, but it results in really ugly -> MSBuild, since it's not a very expressive programming language. It also -> creates the potential for drift between the two definitions. That said, -> exposing it directly would create a new tight coupling between MSBuild and -> NuGet that hasn't historically existed. It would probably require a direct -> dependency and update flow plus coherency requirements on both .NET Core SDK -> and VS insertions. If the logic were in a separate package (we've talked about -> pushing it down to the framework at various times) it'd be great to just -> expose that. With the logic in NuGet, it's reasonable either way, just -> different tradeoffs. I'm amenable to exposing a property function, but maybe -> we should go down the road of not doing it at first." -- -> [@rainersigwald](https://github.com/rainersigwald) - ### Window-specific behavior _**Open Issue**. Review with WinForms/WPF & Windows folks._ From ab544174b115dd7e1425c06c413bb3319fe66ef3 Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Mon, 23 Mar 2020 16:43:31 -0700 Subject: [PATCH 38/38] Record decision on OS versioning and how it relates to binding updates --- accepted/2020/net5/net5.md | 42 +++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/accepted/2020/net5/net5.md b/accepted/2020/net5/net5.md index eea9647c6..5278c8c66 100644 --- a/accepted/2020/net5/net5.md +++ b/accepted/2020/net5/net5.md @@ -279,9 +279,6 @@ We'll have the following TFMs: | | (+everything else inherited from net5.0) | | | Tizen, Unity... | Will follow the Xamarin model | | -_**Open Issue**. Can we use a syntax that differentiates revving the bindings -from the OS?, such as `net5.0-ios13.0-r1` or `net5.0-ios13.0A`?_ - ### OS versions The TFM will support an optional OS version, such as: @@ -335,6 +332,45 @@ However, it's a bit misleading to think of the OS version number as the version of the operating system you're running on. Rather, it's the operating system's API you're compiling for. +People should really think of the TFM's OS version as the version number of the +.NET OS bindings. Under normal circumstances we'll rev that version in lock step +with the OS. This will make it easy to understand which version you need to gain +access to the APIs. However, there are cases where that's not possible. For +example, iOS API bindings aren't fully generated; they require manual work. +Depending on how large the API surface in a given OS update is we might decide +to finish the bindings for the most useful OS APIs first and add other bindings +later (which we have done in the past). If the OS normally ships APIs in +*major.minor* then we can use the third digit to indicate binding-only updates. +However, we don't control the OS version so in principle there is no guarantee +that they don't ship new APIs in third- or fourth digit updates. + +Let's look at a concrete example. Assume that we shipped .NET 5 with iOS 13.0 +support and Apple released an update to iOS with new APIs, say iOS 13.1. Let's +say it takes us a few updates to finish binding them all: + +TFM | Description +-------------------|---------------------------- +`net5.0-ios13.0` | The entirety of iOS 13.0 +`net5.0-ios13.1.1` | First batch of bindings for iOS 13.1. +`net5.0-ios13.1.2` | Second batch of bindings for iOS 13.1. +`net5.0-ios13.1.3` | Third batch of bindings for iOS 13.1. + +Now let's say that Apple decides to ship an iOS 13.1.1 with new APIs as well. As +you can see, we already used that number to indicate the first batch of 13.1 +APIs. No biggie, we'd just bind these APIs in the next available train, which +happens to be `net5.0-ios13.1.4`. + +We don't expect this to be too confusing because we generally encourage people +to compile against the latest available OS API set and use +`TargetPlatformMinVersion` in order to run on older versions. The reference +assembly for the OS bindings will also include an attribute per API indicating +which OS version is required. These attributes, as well as +`TargetPlatformMinVersion`, will always be set to actual OS versions. + +So in practice we don't expect people having to match TFMs to specific OS +version but it's good to have numbers that are "close" enough to give project +maintainers some idea of what's available to them. + ### Mapping to properties These are the relevant MSBuild properties: