From 180526c8b44625caff03d545240ffd22e0404899 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Sat, 3 Feb 2018 12:06:12 +0100 Subject: [PATCH] self-signed-certificate + #83 --- README.md | 14 ++- .../Program.cs | 2 +- .../Program.cs | 2 +- .../Program.cs | 2 +- .../MainApp.cs | 2 +- src/WireMock.Net.StandAlone/StandAloneApp.cs | 2 +- src/WireMock.Net/Http/HttpClientHelper.cs | 3 +- .../ClientCertificateHelper.cs} | 4 +- .../PublicCertificateHelper.cs | 91 ++++++++++++++++++ src/WireMock.Net/Owin/AspNetCoreSelfHost.cs | 5 +- .../ResponseBuilders/IProxyResponseBuilder.cs | 10 +- src/WireMock.Net/ResponseBuilders/Response.cs | 20 ++-- .../Server/FluentMockServer.Admin.cs | 2 +- .../Settings/IProxyAndRecordSettings.cs | 5 +- .../Settings/ProxyAndRecordSettings.cs | 4 +- src/WireMock.Net/WireMock.Net.csproj | 7 +- src/WireMock.Net/self-signed-certificate.pfx | Bin 4150 -> 0 bytes 17 files changed, 143 insertions(+), 32 deletions(-) rename src/WireMock.Net/{Http/CertificateUtil.cs => HttpsCertificate/ClientCertificateHelper.cs} (94%) create mode 100644 src/WireMock.Net/HttpsCertificate/PublicCertificateHelper.cs delete mode 100644 src/WireMock.Net/self-signed-certificate.pfx diff --git a/README.md b/README.md index 14a1d81c..aaf80974 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,16 @@ This is quite straight forward to launch a mock server within a console applicat ### SSL You can start a standalone mock server listening for HTTPS requests. To do so, there is just a flag to set when creating the server: ```csharp -var server = FluentMockServer.Start(port: 8443, ssl: true); +var server1 = FluentMockServer.Start(port: 8443, ssl: true); + +// or like this + +var server2 = FluentMockServer.Start(new FluentMockServerSettings +{ + Urls = new[] { "http://localhost:9091", "https://localhost:9443" } +}); ``` -Obviously you need a certificate registered on your box, properly associated with your application and the port number that will be used. This is not really specific to WireMock, not very straightforward and hence the following stackoverflow thread might come handy: [Httplistener with https support](http://stackoverflow.com/questions/11403333/httplistener-with-https-support) + +- In case when using **net 4.5.2** or **net 4.6**, you need a certificate registered on your box, properly associated with your application and the port number that will be used. This is not really specific to WireMock.Net, not very straightforward and hence the following stackoverflow thread might come handy: [Httplistener with https support](http://stackoverflow.com/questions/11403333/httplistener-with-https-support). + +- When using **netstandard**, WireMock.Net uses a self signed certificate (which can be overriden if you like) to host https urls. diff --git a/examples/WireMock.Net.Console.Proxy.NETCoreApp2/Program.cs b/examples/WireMock.Net.Console.Proxy.NETCoreApp2/Program.cs index 3fa7bf11..96c67ee1 100644 --- a/examples/WireMock.Net.Console.Proxy.NETCoreApp2/Program.cs +++ b/examples/WireMock.Net.Console.Proxy.NETCoreApp2/Program.cs @@ -16,7 +16,7 @@ namespace WireMock.Net.Console.Proxy.NETCoreApp2 ProxyAndRecordSettings = new ProxyAndRecordSettings { Url = "https://www.google.com", - //X509Certificate2ThumbprintOrSubjectName = "www.yourclientcertname.com OR yourcertificatethumbprint (only if the service you're proxying to requires it)", + //ClientX509Certificate2ThumbprintOrSubjectName = "www.yourclientcertname.com OR yourcertificatethumbprint (only if the service you're proxying to requires it)", SaveMapping = true, SaveMappingToFile = false, BlackListedHeaders = new[] { "dnt", "Content-Length" } diff --git a/examples/WireMock.Net.Console.Proxy.Net452/Program.cs b/examples/WireMock.Net.Console.Proxy.Net452/Program.cs index 78df8f0d..5a0c5d52 100644 --- a/examples/WireMock.Net.Console.Proxy.Net452/Program.cs +++ b/examples/WireMock.Net.Console.Proxy.Net452/Program.cs @@ -16,7 +16,7 @@ namespace WireMock.Net.Console.Proxy.Net452 ProxyAndRecordSettings = new ProxyAndRecordSettings { Url = "https://www.google.com", - //X509Certificate2ThumbprintOrSubjectName = "www.yourclientcertname.com OR yourcertificatethumbprint (only if the service you're proxying to requires it)", + //ClientX509Certificate2ThumbprintOrSubjectName = "www.yourclientcertname.com OR yourcertificatethumbprint (only if the service you're proxying to requires it)", SaveMapping = true, SaveMappingToFile = false, BlackListedHeaders = new[] { "dnt", "Content-Length" } diff --git a/examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs b/examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs index f70e493e..0a2e0cab 100644 --- a/examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs +++ b/examples/WireMock.Net.Console.Record.NETCoreApp/Program.cs @@ -16,7 +16,7 @@ namespace WireMock.Net.Console.Proxy.NETCoreApp ProxyAndRecordSettings = new ProxyAndRecordSettings { Url = "https://www.google.com", - //X509Certificate2ThumbprintOrSubjectName = "www.yourclientcertname.com OR yourcertificatethumbprint (only if the service you're proxying to requires it)", + //ClientX509Certificate2ThumbprintOrSubjectName = "www.yourclientcertname.com OR yourcertificatethumbprint (only if the service you're proxying to requires it)", SaveMapping = true, SaveMappingToFile = false, BlackListedHeaders = new [] { "dnt", "Content-Length" } diff --git a/examples/WireMock.Net.ConsoleApplication/MainApp.cs b/examples/WireMock.Net.ConsoleApplication/MainApp.cs index 14bd08a3..c5a23ffa 100644 --- a/examples/WireMock.Net.ConsoleApplication/MainApp.cs +++ b/examples/WireMock.Net.ConsoleApplication/MainApp.cs @@ -28,7 +28,7 @@ namespace WireMock.Net.ConsoleApplication PreWireMockMiddlewareInit = app => { System.Console.WriteLine($"PreWireMockMiddlewareInit : {app.GetType()}"); }, PostWireMockMiddlewareInit = app => { System.Console.WriteLine($"PostWireMockMiddlewareInit : {app.GetType()}"); } }); - System.Console.WriteLine("FluentMockServer listening at {0}", string.Join(" and ", server.Urls)); + System.Console.WriteLine("FluentMockServer listening at {0}", string.Join(",", server.Urls)); server.SetBasicAuthentication("a", "b"); diff --git a/src/WireMock.Net.StandAlone/StandAloneApp.cs b/src/WireMock.Net.StandAlone/StandAloneApp.cs index 59924152..a2b365cd 100644 --- a/src/WireMock.Net.StandAlone/StandAloneApp.cs +++ b/src/WireMock.Net.StandAlone/StandAloneApp.cs @@ -67,7 +67,7 @@ namespace WireMock.Net.StandAlone Url = proxyURL, SaveMapping = parser.GetBoolValue("SaveMapping"), SaveMappingToFile = parser.GetBoolValue("SaveMappingToFile"), - X509Certificate2ThumbprintOrSubjectName = parser.GetStringValue("X509Certificate2ThumbprintOrSubjectName"), + ClientX509Certificate2ThumbprintOrSubjectName = parser.GetStringValue("ClientX509Certificate2ThumbprintOrSubjectName"), BlackListedHeaders = parser.GetValues("BlackListedHeaders") }; } diff --git a/src/WireMock.Net/Http/HttpClientHelper.cs b/src/WireMock.Net/Http/HttpClientHelper.cs index ffe55f1c..b7634efc 100644 --- a/src/WireMock.Net/Http/HttpClientHelper.cs +++ b/src/WireMock.Net/Http/HttpClientHelper.cs @@ -5,6 +5,7 @@ using System.Net; using System.Net.Http; using System.Threading.Tasks; using Newtonsoft.Json; +using WireMock.HttpsCertificate; using WireMock.Validation; namespace WireMock.Http @@ -33,7 +34,7 @@ namespace WireMock.Http { handler.ClientCertificateOptions = ClientCertificateOption.Manual; - var x509Certificate2 = CertificateUtil.GetCertificate(clientX509Certificate2ThumbprintOrSubjectName); + var x509Certificate2 = ClientCertificateHelper.GetCertificate(clientX509Certificate2ThumbprintOrSubjectName); handler.ClientCertificates.Add(x509Certificate2); } diff --git a/src/WireMock.Net/Http/CertificateUtil.cs b/src/WireMock.Net/HttpsCertificate/ClientCertificateHelper.cs similarity index 94% rename from src/WireMock.Net/Http/CertificateUtil.cs rename to src/WireMock.Net/HttpsCertificate/ClientCertificateHelper.cs index 819792a4..8237560d 100644 --- a/src/WireMock.Net/Http/CertificateUtil.cs +++ b/src/WireMock.Net/HttpsCertificate/ClientCertificateHelper.cs @@ -1,9 +1,9 @@ using System; using System.Security.Cryptography.X509Certificates; -namespace WireMock.Http +namespace WireMock.HttpsCertificate { - internal static class CertificateUtil + internal static class ClientCertificateHelper { public static X509Certificate2 GetCertificate(string thumbprintOrSubjectName) { diff --git a/src/WireMock.Net/HttpsCertificate/PublicCertificateHelper.cs b/src/WireMock.Net/HttpsCertificate/PublicCertificateHelper.cs new file mode 100644 index 00000000..962fddfd --- /dev/null +++ b/src/WireMock.Net/HttpsCertificate/PublicCertificateHelper.cs @@ -0,0 +1,91 @@ +using System; +using System.Security.Cryptography.X509Certificates; + +namespace WireMock.HttpsCertificate +{ + internal static class PublicCertificateHelper + { + // 1] Generate using https://www.pluralsight.com/blog/software-development/selfcert-create-a-self-signed-certificate-interactively-gui-or-programmatically-in-net + // 2] Converted to Base64 + private const string Data = @"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 +"; + + public static X509Certificate2 GetX509Certificate2() + { + byte[] data = Convert.FromBase64String(Data); + return new X509Certificate2(data); + } + } +} \ No newline at end of file diff --git a/src/WireMock.Net/Owin/AspNetCoreSelfHost.cs b/src/WireMock.Net/Owin/AspNetCoreSelfHost.cs index f8e05bac..130b4e72 100644 --- a/src/WireMock.Net/Owin/AspNetCoreSelfHost.cs +++ b/src/WireMock.Net/Owin/AspNetCoreSelfHost.cs @@ -9,6 +9,7 @@ using JetBrains.Annotations; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using WireMock.Http; +using WireMock.HttpsCertificate; using WireMock.Validation; namespace WireMock.Owin @@ -59,7 +60,7 @@ namespace WireMock.Owin #if NETSTANDARD1_3 if (_urls.Any(u => u.StartsWith("https://", StringComparison.OrdinalIgnoreCase))) { - options.UseHttps("self-signed-certificate.pfx"); + options.UseHttps(PublicCertificateHelper.GetX509Certificate2()); } #else // https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?tabs=aspnetcore2x @@ -74,7 +75,7 @@ namespace WireMock.Owin PortUtil.TryExtractProtocolAndPort(url, out string host, out int port); options.Listen(IPAddress.Loopback, port, listenOptions => { - listenOptions.UseHttps("self-signed-certificate.pfx"); + listenOptions.UseHttps(PublicCertificateHelper.GetX509Certificate2()); }); } #endif diff --git a/src/WireMock.Net/ResponseBuilders/IProxyResponseBuilder.cs b/src/WireMock.Net/ResponseBuilders/IProxyResponseBuilder.cs index 0152baa7..d8399cf1 100644 --- a/src/WireMock.Net/ResponseBuilders/IProxyResponseBuilder.cs +++ b/src/WireMock.Net/ResponseBuilders/IProxyResponseBuilder.cs @@ -1,4 +1,5 @@ using JetBrains.Annotations; +using WireMock.Settings; namespace WireMock.ResponseBuilders { @@ -8,11 +9,18 @@ namespace WireMock.ResponseBuilders public interface IProxyResponseBuilder : IStatusCodeResponseBuilder { /// - /// With Proxy URL using X509Certificate2. + /// WithProxy URL using Client X509Certificate2. /// /// The proxy url. /// The X509Certificate2 file to use for client authentication. /// A . IResponseBuilder WithProxy([NotNull] string proxyUrl, [CanBeNull] string clientX509Certificate2ThumbprintOrSubjectName = null); + + /// + /// WithProxy using IProxyAndRecordSettings. + /// + /// The IProxyAndRecordSettings. + /// A . + IResponseBuilder WithProxy([NotNull] IProxyAndRecordSettings settings); } } \ No newline at end of file diff --git a/src/WireMock.Net/ResponseBuilders/Response.cs b/src/WireMock.Net/ResponseBuilders/Response.cs index 05cf7b2c..96ed90ee 100644 --- a/src/WireMock.Net/ResponseBuilders/Response.cs +++ b/src/WireMock.Net/ResponseBuilders/Response.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using JetBrains.Annotations; using Newtonsoft.Json; using WireMock.Http; +using WireMock.Settings; using WireMock.Transformers; using WireMock.Util; using WireMock.Validation; @@ -43,7 +44,7 @@ namespace WireMock.ResponseBuilders /// /// The client X509Certificate2 Thumbprint or SubjectName to use. /// - public string X509Certificate2ThumbprintOrSubjectName { get; private set; } + public string ClientX509Certificate2ThumbprintOrSubjectName { get; private set; } /// /// Gets the response message. @@ -296,22 +297,25 @@ namespace WireMock.ResponseBuilders return WithDelay(TimeSpan.FromMilliseconds(milliseconds)); } - /// - /// With Proxy URL. - /// - /// The proxy url. - /// The X509Certificate2 file to use for client authentication. - /// A . + /// public IResponseBuilder WithProxy(string proxyUrl, string clientX509Certificate2ThumbprintOrSubjectName = null) { Check.NotEmpty(proxyUrl, nameof(proxyUrl)); ProxyUrl = proxyUrl; - X509Certificate2ThumbprintOrSubjectName = clientX509Certificate2ThumbprintOrSubjectName; + ClientX509Certificate2ThumbprintOrSubjectName = clientX509Certificate2ThumbprintOrSubjectName; _httpClientForProxy = HttpClientHelper.CreateHttpClient(clientX509Certificate2ThumbprintOrSubjectName); return this; } + /// + public IResponseBuilder WithProxy(IProxyAndRecordSettings settings) + { + Check.NotNull(settings, nameof(settings)); + + return WithProxy(settings.Url, settings.ClientX509Certificate2ThumbprintOrSubjectName); + } + /// /// The provide response. /// diff --git a/src/WireMock.Net/Server/FluentMockServer.Admin.cs b/src/WireMock.Net/Server/FluentMockServer.Admin.cs index 7202a6d8..73c71c1f 100644 --- a/src/WireMock.Net/Server/FluentMockServer.Admin.cs +++ b/src/WireMock.Net/Server/FluentMockServer.Admin.cs @@ -135,7 +135,7 @@ namespace WireMock.Server private void InitProxyAndRecord(IProxyAndRecordSettings settings) { - _httpClientForProxy = HttpClientHelper.CreateHttpClient(settings.X509Certificate2ThumbprintOrSubjectName); + _httpClientForProxy = HttpClientHelper.CreateHttpClient(settings.ClientX509Certificate2ThumbprintOrSubjectName); Given(Request.Create().WithPath("/*").UsingAnyVerb()).RespondWith(new ProxyAsyncResponseProvider(ProxyAndRecordAsync, settings)); } diff --git a/src/WireMock.Net/Settings/IProxyAndRecordSettings.cs b/src/WireMock.Net/Settings/IProxyAndRecordSettings.cs index 005c63b8..f47c3433 100644 --- a/src/WireMock.Net/Settings/IProxyAndRecordSettings.cs +++ b/src/WireMock.Net/Settings/IProxyAndRecordSettings.cs @@ -21,9 +21,10 @@ bool SaveMappingToFile { get; set; } /// - /// The clientCertificate thumbprint or subject name fragment to use. Example thumbprint : "D2DBF135A8D06ACCD0E1FAD9BFB28678DF7A9818". Example subject name: "www.google.com"" + /// The clientCertificate thumbprint or subject name fragment to use. + /// Example thumbprint : "D2DBF135A8D06ACCD0E1FAD9BFB28678DF7A9818". Example subject name: "www.google.com"" /// - string X509Certificate2ThumbprintOrSubjectName { get; set; } + string ClientX509Certificate2ThumbprintOrSubjectName { get; set; } /// /// Defines a list from headers which will excluded from the saved mappings. diff --git a/src/WireMock.Net/Settings/ProxyAndRecordSettings.cs b/src/WireMock.Net/Settings/ProxyAndRecordSettings.cs index ed1df0be..3cc6c027 100644 --- a/src/WireMock.Net/Settings/ProxyAndRecordSettings.cs +++ b/src/WireMock.Net/Settings/ProxyAndRecordSettings.cs @@ -19,9 +19,9 @@ namespace WireMock.Settings [PublicAPI] public bool SaveMappingToFile { get; set; } = true; - /// + /// [PublicAPI] - public string X509Certificate2ThumbprintOrSubjectName { get; set; } + public string ClientX509Certificate2ThumbprintOrSubjectName { get; set; } /// [PublicAPI] diff --git a/src/WireMock.Net/WireMock.Net.csproj b/src/WireMock.Net/WireMock.Net.csproj index 22915689..7884a767 100644 --- a/src/WireMock.Net/WireMock.Net.csproj +++ b/src/WireMock.Net/WireMock.Net.csproj @@ -41,6 +41,7 @@ + @@ -66,10 +67,4 @@ - - - PreserveNewest - - - \ No newline at end of file diff --git a/src/WireMock.Net/self-signed-certificate.pfx b/src/WireMock.Net/self-signed-certificate.pfx deleted file mode 100644 index a3bf2a055972c1c1476ddb055c7c0d5d44f0bfae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4150 zcmZWrcTm&cvi}A`fY7B#2Pr|Sp#+d7f(eKeDJmG65Sj=`uOfsh9TX{sP=bOq5u^pA zN|z=bqVyu5AYF>y{O-JW@4R`lvwQY@KA+v4^Us-uW0~bBK$LJS(@zMkM6_=75d(-C zl!s-S17n$H$?zl`3yu9h6f_Wwh5C|VPqMo~=>DgQ9txt!!_tPrv9v*OUI_GmVRCau zFilM|$v07HESQ3VdKiqQHFr%Gy=L7U*AvZRb~;4qZv#ng-HUPfq*}v#jh>0l(GT5b zI2k=U_{bXV(6+Ylecr}a?9wHdU`&H0zAYrMjB}}xn)8Itju#U#8hG03KRdySd;!?| zjteb_`L~_Fa3hh*wo;xANijoFP#;0173+zR8|~5>%@mEsrg3FSaefa%UJSJFkTxqa znJ=Tds>8LacN@4w>vK~t7rK!i9S6VlJdagast}jdD=3jE7H(}&F#GQIO%+{_*RL=ywPR72V< z*&ax?WPaQ$;%j}QU7@%en_49t7bC6gNct=RyuE`dT~1r|WjOTkE#=As%X7tabs;T7 zXI@D)@#<>C%$DPhhjvS#UU<4=n1Wq%e7lIHj*plvZJ5svdf@(oo8@+y7Y|tJ=G2U| zDy8$fb4tygN7la!l6+75=Ie;nI92WTPyEe1bIdT)4)$^)LfQa z*-lqS38dX*>FerO;_Fc>pA^2No6e4qJf2ftx8(eQ^kTHwIap@L-Me$;=p%u;aDCjn zLvT$asAA3)SH#EO!WDzku+NkbEB9wi|MoSqZjvd3@ycjB|I0P1(E|7BiX*M5oLWt_ z!!!F_ViL=33Q*9a*nax?6da{&a1tNejH`$)Ux4rk$&t?_NSby!ozBzSt3E*;-}!d; zq>U1^vxo#D=;>t;1^EAan!~HNO_FKX|)Jn{6&UDOQKF`!5IeWykSY z3U%igTFva*@pRv%=jL_h-?a#JtHsnUTG__};Xf5cjC&7X`xekK;3iy-rUb_4=s~aq+W5oyXs0KHe>ptSFbJmT3$IRtgsNi6qJ z^a_ror45?|eNpJk8PLwYcUxu(&(CLOFza%DBOyZV_o+EJP?)8@Q*&dW_RvXYh=h`g9&ehZk3qGCVH04`lxcF=$=1;K}13 zA7yc$^~b5oh|SPA&&}FWb4iZ}9B~TG2b7X*n+C5*TBMJ67|u|5^)?Wh-+(<~>bJzC z2S@AfQH2`2S;!OWB==>Em>X@)sEq?+1;cd`f(?_(Cj=f~3ohy)df)C8ZB=zX2O`*W+sbu@3 zGb<4(Hcj}iIJY3(_|aeURNBn&*H@ZX8Pjb8^e&|#AFQb^Po07_o~`Ped`JbUX~%G~ zWBOdDHCdx@bE)#pX;Hpv%o5zcQ@;JUP#&C%qpka+eq>!Aov0zBHq~GLO!#Q~D{GJL zM?ve4u?jVfp^(7KQzZO$>m@n&IWhRT=NY(Ec43kS0$7#3QFHkvb}8qE(BIMe+0|#i z!5C8o%_Oce$tSW%%{gz}v$|LG`75QHBnlTzNXm3? zx*~@#eX{mZ(>ddpHH#Ic%r8Q7I}6=@`v=vAy9VXr(*8x$49RhDk#~G^i9=3DRq=cH z$_Xu+H237#*!;=DSLWWyO{DK>0}WH$9tVXNKg^oT=hL4-CP3F@yXQE^lQ}G<9>zI4 zn6HvRKOzXKg(<+aV|3260gP+g!UZ4X3V>^Q3A(Y-nzn`{$5R}IBWT~ zp?g^7c?xfj=nUkAyKDHxosYD=eq(X@y9ay>>MMMczlC2AZtUK)deSm_!p8B4hAxGw zXlT;f3o@E=L+8$+{c`-|3u<(OdDT$>rf|FVkQ+0eodmEu+6an zFnXZB(hEb&!|jHlazYL7Da!dQ?q1)tZXse7weR5(UJHdA@qpQ|*J))XDL-}WB%7{=jGlbhJtn#wKE!o`eNnu&M*L{j z%Hud{^vmeU;fO>Kr!sSx$R6hbRr&H_FJA(fS7f2jf9nombE_;a&vgqIgfV1I^=ArJ zoJjbr@)r7%>{*pob02;tWF;z3BGYK+T-n7Y z04pRTxg#ea=6vWSpZwN;C(4PMBhOVApQxPUkouR6J=l7wc<*wHr87=Cl0*&dM6RfH zTjb5Nqzc6GWvx@?ZYPyl)9y|A3` zXEYb(!b^{R2a6oSs_&!{ro()f!sROIKYB$m8S-HEbW(q?#2XB*7!DwL5Jp;SZzptm ztj;NhsN!zfz^u@@2MX_X7rbLS6d%uk=h!cHK4PgDD=^bqpGlbrp9w%27nF;}6VR4X zUq4}47iu@!iZ?iJZL5~xzF&gG(wYs(hR?!T|Ff>qvdcoiU=RQR@O%FS*<|(jbpa(n z89)GV00Y>Qqdg!E*Z~fJBRNU~3cv$0_fMt_TqP^v|7J1d{2!Ag+f_i3%-aD7xGRKK z5&{B)uu3c-S!;evzyNR|xAOu#0B^E80zQBsfCStDXL3__GUGrVDF|qj6@kEGGV1|2 zk@E-S-1*;?g23&6SNoA~7_!=nto9?1lmXyyES1iG-a!q?!%``eAq5H$Kt81Z%Ygp> z0!rcP`x)XQ?()w98iu6;vOzMULoBHk#;0=fPC1*UAR&o1uaVgpsT{{olt!I?UPL00 zI5aYBNuw&K|AP1)^|T^>znnDRwqRDx zks}V5{2|yb1iB%hsM0LisB_`^d;ghJ85o86K7D}gd|!cfr>Ua7MguM;OwhsZebwzw z#tPZ$U>B*FtVa|R4`xQxQTLHc&4_|Ig)&yho}xkdWoUn}j)_g;`F(eBrm`ib@Nlzd z6sMeHRBmhEVB03Nf%c=bEu~Da>xnz8!rYl|yjYcqM;*nHt{xN%8-Zyw_ZQbV4N8a= ztuY5zS1s%upY(9hA#(HYr+Z9tK4Bdx)Qoe_9n+Ql@FE{PiP|8zK3AmgP0VP{QkyAt zZ0cGNY2B*LzVd$Tpd6pXbt)%9i#iIkq_wSW-<*(*R}rWbDr0Ghi(zcV;RLWfqn265ZV+_ef*k?@N7ld?7!%HM4G;fhpT@Bn>C*im*^Ng6+E-xnI4Nafe^ zBI~T4GR-pfIqOeGHU!KoBIk{uHQI_ykl?`|6hyVfN+}nLUi{Eq6iQ`>2yo9zZ z=)AGaD!+Ee;HDDY>!zuVbtR|(I#tpMiuR+pxfj5rMm$Gjv%bgVH6f#nOu5^=IO%0l zbxUnS64B`}LxNfC#dk$Ix>OpHUzlxg^7ZOQeE89X37@DK)ikR|XN3a(wwxy=##~GF z_`eLs7X10_3C|Ilx4O?c5M_v=ox57=Fyphj#u|$TLRUBbj&g)Zc@rt#@^SJ;;yk}& zxaT3PIQ#ENDm0h&E1WAwh@N?F(MjUCH9)D!>9>!mLA!@im6FfA$usTr>*@4XQ9g$c z%h7a_jOnoRg}l3tVW`>hoej|j%RLuY+i;E@!eZ;X+i`S_<;!SYd!!Ye43F0)U4caMl^RKr#Zn+y@l_+PiLN~>?)2^$Lb`MMKT zT{>VtloqOG@SNLt0%8yeo!f0m1jjY_bITh7EG{_B-dQfzL1*S4L5Z9dKW~3<9h!Z*imv@p z+tBt|HsVcZG*AZXyFioGPs`u^n-Vl%?_|#4V;YMzhrOZ6cjng3K$oQ}Tg#qm?#n$~ zs;Gp-8|n?5Y+244^XQ|~TsNy!s40@Q5E`hW$`$9GpQb8M~iFbs_L9D!ziqDLtCa+uhE! zbkn*%2QGd~7xaD*H`zS~>EJcdaH5$M6;}Gy{+Px8e7}#O_MMTFabjK#c<1>6(M&>9 z;ODO6^#lEClz)F^oGxYC4Pm H`9S{#0=R=A