From b708921ebe0974a31b081f4bae58b4034f9beba9 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 14 Oct 2016 10:25:28 +0100 Subject: [PATCH 01/17] Always use FSharp.Core not fsharp.core (#1610) --- DEVGUIDE.md | 7 +++++-- src/fsharp-library-build.proj | 2 +- src/fsharp/CompileOps.fs | 4 ++-- .../FSharp.Core.Unittests.fsproj | 2 +- .../FSharp.Core.Unittests/LibraryTestFx.fs | 2 +- .../Microsoft.FSharp.Core.netcore.nuspec | 2 +- src/fsharp/fsc.fs | 2 +- tests/BuildTestTools.cmd | 16 ++++++++-------- tests/fsharp/single-test-build.bat | 2 +- tests/fsharp/single-test-build.fs | 2 +- tests/fsharp/single-test-run.bat | 1 + .../testenv/src/deployProj/CompileProj.fsx | 7 ++++--- .../testenv/src/deployProj/DeployProj.fsx | 6 +++--- 13 files changed, 30 insertions(+), 25 deletions(-) rename src/fsharp/{fsharp.core.netcore.nuget => FSharp.Core.netcore.nuget}/Microsoft.FSharp.Core.netcore.nuspec (99%) diff --git a/DEVGUIDE.md b/DEVGUIDE.md index d5b58b32757..cce9f1b8958 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -78,7 +78,7 @@ and Visual F# Tools then building the solution will be enough. The compiler is compiled as a set of .NET 4.0 components using a bootstrap process. This uses a Last Known Good (LKG) compiler checked into this repository to build. - msbuild src\fsharp-proto-build.proj + msbuild src/fsharp-proto-build.proj ### 2. Building an F# (Debug) library and compiler @@ -184,7 +184,7 @@ For **Release**: 1. Run ``vsintegration\update-vsintegration.cmd release`` (clobbers the installed F# SDK) -### Notes on the build +### Notes on the .NET Framework build 1. The `update.cmd` script adds required strong name validation skips, and NGens the compiler and libraries. This requires admin privileges. 1. The compiler binaries produced are "private" and strong-named signed with a test key. @@ -195,6 +195,9 @@ For **Release**: - We use the proto compiler to compile the source for `FSharp.Core.dll` in this distribution. - We use the proto compiler to compile the source for `FSharp.Compiler.dll`, `fsc.exe`, `fsi.exe`, and other binaries found in this distribution. + + + ## Resources The primary technical guide to the core compiler code is [The F# Compiler Technical Guide](http://fsharp.github.io/2015/09/29/fsharp-compiler-guide.html). Please read and contribute to that guide. diff --git a/src/fsharp-library-build.proj b/src/fsharp-library-build.proj index 83c7957f5be..a8bbca5d542 100644 --- a/src/fsharp-library-build.proj +++ b/src/fsharp-library-build.proj @@ -9,7 +9,7 @@ - + diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 4858286e0bd..6b00a7b96f3 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -1605,7 +1605,7 @@ let GetFSharpCoreReferenceUsedByCompiler(useSimpleResolution) = let fsCoreName = GetFSharpCoreLibraryName() #if FX_RESHAPED_REFLECTION // RESHAPED_REFLECTION does not have Assembly.GetReferencedAssemblies() - // So use the fsharp.core.dll from alongside the fsc compiler. + // So use the FSharp.Core.dll from alongside the fsc compiler. // This can also be used for the out of gac work on DEV15 let fscCoreLocation = let fscLocation = typeof.Assembly.Location @@ -2560,7 +2560,7 @@ type TcConfig private (data : TcConfigBuilder,validate:bool) = | _ -> res let primaryAssemblyCcuInitializer = getSystemRuntimeInitializer data.primaryAssembly (computeKnownDllReference >> fst) - // If either mscorlib.dll/System.Runtime.dll or fsharp.core.dll are explicitly specified then we require the --noframework flag. + // If either mscorlib.dll/System.Runtime.dll or FSharp.Core.dll are explicitly specified then we require the --noframework flag. // The reason is that some non-default frameworks may not have the default dlls. For example, Client profile does // not have System.Web.dll. do if ((primaryAssemblyExplicitFilenameOpt.IsSome || fslibExplicitFilenameOpt.IsSome) && data.framework) then diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index ce345f5da96..60d23f046ba 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -21,7 +21,7 @@ false netcore $(NoWarn);217 - $(FSharpSourcesRoot)\..\tests\testbin\$(Configuration)\coreclr\fsharp.core.unittests + $(FSharpSourcesRoot)\..\tests\testbin\$(Configuration)\coreclr\FSharp.Core.unittests true diff --git a/src/fsharp/FSharp.Core.Unittests/LibraryTestFx.fs b/src/fsharp/FSharp.Core.Unittests/LibraryTestFx.fs index 548cd02f04c..3da75fef82c 100644 --- a/src/fsharp/FSharp.Core.Unittests/LibraryTestFx.fs +++ b/src/fsharp/FSharp.Core.Unittests/LibraryTestFx.fs @@ -77,7 +77,7 @@ module SurfaceArea = // gets string form of public surface area for the currently-loaded FSharp.Core let private getActual () = - // get current fsharp.core + // get current FSharp.Core let asm = #if portable7 || portable78 || portable259 || coreclr typeof.GetTypeInfo().Assembly diff --git a/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec b/src/fsharp/FSharp.Core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec similarity index 99% rename from src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec rename to src/fsharp/FSharp.Core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec index 2cf75164d6b..a9ccdbb3215 100644 --- a/src/fsharp/fsharp.core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec +++ b/src/fsharp/FSharp.Core.netcore.nuget/Microsoft.FSharp.Core.netcore.nuspec @@ -3,7 +3,7 @@ Microsoft.FSharp.Core.netcore - .NET Core compatible version of the fsharp core library fsharp.core.dll + .NET Core compatible version of the fsharp core library FSharp.Core.dll Supported Platforms: - .NET Core (netstandard1.6) en-US diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 897edd53da3..102abdd4797 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -2050,7 +2050,7 @@ let main4 (Args (tcConfig, errorLogger: ErrorLogger, ilGlobals, ilxMainModule, o AbortOnError(errorLogger, tcConfig, exiter) - // Don't copy referenced fharp.core.dll if we are building fsharp.core.dll + // Don't copy referenced FSharp.core.dll if we are building FSharp.Core.dll if tcConfig.copyFSharpCore && not tcConfig.compilingFslib && not tcConfig.standalone then copyFSharpCore(outfile, tcConfig.referencedDLLs) diff --git a/tests/BuildTestTools.cmd b/tests/BuildTestTools.cmd index deb4062d969..be7bb1efeef 100644 --- a/tests/BuildTestTools.cmd +++ b/tests/BuildTestTools.cmd @@ -81,20 +81,20 @@ if '%BUILD_CORECLR%' == '1' ( ) rem deploy x86 version of compiler and dependencies - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet rem deploy x64 version of compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet rem deploy linux version of built compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\fsc\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet rem deploy osx version of built compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\fsc\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\fsharp.core.dll --output:%~dp0testbin\%1\coreclr\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\fsc\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet + %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet echo "%NUNITPATH%*.*" "%~dp0fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y xcopy "%NUNITPATH%*.*" "%~dp0fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y diff --git a/tests/fsharp/single-test-build.bat b/tests/fsharp/single-test-build.bat index 59e076879b7..76ac3de1e61 100644 --- a/tests/fsharp/single-test-build.bat +++ b/tests/fsharp/single-test-build.bat @@ -131,7 +131,7 @@ set command_line_args=%command_line_args% --targetPlatformName:.NETStandard,Vers set command_line_args=%command_line_args% --source:"%~d0%~p0coreclr_utilities.fs" --source:"%sources%" set command_line_args=%command_line_args% --packagesDir:%~d0%~p0..\..\packages set command_line_args=%command_line_args% --projectJsonLock:%~d0%~p0project.lock.json -set command_line_args=%command_line_args% --fsharpCore:%~d0%~p0..\testbin\%flavor%\coreclr\fsc\%platform%\fsharp.core.dll +set command_line_args=%command_line_args% --fsharpCore:%~d0%~p0..\testbin\%flavor%\coreclr\fsc\%platform%\FSharp.Core.dll set command_line_args=%command_line_args% --define:CoreClr --define:NetCore set command_line_args=%command_line_args% --compilerPath:%~d0%~p0..\testbin\%flavor%\coreclr\fsc\%platform% set command_line_args=%command_line_args% --copyCompiler:yes diff --git a/tests/fsharp/single-test-build.fs b/tests/fsharp/single-test-build.fs index 9c51e645a57..08d421dd29f 100644 --- a/tests/fsharp/single-test-build.fs +++ b/tests/fsharp/single-test-build.fs @@ -19,7 +19,7 @@ let singleTestBuild cfg testDir = let buildOkPath = testDir / "build.ok" do if fileExists "build.ok" then del "build.ok" - //remove FSharp.Core.dll from the target directory to ensure that compiler uses the correct fsharp.core.dll + //remove FSharp.Core.dll from the target directory to ensure that compiler uses the correct FSharp.Core.dll do if fileExists "FSharp.Core.dll" then del "FSharp.Core.dll" diff --git a/tests/fsharp/single-test-run.bat b/tests/fsharp/single-test-run.bat index f365c7b1be0..2fec6db6268 100644 --- a/tests/fsharp/single-test-run.bat +++ b/tests/fsharp/single-test-run.bat @@ -178,6 +178,7 @@ goto :EOF set platform=win7-x64 set packagesDir=%~d0%~p0..\..\packages For %%A in ("%cd%") do ( Set TestCaseName=%%~nxA) + echo %~d0%~p0..\testbin\%flavor%\coreclr\%platform%\corerun.exe %~d0%~p0..\testbin\%flavor%\coreclr\fsharp\core\%TestCaseName%\output\test.exe > coreclr.run.cmd %CLIX% %~d0%~p0..\testbin\%flavor%\coreclr\%platform%\corerun.exe %~d0%~p0..\testbin\%flavor%\coreclr\fsharp\core\%TestCaseName%\output\test.exe dir test.ok > NUL 2>&1 ) || ( @echo :FSC_CORECLR failed diff --git a/tests/fsharpqa/testenv/src/deployProj/CompileProj.fsx b/tests/fsharpqa/testenv/src/deployProj/CompileProj.fsx index c54912fd9e6..5362274270d 100644 --- a/tests/fsharpqa/testenv/src/deployProj/CompileProj.fsx +++ b/tests/fsharpqa/testenv/src/deployProj/CompileProj.fsx @@ -30,7 +30,7 @@ let GetArgumentFromCommandLine switchName defaultValue = let ProjectJsonLock = GetArgumentFromCommandLine "--projectJsonLock:" @"tests\fsharp\project.lock.json" let PackagesDir = GetArgumentFromCommandLine "--packagesDir:" @"packages" let TargetPlatformName = GetArgumentFromCommandLine "--targetPlatformName:" @"DNXCore,Version=v5.0/win7-x64" -let FSharpCore = GetArgumentFromCommandLine "--fsharpCore:" @"Release\coreclr\bin\fsharp.core.dll" +let FSharpCore = GetArgumentFromCommandLine "--fsharpCore:" @"Release\coreclr\bin\FSharp.Core.dll" let Output = GetArgumentFromCommandLine "--output:" @"." let Verbosity = GetArgumentFromCommandLine "--v:" @"quiet" let CompilerPath = GetArgumentFromCommandLine "--compilerPath:" @"." @@ -49,8 +49,8 @@ let FSharpCompilerFiles = seq { yield Path.Combine(FSharpCoreDir, "fsc.exe") yield Path.Combine(FSharpCoreDir, "FSharp.Compiler.dll") - yield Path.Combine(FSharpCoreDir, "fsharp.core.sigdata") - yield Path.Combine(FSharpCoreDir, "fsharp.core.optdata") + yield Path.Combine(FSharpCoreDir, "FSharp.Core.sigdata") + yield Path.Combine(FSharpCoreDir, "FSharp.Core.optdata") yield Win32Manifest yield Path.Combine(FSharpCoreDir, "fsi.exe") yield Path.Combine(FSharpCoreDir, "FSharp.Compiler.Interactive.Settings.dll") @@ -106,6 +106,7 @@ let executeCompiler sources references = (GetPublicSignOption) (ExtraDefines) (listToSpaceSeperatedString sources) + File.WriteAllText(@"coreclr.fsc.cmd",(CompilerPath + @"\CoreRun.exe" + arguments)) executeProcess (CompilerPath + @"\CoreRun.exe") arguments let setPathSeperators (path:string) = path.Replace('/', '\\') diff --git a/tests/fsharpqa/testenv/src/deployProj/DeployProj.fsx b/tests/fsharpqa/testenv/src/deployProj/DeployProj.fsx index 44c58f08639..cb63359f7fd 100644 --- a/tests/fsharpqa/testenv/src/deployProj/DeployProj.fsx +++ b/tests/fsharpqa/testenv/src/deployProj/DeployProj.fsx @@ -30,7 +30,7 @@ let configFile = GetArgumentFromCommandLine "--nugetConfig:" @".n let ProjectJsonLock = GetArgumentFromCommandLine "--projectJsonLock:" @"tests\fsharp\project.lock.json" let PackagesDir = GetArgumentFromCommandLine "--packagesDir:" @"packages" let TargetPlatformName = GetArgumentFromCommandLine "--targetPlatformName:" @"DNXCore,Version=v5.0/win7-x64" -let FSharpCore = GetArgumentFromCommandLine "--fsharpCore:" @"Release\coreclr\bin\fsharp.core.dll" +let FSharpCore = GetArgumentFromCommandLine "--fsharpCore:" @"Release\coreclr\bin\FSharp.Core.dll" let Output = GetArgumentFromCommandLine "--output:" @"." let NugetPath = GetArgumentFromCommandLine "--nugetPath:" @".nuget\nuget.exe" let Verbosity = GetArgumentFromCommandLine "--v:" @"quiet" @@ -41,8 +41,8 @@ let FSharpCompilerFiles = seq { yield Path.Combine(FSharpCoreDir, "fsc.exe") yield Path.Combine(FSharpCoreDir, "FSharp.Compiler.dll") - yield Path.Combine(FSharpCoreDir, "fsharp.core.sigdata") - yield Path.Combine(FSharpCoreDir, "fsharp.core.optdata") + yield Path.Combine(FSharpCoreDir, "FSharp.Core.sigdata") + yield Path.Combine(FSharpCoreDir, "FSharp.Core.optdata") yield Path.Combine(FSharpCoreDir, "default.win32manifest") yield Path.Combine(FSharpCoreDir, "fsi.exe") yield Path.Combine(FSharpCoreDir, "FSharp.Compiler.Interactive.Settings.dll") From 79430d298d916dbfb2628b5c60b9254f3316cc0c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 14 Oct 2016 15:58:08 +0100 Subject: [PATCH 02/17] simplify use of if-defs (#1614) --- src/FSharpSource.targets | 1 - src/fsharp/CompileOps.fs | 11 +++++++---- src/fsharp/fsi/fsi.fs | 7 ++++--- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index aaa2e141077..596d381bd7e 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -121,7 +121,6 @@ $(DefineConstants);PUT_TYPE_PROVIDERS_IN_FSCORE; $(DefineConstants);FX_ATLEAST_LINQ $(DefineConstants);ENABLE_MONO_SUPPORT - $(DefineConstants);FX_MSBUILDRESOLVER_RUNTIMELIKE $(DefineConstants);FX_LCIDFROMCODEPAGE $(DefineConstants);FX_RESX_RESOURCE_READER $(DefineConstants);FX_RESIDENT_COMPILER diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 6b00a7b96f3..6cec982d07f 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -2811,7 +2811,9 @@ type TcConfig private (data : TcConfigBuilder,validate:bool) = #endif try match tcConfig.resolutionEnvironment with -#if FX_MSBUILDRESOLVER_RUNTIMELIKE +#if TODO_REWORK_ASSEMBLY_LOAD + // "RuntimeLike" assembly resolution for F# Interactive is not yet properly figured out on .NET Core +#else | ReferenceResolver.RuntimeLike -> [System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory()] #endif @@ -4854,10 +4856,11 @@ module private ScriptPreprocessClosure = tcConfigB.resolutionEnvironment <- match codeContext with | CodeContext.Editing -> ReferenceResolver.DesignTimeLike -#if FX_MSBUILDRESOLVER_RUNTIMELIKE - | CodeContext.Compilation | CodeContext.Evaluation -> ReferenceResolver.RuntimeLike -#else +#if TODO_REWORK_ASSEMBLY_LOAD + // "RuntimeLike" assembly resolution for F# Interactive is not yet properly figured out on .NET Core | CodeContext.Compilation | CodeContext.Evaluation -> ReferenceResolver.CompileTimeLike +#else + | CodeContext.Compilation | CodeContext.Evaluation -> ReferenceResolver.RuntimeLike #endif tcConfigB.framework <- false // Indicates that there are some references not in BasicReferencesForScriptLoadClosure which should diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index 7bf1925331d..817ba00fb63 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -2217,10 +2217,11 @@ type internal FsiEvaluationSession (argv:string[], inReader:TextReader, outWrite Directory.GetCurrentDirectory(),isInteractive=true, isInvalidationSupported=false) let tcConfigP = TcConfigProvider.BasedOnMutableBuilder(tcConfigB) -#if FX_MSBUILDRESOLVER_RUNTIMELIKE - do tcConfigB.resolutionEnvironment <- ReferenceResolver.RuntimeLike // See Bug 3608 -#else +#if TODO_REWORK_ASSEMBLY_LOAD + // "RuntimeLike" assembly resolution for F# Interactive is not yet properly figured out on .NET Core do tcConfigB.resolutionEnvironment <- ReferenceResolver.DesignTimeLike +#else + do tcConfigB.resolutionEnvironment <- ReferenceResolver.RuntimeLike // See Bug 3608 #endif do tcConfigB.useFsiAuxLib <- true From 8b434e0fedc4f5c51ace6d4c3191d04f01667546 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 14 Oct 2016 10:32:59 -0700 Subject: [PATCH 03/17] Don't try to deploy vsix during OSS build. Specify prereq in vsixmanifest (#1613) --- src/FSharpSource.Settings.targets | 5 ++++- .../Vsix/VisualFSharpDesktop/Source.extension.vsixmanifest | 3 +++ .../Vsix/VisualFSharpFull/Source.extension.vsixmanifest | 3 +++ .../VisualFSharpOpenSource/Source.extension.vsixmanifest | 3 +++ .../Vsix/VisualFSharpWeb/Source.extension.vsixmanifest | 3 +++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index e9c969170d2..455357f0a2c 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -5,7 +5,8 @@ true net40 - + + net40 14.0.23413.0 true @@ -15,6 +16,8 @@ $(MSBuildThisFileDirectory)..\Tools\ $(ToolsDir)net45\ + false + false diff --git a/vsintegration/Vsix/VisualFSharpDesktop/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpDesktop/Source.extension.vsixmanifest index ed704d87a0f..76483db7fa1 100644 --- a/vsintegration/Vsix/VisualFSharpDesktop/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpDesktop/Source.extension.vsixmanifest @@ -59,4 +59,7 @@ + + + \ No newline at end of file diff --git a/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest index e64a9668232..959a6417827 100644 --- a/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest @@ -63,4 +63,7 @@ + + + \ No newline at end of file diff --git a/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest index 24a4f84aadf..e20c8224715 100644 --- a/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpOpenSource/Source.extension.vsixmanifest @@ -63,4 +63,7 @@ + + + \ No newline at end of file diff --git a/vsintegration/Vsix/VisualFSharpWeb/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpWeb/Source.extension.vsixmanifest index 25e4f423a7b..74417f509ce 100644 --- a/vsintegration/Vsix/VisualFSharpWeb/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpWeb/Source.extension.vsixmanifest @@ -57,4 +57,7 @@ + + + \ No newline at end of file From 2a9b5ef8189500e0af7bf2364d1f89e9b3dd5d1f Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Fri, 14 Oct 2016 22:45:35 -0700 Subject: [PATCH 04/17] Add fsx files to workspaces (#1612) * Add fsx files to workspaces * Stop passing project output paths to CPS * Read script file contents from memory (on workspace initialization) --- .../src/FSharp.Editor/LanguageService.fs | 96 ++++++++++++------- .../src/FSharp.LanguageService/Vs.fs | 6 ++ 2 files changed, 68 insertions(+), 34 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService.fs index baefd3079e0..1aeda6a46a0 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService.fs @@ -8,11 +8,14 @@ open System.Runtime.InteropServices open System.Linq open System.IO +open Microsoft.FSharp.Compiler.CompileOps open Microsoft.FSharp.Compiler.SourceCodeServices open Microsoft.CodeAnalysis open Microsoft.CodeAnalysis.Editor.Options open Microsoft.VisualStudio +open Microsoft.VisualStudio.Editor +open Microsoft.VisualStudio.TextManager.Interop open Microsoft.VisualStudio.LanguageServices open Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem @@ -62,47 +65,72 @@ type internal FSharpLanguageService(package : FSharpPackage) = override this.CreateContext(_,_,_,_,_) = raise(System.NotImplementedException()) - override this.SetupNewTextView(view) = - base.SetupNewTextView(view) - let workspace = this.Package.ComponentModel.GetService(); + override this.SetupNewTextView(textView) = + base.SetupNewTextView(textView) + let workspace = this.Package.ComponentModel.GetService() // FSROSLYNTODO: Hide navigation bars for now. Enable after adding tests workspace.Options <- workspace.Options.WithChangedOption(NavigationBarOptions.ShowNavigationBar, FSharpCommonConstants.FSharpLanguageName, false) - let (_, buffer) = view.GetBuffer() - let filename = VsTextLines.GetFilename buffer - let result = VsRunningDocumentTable.FindDocumentWithoutLocking(package.RunningDocumentTable,filename) - match result with - | Some (hier, _) -> - match hier with - | :? IProvideProjectSite as siteProvider -> - let site = siteProvider.GetProjectSite() - let projectGuid = Guid(site.ProjectGuid) - let projectFileName = site.ProjectFileName() - let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectFileName) - - let options = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(site, site.ProjectFileName()) - if not (optionsCache.ContainsKey(projectId)) then - optionsCache.Add(projectId, options) - - if obj.ReferenceEquals(workspace.ProjectTracker.GetProject(projectId), null) then - let projectContextFactory = this.Package.ComponentModel.GetService(); - let errorReporter = ProjectExternalErrorReporter(projectId, "FS", this.SystemServiceProvider) - let outputFlag = site.CompilerFlags() |> Seq.pick(fun flag -> - if flag.StartsWith("-o:") then Some(flag.Substring(3)) - else if flag.StartsWith("--out:") then Some(flag.Substring(6)) - else None) - let outputPath = if Path.IsPathRooted(outputFlag) then outputFlag else Path.Combine(Path.GetDirectoryName(projectFileName), outputFlag) - - let projectContext = projectContextFactory.CreateProjectContext(FSharpCommonConstants.FSharpLanguageName, projectFileName, projectFileName, projectGuid, hier, outputPath, errorReporter) - let project = projectContext :?> AbstractProject - - this.SyncProject(project, projectContext, site) - site.AdviseProjectSiteChanges(FSharpCommonConstants.FSharpLanguageServiceCallbackName, AdviseProjectSiteChanges(fun () -> this.SyncProject(project, projectContext, site))) - site.AdviseProjectSiteClosed(FSharpCommonConstants.FSharpLanguageServiceCallbackName, AdviseProjectSiteChanges(fun () -> project.Disconnect())) + match textView.GetBuffer() with + | (VSConstants.S_OK, textLines) -> + let filename = VsTextLines.GetFilename textLines + match VsRunningDocumentTable.FindDocumentWithoutLocking(package.RunningDocumentTable,filename) with + | Some (hier, _) -> + if IsScript(filename) then + let editorAdapterFactoryService = this.Package.ComponentModel.GetService() + let fileContents = VsTextLines.GetFileContents(textLines, editorAdapterFactoryService) + this.SetupStandAloneFile(filename, fileContents, workspace, hier) + else + match hier with + | :? IProvideProjectSite as siteProvider -> this.SetupProjectFile(siteProvider, workspace) + | _ -> () | _ -> () | _ -> () + member this.SetupProjectFile(siteProvider: IProvideProjectSite, workspace: VisualStudioWorkspaceImpl) = + let site = siteProvider.GetProjectSite() + let projectGuid = Guid(site.ProjectGuid) + let projectFileName = site.ProjectFileName() + let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectFileName) + + let options = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(site, site.ProjectFileName()) + if not (optionsCache.ContainsKey(projectId)) then + optionsCache.Add(projectId, options) + + match workspace.ProjectTracker.GetProject(projectId) with + | null -> + let projectContextFactory = this.Package.ComponentModel.GetService(); + let errorReporter = ProjectExternalErrorReporter(projectId, "FS", this.SystemServiceProvider) + + let projectContext = projectContextFactory.CreateProjectContext(FSharpCommonConstants.FSharpLanguageName, projectFileName, projectFileName, projectGuid, siteProvider, null, errorReporter) + let project = projectContext :?> AbstractProject + + this.SyncProject(project, projectContext, site) + site.AdviseProjectSiteChanges(FSharpCommonConstants.FSharpLanguageServiceCallbackName, AdviseProjectSiteChanges(fun () -> this.SyncProject(project, projectContext, site))) + site.AdviseProjectSiteClosed(FSharpCommonConstants.FSharpLanguageServiceCallbackName, AdviseProjectSiteChanges(fun () -> project.Disconnect())) + | _ -> () + + member this.SetupStandAloneFile(fileName: string, fileContents: string, workspace: VisualStudioWorkspaceImpl, hier: IVsHierarchy) = + let options = FSharpChecker.Instance.GetProjectOptionsFromScript(fileName, fileContents, DateTime.Now, [| |]) |> Async.RunSynchronously + let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(options.ProjectFileName, options.ProjectFileName) + + if not(optionsCache.ContainsKey(projectId)) then + optionsCache.Add(projectId, options) + + if obj.ReferenceEquals(workspace.ProjectTracker.GetProject(projectId), null) then + let projectContextFactory = this.Package.ComponentModel.GetService(); + let errorReporter = ProjectExternalErrorReporter(projectId, "FS", this.SystemServiceProvider) + + let projectContext = projectContextFactory.CreateProjectContext(FSharpCommonConstants.FSharpLanguageName, options.ProjectFileName, options.ProjectFileName, projectId.Id, hier, null, errorReporter) + projectContext.AddSourceFile(fileName) + + let project = projectContext :?> AbstractProject + let document = project.GetCurrentDocumentFromPath(fileName) + + document.Closing.Add(fun _ -> project.Disconnect()) + + and [] [] [] diff --git a/vsintegration/src/FSharp.LanguageService/Vs.fs b/vsintegration/src/FSharp.LanguageService/Vs.fs index a79e42f008c..6c67be30c61 100644 --- a/vsintegration/src/FSharp.LanguageService/Vs.fs +++ b/vsintegration/src/FSharp.LanguageService/Vs.fs @@ -8,6 +8,7 @@ open System.Collections open System.Collections.Generic open System.Reflection open Microsoft.VisualStudio +open Microsoft.VisualStudio.Editor open Microsoft.VisualStudio.Shell open Microsoft.VisualStudio.Shell.Interop open Microsoft.VisualStudio.Text @@ -177,6 +178,11 @@ module internal VsTextLines = let GetFilename(buffer : IVsTextLines) = let ud = (box buffer) :?> IVsUserData VsUserData.GetBufferMonker(ud) + + /// Get the string contents of a given buffer (the current snapshot). + let GetFileContents(buffer: IVsTextBuffer, editorAdaptersFactoryService: IVsEditorAdaptersFactoryService) = + let dataBuffer = editorAdaptersFactoryService.GetDataBuffer(buffer) + dataBuffer.CurrentSnapshot.GetText() module internal VsRunningDocumentTable = From 00bab9974f21e71db02e47a000cc6b101bf139a2 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sat, 15 Oct 2016 13:25:15 -0700 Subject: [PATCH 05/17] (Nugetize F# templates. Ensure value tuple installed on create template. (#1620) --- .gitignore | 1 + src/FSharpSource.Settings.targets | 1 - .../FSharp.LanguageService.Compiler.fsproj | 1 - .../ConsoleProject/ConsoleProject.csproj | 15 +++++++------- .../Template/ConsoleApplication.fsproj | 1 - .../Template/ConsoleApplication.vstemplate | 10 +++++++++- .../ConsoleProject/Template/packages.config | 4 ---- .../LibraryProject/LibraryProject.csproj | 10 +++++----- .../LibraryProject/Template/Library.fsproj | 1 - .../Template/Library.vstemplate | 10 +++++++++- .../LibraryProject/Template/packages.config | 4 ---- .../NetCore259Project.csproj | 20 ++++++++++--------- .../NETCore259PortableLibrary.vstemplate | 10 +++++++++- .../Template/PortableLibrary.fsproj | 1 - .../Template/packages.config | 4 ---- .../NetCore78Project/NetCore78Project.csproj | 9 +-------- .../NETCore78PortableLibrary.vstemplate | 10 +++++++++- .../Template/PortableLibrary.fsproj | 1 - .../NetCore78Project/Template/packages.config | 4 ---- .../NetCoreProject/NetCoreProject.csproj | 13 ++++++------ .../NETCore7PortableLibrary.vstemplate | 10 +++++++++- .../Template/PortableLibrary.fsproj | 1 - .../NetCoreProject/Template/packages.config | 4 ---- .../PortableLibraryProject.csproj | 11 +++------- .../Template/PortableLibrary.fsproj | 1 - .../Template/PortableLibrary.vstemplate | 10 +++++++++- .../Template/packages.config | 4 ---- .../TutorialProject/Template/Tutorial.fsproj | 1 - .../Template/Tutorial.vstemplate | 10 +++++++++- .../TutorialProject/Template/packages.config | 4 ---- .../TutorialProject/TutorialProject.csproj | 17 ++++++++-------- .../VisualFSharpDesktop.csproj | 6 ++++++ .../Source.extension.vsixmanifest | 3 +-- .../VisualFSharpFull/VisualFSharpFull.csproj | 6 ++++++ .../VisualFSharpOpenSource.csproj | 5 +++++ .../VisualFSharpWeb/VisualFSharpWeb.csproj | 6 ++++++ 36 files changed, 132 insertions(+), 97 deletions(-) delete mode 100644 vsintegration/ProjectTemplates/ConsoleProject/Template/packages.config delete mode 100644 vsintegration/ProjectTemplates/LibraryProject/Template/packages.config delete mode 100644 vsintegration/ProjectTemplates/NetCore259Project/Template/packages.config delete mode 100644 vsintegration/ProjectTemplates/NetCore78Project/Template/packages.config delete mode 100644 vsintegration/ProjectTemplates/NetCoreProject/Template/packages.config delete mode 100644 vsintegration/ProjectTemplates/PortableLibraryProject/Template/packages.config delete mode 100644 vsintegration/ProjectTemplates/TutorialProject/Template/packages.config diff --git a/.gitignore b/.gitignore index 1c0ff437d77..93d939ecd89 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,4 @@ tests/fsharp/core/array/dont.run.peverify tests/fsharp/core/innerpoly/dont.run.peverify tests/fsharp/typecheck/sigs/neg94-pre.dll times +/tests/fsharpqa/testenv/bin/System.ValueTuple.dll diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 455357f0a2c..861333ccc71 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -16,7 +16,6 @@ $(MSBuildThisFileDirectory)..\Tools\ $(ToolsDir)net45\ - false false diff --git a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj index 4ebc45999ce..d3e9642414c 100644 --- a/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj +++ b/src/fsharp/FSharp.LanguageService.Compiler/FSharp.LanguageService.Compiler.fsproj @@ -593,7 +593,6 @@ ..\..\..\packages\System.Reflection.Metadata.1.4.1-beta-24227-04\lib\portable-net45+win8\System.Reflection.Metadata.dll ..\..\..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll ..\..\..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll - ..\..\..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\\System.ValueTuple.dll {DED3BBD7-53F4-428A-8C9F-27968E768605} FSharp.Core diff --git a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj index 599064f2d15..de7fec4d010 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/ConsoleProject.csproj @@ -18,13 +18,14 @@ false false false + {604F0DAA-2D33-48DD-B162-EDF0B672803D} Debug net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + @@ -41,25 +42,25 @@ false - + - + - + - + - + - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj index 2200bd4f253..317a72c7faa 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj @@ -60,7 +60,6 @@ - diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate index 3c023acf6a0..551be0d35b9 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate @@ -17,8 +17,16 @@ AssemblyInfo.fs Program.fs - packages.config App.config + + NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + NuGet.VisualStudio.TemplateWizard + + + + + + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/packages.config b/vsintegration/ProjectTemplates/ConsoleProject/Template/packages.config deleted file mode 100644 index 2688d2bafb3..00000000000 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj index c71088687a8..a597d5696b3 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj +++ b/vsintegration/ProjectTemplates/LibraryProject/LibraryProject.csproj @@ -18,13 +18,14 @@ false false false + {01678CDA-A11F-4DEE-9344-2EDF91CF1AE7} Debug net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + @@ -45,21 +46,20 @@ - + - - + - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj index 6bcaa3bec86..ff9efeec96c 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj @@ -56,7 +56,6 @@ - diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate index d351e7034b4..b7cb22cfc8f 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate @@ -17,8 +17,16 @@ AssemblyInfo.fs Library1.fs - packages.config Script.fsx + + NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + NuGet.VisualStudio.TemplateWizard + + + + + + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/packages.config b/vsintegration/ProjectTemplates/LibraryProject/Template/packages.config deleted file mode 100644 index 2688d2bafb3..00000000000 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj index 28ef29bb455..28876312729 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/NetCore259Project.csproj @@ -18,15 +18,16 @@ false false false + {D9D95330-3626-4199-B7AF-17B8E4AF6D87} Debug net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + - + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -41,25 +42,26 @@ false - + - + - + - + - - + + + - + diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/NETCore259PortableLibrary.vstemplate b/vsintegration/ProjectTemplates/NetCore259Project/Template/NETCore259PortableLibrary.vstemplate index 787127b74fa..8220c57fc7c 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/NETCore259PortableLibrary.vstemplate +++ b/vsintegration/ProjectTemplates/NetCore259Project/Template/NETCore259PortableLibrary.vstemplate @@ -17,8 +17,16 @@ AssemblyInfo.fs PortableLibrary1.fs - packages.config Script.fsx + + NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + NuGet.VisualStudio.TemplateWizard + + + + + + diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj index 84f5a353b2d..90d6e69e3ba 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj @@ -48,7 +48,6 @@ - diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/packages.config b/vsintegration/ProjectTemplates/NetCore259Project/Template/packages.config deleted file mode 100644 index 2688d2bafb3..00000000000 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj index 0bacc77498a..7a7633063db 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/NetCore78Project.csproj @@ -18,15 +18,14 @@ false false false + {1A8DBF70-4178-4AE3-AF5F-39DDD5692210} Debug net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -41,25 +40,19 @@ false - - - - - - diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/NETCore78PortableLibrary.vstemplate b/vsintegration/ProjectTemplates/NetCore78Project/Template/NETCore78PortableLibrary.vstemplate index db0143565ca..0b745c7b8cb 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/NETCore78PortableLibrary.vstemplate +++ b/vsintegration/ProjectTemplates/NetCore78Project/Template/NETCore78PortableLibrary.vstemplate @@ -17,8 +17,16 @@ AssemblyInfo.fs PortableLibrary1.fs - packages.config Script.fsx + + NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + NuGet.VisualStudio.TemplateWizard + + + + + + diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj index 372c6b5a616..01fdf785813 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj @@ -48,7 +48,6 @@ - diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/packages.config b/vsintegration/ProjectTemplates/NetCore78Project/Template/packages.config deleted file mode 100644 index 2688d2bafb3..00000000000 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj index 6bcefea0501..67aa95e4a27 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/NetCoreProject.csproj @@ -18,6 +18,7 @@ false false false + {5B739CF3-1116-4EB4-B598-6C16BEA81CE5} Debug @@ -41,25 +42,25 @@ false - + - + - + - + - + - + diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/NETCore7PortableLibrary.vstemplate b/vsintegration/ProjectTemplates/NetCoreProject/Template/NETCore7PortableLibrary.vstemplate index b228ccb0c16..ae8d8078b7b 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/NETCore7PortableLibrary.vstemplate +++ b/vsintegration/ProjectTemplates/NetCoreProject/Template/NETCore7PortableLibrary.vstemplate @@ -18,7 +18,15 @@ AssemblyInfo.fs PortableLibrary1.fs Script.fsx - packages.config + + NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + NuGet.VisualStudio.TemplateWizard + + + + + + diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj index ecf71f26e49..25f938ab49b 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj @@ -48,7 +48,6 @@ - diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/packages.config b/vsintegration/ProjectTemplates/NetCoreProject/Template/packages.config deleted file mode 100644 index 2688d2bafb3..00000000000 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj index 82f33cc8ac3..3e7af2e1883 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/PortableLibraryProject.csproj @@ -18,15 +18,16 @@ false false false + {DB374A0C-7560-479F-9B21-D37C81F7624F} Debug net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + - + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\AssemblyInfo.fs.lcl @@ -41,25 +42,19 @@ false - - - - - - diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj index dba3e128719..b518ed976ab 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj @@ -47,7 +47,6 @@ - diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.vstemplate b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.vstemplate index ef42699a0f4..ee93c441b3e 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.vstemplate +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.vstemplate @@ -18,7 +18,15 @@ AssemblyInfo.fs PortableLibrary1.fs Script.fsx - packages.config + + NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + NuGet.VisualStudio.TemplateWizard + + + + + + diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/packages.config b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/packages.config deleted file mode 100644 index 2688d2bafb3..00000000000 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj index d2e6ae15561..4756fa4f31a 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj @@ -62,7 +62,6 @@ - 11 diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate index e02b29b756d..9c2abf06b09 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate @@ -16,7 +16,15 @@ Tutorial.fsx - packages.config + + NuGet.VisualStudio.Interop, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + NuGet.VisualStudio.TemplateWizard + + + + + + diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/packages.config b/vsintegration/ProjectTemplates/TutorialProject/Template/packages.config deleted file mode 100644 index 2688d2bafb3..00000000000 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj index 15caced7cac..455092ce3f6 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj +++ b/vsintegration/ProjectTemplates/TutorialProject/TutorialProject.csproj @@ -18,15 +18,16 @@ false false false + {2FACEE44-48BD-40B5-A2EE-B54A0C9BB7C4} Debug net40 $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin\$(TemplateCategory)\$(AssemblyName) - + - + $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(TemplateCategory)\$(AssemblyName)\Tutorial.fsx.lcl @@ -35,23 +36,23 @@ false - + - + - + - + - + - + diff --git a/vsintegration/Vsix/VisualFSharpDesktop/VisualFSharpDesktop.csproj b/vsintegration/Vsix/VisualFSharpDesktop/VisualFSharpDesktop.csproj index 07d2503b425..1134d65b237 100644 --- a/vsintegration/Vsix/VisualFSharpDesktop/VisualFSharpDesktop.csproj +++ b/vsintegration/Vsix/VisualFSharpDesktop/VisualFSharpDesktop.csproj @@ -53,6 +53,7 @@ $(RootBinPath) 15.4.1.0 cs + false Program @@ -81,6 +82,11 @@ PreserveNewest true + + PreserveNewest + packages\System.ValueTuple.4.0.0-rc3-24212-01.nupkg + true + diff --git a/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest b/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest index 959a6417827..adcdc42044a 100644 --- a/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest +++ b/vsintegration/Vsix/VisualFSharpFull/Source.extension.vsixmanifest @@ -51,8 +51,7 @@ - - + diff --git a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj index 53619bb7d8a..4dc33bf9c08 100644 --- a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj +++ b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj @@ -53,6 +53,7 @@ $(RootBinPath) 15.4.1.0 cs + false Program @@ -81,6 +82,11 @@ PreserveNewest true + + PreserveNewest + packages\System.ValueTuple.4.0.0-rc3-24212-01.nupkg + true + diff --git a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj index 5b0cf6abe64..fc59ee859ee 100644 --- a/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj +++ b/vsintegration/Vsix/VisualFSharpOpenSource/VisualFSharpOpenSource.csproj @@ -81,6 +81,11 @@ PreserveNewest true + + PreserveNewest + packages\System.ValueTuple.4.0.0-rc3-24212-01.nupkg + true + diff --git a/vsintegration/Vsix/VisualFSharpWeb/VisualFSharpWeb.csproj b/vsintegration/Vsix/VisualFSharpWeb/VisualFSharpWeb.csproj index 5d8c12373f2..9b57ea66e8a 100644 --- a/vsintegration/Vsix/VisualFSharpWeb/VisualFSharpWeb.csproj +++ b/vsintegration/Vsix/VisualFSharpWeb/VisualFSharpWeb.csproj @@ -53,6 +53,7 @@ $(RootBinPath) 15.4.1.0 cs + false Program @@ -81,6 +82,11 @@ PreserveNewest true + + PreserveNewest + packages\System.ValueTuple.4.0.0-rc3-24212-01.nupkg + true + From 749ba2dfbbb457e1d746ce7659965d0ce0b34eac Mon Sep 17 00:00:00 2001 From: Omar Tawfik Date: Sat, 15 Oct 2016 13:27:14 -0700 Subject: [PATCH 06/17] Don't match braces at the end of the caret (#1619) --- .../src/FSharp.Editor/BraceMatchingService.fs | 2 +- .../tests/unittests/BraceMatchingServiceTests.fs | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/BraceMatchingService.fs b/vsintegration/src/FSharp.Editor/BraceMatchingService.fs index be0b7a97df3..c76b640b565 100644 --- a/vsintegration/src/FSharp.Editor/BraceMatchingService.fs +++ b/vsintegration/src/FSharp.Editor/BraceMatchingService.fs @@ -14,7 +14,7 @@ type internal FSharpBraceMatchingService() = static member GetBraceMatchingResult(sourceText, fileName, options, position) = async { let isPositionInRange(range) = let span = CommonRoslynHelpers.FSharpRangeToTextSpan(sourceText, range) - span.Start <= position && position <= span.End + span.Start <= position && position < span.End let! matchedBraces = FSharpChecker.Instance.MatchBracesAlternate(fileName, sourceText.ToString(), options) return matchedBraces |> Seq.tryFind(fun(left, right) -> isPositionInRange(left) || isPositionInRange(right)) diff --git a/vsintegration/tests/unittests/BraceMatchingServiceTests.fs b/vsintegration/tests/unittests/BraceMatchingServiceTests.fs index 3b5781ac541..ca598388809 100644 --- a/vsintegration/tests/unittests/BraceMatchingServiceTests.fs +++ b/vsintegration/tests/unittests/BraceMatchingServiceTests.fs @@ -139,4 +139,17 @@ type BraceMatchingServiceTests() = let x = \"stringValue\" + (endsInString + \" )endsInString startsInString" - this.VerifyNoBraceMatch(code, startMarker) \ No newline at end of file + this.VerifyNoBraceMatch(code, startMarker) + + [] + member this.BraceMatchingAtEndOfLine_Bug1597() = + // https://github.com/Microsoft/visualfsharp/issues/1597 + let code = """ +[] +let main argv = + let arg1 = "" + let arg2 = "" + let arg3 = "" + (printfn "%A '%A' '%A'" (arg1) (arg2) (arg3))endBrace + 0 // return an integer exit code""" + this.VerifyBraceMatch(code, "(printfn", ")endBrace") From e0318a8f65a596ddf234171c70bc3c535fd5f27f Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sat, 15 Oct 2016 13:32:44 -0700 Subject: [PATCH 07/17] FSharp ms build task to support new xommand line options (#1616) --- src/FSharpSource.Settings.targets | 6 ++++-- src/fsharp/FSharp.Build/Fsc.fs | 19 ++++++++++++++++++- src/fsharp/FSharp.Build/Fsc.fsi | 3 +++ .../FSharp.Build/Microsoft.FSharp.targets | 3 +++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 861333ccc71..76fc43b0223 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -31,8 +31,9 @@ embedded false prompt - $(OtherFlags) --no-jit-optimize - $(OtherFlags) --no-jit-optimize --embed + $(OtherFlags) --no-jit-optimize + true + $(IntermediateOutputPath)source_link.json DEBUG;TRACE;CODE_ANALYSIS;$(DefineConstants) DEBUG=True,TRACE=True,CODE_ANALYSIS=True,$(DefineConstants) false @@ -41,6 +42,7 @@ pdbonly true + false prompt TRACE;$(DefineConstants) TRACE=True,$(DefineConstants) diff --git a/src/fsharp/FSharp.Build/Fsc.fs b/src/fsharp/FSharp.Build/Fsc.fs index 583fa2bf62f..df5a6826a6f 100644 --- a/src/fsharp/FSharp.Build/Fsc.fs +++ b/src/fsharp/FSharp.Build/Fsc.fs @@ -122,6 +122,8 @@ type [ "embedded" | "FULL" -> "full" | _ -> null) + if embedAllSources then + builder.AppendSwitch("--embed+") + builder.AppendSwitchIfNotNull("--embed:", embed) + builder.AppendSwitchIfNotNull("--sourcelink:", sourceLink) // NoFramework if noFramework then builder.AppendSwitch("--noframework") @@ -316,7 +323,7 @@ type [: Emit debugging information + // --debug : Emit debugging information member fsc.DebugType with get() = debugType and set(s) = debugType <- s @@ -332,6 +339,12 @@ type [: // Print the inferred interface of the // assembly to a file. @@ -398,6 +411,10 @@ type [ Date: Sat, 15 Oct 2016 14:03:48 -0700 Subject: [PATCH 08/17] Add support for generating sourcelink record in portable pdbs. Fixes #1585 --- .gitignore | 1 + src/FSharpSource.Settings.targets | 10 +++----- src/FSharpSource.targets | 17 +++++++++++++ src/absil/ilwrite.fs | 7 +++--- src/absil/ilwrite.fsi | 1 + src/absil/ilwritepdb.fs | 25 +++++++++++++------ src/absil/ilwritepdb.fsi | 2 +- src/fsharp/CompileOps.fs | 3 +++ src/fsharp/CompileOps.fsi | 2 ++ src/fsharp/CompileOptions.fs | 3 +++ src/fsharp/FSComp.txt | 3 +++ .../FSharp.Core.Unittests.fsproj | 2 -- src/fsharp/fsc.fs | 9 +++++-- .../fsc/help/help40.437.1033.bsl | 2 ++ .../Source/CompilerOptions/fsc/pdb/pdb06.fs | 4 +++ .../CompilerOptions/fsc/pdb/source_link.json | 1 + 16 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 tests/fsharpqa/Source/CompilerOptions/fsc/pdb/pdb06.fs create mode 100644 tests/fsharpqa/Source/CompilerOptions/fsc/pdb/source_link.json diff --git a/.gitignore b/.gitignore index 93d939ecd89..d82c51e4d8a 100644 --- a/.gitignore +++ b/.gitignore @@ -103,3 +103,4 @@ tests/fsharp/core/innerpoly/dont.run.peverify tests/fsharp/typecheck/sigs/neg94-pre.dll times /tests/fsharpqa/testenv/bin/System.ValueTuple.dll +source_link.json diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 76fc43b0223..9a67f75550b 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -18,6 +18,9 @@ false + + + obj\$(Configuration)\$(TargetFramework)\ @@ -28,7 +31,7 @@ full - embedded + portable false prompt $(OtherFlags) --no-jit-optimize @@ -61,11 +64,6 @@ 3 - - - obj\$(Configuration)\$(TargetFramework)\ - - $(DefineConstants),VS_VERSION_DEV12=True $(DefineConstants);VS_VERSION_DEV12 diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index 596d381bd7e..21908f694b4 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -541,8 +541,25 @@ + + + + + $([System.IO.Directory]::GetParent($(MSBuildThisFileDirectory.TrimEnd("\")))) + + + + + + + + + + + + diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index 9ca851d3ed9..618246aee04 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -3537,7 +3537,7 @@ let writeDirectory os dict = let writeBytes (os: BinaryWriter) (chunk:byte[]) = os.Write(chunk,0,chunk.Length) let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer: ILStrongNameSigner option, portablePDB, embeddedPDB, embedAllSource, embedSourceList, - fixupOverlappingSequencePoints, emitTailcalls, showTimes, dumpDebugInfo) modul noDebugData = + sourceLink, fixupOverlappingSequencePoints, emitTailcalls, showTimes, dumpDebugInfo) modul noDebugData = // Store the public key from the signer into the manifest. This means it will be written // to the binary and also acts as an indicator to leave space for delay sign @@ -3690,7 +3690,7 @@ let writeBinaryAndReportMappings (outfile, ilg, pdbfile: string option, signer: let pdbOpt = match portablePDB with | true -> - let struct (uncompressedLength, contentId, stream) as pdbStream = generatePortablePdb fixupOverlappingSequencePoints embedAllSource embedSourceList showTimes pdbData + let struct (uncompressedLength, contentId, stream) as pdbStream = generatePortablePdb fixupOverlappingSequencePoints embedAllSource embedSourceList sourceLink showTimes pdbData if embeddedPDB then Some (compressPortablePdbStream uncompressedLength contentId stream) else Some (pdbStream) | _ -> None @@ -4262,6 +4262,7 @@ type options = embeddedPDB: bool embedAllSource: bool embedSourceList: string list + sourceLink: string signer: ILStrongNameSigner option fixupOverlappingSequencePoints: bool emitTailcalls : bool @@ -4270,5 +4271,5 @@ type options = let WriteILBinary (outfile, (args: options), modul, noDebugData) = ignore (writeBinaryAndReportMappings (outfile, args.ilg, args.pdbfile, args.signer, args.portablePDB, args.embeddedPDB, - args.embedAllSource, args.embedSourceList, args.fixupOverlappingSequencePoints, + args.embedAllSource, args.embedSourceList, args.sourceLink, args.fixupOverlappingSequencePoints, args.emitTailcalls, args.showTimes, args.dumpDebugInfo) modul noDebugData) diff --git a/src/absil/ilwrite.fsi b/src/absil/ilwrite.fsi index f1b43e6ae21..3ee76893062 100644 --- a/src/absil/ilwrite.fsi +++ b/src/absil/ilwrite.fsi @@ -22,6 +22,7 @@ type options = embeddedPDB: bool embedAllSource: bool embedSourceList: string list + sourceLink: string signer : ILStrongNameSigner option fixupOverlappingSequencePoints : bool emitTailcalls: bool diff --git a/src/absil/ilwritepdb.fs b/src/absil/ilwritepdb.fs index ad8411c008e..5dde376d185 100644 --- a/src/absil/ilwritepdb.fs +++ b/src/absil/ilwritepdb.fs @@ -252,7 +252,7 @@ let fixupOverlappingSequencePoints fixupSPs showTimes methods = Array.sortInPlaceBy fst allSps spCounts, allSps -let generatePortablePdb fixupSPs (embedAllSource:bool) (embedSourceList:string list) showTimes (info:PdbData) = +let generatePortablePdb fixupSPs (embedAllSource:bool) (embedSourceList:string list) (sourceLink:string) showTimes (info:PdbData) = sortMethods showTimes info let _spCounts, _allSps = fixupOverlappingSequencePoints fixupSPs showTimes info.Methods let externalRowCounts = getRowCounts info.TableRowCounts @@ -277,8 +277,9 @@ let generatePortablePdb fixupSPs (embedAllSource:bool) (embedSourceList:string l metadata.GetOrAddBlob(writer) - let corSymLanguageTypeFSharp = System.Guid(0xAB4F38C9u, 0xB6E6us, 0x43baus, 0xBEuy, 0x3Buy, 0x58uy, 0x08uy, 0x0Buy, 0x2Cuy, 0xCCuy, 0xE3uy) - let embeddedSource = System.Guid(0x0e8a571bu, 0x6926us, 0x466eus, 0xb4uy, 0xaduy, 0x8auy, 0xb0uy, 0x46uy, 0x11uy, 0xf5uy, 0xfeuy) + let corSymLanguageTypeId = System.Guid(0xAB4F38C9u, 0xB6E6us, 0x43baus, 0xBEuy, 0x3Buy, 0x58uy, 0x08uy, 0x0Buy, 0x2Cuy, 0xCCuy, 0xE3uy) + let embeddedSourceId = System.Guid(0x0e8a571bu, 0x6926us, 0x466eus, 0xb4uy, 0xaduy, 0x8auy, 0xb0uy, 0x46uy, 0x11uy, 0xf5uy, 0xfeuy) + let sourceLinkId = System.Guid(0xcc110556u, 0xa091us, 0x4d38us, 0x9fuy, 0xecuy, 0x25uy, 0xabuy, 0x9auy, 0x35uy, 0x1auy, 0x6auy) /// /// The maximum number of bytes in to write out uncompressed. @@ -317,7 +318,8 @@ let generatePortablePdb fixupSPs (embedAllSource:bool) (embedSourceList:string l Some (builder.ToImmutableArray()) let mutable index = new Dictionary(docs.Length) - metadata.SetCapacity(TableIndex.Document, docs.Length) + let docLength = docs.Length + if String.IsNullOrEmpty(sourceLink) then 1 else 0 + metadata.SetCapacity(TableIndex.Document, docLength) for doc in docs do let handle = match checkSum doc.File with @@ -326,12 +328,12 @@ let generatePortablePdb fixupSPs (embedAllSource:bool) (embedSourceList:string l (serializeDocumentName doc.File, metadata.GetOrAddGuid(hashAlg), metadata.GetOrAddBlob(checkSum.ToImmutableArray()), - metadata.GetOrAddGuid(corSymLanguageTypeFSharp)) |> metadata.AddDocument + metadata.GetOrAddGuid(corSymLanguageTypeId)) |> metadata.AddDocument match includeSource doc.File with | None -> () | Some blob -> metadata.AddCustomDebugInformation(DocumentHandle.op_Implicit(dbgInfo), - metadata.GetOrAddGuid(embeddedSource), + metadata.GetOrAddGuid(embeddedSourceId), metadata.GetOrAddBlob(blob)) |> ignore dbgInfo | None -> @@ -339,9 +341,18 @@ let generatePortablePdb fixupSPs (embedAllSource:bool) (embedSourceList:string l (serializeDocumentName doc.File, metadata.GetOrAddGuid(System.Guid.Empty), metadata.GetOrAddBlob(ImmutableArray.Empty), - metadata.GetOrAddGuid(corSymLanguageTypeFSharp)) |> metadata.AddDocument + metadata.GetOrAddGuid(corSymLanguageTypeId)) |> metadata.AddDocument dbgInfo index.Add(doc.File, handle) + + if not (String.IsNullOrEmpty(sourceLink)) then + let fs = File.OpenRead(sourceLink) + let ms = new MemoryStream() + fs.CopyTo(ms) + metadata.AddCustomDebugInformation( + ModuleDefinitionHandle.op_Implicit(EntityHandle.ModuleDefinition), + metadata.GetOrAddGuid(sourceLinkId), + metadata.GetOrAddBlob(ms.ToArray())) |> ignore index let mutable lastLocalVariableHandle = Unchecked.defaultof diff --git a/src/absil/ilwritepdb.fsi b/src/absil/ilwritepdb.fsi index 81f5272a188..4ad4ce03e66 100644 --- a/src/absil/ilwritepdb.fsi +++ b/src/absil/ilwritepdb.fsi @@ -82,7 +82,7 @@ type idd = iddData: byte[]; iddChunk: BinaryChunk } -val generatePortablePdb : fixupSPs:bool -> embedAllSource:bool -> embedSourceList:string list -> showTimes:bool -> info:PdbData -> struct (int64 * BlobContentId * MemoryStream) +val generatePortablePdb : fixupSPs:bool -> embedAllSource:bool -> embedSourceList:string list -> sourceLink: string -> showTimes:bool -> info:PdbData -> struct (int64 * BlobContentId * MemoryStream) val compressPortablePdbStream : uncompressedLength:int64 -> contentId:BlobContentId -> stream:MemoryStream -> struct (int64 * BlobContentId * MemoryStream) val embedPortablePdbInfo : uncompressedLength:int64 -> contentId:BlobContentId -> stream:MemoryStream -> showTimes:bool -> fpdb:string -> cvChunk:BinaryChunk -> pdbChunk:BinaryChunk -> idd[] val writePortablePdbInfo : contentId:BlobContentId -> stream:MemoryStream -> showTimes:bool -> fpdb:string -> cvChunk:BinaryChunk -> idd[] diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 6cec982d07f..955ba969456 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -2072,6 +2072,7 @@ type TcConfigBuilder = mutable embeddedPDB : bool mutable embedAllSource : bool mutable embedSourceList : string list + mutable sourceLink : string mutable ignoreSymbolStoreSequencePoints : bool mutable internConstantStrings : bool @@ -2243,6 +2244,7 @@ type TcConfigBuilder = embeddedPDB = false embedAllSource = false embedSourceList = [] + sourceLink = "" ignoreSymbolStoreSequencePoints = false internConstantStrings = true extraOptimizationIterations = 0 @@ -2732,6 +2734,7 @@ type TcConfig private (data : TcConfigBuilder,validate:bool) = member x.embeddedPDB = data.embeddedPDB member x.embedAllSource = data.embedAllSource member x.embedSourceList = data.embedSourceList + member x.sourceLink = data.sourceLink member x.ignoreSymbolStoreSequencePoints = data.ignoreSymbolStoreSequencePoints member x.internConstantStrings = data.internConstantStrings member x.extraOptimizationIterations = data.extraOptimizationIterations diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi index 04d60c2b9fe..96d8998b259 100755 --- a/src/fsharp/CompileOps.fsi +++ b/src/fsharp/CompileOps.fsi @@ -302,6 +302,7 @@ type TcConfigBuilder = mutable embeddedPDB : bool mutable embedAllSource : bool mutable embedSourceList : string list + mutable sourceLink : string mutable ignoreSymbolStoreSequencePoints : bool mutable internConstantStrings : bool mutable extraOptimizationIterations : int @@ -458,6 +459,7 @@ type TcConfig = member embeddedPDB : bool member embedAllSource : bool member embedSourceList : string list + member sourceLink : string member ignoreSymbolStoreSequencePoints : bool member internConstantStrings : bool member extraOptimizationIterations : int diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index f74f5fa4278..ead3f4e381f 100644 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -525,6 +525,7 @@ let PrintOptionInfo (tcConfigB:TcConfigBuilder) = printfn " embeddedPDB. . . . . . : %+A" tcConfigB.embeddedPDB printfn " embedAllSource . . . . : %+A" tcConfigB.embedAllSource printfn " embedSourceList. . . . : %+A" tcConfigB.embedSourceList + printfn " sourceLink . . . . . . : %+A" tcConfigB.sourceLink printfn " debuginfo . . . . . . : %+A" tcConfigB.debuginfo printfn " resolutionEnvironment : %+A" tcConfigB.resolutionEnvironment printfn " product . . . . . . . : %+A" tcConfigB.productNameForBannerText @@ -672,6 +673,8 @@ let codeGenerationFlags isFsi (tcConfigB : TcConfigBuilder) = Some (FSComp.SR.optsEmbedAllSource())) CompilerOption("embed", tagFileList, OptionStringList (fun f -> tcConfigB.AddEmbeddedSourceFile f), None, Some ( FSComp.SR.optsEmbedSource())); + CompilerOption("sourcelink", tagFile, OptionString (fun f -> tcConfigB.sourceLink <- f), None, + Some ( FSComp.SR.optsSourceLink())); ] let codegen = [CompilerOption("optimize", tagNone, OptionSwitch (SetOptimizeSwitch tcConfigB) , None, diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 9c5975d50aa..7b7698c9cfd 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -838,7 +838,10 @@ optsWin32manifest,"Specify a Win32 manifest file" optsNowin32manifest,"Do not include the default Win32 manifest" optsEmbedAllSource,"Embed all source files in the portable PDB file" optsEmbedSource,"Embed specific source files in the portable PDB file" +optsSourceLink,"Source link information file to embed in the portable PDB file" 1501,optsEmbeddedSourceRequirePortablePDBs,"--embed switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded)" +1502,optsSourceLinkRequirePortablePDBs,"--sourcelink switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded)" +srcFileTooLarge,"Source file is too large to embed in a portable PDB" optsResource,"Embed the specified managed resource" optsLinkresource,"Link the specified resource to this assembly where the resinfo format is [,[,public|private]]" optsDebugPM,"Emit debug information (Short form: -g)" diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index 60d23f046ba..2dfb034adac 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -30,14 +30,12 @@ true - full false $(DefineConstants);DEBUG;TRACE prompt 3 - pdbonly true $(DefineConstants);TRACE prompt diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 102abdd4797..46362c5f748 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -271,8 +271,12 @@ let ProcessCommandLineFlags (tcConfigB: TcConfigBuilder,setProcessThreadLocals,a // This is where flags are interpreted by the command line fsc.exe. ParseCompilerOptions (collect, GetCoreFscCompilerOptions tcConfigB, List.tail (PostProcessCompilerArgs abbrevArgs argv)) - if (tcConfigB.embedAllSource || tcConfigB.embedSourceList |> List.length <> 0) && (not (tcConfigB.portablePDB || tcConfigB.embeddedPDB)) then - error(Error(FSComp.SR.optsEmbeddedSourceRequirePortablePDBs(),rangeCmdArgs)) + + if not (tcConfigB.portablePDB || tcConfigB.embeddedPDB) then + if tcConfigB.embedAllSource || (tcConfigB.embedSourceList |> List.length <> 0) then + error(Error(FSComp.SR.optsEmbeddedSourceRequirePortablePDBs(), rangeCmdArgs)) + if not (String.IsNullOrEmpty(tcConfigB.sourceLink)) then + error(Error(FSComp.SR.optsSourceLinkRequirePortablePDBs(),rangeCmdArgs)) let inputFiles = List.rev !inputFilesRef @@ -1749,6 +1753,7 @@ module FileWriter = embeddedPDB = tcConfig.embeddedPDB embedAllSource = tcConfig.embedAllSource embedSourceList = tcConfig.embedSourceList + sourceLink = tcConfig.sourceLink signer = GetSigner signingInfo fixupOverlappingSequencePoints = false dumpDebugInfo = tcConfig.dumpDebugInfo }, diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/help/help40.437.1033.bsl b/tests/fsharpqa/Source/CompilerOptions/fsc/help/help40.437.1033.bsl index 57209f1d262..d7f5e7eda32 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/help/help40.437.1033.bsl +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/help/help40.437.1033.bsl @@ -59,6 +59,8 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. --embed[+|-] Embed all source files in the portable PDB file --embed: Embed specific source files in the portable PDB file +--sourcelink: Source link information file to embed in the + portable PDB file --optimize[+|-] Enable optimizations (Short form: -O) --tailcalls[+|-] Enable or disable tailcalls --crossoptimize[+|-] Enable or disable cross-module optimizations diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/pdb06.fs b/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/pdb06.fs new file mode 100644 index 00000000000..a692f1faaa9 --- /dev/null +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/pdb06.fs @@ -0,0 +1,4 @@ +// #Regression #NoMT #CompilerOptions #NoMono +//.+sourcelink switch only supported when emitting a Portable PDB .+ + +exit 1 diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/source_link.json b/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/source_link.json new file mode 100644 index 00000000000..eafb857151f --- /dev/null +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/pdb/source_link.json @@ -0,0 +1 @@ +{"documents": { "/*" : "ffffffffffffffffffffffffffffffffffffffff/*" }} From d64878749da8cca70e4bd37698e28126a55be2b2 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sun, 16 Oct 2016 09:34:16 -0700 Subject: [PATCH 09/17] Ensure that portable libraries have correct hintpath for preview 5 --- .../NetCore259Project/Template/PortableLibrary.fsproj | 2 +- .../NetCore78Project/Template/PortableLibrary.fsproj | 2 +- .../NetCoreProject/Template/PortableLibrary.fsproj | 2 +- .../PortableLibraryProject/Template/PortableLibrary.fsproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj index 90d6e69e3ba..d31de6246d4 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj @@ -38,7 +38,7 @@ FSharp.Core FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll + $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll ..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj index 01fdf785813..0df677930d4 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj @@ -38,7 +38,7 @@ FSharp.Core FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll + $(MSBuildProgramFile32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll ..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj index 25f938ab49b..b3fa0e7e6ab 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj @@ -38,7 +38,7 @@ FSharp.Core FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll + $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll ..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj index b518ed976ab..da92ecfac83 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj @@ -37,7 +37,7 @@ FSharp.Core FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETPortable\$(TargetFSharpCoreVersion)\FSharp.Core.dll + $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETPortable\$(TargetFSharpCoreVersion)\FSharp.Core.dll ..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll From 39480c4c402eb6e37b2ccfa9961189d29b352289 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sun, 16 Oct 2016 10:19:03 -0700 Subject: [PATCH 10/17] Ensure that portable libraries have correct hintpath for preview 5 (#1624) --- .../NetCore259Project/Template/PortableLibrary.fsproj | 2 +- .../NetCore78Project/Template/PortableLibrary.fsproj | 2 +- .../NetCoreProject/Template/PortableLibrary.fsproj | 2 +- .../PortableLibraryProject/Template/PortableLibrary.fsproj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj index 90d6e69e3ba..d31de6246d4 100644 --- a/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCore259Project/Template/PortableLibrary.fsproj @@ -38,7 +38,7 @@ FSharp.Core FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll + $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll ..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll diff --git a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj index 01fdf785813..0df677930d4 100644 --- a/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCore78Project/Template/PortableLibrary.fsproj @@ -38,7 +38,7 @@ FSharp.Core FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll + $(MSBuildProgramFile32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll ..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll diff --git a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj index 25f938ab49b..b3fa0e7e6ab 100644 --- a/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/NetCoreProject/Template/PortableLibrary.fsproj @@ -38,7 +38,7 @@ FSharp.Core FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll + $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETCore\$(TargetFSharpCoreVersion)\FSharp.Core.dll ..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll diff --git a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj index b518ed976ab..da92ecfac83 100644 --- a/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj +++ b/vsintegration/ProjectTemplates/PortableLibraryProject/Template/PortableLibrary.fsproj @@ -37,7 +37,7 @@ FSharp.Core FSharp.Core.dll - $(MSBuildExtensionsPath32)\..\Reference Assemblies\Microsoft\FSharp\.NETPortable\$(TargetFSharpCoreVersion)\FSharp.Core.dll + $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETPortable\$(TargetFSharpCoreVersion)\FSharp.Core.dll ..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dll From d64ff35398a62c91103e9aa1373c2786bc0e83d6 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sun, 16 Oct 2016 22:37:08 +0100 Subject: [PATCH 11/17] cleanup build and test scripts (#1615) * cleanup build and test scripts --- .gitignore | 6 +- DEVGUIDE.md | 113 +- TESTGUIDE.md | 63 +- build-everything.proj | 113 +- build.cmd | 550 +- packages.config | 70 +- src/FSharpSource.Settings.targets | 5 +- src/FSharpSource.targets | 2 - src/buildtools/buildnugets.fsx | 84 +- src/buildtools/scriptlib.fsx | 65 + src/fsharp-compiler-build.proj | 19 +- .../FSharp.Compiler.Host.proj | 8 +- .../layoutfschostnuget.fsx | 57 +- .../FSharp.Compiler.nuget.proj | 6 +- .../layoutfscnuget.fsx | 87 +- src/fsharp/fsc.fs | 2 + .../FSharp.Core.netcore.nuget.proj | 6 +- .../layoutfscorenuget.fsx | 83 +- src/update.cmd | 102 +- tests/.gitignore | 2 +- tests/BuildTestTools.cmd | 111 - tests/Convert-NUnit2Args-to-NUnit3Where.fsx | 82 - tests/RunTests.cmd | 237 +- .../bin/System.Reflection.Metadata.dll | Bin 432872 -> 0 bytes .../bin/System.Reflection.Metadata.xml | 5433 ----------------- .../src/ExecAssembly/ExecAssembly.fsproj | 140 - .../testenv/src/ExecAssembly/Program.fs | 32 - .../src/ExecAssembly/closed/App.config | 19 - .../testenv/src/ExecAssembly/open/App.config | 19 - .../FSharp.Compiler.Hosted.fsproj | 99 +- .../HostedCompilerServer.fsproj | 77 +- .../testenv/src/ILComparer/ILComparer.fsproj | 75 +- .../src/PartialTrustRunner/APTCATest.fs | 12 - .../PartialTrustRunner/PartialTrustRunner.cs | 327 - .../testenv/src/PartialTrustRunner/build.cmd | 4 - .../testenv/src/PartialTrustRunner/ptkey.snk | Bin 596 -> 0 bytes .../src/PartialTrustRunner/ptrunnerlib.cs | 196 - .../testenv/src/deployProj/CompileProj.fsx | 196 +- .../testenv/src/deployProj/DeployProj.fsx | 169 +- .../src/deployProj/crackProjectJson.fsx | 66 + tests/fsharpqa/testenv/src/diff/diff.fsproj | 75 +- vsintegration/packages.config | 31 + .../src/FSharp.Editor/FSharp.Editor.fsproj | 1 + .../FSharp.LanguageService.fsproj | 1 + .../ProjectSystem.fsproj | 1 + .../src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj | 1 + .../tests/Salsa/VisualFSharp.Salsa.fsproj | 2 +- ...myProviderForLanguageServiceTesting.fsproj | 1 + .../EmptyAssembly/EmptyAssembly.fsproj | 1 + .../unittests/VisualFSharp.Unittests.fsproj | 1 + vsintegration/vsintegration.targets | 7 + 51 files changed, 1065 insertions(+), 7794 deletions(-) create mode 100644 src/buildtools/scriptlib.fsx delete mode 100644 tests/BuildTestTools.cmd delete mode 100644 tests/Convert-NUnit2Args-to-NUnit3Where.fsx delete mode 100644 tests/fsharpqa/testenv/bin/System.Reflection.Metadata.dll delete mode 100644 tests/fsharpqa/testenv/bin/System.Reflection.Metadata.xml delete mode 100644 tests/fsharpqa/testenv/src/ExecAssembly/ExecAssembly.fsproj delete mode 100644 tests/fsharpqa/testenv/src/ExecAssembly/Program.fs delete mode 100644 tests/fsharpqa/testenv/src/ExecAssembly/closed/App.config delete mode 100644 tests/fsharpqa/testenv/src/ExecAssembly/open/App.config delete mode 100644 tests/fsharpqa/testenv/src/PartialTrustRunner/APTCATest.fs delete mode 100644 tests/fsharpqa/testenv/src/PartialTrustRunner/PartialTrustRunner.cs delete mode 100644 tests/fsharpqa/testenv/src/PartialTrustRunner/build.cmd delete mode 100644 tests/fsharpqa/testenv/src/PartialTrustRunner/ptkey.snk delete mode 100644 tests/fsharpqa/testenv/src/PartialTrustRunner/ptrunnerlib.cs create mode 100644 tests/fsharpqa/testenv/src/deployProj/crackProjectJson.fsx create mode 100644 vsintegration/packages.config create mode 100644 vsintegration/vsintegration.targets diff --git a/.gitignore b/.gitignore index d82c51e4d8a..1bd35450673 100644 --- a/.gitignore +++ b/.gitignore @@ -49,13 +49,13 @@ /tests/*FSharp_Failures.lst /tests/fsharpqa/Source/CodeGen/EmittedIL/StaticInit/StaticInit_Module01.dll /tests/fsharpqa/Source/CodeGen/EmittedIL/StaticInit/StaticInit_Module01.pdb -/tests/XFSharpQA_Failures.log.* +/tests/Xnet40-fsharpqa-suite-failures.log.* /vsintegration/src/vs/FsPkgs/FSharp.Project/FS/FSharp.ProjectSystem.FSharp.fsi /vsintegration/src/vs/FsPkgs/FSharp.Project/FS/ctofiles/ /tests/fsharpqa/Source/CodeGen/EmittedIL/QueryExpressionStepping/Utils.dll /tests/fsharpqa/Source/CodeGen/EmittedIL/ComputationExpressions/ComputationExprLibrary.dll -/tests/fsharpqa/Source/*FSharpQA_Failures.env -/tests/fsharpqa/Source/*FSharpQA_Failures.lst +/tests/fsharpqa/Source/*net40-fsharpqa-suite-failures.env +/tests/fsharpqa/Source/*net40-fsharpqa-suite-failures.lst /tests/**/FSharp.Core.dll lib/debug lib/release diff --git a/DEVGUIDE.md b/DEVGUIDE.md index cce9f1b8958..f7a44b11253 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -21,27 +21,32 @@ The primary technical documents for the F# compiler code are ## Quick Start: Build, Test, Develop -You can build the compiler+tools and run the subset the tests used for continuous integration as follows: +You can build the F# compiler for .NET Framework as follows: build.cmd +This is the same as + + build.cmd net40 + There are various qualifiers: build.cmd release -- build release (the default) build.cmd debug -- build debug instead of release - build.cmd proto -- force the rebuild of the Proto bootstrap compiler in addition to other things - build.cmd protofx -- build using a .NET Framework proto (no .NET Core is used) + build.cmd net40 -- build .NET Framework compiler + build.cmd coreclr -- build .NET Core compiler + build.cmd vs -- build the Visual F# IDE Tools + build.cmd pcls -- build the PCL FSharp.Core libraries + build.cmd all -- build all - build.cmd net40 -- build/tests for .NET Framework version of the compiler (not the Visual F# IDE Tools or .NET Core) - build.cmd coreclr -- build/tests only the coreclr version compiler (not the Visual F# IDE Tools or .NET Framework) - build.cmd vs -- build/tests the Visual F# IDE Tools - build.cmd pcls -- build/tests the PCL FSharp.Core libraries + build.cmd proto -- force the rebuild of the Proto bootstrap compiler in addition to other things - build.cmd build -- build, do not test - build.cmd ci -- build, run the same tests as CI - build.cmd all -- build, run all tests - build.cmd notests -- turn off testing (used in conjunction with other options) + build.cmd test -- build default targets, run suitable tests + build.cmd net40 test -- build net40, run suitable tests + build.cmd coreclr test -- build coreclr, run suitable tests + build.cmd vs test -- build Visual F# IDE Tools, run all tests + build.cmd all test -- build all, run all tests build.cmd test-smoke -- build, run smoke tests build.cmd test-coreunit -- build, run FSharp.Core tests @@ -49,16 +54,11 @@ There are various qualifiers: build.cmd test-pcls -- build, run PCL tests build.cmd test-fsharp -- build, run tests\fsharp suite build.cmd test-fsharpqa -- build, run tests\fsharpqa suite - build.cmd test-vs -- build, run Visual F# IDE Tools unit tests **Notes** To build and test Visual F# IDE Tools, you must use [Visual Studio "vNext" (aka "Dev15")](https://www.visualstudio.com/en-us/downloads/visual-studio-next-downloads-vs.aspx). This is the one after Visual Studio 2015 (aka "Dev 14"). You must also install Visual Studio SDK (also called _Visual Studio Extensibility SDK_ on the Visual Studio installer) before building Visual F# IDE Tools. Please ensure that the Visual Studio SDK version is matched with your current Visual Studio to ensure successful builds. For example: Visual Studio 2015 Update 1 requires Visual Studio 2015 SDK Update 1. Any installation of Visual Studio 2015 and later provides Visual Studio SDK as part of the installation of Visual Studio 2015 as feature installation. -Combinations are also allowed: - - build.cmd debug,compiler,notests -- build the debug compiler and run smoke tests - After you build the first time you can open and use this solution: .\VisualFSharp.sln @@ -71,86 +71,7 @@ Building ``VisualFSharp.sln`` builds _nearly_ everything. However building porta FSharp.Core.dll is not included. If you are just developing the core compiler, library and Visual F# Tools then building the solution will be enough. -## Step by Step: - -### 1. Building a Proto Compiler - -The compiler is compiled as a set of .NET 4.0 components using a bootstrap process. -This uses a Last Known Good (LKG) compiler checked into this repository to build. - - msbuild src/fsharp-proto-build.proj - -### 2. Building an F# (Debug) library and compiler - -This uses the proto compiler to build `FSharp.Core.dll`, `FSharp.Compiler.dll`, `fsc.exe`, and `fsi.exe`. - - msbuild src/fsharp-library-build.proj - msbuild src/fsharp-compiler-build.proj - -You can now use the updated F# compiler in `debug\net40\bin\fsc.exe` and F# Interactive in `debug\net40\bin\fsi.exe` to develop and test basic language and tool features. - -**Note:** The updated library is not used until you run `update.cmd`, see below. The updated compiler is not run 'pre-compiled' until you run `update.cmd -ngen`, see below. - -### 3. Full Steps Before Running Tests - -See [TESTGUIDE.md](TESTGUIDE.md) for full details on how to run tests. - -Prior to a full **Debug** test run, you need to complete **all** of the steps in build.cmd - - build.cmd debug,build - -Likewise prior to a **Release** test run: - - build.cmd release,build - -For **Debug** this corresponds to these steps, which you can run individually for more incremental builds: - - msbuild src/fsharp-library-build.proj - msbuild src/fsharp-compiler-build.proj - msbuild src/fsharp-compiler-unittests-build.proj - msbuild src/fsharp-library-build.proj /p:TargetFramework=portable47 - msbuild src/fsharp-library-build.proj /p:TargetFramework=portable7 - msbuild src/fsharp-library-build.proj /p:TargetFramework=portable78 - msbuild src/fsharp-library-build.proj /p:TargetFramework=portable259 - msbuild src/fsharp-library-unittests-build.proj - msbuild src/fsharp-library-unittests-build.proj /p:TargetFramework=portable47 - msbuild src/fsharp-library-unittests-build.proj /p:TargetFramework=portable7 - msbuild src/fsharp-library-unittests-build.proj /p:TargetFramework=portable78 - msbuild src/fsharp-library-unittests-build.proj /p:TargetFramework=portable259 - msbuild vsintegration/fsharp-vsintegration-src-build.proj - msbuild vsintegration/fsharp-vsintegration-project-templates-build.proj - msbuild vsintegration/fsharp-vsintegration-item-templates-build.proj - msbuild vsintegration/fsharp-vsintegration-deployment-build.proj - msbuild vsintegration/fsharp-vsintegration-unittests-build.proj - msbuild tests/fsharp/FSharp.Tests.fsproj - src\update.cmd debug -ngen - tests\BuildTestTools.cmd debug - - -For **Release** this corresponds to these steps, which you can run individually for more incremental builds: - - msbuild src/fsharp-library-build.proj /p:Configuration=Release - msbuild src/fsharp-compiler-build.proj /p:Configuration=Release - msbuild src/fsharp-compiler-unittests-build.proj /p:Configuration=Release - msbuild src/fsharp-library-build.proj /p:TargetFramework=portable47 /p:Configuration=Release - msbuild src/fsharp-library-build.proj /p:TargetFramework=portable7 /p:Configuration=Release - msbuild src/fsharp-library-build.proj /p:TargetFramework=portable78 /p:Configuration=Release - msbuild src/fsharp-library-build.proj /p:TargetFramework=portable259 /p:Configuration=Release - msbuild src/fsharp-library-unittests-build.proj /p:Configuration=Release - msbuild src/fsharp-library-unittests-build.proj /p:TargetFramework=portable47 /p:Configuration=Release - msbuild src/fsharp-library-unittests-build.proj /p:TargetFramework=portable7 /p:Configuration=Release - msbuild src/fsharp-library-unittests-build.proj /p:TargetFramework=portable78 /p:Configuration=Release - msbuild src/fsharp-library-unittests-build.proj /p:TargetFramework=portable259 /p:Configuration=Release - msbuild vsintegration/fsharp-vsintegration-src-build.proj /p:Configuration=Release - msbuild vsintegration/fsharp-vsintegration-project-templates-build.proj /p:Configuration=Release - msbuild vsintegration/fsharp-vsintegration-item-templates-build.proj /p:Configuration=Release - msbuild vsintegration/fsharp-vsintegration-deployment-build.proj /p:Configuration=Release - msbuild vsintegration/fsharp-vsintegration-unittests-build.proj /p:Configuration=Release - msbuild tests/fsharp/FSharp.Tests.fsproj /p:Configuration=Release - src\update.cmd release -ngen - tests\BuildTestTools.cmd release - -### 4. [Optional] Install the Visual F# IDE Tools +### [Optional] Install the Visual F# IDE Tools At time of writing, the Visual F# IDE Tools can only be installed into Visual Studio "Next" (aka "Dev15") releases. The new builds of the Visual F# IDE Tools can no longer be installed into Visual Studio 2015. diff --git a/TESTGUIDE.md b/TESTGUIDE.md index 0cedeb9f348..aa8b50984b4 100644 --- a/TESTGUIDE.md +++ b/TESTGUIDE.md @@ -1,33 +1,21 @@ # F# Compiler, Core Library and Visual F# Tools Tests -## Prerequisites - -In order to run the FSharpQA suite, you will need to install [Perl](http://www.perl.org/get.html) (ActiveState Perl 5.16.3 is known to work fine). -Perl must be included in the `%PATH%` for the below steps to work. It is also recommended that you run tests from an elevated command prompt, as there are a couple of test cases which require administrative privileges. - -The Perl requirement is gradually being removed. - ## Quick start: Running Tests To run tests, use variations such as the following, depending on which test suite and build configuration you want: - build.cmd compiler,smoke - build.cmd compiler - build.cmd ci - build.cmd all - build.cmd debug,compiler - build.cmd debug,ci - build.cmd debug,all + build.cmd test + build.cmd net40 test + build.cmd coreclr test + build.cmd vs test + build.cmd all test -Default is `ci` +## Prerequisites -* ``ci`` = the build and tests done by continuous integration -* ``compiler`` = build the compiler -* ``compiler,smoke`` = build the compiler and run some smoke tests -* ``debug`` = use Debug configuration instead of Release -* ``pcls`` = build and test the Portable PCL libraries for FSharp.Core -* ``build_only`` = build, don't test -* ``all`` = build and test everything +In order to run the FSharpQA suite, you will need to install [Perl](http://www.perl.org/get.html) (ActiveState Perl 5.16.3 is known to work fine). +Perl must be included in the `%PATH%` for the below steps to work. It is also recommended that you run tests from an elevated command prompt, as there are a couple of test cases which require administrative privileges. + +The Perl requirement is gradually being removed. ## Test Suites @@ -68,23 +56,7 @@ extension or the command line via `nunit3-console.exe`. Note that for compatibility reasons, the IDE unit tests should be run in a 32-bit process, using the '--x86' flag to `nunit3-console.exe` -### RunTests.cmd - -The script `tests\RunTests.cmd` is used to execute the suites. It's used like this: - - RunTests.cmd fsharp [tags to run] [tags not to run] - RunTests.cmd fsharpqa [tags to run] [tags not to run] - RunTests.cmd compilerunit - RunTests.cmd coreunit - RunTests.cmd coreunitportable47 - RunTests.cmd coreunitportable7 - RunTests.cmd coreunitportable78 - RunTests.cmd coreunitportable259 - RunTests.cmd ideunit - -`RunTests.cmd` sets a handful of environment variables which allow for the tests to work, then puts together and executes the appropriate command line to start the specified test suite. - -All test execution logs and result files will be dropped into the `tests\TestResults` folder, and have file names matching `FSharp_*.*`, `FSharpQA_*.*`, `CompilerUnit_*.*`, `CoreUnit_*.*`, `IDEUnit_*.*`, e.g. `FSharpQA_Results.log` or `FSharp_Failures.log`. +### Test lists For the FSharp and FSharpQA suites, the list of test areas and their associated "tags" is stored at @@ -95,12 +67,15 @@ Tags are in the left column, paths to to corresponding test folders are in the r If you want to re-run a particular test area, the easiest way to do so is to set a temporary tag for that area in test.lst (e.g. "RERUN"), then call `RunTests.cmd RERUN`. -If you want to specify multiple tags to run or not run, pass them comma-delimited and enclosed in double quotes, e.g. `RunTests.cmd debug fsharp "Core01,Core02"`. -From a Powershell environment, make sure the double quotes are passed literally, e.g. `.\RunTests.cmd debug fsharp '"Core01,Core02"'` - or `.\RunTests.cmd --% debug fsharp "Core01,Core02"`. +### Logs and output + +All test execution logs and result files will be dropped into the `tests\TestResults` folder, and have file names matching -`RunTests.cmd` is mostly just a simple wrapper over `tests\fsharpqa\testenv\bin\RunAll.pl`, which has capabilities not discussed here. More advanced test execution scenarios can be achieved by invoking `RunAll.pl` directly. -Run `perl tests\fsharpqa\testenv\bin\RunAll.pl -?` to see a full list of flags and options. + net40-fsharp-suite-*.* + net40-fsharpqa-suite-*.* + net40-compilerunit-suite-*.* + net40-coreunit-suite-*.* + vs-ideunit-suite-*.* ### Other Tips diff --git a/build-everything.proj b/build-everything.proj index 3210dc49ed6..183525d8ebf 100644 --- a/build-everything.proj +++ b/build-everything.proj @@ -1,72 +1,107 @@ - - - + + + + + + + + + + + - - - - + + + + + + + + + + + + + + - - - + + + + + - - - - - + + - - + + + + - - - + + - - + + - - + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + - - - - - + + + + + diff --git a/build.cmd b/build.cmd index 3303f56f9c8..526ce9e371c 100644 --- a/build.cmd +++ b/build.cmd @@ -2,6 +2,7 @@ :ARGUMENTS_VALIDATION +if /I "%1" == "--help" (goto :USAGE) if /I "%1" == "/help" (goto :USAGE) if /I "%1" == "/h" (goto :USAGE) if /I "%1" == "/?" (goto :USAGE) @@ -13,28 +14,40 @@ echo Build and run a subset of test suites echo. echo Usage: echo. -echo build.cmd ^ -echo ^ +echo build.cmd ^ +echo ^ +echo ^ +echo ^ +echo ^ +echo ^ echo. -echo No arguments default to 'build' +echo No arguments default to 'default', meaning this (no testing) echo. -echo To specify multiple values, separate strings by comma +echo build.cmd net40 echo. -echo.This builds the net40 build of the compiler without running tests +echo.Other examples: echo. -echo. build net40 notests +echo. build net40 (build compiler for .NET Framework) +echo. build coreclr (build compiler for .NET Core) +echo. build vs (build Visual Studio IDE Tools) +echo. build all (build everything) +echo. build test (build and test default targets) +echo. build net40 test (build and test net40) +echo. build coreclr test (build and test net40) +echo. build vs test (build and test net40) +echo. build all test (build and test net40) echo. echo The example below run pcls, vs and qa: echo. -echo build.cmd pcls,vs,debug +echo build.cmd pcls vs debug exit /b 1 :ARGUMENTS_OK -set BUILD_PROTO_WITH_CORECLR_LKG=1 +set BUILD_PROTO_WITH_CORECLR_LKG=0 set BUILD_PROTO=0 -set BUILD_NET40=1 +set BUILD_NET40=0 set BUILD_CORECLR=0 set BUILD_PORTABLE=0 set BUILD_VS=0 @@ -43,17 +56,23 @@ set BUILD_CONFIG_LOWERCASE=release set BUILD_DIAG= set BUILD_PUBLICSIGN=0 -set TEST_COMPILERUNIT=0 -set TEST_NET40_COREUNIT=0 -set TEST_CORECLR=0 -set TEST_PORTABLE_COREUNIT=0 -set TEST_VS=0 -set TEST_FSHARP_SUITE=0 -set TEST_FSHARPQA_SUITE=0 +set TEST_NET40_COMPILERUNIT_SUITE=0 +set TEST_NET40_COREUNIT_SUITE=0 +set TEST_NET40_FSHARP_SUITE=0 +set TEST_NET40_FSHARPQA_SUITE=0 +set TEST_CORECLR_COREUNIT_SUITE=0 +set TEST_CORECLR_FSHARP_SUITE=0 +set TEST_PORTABLE_COREUNIT_SUITE=0 +set TEST_VS_IDEUNIT_SUITE=0 set TEST_TAGS= set SKIP_EXPENSIVE_TESTS=1 +REM ------------------ Parse all arguments ----------------------- + setlocal enableDelayedExpansion + +set _autoselect=1 +set _autoselect_tests=0 set /a counter=0 for /l %%x in (1 1 9) do ( set /a counter=!counter!+1 @@ -61,6 +80,33 @@ for /l %%x in (1 1 9) do ( ) for %%i in (%BUILD_FSC_DEFAULT%) do ( call :SET_CONFIG %%i ) +REM apply defaults + +if /i '%_autoselect%' == '1' ( + set BUILD_NET40=1 +) + +if /i '%_autoselect_tests%' == '1' ( + if /i '%BUILD_NET40%' == '1' ( + set TEST_NET40_COMPILERUNIT_SUITE=1 + set TEST_NET40_COREUNIT_SUITE=1 + set TEST_NET40_FSHARP_SUITE=1 + set TEST_NET40_FSHARPQA_SUITE=1 + ) + + if /i '%BUILD_CORECLR%' == '1' ( + set TEST_CORECLR_COREUNIT_SUITE=1 + ) + + if /i '%BUILD_PORTABLE%' == '1' ( + set TEST_PORTABLE_COREUNIT_SUITE=1 + ) + + if /i '%BUILD_VS%' == '1' ( + set TEST_VS_IDEUNIT_SUITE=1 + ) +) + setlocal disableDelayedExpansion echo. @@ -68,31 +114,41 @@ rem disable setup build by setting FSC_BUILD_SETUP=0 if /i '%FSC_BUILD_SETUP%' == '' (set FSC_BUILD_SETUP=1) goto :MAIN +REM ------------------ Procedure to parse one argument ----------------------- + :SET_CONFIG set ARG=%~1 -if "%ARG%" == "1" if "%2" == "" (set ARG=build) -if "%2" == "" if not "%ARG%" == "build" goto :EOF +if "%ARG%" == "1" if "%2" == "" (set ARG=default) +if "%2" == "" if not "%ARG%" == "default" goto :EOF echo Parse argument %ARG% -if /i '%ARG%' == 'compiler' (set TEST_COMPILERUNIT=1) + +if /i '%ARG%' == 'net40' ( + set _autoselect=0 + set BUILD_NET40=1 +) + +if /i '%ARG%' == 'coreclr' ( + set _autoselect=0 + set BUILD_PROTO_WITH_CORECLR_LKG=1 + set BUILD_CORECLR=1 +) if /i '%ARG%' == 'pcls' ( + set _autoselect=0 set BUILD_PORTABLE=1 - set TEST_PORTABLE_COREUNIT=1 + set TEST_PORTABLE_COREUNIT_SUITE=1 ) if /i '%ARG%' == 'vs' ( + set _autoselect=0 + set BUILD_NET40=1 set BUILD_VS=1 - set TEST_VS=1 -) - -if /i '%ARG%' == 'diag' ( - set BUILD_DIAG=/v:detailed - if not defined APPVEYOR ( set BUILD_LOG=fsharp_build_log.log ) ) if /i '%ARG%' == 'all' ( + set _autoselect=0 set BUILD_PROTO=1 set BUILD_NET40=1 set BUILD_CORECLR=1 @@ -100,23 +156,10 @@ if /i '%ARG%' == 'all' ( set BUILD_VS=1 set BUILD_SETUP=%FSC_BUILD_SETUP% - set TEST_COMPILERUNIT=1 - set TEST_NET40_COREUNIT=1 - set TEST_PORTABLE_COREUNIT=1 - set TEST_FSHARP_SUITE=1 - set TEST_FSHARPQA_SUITE=1 - set TEST_CORECLR=1 - set TEST_VS=1 - - set SKIP_EXPENSIVE_TESTS=0 -) - -if /i '%ARG%' == 'protofx' ( - set BUILD_PROTO_WITH_CORECLR_LKG=0 - set BUILD_PROTO=1 ) if /i '%ARG%' == 'microbuild' ( + set _autoselect=0 set BUILD_PROTO=1 set BUILD_NET40=1 set BUILD_CORECLR=0 @@ -124,146 +167,140 @@ if /i '%ARG%' == 'microbuild' ( set BUILD_VS=1 set BUILD_SETUP=%FSC_BUILD_SETUP% - set TEST_COMPILERUNIT=1 - set TEST_NET40_COREUNIT=1 - set TEST_CORECLR=0 - set TEST_PORTABLE_COREUNIT=1 - set TEST_VS=1 - set TEST_FSHARP_SUITE=1 - set TEST_FSHARPQA_SUITE=1 - set SKIP_EXPENSIVE_TESTS=1 -) - -if /i '%ARG%' == 'proto' ( - set BUILD_PROTO=1 -) - -REM Same as 'all' but smoke testing only -if /i '%ARG%' == 'ci' ( - set SKIP_EXPENSIVE_TESTS=1 - set BUILD_NET40=1 - set BUILD_CORECLR=1 - set BUILD_PORTABLE=1 - set BUILD_VS=1 - set BUILD_SETUP=%FSC_BUILD_SETUP% - - set TEST_COMPILERUNIT=1 - set TEST_NET40_COREUNIT=1 - set TEST_PORTABLE_COREUNIT=1 - set TEST_FSHARP_SUITE=1 - set TEST_FSHARPQA_SUITE=1 - set TEST_CORECLR=1 - set TEST_VS=0 - set TEST_TAGS= - set CONF_FSHARPQA_SUITE=Smoke + set TEST_NET40_COMPILERUNIT_SUITE=1 + set TEST_NET40_COREUNIT_SUITE=1 + set TEST_NET40_FSHARP_SUITE=1 + set TEST_NET40_FSHARPQA_SUITE=1 + set TEST_CORECLR_COREUNIT_SUITE=0 + set TEST_CORECLR_FSHARP_SUITE=0 + set TEST_PORTABLE_COREUNIT_SUITE=1 + set TEST_VS_IDEUNIT_SUITE=1 ) REM These divide 'ci' into two chunks which can be done in parallel if /i '%ARG%' == 'ci_part1' ( + set _autoselect=0 + + REM what we do set BUILD_PROTO=1 - set SKIP_EXPENSIVE_TESTS=1 - set BUILD_CORECLR=0 + set BUILD_NET40=1 set BUILD_PORTABLE=1 set BUILD_VS=1 set BUILD_SETUP=%FSC_BUILD_SETUP% + set TEST_NET40_COMPILERUNIT_SUITE=1 + set TEST_NET40_FSHARPQA_SUITE=1 + set TEST_VS_IDEUNIT_SUITE=1 - set TEST_COMPILERUNIT=1 - set TEST_NET40_COREUNIT=0 - set TEST_PORTABLE_COREUNIT=0 - set TEST_CORECLR=0 - set TEST_FSHARPQA_SUITE=1 - set TEST_FSHARP_SUITE=0 - set TEST_VS=1 - set TEST_TAGS= ) if /i '%ARG%' == 'ci_part2' ( - set BUILD_PROTO=1 - set SKIP_EXPENSIVE_TESTS=1 + set _autoselect=0 + + REM what we do + set BUILD_PROTO_WITH_CORECLR_LKG=1 + set BUILD_PROTO=1 + set BUILD_NET40=1 set BUILD_CORECLR=1 set BUILD_PORTABLE=1 - set TEST_COMPILERUNIT=0 - set TEST_NET40_COREUNIT=1 - set TEST_PORTABLE_COREUNIT=1 - set TEST_CORECLR=1 - set TEST_FSHARPQA_SUITE=0 - set TEST_FSHARP_SUITE=1 - set TEST_VS=0 - set TEST_TAGS= + set TEST_NET40_COREUNIT_SUITE=1 + set TEST_NET40_FSHARP_SUITE=1 + set TEST_PORTABLE_COREUNIT_SUITE=1 + set TEST_CORECLR_COREUNIT_SUITE=1 + ) +if /i '%ARG%' == 'proto' ( + set BUILD_PROTO=1 +) -if /i '%ARG%' == 'coreclr' ( - set BUILD_CORECLR=1 - set TEST_CORECLR=1 +if /i '%ARG%' == 'diag' ( + set BUILD_DIAG=/v:detailed + if not defined APPVEYOR ( set BUILD_LOG=fsharp_build_log.log ) ) if /i '%ARG%' == 'debug' ( set BUILD_CONFIG=debug - set BUILD_CONFIG_LOWERCASE=debug ) -if /i '%ARG%' == 'build' ( +if /i '%ARG%' == 'release' ( + set BUILD_CONFIG=release +) + +if /i '%ARG%' == 'test' ( + set _autoselect_tests=1 +) + +if /i '%ARG%' == 'test-all' ( + set _autoselect=0 + set BUILD_PROTO=1 + set BUILD_NET40=1 + set BUILD_CORECLR=1 set BUILD_PORTABLE=1 set BUILD_VS=1 -) + set BUILD_SETUP=%FSC_BUILD_SETUP% -if /i '%ARG%' == 'notests' ( - set TEST_COMPILERUNIT=0 - set TEST_NET40_COREUNIT=0 - set TEST_CORECLR=0 - set TEST_PORTABLE_COREUNIT=0 - set TEST_VS=0 - set TEST_FSHARP_SUITE=0 - set TEST_FSHARPQA_SUITE=0 - set SKIP_EXPENSIVE_TESTS=1 + set TEST_NET40_COMPILERUNIT_SUITE=1 + set TEST_NET40_COREUNIT_SUITE=1 + set TEST_NET40_FSHARP_SUITE=1 + set TEST_NET40_FSHARPQA_SUITE=1 + set TEST_PORTABLE_COREUNIT_SUITE=1 + set TEST_CORECLR_COREUNIT_SUITE=1 + set TEST_VS_IDEUNIT_SUITE=1 + + set SKIP_EXPENSIVE_TESTS=0 ) if /i '%ARG%' == 'test-smoke' ( REM Smoke tests are a very small quick subset of tests - set SKIP_EXPENSIVE_TESTS=1 - set TEST_COMPILERUNIT=0 - set TEST_NET40_COREUNIT=0 - set TEST_FSHARP_SUITE=1 - set TEST_FSHARPQA_SUITE=0 + REM what we do + set TEST_NET40_FSHARP_SUITE=1 set TEST_TAGS=Smoke + ) -if /i '%ARG%' == 'test-fsharpqa' ( +if /i '%ARG%' == 'test-net40-fsharpqa-suite' ( set BUILD_NET40=1 - set TEST_FSHARPQA_SUITE=1 + set BUILD_PORTABLE=1 + set TEST_NET40_FSHARPQA_SUITE=1 ) -if /i '%ARG%' == 'test-compilerunit' ( +if /i '%ARG%' == 'test-compiler-unit-suite' ( set BUILD_NET40=1 - set TEST_COMPILERUNIT=1 + set TEST_NET40_COMPILERUNIT_SUITE=1 ) -if /i '%ARG%' == 'test-coreunit' ( +if /i '%ARG%' == 'test-net40-coreunit-suite' ( set BUILD_NET40=1 - set TEST_NET40_COREUNIT=1 + set TEST_NET40_COREUNIT_SUITE=1 ) -if /i '%ARG%' == 'test-coreclr' ( + +if /i '%ARG%' == 'test-coreclr-coreunit-suite' ( + set BUILD_PROTO_WITH_CORECLR_LKG=1 set BUILD_CORECLR=1 - set TEST_CORECLR=1 + set TEST_CORECLR_COREUNIT_SUITE=1 ) -if /i '%ARG%' == 'test-pcls' ( + +if /i '%ARG%' == 'test-pcl-coreunit-suite' ( + set BUILD_NET40=1 set BUILD_PORTABLE=1 - set TEST_PORTABLE_COREUNIT=1 + set TEST_PORTABLE_COREUNIT_SUITE=1 ) -if /i '%ARG%' == 'test-vs' ( - set BUILD_VS=1 - set TEST_VS=1 + +if /i '%ARG%' == 'test-net40-fsharp-suite' ( + set BUILD_NET40=1 + set BUILD_PORTABLE=1 + set TEST_NET40_FSHARP_SUITE=1 ) -if /i '%ARG%' == 'test-fsharp' ( - set TEST_FSHARP_SUITE=1 +if /i '%ARG%' == 'test-coreclr-fsharp-suite' ( + set BUILD_CORECLR=1 + set TEST_CORECLR_FSHARP_SUITE=1 ) if /i '%ARG%' == 'publicsign' ( @@ -286,26 +323,29 @@ echo BUILD_PORTABLE=%BUILD_PORTABLE% echo BUILD_VS=%BUILD_VS% echo BUILD_SETUP=%BUILD_SETUP% echo BUILD_CONFIG=%BUILD_CONFIG% -echo BUILD_CONFIG_LOWERCASE=%BUILD_CONFIG_LOWERCASE% echo BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% echo. -echo TEST_COMPILERUNIT=%TEST_COMPILERUNIT% -echo TEST_NET40_COREUNIT=%TEST_NET40_COREUNIT% -echo TEST_PORTABLE_COREUNIT=%TEST_PORTABLE_COREUNIT% -echo TEST_VS=%TEST_VS% -echo TEST_FSHARP_SUITE=%TEST_FSHARP_SUITE% -echo TEST_FSHARPQA_SUITE=%TEST_FSHARPQA_SUITE% +echo TEST_NET40_COMPILERUNIT_SUITE=%TEST_NET40_COMPILERUNIT_SUITE% +echo TEST_NET40_COREUNIT_SUITE=%TEST_NET40_COREUNIT_SUITE% +echo TEST_NET40_FSHARP_SUITE=%TEST_NET40_FSHARP_SUITE% +echo TEST_NET40_FSHARPQA_SUITE=%TEST_NET40_FSHARPQA_SUITE% +echo TEST_CORECLR_COREUNIT_SUITE=%TEST_CORECLR_COREUNIT_SUITE% +echo TEST_CORECLR_FSHARP_SUITE=%TEST_CORECLR_FSHARP_SUITE% +echo TEST_PORTABLE_COREUNIT_SUITE=%TEST_PORTABLE_COREUNIT_SUITE% +echo TEST_VS_IDEUNIT_SUITE=%TEST_VS_IDEUNIT_SUITE% echo TEST_TAGS=%TEST_TAGS% echo SKIP_EXPENSIVE_TESTS=%SKIP_EXPENSIVE_TESTS% echo. +echo ---------------- Done with arguments, starting preparation ----------------- + if "%RestorePackages%"=="" ( set RestorePackages=true ) @echo on -call src\update.cmd signonly +@call src\update.cmd signonly :: Check prerequisites if not '%VisualStudioVersion%' == '' goto vsversionset @@ -358,15 +398,28 @@ if defined APPVEYOR ( set _msbuildexe=%_msbuildexe% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" ) ) -set msbuildflags=/maxcpucount %_nrswitch% +set msbuildflags=/maxcpucount %_nrswitch% /nologo set _ngenexe="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\ngen.exe" if not exist %_ngenexe% echo Error: Could not find ngen.exe. && goto :failure +echo ---------------- Done with prepare, starting package restore ---------------- + if '%RestorePackages%' == 'true' ( - %_ngenexe% install .\.nuget\NuGet.exe + %_ngenexe% install .\.nuget\NuGet.exe /nologo .\.nuget\NuGet.exe restore packages.config -PackagesDirectory packages -ConfigFile .nuget\nuget.config @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure + + if '%BUILD_VS%' == '1' ( + .\.nuget\NuGet.exe restore vsintegration\packages.config -PackagesDirectory packages -ConfigFile .nuget\nuget.config + @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure + ) + + if '%BUILD_SETUP%' == '1' ( + .\.nuget\NuGet.exe restore setup\packages.config -PackagesDirectory packages -ConfigFile .nuget\nuget.config + @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure + ) + ) if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '1' ( @@ -376,126 +429,209 @@ if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '1' ( set _dotnetexe=%~dp0Tools\dotnetcli\dotnet.exe +set _fsiexe="packages\FSharp.Compiler.Tools.4.0.1.10\tools\fsi.exe" +if not exist %_fsiexe% echo Error: Could not find %_fsiexe% && goto :failure +%_ngenexe% install %_fsiexe% /nologo + +set _nugetexe=".nuget\nuget.exe" +set _nugetconfig=".nuget\nuget.config" +if not exist %_nugetexe% echo Error: Could not find %_nugetexe% && goto :failure +%_ngenexe% install %_nugetexe% /nologo + +echo ---------------- Done with package restore, starting proto ------------------------ + +rem Decide if Proto need building if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '1' ( - :: Restore the Tools directory - call %~dp0init-tools.cmd + if NOT EXIST Tools\lkg\fsc.exe ( + set BUILD_PROTO=1 + ) +) + +if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '0' ( + if NOT EXIST Proto\net40\bin\fsc-proto.exe ( + set BUILD_PROTO=1 + ) +) + + +rem Build Proto +if '%BUILD_PROTO%' == '1' ( + if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '1' ( pushd .\lkg & %_dotnetexe% restore &popd @if ERRORLEVEL 1 echo Error: dotnet restore failed && goto :failure pushd .\lkg & %_dotnetexe% publish project.json -o %~dp0\Tools\lkg -r win7-x64 &popd @if ERRORLEVEL 1 echo Error: dotnet publish failed && goto :failure -) -if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '0' ( - rmdir /s /q %~dp0\Tools\lkg -) + echo %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj + %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj + @if ERRORLEVEL 1 echo Error: compiler proto build failed && goto :failure -rem copy targestfile into tools directory ... temporary fix until packaging complete. -copy src\fsharp\FSharp.Build\Microsoft.FSharp.targets tools\Microsoft.FSharp.targets -copy src\fsharp\FSharp.Build\Microsoft.Portable.FSharp.targets tools\Microsoft.Portable.FSharp.targets + rem copy targestfile into tools directory ... temporary fix until packaging complete. + echo copy src\fsharp\FSharp.Build\Microsoft.FSharp.targets tools\Microsoft.FSharp.targets + copy src\fsharp\FSharp.Build\Microsoft.FSharp.targets tools\Microsoft.FSharp.targets -:: Build Proto -if NOT EXIST Proto\net40\bin\fsc-proto.exe (set BUILD_PROTO=1) + echo copy src\fsharp\FSharp.Build\Microsoft.Portable.FSharp.targets tools\Microsoft.Portable.FSharp.targets + copy src\fsharp\FSharp.Build\Microsoft.Portable.FSharp.targets tools\Microsoft.Portable.FSharp.targets + ) -:: Build -if '%BUILD_PROTO%' == '1' ( - %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj + if '%BUILD_PROTO_WITH_CORECLR_LKG%' == '0' ( + + echo %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj + %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj @if ERRORLEVEL 1 echo Error: compiler proto build failed && goto :failure - %_ngenexe% install Proto\net40\bin\fsc-proto.exe + echo %_ngenexe% install Proto\net40\bin\fsc-proto.exe /nologo + %_ngenexe% install Proto\net40\bin\fsc-proto.exe /nologo @if ERRORLEVEL 1 echo Error: NGen of proto failed && goto :failure + + rmdir /s /q %~dp0\Tools\lkg + ) ) + + +echo ---------------- Done with proto, starting build ------------------------ + %_msbuildexe% %msbuildflags% build-everything.proj /p:Configuration=%BUILD_CONFIG% %BUILD_DIAG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% @if ERRORLEVEL 1 echo Error: '%_msbuildexe% %msbuildflags% build-everything.proj /p:Configuration=%BUILD_CONFIG% %BUILD_DIAG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN%' failed && goto :failure -@echo on -call src\update.cmd %BUILD_CONFIG_LOWERCASE% -ngen -pushd tests +echo ---------------- Done with build, starting update/prepare --------------- -if 'TEST_COMPILERUNIT' == '0' and 'TEST_PORTABLE_COREUNIT' == '0' and 'TEST_CORECLR' == '0' and 'TEST_VS' == '0' and 'TEST_FSHARP_SUITE' == '0' and 'TEST_FSHARPQA_SUITE' == '0' goto :finished +if 'BUILD_NET40' == '1' ( + call src\update.cmd %BUILD_CONFIG% -ngen +) -@echo on -call BuildTestTools.cmd %BUILD_CONFIG_LOWERCASE% -@if ERRORLEVEL 1 echo Error: 'BuildTestTools.cmd %BUILD_CONFIG_LOWERCASE%' failed && goto :failed_tests +@echo set NUNITPATH=packages\NUnit.Console.3.0.0\tools\ +set NUNITPATH=packages\NUnit.Console.3.0.0\tools\ +if not exist %NUNITPATH% echo Error: Could not find %NUNITPATH% && goto :failure -@echo on -if '%TEST_FSHARP_SUITE%' == '1' ( - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% fsharp %TEST_TAGS% +@echo xcopy "%NUNITPATH%*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y + xcopy "%NUNITPATH%*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y + +@echo xcopy "%~dp0tests\fsharpqa\testenv\src\nunit*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y + xcopy "%~dp0tests\fsharpqa\testenv\src\nunit*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y + +if '%BUILD_CORECLR%' == '1' ( + + echo Restoring CoreCLR packages and runtimes necessary for actually running and testing + %_nugetexe% restore .\tests\fsharp\project.json -PackagesDirectory packages + + echo Deploy x86 version of compiler and dependencies, ready for testing + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\win7-x86 --copyCompiler:yes --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\win7-x86 --copyCompiler:no --v:quiet + + echo Deploy x64 version of compiler, ready for testing + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\win7-x64 --copyCompiler:yes --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\win7-x64 --copyCompiler:no --v:quiet + + echo Deploy linux version of built compiler, ready for testing + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\ubuntu.14.04-x64 --copyCompiler:yes --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\ubuntu.14.04-x64 --copyCompiler:no --v:quiet + + echo Deploy osx version of built compiler, ready for testing + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\osx.10.10-x64 --copyCompiler:yes --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\osx.10.10-x64 --copyCompiler:no --v:quiet + +) + + +if 'TEST_NET40_COMPILERUNIT_SUITE' == '0' and 'TEST_PORTABLE_COREUNIT_SUITE' == '0' and 'TEST_CORECLR_COREUNIT_SUITE' == '0' and 'TEST_VS_IDEUNIT_SUITE' == '0' and 'TEST_NET40_FSHARP_SUITE' == '0' and 'TEST_NET40_FSHARPQA_SUITE' == '0' goto :finished + +echo ---------------- Done with update, starting tests ----------------------- + + +pushd tests + +if '%TEST_NET40_FSHARP_SUITE%' == '1' ( + echo call RunTests.cmd %BUILD_CONFIG% net40-fsharp-suite %TEST_TAGS% + call RunTests.cmd %BUILD_CONFIG% net40-fsharp-suite %TEST_TAGS% @if ERRORLEVEL 1 ( - type testresults\FSharpNunit_Error.log - echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWERCASE% fsharp %TEST_TAGS%' failed + type testresults\net40-fsharp-suite-errors.log + echo Error: 'Running tests net40-fsharp-suite %TEST_TAGS%' failed goto :failed_tests ) ) -if '%TEST_FSHARPQA_SUITE%' == '1' ( - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% fsharpqa %TEST_TAGS% +if '%TEST_NET40_FSHARPQA_SUITE%' == '1' ( + echo call RunTests.cmd %BUILD_CONFIG% net40-fsharpqa-suite %TEST_TAGS% + call RunTests.cmd %BUILD_CONFIG% net40-fsharpqa-suite %TEST_TAGS% @if ERRORLEVEL 1 ( - type testresults\fsharpqa_failures.log - echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWERCASE% fsharpqa %TEST_TAGS%' failed + echo type testresults\net40-fsharpqa-suite-results.log + type testresults\net40-fsharpqa-suite-results.log + echo type testresults\net40-fsharpqa-suite-errors.log + type testresults\net40-fsharpqa-suite-errors.log + echo Error: 'Running tests net40-fsharpqa-suite %TEST_TAGS%' failed goto :failed_tests ) ) -if '%TEST_COMPILERUNIT%' == '1' ( - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% compilerunit %TEST_TAGS% +if '%TEST_NET40_COMPILERUNIT_SUITE%' == '1' ( + echo call RunTests.cmd %BUILD_CONFIG% net40-compilerunit-suite %TEST_TAGS% + call RunTests.cmd %BUILD_CONFIG% net40-compilerunit-suite %TEST_TAGS% @if ERRORLEVEL 1 ( - type testresults\CompilerUnit_net40_Error.log - echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWERCASE% compilerunit' failed + type testresults\net40-compilerunit-suite-output.log + type testresults\net40-compilerunit-suite-errors.log + echo Error: 'Running tests net40-compilerunit-suite' failed goto :failed_tests ) ) -if '%TEST_NET40_COREUNIT%' == '1' ( - if '%TEST_PORTABLE_COREUNIT%' == '1' ( - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunitall %TEST_TAGS% - @if ERRORLEVEL 1 ( - @echo "type testresults\CoreUnit_net40_Error.log " - type testresults\CoreUnit_net40_Error.log - echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunit' failed - goto :failed_tests - ) - ) - if '%TEST_PORTABLE_COREUNIT%' == '0' ( - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunit %TEST_TAGS% - @if ERRORLEVEL 1 ( - type testresults\CoreUnit_Portable_Error.log - echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunit' failed - goto :failed_tests - ) +if '%TEST_NET40_COREUNIT_SUITE%' == '1' ( + echo call RunTests.cmd %BUILD_CONFIG% net40-coreunit-suite %TEST_TAGS% + call RunTests.cmd %BUILD_CONFIG% net40-coreunit-suite %TEST_TAGS% + @if ERRORLEVEL 1 ( + type testresults\net40-coreunit-suite-output.log + type testresults\net40-coreunit-suite-errors.log + echo Error: 'Running tests net40-coreunit-suite' failed + goto :failed_tests ) ) -if '%TEST_NET40_COREUNIT%' == '0' ( - if '%TEST_PORTABLE_COREUNIT%' == '1' ( - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunitall %TEST_TAGS% - @if ERRORLEVEL 1 ( - type testresults\CoreUnit_all_Error.log - echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunitall %TEST_TAGS%' failed - goto :failed_tests - ) +if '%TEST_PORTABLE_COREUNIT_SUITE%' == '1' ( + echo call RunTests.cmd %BUILD_CONFIG% portable-coreunit-suite %TEST_TAGS% + call RunTests.cmd %BUILD_CONFIG% portable-coreunit-suite %TEST_TAGS% + @if ERRORLEVEL 1 ( + @echo "type testresults\portable-coreunit-suite-output.log " + @echo "type testresults\portable-coreunit-suite-errors.log " + type testresults\portable-coreunit-suite-errors.log + echo Error: 'Running tests portable-coreunit-suite' failed + goto :failed_tests ) ) -if '%TEST_CORECLR%' == '1' ( - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunitcoreclr %TEST_TAGS% + +if '%TEST_CORECLR_COREUNIT_SUITE%' == '1' ( + echo call RunTests.cmd %BUILD_CONFIG% coreclr-coreunit-suite %TEST_TAGS% + call RunTests.cmd %BUILD_CONFIG% coreclr-coreunit-suite %TEST_TAGS% @if ERRORLEVEL 1 ( - type testresults\CoreUnit_coreclr_Error.log - echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunitcoreclr %TEST_TAGS%' failed + type testresults\coreclr-coreunit-suite-output.log + type testresults\coreclr-coreunit-suite-errors.log + echo Error: 'Running tests coreclr-coreunit-suite %TEST_TAGS%' failed goto :failed_tests ) - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% fsharp coreclr +) +if '%TEST_CORECLR_FSHARP_SUITE%' == '1' ( + echo call RunTests.cmd %BUILD_CONFIG% coreclr-fsharp-suite %TEST_TAGS% + call RunTests.cmd %BUILD_CONFIG% coreclr-fsharp-suite %TEST_TAGS% @if ERRORLEVEL 1 ( - type testresults\FSharp_Failures.log - echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWERCASE% coreunitcoreclr %TEST_TAGS%' failed + type testresults\coreclr-fsharp-suite-output.log + type testresults\coreclr-fsharp-suite-errors.log + echo Error: 'Running tests coreclr-fsharp-suite %TEST_TAGS%' failed goto :failed_tests ) ) -if '%TEST_VS%' == '1' ( - call RunTests.cmd %BUILD_CONFIG_LOWERCASE% ideunit %TEST_TAGS% - @if ERRORLEVEL 1 echo Error: 'RunTests.cmd %BUILD_CONFIG_LOWER% ideunit %TEST_TAGS%' failed && goto :failed_tests +if '%TEST_VS_IDEUNIT_SUITE%' == '1' ( + echo call RunTests.cmd %BUILD_CONFIG% vs-ideunit-suite %TEST_TAGS% + call RunTests.cmd %BUILD_CONFIG% vs-ideunit-suite %TEST_TAGS% + @if ERRORLEVEL 1 ( + type testresults\vs-ideunit-suite-output.log + type testresults\vs-ideunit-suite-errors.log + echo Error: 'Running tests vs-ideunit-suite %TEST_TAGS%' failed + goto :failed_tests + ) ) + :finished @echo "Finished" popd diff --git a/packages.config b/packages.config index 9a84e6011cf..65f6e52d0e5 100644 --- a/packages.config +++ b/packages.config @@ -1,51 +1,43 @@ - + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 9a67f75550b..25d86b970b8 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -86,7 +86,6 @@ - $(FSharpSourcesRoot)\..\lkg\FSharp-$(LkgVersion)\bin $(FSharpSourcesRoot)\..\lkg\FSharp-$(LkgVersion)\bin $(FSharpSourcesRoot)\..\lkg\FSharp-$(LkgVersion)\bin $(FSharpSourcesRoot)\..\lkg\FSharp-$(LkgVersion)\bin @@ -96,6 +95,10 @@ 2.0.0-beta6-61005-05 14.0 14.3.25407 + + + + $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.0.1.10\tools diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index 21908f694b4..dc955f4adfb 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -181,7 +181,6 @@ $(DefineConstants);TODO_REWORK_SERVER $(DefineConstants);NO_LOADER_OPTIMIZATION $(DefineConstants);SILVERLIGHT_COMPILER_FSHARP_CORE - $(DefineConstants);I_DONT_KNOW_HOW_TO_DO_THIS_YET $(OtherFlags) --simpleresolution v5.0 @@ -544,7 +543,6 @@ - diff --git a/src/buildtools/buildnugets.fsx b/src/buildtools/buildnugets.fsx index f1ae0cb4309..7725988b935 100644 --- a/src/buildtools/buildnugets.fsx +++ b/src/buildtools/buildnugets.fsx @@ -2,54 +2,32 @@ // // Build nuget package for the fsharp compiler //========================================================================================= -open System.IO -open System.Diagnostics + +#load "scriptlib.fsx" try + //========================================================================================= // Command line arguments - //========================================================================================= - - // Try head was introduced in F# 4.0 - let tryHead (source : seq<_>) = - let checkNonNull argName arg = - match box arg with - | null -> nullArg argName - | _ -> () - checkNonNull "source" source - use e = source.GetEnumerator() - if (e.MoveNext()) then Some e.Current - else None - - let usage = @"usage: BuildNuGets.fsx --version: -nuspec: --binaries:" - let Arguments = fsi.CommandLineArgs |> Seq.skip 1 + let usage = "usage: BuildNuGets.fsx --version: -nuspec: --binaries:" - let GetArgumentFromCommandLine switchName defaultValue = - match Arguments |> Seq.filter(fun t -> t.StartsWith(switchName)) |> Seq.map(fun t -> t.Remove(0, switchName.Length).Trim()) |> tryHead with - | Some(file) -> if file.Length <> 0 then file else defaultValue - | _ -> defaultValue - - let verbose = GetArgumentFromCommandLine "--verbosity:" @"normal" - let version = GetArgumentFromCommandLine "--version:" @"" - let nuspec = GetArgumentFromCommandLine "--nuspec:" @"" - let bindir = GetArgumentFromCommandLine "--bindir:" @"" - let nuspecTitle = Path.GetFileNameWithoutExtension(nuspec) - let layouts = Path.Combine(Path.GetFullPath(bindir), "layouts", nuspecTitle) - let output = Path.Combine(Path.GetFullPath(bindir), "nuget") + let verbose = getCmdLineArg "--verbosity:" "normal" + let version = getCmdLineArg "--version:" "" + let nuspec = getCmdLineArg "--nuspec:" "" + let bindir = getCmdLineArg "--bindir:" "" + let nuspecTitle = getBasename nuspec + let layouts = getFullPath bindir ++ "layouts" ++ nuspecTitle + let output = getFullPath bindir ++ "nuget" let isVerbose = verbose = "verbose" - let makeDirectory output = - if not (Directory.Exists(output)) then Directory.CreateDirectory(output) |>ignore - () - //========================================================================================= - // Build Nuget Package - //========================================================================================= - let author = @"Microsoft" - let licenseUrl = @"https://github.com/Microsoft/visualfsharp/blob/master/License.txt" - let projectUrl = @"https://github.com/Microsoft/visualfsharp" - let tags = @"Visual F# Compiler FSharp coreclr functional programming" + // Invoke nuget.exe to build nuget package + + let author = "Microsoft" + let licenseUrl = "https://github.com/Microsoft/visualfsharp/blob/master/License.txt" + let projectUrl = "https://github.com/Microsoft/visualfsharp" + let tags = "Visual F# Compiler FSharp coreclr functional programming" let nugetArgs = sprintf "pack %s -BasePath \"%s\" -OutputDirectory \"%s\" -ExcludeEmptyDirectories -prop licenseUrl=\"%s\" -prop version=\"%s\" -prop authors=\"%s\" -prop projectURL=\"%s\" -prop tags=\"%s\" -Verbosity detailed" nuspec @@ -61,32 +39,8 @@ try projectUrl tags - let nugetExePath = Path.GetFullPath(Path.Combine(__SOURCE_DIRECTORY__, @"..\..\.nuget\nuget.exe")) - let executeProcess filename arguments = - let processWriteMessage (chan:TextWriter) (message:string) = - match message with - | null -> () - | _ as m -> chan.WriteLine(m) |>ignore - let info = new ProcessStartInfo() - let p = new Process() - printfn "%s %s" filename arguments - info.Arguments <- arguments - info.UseShellExecute <- false - info.RedirectStandardOutput <- true - info.RedirectStandardError <- true - info.CreateNoWindow <- true - info.FileName <- filename - p.StartInfo <- info - p.OutputDataReceived.Add(fun x -> processWriteMessage stdout x.Data) - p.ErrorDataReceived.Add(fun x -> processWriteMessage stderr x.Data) - if p.Start() then - p.BeginOutputReadLine() - p.BeginErrorReadLine() - p.WaitForExit() - p.ExitCode - else - 0 + let nugetExePath = getFullPath (__SOURCE_DIRECTORY__ ++ "../../.nuget/nuget.exe") makeDirectory output exit (executeProcess nugetExePath nugetArgs) with _ -> - exit (1) + exit 1 diff --git a/src/buildtools/scriptlib.fsx b/src/buildtools/scriptlib.fsx new file mode 100644 index 00000000000..ae86fd3d7b4 --- /dev/null +++ b/src/buildtools/scriptlib.fsx @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information, +// +// Scripting utilities +//========================================================================================= + +namespace global + +open System +open System.IO +open System.Diagnostics + +[] +module Scripting = + + let isNullOrEmpty s = String.IsNullOrEmpty s + + let executeProcess filename arguments = + let processWriteMessage (chan:TextWriter) (message:string) = + if message <> null then + chan.WriteLine(message) + printfn "%s %s" filename arguments + let info = ProcessStartInfo(Arguments=arguments, UseShellExecute=false, + RedirectStandardOutput=true, RedirectStandardError=true, + CreateNoWindow=true, FileName=filename) + let p = new Process(StartInfo=info) + p.OutputDataReceived.Add(fun x -> processWriteMessage stdout x.Data) + p.ErrorDataReceived.Add(fun x -> processWriteMessage stderr x.Data) + if p.Start() then + p.BeginOutputReadLine() + p.BeginErrorReadLine() + p.WaitForExit() + p.ExitCode + else + 0 + + let argv = fsi.CommandLineArgs |> Seq.skip 1 + + let getCmdLineArg switchName defaultValue = + match argv |> Seq.filter(fun t -> t.StartsWith(switchName)) |> Seq.map(fun t -> t.Remove(0, switchName.Length).Trim()) |> Seq.tryHead with + | Some(file) -> if file.Length <> 0 then file else defaultValue + | _ -> defaultValue + + let makeDirectory output = + if not (Directory.Exists(output)) then + Directory.CreateDirectory(output) |> ignore + + let (++) a b = Path.Combine(a,b) + + let getBasename a = Path.GetFileNameWithoutExtension a + let getFullPath a = Path.GetFullPath a + let getFilename a = Path.GetFileName a + let getDirectoryName a = Path.GetDirectoryName a + + let copyFile source dir = + let dest = + if not (Directory.Exists dir) then Directory.CreateDirectory dir |>ignore + let result = Path.Combine(dir, Path.GetFileName source) + result + //printfn "Copy %s --> %s" source dest + File.Copy(source, dest, true) + + let deleteDirectory output = + if Directory.Exists output then + Directory.Delete(output, true) + diff --git a/src/fsharp-compiler-build.proj b/src/fsharp-compiler-build.proj index 4c338446f7c..9eeca3f66b5 100644 --- a/src/fsharp-compiler-build.proj +++ b/src/fsharp-compiler-build.proj @@ -1,24 +1,11 @@ - - net40 - - - + - - - - - - - + - - + diff --git a/src/fsharp/FSharp.Compiler.Host.netcore.nuget/FSharp.Compiler.Host.proj b/src/fsharp/FSharp.Compiler.Host.netcore.nuget/FSharp.Compiler.Host.proj index 33b3d01d311..b8ef39d90ec 100644 --- a/src/fsharp/FSharp.Compiler.Host.netcore.nuget/FSharp.Compiler.Host.proj +++ b/src/fsharp/FSharp.Compiler.Host.netcore.nuget/FSharp.Compiler.Host.proj @@ -9,15 +9,13 @@ $(NuGetPerBuildPreReleaseVersion) $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin - $(FSharpSourcesRoot)\..\$(Configuration)\net40\bin - + - - - + + diff --git a/src/fsharp/FSharp.Compiler.Host.netcore.nuget/layoutfschostnuget.fsx b/src/fsharp/FSharp.Compiler.Host.netcore.nuget/layoutfschostnuget.fsx index ca90004d47e..642b39dcc5e 100644 --- a/src/fsharp/FSharp.Compiler.Host.netcore.nuget/layoutfschostnuget.fsx +++ b/src/fsharp/FSharp.Compiler.Host.netcore.nuget/layoutfschostnuget.fsx @@ -4,53 +4,30 @@ //========================================================================================= open System.IO +#load "../../buildtools/scriptlib.fsx" + try //========================================================================================= // Command line arguments - //========================================================================================= - - // Try head was introduced in F# 4.0 - let tryHead (source : seq<_>) = - let checkNonNull argName arg = - match box arg with - | null -> nullArg argName - | _ -> () - checkNonNull "source" source - use e = source.GetEnumerator() - if (e.MoveNext()) then Some e.Current - else None - let usage = @"usage: layoutfcsnhostnuget.fsx -nuspec: --binaries:" + let usage = "usage: layoutfcsnhostnuget.fsx -nuspec: --binaries:" - let Arguments = fsi.CommandLineArgs |> Seq.skip 1 - - let GetArgumentFromCommandLine switchName defaultValue = - match Arguments |> Seq.filter(fun t -> t.StartsWith(switchName)) |> Seq.map(fun t -> t.Remove(0, switchName.Length).Trim()) |> tryHead with - | Some(file) -> if file.Length <> 0 then file else defaultValue - | _ -> defaultValue - - let verbose = GetArgumentFromCommandLine "--verbosity:" @"normal" - let nuspec = GetArgumentFromCommandLine "--nuspec:" @"" - let bindir = GetArgumentFromCommandLine "--bindir:" @"" - let nuspecTitle = Path.GetFileNameWithoutExtension(nuspec) - let layouts = Path.Combine(Path.GetFullPath(bindir), "layouts", nuspecTitle) + let verbose = getCmdLineArg "--verbosity:" "normal" + let nuspec = getCmdLineArg "--nuspec:" "" + let bindir = getCmdLineArg "--bindir:" "" + let nuspecTitle = getBasename nuspec + let layouts = getFullPath bindir ++ "layouts" ++ nuspecTitle let isVerbose = verbose = "verbose" //========================================================================================= - // Layout nuget package --- nothing to do here except make the directory - //========================================================================================= - let deleteDirectory output = - if (Directory.Exists(output)) then Directory.Delete(output, true) |>ignore - () - - let makeDirectory output = - if not (Directory.Exists(output)) then Directory.CreateDirectory(output) |>ignore - () + // Layout nuget package //Clean intermediate directory - deleteDirectory layouts; makeDirectory layouts - -with e -> printfn "Exception: %s" e.Message - printfn "Stacktrace: %s" e.StackTrace - exit (1) -exit (0) + deleteDirectory layouts + makeDirectory layouts + exit 0 + +with e -> + printfn "Exception: %s" e.Message + printfn "Stacktrace: %s" e.StackTrace + exit 1 diff --git a/src/fsharp/FSharp.Compiler.netcore.nuget/FSharp.Compiler.nuget.proj b/src/fsharp/FSharp.Compiler.netcore.nuget/FSharp.Compiler.nuget.proj index c94cf43338f..eb960b66dc1 100644 --- a/src/fsharp/FSharp.Compiler.netcore.nuget/FSharp.Compiler.nuget.proj +++ b/src/fsharp/FSharp.Compiler.netcore.nuget/FSharp.Compiler.nuget.proj @@ -9,15 +9,13 @@ $(NuGetPerBuildPreReleaseVersion) $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin - $(FSharpSourcesRoot)\..\$(Configuration)\net40\bin - - - + + diff --git a/src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx b/src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx index 47750df8f1d..071027ff96d 100644 --- a/src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx +++ b/src/fsharp/FSharp.Compiler.netcore.nuget/layoutfscnuget.fsx @@ -2,80 +2,45 @@ // // Layout the nuget package for the fsharp compiler //========================================================================================= -open System.IO + +#load "../../buildtools/scriptlib.fsx" try //========================================================================================= // Command line arguments - //========================================================================================= - - // Try head was introduced in F# 4.0 - let tryHead (source : seq<_>) = - let checkNonNull argName arg = - match box arg with - | null -> nullArg argName - | _ -> () - checkNonNull "source" source - use e = source.GetEnumerator() - if (e.MoveNext()) then Some e.Current - else None - let usage = @"usage: layoutfcsnuget.fsx -nuspec: --binaries:" - - let Arguments = fsi.CommandLineArgs |> Seq.skip 1 - - let GetArgumentFromCommandLine switchName defaultValue = - match Arguments |> Seq.filter(fun t -> t.StartsWith(switchName)) |> Seq.map(fun t -> t.Remove(0, switchName.Length).Trim()) |> tryHead with - | Some(file) -> if file.Length <> 0 then file else defaultValue - | _ -> defaultValue + let usage = "usage: layoutfcsnuget.fsx -nuspec: --binaries:" - let verbose = GetArgumentFromCommandLine "--verbosity:" @"normal" - let nuspec = GetArgumentFromCommandLine "--nuspec:" @"" - let bindir = GetArgumentFromCommandLine "--bindir:" @"" - let nuspecTitle = Path.GetFileNameWithoutExtension(nuspec) + let verbose = getCmdLineArg "--verbosity:" "normal" + let nuspec = getCmdLineArg "--nuspec:" "" + let bindir = getCmdLineArg "--bindir:" "" + let nuspecTitle = getBasename nuspec printfn ">>%s<<" bindir printfn ">>%s<<" nuspecTitle - let layouts = Path.Combine(Path.GetFullPath(bindir), "layouts", nuspecTitle) + let layouts = getFullPath bindir ++ "layouts" ++ nuspecTitle let isVerbose = verbose = "verbose" //========================================================================================= // Layout nuget package - //========================================================================================= - let copyFile source dir = - let dest = - if not (Directory.Exists(dir)) then Directory.CreateDirectory(dir) |>ignore - let result = Path.Combine(dir, Path.GetFileName(source)) - result - if isVerbose then - printfn "source: %s" source - printfn "dest: %s" dest - File.Copy(source, dest, true) - - let deleteDirectory (output) = - if (Directory.Exists(output)) then Directory.Delete(output, true) |>ignore - () - - let makeDirectory (output) = - if not (Directory.Exists(output)) then Directory.CreateDirectory(output) |>ignore - () let fsharpCompilerFiles = - seq { - yield Path.Combine(bindir, "fsc.exe") - yield Path.Combine(bindir, "FSharp.Compiler.dll") - yield Path.Combine(bindir, "default.win32manifest") - yield Path.Combine(bindir, "fsi.exe") - yield Path.Combine(bindir, "FSharp.Compiler.Interactive.Settings.dll") - yield Path.Combine(bindir, "FSharp.Build.dll") - yield Path.Combine(bindir, "Microsoft.FSharp.targets") - yield Path.Combine(bindir, "Microsoft.Portable.FSharp.targets") - } + [ bindir ++ "fsc.exe" + bindir ++ "FSharp.Compiler.dll" + bindir ++ "default.win32manifest" + bindir ++ "fsi.exe" + bindir ++ "FSharp.Compiler.Interactive.Settings.dll" + bindir ++ "FSharp.Build.dll" + bindir ++ "Microsoft.FSharp.targets" + bindir ++ "Microsoft.Portable.FSharp.targets" ] //Clean intermediate directoriy - deleteDirectory(layouts); makeDirectory(layouts) - fsharpCompilerFiles |> Seq.iter(fun source -> copyFile source layouts) - -with e -> printfn "Exception: %s" e.Message - printfn "Stacktrace: %s" e.StackTrace - exit (1) -exit (0) + deleteDirectory layouts + makeDirectory layouts + for source in fsharpCompilerFiles do + copyFile source layouts + exit 0 + +with e -> + printfn "Exception: %s" e.Message + printfn "Stacktrace: %s" e.StackTrace + exit 1 diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 46362c5f748..e9da539b7bf 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -2034,6 +2034,8 @@ let main2b(Args(tcConfig: TcConfig, tcImports, tcGlobals, errorLogger, generated let main3(Args(tcConfig, errorLogger: ErrorLogger, staticLinker, ilGlobals, outfile, pdbfile, ilxMainModule, signingInfo, exiter:Exiter)) = + use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind (BuildPhase.Output) + let ilxMainModule = try staticLinker ilxMainModule with e -> diff --git a/src/fsharp/fsharp.core.netcore.nuget/FSharp.Core.netcore.nuget.proj b/src/fsharp/fsharp.core.netcore.nuget/FSharp.Core.netcore.nuget.proj index 9064c427c52..55d2754ce09 100644 --- a/src/fsharp/fsharp.core.netcore.nuget/FSharp.Core.netcore.nuget.proj +++ b/src/fsharp/fsharp.core.netcore.nuget/FSharp.Core.netcore.nuget.proj @@ -9,15 +9,13 @@ $(NuGetPerBuildPreReleaseVersion) $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFramework)\bin - $(FSharpSourcesRoot)\..\$(Configuration)\net40\bin - - - + + diff --git a/src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx b/src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx index a756ab9d594..fb4293ef4ab 100644 --- a/src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx +++ b/src/fsharp/fsharp.core.netcore.nuget/layoutfscorenuget.fsx @@ -2,76 +2,43 @@ // // Layout the nuget package for the fsharp compiler //========================================================================================= -open System.IO + +#load "../../buildtools/scriptlib.fsx" try + //========================================================================================= // Command line arguments - //========================================================================================= - - // Try head was introduced in F# 4.0 - let tryHead (source : seq<_>) = - let checkNonNull argName arg = - match box arg with - | null -> nullArg argName - | _ -> () - checkNonNull "source" source - use e = source.GetEnumerator() - if (e.MoveNext()) then Some e.Current - else None - - let usage = @"usage: layoutfscorenuget.fsx -nuspec: --binaries:" - let Arguments = fsi.CommandLineArgs |> Seq.skip 1 - - let GetArgumentFromCommandLine switchName defaultValue = - match Arguments |> Seq.filter(fun t -> t.StartsWith(switchName)) |> Seq.map(fun t -> t.Remove(0, switchName.Length).Trim()) |> tryHead with - | Some(file) -> if file.Length <> 0 then file else defaultValue - | _ -> defaultValue + let usage = "usage: layoutfscorenuget.fsx -nuspec: --binaries:" - let verbose = GetArgumentFromCommandLine "--verbosity:" @"normal" - let nuspec = GetArgumentFromCommandLine "--nuspec:" @"" - let bindir = GetArgumentFromCommandLine "--bindir:" @"" - let nuspecTitle = Path.GetFileNameWithoutExtension(nuspec) - let layouts = Path.Combine(Path.GetFullPath(bindir), "layouts", nuspecTitle) + let verbose = getCmdLineArg "--verbosity:" "normal" + let nuspec = getCmdLineArg "--nuspec:" "" + let bindir = getCmdLineArg "--bindir:" "" + let nuspecTitle = getBasename nuspec + let layouts = getFullPath bindir ++ "layouts" ++ nuspecTitle let isVerbose = verbose = "verbose" //========================================================================================= // Layout nuget package - //========================================================================================= - let copyFile source dir = - let dest = - if not (Directory.Exists(dir)) then Directory.CreateDirectory(dir) |>ignore - let result = Path.Combine(dir, Path.GetFileName(source)) - result - if isVerbose then - printfn "source: %s" source - printfn "dest: %s" dest - File.Copy(source, dest, true) - - let deleteDirectory (output) = - if (Directory.Exists(output)) then Directory.Delete(output, true) |>ignore - () - - let makeDirectory (output) = - if not (Directory.Exists(output)) then Directory.CreateDirectory(output) |>ignore - () let fsharpCoreFiles = - seq { - yield Path.Combine(bindir, "FSharp.Core.xml") - yield Path.Combine(bindir, "FSharp.Core.dll") - yield Path.Combine(bindir, "FSharp.Core.sigdata") - yield Path.Combine(bindir, "FSharp.Core.optdata") - yield Path.Combine( __SOURCE_DIRECTORY__ , "FSharp.Core.runtimeconfig.json") - } + [ bindir ++ "FSharp.Core.xml" + bindir ++ "FSharp.Core.dll" + bindir ++ "FSharp.Core.sigdata" + bindir ++ "FSharp.Core.optdata" + __SOURCE_DIRECTORY__ ++ "FSharp.Core.runtimeconfig.json" ] + + //Clean intermediate directory + deleteDirectory layouts + makeDirectory layouts - //Clean intermediate directoriy - deleteDirectory(layouts); makeDirectory(layouts) + for source in fsharpCoreFiles do + copyFile source layouts - fsharpCoreFiles |> Seq.iter(fun source -> copyFile source layouts) + exit 0 -with e -> printfn "Exception: %s" e.Message - printfn "Stacktrace: %s" e.StackTrace - exit (1) -exit (0) +with e -> + printfn "Exception: %s" e.Message + printfn "Stacktrace: %s" e.StackTrace + exit 1 diff --git a/src/update.cmd b/src/update.cmd index 67a4b8f792b..7707ea0ef5f 100644 --- a/src/update.cmd +++ b/src/update.cmd @@ -44,52 +44,52 @@ set NGEN32=%windir%\Microsoft.NET\Framework\v4.0.30319\ngen.exe set NGEN64=%windir%\Microsoft.NET\Framework64\v4.0.30319\ngen.exe rem Disable strong-name validation for F# binaries built from open source that are signed with the microsoft key -%SN32% -Vr FSharp.Core,b03f5f7f11d50a3a -%SN32% -Vr FSharp.Build,b03f5f7f11d50a3a -%SN32% -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a -%SN32% -Vr FSharp.Compiler.Hosted,b03f5f7f11d50a3a - -%SN32% -Vr fsc,b03f5f7f11d50a3a -%SN32% -Vr fsi,b03f5f7f11d50a3a -%SN32% -Vr FsiAnyCPU,b03f5f7f11d50a3a - -%SN32% -Vr FSharp.Compiler,b03f5f7f11d50a3a -%SN32% -Vr FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a -%SN32% -Vr FSharp.Editor,b03f5f7f11d50a3a -%SN32% -Vr FSharp.LanguageService,b03f5f7f11d50a3a -%SN32% -Vr FSharp.LanguageService.Base,b03f5f7f11d50a3a -%SN32% -Vr FSharp.LanguageService.Compiler,b03f5f7f11d50a3a -%SN32% -Vr FSharp.ProjectSystem.Base,b03f5f7f11d50a3a -%SN32% -Vr FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a -%SN32% -Vr FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a -%SN32% -Vr FSharp.VS.FSI,b03f5f7f11d50a3a -%SN32% -Vr VisualFSharp.Unittests,b03f5f7f11d50a3a -%SN32% -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a -%SN32% -Vr FSharp.Compiler.Unittests,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.Core,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.Build,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.Compiler.Hosted,b03f5f7f11d50a3a + +%SN32% -q -Vr fsc,b03f5f7f11d50a3a +%SN32% -q -Vr fsi,b03f5f7f11d50a3a +%SN32% -q -Vr FsiAnyCPU,b03f5f7f11d50a3a + +%SN32% -q -Vr FSharp.Compiler,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.Editor,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.LanguageService,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.LanguageService.Base,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.LanguageService.Compiler,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.ProjectSystem.Base,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.VS.FSI,b03f5f7f11d50a3a +%SN32% -q -Vr VisualFSharp.Unittests,b03f5f7f11d50a3a +%SN32% -q -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a +%SN32% -q -Vr FSharp.Compiler.Unittests,b03f5f7f11d50a3a if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( - %SN64% -Vr FSharp.Core,b03f5f7f11d50a3a - %SN64% -Vr FSharp.Build,b03f5f7f11d50a3a - %SN64% -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a - %SN64% -Vr FSharp.Compiler.Hosted,b03f5f7f11d50a3a - - %SN64% -Vr fsc,b03f5f7f11d50a3a - %SN64% -Vr fsi,b03f5f7f11d50a3a - %SN64% -Vr FsiAnyCPU,b03f5f7f11d50a3a - - %SN64% -Vr FSharp.Compiler,b03f5f7f11d50a3a - %SN64% -Vr FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a - %SN64% -Vr FSharp.Editor,b03f5f7f11d50a3a - %SN64% -Vr FSharp.LanguageService,b03f5f7f11d50a3a - %SN64% -Vr FSharp.LanguageService.Base,b03f5f7f11d50a3a - %SN64% -Vr FSharp.LanguageService.Compiler,b03f5f7f11d50a3a - %SN64% -Vr FSharp.ProjectSystem.Base,b03f5f7f11d50a3a - %SN64% -Vr FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a - %SN64% -Vr FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a - %SN64% -Vr FSharp.VS.FSI,b03f5f7f11d50a3a - %SN64% -Vr VisualFSharp.Unittests,b03f5f7f11d50a3a - %SN64% -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a - %SN64% -Vr FSharp.Compiler.Unittests,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.Core,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.Build,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.Compiler.Interactive.Settings,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.Compiler.Hosted,b03f5f7f11d50a3a + + %SN64% -q -Vr fsc,b03f5f7f11d50a3a + %SN64% -q -Vr fsi,b03f5f7f11d50a3a + %SN64% -q -Vr FsiAnyCPU,b03f5f7f11d50a3a + + %SN64% -q -Vr FSharp.Compiler,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.Compiler.Server.Shared,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.Editor,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.LanguageService,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.LanguageService.Base,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.LanguageService.Compiler,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.ProjectSystem.Base,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.ProjectSystem.FSharp,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.ProjectSystem.PropertyPages,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.VS.FSI,b03f5f7f11d50a3a + %SN64% -q -Vr VisualFSharp.Unittests,b03f5f7f11d50a3a + %SN64% -q -Vr VisualFSharp.Salsa,b03f5f7f11d50a3a + %SN64% -q -Vr FSharp.Compiler.Unittests,b03f5f7f11d50a3a ) if /i '%1' == 'signonly' goto :eof @@ -98,15 +98,15 @@ if /i '%1' == 'debug' set NGEN_FLAGS=/Debug rem NGen fsc, fsi, fsiAnyCpu, and FSharp.Build.dll if /i not "%2"=="-ngen" goto :donengen -"%NGEN32%" install "%BINDIR%\fsc.exe" %NGEN_FLAGS% /queue:1 -"%NGEN32%" install "%BINDIR%\fsi.exe" %NGEN_FLAGS% /queue:1 -"%NGEN32%" install "%BINDIR%\FSharp.Build.dll" %NGEN_FLAGS% /queue:1 -"%NGEN32%" executeQueuedItems 1 +"%NGEN32%" install "%BINDIR%\fsc.exe" %NGEN_FLAGS% /queue:1 /nologo +"%NGEN32%" install "%BINDIR%\fsi.exe" %NGEN_FLAGS% /queue:1 /nologo +"%NGEN32%" install "%BINDIR%\FSharp.Build.dll" %NGEN_FLAGS% /queue:1 /nologo +"%NGEN32%" executeQueuedItems 1 /nologo if /i "%PROCESSOR_ARCHITECTURE%"=="AMD64" ( - "%NGEN64%" install "%BINDIR%\fsiAnyCpu.exe" %NGEN_FLAGS% /queue:1 - "%NGEN64%" install "%BINDIR%\FSharp.Build.dll" %NGEN_FLAGS% /queue:1 - "%NGEN64%" executeQueuedItems 1 + "%NGEN64%" install "%BINDIR%\fsiAnyCpu.exe" %NGEN_FLAGS% /queue:1 /nologo + "%NGEN64%" install "%BINDIR%\FSharp.Build.dll" %NGEN_FLAGS% /queue:1 /nologo + "%NGEN64%" executeQueuedItems 1 /nologo ) :donengen diff --git a/tests/.gitignore b/tests/.gitignore index cb70a1d0dd9..2de72583ada 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,5 +1,5 @@ FSharp_* -FSharpQA_* +net40-fsharpqa-suite-* CoreUnit_* TestResults *.il diff --git a/tests/BuildTestTools.cmd b/tests/BuildTestTools.cmd deleted file mode 100644 index be7bb1efeef..00000000000 --- a/tests/BuildTestTools.cmd +++ /dev/null @@ -1,111 +0,0 @@ -@echo off - -if /i "%1" == "debug" goto :ok -if /i "%1" == "release" goto :ok - -echo Builds a few test tools using latest compiler and runtime -echo Usage: -echo BuildTestTools.cmd debug -echo BuildTestTools.cmd release -exit /b 1 - -:ok - -:: Check prerequisites -if not '%VisualStudioVersion%' == '' goto vsversionset - -if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 15.0\common7\ide\devenv.exe" set VisualStudioVersion=15.0 -if exist "%ProgramFiles%\Microsoft Visual Studio 15.0\common7\ide\devenv.exe" set VisualStudioVersion=15.0 -if exist "%VS150COMNTOOLS%" set VisualStudioVersion=15.0 -if not '%VisualStudioVersion%' == '' goto vsversionset -if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\common7\ide\devenv.exe" set VisualStudioVersion=14.0 -if exist "%ProgramFiles%\Microsoft Visual Studio 14.0\common7\ide\devenv.exe" set VisualStudioVersion=14.0 -if exist "%VS140COMNTOOLS%" set VisualStudioVersion=14.0 -if not '%VisualStudioVersion%' == '' goto vsversionset -if exist "%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\common7\ide\devenv.exe" set VisualStudioVersion=12.0 -if exist "%ProgramFiles%\Microsoft Visual Studio 12.0\common7\ide\devenv.exe" set VisualStudioVersion=12.0 -if exist "%VS120COMNTOOLS%" set VisualStudioVersion=12.0 - -:vsversionset -if '%VisualStudioVersion%' == '' echo Error: Could not find an installation of Visual Studio && goto :failure - -if exist "%VS150COMNTOOLS%..\..\MSBuild\15.0\Bin\MSBuild.exe" ( - set _msbuildexe="%VS150COMNTOOLS%..\..\MSBuild\15.0\Bin\MSBuild.exe" - goto :havemsbuild -) -if exist "%ProgramFiles(x86)%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" ( - set _msbuildexe="%ProgramFiles(x86)%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" - goto :havemsbuild -) -if exist "%ProgramFiles%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" ( - set _msbuildexe="%ProgramFiles%\MSBuild\%VisualStudioVersion%\Bin\MSBuild.exe" - goto :havemsbuild -) -echo Error: Could not find MSBuild.exe. && goto :failure -goto :eof -:havemsbuild - -if not exist "%~dp0fsharpqa\testenv\bin" mkdir "%~dp0fsharpqa\testenv\bin" || goto :error -%_msbuildexe% %~dp0fsharpqa\testenv\src\ILComparer\ILComparer.fsproj /p:Configuration=%1 /t:Build || goto :error -xcopy /Y %~dp0fsharpqa\testenv\src\ILComparer\bin\%1\* %~dp0fsharpqa\testenv\bin || goto :error - -%_msbuildexe% %~dp0fsharpqa\testenv\src\diff\diff.fsproj /p:Configuration=%1 /t:Build || goto :error -xcopy /Y %~dp0fsharpqa\testenv\src\diff\bin\%1\* %~dp0fsharpqa\testenv\bin || goto :error - -%_msbuildexe% %~dp0fsharpqa\testenv\src\HostedCompilerServer\HostedCompilerServer.fsproj /p:Configuration=%1 /t:Build || goto :error -xcopy /Y %~dp0fsharpqa\testenv\src\HostedCompilerServer\bin\%1\* %~dp0fsharpqa\testenv\bin || goto :error - -%_msbuildexe% %~dp0fsharpqa\testenv\src\ExecAssembly\ExecAssembly.fsproj /p:Configuration=%1 /t:Build /p:Platform=x86 || goto :error -xcopy /IY %~dp0fsharpqa\testenv\src\ExecAssembly\bin\%1\* %~dp0fsharpqa\testenv\bin\x86 || goto :error - -%_msbuildexe% %~dp0fsharpqa\testenv\src\ExecAssembly\ExecAssembly.fsproj /p:Configuration=%1 /t:Build /p:Platform=x64 || goto :error -xcopy /IY %~dp0fsharpqa\testenv\src\ExecAssembly\bin\%1\* %~dp0fsharpqa\testenv\bin\AMD64 || goto :error - -if exist %~dp0..\%1\net40\bin ( - xcopy /Y %~dp0..\%1\net40\bin\FSharp.Core.sigdata %~dp0fsharpqa\testenv\bin || goto :error - xcopy /Y %~dp0..\%1\net40\bin\FSharp.Core.optdata %~dp0fsharpqa\testenv\bin || goto :error -) - -echo set NUNITPATH=%~dp0%..\packages\NUnit.Console.3.0.0\tools\ -set NUNITPATH=%~dp0%..\packages\NUnit.Console.3.0.0\tools\ -echo if not exist "%NUNITPATH%" - -set _fsiexe="%~dp0..\%1\net40\bin\fsi.exe" - -if '%BUILD_CORECLR%' == '1' ( - - if not exist "%NUNITPATH%" ( - pushd %~dp0.. - ..\.nuget\nuget.exe restore ..\packages.config -PackagesDirectory ..\packages - popd - ) - - rem deploy x86 version of compiler and dependencies - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\win7-x86 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet - - rem deploy x64 version of compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\fsc\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\win7-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet - - rem deploy linux version of built compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\fsc\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\ubuntu.14.04-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet - - rem deploy osx version of built compiler - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\fsc\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:yes --v:quiet - %_fsiexe% --exec %~dp0fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJson:%~dp0fsharp\project.json --projectJsonLock:%~dp0fsharp\project.lock.json --packagesDir:%~dp0..\packages --fsharpCore:%~dp0..\%1\coreclr\bin\FSharp.Core.dll --output:%~dp0testbin\%1\coreclr\osx.10.10-x64 --nugetPath:%~dp0..\.nuget\nuget.exe --nugetConfig:%~dp0..\.nuget\nuget.config --copyCompiler:no --v:quiet - - echo "%NUNITPATH%*.*" "%~dp0fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y - xcopy "%NUNITPATH%*.*" "%~dp0fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y - - echo "%~dp0fsharpqa\testenv\src\nunit*.*" "%~dp0fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y - xcopy "%~dp0fsharpqa\testenv\src\nunit*.*" "%~dp0fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y - -) - -goto :EOF - -:error -echo Failed with error %errorlevel%. -exit /b %errorlevel% diff --git a/tests/Convert-NUnit2Args-to-NUnit3Where.fsx b/tests/Convert-NUnit2Args-to-NUnit3Where.fsx deleted file mode 100644 index ff894462cd3..00000000000 --- a/tests/Convert-NUnit2Args-to-NUnit3Where.fsx +++ /dev/null @@ -1,82 +0,0 @@ -#r "System.Core.dll" - -open System - -type CmdArgs = { IncludeCategories: string option; ExcludeCategories: string option } - -type Expr = - | And of Expr list - | Or of Expr list - | CatEqual of string - | CatNotEqual of string - -let toWhereExpr (cmdArgs: CmdArgs) = - - let split (line: string) = - line.Split([| "," |], StringSplitOptions.RemoveEmptyEntries) - |> Array.map (fun s -> s.Trim()) - |> List.ofArray - - let includesList = - cmdArgs.IncludeCategories - |> Option.map split - |> function None -> [] | Some l -> l - let excludesList = - cmdArgs.ExcludeCategories - |> Option.map split - |> function None -> [] | Some l -> l - - let il = includesList |> List.map (fun c -> CatEqual(c)) |> Or - - let el = excludesList |> List.map (fun c -> CatNotEqual(c)) |> And - - And([il; el]) - -let rec exprToString (w: Expr) = - let addParens = sprintf "(%s)" - let sanitize (s: string) = if s.Contains(" ") then sprintf "'%s'" s else s - - match w with - | And [] -> None - | Or [] -> None - | And l -> - match l |> List.map exprToString |> List.choose id with - | [] -> None - | [x] -> Some x - | xs -> Some (xs |> List.map addParens |> String.concat " and ") - | Or l -> - match l |> List.map exprToString |> List.choose id with - | [] -> None - | [x] -> Some x - | xs -> Some (xs |> List.map addParens |> String.concat " or ") - | CatEqual v -> Some (sprintf "cat==%s" (sanitize v)) - | CatNotEqual v -> Some (sprintf "cat != %s" (sanitize v)) - -let parseCmdArgs (args: string list) = - match args with - | [a; b] -> { IncludeCategories = Some a; ExcludeCategories = Some b } - | xs -> failwithf "Invalid arguments %A" xs - -let main args = - args - |> parseCmdArgs - |> toWhereExpr - |> exprToString - |> function None -> "" | Some s -> s - |> printfn "%s" - -let rec getScriptArgs l = - match l with - | [] -> [] - | "--" :: rest -> rest - | _ :: tail -> getScriptArgs tail - -try - Environment.GetCommandLineArgs() - |> List.ofArray - |> getScriptArgs - |> main - exit 0 -with e -> - printfn "%s" e.Message - exit 1 diff --git a/tests/RunTests.cmd b/tests/RunTests.cmd index 4fdeae1f792..b61ef835088 100644 --- a/tests/RunTests.cmd +++ b/tests/RunTests.cmd @@ -9,12 +9,6 @@ goto :USAGE :FLAVOR_OK set NUNITPATH=%~dp0fsharpqa\testenv\bin\nunit\ -if not exist "%~dp0..\packages\NUnit.Console.3.0.0\tools\" ( - pushd %~dp0 - ..\.nuget\nuget.exe restore ..\packages.config -PackagesDirectory ..\packages - call buildtesttools.cmd %FLAVOR% - popd -) SET NUNIT3_CONSOLE=%~dp0..\packages\NUnit.Console.3.0.0\tools\nunit3-console.exe SET FSI_TOOL=%~dp0..\%FLAVOR%\net40\bin\Fsi.exe @@ -25,39 +19,13 @@ if not exist "%link_exe%" ( goto :FINISHED ) -rem "ttags" indicates what test areas will be run, based on the tags in the test.lst files -set TTAGS_ARG= -SET TTAGS= -set _tmp=%3 -if not '%_tmp%' == '' ( - set TTAGS_ARG=-ttags:%_tmp:"=% - set TTAGS=%_tmp:"=% -) -if /I '%_tmp%' == 'coreclr' ( - set single_threaded=true - set permutations=FSC_CORECLR -) - -rem "nottags" indicates which test areas/test cases will NOT be run, based on the tags in the test.lst and env.lst files -set NO_TTAGS_ARG=-nottags:NOOPEN -set NO_TTAGS=NOOPEN -set _tmp=%4 -if not '%_tmp%' == '' ( - set NO_TTAGS_ARG=-nottags:NOOPEN,%_tmp:"=% - set NO_TTAGS=NOOPEN,%_tmp:"=% -) - -if /I "%APPVEYOR_CI%" == "1" ( - set NO_TTAGS_ARG=%NO_TTAGS_ARG%,NO_CI - set NO_TTAGS=%NO_TTAGS%,NO_CI -) if /I not '%single_threaded%' == 'true' (set PARALLEL_ARG=-procs:%NUMBER_OF_PROCESSORS%) else set PARALLEL_ARG=-procs:0 rem This can be set to 1 to reduce the number of permutations used and avoid some of the extra-time-consuming tests if "%SKIP_EXPENSIVE_TESTS%" == "1" ( - set NO_TTAGS_ARG=%NO_TTAGS_ARG%,Expensive - set NO_TTAGS=%NO_TTAGS%,Expensive + set EXCLUDE_ARG_NUNIT=--where "cat != Expensive" + set EXCLUDE_ARG_RUNALL=-nottags:Expensive ) rem Set this to 1 in order to use an external compiler host process @@ -73,71 +41,30 @@ rem folder where test logs/results will be dropped set RESULTSDIR=%~dp0TestResults if not exist "%RESULTSDIR%" (mkdir "%RESULTSDIR%") -setlocal EnableDelayedExpansion - -SET CONV_V2_TO_V3_CMD="%FSI_TOOL%" --exec --nologo "%~dp0Convert-NUnit2Args-to-NUnit3Where.fsx" -- "!TTAGS!" "!NO_TTAGS!" -echo %CONV_V2_TO_V3_CMD% +if /I "%2" == "net40-fsharp-suite" (goto :NET40_FSHARP_SUITE) -SET CONV_V2_TO_V3_CMD_TEMPFILE=%~dp0nunit3args.txt +if /I "%2" == "coreclr-fsharp-suite" (goto :CORECLR_FSHARP_SUITE) -%CONV_V2_TO_V3_CMD% >%CONV_V2_TO_V3_CMD_TEMPFILE% +if /I "%2" == "net40-fsharpqa-suite" (goto :NET40_FSHARPQA_SUITE) -IF ERRORLEVEL 1 ( - echo Error converting args to nunit 3 test selection language, the nunit3-console --where argument - type "%CONV_V2_TO_V3_CMD_TEMPFILE%" - del /Q "%CONV_V2_TO_V3_CMD_TEMPFILE%" - exit /b 1 -) +if /I "%2" == "net40-fsharpqa-suite-downtarget" (goto :NET40_FSHARPQA_SUITE) -set /p TTAGS_NUNIT_WHERE=<%CONV_V2_TO_V3_CMD_TEMPFILE% -if not '!TTAGS_NUNIT_WHERE!' == '' (set TTAGS_NUNIT_WHERE=--where "!TTAGS_NUNIT_WHERE!") - -del /Q "%CONV_V2_TO_V3_CMD_TEMPFILE%" - -setlocal DisableDelayedExpansion - -if /I "%2" == "fsharp" (goto :FSHARP) -if /I "%2" == "fsharpqa" (goto :FSHARPQA) -if /I "%2" == "fsharpqadowntarget" (goto :FSHARPQA) -if /I "%2" == "fsharpqaredirect" (goto :FSHARPQA) -if /I "%2" == "compilerunit" ( +if /I "%2" == "net40-compilerunit-suite" ( set compilerunitsuffix=net40 - goto :COMPILERUNIT -) - -if /I "%2" == "coreunitall" ( - goto :COREUNITALL + goto :COMPILERUNIT_SUITE ) -if /I "%2" == "coreunitportable" ( - goto :COREUNITPORTABLE +if /I "%2" == "portable-coreunit-suite" ( + goto :PORTABLE_COREUNIT_SUITE ) -if /I "%2" == "coreunit" ( - set coreunitsuffix=net40 - goto :COREUNIT -) -if /I "%2" == "coreunitportable47" ( - set coreunitsuffix=portable47 - goto :COREUNIT -) -if /I "%2" == "coreunitportable7" ( - set coreunitsuffix=portable7 - goto :COREUNIT -) -if /I "%2" == "coreunitportable78" ( - set coreunitsuffix=portable78 - goto :COREUNIT -) -if /I "%2" == "coreunitportable259" ( - set coreunitsuffix=portable259 - goto :COREUNIT +if /I "%2" == "net40-coreunit-suite" ( + goto :NET40_COREUNIT_SUITE ) -if /I "%2" == "coreunitcoreclr" ( - set coreunitsuffix=coreclr - goto :COREUNIT_CORECLR +if /I "%2" == "coreclr-coreunit-suite" ( + goto :CORECLR_COREUNIT_SUITE ) -if /I "%2" == "ideunit" (goto :IDEUNIT) +if /I "%2" == "vs-ideunit-suite" (goto :VS_IDEUNIT_SUITE) REM ---------------------------------------------------------------------------- @@ -145,29 +72,43 @@ REM ---------------------------------------------------------------------------- echo Usage: echo. -echo RunTests.cmd ^ ^ [TagToRun^|"Tags,To,Run"] [TagNotToRun^|"Tags,Not,To,Run"] +echo RunTests.cmd ^ ^<...suite....^> [TagToRun^|"Tags,To,Run"] [TagNotToRun^|"Tags,Not,To,Run"] echo. exit /b 1 REM ---------------------------------------------------------------------------- -:FSHARP +:NET40_FSHARP_SUITE -set FSHARP_TEST_SUITE_CONFIGURATION=%FLAVOR% +set XMLFILE=%RESULTSDIR%\net40-fsharp-suite-results.xml +set OUTPUTFILE=%RESULTSDIR%\net40-fsharp-suite-output.log +set ERRORFILE=%RESULTSDIR%\net40-fsharp-suite-errors.log -set XMLFILE=%RESULTSDIR%\FSharpNunit_Xml.xml -set OUTPUTFILE=%RESULTSDIR%\FSharpNunit_Output.log -set ERRORFILE=%RESULTSDIR%\FSharpNunit_Error.log +echo "%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\..\..\net40\bin\FSharp.Tests.FSharp.dll" --framework:V4.0 %EXCLUDE_ARG_NUNIT% --work:"%FSCBINPATH%" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --result:"%XMLFILE%;format=nunit2" +"%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\..\..\net40\bin\FSharp.Tests.FSharp.dll" --framework:V4.0 %EXCLUDE_ARG_NUNIT% --work:"%FSCBINPATH%" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --result:"%XMLFILE%;format=nunit2" -echo "%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\..\..\net40\bin\FSharp.Tests.FSharp.dll" --framework:V4.0 %TTAGS_NUNIT_WHERE% --work:"%FSCBINPATH%" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --result:"%XMLFILE%;format=nunit2" -"%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\..\..\net40\bin\FSharp.Tests.FSharp.dll" --framework:V4.0 %TTAGS_NUNIT_WHERE% --work:"%FSCBINPATH%" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --result:"%XMLFILE%;format=nunit2" +call :UPLOAD_TEST_RESULTS "%XMLFILE%" "%OUTPUTFILE%" "%ERRORFILE%" +goto :EOF + +REM ---------------------------------------------------------------------------- + +:CORECLR_FSHARP_SUITE + +set single_threaded=true +set permutations=FSC_CORECLR +set XMLFILE=%RESULTSDIR%\coreclr-fsharp-suite-results.xml +set OUTPUTFILE=%RESULTSDIR%\coreclr-fsharp-suite-output.log +set ERRORFILE=%RESULTSDIR%\coreclr-fsharp-suite-errors.log + +echo "%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\..\..\coreclr\bin\FSharp.Tests.FSharp.dll" --framework:V4.0 %EXCLUDE_ARG_NUNIT% --work:"%FSCBINPATH%" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --result:"%XMLFILE%;format=nunit2" +"%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\..\..\coreclr\bin\FSharp.Tests.FSharp.dll" --framework:V4.0 %EXCLUDE_ARG_NUNIT% --work:"%FSCBINPATH%" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --result:"%XMLFILE%;format=nunit2" call :UPLOAD_TEST_RESULTS "%XMLFILE%" "%OUTPUTFILE%" "%ERRORFILE%" goto :EOF REM ---------------------------------------------------------------------------- -:FSHARPQA +:NET40_FSHARPQA_SUITE set OSARCH=%PROCESSOR_ARCHITECTURE% set X86_PROGRAMFILES=%ProgramFiles% @@ -225,28 +166,16 @@ set FSCOREDLLVPREVPATH=%FSCOREDLLVPREVPATH%\FSharp.Core.dll for /d %%i in (%WINDIR%\Microsoft.NET\Framework\v4.0.?????) do set CORDIR=%%i set PATH=%PATH%;%CORDIR% -if not exist %WINDIR%\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll set NO_TTAGS_ARG=%NO_TTAGS_ARG%,Req20 - -set RESULTFILE=FSharpQA_Results.log -set FAILFILE=FSharpQA_Failures.log -set FAILENV=FSharpQA_Failures +set RESULTFILE=net40-fsharpqa-suite-results.log +set FAILFILE=net40-fsharpqa-suite-errors.log +set FAILENV=net40-fsharpqa-suite-errors -if /I "%2" == "fsharpqadowntarget" ( +if /I "%2" == "net40-fsharpqa-suite-downtarget" ( set ISCFLAGS=--noframework -r "%FSCOREDLLVPREVPATH%" -r "%X86_PROGRAMFILES%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll" -r System.dll -r System.Runtime.dll -r System.Xml.dll -r System.Data.dll -r System.Web.dll -r System.Core.dll -r System.Numerics.dll - set NO_TTAGS_ARG=%NO_TTAGS_ARG%,NoCrossVer,FSI - set RESULTFILE=FSharpQADownTarget_Results.log - set FAILFILE=FSharpQADownTarget_Failures.log - set FAILENV=FSharpQADownTarget_Failures -) - -if /I "%2" == "fsharpqaredirect" ( - set ISCFLAGS=--noframework -r "%FSCOREDLLVPREVPATH%" -r "%X86_PROGRAMFILES%\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll" -r System.dll -r System.Runtime.dll -r System.Xml.dll -r System.Data.dll -r System.Web.dll -r System.Core.dll -r System.Numerics.dll - set PLATFORM=%OSARCH% - set SIMULATOR_PIPE="%~dp0fsharpqa\testenv\bin\$PLATFORM\ExecAssembly.exe" - set NO_TTAGS_ARG=%NO_TTAGS_ARG%,NoCrossVer,FSI - set RESULTFILE=FSharpQARedirect_Results.log - set FAILFILE=FSharpQARedirect_Failures.log - set FAILENV=FSharpQARedirect_Failures + set EXCLUDE_ARG_RUNALL=%EXCLUDE_ARG_RUNALL%,NoCrossVer,FSI + set RESULTFILE=net40-fsharpqa-downtarget-suite-results.log + set FAILFILE=net40-fsharpqa-downtarget-suite-errors.log + set FAILENV=net40-fsharpqa-downtarget-suite-errors ) where.exe perl > NUL 2> NUL @@ -256,43 +185,33 @@ if errorlevel 1 ( ) pushd %~dp0fsharpqa\source -echo perl %~dp0fsharpqa\testenv\bin\runall.pl -resultsroot %RESULTSDIR% -results %RESULTFILE% -log %FAILFILE% -fail %FAILENV% -cleanup:no %TTAGS_ARG% %NO_TTAGS_ARG% %PARALLEL_ARG% - perl %~dp0fsharpqa\testenv\bin\runall.pl -resultsroot %RESULTSDIR% -results %RESULTFILE% -log %FAILFILE% -fail %FAILENV% -cleanup:no %TTAGS_ARG% %NO_TTAGS_ARG% %PARALLEL_ARG% +echo perl %~dp0fsharpqa\testenv\bin\runall.pl -resultsroot %RESULTSDIR% -results %RESULTFILE% -log %FAILFILE% -fail %FAILENV% -cleanup:no %INCLUDE_ARG_RUNALL% %EXCLUDE_ARG_RUNALL% %PARALLEL_ARG% + perl %~dp0fsharpqa\testenv\bin\runall.pl -resultsroot %RESULTSDIR% -results %RESULTFILE% -log %FAILFILE% -fail %FAILENV% -cleanup:no %INCLUDE_ARG_RUNALL% %EXCLUDE_ARG_RUNALL% %PARALLEL_ARG% popd goto :EOF REM ---------------------------------------------------------------------------- -:COREUNIT +:NET40_COREUNIT_SUITE -set XMLFILE=%RESULTSDIR%\CoreUnit_%coreunitsuffix%_Xml.xml -set OUTPUTFILE=%RESULTSDIR%\CoreUnit_%coreunitsuffix%_Output.log -set ERRORFILE=%RESULTSDIR%\CoreUnit_%coreunitsuffix%_Error.log +set XMLFILE=%RESULTSDIR%\net40-coreunit-suite-results.xml +set OUTPUTFILE=%RESULTSDIR%\net40-coreunit-suite-output.log +set ERRORFILE=%RESULTSDIR%\net40-coreunit-suite-errors.log -echo "%NUNIT3_CONSOLE%" --verbose --framework:V4.0 %TTAGS_NUNIT_WHERE% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\%coreunitsuffix%\bin\FSharp.Core.Unittests.dll" - "%NUNIT3_CONSOLE%" --verbose --framework:V4.0 %TTAGS_NUNIT_WHERE% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\%coreunitsuffix%\bin\FSharp.Core.Unittests.dll" +echo "%NUNIT3_CONSOLE%" --verbose --framework:V4.0 %EXCLUDE_ARG_NUNIT% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\net40\bin\FSharp.Core.Unittests.dll" + "%NUNIT3_CONSOLE%" --verbose --framework:V4.0 %EXCLUDE_ARG_NUNIT% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\net40\bin\FSharp.Core.Unittests.dll" call :UPLOAD_TEST_RESULTS "%XMLFILE%" "%OUTPUTFILE%" "%ERRORFILE%" goto :EOF -:COREUNITALL - -set XMLFILE=%RESULTSDIR%\CoreUnit_all_Xml.xml -set OUTPUTFILE=%RESULTSDIR%\CoreUnit_all_Output.log -set ERRORFILE=%RESULTSDIR%\CoreUnit_all_Error.log - -echo "%NUNIT3_CONSOLE%" /framework:V4.0 /result="%XMLFILE%;format=nunit2" /output="%OUTPUTFILE%" /err="%ERRORFILE%" /work="%FSCBINPATH%" "%FSCBINPATH%\..\..\net40\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable7\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable47\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable78\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable259\bin\FSharp.Core.Unittests.dll" - "%NUNIT3_CONSOLE%" /framework:V4.0 /result="%XMLFILE%;format=nunit2" /output="%OUTPUTFILE%" /err="%ERRORFILE%" /work="%FSCBINPATH%" "%FSCBINPATH%\..\..\net40\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable7\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable47\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable78\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable259\bin\FSharp.Core.Unittests.dll" - -call :UPLOAD_TEST_RESULTS "%XMLFILE%" "%OUTPUTFILE%" "%ERRORFILE%" -goto :EOF +REM ---------------------------------------------------------------------------- -:COREUNITPORTABLE +:PORTABLE_COREUNIT_SUITE -set XMLFILE=%RESULTSDIR%\CoreUnit_Portable_Xml.xml -set OUTPUTFILE=%RESULTSDIR%\CoreUnit_Portable_Output.log -set ERRORFILE=%RESULTSDIR%\CoreUnit_Portable_Error.log +set XMLFILE=%RESULTSDIR%\portable-coreunit-suite-results.xml +set OUTPUTFILE=%RESULTSDIR%\portable-coreunit-suite-output.log +set ERRORFILE=%RESULTSDIR%\portable-coreunit-suite-errors.log echo "%NUNIT3_CONSOLE%" /framework:V4.0 /result="%XMLFILE%;format=nunit2" /output="%OUTPUTFILE%" /err="%ERRORFILE%" /work="%FSCBINPATH%" "%FSCBINPATH%\..\..\portable7\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable47\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable78\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable259\bin\FSharp.Core.Unittests.dll" "%NUNIT3_CONSOLE%" /framework:V4.0 /result="%XMLFILE%;format=nunit2" /output="%OUTPUTFILE%" /err="%ERRORFILE%" /work="%FSCBINPATH%" "%FSCBINPATH%\..\..\portable7\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable47\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable78\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable259\bin\FSharp.Core.Unittests.dll" @@ -300,15 +219,17 @@ echo "%NUNIT3_CONSOLE%" /framework:V4.0 /result="%XMLFILE%;format=nunit2" /outpu call :UPLOAD_TEST_RESULTS "%XMLFILE%" "%OUTPUTFILE%" "%ERRORFILE%" goto :EOF -:COREUNIT_CORECLR +REM ---------------------------------------------------------------------------- + +:CORECLR_COREUNIT_SUITE -set XMLFILE=CoreUnit_%coreunitsuffix%_Xml.xml -set OUTPUTFILE=CoreUnit_%coreunitsuffix%_Output.log -set ERRORFILE=CoreUnit_%coreunitsuffix%_Error.log +set XMLFILE=coreclr-coreunit-suite-results.xml +set OUTPUTFILE=coreclr-coreunit-suite-output.log +set ERRORFILE=coreclr-coreunit-suite-errors.log set testbinpath=%~dp0testbin\ -set architecturepath=\coreclr\win7-x64 -set CORERUNPATH="%testbinpath%%flavor%%architecturepath%" +set architecturepath=coreclr\win7-x64 +set CORERUNPATH="%testbinpath%%flavor%\%architecturepath%" echo "%CORERUNPATH%\corerun.exe" "%testbinpath%%flavor%\coreclr\fsharp.core.unittests\FSharp.Core.Unittests.exe" "%CORERUNPATH%\corerun.exe" "%testbinpath%%flavor%\coreclr\fsharp.core.unittests\FSharp.Core.Unittests.exe" @@ -318,29 +239,29 @@ goto :EOF REM ---------------------------------------------------------------------------- -:COMPILERUNIT +:COMPILERUNIT_SUITE -set XMLFILE=%RESULTSDIR%\CompilerUnit_%compilerunitsuffix%_Xml.xml -set OUTPUTFILE=%RESULTSDIR%\CompilerUnit_%compilerunitsuffix%_Output.log -set ERRORFILE=%RESULTSDIR%\CompilerUnit_%compilerunitsuffix%_Error.log +set XMLFILE=%RESULTSDIR%\%compilerunitsuffix%-compilerunit-suite-results.xml +set OUTPUTFILE=%RESULTSDIR%\%compilerunitsuffix%-compilerunit-suite-output.log +set ERRORFILE=%RESULTSDIR%\%compilerunitsuffix%-compilerunit-suite-errors.log -echo "%NUNIT3_CONSOLE%" --verbose --framework:V4.0 %TTAGS_NUNIT_WHERE% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\%compilerunitsuffix%\bin\FSharp.Compiler.Unittests.dll" - "%NUNIT3_CONSOLE%" --verbose --framework:V4.0 %TTAGS_NUNIT_WHERE% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\%compilerunitsuffix%\bin\FSharp.Compiler.Unittests.dll" +echo "%NUNIT3_CONSOLE%" --verbose --framework:V4.0 %EXCLUDE_ARG_NUNIT% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\%compilerunitsuffix%\bin\FSharp.Compiler.Unittests.dll" + "%NUNIT3_CONSOLE%" --verbose --framework:V4.0 %EXCLUDE_ARG_NUNIT% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\%compilerunitsuffix%\bin\FSharp.Compiler.Unittests.dll" call :UPLOAD_TEST_RESULTS "%XMLFILE%" "%OUTPUTFILE%" "%ERRORFILE%" goto :EOF REM ---------------------------------------------------------------------------- -:IDEUNIT +:VS_IDEUNIT_SUITE -set XMLFILE=%RESULTSDIR%\IDEUnit_Xml.xml -set OUTPUTFILE=%RESULTSDIR%\IDEUnit_Output.log -set ERRORFILE=%RESULTSDIR%\IDEUnit_Error.log +set XMLFILE=%RESULTSDIR%\vs-ideunit-suite-results.xml +set OUTPUTFILE=%RESULTSDIR%\vs-ideunit-suite-output.log +set ERRORFILE=%RESULTSDIR%\vs-ideunit-suite-errors.log pushd %FSCBINPATH% -echo "%NUNIT3_CONSOLE%" --verbose --x86 --framework:V4.0 %TTAGS_NUNIT_WHERE% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" --workers=1 --agents=1 --full "%FSCBINPATH%\VisualFSharp.Unittests.dll" - "%NUNIT3_CONSOLE%" --verbose --x86 --framework:V4.0 %TTAGS_NUNIT_WHERE% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" --workers=1 --agents=1 --full "%FSCBINPATH%\VisualFSharp.Unittests.dll" +echo "%NUNIT3_CONSOLE%" --verbose --x86 --framework:V4.0 %EXCLUDE_ARG_NUNIT% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" --workers=1 --agents=1 --full "%FSCBINPATH%\VisualFSharp.Unittests.dll" + "%NUNIT3_CONSOLE%" --verbose --x86 --framework:V4.0 %EXCLUDE_ARG_NUNIT% --result:"%XMLFILE%;format=nunit2" --output:"%OUTPUTFILE%" --err:"%ERRORFILE%" --work:"%FSCBINPATH%" --workers=1 --agents=1 --full "%FSCBINPATH%\VisualFSharp.Unittests.dll" popd call :UPLOAD_TEST_RESULTS "%XMLFILE%" "%OUTPUTFILE%" "%ERRORFILE%" goto :EOF diff --git a/tests/fsharpqa/testenv/bin/System.Reflection.Metadata.dll b/tests/fsharpqa/testenv/bin/System.Reflection.Metadata.dll deleted file mode 100644 index 67c3785946d3fd8183e06efd955178efb5be73f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 432872 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≥ zPJZ|$sLheNb)$CW-ek+od@MKfXt`;RF4A1i3hYqst>>eSC^yTX<=*0)V(a-?DCB3s z+xsnMc0udbF_31;7%2Xek5Q#U=__EUm!aYRW*~$d-Y4QHI=fGT@??#Re!yqBrSP(h zxxV>ftbdf*<5WF-Xb)e4?N*ia($`{zrs;Ova15yN2R6s6aR|2_vx;eUqO!Jm8&Fy# zOy6h_x+`0$PjVZ61Aj7fRLR;yzuDc+R!6JviP-LL%a)E}nvArc(Sy{IZLugneb6 z6hdH5UzEC4j_?dkg0Ka5Ls%${eJ53jg<5`xXc~7vvd-bj8PNDvU$NJ;4iSA#M3WJ_pxKfD%8GQasuY-@C}?@msh`RK{_3Q-_~wWTkSxIXHo(d-j%AlaVb zhi?VOO_V(Iyi5u?2h@ZHRwd>?z=HlBKQN1Awuu5cZ&b>gp%S!lX<9T-ln%tFbz5G7 zqRKNu-BNSBrY{g~`2|0Vj^aX#aJ5vhR<(_AKMzhM#I=ArYKAIDx*s@tq#uO#mWS|z zw?deVBcvyxq}543&pOGdad*aZo}){V4<5z`uj%g|fXZ=RYNHZTN`UoDXDNhXn)75& z&E3nU3XVfDNQdKF-eFN!NKrFP%rC0sRcaFpENX>_9Yt0kqo}x)I;!b&ifaxXA3nZO zDRV|d(l??(!L6Fe2E~fB4QiQdQ23fS%h`tz$!<%)0dl=5ze77V=D1%EOP2EIYI`7gS`LHQ>~@-~ zN^?~cIz_T+!Em-xu{xSQ5H-s!VuL`bgyYCj(-Y^c0qG`U6INm9CJ~>hu_?sBfeh1l z>ZwG(4V!VWY%lbSNXw6?F07k+;Z##A@rwTzA-8`W=fHn$w7jHOo-FO}MWai?eyV<6Q_W0s4?w?L{jw zoo6x*fWt42+K%Cf$z?2-l+er2BY1ft1oje~pBS(9W5F5h_Ds)Frq6WMzYJ46@oz@l zE2YlwIP??ii01^K2gI4L7$4}Pn!PkfbIVxZBywW54PQ~BM8C{Imw;q2py|N=U&tC1oB!rfr9Wy5#nrbJmQ6# z$}!^;U14)DWbKQ(3Wb->#>0+)%TISkt|T6CG+_pgOC$Sj6g+ZOO+*KjgsX9G@Y2~e zk<`YbDjd+8y5JaixhN8U-WU0WphwePASH$iVBbGO4?g^UKA9>P3_;B{{gGB4fcb+Y z)+dGPH9b!9yahwqbnwN4aJnn)mpDh%D{;E1wS9NU+>f@S)|1U=bFS40Gv|d@UaRq6SCX7O%r$a(IOd49yooaM}6T zD2z`nufr9wmyj_FT-O}%tV|Duk@yJUFu&d&5ehbFp2R*0vEEB?f7~V#B zwh5u)5dOssA68)L2#+ifx@XQe_m3|~Fz2d&Q`v0sO}}9q87NJLr>^fV)AdNY1a;KP zc2#-lf(-26CI=1LAeyp|sbITO*Y7L0(LYOh=6f_e&k7Ch*6vC>x3yH#S6(DWQ=C!t>! zB-i&EXcOpN7wk5$TjBc7(dtCB>3Q%{T9n=`NYg`oP3OTTslG*cv`MOO5pFOMto0Xg zjBWuZ4!12{Fr4U~es^+1zk_@xE79-?M$ zV$Hk=eJwBHrgq#2vcQ#SE?`oGRxc7Ps8QE5N zR{v!9)Y~63hl%|7&p*&raFS~_i!wzs3-HT6K;BZ|6!7v>62gT(#dJSIUfvhHiqc^! zgk1qL%@9n;wTyH6F37KQdL{&O`Z>5E$&3bJPN0WnAzvspr;Z16wd1Z!Hecqx-t2{D zXPK2{iQua#@-6dXJhWpLtOv+VgG!%~Ud`t3l9U?43GA=YXpLein&RLaw*M^TO@kfb zh7dv?{;|&jhhyW~-anM6s)A`^_e+VYKGw`Y=N!}nJR1y$+zLB(^qUG+u=!bVYec$`8_C(rEfuj zQ|Z@HydoL1~;~bBF z$)t%K4*s1{-8;Z#nECF=ig+!=3)x=oLWU`GeWy@$vUxd4a;aO;2D|Vb2wVklzoB2r znWXn3^3f08i(H2^-h)zfYGZ9D+_^}aeh&zivpx2J9Wtk|Z1sNg>{4?=CBL~ck{yZZ zC=cc(?6AeCBih(!tTcrwUMe&}JK;Gkk=2Kxp(__e+tg1jAQ)7LnsE|cuvZ^rJoB@-@qLqix&%Sz5(^R`ubO>4)nlUFCt%-+I zQ{+7QN`E}Q%G8QHGixF^^Db5y>oay{O}A*-oVxA9Wm97K_U5*SV=-s^p-AaFv!;Kv z=Nvqv?}?N?Gx7BkCiUrZ_@VgD+4yY%J;>>#qhw|6tk|=XH}vVTEcU+P8h+lFPZTPF z_JD5IH^)SlJ1pP-l?2O(Z@}JyJp^b}H=*HZo&6jB8}s>(_d=U`m!Xxkv+6`r&2;5GQ^muT%4EXX-x=6D~ zTjN><_M4#pZB|#()uhH6lYU`Uacn#%SNsrCq&B8|LPmZP!zO)D%E7M~ zCGicTZLyIIS6l3h;>YER;wWSO$Bd%#K{S46X~NcIG=!1DF_!-f^S>&L1wgcdt;m+I zxoQ98#)3og$`w?Gb+Q(PKI`PmSDcC>*e|mu+=uU1RPR?D?G&lqlhf2ms7QQlA!-|c zSuw(K`Jz*Gp>B7fm#eUStT;TSIM!$35U)pN&&uMkeg?XI5i+Q5>o9%4E*P`oR`5Gc&IoDmLh(LphJL&5Q$n_i$7! z_QwYcqcXf}rnx?@lPoVbmMWZ^vOS0pz#is+2!IR9|F=KWVzUP8=QiKAWD%!hF^o z4q4b+ymWTyjAT`n&&{7lG!}-iPs$6&<-2?A3^jOwgIl}7evEAR+%H;kbm+7GEExxR z>v4q2K{D1J4u~|OKXT+L^rCsOqG)OT%ueC>NGwYDm7T(|;Ys}9!)K*%2jcOOh{tQW zj|($de7LIYKzu0eBIq1}k~Jo(7#yaBM2S(vb=pruW^7K5`f7-k6pCG3I^#c-_EdNH z%a^lBb^HpWH1Jfgr$64w?>?ndwEL9GPQE{-D%Q#G?tV((O^rSSJSOnkp2_49_4z#m6wpjK#-qy^@&x0<8 zr7mr0Me*1$^yGM<&GbPj${XP`B6BqIwA_N*g+$11;ta{BiL+;8iVYcwD2I97A3Sd+Fe|d zpFRZIG3?QwzPSaHO8zaN%H~&)p|@Rf$=Syx7q_soazNR-g`8z@jb`P59t)^-<$#_G zsAA=SUhC$&L|L3^9S8aX{?weZfTgdVmD9D&e^VFbK$q3odo!K8QYU|SJFV)zMbUZ$ zt4VnUD9tZTnU+Qk-;F}}BSOUQD^cd=-a|1t#>)zc)&_F$rvt|%$FVy(_*1jzf}Dio znf@LnjAuH3L;?d%?}M)EQ8_Vtkc~fNlY3FFncahWn~lCE-mTtApj+?UupwsUNB~jI=di4-5U+=|Gqi*? z$qqQjhRU?8`DHt{gELOGKQp0*##*u z7EDZSOoaBw*9Sj^T4_$zB?8LRMkgezwvmS9HGKxALTN2AS<}*FKl*%Q(fX13WyebK z`hgt@-DRb-V|8KX4IQ%1wXNCtAXBXMh45Tcto4QP0@IzYyuVc5Z)jz!OKFe|FQs+V z%0^kbgu_HD+hHZX;P@f>RhC~x4PHaY?#C3I;7elD=O~ekSDsvxj)RXhCE+*y18IFZ z(H>IbH{qoad_y(E%wE%%%*8dEZnT}_ze@WE%CNG26ox@vr>a5vT*z#>mDeo4TXr!Q zgm4YIjn|;BAf`{>mahStkYO_YLD@yX7yaMm8426E~LK&x$J=S zcL3aqr4NGvSaSFtQ4cRqU}Zb|1CuDP6XZ2X`Iy}FBYy1tdsx;oPmnaSCvfH4#gARU z{F#4(kc=+jQ;6!cqD`95Bz`uRY4K=!Dz2u&S6j@>WQ^PQ@AJ|>i2z>rJ-J6ZF;7pj zYJeZj>5<$uoh%9aosc!RB=ce=o(S7Dw8^Z8aCQp)ApQ!=er}l$Wu`JQ!?Zfg+3^}A z<9L%2kie~XmI2()Nxg^7&dks2zGhKAw;m>WC2ONRZQzoaJZ(@uEQyIUuF_GVEZ31T z2OkLy*=L2iUUnSxpbc+ny{tFxGb^zEA{ntZR*JAl`?u?4abM;ebB1e(}$6KOVph#a-LbWEw+{-?9m$ zc|LaK@X1Ro{R^U@SYwxhaBM~w+{g@hko6pq?+)~Z4y-pPFtLNv8YBJ;5s16!7$)2a zKY|xUwC?m<%JhxbWI|}VP3Xdj8HrG;E)tsKqii$Widm@I3snY%E==zNqr&=nl#hpP zY-80ZA6jm)SG}EE9`1&BOL*Jnw_EM?nlPtK)VvYxvk`=WT}bL>x?%{_jz#5{xICmw@81W++?&N z0s&F{{~7;Scs9Ss|IheOCEgqfUaxyr48+@Z;BVT1(%axW2x9M4dJam|G`Ik7U(E#v zTK%zP9E}$!`6c7_A@?DILWo$KAY;x z@D3+fr1R7#u~k8uYNDzn)zS(pxMD_cX8D8gaSXF{$`-S8z=1tCHHqey?pXZAO%7JS zvnL`M!+bNK@_qzPVmy*PnGnjh5U{=G6v0ULR6##`8juDvy=fSlK6a*^5BaTGCe+F` zy=5aBXeCxQvkRCj)HDcu*@X;u%eIma`w1?hQSgAoIkuoN%Ab<(Z2~aX%c>JuG@iK- zt**WkS~ych7Pj5tI|M<@hJ{ZwmSX%-r8ZN}7-&B+gUUd0(wD%RB@*EdxC;==E`m%Z zvFF;V!5FA}K~HAg%qNGG1CO#x{LC`gmhzjbP*`bdm3*efI*me%GB0DHgUE75U;`Tj z6>$JrB9Ypbl?b<7MK!E@i+(HGo0(zB)qXE5xR4jHADLR`|^}4%YI-W zlKmb)%SdlpVJ&+}Eh9_LGC9{AmXUM*qhc8utYv+zWg<31sm?Nz#4-k8nE)+&k(Ob* zV9>9BLOS~OKLKpWjONs1ABGfNm@?#X3P=(K3_yVZ6}&+Oy97nwgjAIH7XrICw#`Y= zNpHHs7X2M9I@5Bx4`nAp(aAagZYeq$Y|+tg#4?g_q$7BoWh9AZ48Sr0TJ|dxRUxWFsuXE?hJ0eij)n3VPrjAZ)?`q^^9Xto~^^U zN(88fnA39)_mn~pso0i`U#Ev8(Zc}r2vAQ2_1qljsb@Y$&TL+*e zjCQbued2Dk)>EaAks;wr>*Yir+q}EuglT5ygYFc*xQw7^_C<3N3rsj)+EFunpR*_y zAA;KmF(H=}OVhA4_9^<+!JL-rP~dzfmWL~+(V=~d;UAW4Xb1L~6sxq7%WhT6;hw?H zJ)EG9Ko(TPNCK;26ap+fF<1C!Z8ebUWytKRfh4I022c$GtcKy#vo@&i(aagi?m(a( z991uRh&es$tsYYGs2jgd4@shj0q7B+o*k&?); z%uWwUqK5(K5ul!3sOPpo&p76cWOpS{&u$1%4>70bd#i_3FGFUhha}O%0Q3k@&v@#& zoqA^BR&Fv5Xv*%+?DNOtcT@K}n8J0mop6tSn%u`RIXxYWd`{!dm*|m*VnK68LmbU@ z6#h@ZKUa{jEziJP=4~6sU7zWV|55Ak<6&?8rta8xhx5m9@Eix>m=(AH0@Kgn#<(RO zg-JAK)bIawmeZJJK4vuOQiSsIoz*^{)gbJ1!JZ%AQuYSP-jT~0%w^{#usoipvFjGI zQz@Fr_3g7$vfBlM>(Cy4o<2%d~>b&R{RH!s_K)*U4$Rpd;3f7 zL{aQ3i`b!@n8z3SGOS6oJHaK=y5^{!RC)%gZD6~Gw=!swdmxt=?%q<*#;_+N-Ln%2 zsq9`9$oWIuYzw!aE^U+ExHfy2oFG)2pE}$ zJuI6O2bB2LA7SlFMAt%ev7erfj7hJnhvm&F2*zr<#_>5^KbkWe%P$$)of_QLOHTz4 zwxXn`5hGP~nBGX4)T(*VoNiPW9Jz^1)?7)LA$hQkMcsgdZG^+en=W{KP#lg)R-8B! zPm{G}Sm3zQ$~!`N<(?7_O~8-3UANnu=d;f@nK~;+dCImR$2cD9Dv)muZe|nK_S0+8 z%dppQ70pV^WCbmdHO3Z5T=D?gC>~cyVO$Gj%BJp;bV|rekHTen+1St}1nF+6A zUm@O3Pjg*whL^^wxIaS@vt*Mt88WBB{&{GVc;~hY9#JIld1PYJmlglg8HG_BD8fD> z-O&||%M*gZ+~w7dG89|6uvw}wUOJ;Fmf94?X1%z=%$h%_9Qg``NKA*Y#D(eI5iqp% zIT}>kGK=Bo86F+V90m-_?+iwdkSKp8dYVM}E77AR%3q1DkSKp=NI5+@mrLq9^R%S# zcLv@*=-Iho{xb-t(`e6~y%;-E7l^66$0*o~6g)Yiza%?+rRzI@J;Ap@2qeZRDJ z4lZcjvyvk-4dj|+bHjGQc4$04z^7-!RR^J;GI2g`2XL7sExk8pMlDa{a>h zhM2|YBl!%1;xP^cdYB&vaN?TGkjl%GlHr#jhAv5Q?4$s;T;h_i*mCtgY$VEp)mU2= zUH@iTbL-zyq(oIT)zX9}!1Zsud>+oS7_#PlGFx-*(G&J31wO<3jBLtsf40>5j11Oi z`-#saM+SR-HuD*F;)JVqfzOyI=eyy<KnMwSK{FsBo61ieIwr{em|N1Ha&v zK^Yb#mt2}P<;SeBemM3wktq4miTNY7G>_~h*NKEW1) zz$Zr|7_^m~Psq^DCz2y`49FdQG6yvA2@~f(B0eE4jXPRDI}0KBgxSR>Du?On6Nd0$ zM}D1v%<7y^D1bg8cJ#>t@d-t$Pgs_mPehgYVx`ed3H(pS{8$AXTb z?KlA54$ud>Em%fMWapC93)d_x37CbVlcef#c)SU0^1;*;G*!IKb_@g{1HfxK3+{bUepaAX*>G+oc@8y+7?{tUA= zt;ba}36jXkP()J##utLb2wK0W&xrQSi6G(C+LlK-T2eH=QI21kPmG05{(1AswW&My z<9H#_YqcjKHzZo|xD6~#g+dTDs<{XRy!<2w`-S9pM&&)t=i+&hJAOl`vYQ9{t?)^D z$kAAOFO-CDPIZD1RBdM~i-;FTyD)mdf?~iX%x-+kEjN-rpY+AeH;Y+EVX10Bs`({EU{Ld~>v#wVcVSk}$!%TK zjdcC%?T$TsC0BNu@+`{JkY8iCcwUmeoP|IK;O3qd^lBQ@orcoz%0vkDJ8trXad>r2 zd|im&Q-;+JsjVMUKXiMNBIY>!{<*<36$`M(Yj@9-6=VK2`K0FA#~39-hFnbd^=3atb5JynX zs~~cGD#t(CHvUe%KvOYMG^e0>mp;SL(%C_Xn;Dcg>u6(E|BZ9o$U4aizL@1pnB9c}gC(2MVAsH<7~g8HDV8D+iE)l9TB-}HC&_NudQBJ^r0r#M=@ z4fQlb;Ym$xy33fmLj~rat{lGU=TcvRCuv_l(;Zvv$=B8F;VgK}g&LhLC!m!qKAR<< zhrA4RH8n2=HF&i1#vV2_(1h?*_WP#|EHEq8<0A_K-}f|UIO|`q95)X04eC-vprpTQyW`R@%G+ z&90LI$u}b}d(XCJ<0U~&FSC-jHKj;p?bn(Gmao?IcNRQm%i)`Yv9(L}Uhk~>5IU6h zGJ2?nraq~mf#&G5)B@j>y%n_ftjk*gZJOg)N4wO~4tJr+F7?5v=ICT@j~Cb;dRU^s zO8G5nhVtsnyXXshp3cxaeKh2ot8HH247^eKYR#vw2Oi(YmG`^lfmJ`b-WVLhEvr+t;b425js*S#s?aEs%DESJ%xFT!+wOY)_gC%I!kA?`q987e{+2 zJ2EM+LX&K5e?47QYAUI{28K%vb;-w5p4i9EPcUU(lr#F)bK_mFIBtg;1i7a-{h|DBs-`@U)n+0?JwC zD2vUIf;i;Fu+xch+RS28hf_nkm@jS$a-D02gMvPfQjljZ&g$Jsc-Gt;@LUE8<=oUQ zkh2nRhm*3QGipgBx8dv-%9)O9lghaTr(%%j7sqo4DCB85DB!uvOfQImXXzb*pWK=fA4b#}qW zqHFGjN@+0X74-Ai>dLH~2D7wakVoy<=3#SPQqU}v`yJ(qf>VWpQ}-;-l?C&>YtbR^ zwG^DyT#)rx7t6*d&sl^rol)0ds>#>%P zgnu;Gd{9^y)6ok8%6VeXOFfj*W)^rCi=3%D2Xb1yD}`r=sR7SYOS#ZdF7no>oGAg% z#opaQNjRR%yvKy{fa6)=trJQ=N4eU2Qz(;MuHSke3+0cK0?F5T-wEYojPNW)n_1p*4sVoDZg7;ly#}E~CI`Ci^(F~rs%udX zcr%5vucJKV9Ve749OY5(bfLW9?D?a&SSa0Gxt{Qr3uTzo^;hqDp-ga;zj?O{WsZ}) z&U;8G)lSay-jhN($x&YNUJ=SyPR^^|dqVlnQC{=@A(V1g_Sd~|m|mUaY<|Nl5y~Zw zvfir*vyF{?P5skgHh8tdv-@>{$2NFFgmOKuj9OnCz3qiEd#8Z%wl_v73((({=RI$d zP~QC}pnT$;5oW(Q)wRq|y>oF0b{VJSyl8rVD_bdThEz-g}vJtVpKa)Op?h^5TH+*B!bp(ljr>iYxA zu+S?)ss1^jj0kNM%F%F%<{A}xPbd#N%IMH1LV4pi0nd)1FNE@wql^iCCzN-88}N(^ z{VbF}I!Z$*6k!|N%}L%P6cFN)3*~snvwx_kP_A-3lS6%k5^+4! zLj8sE;WdFh(?f%V^02eHF;puQ-%)0S>V>lOtsvI{p;1Cv=qLw;b`Z)ymuqHdj8OJ) zltV+i3FRC|IV`kigrjklt&0Y8cxYcxjM>T6=@Fsn5%#a++{k|(DD>D5ZUi_l)F_mF zFxS%hIzM#0P#$po>w-|TP_}iHi$bT1uDMRv^3XX#`F4cLnQJb!l&2l#3ZZl{2ibnw zV6L`2$qhlSk3-#kTDXsEW1oS-Yvn_CD^G*@JhZLPvS$_rlrKURlB?CV)lhh_P=2~f zdD?J4x|>iY;M%7pjfN)(rRj=*ClTIPC@(lUh2bee8NOq{QxrZxC=WWG&f!CZ(%W6} zyM&Jv%5Sa=a&-+KCpLG+ypGx%Oth4QhZq{CMWWq&8RD!fuCS=U->!)t^x z#a#!7hVK^2GIzZg7XE`!_H~qz;dMee%E=iWep4vdIi8)u9}DF~CwXl6JE7FMactLc zILa3Onrn6A!-*(cOBYuc6D{QdH}X#k5Hyg%a8?;Asq( zi>{NNSIS&-KzN|=jBs^&u%#UObC7E$PTHrgDre8E@aQOKUy(PIr@PefVcZ{~q*praSxb4t=9+8H0EN09wJoa6oM(AXb^cirK0xHeo#bVpFxRh+ z3~avBQhszc-yJ?ocuv9Hr1q5Gg>h;&a?N+W;J)xep~8dFy@UUubvNv zFBG1kzf($^c@z|u>qW=&Sa>-oUCc9gDo=y?lcm(5zf(?wNkoz{&bq(t7En4zy2N-_ z(i3xI^0b+*k>VKTwB8l)bc^(i(dHNK33yVG{zCc0QF=s%2qiov;OQ0FGsgOA#{H>k z?;Y7+B!BKK>>W8?C0h&IOnKyFp{#Y1`$ZNBrNNcGe`K*xHo05_BIgNZXP0YWWT{X- zak;jOEEmc%j*^aCCY1XeWl&^=P#$-3DkE15rMu&)inIykKu4*L+$59=N2!Ud70O0u zVQu7gpED%CN}GLOIq+ z9v=BlD1UeMjEMXwlxml2WaMX|oZ)hfiiF~AD?M2sF7!#Cd5h%=6<|t=a%F&n`E6*8`Jw(newq?#WXGK~?&Mxl; zJokgba$R|tQs$aJTb^mB20Wiw%1x&QlrJNTL{5|A`7v^)P}V!1l)qRgZ#$lC{d0wK zh2t6E|0>R2dGsABxy@Aj=L=;QN2&F%5XvM+8R}mvlp`Fa&c9A1r<~+^f0a@{+4pZ%K_zFOF7TwIv*6agl5cy)$_|Ne}S<2b2c7F746`reHDSiUQU~co+xFA<3dK+v;J1hw(@#v$H zYZsTRbM!Is*il%ipsqGk7X5=zPF@>OdRa>6TLa2~=wF2A1IJSn{hLs3xGmrr9er6S z1&(J-^fjS8=y=9Q*9&D^$Fq0zEulQ;cp9T03gro>{ov@wLRsx7M@ByrNOQM~Ga-E}G740UJeVv?@ z(H=tC#g$@pw3krcca*i!K0-Oc$+(fxq?6n;HbW@Kxm<%{hYDql%QZN5 zm{5*#*4B-P%g&RQ+c|^pH8%5gnV;Rjw%VISJSD zmxOXWW@x0G8|fZ@T_{)BTqi|JvY9ubLz3*LaqF=*vqQX2c)T@% zoSov>odrKn!~9t#?;FQ11?1Wx98f04vB3wF6P&Ke@g|Y;h^wz@@%i8}rlvDySNLl% z)8h-1A>`Vs(h~obP-0ym41aCr^!SowsJsid z9x6|R$%0aZTs>Y@3f7TqA z9Vp+$U+6&jXZ-aJluhxsI#9gChaD(>;o~?{F(>qaC*uIu45YwP{fs#)2>p-baq=oV##!UXTnIVbV4m=|g z!#Yq#Cq{Rm?3@_efifUa%~6)t#|LlOreC?(8QiemhvrDx0Ev7 zQa*5$gDvH1M>*6|c6V})u$0cYFHkwNEafkbXLgXw$vM_i?sk;pEagB)X|j|NPR@yz z@`~d*#ZsPkJf~U8JXiL4mU5)ynQtl2Ii7`<@{p5!hNXCpa+am+? zls>KoZ?cqgo#eHa@>@r_%Tg|O_WaIL?sYu(TFMPh*L{}K)lnX_lpZeE!ZFU#!^A;*J*2kbF6RHI!ku9P(cXyNO|xV_R!K{Y$^}1AQ*)p4ih@?1nmI zd@c5W5qCgK=$Du88SGXY2>M~Lm-x|viv6IU@xxIM#5DXe5cOJy`mF@E;Vz&O^zG4R zslTt_#MU#L7@yeMB=tYBwYSA_g5{<+R$*)F%gyeh0RXdwt*RK%oWbsmTDaL0FRNTelFP8q9jjytJx23PQ zSY_q>)u!)bp>N$-Vn z5HGG(ya{xskCuAQ^^f19-|va`IOJ=#i)pR(7!QceeKnr_S+TU6;?BZXZl1E``NCqK zI@UwEISl&t1RB^&{o{r!{rzEzm)0v@Zt1fucC*N15j*uLH%9`Q|1S9F{lw(fLr>QD z!6?V&knaQO=l&L>@Y9u`-vMO47p$LrlsA9;e03H1rnPQ3MR6A9ON>9aKjQ<<4$?0M z8r7$My2Ho#gM8D#*Q-eJov32J62(wLvFQfIRb3SCw)7JVH9mK_Vj-^Sl(%zC@xr*` zFq`l1#Tsw2`5&|SPqOhZFu7v>gtaGrg!0EQ-jP1v@_j3E%FXRx8uJ_YXYyByYjC|- zSwFdT_oL{?$*nx??c@05)*8sU9P}X=cLKk${2!n_OoH6nv5Mc?cobDl`c#yQ_}$@( zZ^2)TACB>r_^RdqWsSzW!B3=rj&Y0_S*-XR+9Ts^SEg@3yCOaZ{}P|bD&C0eE8{QW`c2#$dWrAAf6J}D%Mq_X-I$w! zkAA3l;kJtN;6Kt!Y`iP_E#uGN`bwNrqIiwPeV~W*^HwWv1AUCogWrhTTKT>DY5W_s zBhp8ot=J=__z%<{>3`Z+aW9mg@mKpOUTN*w`$dhPVev+bKU=)V;w+0-Tij^z4;C9O zF17fX#b+(HSUl}a)%Sq4_jlI5h1RZJEn;X9dl%19+}+xH?JUMI-e6o^4eU7H?=e8f zm8czeYc1;asoYfC^y!xVzw7#Nx|KWEj%Ov6I{y7vuN&p|I`D`chj+6$&W_uBbBW{k zRW_co@h@z=m*s!d(&t$E6Bg&#^v`ViB{n|S#(%oWnA;)$65!pyIU9|+A9%;j#{2=; z_J#WQ%;Oag`ciR;#TtvJ7 zZu=AGTcf_gDn8ol@=Fw#c30dBa^8U4>$l_errex9$m+L#Z?W|nTz6ly{v2=9??#;0 zqkf1J+iJ8uHA2tj^&<@TG`$7n-pcne58Stf@+Y>Y1&dA33yt}tzQQ!#%Xv_RiDG`v z>)2nd9W#YqZi+1Z8jK$-|L-A>3DSmIU!D7VX0E^|KZ*prl!2&ZL<00o+gVDb! zPxas}&4sjkV(YQ!SG?W^eo3J{egyyUdixo03h>J<#Agh_J9Ei$vpukDGB;lDgK_H{ z_V>%GBgMj}6xUk$_geHVeWi^T+xQwAFSYScZ2VP= zUt4_J;?EXuw|4w;l-9&ArAbX+YVm68zh%}xI8s35the;LPto|p7SFWuPqXs+TK-j*A8&?B z{ts+?6|NJs>rTwui07lf5`VxvjQE_j|H)-aztG0_K|f{sUDi+AJ*e@g&Q{FgI?VKI zE&pI#?-{SfeI4;;Yv;Ar&ONPN&se(_*m$_J=DWql%WRx)I#AAN+uw#+Jn>28-`B>! zdQ0O6+wxpy?KuWx0`v2YA);@~Q&^(>J%hN#5=$?!@v&C^3vJ5(rNu5*eyzoKEWN(uZ3=U1#wD>(5(k`@yp| zk@pWv|H~;FzsIJpwDK>ra>rQy$1OkJzLxwy+V~4L|1-9IykzmKr22Jp!exZe6}ciTR1x9NMHq3QcsoM_wqySCi7 zAFk;iOSyCR(VSQO2s=2hAaY*uBd)8f(T_Pl(RoR^9Q)7vTfL9f{0H^MebaJ$rx*G7 z_9c;TB@zeTsK_@L8RwgcM7}{uva? zp%qv+9;W?`$o@rSe~BQ&HzNBRk^POx{zhbfBeK5{+24rI??}wqqvguk z^W$*Nr>C_R;xq})tJ~X+^~OP3-bAf2eIVy=HN;$gu1gJso=2Q8o%oil9IEm6l^qTwmA@9{F7H!v%_;N?gmu zb))-nofrbSJD`0Kufe!Y?1b@p$gm1?gS5X2QzYYH&i`6Zxp-hl$NKrxHmY|!jPtzj z>lhFC1NsA&|9^`9ziLNd|JJa`manJ9uX|hn*f>Au&3X&U-(Jp8GZytSJg1T=BuLAmRpmY4%Esy>k=BImt{&jc7PX)_O`37V5MSr{FZhTY+`0O}*{RHFo zv^Dr*FXElg;CK$iJd5R6mC<#W*GEuJxmi6D&xwE)H{t#GVIi~MGMvf^eCi@&vcQ*t zX8;F*eh#oPrO%hf!R{rbzi-S%z*8EGxdiyy?#8SDE(QLE@d?IU4}5)BV{QQcjQCpM zETrEFEZGaMGyosp!oza@VI@Ac^xieNSM2(Dwyy z3x7=phM}hs*t#3)3wSZ?I2?Ex>^K_uYw#Zjd=K`Y2>cE36kvDg%>dUzPAl*;RO9QS?iC+f|+u>!1< z6`R86j9D|h*i@o@-8?+kKKWdCU$jHc%Zb;%NeueIQ1b<@XOj`%b{^L2hL@Yy&er)v ztLQ5?3vpk-@jO|f?PvqWi{F9o+t=_xDA@Pg582Nqwl21~@l1^y+}F_V2j0>6@K+Tt zI7#t6xqeM-jibEG-`(OeE9VKx7uZ>DwssvF`y%EQSeHBKKw}<&ySYa{j00$NyEm<%a95 zufy*ZH5fO5zrg?R0S_LH_LbMpy&cGh=Ux^&WBg})0{Do-pHkcp*CEEwwe+r*f0x5Z z&&{U;{|EK|UyHZzf1g9&h>J14L4JEVc#ewx$#H%v%JntUe>X(q&u^!Azr{T&HC|&e znDt(VU8iJZq0Ij<#ho=fDsmdJT6k@H$2=e0!6Yl)oK5;?CW za$Za1^_X}b#w8-p9wR=9{!HX~V$*u%?Bcle1M8to@d?xe;~QTg=J+^nZ32A|#wB9U z#ftS7_p$gZot+rb0Y6Mh@7{CM&$VE zzZmG8j}v)+K%^gu^dpgeB+`#W`jJRK66r@G{Ya!AiS#3pek9V5#B~oS)}p;K{?Yx4 zJROShGvO~H?-z)?uORZif_SgZ&-)9;SuezAtej)-Q~G?1pHI^G9q=>x9>zLQY(&R) zm5T@Cad4f8wrKkd+F_6$#I+x(Upa4L{TD&cv#2-Xn}X%$(`r74Y0uXc=_6mobso6! zHR8n9M=#g<{ZSD6VX$ehbOgQ(hIOiP*gYE8_bT8yd*eC}diV$0S72U;f4SdgJg(zo zK!4(UrJrW$3y^P5(6_Pt-&*=(<8hsYyeDy8J{Y(Ta*qan1Z|vuoLp14UFx9 z>pA3nVCAo{at_%Q*L9@754;YTZZPH+V8K4Pt^#jBzDI$dLC=%Gd5FIVycF|=4ZtGU z@eyzz(7ytnjQPjU&@*?1mg7FF=Ss+rjzl`_Dh56Z>;-HC{{Y}R5G)?|h-7nwPO(5b2BWL_5h_ml?bcdqP1Uh4!}%@Ul&`v)oMoP}`HX+o1iHn;&r>+<#Ps z=_2>jIHI*w_m@5Nv(6uWb9Z}tg8g6}<(yW#W%(WX{!fW_w0EJMKL-A)IZEe`oVRg& zKJ{DradK;g__M<7y+GspV_f!&DolU5f2lBwv1II{zCQo8;-^a#!xry4U*r8RP`t*{ zCkK2s{r#ny{;G{1WaEFfxW;0$O%GXl$5}bs+Vtmbyxj8r&c>J9_+lI1+4BEv=`$?$ zu<1M4_(&Vi3P1KY)@r*w9rFRMcU>%4VV*t{_QNj^Sd2B%Ulry`=?4|&M8V0e7adP} z?mD)1oH2t&;d*6pnZ?GZl%B@;I>@&Bzik73Xun*ST(TYZTY^5W+L-!LxpA4-<$A~) zK1%V^3dM(UeIfl1=&!_QequbAkN5ARK<9Oi$oqF9@83s_n%s&J1a^-wAETcT@0WIw zD@Tt;oGktw|txbBh8`*7m+HvWW7-_^z+$9*x=_r6eZk(I;s5z@InLOlE| z#nmVWe;=j$naeFdy9Fg)(hpu~L`C1IZwHzs4Ktao!5*$KBfD{&m98yUU0hEhm}E`d{C{aX4XUcb35{ zud)1`${)^$T|Dx1(v0ozV{9%7b#(s!Wr;Ggz8T%nh>_;fEAECs4f)e`$ zO6&(Hu^*tset>ct`-ANs8T$cBT`u10Ibi{@1J;g(p1zM9zps{)_EVRWj;F)x_^-y(<*VC`u5WEe*ZV)&bLGyOe?nng?+N>0qhLLO zaaehIG z^9xFB*C=s*L5cGVN^I9CaehIG^9xF>ZfN}OL% z;{1ZL_8^i4_&T;*ypHvY66+f!)-y`%H%h|%ffD-BHsSiOU=Q-%#n__9Qu-%U##2F8@cvNdN!qfy&{( zTMrYtJ4j44(s367|&j5ab`QKhvm^@V+P@TqQ9UWIvEwj>G;1 ztW#gjmu?5TALw?k`=`#Qo~LNulH%9{Odp=-KtH_+f6s#X!2N|uH;`ffW)$9cmK6=5%JiCY`gd z_^H!d$mO2S{{3_Muzv*g{9l#pUz`s^)vqp>|ExdluTH11w}qeBEwdF6aNO&jV~n$G^(?_PI~(A?P*rM7tIhvn=bp;fzn5du7;2X~{j1y`bw2)3<@##;tn$?L&`bGSRt#rJ@pZiaEI-{J z-r(|jUBA%zd%0fzvpwnjSlm9eA2naoUW;%!v{d=g`PTNc{MGGEw;$bZb-OWNs`vl& zTj#GYr>FDh`o$7X;RlY(0*zdFS zPdWX(Tz*ylaojC0cHE$OVug}f^S}1vzngzg_V4BVmlbiZ@nbCa8}bLo0ho zUH6*y(U$waE{|rfw8x{&l>WcxUymcYz36dh{A>I^&Go3qYn@)Ve;nVl?uYSt>?pV& z-VN({l4ugLb4R>S0LwB@@2c@;Cf6)AyD20dno%aM)`8M zNpSr~xQ|3xs1?eW^`F9Z%pXep-UrI5aG!{B0ZU(&o#)W?8Z1Zhb<8J*zyATsm+jAn z>vy^dG5eM4U%>TZkpC}UxxNUlkIpN^qF1gjhwF`D-vs4dmZPCOk*|ZD<^OQsq3`?k zeTKgO{^$FR|GaO}@%4SxKgWZ4=ro*nhUYov4R{{=5BbpX^*)`>kG8M(Ctux%(DzMx z|3U9B=zWL(Q~R`fU*X^O6Pm*PA>M!L^7!Zd+^q3^FponWm4xTiJnp=~s1&`aOS>9o}P06^S-}3l(jPvz7--i|Bd9DPf^WAI4`&H~` zdmh(Xa{RHc@k__ke(Cb5@S5}vt94b}(CwW6WlH}0_-BrMx%_5fzq=go)q2$N zCvf_0|1rPy1fE0M5BmxD{QofY6aAj?P<0<(R&;_rh?B7Iu&;~|$3cG!#v$C7!1smm z{R;{Q&*ekdG(BKY)U)4ebEsFAd=QC&+?|>xe3)usrIBbePXj9$ZYaau1aGgcszybmL0u ze=93DhVKM{-!&T75sRSSYXG-C3tw-mR8|B-{j~&%=R@%8O!qu;RzCs;0iyG>*4y%?DdSP+2LDcz*QxDZw%z~oI=EaJj>U|LAcNB)ia`i zQSSyj7(XbN5Q!i|a?theLWp;O13|U~`4hzRYix)SFrQ$)MnA>#C5C8F6xk(ipAn)R z=mY)Kc`D(fB-B6T1H(VcMlvth$9UUZaGnXuh4!r~see&h0qqX|-}7zWSGx}FapYlq zpFivSFbPmTH?vm~?sP@-Tl!1JAhjJbR^@Q)+pM>Wf zDBD9jMOo%Y*sp6$;rcZ$to{M^qsA@~NOoU*|7#Akw-Jq#haO=09_-^IuVDW16XLnB zp1|vPu3$uCn(y)a8HO7J*U=72jE@rIp+vhVF+NJ1|55(%GszmANCrW>#Orl#kem+V zC-UCeBvV_HyaMHm*SAa|iT}BZJbFIK;e$zzhyH-q$3s6ySsmI1%A{D5_@AlBA#AS) z%x}o|m}5$lzB9{49RD%v2eDsQ-4rer+5*OJ3hfSMSq}d-v{U4Xuzo^03EC6NX`4uT zvArj3Z_hKjzLvv%!{LTcqw8CKAz7WvD<}Jj`=x02E{sYs{a2}zW>ec|E}v)?yuI9A%>Osuj}id)2}34@Vo-Y&z>O1z&Lxc zDM@_3FakL9G2TB_5^sQ<1Tq-0FUUTWat=R_{CvI9OZ za*1#lx72*qjr2WW{Kk0nJjo?`7KQT@Fb}=KGKytmSTE`M4(+2IjAy`ebWA4(#z(Zj zkkk3A59x38rFi&!3g>Gax8R(*dR~QG0M;uQ->G+AKQxEzX#LJ#Df|%d55pbxCVQG2 za=x@bHl&B)bo@79JVn;!&>s9l&P=8JdqKNJKk&X9ujBJBlz5+rQrl_Vit_QQUYCnb zAD>U7e>%O-Ih_?;{tq^h-6qdSe!7hO)poRA+xz}B>C3C})Fpzr-0^ub=I=Jl<0vmQ zCP~lhveMUfw0}DMi|d?UeSJKP^JuTu2(q`e2&Iqj7vS}bnItu@2S$JUaJjj-KD0lt zrgI+Vb+n_ealj}1tr=#s)J9C!1zK+kyv3_sD`VP~1kJBH? zGB20otKoG$YKeNZkNpDs%O8V?m%#cH8SmH8{_JaXU6+rpr(K-hLzW9ODLmajxI}{= z$lqOVe9t(me008aK6E*hg>@O`rxVx9^+se*>k9y5zNo($Vm6EyH?tQ|_kk;U9l8eA zp-^pN1IW?_oX-b29^^rg@K3zr2axd~e*#&-g!B1e56k&Z4v=j~e&Pe?ONzV1C?(5_ zcWz=j> z4<+hzIrQj%KDdtgK#BT%4n6u?7_OuLDA8|}7_P7*9Hvtou48^sqQ1C8kNGVF*Rj4( zVmYJ4@F=moQDVF@j(DiA2-mS5QKG)0Lyz@Z4X&d-l$cMHm<~z|U(FF7^HGcSC^21> z7_QbU;p%fZl&G)&ioP*i$NZs0ePf3nulvAtEEklRAC#CrN~{l**iKQRe<;x(l-N#D zV!fcmdP0fq6eaqL67!D|>mMchj}q$*CDs>8Y^Nx(oub5ciW1u?N*sSs;(j4YJb#1| z&%L0;aR?>)>ErS8{dFKP-CrC0y#$w7um;bkz&!!qSC8n3{hIE_Yc~3yg%A55+JAlc zN@9B%xWD(PB=EhlfpFixIvTzw3XK1~isxcz+^odsWoRCMw~uFV6zJE_lK|??g8(Q zt9(eY8p`OTQRt7b&hmoxRHHH2gX?#A zoxG@WEO-m&1KguF!dFWnw>^N}VxqVPxt$E$Tj?i@oF56%8{QaO#k>gaPP@QI=}$ZO zQx98!WAK|SP(Q~bn+S670*@SGBC*@!W7rk(ctd=~+z(cF$jg}r#Sw30&ha+!UglZ8 z#K)P_;cgb=|HS+z^DXA@;O-mse=x6ryIf>fIh9{`zIMa~nB6Og%P{w0dv7sUg$rk zf%I=Mf7y<>ICIHD#8sF(Wux}ffLU%LeE_oyR*{&$80NkK#Lby|LA{~A3-clvZIJsh zx8d;V%-(lNKY@AA-^6p6Q=lJV{AJ9^ZxC-_UeKL*4|7s0;$zH5xj$cIj^XrwWAJwx>#S^V01=q%pB`a9K!s59^wS%$oGj` zGk1YiKF06C9Ln`IfVnBmzNjC`ymmS96z07=-h9D4j{EzU%zwcwjPW-!-~OF=KXVHn z4}V}D4gY0|;jb`1<^Fh=c|sYA|CIS|X=2!TR^<`N?Y%Iw&mhv5XFjx!xHj`_9?!g) z>#ihy6CIw@PhtL%_oe%wfP=J@Sh7%q@ZUd*l~Wm>1nvPTJVlKEmT zxJ&XVE$%Vj&5K-46sdywnI-}k7fzN(8nE*o+c(VO+-a=_CmkLqG9^W@>M3iGTf zE-_DsaVm!=JPoQ!_D<)9ul{@17gMS!|3&`4;VF=(huGoZ3Z9Nm=>iP+BE48|kmgUr#eYK;Rv$$Tpb^^xKlb9oqlQh=W_zX|=Tm1mSF_!ij@ zfc6mO87;~%&xQ7nT!YzNhPV;)L>P}cfZmV!d+0wMJYz%@Gp>W8JYz*m=JL$FnES!{ z0`)_g_d@&Z06dC07WzX6&p0uac?IaBJmbX|%-fh(GWUb>>;U?&nFC-v?ckXpb}=sm zeUxXSIKn)a`7HCh%-5Oo!uW~dGnsQT|IOSD<|owS*XFQ((x5z%3p3-__mImmFN669 zxhAvE$HX4Y`=Py|9^dLkd)3)~Jag-ELUaXv7v^0@Fnp4DpV?c5PZDX&iOQcOF^*Zl zc=#@aUjU5#r7*02Kk!TztC%N%{SQ1-#74y#MTQ&@Vz6hbXk81#r-_bV!!C$tJ271G z9?{?ee3by$s*UEkDbWwUjD`Aicd4tyhd6$Phs389r@3pwdgc~<(kqksSp?eeCvr5v_-XDBqln*9 zJkdQdSctQr_h$W3NDsqDD$Wr5CJ;|ioGwPZVJQ7-3NJokdpjt+do_nY$okIcpvW4yatHY zFfL*Hx(5C>@ERf3F?WXid3%i%LmQ!fq8JALhIow;hZLuY$t$4!dwmQ$a}<9A_@ClgRfF}O%mmqzgZ(hN8swr`-))sPlBBc3_o1eUw_a~AQmH4`<{YI`0cT& zy=O7Ccg=fkYOm8^&cpB-0{#2gYnmADiJT^az}_^k>0+c8aTS=)=K{}VzO@{_hT%0s z)bJ+#a>)NCui4@}^ka;ld`XD!ygnDXU|hrU=mY+r_WDAsW3CPLbJ=UY_=UOBX=M0k z^FS58$O!1qQJ#xMm||+L_|4t!iqk~}sGqxDi^VF^iw}UGcr6!Cnco67#Frvh5T!r0 zAWUQ4UyAOE)7|A%e_1UCGT-ch?Paz2g;o>9cbHeI{BIR)n7>o`-zvH?f2h*mCi*asQ|WILA2Iu=^4TuZnG;m`Y!_ph zH$ZZt*d^-Hwn0vSQi8+HAzcPdE<$MSD$^_`|GLL+O?Ps@m%$&mfoO$@C z@KrwupAE_dOnQue?N1m@Z-A(h! zDY1uG-1rH{=TlrCG`<<)G#Z27UK_`!Xz$bFrV5|oj=F;7`J>2W?gjlD`A=e%pA_#O zMGojE=r7ghIgy_^8OFDA?sK9TbDgCa|C}htTpa8mS7VMmOI(+^D)@u(J(#Z?!ukB1 z2vVG`(r@8?PAq4AfU2MKVl8u1=FQBVVE?I*_j$3Kc^$ak9vHvQg!#X!{5>yDFzue=m?^WB%kkIbu7`@AGBGylr`EA!YE@K&Su zC2^nm0kpr1_9gKLb7xf^mxKZ10OqgdX3}RTR{8%3;`=!`#ruYcRjmE{RdjXeM|$5B zGl<=h_tD-hv6ff_4a4#NmN>e}kF-hVcje&tP6N8S5icjAy3tGgC}srtvdVe8xPo2i8}n zSj0@@XQud)na0mdv7VX6&rGq6IUf2uroWH5k?N0`;t2E4sy}CnQ_O?Zc#$bCGS^}K zb>^+Czr&oD^^cgJu>No6Z&~k(rurDkj9-7l`kBt*3p1Z%F2($m!&hQn%v_VX82i(Z zIg0guigka?6nA4)daC~}^nM`lD}s=|;*s7D#WT2X#r%v@{qvEqro|*%P zF~7&*W108O!1ekg(Utkm2;!m4KlUJ=t~gChx+}y!uy>XD1lT|9{Y11*K>yN2Af$iF z`%ke_afVp@K!~5c{}LM&rz`%=`1<%!%9XytQTN>zi4MOdJv1@Yv8MLpdaesLcsHw zw>*Wf%K2nB_ByyC@MB_CpS65)8r4&jeXj4^Mgs>o^m)VZbFiOJUZZttR`>{?0>&uC z*NtKwVSO(O8adyg{H}-ooaj@~sGvAa>;Xpo3dIw}=R@INOF_Sb^@Y=5|HbD`BX3iT zpC+z?9{B_2E}-uQT(lYLGu-)Nu>Oh|cpr@A-O5jhK0ZYZFV=4;MEXe9TZKuFU-iZC zm0-Q{0fcwMeLr#^=pRFTiW=(_PZs09htqSwi7*eMeldif;#15BYKc5e)PwnWmQQgb zN^yp}36#UFJSB`IW}o-4zDgJ^m_5{dS;FYR90T@H--DUfPbG}^nfIS3{UGK!YJ4nV zj9^{``bzE+#yI8?phup{9DNx6h0>>lF;}tf-zAJntuX(@Q@l$WwG>Ztw|WTsH9n;b zFXnE*t9?ovsTAIg>w#+SGDb({Va$D*h3a2rj1h`6+}|@#WBr|?=ua7A0W)mPD0^!- z{OX4AuXR3UjBTv%JcYvVQ@l@9It%+lpued2x`Djcr!0rxCkFXq_;SV_rJv>=08fn% z`IIxBFlQ*PV7ObO|C7b>w$Pt_Dj8K3PvraEDu%z}G}Rw$QN?JYc$(Pb38#L1sv60P z_lRDw9=Q(uE^`N9I2&jTR-7RoL4J@k6l?p{jK!qq{#?!YN-@<(LXK+2KGxU$9oz3) z#xY{C`jim2ecm!|5_A6EGM+g2kxxy-ZX@7FKqz+ymGa^^Hx;G#)iD_A~c`{9Uvg7^j)@zX{`)Zv*2Vu?U2x z^m%~=lson(V z|NGdtr!k*-1Kd9uqL;B+@nmtZFFt?iW#HSaIG$kq3BJ9JBAv5%hHoFEGc%_5g>PTu ziG!E<_A^Fxq41dA8s86$GB7TpJ><>41B|b`Bd57X4TFF4^c`sIVlG(<$A^K&31;e# z1C7hf8wca~I?%YQn8pJe!dHiN5A07GG=2>-{FrI{8f*k9&Jg79VB?nJ;XIxVHvUwc zE(Sq<3^ADFr-?dOiSzYD`x)*7&u}~#Y?M))=6($ML9W7_V+fY_V55%W;cgE#ehe`J z6pwKG!gzhr9%4i)P8WrLg#Aq4Ax0a;8RFwZaB2wn17;k*egN*;OQp}_%}`^YgA4f% zHEQ=JJ&iZR3_k}~^ciNfW`1L_5DUGB8{a$lyzdAj=v|7B`ng^i#yaL|Fn-PT8focsI{j#Z2Sf zeB&fDjdu%-N6a+dEi}Xjls=7ji;Qy2G~O*XYB1Ayx5S8Mrtxm6k;+Wt-7;eUGmUr4 zjp58R-mNeeG1GXr(paVSYP|c>ILS=o-B-pFW*YBS8O1-O{L*;0+Nj1%sLrtxlrQ3u9BY(F&KZ8TyP>+$XzqcDt%sHgF6yHT2%#=9Lx z6=oXmb{h2+r;C2jesAU3Wh_=aQKSL?=DW){Md5k9yT`c5jO({d-#x~4W?V1UgmLB$ z^Ld!x>H$9@R_m9d#rGJ62CDq2^<_=5-zdpU;rAOAiBMeQ!*M>v%sf3uHOJV@7Z2=g7kqA2;ydv>?AK|AshW#5p)G za8n1D&Uw;kubA#Hs{5TXdMKv#XkEY4#y|%*_B&&I%;Agr3E}7WqcMd!o8oiEPKQ3+ z?}G82Lm%#U(YVRndm`Mg`Tb-()ZrChG1d)*>;1|bMr&r;f4pIICRXLq!|#Ui0qbc!`m3=>@icK8%CE2Auf{qD5AnNc zG>3Ty%l9(e|Bm$g&6um0*3Y*1%~+~i*_)zuU%k2QTrvV;o~v z_d9-fjoS|X#_yhyJss22_cQm6f{N4KbU$<7D503{H+K8oH)<%>_bU%rPxmW_{T>>T ztf%{x-;GWjAMa0g`~7YVP^|rVY@{nDe@^;6F+S$-c)xbe?+;_9gRlDiX{=&Ke{TEz zWgKzvBfqD{UB%j;XU3n3wLi}cbGRyBb^r9-@0pQbvG(UV>&c(&{=%%!dh*9GV>mwg z^W4uc@vEfze$y7x?53Ff$?I>K?{Rqa=S_dx9OmFM{w{MmGx}52KbyJU!FB!J=4r*+ zpX}xp#oC|j=1mTd_k*7P+08!{YkzXGp8N^+&t;Yvf%(<7UnZ#^KSQ1pj>e~$TAH3J-c*1wvW%8dT}>|fpN=ipoZHOx;HYk%G{=PB0yyk#!q@aWI){%@Jz zDAxYeVmX`);lRvJ2`et#(w4akZpn+M{ z!G!}Fn!e2FPw9ZS&E^iS641yTq*(jY*c_!;`_tH*z~RxKIsuK%xr((vo~$Q-JOjMU z9jqsRyv=hQAN{El;BDSfto`vdA1fw*0s{QZ=NumECp^I4d}B1#FLHc9fLVbV{b?2u zXa+dAeL#@ePO}-inTv+ zW};&4Pn_AD!=pb-1LDl?inTuptS5ig1|*vJRj;h^F3DWX@zI~90ZHaJinTu}=5EF0 z&o=?7=0OgR{_G5R$2{xc0|8CVd(7z1iGXJ28y{!+cRrxGSxd3@r-g~{J-~dy^J@z; zfWxCd*8*CY@rt!StyoX~+zn`L_GLZQPaE?Sj*tFa3ut4`Q>^`IXD(Mv{yYk3Z?5I= z=+Co&4(2Wgy8=6!XPD8SJb|6eM-DC$*x7t@EaqSP)5R>OSo_n(tfrX8@3MhiOb^A{ zpKh!tf2s#|H=DDb{OMu#=lJMP*}xv=7{%J3Ugl)Q9mU$8Pgqa>{1iCB%=-!XOa4qWt1Bjdeh8ds`Y6`^Og2LmlRwu3 zr)LqJoy1IpDr6%b(?D0mbA`%b*ozamBPg=n%BhtmfdJL0_7F z%;-=5ps&o94jvk`${eCt`?J~{qgea1+MLAU(Vx*ltIc_ewLfcFPyS2}T4(NIJ^Ays z`4h)Se?|v=ZDuOg?QMhkmtyi~X3$1cPC|dlpD%(onfV>OEa)4v3N!k%HfXaM;@~Yo zTg*<1wLe?UK8m$JTg?F+9{t%HwACD=So^b`_2kddpdIE4){{Rw&2KqA`m;A^r+HSf z_Gh>Gvtsh+RL~ytHx7^O?LyFA^G^p~587wuh35$9FZy#g=v%X)`6aC(LKe=wJQdlV03ie?MgoR7~?%Nbo6htYTdrXIM|=5gYuY zxq|gn9%s#OIX;$0Nbp(ntYTfi=gprLQ+cEWUod~;@L0bsgD;wYI=EBtPiEe!S^oA8 zzGT*P@Q1;d%^1bHey^BK73=!FVz%Y*Sii%9ub6!lYk#h?p8Odbe9fG~dh+MG`4z`U ze})BLH+L!4{`_JdR80O%4*u0V!Qs)LnZY;BD-NC?{G0iN8S8UJ@GZ0Ov@HL=4!&)^ ztyueW#|%)c{kdZ{;qd6sw%|KvQ^ne!d#opa_6OfL2eO|0$uvLZ_~_5J;7oIwV(rgE zbFE_X=VKKj!zB!?WJSo@PprYk0YLPK)Pk2yU06CLt~oax|{kUSF4HR|!P zbx2-$#KB!c^2xi3b$iP%|5U8~$uG?r6d&7LpOE}AzhdoALDrK$149bQ`m85^3dvYz~HC_5@9f6Ih6l)ahJ-!h?% zLuqYP8VL6g?QxSBX=sM`u7a=l{c8t|DaGmS#%Ei zr~UVr6%_0G_LulIW~_g#@2F6J=}FAx<1Zr>r@41@!}C%8GDWfW-(U7pO#UZ?2C#j- z{~IWWC_VY#G&E3-W=8*;h6c-Nigo`Em7gn~Eb2mj+J}b8#T*{%w_9kqT+fXD^$l$z zPb${_MaZ8Nr@LFI_8K8?DAxInkk1uUeg}m{a(JEJD4FLoEDy@>@X#n(lo|6oJTyjD zQVjWnegE;Hak3usK6vgkIW%4-DyHWTGeeVP3&k1kH(*`%MQF0@#rze_dy9b6nDM;) z3gF4iO;WMFCCi1(13M6JU|s>|e^x{I?}&x>NjTpLe2F>N4-g*sv0}>4Zs6RXqkn1c zTybzdGc;8eQ=H-cwh*@WRM~);(odC9%p;-xS3~#?#GGEL9Hf}+p8)+h#c90%)Kt!5 zrtzn#TtV^O%|Wo_ogr||qlE9t?E=MOx5 zTgyo1!@&1K+sF~ju3v=sJ+!TygKW_G{S@!^azZ*&N7gBBHWM2u+B1)nchd}ER&eGE`{+O^sSib{e&z%y`Ruoc40le zpU_#p$4u`hbe4mdXXF5XvSslw;F|8vawO}sr3jG|(woS9D;EB(DraXoOWP}t?~`=)B71+3+RD^E9hOL3a;g!C`k-DK%SWdG(yA^+$m>K)%7{h&L1eJQN3T%}n1|GwOznEX!* z>n{&0&TwbIJT(&d8Z+gmzkJ5L;#Vw>{<6>tv=8r}48!{FFH16)fbnfC#IML){epv9!Skr%V_$Gr7*A%G8uxb2GPRzHuD# z>zXXP6RYxzC^cE)d(pZ*&kvg}mnx?ETp2b~uIKnoQgQyCDUUE$h52DE=&v*5d7rw# ze-rckHB%N@iT2@q{bhJR8T2<5Q~TKtT=Yw&cjNh?gJE-JS>_oJ(4V=oDzoPh;yTP< zs{5b0vN7|i!KC+RKF|6@=4((Nb;15%#k&2@mE#qYzsJJn$ypp8{W}f3jyXS!H)X{< zd4-wEW1jqzxsV5z&pes`EAnR^%wy*vel_MJu&%8O96-$FGfy^Eto#2w*;TRb{|n>? z%-G+rge{Q6nQ=V$1$d%jz1~E49rN9L#7~*+gJ^%D3|vk2X+5`4HdCA?5>)$HDEl&R zgZ_O7>@Q`WuJX4~?o>?Wkqz>5n)GVDmoI#=ysB7_Z;RzqX7u+>&=*`o>)Gji>~i^-`NAZ4J{P`R7FkQ>_wE5W&lSEx)>nMl*tZY9XW-y? z(1(i^(qHMd{S`7!v9|xEe1{qB$Ay0>2Pn=EXg@XlD>+T^W#hrOupjAQvj3Hwuk>Vp zX6RRPkAu5}uaegk>-5&hM~cb*d*N$jo^|NYW#jNpI8WzbvcE=_Pn- ze4~7-7|MSSoCkI=+21I$e~td>{BM-i96U9AlMGR;?QfPTipl<}@XfNf;>$)Wu)p5H zWPh_9r}R}!_K%0}l&Oj@8&kmk83&X7owCDA_IAoIUb44au5sA=IefR= z%l3xvhVM5ynC$JA#~t<_g8t4+_V&u>4tsxx@0CS1pg)(54$yzBCRt4O_R5M%PxUty z!iOl<{(dV{6qCPsntUsJv%Pzezd{Zsd*8}I4tuuvR%X0pZ@(PxuvezZemRTn)r9h^ z6EE5OPM&|s-T`^lVK1P` z0ePS8b%FjH=3ugSK>q!by#q2E%#(0ll*hM&GLK>^zl0_SWeLTXjrowjcN|Ri4$7(& z-kog=ynhe+hRpey0~J$!rFb8d39MfQ<7oRPhh=N#WEK9f?7`dv#%t6MaKul_d00+# z@XXNf3EVh1uc(U+MhVQ#Ixgf_g<8!-9O)knW6qElYe1DRwiFtqK z@(ZT@gv)Xh>nF9u=Yf~y9%h`Mk&iMbbR)jZ+=clMW_-V~6ofaR-9Y*Ce&S`BpV=Go zTUK0_6%=Qv_3Jl2mt`v_|ubAF%eA48G%)S}(ugm*aSynNXry239d|NTC zZ*oQaCW91bxMwuR_3Cf3IWeziev^G2@$*CYF^>2pB5uo1IX>3M@7Zq4Rm`|PD+l`h z%(Nc6EiW-K*l^tLRcSg()o%9_l$KCT>bS9&nx`uHv2P{n$^ zcvtphru6U1sm!!KzALv7i~F!1eHeCEK4f;mdbwW2Jy~Nb<|jkkeH;FTDdN8D!A$GN z`*MWhG%@oDmfw9jhnd#D_vKz@TJPSM7bw2EAFJhaU;gUgh=>RBiG!0O9?9M?PC)+^ zdzJ~&HsVhyb`T$I2>*f<@l@7k&U*>oZ-{s%4>4~69vtzv><;S;j2{X2;nO0dRR-oA zyuUwx4c_OA$YxDYJXyp}g!{XQ>{b}en;8CdPdMKfk;`h&yzr6`2O{3EmK;a@MA7Iv z%>NPjtzQ(UiNo)~`%DpqtlCiT7{5w6Sno#^v3wM#ySD{E`-muNg)pCJg8ieYmCXEz zxg&F~2-5dsF3X(3+>m)XF`T6r@NJNyR<4tne!4iOxPIS-`&S43&+33Exs<*eR6 zQ22}f@IFaoMe8c_Ul2cEWEIQr6zTr}eZI)*)@;QY?w-(YbNJM>mNM5;_oFqf^~^tB zg!fe=Yg*fw@j3IYJT33;F<*yr+7MdPD#v^i%3&*THRcu&J_N#hF>eNr1de9D zdJN9r0=H(K0rj2=+=sb5q~8*F0P`Eb?SY3euK?}}JcfBEaBtvA%yX{7`=7uwnen;b zK;U`Ifso!X;1$dpAwQ#l_cOPK_~U`EGPi~BQ-E(VN6mus3cwGEMc{mRpAR_C8C6~a z-$PmiT;9PeBWqa+%mtyG*G1O0+B2_wD#Vt^I@VC;k6@qU+sL}scxD&a`#!RsHJf=? zdDvfwtZyx2J~j{j?IE&(wU@c0w-DEWPcq}a_?^gx)>Y;N*d2cy`L<>KNcsH+^v{4R zD2DyKV$go08d>lOCaiz)p_dT3qZ(V0toJGo-_wiousX2*Sqr!yj`FnnGUIqwDay+l z#N4PeyiXnFZH?vl4Z(h+C?9J%>pOOZ_m`u5t#6nw!+Iht%Fp_ac@X3;F3R6J!|}I4 z{H9R>)_v9|gT75vpe4>?e$&Jt(07drvWhB(_l=-_-i->j$}yJ)9uO5`RcHQVHuUnS zP^&(3aVWpBQDIh~VtAht{GA#VZZ&6p_ZhGs7uCe-z+4pi@4~1Et0(i!Zv=chCerH9 zT=g0Bm#8RfDDy_JzauKz8qNGg3cQ~h6=O|e9trcs@u*m97V~sS?_5-zwSc)U)W_AR zcxxqdlR0o+GAhB^s5o8Ve$1n&M9VsdEM*;R@MgQ1n6(Aqgz}19NZ zRGcQxJch6QN4K+St`1V)mQOEF%;5^^6Y9oy@B>7iu7{uzF2futLQIe{}GHQpG9}GDk`2R zMim!gK5%VdH`K@ZV%WcWSb1R|8}rwpHJtwp=xL=YP8Y=>eBr2G)&$ls1AmrA_qHA| z-|htSYrwl!otqT@$YkU`R&VB?;Q8^I==Ut~8|i04dQGF=x4PdVE)4y1b96te$Zg`L zpzj*h-#W>h3h7Uc`oOa8kbZGvc1T-k zL!f=dOtmUHID5>eR+Qpt?#sDhzKoe^C6ZpPzdV57C3dg=Pze8+S=NV&_o??%LxD#r z*8a`0aGx5=N5zkhnPVN{`1C!?`PM1sK0~p*=UW$7|4z29GjD+LqHWB4>kjk5 zv+%qQ_zAJd4)aZ3-}zR-hnQZ5nEMpJ?=#=3#awA6eh+BA<)wIW_sSV%zDg>>+AMSmRT0G8@0ZG z{)~}$i$XpqCHn1OaifM>>z{8kneZJhnbveeT^99STHH!8A^m6MGGwx4g ze!Tv`@M+>UFy`lTW?H{5w|bNz{k$t!zss!+N>Amv1i~Mt@M`~hP0UK`tl|vyzOxa& z(#mA+3Fjf|hOM-6{E7B5+&|31`-hcQIbyyaT4{MGCi@$~UL1$V^4k-$%6f;H?r&CE zZJ2YW!u$mKE{^y|frluj`@bJ!)>vaXe5pp5{u*lmGu7uBYYVZe&z~TCCNq`qS}Vt2 zn19{h*IES>XSnmv#`0NbRb;08t+U={J`L-kdok;*aOS~9iJLKh!rVhK*?$D#(-l+x zzl&LKP2likf4#MYn9FaywZjo##ICo#dnx<|>lE`R&<@UrZLof3ZVdBAw%85UJ!V{A z=L3GmjO*Xxz&W5_YX2(&mr+dls};M+dP{MJ8|$k9a4@s)GAy4>Rtsjz|0e5wVnNSi zHd#}c>3Pd0>l`zc|0e5!Vk#d`u%G=I=7-V`j@@h(R;=%bH(NECS2x7+-V8@hF+6-P z5Y}_6LpNJ3nJp;)l0KWQj?6tlwr{f8LaF_Y0Q>FM)U+pWBc>AYEw*d108#dMymZ|qL1A~T-1 z8Wg+B@>i_STkW4YYkLP`!C~S_gWduxc@RP_FHSR zV%`3~v(_or`*jDby^3kS?$g)<)>ai? zIP4t&{qHZ?J8HrIRziL$e>aggC_Uxx0O-3a*8U!|K62Q* z7JJN^!uD!H`Tgc#vUkk-!eMV_=rL>8OZJXiCmi-3#U8hAu|3yL0pC8%VzPJK`a|h; z{T{c98R#Ezm+%vor(&JoAFN2lbI#dQ9; zNZctaT`{%q(s8G)Ne-?Ocg9-6jP1Qn+>h2i2YbYwwQeZZ?f;yWsaT(XK4<;O;qg3i zVB9$?2h5{c=hH8+p87{r+(oMf>#2YIWQ8iG_p1WqezKY>*8W_!+9@V~663B|-8ej+ zk8BqAvo*lM?c=Um6PVGT9&y*KFCE-3?z(kUvG(VNbyl(V=Z1BK!=pb#;%-=(igkbg zmG$J$=(w9!L0H$KzvRzvRxQQk&ycv^tN_IsqEix%f48j|#oE8yR;pt1Z$jK1t2M_* z|2~boYxQ#Q+_-zz2xjzeY21BlzJu4qWmje?tyhfvG(tG z){}pG;~rUVSf^+C_t+}0nEcxu_tqxq$hujc+XsuE)wsy6PeMUvhmsNJ`S!H zpTnN4So@RH{!FpEQTv!49%j(@{G!+P>3kNtq-CKM-obkEr?`ENB()Js8Zl2%wn-E{duE31`%!n^*2RL|Md^x+FV(m|PyQgC9PkFl^hev;w z$CtM=6l;GfvY!0;I=+&h`ugzOsEvF+C635?|H6$Xxvpu3xI!*O`aF z{_QT%-(gJNRnoTXt>5G{2mQuW5TLzHIE?59>(> z)BIA?ZsLglE9hG*ruEr__}X?4vZuc9v^Au*J%X9m|F!Koj`)8-__dDsGNG=$gTv$c z8Tkxz|2NUUy7oO{QR;>e*+HKhzAL5uI}lsfF0YvKlP96RU0ZR68}CQjH>q!jF?+Q@ z`}OVC%!6Pb0=`#if51%N!>eykU~UilD5zgTEDpl{&Zx-x_Gaey)P8Y&`v~)rsqlOs z>|a()^LugN$BHR`6%!iT7TmYtdKuUA)qzVe)A^%@c70}A&o{Iq6_dR>5WcNqvNy`V zk=={Kw^rrV$R5e;g7Rz=+sK~FO#20m>}$kg20Xvipd{;NPoD4!xKF0b&BSw#)yVY6i z2|v4xV(MQ>3I6tY#ToA4DY!opV9!;Y#^=cc?0mVi+Dr3<0K2SWYX2P*g6#T=FB{a} zvv}Bd@O%vPK}tVOd<^B*ANUJq{GL@>LWsTG!DA9a?TrqemJn{=RZRXaOo+5?_-?Si zzxpa6+Rm?7pT~=~t1)By_!{&9%+#Nv?dHV1KN4+EVy64O82c+`y1$FD_cP;p%FPKe zc4zos0jO` z;c5Q9k&t3HQoK)m{SiJdd&l0Rn9Bct!aMd^#ngY=#x%2UD9&(G`8Kl!{0lJl2YP8tVKbXY69GBb?_t?X!KIzQUVexI4nkG8UBGw*7N^Fb?n53v{r>%44` zUY!EuAMKB|vcs7xU&j5gR(2ca_mAN7xK?&w<_m{mJOv)foFB%+-oP`N+roI#6?i2x z?$76oZDsFZzI`6+H;@!&bMeL^i*EV*4=3n~Y_|?W9!c5c=IrZ_x@ox^{z7QZ*!(f*cL*`Mpx(f)(O4}$U2 zGqIChyNJr4cu)||qb7E{z`n;Ze2{3hv)$Pw0q+F z_T-YJuL;~YvA?}UafZkb_t|NQAKLrNQ26U`zF=(F0Nbkqap6>$zY_=88<|VOJTohC zi0xI8^d8=@-bfr_uVcP85B@JM@ngGwCDOkK{pY8|iFRM+d~@JDb>b9z2XirKUk?+f z*`hLq5B3t`@5JeLbLR9J(EgKV+0&VO!+26SX|{cmc{lh|I%$qwrV7PhxdfiyC(X56 zGar2l&rg%)*{hhlf<829p?!~eDD2zEB`vl)SEcyNVg1-FX{mjP`8hnF>6Em>_Nzwv zB*;&{q_6Bz%%vf}!;)6pdziO>1K%@FT4PtJPT@0vrzd@FPhigZ48H%Kw8=it90=vL zE@`t}r3Qs>59PHxX`9`e`PKnAub;HT-pIW73bdD`T{e8OT#dI~ApQ?Yd+dSCxG(Tq z(gFK>=F78%_%rEAL$iFslQobO3KW7n=l;cvHq=Qqjc z>

vuwNOHe90EINgn|7P-61Wb|dC4z%7%n*`1jSJb~};C11CymHTLz(YJ!~J`5rhSQdG1Sk3B}gt>?-I-{4fgjRb4}w!&Ut1uB*&X!Qbo2Z@CivDf|{l|6Xz}*BRz= zO;BIg6&67HiD3U;a(&lH=9CE3zwH_xNc#H9zs4?i5b;vwpQo!g^9m@h>&ZT@lgwuz z{d>uNuI|AUJ{0tMQUYCPm?KqsA+GO3NM922e=j-QbtaU!kgCr}SNkwx{GYjd$uX{6 z;l%xekmFsmnLk$fO>*UGLi+Kleo|bsna`{8Z|cewLHc1Tzs+64nWrgzOIPhk(&tj; z*V?s&c_E~KJ-MwbF^crpRQl~*Cz(@J`F3(8Mw9-i3g6Xrh&fZG*WKk6L;7fCzo+XL z#WWue$=Ta=D<1Xm|Au)DQ7omeDN-DBPcJR@bK%PSe}!Sh7$e{RYsS8v4=#jz!D-UxU?3YCws7}obGAG;6ns8kcBB0o8S0wY% zt8l)%*ypa3%;(#{d|YgH41Z?tF zTJ7>uOzX=MsjFSBNiX29>jZp3!}Uxtd@ma8HS}EP%G(~}PZKSt!TK)sYgc8(lSS=b zu)mPH!PQ7{hM1KT_Oo+tay4hp3G>mAoLgN(m^XmGby9b_CNMYJ4Ci@L_qo#(;4;m~Xm|A;rA z@O2U&^)|i-^*g})#>2k$MiK4??bE}Kc|Rt6?=gYPy`Fnf{{b2PjW?X|K-nITdm{<2 zf%+L6ecU^fuxO8Z^a<|@iQ)WP5sWv{-+4DmjP1w6zVp70`t=gxpZ1O-oD1=Dqkr*ECM>=Kof}>0T}=4R5`oWnHxRyOrNC#sI|;XLF7P?; zA;K?0`Q=8R_nsv@e7wNFdh6aV{bzx30{`Z1OE^P@|L*NcxJ5$|UgaH5c+)t6|L{IY zc-jhqFL-B3ynsFM2>d;#=s&$V>B9a3wtfQ4@1hxhfp8RrzZk9YV!~w*zB$^(j}bls z;crFj{CC1jAbeM}n_vC_+6w~wX|#t&5bg;2Uq*X*Ea9yXek_{vCkZcy@QP@IKS#J1 z;4{%C-%D5rd?DK6KNH>nn8(}9dX7cjU#UB(+eB<;)l z%Yc|5UV@m$!^?RoVrg$x_~rZ?(m$61>z$Y@_yxjeQsM8<1MdDX+6w?2A9E!yAe@*6 z-!F)1%nuWO3c|<4G~t0`QD5N9n5KLX;ZVTyW192F2{(ZFLt5d4bndb^T|(QuHw7>^snN3{q(QmUy*+45m-;egz^)F3zOlzDd5Y;VR;0? zdQfAXc?e=kzcUX-O!d*3cO!kYcQx-zSlBxjb2U#OjP|elGvoY852gghQD1J9S9x=u5#-|`=eb0;fx{l}g>0ifl{q(QnD{JVp5!dtQ z{q(QrFZ=0V&$p5O3%lVw=ZNln7vUVh0e~xN;D#e^Se=oZa-%hw3#@i=)_2DN82PZ;*W_`IaL8K4s zw@iU==2u7zfB*9pv0oFxn;|Cq5xgB@b~qcNjktw}`RU)n!~OJc;kS@}OYmmsh<-fX zPrpCU@YC!*Jk|H)7PHh!M;Mg7N& zh~$GG#qt;Uz7d1@I>eO!D83OfLVBV~OJ=k*>#e+rX?{o%X=Vv0YUUxS$959c>ZoW+{-gj38T?&1R| z{<%fMpJ+aWa9e0k0*@fP>ORCNg!dCpC+vpxi_jlO_(xdZ2t1ka8yxXW!Yc_cAiU1P z@D+p?5`LC&GjO7={-yw|U7so#&jO7={O9^B7#qmRgvHarr3Bp)@ar`u4EWbEjMHtI3j(an) ze6alDcp%|nABysdDC1mUNa!}|#%?&kd`qyB}hVt#uc&mjDr#P{>ng!e%FAu;KE zGvR4~VTYH0N?7zS5q_L7-e1!BFNmrB)A{d+ss7WsdkUtX@H%|&cEkgGBx2GZ%~KGQ z{%D>~`me(NUG9J}eEd`ypY+G_$%sjRET4&(p+6ZsmoVP%GWaIKc)uIRcMwj8{Q&r5 zT>N9iWPcprM;PY^xf7A?}TT-eBw{Qt+Q(S`v|{EVw(St ze1u0KW_AGVr}od}ITB~FPhSv!A8ZmYsDXnI z`ag2y6Fe&VZe zcsb$yLm6{5dy!AfMSbxdrr2g1`4+<3i;VSX_A+mrC;gGnm%0vkg|{L+J)f}`M!v#3 zB9`qvYWOSsMv2vW^i@7oVqC9o8o8NIpm1EDzQ$KcyqFahnJyPF$Nq5UY>|EU*S!W$BP2yk%h zN4!1Z-vM`s{g`(rJP7(rhuBZ}0Kx;Vhy9<}J^TdW3D3j+X6$F2KaKXq_g-(0{hVJ- zxP6`o-_M8Fz_-VK!DmUlfHe*l`d{&b6fW%LMjzxq6BhRFiao?HTjjGKAA6X$tAW#E zkMJ%vaC+=fenSmBHuh_NJ7M9^U9rdb=o&aTx|~lZ{2bTVW3k`x^@K+m8k-UOEiWhh zE0p*A*zfqSgnt3NB=#h)yBhry_^H_Mc|*cN|Ebs?crS?;unNfU%{TqT2T-^*4Bl7m zbBYfmye$g$WBdHflL@y1yt~h7KAP}Q(D(NJg=Z2jhW^mEZzZ2i_$2K2PVRe#FD4ug z@wfIp%hwRz2RN|LIlhtb1<*g+_dI`ta3zFyz4=$ZoA6_h-h(&)#`hCm5BT|;f9K_d zJ$J(X{LNMTXTrlEzpWzv;1>wr0XRP50=J*R@>vFWdBmT*A>mR;e_sSM+7J$c{4}^l zGrAHE1N(Q~;xc*>z7_DITXZ9m@O@zKlUv+I4B=3SZ};;UqX=gJ?%&UAj3qn?^cxQ0 z##F*lkl&~whB24$LeQT-#59%@z5{T{5X*Rua2munhT29E;WZE*F*Lwa$z0e`3Wt80`IJ_q>4e)WuU!b2hd9s36w6@>Eur}nRJR1)q7_<_LSJB(Wk#eQ4l-s54CDQr35>lId%3a8FZ>FF71RvB(sxW z?Kd=vWw^4}$S~H{3~y}o5x6?NCdLH6@L*#Th4%q}HpezK-Xt6Y_>I_RMv26D|1FMf zZe*^P{;;$b;{C^#Mn2(tuY>bIu`P`g62trQFu&d(+sddU+%yyJpRuit)aOO~=}e4| zCt}+e#e~KAo}Xje8eLw%aPj`#&#@hie8NNBFoF;2Y!nmj0QisCE=D=w2pQhhFbXk# z7+^gv%m_s+?WU+yQ8O({u0Iyfc#uFsF%@oqriASFYn*i2$y&|!}qsuHpcsf zM;KEnT$Iqfp z?~oYle@9%3ku7j_dEIO5kl|QfN8;`?BDV>9)7gFbVn21XF^2Gk5#l`0Xd|ES5m-N* z8Z_G2Mc9V@V6hq z`XPRr(f%#8H%HT8{W0B$CA?JPY-2uQ*9|b=jGtk&*n#?QbrX1|@gidBU$^+#Mg@g$ z-46T9@pFy#Z=-&UN7#STh(=81G0)gV;ljUu@wtZajxT?M;`5Af!gs=cZ*=@(VlVM>NJPv&1OJ|mf6>VI3*TVC z3qG>F343efUpBfEUJC1pm*QVB(g}<7H^&zlg@|Q--im+K2zg(`&td~)|K4UqNj#nH z>Lb37vdt(Y{3X=ihw*P3ClFJ4yk(^B!t_P{_r||xtRgJZ`zn5?QAYUWQP@w2f8S{M zfz+q;cNwb?v-BkR{z3f5Mk(RZ=`eqa|HKH|jrQL-59{OjJw_DaoHH<9Cwyuwm00<| z*Vu*O(tiDfy+-DTzWC?w_`=vu_=DZ>_k-{F(x@UV(rcFRl@VSd^t0F}6JWefC^OO} zp3Zvqf&JcugT{FZ$MQO2wEsxjr~Di-Rv~7>-w)%D8)byAgZ-K76TUSXevJO42Q&8O zttX6ViIxA~8M82)?0shhe1iHftz@ic!cRsxVYGkBm_YbVcpiFv!p}w#Vf6R3VeAp{ zmHjhDcZqSlibyzPY(y;m9hC5!af0yqhvEEQ!tX}Vr-ZjFsh_``TW zVrBn=k%QsV|A>SO#(C1;+Z5h!PteWod(ocwerUS{w|NiY!!RE7iuafW5-WRN^HU6$ z_PWJ;&A`tvzG!dPCs<}AVi|rU&Neqv_+02OBNGD66ND?17#oyO-wY|m_}@c#K)VKJ zG-9%UnYon04@3C930In>HNua?H8dkW$M~YZjY()~P9QAW`=bfX%p$@rSbtATXl|ZD zO#ZbnqxNC^XQY2^%pAh#Ut4n*VfKdbubo+inEY#RhVRGt4I%uAgivz=VzS@KJVD{Y zzl8~1&ENy5FZ^4PaIG0jSd?EuLYSG4SjK-VzMI+N3)GK;{+<+nlNn3+!xFgPCxn|h zgyWZs_T9tWMfgA!W3MFiG*1vd8>q4E3B66@OJOgI?Rf;wt0eR_qX=XFi7>Mz#`gGD ze1sYB6{au7i;{#}%}B!Hy#D72x0yMFzh43C_k>8Zgz&3<#CUbP*`f^7L;Hix+a*T( z-QowEIf$7kk3$Jj=7)aa!_0t#n7$~VZxdq7NW`*y>L-jaD=1uiU*J?il9_%8^;}K8E&|L-`6k z0I^KZN}OnB`r*mufg1R-#4NM09OH}hTPDslL%u;Q(r=$Q%ZwtdL;kN%m~GA{EYg3s z-yE}qut@*ieovUjag4tn);rfH!2NJs z;_IgS2cfUV`>ke}#A-a)YVJbJl3@R8a^eoNim*t3M&jFMmme`b;s29~@0eop zW&vU0|GvciX1T!C>x~0ui_m(gDU-(7X!~C{S`o=7gcmdn`4V<@5`qpe;DZ&@9`TOBKRnkc_iNbB793e)JM|KX3<#@|8e#l?C)$ysx;wG z+}FtOS#yHG)%zdk%xiy>={1}I^S9e?I&Vfwtm@~yxgD__-(OGq!>lCS0>-a*k}jBG zzl-?O+1W|Zf0F(*GYCK1TZA*K2r=~!%`&P`UwmJyG|6lACM@2!JD9|+sfeZi@g&0v z`vdjy{uyZ9Ls)!2t1_v+wT|$ca{bW2DkCi3!w+b8nH6{e<3Dp+^w%J(H{qsJ1isuF zL-^tE1-`;6CS1P{eE%)!N-N+`8DIL-Exxgpftal-h5gOsX4X2w^9+sEOKxtJ5f=UD zisTknFms9Wq5QYB#vqpE**v+ewT`g3KekV9XPu~_ACb`B>aEH6tf;$~KXkHYNu0%w zN!-~g#&EKKwbjst`eHtNO>&qun6P+1^v2|F)_lZLzkb4XR-o?Fzd5;wHGr^qUn?@X zr!|YPn9mPO?q%&Fd5KiYdm;Qp4g5%QKdZe**k2^SZ#6CXHY=5|c)l?w`F1P42A-dMhm|4mQElTF za6UMBkTr>LAJAW&Jj9woxG#i1mps&ZlJLjy{OQ%?C~L9AYJYK<^^C-e*>8PeeUUuO z+DQ1qF&KZ6hg&}pe$dodX>zRfM-5z&9B+a1@NZ|Gq450H>X}%L@qMa9E5IxAw^Mts zIh;?0@T(<0t~DMd_D_;Yzt|&iw_eFqe%Z4AV1LExDfO{^xl>ZCkrEd()E{M~qJ0C? zzuTHX7}LMonu?fV`gdC^B*yXWwx0J|g%TIDN5%<%?z74Wqy77=DvVF>huv>o$whu1 zHx@v7H0^o6)m-9YHex=!-;;8`)j{H&Y!r;&m!~{nMM^xK{Cm)P4&%%GHBWiaDyI0D z-b2>s7@zbXwhj`;{5))ZQzQP>Js-Ay_Y2RkbVK;3{K>F_Bv$^6w{D_vOz#mZQsT!c zy$MznV)k!eJmt}o2*W2(MAnBPo=>!81rs`W9wN!C<+wS>{$3~PhL*nYxNW>~vw;G0rrSxqf0f3!E(8Y%HkYClg}sS+<@v!}xT zQ_7Q8G3jG@F0>+SnICFDxmLQwS?orrkD)1fR#1QlU&OrS;`!B5E4T)ZO<86|)xb$9 z%dJAf;_qFJN?Bo*)WD{-()vzfH6A=|ot1bon+E5d(^Hm6yb}Efq+-1yka$wSovFIb;odab^)v}Qi`mpgp-HD`ZMKK zE3m$d&&J#Z`&lWQtwM=a{H@m46h0yr-Y2vC@!KietsiQHzn}7^RYmwM7*FRU@32A} zpnZYoC%A{U_3RRhw)N`?;(Bh{em<6J*$H7=rxGX6V3#@-hR)*^ZPrQ4*D9~ zX?3|w_`j3Qfb^beyVIIVI0DiOG(NC`gD|`u%qP~{A6Da?kp7)ki4`Kl7s>s&uTws; zCJ+|$nQm=9wbn_D`MtVlskMc|bKrh(GG(9jlfat#`)UU)_vIqJ>Fj1GufSekS}i12 z@AH3Y4WRJxP`!1H>1WqnT=|9)GUrC)*eKD!Uj&!il(8WMgT&a(xyJ8a!R zcp2b!2}i6*!q>kJ=cQAQS_cWA3=sQU$E;I?E8u*DC$-%Ajqq~Fk0E zJy3rksb{UIhM3+T>tQ|@`>Qpd@Go%x4^92uDkYo-^#^B~?a)T3zdae&o2eeVlCb#B zMntM@4`__xO(!yTYib?)Il?R9`Pt>Y>e)L8FM<2z;MDqdKoit|9_GixQ!lfl2zQ0n z6_@TAnM>{*1Df&LSzUG43J zAA<2>QR;Q}DZ(dih3DC+H`s%liTGLU9E^8sQhV6h5>IC<9)$gd)IN5R#EXp3L1KJ~ zu)mUc0b338?N?JH?DK@j?iJw!>{ZQ$y#;LiVZ^a51zyCm;r*(&QU}-rS|Pss4LHA_ zI?xVnjd(fChdxb>w9iYd#+y6rb|E4h*H2%i-eLEV_;LDshlA|Fh}qd*qJIvuvk89> zxT4-5yFlW_tRBoazD*ruA0b=}?eR3=UnN%Q4YECLM0(i&KKBl?FRy`@n}h8x5@)d` z5Wh1UYDZ!?>jM2-;3C4ppElm1_Bo01{&#iHJMF->!v0RS7W&sA&oFxcVH{6}+5Y2A zwCz8>`7n-e(YF8i7Huy?d$N4a@MwDlVI1G0?E=C$zD3&`DSaHjVr>8MYh*RX@hjHu z-VW=l>2t8ZpPFFj6FxQr&Nrnc+a-jzjfVMM+9P)Rr?LC(V#0;G2IKYp_TZ~T{4CZ9#v2iSpTtMauYQC1bFcf!KluAZCo%kC3XiXX z@1cVJRK(f|Xm3r@?zcZ7jNdQ0-`+1V`qLJ|D{J7+X%E<~Lq+Fuumd+Tk*MI*W&B;b~*-0f^=NbyfISJ5}PNCi<6Qr%Qa?oCN;9+bhG)K&)Z@ zGweNt@09t=p!T84E5kl1!}0qpA3*%m5+Bvtd;rgf(|j27n_>Sc!?As@3eT|XbQ1Yf z{*1GOB}RX&UgPX2#N^L7JBcv*GtS}9IQu~vj{bZC@yAPil*-?S(VublbQ!M7bDX0* z$Jz5__;hA~o42Pq!^hjNQutm7k4hVFzmHg!_gy_6vA>WQ^HYD|qxMgTDL;?eO*+@i z|D%rf^r$0$kJ{~}K9=8IJs!1hlo;)I8aUA&jF{|Cv@`wePjuLy=&(Q0o?XL!QrblO znHu)*95C7bRN^ew5uQg0d=A4Yy~%d#t832hFqF zBPRRv>?nzq{do@i^Bnf)*-16*C#B7^AFE;i>cI=`0*SL&4CF`PcQBmNTWJ3%u}W{D zBfW)=^cLE`OMO*-3+zte5Y?6rROm)U#$ z>@RcJU*@pC%syPh{__6I?DIA3zcX~XJ)oPcZ}NY+{iejKewRD!FL&5qZht8CRrxHp zze0Pm{{`Q+!v5LM{tCP4bv4U>g~R>|hy4|HN2#yuudr{F7|Z{o{`vM`#N>azo#|&k z-(f%BVL#uVE%kA}a$j1$y+dMk|6Sv_|E{r1WcYOUHT06MZP(bJA(r>oq_j15g~aGz z(%`kW>-w7IyVmY3u`1uS4*%9V{99|^B=s@>Noi~CD6}WbcUGVE_I-Z#*V~Kz?5}s& zU+=KL-d^Kpf4#lEhW&bX7TSCL>=)V>{OlJx>=!!h7ut4rk$?2R*MLI1pTt-`_3qqY z$0DZs+h8}np=SHo;IO~JVSj_&QR=Jm*o!~Sb_veZ}Q^O`-ehW%RxZ?zZr+23lv;b(uV!~Rx>{jK)y8urWkZ?(() z>}|6<_3-6qO4>HNo5afhZFXM_*Kq#4&0&9=9Vf%l|JXaX*|SI=*8^|ZFZUGoVf_iu zM`onGVIL-ZVWe1}yk%Dq7VG)8##?q!FVsH{&nM=ly=8YNd?T#a=cc`F#}du~dyCTE zwWkt(6wcEo4SvslNn&hY%hKMnUz1qn=RLa^!zn-SIr8(K-6s*;rSrWW_MUxM>KC)o z)8MY#bEo}>#M9;XYvAvB+QGerzsI$`$#5PoZI@#_+HF5A!_|1T+kU};{nul=?bl@Z zbanx(zM8h%-buKl2Ky0dCHCipmjV7D?PI%~usCM(S=t`^7s7FX52o$4-F<|A)0vp2 zew$Wm_dqPi!_#-|v!f{dHrOBdIqeI3iNtEX`<0`7%IqQ;ew5mKnSF0xVgIQ4)9>(o z^t3WZdn~gbqHtV4mf2GgYezqT_4lYU`(47gzACdnlvt%-=1BjbeS-9{eI2x?-Hhok zg7mu%IOs_Kpgo7eG5v$~Qp8%?E?Do6I%t1I7}Gy!ACp+6f6$TsA)7_W^eF#_>^#Kg z)sVh6@Q@?@L-tAv$Mg@`g%ltEzUv|TC&HNiA^V)fD*Z!_^bgxXx71Aku)Q8JrGMCw z{$YC)g=6}M?Hv>!(?4wM{m>q!f7rGq#`MqjJZ!hDfi-r-4wG0tUpZoLtP$RD)Dim> zVs`8SasK<5o!Vd6f1K@u{g>9Gj@cU}KCYcx3-4o$D!1Q~Sbfj)8~X>;m+iB#^*44E zg^T{RxZQEsz!dgWe>!0UU^?~Jcf1Pk)PCv<&yPo)r0|{ENx(Oa`k@*h0esu2(~kJR zRELZBLr0yd#v*>~sPokr=MI!Eo@PXSD%IFF{6C=MOgo(kKzHh`q``FuvaHwIN6&9>7O?11WX`2QHS%0qb}B8 zMBxiSe{PyHyk5Y|6#guPPZ?D&;4O(&`2+4JJjV6{CkO&QB>m4on$@HpdULbaN1*-%sz;UX{NAX)hr%0mM?HlxTw@CV9pA!5JJ8tKb!cZ0wMWHQ zzKrShm-*0H+(PK1fo`_tGQmA;`6q&V*$a|$HXHN;0}ZwY_L2hwO(y=9O<hg274WB!qZpwt>hLHe`CePY!;g;!ZoJsuD;^0u+EaR~4;TC|r}m0|`O-UnP=xDj;d*~R2ka48XCl02ep)$jr10}KKxp;&~vd~%LLb1e@IWXyIE9ES5m+EK>De(!;6KU&rb~3*<-E!J_QCgVDC$O z8QTX~l;4Xq-l+Dd`sGmB&Rr}!2=&%eKURFNEN2(n+*^d}thuZoP1c*J$1?Cs$S;@m z>1J5J9;#0-n<@JZXXCdCJ^0QJrI$4hu}bGz7=MI4CI8|V3~vu{L_BrhQ+UG~)K^&9 zsW0tl47tzVD==P&_W$x}v@7%l-ejYF6~A#k(SKb`rSFe*)+7M+F&}EY)7a0@enmVn z-iv;u@^Qs9Q6D~gct3ElVN=i#C%(Bi=1awQ=BL$RjHmL4*q0v0*O)5L6|$Ukc7giW z2k@-iR}b)2Nhk+_>q6TVT-jIhm^=(;clq-nQxV6!j{JzMFBfY@?d|Wd%3oKg7m==- z#QDj%hX;Tqd;9^Z$RpU2fec>f1N2t9dZa<8`_(x~to(ng=O=ntX%t z%i(OKXdf8vyT2&B3(m5L@Y?wN-WZPD#Tvj`Tj;BC-N-^b@D=2$-Kufci6{3)J;lX+ zMUCfyNWyQ zIq`q&V|_TwMdAOH&wt8CjC*R{r}~xRs-4uv|I>c{(|-QbetiAs@9tk}zM%S78(PoR z*1weeKmF`K{j6p`Q|rvGKmB#N{L}WL+NH9m+NI*p(Y}#tkBa|Ydw2Sw(rG|`EBnfx z;{UE)fB#+V=>1qeYTrTGSNxx*qxN6M*V1qQsl7_rR}}MTOYV!n4pc*db=GG(%GEv& zau<9Eucq9^Ry0AZ{8IZ8YX3#-UkUrFy{LT_wGLDq!+q-?g`MkIW!EVe70{NpP}62`Pu`nQ(f#$xsRu_Tc=>Ww`D(rzs4c^ub2Hu{Z8fQ@9IP8IoqAW z?>80cxR`2Js=RBHqrHp$zf^fff=ExrSKP(^YjS6N7i)4u&2(Js9ZGk*%rAT|rWRh8 z%A*N|p9vOrpnN3OnMQJzU#FdPxv%76m(|C8CMQ8180+;9CkJ-9FhEzE5&^jz`ab&2cD4eVuJ9=i+>0b$4ge&$G=pOXFU(2j-vi?Tgy zYi`Wbzf0_DfY4vIVDJ>l?Eg-=fs@m=hJ zJJHU}Jj9cu1=m@rb*AQV{&MKscVW6X-u}<& zHGfQ`qcOFQt>$L|tug(nQw4|Tzp^~s?8pp(J?z|~!lr2LBWEuuV};c9)LxU!@8kf|8& zQtyZU{`%6}N8_YQUyO@2{qe^tp5nfFo$5!5D?e-F&inP>O z!9DCUiM=dPVt9T#RmkD5{LuLa^wY)A4xB%c^G3+mG1NosldI=(N)NGKJs)-EPmOPC zU8~k>0R_T7toP+Od9h#4_ToIGhAXVRk_qQ3qbYivTkhzIAK2IceCUw8-bCU>%bD1Lrcfru{UGR+H8dG`)cB5RaH)qKFxLC1_r%`=foc_?~{q3NC zzVcM-stsF(9_(Au{oa`mRSxVr)KmLl%D-lGZrB;F?Ck$c#Pg+#_Mjer5ppj(PW7nr z<@8g{cT{~YlkH4rOtx2FIXUY`rLW|VtQ6@%JC*7B+9kF-ot05PQ}O)Ug_~h~58Fch zK;{1{X;){Td?)NfeaLe&E_S?EP3%h#`vsgwnBY*TO4Q{(RouwE8+RC(MNCotHT z<>Y3XY)2kC$LFm+N2mP8dR67^OIOun7irJMI>_}ktV5|iRl)ugaC5D!tn6`TKY2dd_(N)3~;B za;AH!djD>`e{EmCs9n^i|35ANck}0r_fPRZ&DW*a7xRenpK%`Xr{u7&CAph@0$lWC zeDA?`KJItfUw!K$CfC(!eeL7wK65F&=J_#ku1P$%c)tqMSMkNZq}b>BbfUlf`yzo| zEaiaUIurR2eye%TH}u{HVvVWue4XIiGeWP&Vaz|yhkWsHJo2?We9qxwXiul{MPoR> zb5)=J#rv%9zTBARuiYfqtM}&-!*d#ti~K*Ig#HM*6N~)41nvTMfpF%w~um8K}Fld)o$HV!xi#;jJ2j07&a#ZDv z`&Syna`kZ){>l(cU)?8F`>l46{w&Fz9Q}d)G+EES`o#Sf-#Ti@RP@8SPH|%8 z_y0D>`q9|`HW&R}^q;+QeWcU-S8jGz_D?uhNzV<`c;V!){VDnV*C>4P{nwq&Y?QbrJnf%>qnRU4c1d&r)EEVOpa$78x3+{M?8lV`=WOr zMLi)G67_si$!q#6{K*@Se!kHH<6-+oxi3A9_FG--g>uxx{Z}8ZX;;M)`MfT#a8^_4um7_jkke(GQ%@ ziswitvoReJE;P_DHQ)7xD?3iE{KI$}`mg&cwW2v@?AE4E0CzZ_ysbc&*ZzO5=v&${%HS73EvWYkQ6_!d3fG^)1@FYL^(_ zCHEmj`glKZ%Y6tjkH>X{#!k?C2>u-2lY(>0qCH=GC6y1M{f6l=4 z4t|Pw1NB3NRlTcqjWcQ zYCpd=?qa_U75S;{oQaC(oA+K?x;}m7-@nUo{O~=;c49RzQ5@^T#d2xfbz&v|e~qhs zo4?~4joY7}!FI07waq<@_UF}p z8pij%@1g7|IgT@GpW9u_bI*&zcMTWmyI3Txqu!AB3m0oi?L>t)qxY)L(fJ9KU+lNP zU%qnim%CVt2Qc4GIgTg3=dr3Bl%5kSIqsur?AqpNS3Q>&&!I*6s`^#uZ4_6}*A!19 zeeBN{`@aL`^KzV~`>MEKi2Kj#{+Ld9jNp(zs>hC!yJ+84W6R{ZI2Eq5LOLf`0$kXs z#`Jt&-H&iy<6>xECwp!-6z+@S{+chjm+jswu*Ps7T4PUBeNA~t$aOYaayN^~64=A` z%XOkp@2)YZhx!-msq%Jml}6I z>DA`HDnG@Q|4ut^Q~g}39cAyDyi4;_)xUFGQFfeMojY>+iT$edT`TcW0RlmS- z&&~cAE&5IEc%(pBy5BkGUNaYvP_lh-yLDf_Bi z(4KD`S9X+MZSBsfr~JK|>NAl1#dIznKb+;H<}+9xzWbZ9TU)hpmrp30}czE4kutMbC~xVRlDJ*S<&lmBbGUZ&>D%HK=nD%}CK^pi^s|JVLq zJb!eyi-C^&9hQ%8UUsSZaq21m|IWVhr#7zasCK6M+u!;56|HZa@i)``49o4}aiTUq zlw6I^{{6wl9=?F>SEYyJfzE1ckIJ6nDxS(`3iVSpf5rUz<}-M{;o|z;A;&9?y-oRd z`rGkk;V10#96^8U(z%>z`vr!57?LYJ4A&WkyQ{;i_p@X?jR}1*jtYG-ze0WZ>t!x@e;e^n2PtNM8T zAKsr-JXMcs9r7TJw|yn|vIWvEr+Kzf>pa`puWG|><#S3nzeMxfE;PSY{-|*R+tJ1M z6P0hpo$>zNcC7O6?5{_gV7;mQsPwR$F1_AVJXPN9Wx2X(o#~iN|{`M!ou@5{T{w-S4*&#@>y^*%k?(U?DXzTcz5FP1BR1Q-1wMsj$6&$k7BFcZ0Yu8iTn^JpsE z8Bg_VXSg_LD4xU2rSm{Pye{m!=sQst+wCd8%jNstmrBQJ=daSKnV;J9C%%E{citkn z&c4_txV!q?yRs|d*DQ}GAP>TC{9c*wJ6z&>DMJ1VwFmq@mz%kz+{2#A6XCvcRr(mN zQ~CSSuPwj+a-H_?;JF!{$8&Q0&X245J3mhB|9*hZ@OwtS_o)6ZJeux*>N{BY-hqqW zJJ74Y^H!VO^B9&Jrla)TOufIL+B=q)`VN}nzV?IV;w!)3=sT`I(S62=r^tG8F%_=f zCs16qV<%VssP}4df6sTG0+%e~k>)blZQ&QHDHsnS#Z(}`8OqCP}F zyJ{cWQ~Qr9T*dd7`}Qe?T#PFZHv8-Nb>%p#^x?k$kFYPEYB$O+C&qS&`^I8i6aI+r zExsxHE!t6jisz9^j^6|H?ISDuU&{XB+lNMdPxXHFzpJOiIY!~%B>8@x^3QvbUA2#` z(oy@~3ak9%``+riRT@+K-l(V1xo7npP-jO^i+Xai7V^BYhu!@+)*GIW_UYLbf30`N zZ9@L{dY59)1?OL9!2UhF1<3BFef&$Y|5x$wIVXI1Rr;+{{@m61bB3#Yt9b#2>lEJ? zFa6A4=U2rS`(&bBiSicnSvCHvemYEkUs7jvfQx#^{;I|!jjf?`X*eGF;*0x@u#5K_ zIOjfJ_yO;s()TBk`|fu`reZjbN51n;s^4RK@QpiaoKfxRQpX=PFTn5G`TSM)Crl6S zkMf+cyZT&%3di!%*|Q_iUpJk@nlTEodVZk3AG_*RA@{xig>rbFa7@TOEGbBEZ}s;} zQQvp2V#zcS?mL&K-YZw{O*^rAK8kWUkJc39|KF1TSN&7|*Tykl7r&3btSdI%1@5d8eyMZ=X_Mn z6aQLXyWPK>kG2p#h<|XNcBtUK`6bS)+-$0x7kSvnEg)F@Fg;nxg)t=Nqq>%rQxo~$G51%LgtH|xs!z)LB8A>?L|M!?lA@D+o8>{iyF z-N6R1p==-<4rm0sjm5J_mdtKvqafryHi$jQ2D69R5H=pP9%Fa1$t;RZW5eKYT?}V) zpz5Dw(QF}$VT&R5a&|ZPaX0vIH+u?x&Dj0$8^_kd?|Jw=1HU}5v>AR|;rBB9^4KG6 zC;Z-lUmlyl_QLOD_~o%j*&+CS3BNo@`6T>~!!M6bWM|=b8h&{!lex4^_$xA*a6O6D z)h00uetF*Cyt56)_8b zd2AbN;M&fvfL|VzYBN_UYwP-jb##r;`ogcDD-OI&hTnM2f*;g}=7rx}_|0Y$wFdBm zGS;qu-(2|3W|^Ru39?Mk%LG{_$fiN+)8Ja z*Ew28EeEc1;Cilhoi-P)=fd@qT3_u+xPB6@=V^Cn^Wb_OT+i1=X!GHEK3p%*MrjM+ zdI4N7)E?Fr!u3M9UZhRd7Qyu*xL&M1qb-K(#c;hu+n_Ch>m_i#RNJa8h3lnoy$r6G z!Syn@Uasxbmc#XOxL%>{)mFgu3b@YK4r%#toe$S5wUgRPxLyg@Pib{sPr>z5aQ(E_ z*!47AKMmI(X{}sGw65^WV@I^kz~=&=&5mj}x{iYEsCFIjxxi;bOX#e94YIEx|6hab zYmglS*)fnE1KBZ<9Ru07T2GhBrtB7DQhmuitP$asl3VN=$phI9#QP8*NPGzK7~)C9 z?8ARHm}da+dE*~IgS7ZEQZUQWD#J3YKC0;?izDwjgkcH`JHLw}rd=^`30^q+U>-o*cqCgcrzqY65>DylE!<1t3ocUFatPKb^4)JjQ+twhY>)R!9>^Y&{Bq)f>}@KqM=3nZk6+Ga6JDkdD1yIy?=5hzg}Z7S z;5!F1c9pk-{urEQ3-cDb#a}kc^v(lK)zaG-?FNZgBt**n^ul!!w z{{IBt7}B$hhqMS-?F1V4YAsrfW4M1z=P!-;KA|^@?idgJXk)#o;RTUH$pt@-@zU%-%WZX z?2;ZfHt83jog6n_*E>V~d~bx1ekj=u^iH2QuW%?YEg|&)w|V z+Gw}N1_2lO9|ruhmC#S^W!i5aF?Nq#M(ulnF8cQ&&)dXTOZ_Q!2R#UOo95ZC%XC(e zo%JBU_d3QtveRWge*k_p><0aAXLuHc!e5#T$nZ3k`N;6>zlO1sW`<`Y@sphx)N`hc zmlTlc`8kEL(E+m=rvIy~zxg2drZScnfc;iu9rW=quIvrSmhoU*@}xt1Us(tH^V&Mu zvK?%$lSAzxw^~p1gMD@KWj{Dwr@&JHyR)5Hfk*V?x^;7?J?2vUeCj8;WWSKwS&_5{ zM(wK1i{n^1 z;dH`9N>03jcq#D`;>E;+i3bs{AbUB4D+%WkE+D?0cr5WK;t|9{iH8vnC!S9{m3TJs zOyU{DBZ-F)uOdI(gae3Is&L|NPUAcAAmSm!gNcU{FZAMl)a}LlR5-``R5-``Q~=2% zNFG7*a*{`qJd)&PB#$C_6v-n<9!v6AlIN2=mE@@;-%j#$lBbhAo#YuL&megw$umiw zN%Cxt_nRD!^RQeB&nI~S$qPwdMDpzn4AXlEX2h5SqD9K zidaX6m^e=hHgWu^lI>()olvQNx=t8{hf%yx(!0ie70j>88ZFbi_JMhIqi}QG%aG5; z;pXG7z`Px}7fyxr1^!7nV=;|WWqIGsO`Io0 zRqGW?y;x69oLG0o%JJn|7A5U9Y7$HFVkus#Ij<*U!<&S$2v|pqY?5jgCX4xgxGC1f zDNWMNfJDZ|0&fTWQ4tRIf3#A~Su$QYYYF;U5Z(yFJHwft)M&;EnuMDZ!OvHl#L9Hb zn`FvzZ{v+%<{HMD2S>1@;jqpP&Ng3zw@+cE%N57_b{NfzvdQ0Us;6vf4*@2w#{x`T zujQCxo!rKoOFW-=0r5iOMZ~ugFD70>yp(tu@p9r7!~0gyz|4hQXpO66 zeSXxm$`teIeZ)HjhHD=}`D8T-*RBJ3Rui{%80sghNtKD~3b$1R;b%d=3zX;RfGYDv z2=5eFWln;9iO~UW>-bi&{&rg>l2@7ghr-@`vjB_cITp5qDigL;S&wEx7PgxVS^l>* zt1_Dw!a581j2>cL5TM$N)*I5B*(_YU57NnR=C*b~x*MBCuossxwzF9uxgHCI^^Vv_ z32xp&e+2u1h5au?roXvPlIsAp@3`i;f0EREwf=Oh*!K!0y)X;=br|V~R%6lM_SFfu z#C`pAod^s2TZD!EER^)aE$nZR7WU65so$AJkv!BA<3y%6mh8q-x~YUCB;Q;omC7rY z?52{vbg~y_iTU^DI_YFLgY-M-i^jn^yF~{*74{R{EhEWpWVO8=`xtA~GE>^Sx@ESs zSGR69*$E?ma!5Z{#&6@zw;qRar?h1O*$b8N_thz+@+hKmD3I~SHYuX=DXjJn_b>7- zu|6nmx!uC?teAL-ESE{Vl=w3JCD_0Dt`XL&#wx1i&rgE-ZCy#Ys+wc}TF)+nx9ckE z1$#s~gIWjEe#z_X0z9=&XzjL(Kt8thHSPz&{-o9cwy5vI)&t!)Js|c;2D(Q>`5iZK zefd`FAp0_q|7az-#D0jzl3Yg`GWHF~MLbyVxYlnI@*(U z2-)O%M(Rh%bl>rYNdCDu(#G|`7y9Gi_m+?-!be@BVV(b3$ak(0t;PP!K>btj<7h}M z#gC-;sf42lKSb;BV2|)Spv`)@pVPk0z3#;BjCE^+`!IdlbddXkceY8V_^WkspDJmS zVdFYAL(1EDGphaj1j_yEHecvx!JqHiG}7C{_;T7zlKXwXw)uelS-@a}>>>9XX|TQo zejDr$!MpSNG4UhP^A<=v)jBOUYitA_Rds}=LJTL`A@N5nnUs&`xe+ojc=P{C&KtKx^2EK#_7&1m+C*qUIODzXV{mU(TuTY z+M+*!Q14>@_4&3BNk7i;EO+BZ!tUE_H{^3)+XZr8CZJsy$N51B^`8(6`(c5s@2guD z%KENbx6sD%Bgex2l3{Iy{Euyy;~`EsSB`fYE3&_YadAew?b6@H?TYOd^SnpFW!lyOtppKyH-b9L~t zbmjp%h8aLJq|FJ^TBfu!Rnlx`L+C747ibQv4|F~Y0-DRN1iF+p2Aa>B0$s&g04-px zfv#h1I~Z)E%u$id(H7PLBs*AVpvCN3pu1Ripe3va&^@d#&{EbPXqk+4ghj%2IU54> z1RD;tf{g@viX{TAWNARpv-^Nn$x>pPC@Z%%x&xH0mH{+Cn*uaYn*%zj5L%brqb-5! zbhvK79?*m*W3&w&8bGV+40N2Nk4pI@u+xBL$?F-~F3_JXuY0>h9YwfA9Sv}aI*N3O zbO*ac4Mw?M0h`gTEkJW!Zvb8I5~*yFbi0hZL&hxzea=cQ^a{AXTpt3V4fUTo*sPI$M;Fe5_0t{TZ+zggreg>{v>OJ5(L_ZIj zZS<31r@j6=Tz8N*L-h-A-AP_|(Y218T_dl%NzEJNbr1bph}BznLuen}xE4xG=WuOml%s@rg#4JmRqOTQ8%IeKHDxq4HeOZ65& zS4nRRAVtpB$+QZk=Nt7OKvJat0(6T^cf0;8T<_4UfEMemA?_}{EzlCZ1JFHsD9{7a zPMNfGMEYDVS9_B+ zbc^=ZNJ@g;dqL8|y&q_Z`(2>z-DN;S-B&}bF7D9~E6g1Uw7Yu<&~SGc$a}kQ02<-$ z33PyaB*-Hr9qdko>nKU1-LJrPta}U4L`hTKH-r8??g2p4-M0fB<4%Ln4EIpDp5VR< zXr?o`%az6ufi~BjC+uemgcepnJEp~722))T8`qXxh=!rW#qGXCaq9^|B5hF&G zXEade4Fk;(?>3VdcSG0`+uV@?VyrOLsdPUpV=oM|F z$Xg0@i&wPX?cV)xy~Fz@&|>e)O`t7#55jec_XyBE-eW*Zy~lwb@O}rh%v%BUi1#O; z<=)dB;fr?OMChR>yk|gC;XM!Zl=pX_mEH?L&wEAhsPbx8!T7-4K;4`JHMj*dfY$*U z$OC}}@ymcV-U@pbd>ZK!c6XfVMF90Sz&}0NUOt0~%@^2HM5= z8fcjD4bbk!383M|_dt6aKLU*~eg-h7L5*@B&RW zOrZA|0YK9YIno;S;5x%-0Ca+JInYd_A<(Ht6QJ2fGoZ7KmOyii5TNsoc0hBDjzE_h zoq*;WU4X7Kt_50PTnBWWaRbmoBOK^PqZiO3qc6}c#w|d%8v}suFm3}{Y}^5KmoWrr zi4g^Kk8u~!Qey&G|rEn2Ughn2Uk7HXXF`ot+ zW!72Xok5L=mhg~pqb_Ypi|ASfM%PAfX*_H0?jeYfzCI-1)6J~1iIAx z0cgH?3g{~H7oY{^S)l98Ux5~yRX{hIe*!HsT`;z6F+D)Hn+DJwrVX^%tP6CPSs!SL z83c5Xc_q+NvoX*EW>cVLW{XZRXEVk4e8LptbA|a)dk=G4tvh*`VYLAoV6_7pXmtP@ zWL*Wcq16d!uyr-i7S=UDL#%6owzs+g4YjTZ+Qqs7Xqa_VC%CU!one*|ZuNlc2&=H8 zhYhfL!S!IP59maJ1-Oe@{opzg?8E)bx(%+=t-)}eVGV`r3D#Y3J=IzYakIfUxLa8< zAfIo=!}U^Y5ymoC2J+b0t^@4_a2;eXhU;K^ zDO|U(SHg9B`)RliwXcWkFuMS*yW651dfV&aI>PP-*OB%HxE^f30@u;@t8g7_Z-u(Z zu*Lmxsl6Q}TkIY{x7(sFcG#l)i)~RCyKGS}CAO%GJ+`QeQd`u;0bA5XnJwz#2&4je z0Utc3~=KkU7EcofC{|6A3wC7H>d%#sDN2MkO0MG-UEAR0&{tb!&( zGC(AoSy%)$5d;)aJb<8rgaaNxK~eDtf*J%5sGy*rcmxdsipo(`Jfec$_ouo#BrJZv z_qq4?Jok?aPru$(pIW-Q*6x}~53}q7^_I852n(Gh#zOX9mR2y<4Oop|ccO=!_*6 zI{R=7opH2<&N$9OXDqkS87nPx#z_`BW3`3OSZ|>-Hd*$7(<~+6Ov~F~i-pQC+wv|r z&q8bBW(%$0TP(DKZ?(`0zQghjdf*~&D%BG2a&Wmfm1l)Fm88v^%COd(&c5E8&c4x` z&c4~3&c4N)&c4-~&a%UsuBF|(5!~&4H@MfEO0v)UG4O!*MDURJP2dslSHYv+E5Q!$ zJHV6P^T5;IqrfxXkAP>rUjom0?+4F&zYkvUJ_s_O4?(@pVbH_pW64X=u6cDWu)# zOKCUzQraybO72Vb)8R{PbP~i^Mkh z!_E8y;MV(pf|5k|Q#oV&=_-2p+xlVI@~3;hME@|jQ~l|AFw>u&Gza+8b6K{3B<$7x zbdB{Q?M(kTEQ!j1zr(Ut!pL*tAf4b^@{?s=P_*36F zqyE%0JN&7Kob*pX&ZqtRf@l2ugJ=Dd!1Ll<7yPN-SOE19eE`*xC4kD{ z7eKWa6hI}h2T)1E0;nVr0aTJ+0V&9#k8r1o_?ZDzwgCZDw(I~ZTV4Q_sz`*Eh}?#Y z+(wJs#);g@MGloB?Ie-5TBNNHpzCT9IZO+n>zWxr*VPh0*EKtUu4|qs!-4=R|Du32 zlxImmBizdaGT>ejK%=iMU=O%9fJVgn02&J$189V94xl>O5|9OM4Y&c^A!?vq)WGh5 z8)4ZSa1+|-d;qo4g@B`IH5TZE#S%yszd&m7pg`(@_CTtou)rJ96V3-NzRrjB3M%Lq zz%~TY^ZO>j7eM3_M7@FqkL_n>9>L{^^LQ}XR|ZqBSPgdods0mn7nPBRH=R})JAz$ zYNNqcYNH}6wNZ(c`pIxBwb5uR%~a#8JHc`*wO6H;+G~=P+N;`1?Nx838LY`ltv1a{ ztv1t2^H__O+HSU$+HRhe+HQfB+HR4R+HQ%JYGb*z9_|&^2C&V#5|*{rCb-vIr+^!+ zH2ZC~(!96D`VzR+It}(6R+Fc_SZVeQ6*h{V_~=L6U5nzQ0%Cr)|`?&)8@W;jD;%PQ*Vi;$IMFVRqV=(A&e1%ENvq^0e4{gMN0} zsR*)1!fv;p1;gw=gAw-Mz!>}M2<>J66Yf5CeShp=*y(vZ)$R#*rrie|U=IYd?Nx}A zXSc&W*d7iR*`u&)G~6EFAA4?gx}tG*x}tJBT~Vc-u4oeM*t@XP71i4lk*dj_h4|AD z>cM8(Y4@W=#GftV&jZbDfqfuiF0v0o%q1e`auIWdh}kA$t`#xY+lvr$qkRNo?h|D= zAj)t^#5^Km9u;NiKp9Y<_S;bA)AlmNKO=HJD{?+3;-44sFNmC(V-j-KJMKbE4+piZ z#X&9W=Meis4zVxfpsNc*DC*Ne^&jJ)w(jMag0u8-+=sNOh>tZ9@v$Z%zM17Y<{@;j z<5954@dQ}nSOX4sYy?L;UIxcGUI)t^d%#M^0dSJz6R_Ix1z7L+7Ho3RuH7`pMR2CW zm}q7#4qtG#!w$}KM1l((*MW;1Dc};v0C2e@A6(%W3br{$fomP*;Ce?DxY5x7Zg$K7 zw>V~lTOA9*9gfGqcE>908Scatp(i`m!~K?U?{&NY_uIm~&+#hU`-S^}V;52#a_j?- zI1YnH9iM?6j<3Lzj!16<=We0~$O+w!enF*E%%kU7|0UI4cJ7D94y*%Wfa94)3BF?0cIbbzX;SMKc zKHNE^Uij-UoE>{~A=FzIgxuL%VGD(2Q3#FGB_T9Umxs_e zT@ga#v@L|j>Dmw)q3c6vRBjBRQMoyU#^aU{JKS4C7U8@*LY9KTK*$ET4~0Aj9tn8~JQ}hU>`-cjyinSc92`n}l0~5_uM1#9guNuR0JS$fl=de_hdSXN7g`0D zhi(8XLsx;5Lf3-Tp)uX`yj&&kSvbyCpOM?%AQYz&$VYQE)-%cyLiD zwe^zF;`5TWSLVN}Dz z1xJSsO~yPER+?;Jw};UkoeS~twotegRwej?;LC!qfd=+yIK^BVPIKDhAbwp07W@r5 z7{I3YAWLfxiZddTo_X6NDb?;sT8sBa(sg)& zMXP^%6s`WdMa;b-&OVXz0g>~eD4I`>ASQZL6s`UpQMCG>jG|fPbQH}hXQF6UIU7Z@ z%DE_-RnAAz>VF}M<`x!BtG_;)R)3FZnrAH0G|%`&)9N1-O|y+Xnr54@=xOMy5z#c~ z#6(jc?iEdQPM>I+a}uNJ-XJxa?hOV+--GfOMN@C77hEEERPdajUkrsN3NDGEPZ)Q^ z%t5N7G4sKWm_^{|*rlL7j$($zQN2aPQEkV>(Yo9#j_yMH#8E9J#)&6T5p#funJr@G ziI{^$%pwu9M8q5(N6)IG#q2#PxB1!rc_7$C^GZ zj_!VE#(Bcs66XWXjtd0m#nH3Of;c}rw-j6v_XOA$w+dVvw-#I< zN1st{jGGVl=C~&ie@k3A(r%5Tr?4Gyt6*u5TMO=v+kiNG<2Jy(FYY<;K-_b%9Ey7h zJQBARJR0{J*b(<8crtDecsgz$cqZ;8#6KIi6+9RB8hAeLAnX_7J_1?%r=UK*1N4YL z1zO_20sZ2?2ZQ3zf%f<}kt!^H4;T@@4~&UF2=oR@c)TtJckJ;rqRZoHL|4Ysh@KQrBey!9Ms9t4 zEXLQ&_{GR`p5Su9^@3Xk_X-{nJS})mP~VGE1qnt7_7Th!%o8jTEElX6Tp_qoaEIU_ z!IOgL1ogc|&Vut2sAn!npq{xXfqLeW1nQZ~6R2mdNT8nCmOwpoZ36YT^$FD9HYQMi z+nhlCZA$|6x2*}(-*zNWe``;m{TmlJsJ|UZp#F9!A+W!W9Zon7`;i3d zbw?AZ*LC1rc+-lopBAM$BT98vlf)!G24WDy$IbXLN^P`7Qr3D-Y)FBg=L?x91xa6f=7j=L%2_hIHyI?AH3w@~7SYK*2eP3!dkG|AumcG<#etoIcg8EXc+51wfh4rOYi|9+O z7Soqntyf=~CHnNG_Dbwa?UmY>W{J$cG)oNVOS43FUz#QI`qC^hxG$A~^`q9&_oLSF z=tr$%=|^qn*N^rzTKmzu_CP;cg&zd_;d?J;e1n5DkU8!o4P{Y6qnT4^0=rpg3VVGr zh2Oy57Md&d7OAD|YhfSD^wkuvg2f1(%*F_9WRr!?U|XafsGfy*bbfpd41d|ax7RM{ zd?>xth%{Pih16M4ioZ)y!*lhjR!G%h(@vy=QaqiJu@h`>?JlVB;{zlS4kdr27h_LC zol;#=Tcxg+x>M?LsT_|Ply0@uol=iWJprZjwpwI7sXL_}m&(1>@JOjnsV=FlQddje zDfPHi?jzGnbxL(fZI!xO>Kf=z?5oCcva zr}URgzf1aCq`y`A+oXTB^tVg@PU-KE{^Qb*FIlPQhl=w{f28zhOTSb4T~b@6u9mt} z>T#*uU)GmYr&O2J3MgG?tMspyx>M?`0JZ-dhf=wCpv+IIQ>sg9tJKv}cS=1jmE-S_ zDW6EGPN^=btx|VNJua08%XCtmQe9G8rAAoQ>&ccHZIj~#O8v71x|n@gy#`9xP5LSS zp|%}L2H(TF114{UNWNQBQ;xUxzrY^ZBpB%GJFq`u0KL*w$yT|EmGU0woC1hiZ3Cm>7`~% zEtlFNwM}Zf)DEdER;HJlt!bQUcSXOBg)IAMo5j6 znl05SwOp!8YOB;XsjH>7OWi58L+Wv<_?o7AUa1jMBc*0bbxJLl>XOQ1R0Qjbez*U9>k8X+}OYPM9T)N-jVsjX61OWi5;xKy5?<{v55Db*#l0!s5jtMt#3 z{+2#!x;ClpQahxwzG`@c)MzN>lP&$_Qd^|9No|+fA@u~5=10~~<|j2f#XxzrY^c$JpuuPwvW{Mw|pmaG2NQg=#qxm0_r)YVdVNh?MG->XOXhn|+A4Lm)SXg~ zOU0|Z)bvuFQahee+u6BM4R=Xx)%?$?_ExDKZ(x1mSv3*wsrGECEgh=AO=`R5Kc(8+ zrFKYVU#j*9so7H7zf#N7Ar*f_Ao^j1RJ>44T*pc1EE>O@3x5mVJ3`}$8KwHD+9ovu zf9FEs*;3o3M)<4tcB$n7s=q^OcA(5h(;(Gf9xT&Ijj*cz7O5Rl%WbNi*=4xYju6$~ z(L>ejo~pJsgENZ>S*^>znZV)V4`~yYSc4l2UkwRJ z)N-jUQro1qOYM+~*So3dq?SuIXd!#e*aJ73zTg2E~IM`yJW>y#Q^4 zUgQ9~$4tD}Jlb%t;VHv9!zRO4!<&W!h7S#27``(6V7O>djMp1Wjbn^u##zR>#s$VD z#wUzxjn5iiGpriAUUB9`^Nr>L zbG5m_Jl#Ckywv=J`8o5;=GV+`nLjjtYBpQ^Eisl1OM#`xGR<Ov{mtrc>t*X_ z%eRfQHQFAst+s8oy>I){cF`7OPq63M$Jp!bbL~IcFW3!^0EgYt(-G@f>hKMDAmn&R zV(7fkXF|UXb%f=IjSDLabBEQ0O$oa%?18YhuThB67hb-sR*yg{76^iyvV?)sHomisZqI6L!wHf?unWc z_4lY}qYgx!in=j6KYBv+E7AXs*2kD*Y%ysux5kW$c|GPx%+E0wV|20B*q*WdV+X|+ z#g2`g5IZ@xDRx%ugRzTZm&LA%T_5{=?8~t`V!!k{8|xkCi0c#Qj4O$o9ycfMvACDw zw#My=+aLF7-0`@tFf(m$EWGoVoZ2R>4OyHy_0& z@X@S_kHO#J-Nx$pI82bYv#IKH&hP5mI!8;7UW4n~^*>1db^&KUM?^DL`{dnu@d&(XBfKtXkP|EpX#l=5X z#`8~<3jS}Uk{?wj@XwSg{<%`aJCu5UO1X=FsWkGhlqvj-GL3(y%;4WEGx-n7{ro3o z7XMk9&3{oI;J+$!`0vVGeo>jn|5P62T=x*y>E?5TZUHyx7IIJB!`!TUgnR22abMk| z++X)M9;jQ)gLRK_n{F9*=$7+P-Qzr5_XO{$dy+@$R`6)uN*=3wipT3#@!q-)o}fF< z`|7^n{dFgJ5*D)sTk#jZ6BrvfpRtFacQ>ipiYFWLr(~$Q3Qt(%pSwiWP^tTks(-VG zs=*biT5xAf@u$dmeer&A@)zZ+_F;I!BL6V_g)`|#BUJyhrK;A;@AzE!>xfLZN@~m$HU6kks*Xrk^={lCP=28!RrQqTsXM0nJ7jqxgH``z zlUhHfZK~gEtg6#;RBe>?@XXz+-!1LV?^XZaKU5tXsp@S$s;;kAbxfJ6AIf$vmFaV& zj;d3`V^^s9*`KO9@kB`1@g|;ZNQXOBo$jk@Nwcao`&GR~Ue_JdRsSo`s`|FA8 z{}WI6l;00OtLl>daG|eS53HwZUlO6JU22J}_ndoF`++U0w#j~$zDe3;Kln=O2lD#9 zmKvv1&yzJ%jel>4s(WPl$I14(UQy${F5CBsN7Q%@dH${IRR2O*FGKEN>|tEjZ~O2G z0<>`)W6Pmq8}Y_O=#*Mj6Qw?c@{oO`^y{Ubwc(8out%L#wbwaSlhH4ph8@e5NO#W= zRhMGCZGinlq@(;^M*k(XqCPf3KYEd|7oqRi)qD!&dCSp$6z`dfs-8xEyWrm|byc3~ zUstH=`N67wF-X-Ul!M|waaGb^!L>Qvdsy>hB@__@jOio+$M^I>@x*ZI%I>h=BKZP$?>tLX>G`iqv@D%&GX*7r{750d^1(*LgX&zHJF z+CP_y8&uIw&&u!~(toS;KPu~2n+JZt{CE-dT!0-MYQH^LKWW@=#!i$n5pUU%_OZBb z5BS%kUj;y?O8Yx#SBn4R1F9ZFKPLYHw5JX6hTNy-d+c+3-4XuaVl{kwu&Sfve3H|s z#=A}S_foCDOWk)=4PT9XsGM8ir}6h7{G`Ls&!dpPc%v5lb8c7LM=#5DNUE`in*OHA zYItBK#w60+w^X%j7vuGnNXCME-RBT0T4ORnHTN zrw=N(kF1Y@GJUR}YS-$4%5%NEj%+BsxhMZBe#4TwWjIO-X1c*Alhev~aB-T`Qdy@BeAIb{;Li2Q%=7VYIL2*TQ4QsMm41{Sf*! zjR(#Cria?UvM^swMm`xBuk}!x_oqOq-_3w-a;y42-jLi1|F0u)4-S2|%Q&TY8<9VS zYuBlj=YPuAi19_~wDj8e(8iTEp6I*_5s%)Kw-`$8LFrO{W$baNc3z6N3jQB|!FmJT z_l_E_#naMJyk{wVCEn-<)xvjvt>!xxLNsj*)zgP47H|7UA|8LU&b(xxu z^8Fm?D8Exs>sGbBwew`$ptjd*f5)>5!YASSy4DZX%URedpZ`L&bd=u(ijVfz+F6-& zsa`1D1AeXFXz3^)AK1e%uTy;O`m}lNo4+v@1bbJ1Xcxa`|39VX9hm=dKC9F%FRK3A zr2np0RsXflpZPP^0i@UZm)0*IyF;A^v~{Ift{XK{X`P|_MQt27QBO4gYwLSJC=2+y;I?*^Ii|7b{GiN>i=r(n~QMDrx2?3>(2PHec#MstQg@R<9?UQ z^_x_`TU39n)a#`-pnYlGPLci6@j2cckMwUmrry{2K8t4w_}@#%90?tPdYuSulJ^Z$ z-e;@^{so`m*#kNh{^`){Ls(;>zPPRjpf1?wL*IZt3O#+0v1QO57*{Ky@kqZ08UWn@ z-3)ym`WEzM=xVHc+o9=CGPV;s66y9p-$Oq8p;Hk4A#?)lpFme3-sjL$-Z-GacjK1? zpxX1tlooXy{t%_s%YjNf8&Z7SPyYhd`h_;%P`y)syS%=&`*mtRUWLB#AzmK?rTE@Z z>PLalhcVC6c>NCLBBl5a*tPr|qw&iNGF=SxUfEByaa*%OEw2{;1n$GHL%d}URToR8 z^HM%qJWZ*;(7bUY>N64H)Lz#^ss8hzlx`@L$~7FCi~B*Er?m7GejDsszoY(6=hx<4 zzaFSt_+PrH))U2_1V5#(g|5$53+ROosYEfa;*FW*~{wv{~M?u+8?3&i4KIv9l)D7p-GrW&O#^rp`Krhuc=n=T7T8@iF;hVpVRhF zwD_9V$@+_JdwcYJF+XtJLn)E-zsIJCFK&UC!4Z z4`u8R_z!GX*DtNTFZXM97v^7@pR{mIwQx-@xBpLmE!~g^yjJi|JeOh~q;cZBU)AT} zCO?f|TIXNFxFF3bR^w~q`hT0wiFt#bKezm*J|}9=(VD;Yg4!>;`YAry={~Njo$l|t z`sx0guQa%&vZ#7rOfCKDn!(*2AuTT5r1g>HeszpT>JvKaJC_e!5@o z>Zkjnu6~-AyZY&VtE-=$ce?s%z3S?x`LnB^=I6ii(|p`DoaXNlbP zboG08@fV`K1H1TtKtG^yp~Zg`{;u`a-A}(vs$&ZCUOq9QZNy}L8;(;qrhY~225dN!BloT zn8wP$bmjsx@OLr_%Vcga3%^RK;CC>qz#H)ElnUM&TLa#RPm>ikklh8|#2UeD)(kq? zR4@m>L8+jWGr&Cj&ZL5}-Uk-oHzXC5cosMqpFt}q_gwI1{BDqf($5Er*g|j!djuSc z-&a#`C5yolwiLXTEdz(K$H7v3k4nKCYFC0I*eY-&TMdq4YrxU$X>bf%2j0dufMfA% zkO~{eHi5UZ=fOMhxwnEVe+evSFM}@j3OJr^11s>$kP540uYqoSGOn-*Y$rI8?E)vU zx4aA z!8h1(upQs?RdA+L;G66#a2NX;+|9lP-(vp(_ptB5z3d0@ZT$U=!roy&gYU9mzAdMN{p7{+_kkT9O3!sAZzHt8m zD#*njZpQuL<~$H?1;np+^I*93Al`7mZEzbw{5m;z!0iEItnpB|y+DjL9uBt!#8~4! z;r0PB)_5e`ejvsgkA^z{#8~68a0h`HYdjuqD~M6XdxH+10EY0sU?}eohVdjYoTq?2 zcpBJ~XMhnr3ykD9fKmKLFq+>4#&9PX%X7gvo)5Si3uf`#!RvV$cmsEVH}VQ_Aa{c|@rhtIuL7NXGMK|_z+7Gj z=JC70eBKBa@Mdrjp9&W8>EO+L26zj<2OPrh1Bdcfu$a#ROZWret$Z#x48IVHk%Hd? z#fZSKf1*F*w?5II@ynj*&-fir^k=>l#Ji2bD*RF>`ZIo)6a5*#!ioOOSAjKrHCW5n zfOY(7u%532@8TQ42L3GA$Txva{CTjMzW`3*FM(6}%iuKr3OJo_1MlYB!5REDa3+5P zyoc`u@8!F|`}kX63*Q5_^0&eJ`McmOz8{>;-v=My2f;b~LvSuX49?>pgAejgz=!y! z;Cy}zT);mE7xLra!}zUF1;1f>3S7*;0+;Zw!KM6L@G<@$a2fv|T+V+0ALl=TPw=0? zC;2bn3jQm&lK&1q#V>;E`Jdnh&J_jUD$#+jas#-7o4{S%6Wq}${28oG8SB_+zu{N%D~l%3;erM z0Y0a=!RM8U;C7`7+@VYc_bN5u+e#hyk#ZOKvC;^hP@2J$%2e>IG9COunE_r@?g9T$ z?gPDat)N*q3$*DT0PVWDV2tiTFjhAoOwug`lXZ`P19gvrH|Z9Gx9FCFMY?6+Xx-!B z7~PYgTelLNpj!nt=vIS`x;5Z^x~IVw-8yiAZUeYb_bm8?ZWH*V?s;&9?genA?j`Uk z-OJ!Jx>vwwb=$yKblbtLy4S$nx;MbLbUVR=x?SK0y0^g3bbG+hb#H@T>)r)_)$Ip= z)4dP=p*skA>OTa%^oK!<{$tRg{{#%ve+q`{kAd;}&%s{$<6x5h1emNp1*Yh~0#o&0 zgK7G2!F2t9!0YwjgE#1Z00-!Q0&mp+3})+p0iF6^!5sbXV6Ofmn5X{}%-3TWumZgf z9HcjZBlIS4q}~%8r8k4K^xoiXy)XEH-XEN!4+Q7wgTV*&Ht-?61Dvl91sCYU!G-#s z;9`9wxI`ZfF4f0^kLlyVW%}OWa(x2$xV|sALEj&IMxO*et4{$p>eIkY`V4ThJ_~$7 ze*^fU{zmX6{Y~I2dMCJ5p9^l&=Yy~62Z7u5h2ReTE#PbVA>bSOVz6C*E4Wi%3cjfy z0q)X|0(a}jfN$x?f_wG1gKz80z<2a6@LhccxKHl}_vb{Qn0^a8JKE#9LzL431%5qf;SjefddSy!5a;0z-+_Q zV7_4;c(Y*xSZsI}yv?u)9BX(U9A|g|yxs5;c!%L-u*~oZSZ>$`x(wUF@rKvH3d0*< zC4P+)BhIi3oM3nhtTXHZ>kV&%jfQu@Cc}QP+3-F%#c&XuYWNVm+i)11VfYxFY4`-Z z$M7k5ui+SYpW$=xF~f0inc)Pu+;9qf-0&6ngyC!ONyE3`8pD6UwTAD(rwu=V|1kUn zt~2}$t~dMwZZP}`K4bVDeAaLg+-Ud{++^T-%xnf7_`JaYZZ?>}7Yv@@iv~0JlEE9? zV(1`^8th?=1tW~{V2rUh z7;8)bLCmoW)UG^T(_#xyY5m;t63v%pm24Pd(QMli#86PRgqg89Z=u)vrP z4l)h`2OA5)Ta34WMaCiE5Mwb|Y`hgLF_wb28b^R5jHAGj#xdY1<5+OC@pcg3vj)c+ zUEnxl1z2WugXPAFpvzbVjyFyQD~vUu+gJxqFx~}DG&X{hjLl$;aVl7AoDS9*XMpv_ zd%(Ml_kj(@RCzNTHEpXn{o-?Rq|G`$T5ncfA1 zP5VK+>3z^)ItYfCJ_JKehruw@$6&bW6EMp3DHv@!2F92^2V+gg!FbaNu$So+*xU3K zc%A8Mu&?P`u%GEaV1Lv1V4~>_|~RZtv&Rsy)}t7#^SBkP_b3IM zJw|}79;3kfJ;s1@JjQ|#dfW~^>`?|T_HcpAJSxB^Jlx<)kBQ*Z9#!D89+Sc6JZiuf zJnFzL9(RGScr=3BJ(|IGkE!5pkLlpY9y7pSJnjL1^SBSZ=+O%5JZFJ=&j&yc&$(cL z=YwFN=X@~8b0KK;d<3+6J_?3-E(Vi5mx3vt%fJ^r9|zmLo&*ngtppExtpbmDtp-2w zS_6LO^)&do*E;YEuMOZSuV=w8y*7cTy`Bfpc)bAr;Pn!C-s@%XSFcyVi(cEnKfJbs ziupA#*!+e8Pj(=Bsd*+e=$42-_4=mMRPdFEj>Y< zB@#4QqCrnfEa+{C2YoHQ!9Ys_7;NbahFkiBJuOLKv?T?MwWNW)Eg4{fB@66txdBYF z+z6&wZUQqbPVfdxE_kCQA9PvVL zvWx-mwu}X5T5bpLx0HdiEiUjOO9i;V;x;z34?J(ee$pY&G&Y5O=II1G;GT+K)XoLZ zz&(xq*E1hH5BGGYcnt#eUTN%Z=Hpce`oTSeg?QZphQU3P#d!?@@m6^3NF{m|gUN8; z%dYpj6&wKfeJszb6fA(dg$?x@0hYks%0_#Q0&j!+em34~3|I;GEW8zdELaQo9J~qs zc5n{dbMYBx8Mp}Ud3YbZ3w#3Zwamxc4f=VfVRy>zJrN9n`yVU{8^Zr!F>tSAeY_`w z{or2D(!FcIOt?3&Z0|ZS2kvKBk@sETP`J0?ect$c1{UIzhQHvLCV00`GrNsH9Q**d zD0nXTx8MiCCBgIY*A!cWXW?%t&VZHtzu*+E*m{F{TLS1|>kE3>`hyl*66j+~0sU;K zPaXlw4BiXzXYf9@8^C_B&*aIl&*ay`K9dhb{Fyu(_WSuT*zf1Vk=y-zBtmELJ7Af` z%VC+t$HOw4SHm)!*TOQJ*TeDvp9aeV{BBqt;4@*F!{@*CF<`5TXdWih`Fmc_geEQ@(R zSRUg8VR?*a!}1ucdX>M49jimwe>%m#!@kj<+(YqK97>duprj}Ru%|La8Hv4+iAp{8Fj|#| zl*P)E%35WU^0M-}vPXGeIieg_zE*xzephrli!N9fu8Y(4*JbFkb%nZHb+_p%bdz;W zx_fkUbdTtk>sITY(Y>VGuG_8KuRE;!O!t-Ud);{**L&&%^r8A_eII?A{ziR)zF0p> zU#_pxH|S^RXX_X0AJebWuh(zZZ_~f2e@Fjs{R#b#`rq|>gSR2r(8CaC=x@k3lo)0i z!i}}YmyLUk-xz&Ok@z95N>h!g&Ge4xjA^3By&lha6na*9&hvcK^B%YkVasR*jKkL86|26-A`M>Xf z#Q(VeH~v5QU+^~s_ypJjA_95`BnR9OkQXo{U}Qj9z@&h?0`3l&6|f*+X~0tf>jE|h zYzufZ;N5^j0mlNq4ER3ae1K9K!3n`B!J~s+!BxQz z2QLd=6}&rmfAHbpGr>A*h&9PN*ji?tVtvxO*1FNU%ldEY4^|IbPul=nsqIc%t8KaM zdE38i$86_pW_y%9%U)uiXusFK)c%zHANJ?%+w8mS$Ly!=qa8CH^BwJu_Z+`Eo(wr0 zq6>`)9U3}0^u^E*LvIXwIBZ$ihOigIc8Bc``#kJ)*u^koxNmr5_;um=;ctb17arat zuSY`9TYJ9HGbAD|A~|AU#Gr^Z5t|}jk2n?)8+k)yOXM4o`y#)K{5{eXbw`vtsy1qI z)IX!%jS7hF9i0|EIeKmM!RWp*g)!4(7R4-&Ss$}G=AD?6F=t}liv2V;Gj34a$he7d z_r~2AUl@N+{KN52#XldvHQvdK9gU;tS1+CXR^h@EL!FV0@{9pTd!~Y8JhyK|C2{(%)~9oC@rSamjFop}c9%NAN!@Hd-4IM(CXfa4h)&*IpKV-t?&a6FG=GmaNy$2J_V z;@FO32aeZpypH1y9PK!E;&>CsE*!gYyoKXmIQHP!i{ot^@8EbB$37hUalD7)eSUx) z;0Ljfe;B*?hp~r$7(4ifv44LUyZ48&cYhc=_lMahIR1^}QyfQe9K-P$j?Zy)@bk1T zVwF3O_3J!4$@N%M^!!U6gwHRE`Ds25pJ0sR-{5nkZ*iQ#@gE%D@jLN3#-02uuf``C zb^J#hKjAZ_bG!kcW;FBv;`jx}c^tpu_zlPJI4 znCQQse`in8kMm2zv5l<@*~WZBH}Q_k{^Ztt;)kBCPH88FD* zlwVoZ@`)lJN=ZEC1;Hx8^UD@#gbWo4yJuBNIAXG4Q)dSPu<)9~r_ z?$WBe-8UwsC$jvUYSvU??N?FJRM#+YJjzayE_svFQbejOgro~+sk@=d zRgEjbwKq1oYMX|;##g&VQZ>Rr5f{Z^11`mFZfvTnaWAzx@&NXs*1)-NkqJ&%8Ih8OKH>7x}C0|%3WPK#MRI^$yI$Rp&IGZwI!urx-{YJ zEN-5=qPo;w(cDngG`&mu&iI+ag>I1N9^X81qPs!XGu46`Cax%}d#<^n5=4^1+6i?H zHRvF9wU_c&qhBgtrYPQJttgC_;$%^roaUNM72cYEh-DVIpOB zrfQT~v5sRSTaa z3s3n_;geWFb8SU=5*ylFT}^!#&cfWfntE4*=F6{bu5owziW`ulyRy46|E^|NlZ-FB zYSqMAS5tEX<)=1vXMZ2*s%|E8@%TI46;0GA@Hi`|`RU}tQ0C&=>gl<4)zt`Bt!jy? z8r3K?eP}I1NyOl5Xs&2-S6&`es+HsNfXfPXd2mTXRZUe>)fD&T0j0NzS?n@%=V>rl z>QF%_)nzBR6dZ@M6BF{LHlvzpgnO{7aZ;(f2`*8v zQuo9fcP)7@E5J}!jl0s>FcFP;wP3oSuECw{P*l}OxnZc()lST*n+A7bO--|CZgEB! z@@wjwrfZ%e*WJ@8!6a7_!@$UGZfL+6OX{j>o7@dpCY+U1T(uSMOI;2bUg}OsY?!;z z-7v*nsSeId{*hG;O{f>mTvSmCF6z!Jo61RJ@bW)5i5mYCItFG=7PIC7NXasVta1W`fZycGdO+6@c zwYzp=(FBKSDhgGbnu0Z#+UUuwKKWWrtOkszbx*6ue1m?cO&Mwr z=zaysY$PJpHE2a?PVUm?oh8t$&>=3YG1F3}C9}dymky8Cfw~$qGV(KXbMu_JnQ2+6 z`MDX1iAnh>DLJVbd1>j+q^#7W0^AKHC#7`nGopj4w^}L8IV2^8CFiH7<~b7!QnNC$ zaIch!l_fK;ATuQ=F()NGCoM6rAT1>=DI?`CdRGcdOHRx!$V^NuNK8*mFUU$tOG!^o zO?4*a6`+`TxI4?t$W29ttaNY+YF-Q}lx%!;-FWI3WTSq8aIspFpZW#)Y0*t#^(nG0 zQ&?tRa$aU)QnE885t5glkHV+qrRC?QB|4K*k`r^BNy+)iNvW*RnV!m=)%BBHq&1bG z*8kz`?Elh?{;gS6C+4J-%v6*(wRUQ$Jo)ZR(KnoI4cY6cA?lmQ%S2Ernu3X|p%iC|Itq?W3=%h}-8<{@c? zMeUQR(^CJU10<)h(&>#&?wWqX+!N$N+z&IOs}d`Hzx;|CS4v76OLgYtr5EHSrsn56 zGt*NuQj>F%3sO=N^HY3>lH$r)liqb-}T(hRSo`G+2yV83>)WoSA7RivckOfl)<>N78|j!dmKR0rMumAEP^ z-IXG;RzGU`Jof}wb9IvlX)LSk;_EgJ3NyQpqRj5YWLWoLc)O(@fnc>=)st#{O`R^} z?Nfd&Zm%$V48hYwj(bGYgiNM}2&ZgAnGuN?g_+tY%DO4SM6s)<_QK)9npk)Au z9EF{Ugh?HRGE-PYV!HommTu^Pfmv+8kh;odJQcD5xT~Ck2a&>>dfc3#vBfh_9tKra zb>l#mn408F%gey%$;`?rNKeYoNJ~%6Om`O0Vvyp@OUg*i&CN)2c3sHwsv5+4G=11e zC(B4pPs~luNX*E>?4FpMm7klMg;AN9o`=-QczVUK%1BSmVabVDRxm!(bDTNJNx5k` zX?f5zJW{8mree9tO3uj1%Sz2QjOT24xSei9<)A=j*&{Pet}bj;VdhMd%#%&c^$GcT77%4H>WQ{4?Exoi|# zr*3Lv*@(ij(XN{6vLWuuDwoQXJZ<63>)uOB3WpBOzsxqWxG;}08*-UFcSvzw*|7Xu z^Jt06XNhUpV@S$Cxsnr|shFX1a&z*r>yYMzFEcqQCoMHUD>p0u(x^{K&XGP0@k<`M ztwPmZ3KE`foq4cxXdYez*3CB3Su`S_p6XZ0@=$|mnFZa`Q_{SgF~jmNvtPwjI(%5+&_P`)xO+~8-MyuF+$ z?;NVF0)@p|yA_nMAt}kjy2s8P?7Yk}WaQ-*GL&8xt6*r!@XJhOa5gr&YsObk$J$d| z+UbL{TaD%xIZH1y73bWXpF8}rXw(miOD?kx${(6PtT4B5Xz67EBf6)?1K+S=&N1DM zstHdE&F-=?%p|zeaX}_jSCTYJ#r=*;y<6$h6kYndoPt~|e_B(6D-R2+7}~TmRy=|B z$<)22N)bZq1D@&|FSpZ!i<)8t9{I1H=E{&7S3REh#MY3=y>xnQ(mVjrFby zx3FUo?QWpc(bh=ugwFC7Pngh%J(D^)Q`2P(Z*Wyi7MnX-F4#e$CsyGts;ZrwI|qNa3G}P5#d$ggcctU3gB`j=&wYJh#U03TCHQ5<{I_-1@oZE*t`aq%P#IK-o@7{PSQiEFJKUnuTADN^UHD5DJ` z>f<6326PkcTw!PkzkJ@sqi4PFQ$v-y?`n2q$3&dEvD1vZ2wbn~FL5{2R5j9;H@1RA z4DFO?Rq;$CjN_?XrOo5jC2m+VHj``IqVqM^mo~vJPN$Bzs|OB4S#ZliJrKJwY9ef| zv;6TD44r^BsqqxeXhWmZf!jya6+xIv@`t!4R#k{|sjiad@zpTMF?VU>ud&}CcP)mM z7F5$!ylRC;8P0hkW4}!g>RCpQQJ=!MJa5= zjTlv9Ep~ViE+%!%-k92PTU&uW8#u(XEE`&fOLB{=$)BcPNMR*4GWt0jXe*G)CHKDM zxEVePovji<0|r)?mC3of)2Jq=sa4HFx?rZt#0gi-=8Xo|g>htTX|jk0X>i%OxMp1FD^_X;|G<#K10=x_Y4VtCqq>Z1YrAsvdmA z(xi@75qm;aLpMK4blL9Ya8ykb-4bJiP|YIORbA1Hoq4yqNVz9m83ox~JFqjo+AUFm zSIyurLOXMi4RF=;*9_~H8omFTsjnK=nHuxxcsGrntET^p(6Xj0s{k}ow> zSHEbfu7;YrDej?|2fNy+bw|3e+~M;AH5-wvy9u9wXp@=PJiTuw0ENrB0RD2|hu3FbH9lb)_cUHTd6}Zo8EE`6l2op;4ORlT7(_P$* zyP}-B=Gw|eVZ&!27z{8?Z*r@a@tv-+NtBa%a@x$JOmRO{O-|etFmVfjM3}f~F~t-} z-M6cO&aTd|&guqaHXX?jkIdTh$Q1#!P}5>wL?0JnF>t#n34NTAUrVk*bZ#CT9#OkV-JIP%!89v$! z>AczzwTL0i;@())-z6IgDQEjjHsp*|k21p3uDbz?AGxV6#0RYSBuA|yx|bJ`@Gw+W zS&UCF#9DOKNR)cGyRnHr-YYArnmDOx1U@CDWY}qpV(48lu&rhhkd^PYF0z74=u_ zm7xM~(<8mOX!p?Onl1*qK`5Qx#e(|7J|I3RMQ3QjXL-d9BXALv13s2jCq(sDs*+J3 zy39nEQB;Nb1HGuqRqJf1n1qjZD(C}Mc?U+N?{pS6(v3dd_u_nL!%Lq0+D4@5e1sE& zps=x|u3jvyRJd;8^l?_#U>bF_wMN^6!^O=J7G$+=UB#SN*VH8vY5?7pN{tkBcU4hM z^-+qORv0R~dquC6L3Ht0Zp3qyC@=;^m!SOGT+AYuY-;b25egfJqJts-OWT6_N?N;D${oWg{Ge#vbV{xo{%zeb?Ch+J7}n*Oh}Vriju?8*S~Y=8BjA-L1HY8txlx-zF>Zmd|fR}T|C zmm2@dWSAeDuVPk*2ufFh8yhjHU71vkLo4bvqtK2YMY}Swc5_O1=huv+4Xta(=-l_b z##!XjcJRP|R9BCveKX>!S5jDne6X{1^`s>(e0SrDF{W<6U1=ZYs-1kL6}w1{ zVzs<7NL|aDYpx7Im%|oLb4~4)L88-LD^R-|kUJk&rXJ$Dv#vq(sB1^5s{J3MP%d&; z?633rA0tst@@BYpqIz5L*E#;LBU8?umH*dy{x70YZsHcc;jgp$pW;wH{}*rX9%JWm z-3eA-vf15yG=%Itve=09wF{RTc`?20VZ> zDyIWF<@N?^d02s=j)jI_K1>`ZmvDLu}L;s@;k~F~3v=(>)W@kCw}B zXk7`a$v7ECr$=QSY0PazHIke@D^tX@nrhZ$2DZ9Xkx)V!ohleQ9Ck^dTZz4~3xSO1 zn^GN{o4YBE8L@9lcZxf+s&7}zE0z+PNXgH;6qn801q?k&baogDVcXk)hzxrJ)QP#q zOqXo2djTmN{)}C4{z{cQHX%rIM;9WO78W<9ito~Wf-dCA&ZdM@P2F{B->l|U)o7D^ zt2)vq#6@Lk6T(d6*@UXBK5ar;)}uBd%@nFlsJckyn^4<+-x*=H%B?q{_VM4@ghor5 z>!x2`nP1v0#Z$}Fa=}DbHY204pUXMTzj|au4K=M!H1udd_f^Fd48}^o3WZN|D?>eB z%<%;VTKd1>hfgRW5KrLh5uiBYNyCyzQ8dr%egNlnXLb=t$Ol4@`C^L}1GNDjB`uoN zVU3=J#01X>IH>SA6kZMsv;}#zLSSewq9&Sn9EJrKKW7$?pt6!btut!kGF40fFlsrs zlK2Fyc4C8+Skt`2C4#c+rkw622#hsL1y@yE5N5*jrK~#<2f^GWF=>m=$4-&d?Z$I4 zjAh9jLZXj)e6?DZCF-?M6;MF2E*UIxopa3@SXN?AR$iTy*rl>PFu|jZ{@a#zE8UQaeT`Q$UGc1F!tIlC7D1($2 zef_)|#-ZEX;x;U|89;dK%Pl?NDlSe|DZNau2 zn*;IkMDZkSUX&_e{wfNOWAqeL%X-{okawpTGQvIp&w4ed3Q&&g1kmyJwfVUOnpg(K zXgdLp&SjCwJR&+)B76>}{^Ynudv(IiV4|wnl3?T^!lv9CEuoP1+~Q)E9^0IGRLh;{ zr6ev8C9slJ;R_Ih#oZ430%NnV?Hy@@x6NWe%QOg69zZ#4sQ47IJr0AiH6up10%No@ zv4mrGG0GO;)`GnPIp^Vx4s6Me;&=lmJg4HmA~sQrah4)OW5v=P)szBnD}zAAbOjn4 zGGI(2*hsyMNl_sw0%XS{WkEfv(H_I!H9 z0+7g9(c+@OL01MHp+l>#8Qe_q(U1XYDyV{yRTbEdS?OLEi|MXne0dDBY>kE1G&aUu z){w$=f$?A=_aI~nGee1Riz%)+5js;?@Tz#}kVsuPP?>Tyr%AQ_`}-p8SXVUaCcC&i zZtY2qt3!Q^FFS&zO#3cUFV*p+49M!lnWuP!QlcAspdG9n%6zm7aXc7#Foxt*q|jct8iitNU6=$C0}6|=FoZ66ohtF7{+Jwy?PO#? za}nGLv0FFEs5|&VN;}bR>JT|R(+o%O$LWEkO2j2GTM6VW@~0Gf7LJf~f`y+m&XEg9 z`d)FMYkj&p{KF;%{PFV$}eH3;5xBFAaaS} zIR|1^z_P7ak!52{*IbQuWf+mNuo+y0s#BA^K(>1!jwpe$=13fmMJq&VnEQLmUWoX? zD1pRXmdxNx==P2bEZU!N&-2IKH@eiiQN4o>IdCM1|G@2vr@K8s(XcHynYKjI~I^b26yLu;1Sd9eL8kdi+Ug?!Yk2%p<2X znz8QDu_DOh&gj(H5vEclgI^ZZs~9!Wi{+PAQ2qcwWT91c;R6k_jwQ zR*FU{nG|_BG#v4{#H{Z&Vu%$b`CJk1brM_L=wp*>Tt+g~Av)qKguX$(aw#MhqP(zK zmQVr<>s`uu11pmHABlr*Wm`NoabdpOtLAdAk5cJq2sE z6`_(>j76F#-+5jx0+#a1IDk<$;HqT@oJzDZ3J&ws2Sh5P#*D(f2?ZEuNy%s_W4Hnn zmREWQ{M2ztk7W*T$QWU+$-pTYX3_@67AWN`<;`ZD*RN)>fEQcE1`A}dxA zr+$_t*kpeHR?5{k(ySe(Y+tSP66qWxk-=NS=iEfzOaEbY!U_{PUnwI~Gi#2ieKk&e zd0Ru-3w_?T#g#Jaf|N9GdxcWK&d&SgIq+TOeGz$A1xQL=(=}6NAnag`$Ig){qQ?Xj zqpLs;iL^5Ka?AwWfjgZX5@~&6mR?7fQ;62-BC>$H2+E+CiBB#o*^==Zjbh=3g>8}t z6e&X^dUgf+heTNY^9$IxfRaKaW{CUyGAtu90!~7;%mqNvU`BA@G3u~~FX425%y^`e z;A`ITVY01JTk7~C_*ITf>=VRc>h6R|FD5{X_ke#zBitHJf9f*!G zsWv-9nZ3~7WDqov`EmP;^cbhiR0F91Vv%V$_VcY`f;L!`kkwLYP?LuXuqgi)pgw)k zDFt|0SF?=AFt{yPm`Vm?pBILIybd7Eh(PTs&qLG{11J;BA#8nC#|U!$#X!lTY5?1W z%2F+-43gp&t)P}{j=Z4^ENMXLl{gP9o()M8kfOi(OsW3-T61so?=1*6lf0%ogJ zfjn_se4hv{6{yd>3c{De3Ia0AB?#f;i&hUCL_Sn#Y>KUNsev+bCl=}PU<6#-m#IGlSB*rRB0C|kHIMpSlg_2;$&8M;=2uO0}8zt6USecIzD~ceN zodQ6c0Ro>vMNZhVYBE75#z7myzV?Qb=SPmIjaxEE%Lz74GB_oJESg`C;bTOk+l+?N z3)Q=397Sb{{IuXkxg?ICW!({HgIHseLumR2hZnG$Y;zb@mc{8DlDunkC>!zo!o`Kf z=WwG%%5ps2$PwQR3F-L4;>ygd_#%MOXd%J4AQ20d7FG0eautE`;IQ~U7Qx^l7(h;B z{szHZ4KU--n0iBuWP;v|#jpm*MLCY#LY%dNF#{aLd}bxJ3MdlvsVb3)1D}Z`kKt-ffu2~n#4S_o1=x*!D)d=&!ep0HbOKY4*Kcirl_hX-2@~#83r3SNHSSDa z(6Vu(U4}WfN+b+tEBSr0h2zr;5sgvZUY1zA1m+Ax0U=7bPNc%ny}+z-YsW(mnzxU< z$HVjL0fbIbUhJM>7h1eK7lJbqAEnLIF2ak3@l<1u6bxiv+? zSTJZ3mas~-;LMQ3)Hcrw7vd`m;Ee^e9+8&xC}1utGjSo_%&h*bjT)k?NMMTG%#s)q zX08yCfQ=`+KCD*~!EtAt_OK9Qc5@F;)?EQ42_LECQG+#OR*}Gwae36sW)F3iMWeN`YJKoSBbsc^2=(g1DizEKB5%310L=gA}--N%68@zgYlQg z;2}x1MpEfas2jh}(B)|k0YYttEFp{%jfE@A3|4P2IMLvZE8?RNCMGQ~uJ<0m^oV2h z?ZddmqY0H4)Rv-ir&Y3w z<|d6q!hu+@Y9v(YhKPhXw%AD#)+Lq-{UKXq3DSu;R^lksHeB#Q=4Coa2JxUvl^&n8 zL`NG-lK9vaNSdulE_gxfCPC&e&Ib|`Un>pG;3RGHD5;OYfp`wTCU|Cs+k7!}=e5|c7Q_^Fx2_7Rw(#aN6^M_!LUerN*D&kSNA zaLB<)Bo)_@obXPPUx{&UWyAMA;!-&&#&b~r3Sej$}9z_`h-^4Nq)mWauB>^KL(1I!Ay=j@Kce&evgB*@c#5xMa$jS4YmnGCCGjJ8`a4e^U z{+765n^4{@oX>NOD+wV&l`P%~mh!vh6o zv}}q;)9QAQs-$CdkkutugVdoDOhU*qnKf`-EtE!l-h}Ds4K4xlKasnIcbGN8Zm(20 zGKsRjLee6x@wV@QXjIn^4KsURC{&_J@LYjOP^a#W#ju%GS`^DovN!!t~TU}2!>$@g`l zq8MOGxkx#UXMs$HQ;t}GNXF8X2#4WNmH32eBEEa}bMMMRdwHr6*n^Hf+_jP{qJJDabOh ztgz_7;M#-@4;S@KSHQyX4GuQqK1gUSA)OZwNT|em*`b4BZ-O6lq@kYRG0KDSLNy0+ zRAgo|2WK`g2Thh7M=R(H)@CQ(0mS_H`hG9uGpa@29a#PI}BNi3gkDD zTFp9;p&-X;Q^3@Rn?@}X%OXQN6EvJ4nqh49);unlGrLpqayFf%ibvmK*~%f(oNhJp zWPH0hNIA$|p**e~hnTAN4iIj`ixl~d;aKN%cNL(#%z4zJack$aqz@~mEE=aVOo!fjNpxf2|g!=tk+3l}9~ zvoitav5kviB1qzL`^Pj_GfUY zr-`V=@2PnTE_d)AqxoS9?`)s?=jpqXP_(e36p$#dk?i3azY@iocpO>EZY)Dc`VZ?D!2DePuI6uGkAdqG9q zkq8bvVn;%PQf~|;i9mRr;ibl&!Uv_q+Xj~uBRtP2;4!j`6wPWCOxd8dO(;1zHZ3=gI@*M~Zlfn>$gA5oj16)!v)+ZN%=W(6Rq+Ed3 zuDb+`*@O-v^%Eeoi~*l23`5gBee5*0C)#tZ3z$11A1IL5)8oTE84eo{_$&^oSSbGT zCH%#>5Fcq}x^})9`3nyg>KIY2iisizgX|=`3tViYc2qaQ0Lu6QbjbTGY5Ul7>6{ zg_TZ$rDcoxE8@w@lBRG{WWA`sVk;&>FDfBy@jRZNcheMjWxmu!pq8<`oGH3wtH*n= z{J?lB_GY{e^JD}ZhQx*t6S8gUGeJKULs;7Y97;kZqH5Su>ot*pTBcEt#p zOpJgJBGrT*Nz@2Ew;~?Rq0sZ3yBm^CVg=!CY|N~X9`|op8Prkq%PnEC+7gW~zYPjp?YW#r;_VqupGv@I}Y)Pkfdx|ybo zl$ERaKom**d)Su3Px8h#PL>dCqKUFOm4T#%vN&o{dD1cegoq*wDmY-|Wv}9JioLYY!s+WsO=H4;} zLQyQ_2x~I^9HHUx#_BY39CkfDm=8o6Obia833q^J0Jc1;gKrNR#RZWLEkdlWIBkPW z%z|0NzMm1CEquyIj#89BD74X!#n3|YxhxNQXULb30zTIfgL4XkLydeCxXVT*$HuZE z#Vm9V(pVeDvnN|7+_X%zX~_bsUquE=1RLTkz}0u6g+=8!KRGSTh^odMlJNfJ?7^ceE&sk5gJ5 zJfUZgt15u+ZwXA?s)V1*%!LhvrVc@&!vy9dQL^G_F9Kx8vIv^D=^j(iMr*eiC`=OR zb{Y#vPflG>wbX7zo8tih);BtN#4NFWtgdhhK>;8n^NUp)hh;j|pP!VII}mf2nii>- zR_VPfS8N4K+qofjtH80qv45rc_Lo!@kC@jzv2lP!55kZ(i@?BRa8Hu~6 zk^-u(sdrDaCeHZzghDA8P0Y!N(p7F%@k0v?}$Uj;U- zn{t#QxJ_1L)G9PICzM+5iO~ymk%kV9#8wrq*zkA6;oA%fhtndI?0f-0uBPjiLI6)`l1vLg3aN=;hq~DGVVj zZ+hdSng_~gF<+E{n#SxsFnN^mGAxDrc0p>VZiKZ?-3T2mYa0<{*07C8azDq7Xk>tF zgp@Yf2quCyxgQ+>Xmh4KD}vr1&`~Kktf?a&*C~ zc-95sc}l`g%#*Va71U#$m}F9UPQePW+^)qW#l|h-WLkh@RkDnHu7a`YP=U)3?3R^} zpKiD~c`Df{PpN?OnNmT@6ybrA3Z^`gimi|hry`=jRp@eo%^ETHdv}x;t13ZhwPE8` zi6WbiCYCAUgxv$>57T5C_sL4^q+Flr`n-V1eMGvK!vK)B z#SSS35W!G;6j}8XPGx{0vlnn<+ zr6_D(%aAPHg7ejFWXR{~=m!_kEatn*(pYpCwrrAp*Z^IN034JEqksltA&dnJv3>aY zNI6f6#nWs)hK;v4U`}G>cs?ENKAzr?X)M>b@Z3huxiOsP%|d4OG41bVfaTs626R>k zB7R&abo^6D0tc^{Jv=wFC|{a(OKAeQgi<7%EhIWTGs7_j->Xb; zZ1dFT(FEf-lRzIhUS}j>>ekvyXg?gzTb_p6jyZ@{Ml0knw!43!$#r6QEVSlV=FzWO zLHhY=?QxR{f^798+(d6Is9U8+MmqdT<(z${GVnAaq?`p!t49ao09V_UpoL$<$xmH< z?M+$aDe*p#!EQm8T7e9?dlZigeg}hdlrrLa;+o(-*r^z<3B4 zM0nCRH;OObA&3#ppD!=s!2zKk>yqY&rP^ZHhs@w$M{T@=U;M&1R?S`xb6R%l)39Jt zkrGB1y^@~ek!xf0m@{xRI^wL;;zIb<6>#ph1UWch3x^Lj;1iP#xaHt1DE68f;w~`>J$IZA)z>eF=_U zGjmgck~xSsBR9Wv7CT0^H1rW^|Oan@8d+98gNgHguG{*CR}*nLFepdQcA+giH2|A%B*~ z%)s<9a1lf9utT}Sw{R!U*KS}?Q;x3CZV04kQlw@X`3>O(n7NvVmzL)E%^a2l3r`-6 za*|h`3|9zEFOBhza{Cz1j=rgk6)|(31vZ#?9vzK^yU${cv0g6X1HAGQyE`!o>LP^E z-6jj-VCvg^8tqHxVOaB|E%m0}MS6GKUKG^c40;utQv_mYvD~MON+voHtLc z1Ysql-BVt=m3jo<&|a8~wK1(t~r_l5U<4`E2 zt)~gVb5huF;!4+ASmA1D=@w(i4;!l}Q7~Jkex!yWXJ%t@wC783bW}l)$&%=*w-FZg z+YD8Fd#e~_n;({2GO&~1^#k&T#Y-$irL=tBMsrwPngA;nse=O}>K53uQvzsR?p|Y% zNJHBLPw+cwL^wb!72LJatVElW9SCVv2ghVp6fO~KK1+%KvBt!Z4NaT`*3=WQ2>H#h_We})*2zlQ5 ziWFhC|}6lr|=7NON~Aqy1! zYlKVDDiI^LHZHa!1VRc9CsD78Akng73?BuuoY+QKgy*0-U<8=M4>s8CihwE#ZZ}on zWJ)?R8g(`*l46a(%49wuOPMf(9Fu>3Vap#;gFcA zr=gKELB|_#(Z?ct$t2E%DGLo5hK;D=`>7T_2P(@{LbKsU79ffwP^%clO>Qe-A8o8d zQ+k(2BGqN13_a4oH9+yLiP|fbAXaRg#7~FH!YFi#Y1}iH$kYJD1rc||bg-mTd*@0) zH-R<`22<0^d|rYV14A4F>M?d`VkL{N6r-&Ni`Zhc^>7hejJCc|#7Yz&k|FfSoc=7x z4@40u3lNxw9yH(kLMAQ7V8n~SHbY~x@^fTnS>XC}WKLuD{^D$^{B*Y7$ojqH3-L<0_#s^PrbVi?8OObs<|X|NHf3dlAM$dXY--bQ3cL%O@&o zu6`>BCo3-p&?z{JE}vhb?4!3NIsh)NFrU-Kl|MT87=o1z{DmQk%<>DjKb0iaLyPst zR9=GNs_|P_N-*@kuu{RV@LPZOUb{mg#mzm>(esfISvXH+F4A>k@WSCBb1z83q!ye# zYbBQ;-U8#wETQxGljFBE5Wz?zYV~sfo{?`B#^{&lm!!$TiY-+5etB4i(G-jsxHF4O z@SbG*%&&;qDH^&&lmTY!$%l@0mcp@>C6P!^wigka#5Cqcv3%^4=KlF54IXJe8;;^n z%|Qn-M4p9jWf*PaUNm^l2_Ikw!_LMJ{Ee-&+l%~eqQS~>d>y<9s(R$AZa+FLo}`kE zIJHX%u5A$9^=2mdXbxV?q3CkK8Tn8+Z0&H89gT0xF}mHBZo0Mv_@q{rWn9J$#&V`>3d&gLXKWZ!@&uG66jT<+4M`D4 zQd^GTNp1;bn<0CvR>U3f3=wrbOgOlT8nn>R1&ox!l({T#IHXz3is?~(X+opa5#@@k zv}wl+bg{LB3wbQonV5=UZSGU83vGNv(C|`6bS|uQqiyFdhC6$lj1mob5@N?G3$vxT zFQ!rDzq}IE2S`d%g2Z#~i9+2mYu}tIA&O9~5RHU+ zCgjg$n7k|}0-Njh^(T8>`3~?rWkJQw5nOokxC-bwB&oPLG*ek}aIW;`@RGipqgZnY z=Q$|4iR3`ip^0-4Rt)tV%Yj*Uxak#>h`C~mRTujhCJ%TVMBn^PB5 z;T(}GfH_SbImp-a9Olyqi*ydo8VwZLmt0CixhqoI%RjVI zXsZ%Xq^A;03R!}AAxmJJIZa%5%)>f)`Bk7f%451YxS+b{2-n(kn3N<3o)j%$w=zYuv|fP?gklO?AEqf4#_ z1}J+D7#L!mr{HBB^3Joz^^}uEXB8@6nQUvA+!tb?Ep8)}2j#vy*uSxdh>aU;2Dc_N zI9NBuHFE4k+)BY%&6tz>)nnqj_e#X+O4bbn{yljy(iK^M1V?#LbBJ($NlB|==20}n z3O=`P)%0+(cfhB`ffLwki4lLVBj-)T@%Y)aADTeeGZOjPAz1z7`-C3vv?o0{F$2dE zk5F#)ur940ql1v#WdMc2VH1$~d9`x}Lf@#S@bALR0mpJ}MHdHmgH9CFKk!C^%$1Ea!aW z?qr7)S8S|(j)+nv7eoiDD_RbTnraR#EyKstO{Ja@3stzP)DfkmQs6vm)R()e&Y3)! z9r5sJRJqmNz`@)!Y~$86Y!Eoe`)IaqZZk3EG^#?un9$x#HH+QL9_SfLpcR1ciQ zxK<8g2d`&tM{sPz2r0Efp|v7W;ab-Swbg`e=0=H#OB>WU&FDqf7Udx{hj13bKg@0b zY6pHvL2uc>WfduWc=Fj59FQ{%_IaA%uomOImgATK9I+%A;rBXOlZ8)RL zv&eN(o>;29!=a{1izR?7Qjucb#>PgQfFeAoVZTl9F>HV?Ux99puOO>!#c|m4rxgnv z10_Lkj6TNz6cDax8jFMhH)hiq_|NUT8?<2vPPz1kf?;yVg*Cf-zkVds&e$c`d- zQY@FqfkW$DqlI-qf^p>2GMLLjT*_JO3T!63N=S%k5#lvXr4%})#t|qj^U101)6J<0lqplZz1Vu3^tO%?nwh%x;lcxejX+faD~}+xO}$J zYKJTGJb@L?^$D1RMy9}pV6{Y>*jR@`5#cDVNXDc=So_c-(sLG;4D&Eg3qw(B^PVB5 z^vpMclk98wE8Y(-eJg%sFcZ%K%{s&Cfe>1cPA$h_jcdayn?CZAUmhMN8k4F5#k)z>1McEBu6lj^^(k$(DQEuZ+pQqid|WT_ zR-=*V<9dfwB=ey7=$k4tRefBQ$jx3K*E>q0=g0M$n|q#o^gW~tMA;(tan(>8^5^w7 ztsAX#$zAQ^su_jdc*^JFf1RxH$*tGs>a9l9$AUR&Kv!_K6+N?hUbr~66MB9cI%Jpjd}#=5!cr2MFZftuR_ zBDe~Y$D+tGX^=3)B{9c|x~1a|COzbVeDmm}Y^5mb^dhgP5}n;P+~_FhpMlV{-4SrA zmrq5223K1(+SEpIq!e35K^F{$MA>9u60R8hJ&z@lzruxu!qiuWPr)qA=i~%DtU3tH z!JAD2@NUxpAOMUl>o2{kI^tA?r+%)5ak+_}>3Bqpzr1q}ztn8`tIk*qh&vVo;*cdM zdQS<;1I=d{Z5xt_mJ!Bx3DqIwNUPD27KgVDLONeuaF6PaA{#;i^O76}=%_D{op|z{ zg$~qWvr8lpdXUouDK5y5s;m=m7@>`(lRWw3`4L_>lp;u+=r>>h-!0V zWC~5jeVIZMEf2i5EI2;sX7_U)*UcOQa>v+dLf}nFG70csD;6d?JgFBR*SV~uNvY70vg_&r# z>V&c-%j>WR^Y9h;87{zD2Om2aP~6;M_Njw$N5Cvt6#@}z)7LV~>1oP@dfJZ3S8&pb ze)nxZ-_=Vnme>bOrAtur)-=4&67gcY{#5rK;mrZ3@p)TJdOb_Qxu!@9Hk8^-X8uzQSgBVywm4qzfJU)O7&qIJQ?l5KN5+L?;0%54hCYc&=6C5Ss z(jvDonj~ul%wp(q^>FlDWUstK???+x=t!^_Z!c|X9SkCufo1!yzP)Vd!*lBB(GhE_ z_L!k&&=2OuY7i_S8BSzLzxqa6wgg$G;k7v8Xk`&n)KNdt%r=lo2A;fB1vczreY2W1ilrpFkQNH0h0ZM=9eP&E9S_n1JONik zH?yNKQi#m|REBgk=S#1LC08jldVUG}=%^OF=og`u}k zn-dsc$a9@&q|!nDnOQhQQ5Ca;;YSWVn8hB-BVRc5#XOpa4?XbU!&$P=<&ivm=yMs> zgOB8~hadQ29zFEn7jn`E9?qi{MnjLBQYr*RUy+KCB`cVhH{%0h@D&jR+moLb(iq7K zZqG8$h2=UyCw>G;rXyUhu|J7LNAYsRkGnF$j}_)$^1|u}pH79baPs~Ou@rKKDHACz zUS0j-$Cn`NU{{HUmHlKebO(H9XRb4m(XfW}KE>--=JA~=?&N74<4*l91Up}dF%@K1 zk;BeiYT)RqrlJ3ohDbrNH^Ea3r*iZrn*^GejkFzkAJg+TdKs~iZ7Kwd=@QyBqHTu9 zcqAvoh|m<_5LYlfZZ$xM+eoPa-BXhyxG1BDX@O;~K3KV-@1R7=K_Rf~9oZdT4eCMJ zjq}I`2ViyTw~>#}LdeW<;~UNnVBLJ+4ZNUIh8V(FBOqGhi@Jn8`uM{W6U&YrZ%tlA z@wh!#yqQqj}xWK}znKmPbZxwiE0_crG68()uERK5N!Z#NrpsW%X(1-QS(IPk>5N}3I~o}xU` zxfH6j$$jLHU75dt>4eLLaP5vPk1}CIY3cBU5}gwuHd3BIYv6(rktjT-WcCrrZaFX$Z!$32A5Qlfz*L@8f(!>Or@h$W z=fUU$m1^aF?it8A96N%i<6;XGg_I0|IV5FKuNF+an8fqi2v1fw!VlhLX+#X;y9yUw z6vtRPT&{5Qec(4)=In?d5s*jZ)Spailm!YZ`CZz&5X1)C8dz3b1Mu_n7`|w8I><;n zVo*3mgyd^L0caM0I7>W>leAq}cEXWjjMsNuvDM1@)_8b6ATx$yx+@NT`0;ku!Sa>` zIdg>T1YVwDUUAxrBH1Qer~sBq_q1=qrJARC0enZqjbe3@Xmlz^GYGLYv& zpsxsJxDCZn8k!W=-E9(+$Eh5uL*Ahii}IydiWf`qf&rez18-CP3fze!nA$5Y9=SyK zBCt&H!N5S&p*PzCo<*ghC#pbd8&HG~3F=fDR(KrL6@*`lpX*Q&X3H81hUrU&tKWiv z{4hFw)=n4c3n+z*+7ThvK|bIT5AvYi*|8o=p`*$3mLx@x3^Nz1u1RYdUtAk+f}wyVpzAUEVP}*SS!}6*&=bRppi-&E9D$N(lL%CZjYiN3HG)g_ z*>ME1s^ANxI1i2!;5?u}DarKvMFpIMfm|>=ZagWWwhYfp_*T8Rh(V*rb#%C)4uTOh z{7#_A3Lp$curK@N?+#%9rG!GGUCJS!=NVCypLIr5(9pd%LZRHTE*qpqk%Vh)fM&6d zW9hphb4f%H-dNhToS3;EiVmgPAcuDMjM;vWQen(qSoS7FCaGKwl$l!vr-C`*$f?t~ zXOy#yOAxP;_gK_=^~AhLR%*zHW!6*^xc|v0l3(!&lu$Hio*>=e#9tH53B*!UXjq zB#78l!Ef2t${`bu{ZxjbaEU-ZO_ib(?O1*Hti;iINPXG~5EWruf}CW(P>Uf@o@-3C zRyf)pdhjehpA;q*P)MF1#odLt&O#;*79e~cQQEB}_TlA9;>z=eLm5A?Bxf>BpV$6E_m zj7(N*VK4AOXMrY{#cFG0%1La?P! z5leItn277c`A!4(*TZfC;`9kJ17sf`Gsv=1nqe(dFrp7Jc7u4d1KB~Zot|a@c~4jn zQ4gZzGU$Cc7zMzP5Ak^;Wlsj3fE~?)IFvdv<&o1*r7#d=KnXzR0F594U=HHVz6mfo z=6BoVFmdXBN-uUSz_TkN6I^9@3{d@GwwFu>l||SBuv=IRRZJ0lcbLjT2Ea!Zozku* z^eitzEL)uBJpve(20RTH`!irY1t1RcgN5=UZcoYuQFcZhz_uv^+wO+#M85uboc4Q~ zDm*?1``ZczkjI&!hy4W>=k@^)$>$`>S#!uj$^f!rljk-)KXR|^gW?X>JY=WILCUBL zAQr~aXM{865SfEHAa1;PnvNehbHGs?xs~fJ;0r>)5mS>RE$Zt*Um( z44DwQJO}u?0BOt<#?28LS{*oxcX?PpI%hFR5;U;kJ+S0YUNop&2CTEPHRtJsJ$Zx~ z#=EW!$i8#D3eTFwM7-13E?IV>d;&#SHhCO|TKd(X4x(v-2d_nIcAyUKxHYr5;0RI4 z3ZxhhnPJE2^vXnwb-?{$IT6#eM0^;qm5>0+3!(9Hu#tZa`&Nwi{DHb>d(zIR3^k)umK`n>jay>5&7IS{bT{(c3joZ=&xsZYxGgWG~5?FyzB7}BuhZ~3To1>n& z7sTU>n$28unzC3FsFj^?tr?qb2`b6g35wg+!cqL;#`sy4;6^&wzHU+GmP4!-gT8~K zTNZ&Nge_^%m?FX;?xN-F<_;Xgz8e>~c`NtvK{tV0RT_mTn8I0qT@umzlRRvT+xtRC zjFmYg(Q$AW$TEO_b%Az7|LTH-k6#7=zK*z0YgvwT@_fEXtPmU}j8@mhyzLOaa0DN> zQar8~ve3xk&Xt8p$SKT1zJw>oUU^}k0o#hB79*?xV~a11VV-o15iz007|04X6H5L? z0K|?+ja58`K^Vgki&% zR@gkbUs06T_pA6O`&SkgpA!daWCd}Mf=^1e9I4razO->j#xPzQ!?;LmQp}fP3wE0q z$z#}b{1{ieT8zqPLu1U5?Z%Y|V?lIHE%cayRM$d3WhAlycmJF?58)c+#55O*{JNza zIcerg(MWT|RQ3tGGIB}Z+(j9-oq}8`_RV~hz2b^VUz^7dn&9A`r@3uqepp*o+pX@l1V%6^%(2Cv=YOFqxNp24I7r7^piG zmJCkASvRouL>%j0A`>ifAni8t5a&o$zMBji#12!%h zS)M^uo|OVt{gEk%&KlE#$LIxz&*ky#84NQ@HZ3xc9c9QNn$k`( z_|07M`to560hSJA5LVf$62eK{Xpk`Ym`#617n;vu7Y1WTnoR^lQFhsgm~=4oYE*`| z1}Ef(vaiQ%oj^bO$W+0sopocF$CP?CHfMY0aJk93gx6Z zgBzS-q^0Q3?ST6I+*s(P|b_snWmN34{L9 z3REsL_PdNoFGRiHT)K}(A_OFxk+>TMSX5Q7f?v_#3hwJ)>YP|w;Wg>(rMMNuBC(y} z=UjmkhMg!{G8oJ`0ORs@+45#geMJQ>1BM~)8u0QP893*cC(kTCr^5gnJ76}!hB_LV zF&2fY4#U)m`HOdyZl#rUr9&2)!Y`Xevdoa~Y!BMYWcm_|&aM;faQw za3TUaY5Hb4;$Cjz&<%Qj5U<4I7aH_~yfFqFlTa@_fZ%q?yHy^H*WqvoT--h)Jnk03&U8Xo2dI z`iG^Q;)~Jfl(V>>rPdq8fE(JUm^7}%r^Kf5*%*qPIcBMWPIHEa9*wwQV<<=*7NRLw zgA*-jJn}$zJ)9e-WwLb{qpCRt&XfRE=XW(eCLShN-&=BVldv#-AuM=wj-DROe@TCc z)8!E#ljSN2^B8QJm&1|8%i(Jm@HoG~=V%-9%#kZ(4l<2!{UARJG1s^f#(rJA{$-?S zDD^9q9);nX$Np^r0~C(QD~zU1J+!FtV>~B;FAa3mZ<%A`JX)(gcLn`cBEd_`IDUjh zsqjf?zX(${krX<<=-35N(!o{Z>WQJ@iAEb{9;uwpeOke}5@s>HI*ZMV7$9UbSb-rW zN$R-g$n~uFWmUFnLNECjT%*GZvoJ}FK^46sD-bNbB3qNr9az2?W+6~K(RM@{<0Z3@ zhv5~Ys_Nl|NQ+ejE=(~xIoFP1W;4<$M8`3_u@D;FbK#F{r^- z=jiB(6a0iST`c&cS@K?giJo6l;Xxv@$pw2Z$S6!NG9W{70!OC9>5CY?3><6XG1B2y zfUG$D@JX0#EF8sg0i3Xx4O2Pz4apy`wHx&PLP>m(7D^PnhqQn7gFqC(<9>yAytG~s zdd?(s;cZ2f8tru`Bb>xZT}>V{ajWH+vC zh*c@5OQv9{xOthYQ8cKhPUAR~mQNt;+CaWFABpkB5>{rO?l!3N2G$YGuaukwK8!j= zuof|IvoEjAFO`U%TIR4i(Ym~nW2RgWBpVQ03j>_0#CXcmDeEFP!mR)Vn-;l*px9r9HgbZnp93@vL3ZhFRL-hBV%SPh**|d zPRd1y9rqLKOqML-CmqP`Ksz2M+k^|Sm_R;SzQQAXxg5rmf`$0V6v|0L(Z$#+E~e?i z3NHto-HxzUN4-iW`N<_X$RQ!MimG)mq67Zxy)PUH;r5X*9~xmMG{bmU#Q$Rwp9^y# z+&dB$!X;qmLMu##qrl>lTu?R;Ya%=b_-`S^Tyn}ML4gmpA{}t|o=3PDAWGml8DK&H zCa3rcav^p2bT`UTq~n|U#_&k-J*NPll=878GsvZZ{8vyit<6RJE>u#T26S2KK3A_aTS z>N;AkUFzRsplSwq+2R-b+z2m8OTqCR^@SFX=V9O(pAQ$%dsjlZI3{hx{^2-a3pK+r z{9Qmh&x8;AHufOj(U87Ajo1{@b9{^g#&@B2?`C_X@@hE`%Lr_NBGTP^8o98XE#x_a z(r7;(L!3R&F~*UK(tk$tD3?cZ}!}0F4seGfz^SrbUM?QQ9?EU#z4xcKHrplc9 zqNd~=nn&xcAU_zM@VkWnS!(SW&M@}J6mU)ae=&qRI6E%lZ!tWF=Lx)>t#(3EaSkt| z1&cIn&(pxnfOaxGh0q+{gqFU)+#;!#+6rS<7S7dhxI8Knb#WY?LGBzmDY=;@CU5;b!9C!0^oO5JPRmN=IBjJ&hgO;8-tRN@$ z5;?;p@~HIcr$#}uEOkC&^i!xe=NNl3e7ZaSt1^bj5vx6t^O(x}?kM+PmH&muv?q_t zh~ZqF&1#^d<|(`x7dT^dDCbLKI^3JL%BE#Gdh_>el-C)w&OB@XD<3uwo$+~o;qy07 zdjun75##djn(id#`v~|;A>Eg5{=RDOuw`}5htC&B{bsaXlcT${O~TtYp{Z5Zw-mV>;Ba?unzu4D zrIuw&a$QxKld>gOz>F^q=Od-^wujCj1y_P)nk0_$EFvva zCdma?V<47f;yfp(*3}|>=@iPaEN|Bl&00~y!aa)M#l)$sqVg)|&9i8Am0>XcE0SE^ z4wS$+8`uM9F{@c@=EB$$!bM6Y}Q^kJpQgEh;M)IXxDq}mS>^cMfz`RbN zgqNN%oCETqjsup7vPQ};wNsKN&Pk3k(<-yLEDfK71bDbI4ysafY{Ri)9odU2^;grR z`X9yE=Ip1W#1YQf%uz-O6!rTO*NZau=Lq9SehO4gNQ^Ggcj22Qetj12S;iarJB9z* z@-rbk)a@1C7o!3?F|w(#Z*QeauH;`22@^gXiU~624w7xzm(Ki_d&t zK@OvJPN7X3(g&l`_Qx?7sNr#hL1!@e$#X2%fOVndOMX+R&8L-{dnvu|(ntuO@fE^H z6glEN{+7Y9F3ad9f0uROt|P+x<|K~GXN`j$7HNa}u~6Mxq$0Kr4Ez2H>dD^cj05-l zJlkJqxTYN#^5tEyGAEptA@oQv-a4;?{j zascxGB2M4YMb|xk1SvXr6YIlzaz=UU@O|WD)PTyeLQWs<%Jr{es~tw3)(7{N^}G!! z?_&Su_8hi7XE|2{Z`*KpnToB)7PwNRySGfo)>yz8;R>>BJt@2&-0^s_Xi+gFVPOgc|LdMTioslzYcA-e)W2j!VFpm16e=l$ur! zZTGN)^P6Evx%-%x+Kt%$21UN9$HU#^aipW|O8c5x66a|l-#Xu+BZsNyL-;Jq%3fzH zcn?*3HjeZi2SLwrp>7CMr>2w_b}_872Vw)h;)mUwJ4x;gcXUwCq7|?_>cS@`L>8sA zcNwWEORzl>{1|FMKH%_qlwuNfU^Ao)WvA9F3A7bJMra z%G+UI+wo}lhv9+njqo^ZicK9NC=3 zk#^UkD4)(g_^saIW z+8D~UVmj(`99=dZZ!1Gw(h9@JMMve>&n2sNcqU+10c#yKSYpY^X~Wf#mhvXIHokdB zQHx=%sX1^i#*&;Y*MM!5>U>Z}A>T*NH;1$bkq1{(mDyCIM%(Q>DbOjAEaSYt&7oZF z_|{m@-A_slI1{;E(TZ^d6gnQ9hjSdU-83G|4&|f!pjhJavW`g0Fb!uW^|f-IT-kgt zAnYAM?KoCAp6nfU!e}4nTxMy)XKvO)eCrbGfm(cG1g%#rwe;I#fEM`16{%zSO{%4_??hULHk+r= zwTFC(t2J}b_1dWKE!VI-j&$xcF#krR=ar*#ER&Z@D`Cel?;qD51c$!LaRS?|trBPB zmu^;u(^50qTn@@kigN5Y7j|)-R4#^9;->wcatrl5pXV?udtal97CMdDYgC4p0%{QKrmH9|_WdemJx2`NoBWNkVHhB1CXWfj3~|PghSD)- z40Q%sogg7^jE#J9Aj*?_$B~}BO09uX4%)KrV?XXt1ESJ{OQ@mmyo`phJD)!oQHA(J zr8q{(=s418*{K5_28Z;uhP6{JxrDkT?n!P+Nr%*Bd4RH%${&z;c8#Hw%#Ah&)lpPy zp$tYiyNh9O(uTbL;fuxcp9Lj(JX?_SjdCgFrY`wDR!mv0 z`At&qPTI;um_Q#TnVWB?w8WlBdu&}wa5w9}B<=4~Y1fk8@3Jc#o>9MC^XrmpUAZl5 zt&(5(qDr^F46l!SAn6{0q)QKwe+Z8Ajc_kQ_Z#M+h%c*1HV4B)cs_)l z|03k2dDNBZT+b+uQ`en!-f&Nw?WHZFnvU(k9b&)JcY$&Q_xL!Mr!c44SM;r6`xH{_ zAm3oWP|7|F$|D$emryE}G2BgggSq8g;~d_fj}O%9-ZUyW%XP&ee_;PB$FkA&nIa{n zDax5zfA)7a?uJ!sWL?TR;+?~;zjwvnPF}#V;3GHBm#v{A#dW3(dppyy*SnN{m^$x< z<=w}&bt`A&hWn~%Q2MBA#?|7}iAQWuzA;LGcU^31KwZMw8_8NyU@q( z(z#UJ$@4s733g1PXRV)hlViF(jj?eXOUE{;r22%e7v5Tq5BpMS$7KEGI3l#%_Uy}Q z8&S5WZVh>GfOV$LF2HJ~)(o~FxpZy`47+q}n?}CZXJnSsCzumXxmfGPT`$4ya?!()d2rn8`o*z!MRhW0f_eTv|EVD!w=vAxML6>61{XbN$B67>a9s(zQ&@1H zQEiGmdldQ7KX1b_L678Wo71|DUh*2=T+3vOQfKrsOPbOcA_pt$m1yfniha|a>Y(^+ z=&H_E4Uc`eRK62c@-^GF0JP<8Zf8~_i`SLM!5Zu+Rz^Loqlc1${NRp_+p`xuiVNRetwA^qWaSfS5 zDQL~0q{lUwQYQ4XE%$+!yA`*mRqWXj%p$cy&LaoTX6oX(EJLk?yy!H3H=`lCRu?LX;A^e5aKPncVbC~`2^D5rwQLF|EG>N~@iM;v{nxTmTeu1*< zuN6!8(e-2a$VZ6VwP;t-m5sX^kdK-lR~_;sUZ-5e3ah0qE0d;` z?dLI<4}`~1otv|p|Eg>@`FRwMeDEfW1|qeN18?g>e}`~t`wyo6@soe@w%u0{$4!l`xqSTJy7cz#IvVo=sfVX{(VEMzu!||eSPbJu$L+J_w5_H zLcqX*Ah^Au_dpn0{U@aScR+kw2!>YQ)T9Uiu=Z-t-oW3N?e`V@dWxTT;HMt=zyfPd zv$oYC{T|rqfju6$#RIo`V7~_rc;HSC+~a}!Jn(=A9`?W&Jn*Oop76ji4?O9CQyw_$ zfpHIf%>z$+;2950d0>{U^KES%wC|b};;%gL*B(G$tUW9(TwjyokwgL{kpM})U?fsZ zVkAJ!F~dl?iID&?PZ~zroEQlZ!=7WA4zRGqNPw6FhLP4JMgqj#W0*TVjRc6f(=b~d zBLQNz8b*48xk-SS2Nbg^0|OWh0JHjmrIF#lG!kH%oraNNL5u{5xy3MhyaW;;W{+WH z;4qB@h_P|M_JpUA05MNknzN3P05N9`BLjiCNq`s${J5un^#LaOj~)PI_1gx~0A`fZ zFz|xrcU4G`p9YZMRh@M8tFKuZG(gO2mgaTGNPw8v4f7qxNPw8{80HPfNPw6(4D+UA zBtXoYhIz{|5+FtbEWQ+*0VyQ|QWgf})eOj+7?6w^c*`<=n;A1d2@vzXVcvJl``gIK z)`l4e!L|NDY21DFwcgrbeeG$7O9zqQyO#3WcQvaBFfOLOv39tpzWz;6tp2!XxVP^> zt+p4u5InMfZ`dx-ef3}K=>@^s2qy5BzMetw(!oJe;EGSItFLdjQf)zk+O{p*`f30SZV90uthyiX*u7<-uXp#B-5>yV>tO$uev}Q5 zzMi2c2KsvT4Sl1he*K;8dwL}J$q^U3+8b z3;q4|IkJ2336vF~-o7mZ1AT*iTWqBm?yawWXV<==m0AR#qxNc3u_X1mzCIKXR7i@N z4D|Kk*^k1a$o?ZW?AwV({{0>n28HBewf|OtR{zLB+fiO2*&A3prR%fb{e9as^zP6x ztYCQGzWVCFKu+)CpAo&wb&XK2Plm-Xie;~_zJF)mfMuwS^e&2Kr0<|qXaQs=&G>GF zTYJ9CiUP|e7cbb=SMzrOxV5i_x`$fN(AuBZ*ZzWI^N&%uAEH(9Bz9n5-&Q2}lOA~? zel&tw5w@qVmw-PdHU1$lsmh;PRRoSucXY z(J%l(*o(hy`0K;p0RDDt>)XPi*>_;eAb(k|)zv<9QGL0F*p|NjfgPxyw94wMGLlwb z)taxqItV%x4;{DqD*kD6ufDpA2_iJsuTaZg67*{4v0r<)_t$De*Iz`I!$a4X`PYxX zU46av>o2iRt1s=ZVb=BR-&5NfdV2Qn+|#q=lVQ&%1OG?QfPh2w`ZB}Umv{GV!84U& z+x8yjxle{60`=9G6S9uC%<*;gwci%#ln$z?y?r~h>Qgd;>$4aZTQQk{=Ukc^?AxZP z>W%)v`ZHh?1DJ~a14wlJZ4`-I5n~&H9T?X(i2K>Mf7a96kKO{4= zE}h~za)1whVoy!j#wXDtS9(4PnRBIvUhLVnUC@{=gP5LIdcat9 zRBppB`7GM)EsXryw!y92>T54-*~Tzd@%rl90Q2{|_}wX;XTTU?!foh;!J(#%wxQMc zYBe&dMjsepy@4L=+gfkzW}W&l5`S7>{a-Pw>Z||rHnadrza!KDLLC1vb9Qm6tUV3( zT)+N7O(Ii$2ey(D{k8?e;rbh3W`q5MWZAvFVB@{$@?H|udNE3Rwj(X6(7Ws+{E}hn zFET~yp26WQfDQ~`(Gu2o?Flp&>M6gwWJs-k4;34_dTRFp@*UP6#Pzi)mgxEeLw(!o zH@4Og$Iz~?{)Hh{{{oq;y#``5B-YeERJy+p|JQF-mXADkl963|8!tpszLP* zo&Dr^dw@nwuvQ$j0Rxyo{tATPVu4{`$3@x8a3rzdc-k{%KSf z|ArZ@KmWim3bPeO0th+O1_!`rNY!84+1D!pLVF{ZC(pwVxLa+9aJ;LplXW~lej2O5(CXiyxv&6Xev9BKzXCA~IU6tp)z^A5 zVnlnh=O^=B~@I8B~KYlEj? zxUb!Uq`%m=tA70e3NHlp>$lc0iEi9eU;7DU{`%D^q`C!T4+e8GK_dP`H?96< z{ra6u%7J=|%%FQ}f?(XoDn|Skq1ajDm;tSj%ZM&y8IvOaTQmijl_j`(4+74Gf98Do zXEHn981CDRVbEKvaU9-<(WWi*1|q$+ervBccK2cMt-S$~H~V_Qow4$W6!OV1Y(1Eh z$dHqXaCKH%tByvHz&-?aaxPHnic|)Bi!xK3mcoI5hG|p3 zwzYnZiu)jBuA$YR+0PbC8Z15aYx~)C&$9Eb-y(0u^pe1J%I5yEb~BjNY?To;+-#&-qs z9eI9Jp0CJrRi1Ck^V{<&$s3ILwUZ%=lULb-XhOi<+)#;2jqFDJnxa`eVDEg z<{(~!@BRrY{ks@llhHId?3%C%JW8i)9Q;ZIuW!ZN zH}Lw_1P*9X2Zsp0@rDdi&HIf6eh=)z^L{UZe^S4Jv82>LN#O6v;8pPV68H!88yLX~ z{=x0gsA$}}@nZa;mEp#V_=l0Qb}z%2y+XpFBgmNQCB@)J5HHnlyyU4~vQz{pGNyW6 zQ{hJtuj?F@cbQd2CoSLgdQA1QroxY;dbxh%Wq;Sp_AUYxnX3Cj{l*Jk-4_!0wfc?M z9Q;}YukQp?HSqe*2)^-Z{l=?K4V{hRBm4SW_~+nnCGbz{H-75ipC<4Jm=g~EAXe*L ztrmWyO+@2*+XR-jCq*e(-*yUeAW`ck4I4 z>zRBvQs4NF@Jg*B=NULaLaqwaR^(~|zbV{Q!EYw;w=w_x4c|`S@7Hg9-@)Hc;2+g* zfIDg?KT6=Yg)b}k?F4?Se&a2tek*~02yWuwA4c%{9!z)xukT6VTfhMvd`kk~T3^4_ z!M7&x{`xw2tCVDYe*zzg!;~n#nx`OXsfNS6{!+dVZY? zCZ?PK*z@c6sk9Ay+Sg*}X&99tXH)cmJU>OXnFHm=5SeI~gKXZYug!|}pdS(mEoXyJ zuR#jACI&!)e_OWI8)S8Bv*4C^i7@iDuRYku9RHX~Nwgtiu^5!nM_>#$1K5s zSfsA7OcH{%cW)@Ahds%%|0PIquuGwJAj5mb1nUu?w7RrAe6c9UAYlcMDzdOpH zY*W_>sm?(agn?m5)WQe*cA7K|4Gt<7*!>>93N@v|Y(Z+qb;!wApQ&Gc^cN0n$tWlt z@~^+Haw`&&nxNaLeRj=jAFYJn@Ry)&>yIMMj*NIjI$T^hW$IT^uy3b*d$T{`+>e-At(TXfR23i zgFfoI^|jaaSB%Nh#?aCsMgs~QEexRA8*cBz2rXoK^#cQNBMyTFYW;rXI*7ExQt3a* zTQjRYN(bpOYdi`ysK)&e#r++reagf}AtV3lJv$C;5nBOtuig~CrB~$HConys>#jfX z3w_(cTA!f${UiQceVqg6Y;7Bi7_jtxU+omwN}{szK1VhJ*8;{D@fc-{Uanu0wf25M zE|UW=@S>nzt6zKFAy}>y^}3+GS-yx@V~mK?rSzXrCgd18grz_+1yqS5{Z%`)~&^Bm&BIqs7xzs@T6Q7dEvd}llK zEVc@QzX;tOcGAuM!@FgE!vqfd4m%Q-I~X1)sxm?o?{NLvduZeL1faGS3~o$gv9!Rf zYl>R`&OQW@iI`K+VS?Ym5oNGQ+gpPch+2LFINB^RHZ^i9Y=Gz_$i;jcb5j~f%h+kT zM(d;~s4!I_2E3FRlL_Mv0O+3w`gTYmTwTQQSc9|#9x8d!NKJbLX3I<4`w-F$cPdaL zV92D{d0?vyNQtnMpyKDl^i~;i*LG5$U;7qN_3QiV*AAfl1_sE}uii5tI}xe)>(EE#X~hb^!xV($i>I6T}7n;Z3Ij`BBP7NuHSUw?6E{Uxjv zhXBKzKm^P}tUgn~LE*l&H}vf8xs^6rR(c9_u-?JKHr%@h)($Yrq3dr!BS#*;y+@2& zprb7hdA~)<2Evva7O%ChdH&D9`m~cdJS_!TdwR5Q$9^uNG)6r$v<{oVGZGs_7=b@V z;rOfQ=f`E;P)b=eJP3&ng!q?U#IV|}m@mV$88M9B(~QyMn(&+~m48!u`f%+T+8UHUtvv&)AuW!tSn<~~$?-!u1M$CNK-Q0MVmb}?)3Azxj9>j>F?u` z4~BtBK0I7s|0eRS4HE)kMmWwV1DF&dN{1M!Zh`2e(_i=r?_5;n1&lF)%3w z2hb`j!oNPXrv|}i?Kprcl=;2}n(06G$o2+b&4jOj#zaJGdQta4h8jci6vF$)$3c%NXAKBv<`@BQv zDMSsO$6`LT_UzEw3jQ$#Fl*0ZPVe83p#@kCn^xOy)wDzB*)+`aS=~Qb7sJTr4M2b_sU(ZijEc z7VNmw9F841{@*WXSv`!GUY|E@KyMz7Ob z1A_reK1=rd9Ip^7x$QKt4O3V`m=XjldN-Qc;7G&)#;GoJ+-SyNL*?NVfnSVStmWKX z)VW!|{tiS=mg4#kq;hXU(AtV^I924H(3X_l$okdqigNQr{pthQ1**e(j{jgS@9P~z zQ`09x_Opl9SEW|Z%ky{T`NCf4DCGCdVf{t^TRVg$66=CO$Uz+|{B_SKn1VY$VCDP) zujbDl)deYKq57EE)=V<3rR#t=P(v#y!B34~T>{QJnDkr3y!NGu->Lt__FrCoCEOXp z*3}SR3L$K(;eq(MvBQS~TB8U5_x<^Q`s!Q%=0E)CUmkq^U+?}mKilMdbJtG&;XnK2|L`mS*FXOcfAP+r{pCOZ_n+JQ>Dr4s+K>Lt>VNS&Z~Y(7?fIww zOW$*&_rCYw;6MAnd*A=zd!K&uzx{vS`|;G%r*{6qpZ#}#c+b}_-1o1W_YME2|NXJ$ zuP@&JfByI%{pbJv?zjHS$Ns_oe>`-wdFz4sH~-+_)4%@j|KQvSIE(UxM}A8Rebvh@ zyS#a?cxtN`$2fV^B}}BgMRbQ&ivw?Ur6qy`As-mpG0yL zqK6L@Z9k&5Q$4j-Pwn}h+JDni`PGGGi?!3gzV%UNeD*l9TSdnGweUnOtk!n))OOTr z*vH-(YP+z>9=1Lq1;E?41~l>3fVP(i9+;p3aXcR2;|V^_^6?BGOMI;I@gg6u@bMZS zZ}RayKHlZyM|{8~6%X`S(C)-Kg{=8Fz{eAOtZw}sJh%Ssm-zVGzx@{{8-4$y8Ak^*- zwR=MC-cb9cQ2R`%-4|;2huXnV`)sHk3bhAA?V(V6IMf~qwa{abj)dCLP&*cC$3yKzsGSV8Cqr!{)V>^QUqQEp+UZa`6KbQO zb~e<0HPp_9+E}QKhuZm2`~TQ`6Zn|U?|=Nx%_Js^$Rt4!41yquJK1B6NFtUH5~M_# z%uJR_CNW76OJybmZIs&Es>W8T*3w#AYH3kzZAEKWT5VB9OVRkh&vWPAnS_2m{eEBn z&+GI1{a^nu=brmK=bUFd&w0*$mV1YA{7{Zh=lB;mei+9O=lBecAHnf2a{Ne+AI0%H zj?d(HJ;xh3-pKJ;9G}hcIUJwM@h@@wXpYb0_Kbzy{aQy2WKbPa@ar}IaU%>GTIernxFXs3+IQ~tJe~aUnaQxdGzm((O;rJ?! zU&isvIerDlujKeu9KVI*w{rZ49RCr=Z{zsw9KVC(cXIqbj^EGmpK<&#jz7-vCpi8j z$DiW(Z#e!m$DiT&vmE~|$A8E1=Q#d6$6w(1iyVK6<1ceOSIsM`dA^!=s^*o|ymK}0 zQq9+?=3T3Kw`$(Kn)j&Y>sIrg)qK5bUR}+5SMxsAyl*vMznX7Q%{Q#({i^xK)x3W- z-?W-@KDrMc*3eOeRL(=b0N@3(TFY`6dmZ&R?$|$ zG`WeQ3EjI9@KyNIrJC#5g zhLnAZ!dsE5NK^PJ{1pupf$w}HY-!FrECGPDFj z34{>{ClEm(N{QWroYI+qD}md;R>PB3q$ma|2IG0wM^PW{X>&ynMS^k^;(ecYU|U&@ z7_!6oJHRP@aZ!{hS}0m70u-$k?G%y9xYRyzUbWx$-`cu(RMSm);j9rOT%n=Y#5D-!gqM`pHA_~H-Mhc0QkTMAo1rZAqLlpfg6K{og~UoonS?MwG6zG5h#^G85F!#0q$VOrO+)}i1gVJ#sBH)aJ&3>`8`ubu z>&r`u(nv_Ggp_frHF$G@NKRuJ{#2wehoL$)fls9nAVZ&S>rPQr0hbAkB2YzOuM+CT zDWN%>(vLtR0*wiff@w=CK8xL06%X6^$GY9Xh$HDKp}MwMlwZ7-A>6h zZiNXIAXIiGuV{it09!?%!vKp%IQ=Ob0N8p}S5A3|f)2jzZ&A*JQHAFO52qQ0wII-v zKmdW(1cC|RC?==uNFbU3&e(CvP6Rp==t=;mLOCVe15Vk4KpcUd1Sk{A1OkZ!dI9jU z)0|wqdt(8}k9WZyYPCOp8vFwA3&bx7zcC<*$AU?DG(g#2-1Vbvg&dGrM5p7XY%7pS z_!S~BsUCaOr$<^uVCuUr?(N%@om{Z_j6$%%V%jzE1ZMCqt_aBCUECDOGXBXPKO7v9(?h|-ONr`(*>Gl+X%LMKa%W-7J z33tKpJjv`?W|6zySh>2plDFjKC=ZX9=7qaGAh0 z0yhZUByfkoeF6^&JOP--5l|9P5%3`3MIfF)5`lgMQV66G$RLnTV3gcsf1z4D(W=;I zhw8J`MXV*rrU4epw}rSYU8vgA#74t`0zB|isDVH%-3kOK)7EtW<&?K_%3C>QtDLe` z9!Nky!ZdlHu9zxgGbl5psuh(oHb=(h%h+NWTOwmsGPY92*2vg88QUadTV-s!jO~`O zy)t${#tzBYQ5icXW2a>7tc;zPvCA@cO~!7>*i9L`BV+evjP)y4FHfYf>70xyWlSYu z6=f1O-9yH_WXxB_{AA2u#xyb(AY*|t7UU-OI9ecwDohvb_ZgmI6r0w9PPp6prcQ0i z0cm+S0n(rH-85^%*7cxBv_?aLq^;$90kF3d*f9ds8Om=ExC4^u^KpU&GhtACQnRVy z*hp<(Zjf|!6rwDnq&p7@A=R7aOTdqSKLHJa00N|w(}D<4fiR0gKb5pm8E{VtCVuQz6QE3%9|f>@5YWoaPV;0`%WO46 zLa4=Ah!>S(9f7R`c9WEWA9sT}n7r(!M9k}V9{{H@mpvNFOy?{Ap%$B<0 z@gAB$sBLx-ldK#&eNfkS^{`!?ZPz-stE=tmjzvD2R#cCW5S=^cLLuzT1g3N_uZ#I2 z+_}N4p+K*CP6)v{-sWyqrY@ zuO8D*df7H#W>x=%Z=!qhp=MW|EiXfP+c zSDoUDVh~b@SxnA5o^}n3UIzkwXo|jUuY*8zQw^t{M4+&)Mx{_s0weo##F&5X{`Z0>Q%4l2qVp(>j0y#W_DryQb-EPgPT5KFqQx}F;;<|w)eLhJr6Pfw zazQWC)H6iF6{Cw-`pcAudSZxoye+J*t&psKF1vE9$m(gA>!R^&B_M~!PGhB z&l4%tLB-LD6i>CzRg|bsp(<48p(aoj&OpniGC0Fuqe@^bHFmVn3r2@i>}7%k?Pd4!D=L17yG;U)<$RLg0hC zVUeVa4q~xVz#T;?0L3CL#trtZgGbb8gFDBJx*D6?CsEueoS336QdY&Ppi;$Qx4VGR zhY(ux7bqMKs7As2gMl^zpwa0fV%Tdzm@|jGY@(z|ohdasNJVXngO`BNB$0bNONUOl zQv|K`Bd3`8q56S>>`+ljNs$mi4MeqwLz@6f0(A*^5O5(-hk!d%p%Dz~#KaCV#o$@` zwC=3%v+CYU*`Ick!8=qU zloz&v$-*s)sd9l$MX`v)Qdw85cvJ_i)7bB5>yudVr*J_fo?;b#3Wyji_DI&6XwDhP z4bDX|TZ}5c!79juTK)#pkIO1|SSo8jJQm=g0QCy>cXgvCyva!GFcf;>1r5nfXo{p@iN2`An^vsya8%UfXExbcmrkLK#7+j z7Hq~8^BgGi2C6NAB5xq$4U&0-BwmK#G?9%rNahW~5-&q6NfK|8%$uaPB#FF9jJKc6+fU+U zhy`X?tnhv^Z$GuApUB&f@utYUDH1P3EGZIiip-m$wxo!>DU3Hw=1r4$8DdG3c++Iw zG_@s7P9sO8%%KN747r#lb>d;ikpbE%1&2f(h>~E6j?f@Bd>a_V zs}C@OTz18%N<*xLd_zDuEOhS*e+X{x)}0gxX1IR&zqr>Rp?ZL4uAjuw(!UFo)1Jaz~yjug1UF_SXfreqstw-&XN5d`{ci^JS z6y)IGKRO-l_NBfDMi7z=*3(2$cr27zSoaajTJ}V)9hM(U3aJvS!)dH);TKm#|9o&iOalTqtdLa9BhR0~Ln;YkcKGh_8*IBQj_lHp8Qt*o`J z8WzGNSgsLnxxwHa25++1ISkHca4~~R7_4G&C4*}SS_+YGOlgv($7NI2co zKn9dql}Ti48A&=w#A82HghCcO9-}iMv_DtO>Ug@fB779MT*(2ZXpQJ%;@+3>9e}&a zkn_+ghRhJhYEZURa2LW|0g9H4r8}%GTjsAcR=r(SxYxWe_QOvGEwe z5S~HvA?(VF0oXsz0!Dd?0oF<}09Q;-qDPQVf{m4Rp`d_xvh_sY_rY+))3Fb9L{d$9 z2>{dJAZfw|0hkiBW}qW`inEuXL53!YbZSOjpTUO=o+4AgQtqUu~)HFGJqht(YqBu80I~HvohQP8U!bVc4^#IG_ z0X*qT{gIR7*0DGdRx)E;sgnGqNTdG>(aETGUHu$KiC+XD`;tgd5OrSW1NWfl4&B32**%RG%VVy-C; zm5Kb*&_f-E5rB7-#LE!tCW&{G%!{B+BJU=~yH)1hD)BPJx>e%cD)S;}tH`^R@otxS zw@bVXv2K@mx68Z;+Ai{LXS{F;DeK5HX(`BTh;_HbyIbZ(&~A};H{*p5X5-x}@iN4^ zSK{3(^CD=k$h(*E9*}ttNW2WO9*}qs$h-(TAo7Z8ca)mW5?hZ(KZpIjtU<@y8}yK@ z9<1@LyXAY<_Er%dBR0I-g|yEgQ!xFpitw5o$~4e=hdf|X3+9R9O8be${M{r{8j)?< zJIS7#o6s2;0q?RURB|}$z}zW_5RAE=m_d_pn+t(^3>vJkB5cj_>g7R(KzhRm1(h=k zQSQNTj%B4>#dMU8VyUG3<7gU{HJ0EsUq;M^Zp(ebEl*guAH!MfG=G^>4E2MaaS_~|hUM)icGDvkT;?Tf+oI0*B zPU^BJH0UvRQ5^m}FeqR|VbsJ%g92ubZ0&z zi$P47hF*$8g*C8hg=4|;z(i8b(d439ZNaW|qCv$9p43GUjCw&(7bXRXP>tX}yY**T zA_fqvEh%ca4^)}1EN^L|EFOamd?JUsR@J4f(}aZDAG}gV%8#LOnHhmF*i1b3QQH!v z;*cezKn$AbbCff(6|hM#LzEt&*O2iHM!Z{0oZ%qbE2Tr_WYr5}L4~ITyx>+t-=KY> zK8i}u0#HnfV&RAd9AS}DC2H$gs(JA_6d7R3%A8E(D@VLbXANioR~=FxLsMt? zrMOZOw8Q|E96DU+U66EvM}gZMT5+N)W=6?^Lp&Z0K#&eM-xiYY$vR-VFUO7&&_WgZ z4NljAST0oAUi5BOUa^Z|EuYv>I#yV`ozYfal2r~z5l`2+(kuW&kTxtx3Jv$PWH>#R zp2LB`5?YplUVOERi+l^Dy_cj9!?>DtRT!q%JQebyAm)f=R}# z4uy>3p-p(QD<6;F99jg0TgDDN+pcpMnSrdLy1Y=l%x9_y(OA|)(}8mnep`L%#>TeE zc4Z@1c@E3N8q&7%l{f%JvQ|>c5Q#(YP)jrc;Zk-dF@_noye)zB84h_{ViP`tQI*-K zsz6odKviXc+f1yuM)pWRF8DRk&26hsO(y4yNVg8VhJpP0F0W>|7zWFpYvxBlI*n+f9B^xtBkj0@*&Xypl*!z{lg6S+NHRcJk z++bpcy0GoSCP10Jq(GPfcFAyK&VC?T@`fEfOXY@dO&78x$Qq0~Dn<-&#f4sN$SznJ zp*u?;GbrR|C6T27f)m{II9oxFA!I7yLNOzafenKRz1$FIZ>{Oj0a!FA6<||lQ8kR) zHY8)1!q|+3U|iXgCFZ1A=IN;(6Sa6Kh54FF&)a~QL?GRwk#&^Hk9BPMBsLve7EeTj z1V@5t4ukRx6#xCuk7WYfi-(+n)R&~tF=9E?6TO3xLkPl~vkA})5=m+%U!=okHgkXCq3l+pG``D8>Ns$ng$Ajo;X!RhAf?Jgq+^M*xT`-J`NRY!gW&QYne(!Vrk?qeQGZXb!X>Wmr8m zkb=sOK`i+N2&yYK6^pedAr}5OD`^mDkOIV{Ar#$!%{5WG(>;`iQH>F)5DHgAtlbom zJcU#&z!pv!rMf|LhBLY=HiYDfAt(VuET>58ChxOW<=zy16MR74yW}%W+C9` zqqkZ6q2I96=MBX!hePHpM1+WMj9QV%YDLk&!_JjAZK{GdMr70_A;NZPB+llDww^^u zsWq|3sHbBvB_=5j=eOAyL2P(CBo6OlR*0n|(y8hqE%7`%CV|hpp#!q%Ydle*K4_|B z9V;um8WDk?!w{OH*uw1nq2LztjS58nXqf{xLJdUGka(UJF;66#SmiN zD}^uw4I)nZ!L79+NcR9{@w|=xN)Bg?u@6h!L_|e(cEg!U>_wqnHrU1j6bHvKEZ`oH zQNY%S!RSRzow2*ifg4GSM8u;WQIEqS&c0|&W z6xwszB(@8Sb|}HVLFad1B7Qz?*uoiTJde{z1i4*j=;oZRO z1n7m6^cW;mt_0j^3e(jUR5VG5w;fy4k#pLM1NRYU0PwP6%poF*W)`Qf@c$6!D2;XUI8c7JyjS>r|qUh zFgALrlp5@0BE!KZ`f;LK91Uq}5_YJ0Xq-L8jC!e@Pzglk1UrXQ?#R3o{43h7iCts} zCPsv_!IVK!E>gq;0_mJ9+%6QGVYVU16^n}GFVTAuh=A_!E@XzIdXXy(xp+AQ{s>Vt z#g087h#*Q=6dyCXUO3W^8bPyA)zHy(w2CW-1N8o0*z}8+++d^>H|*kUiiA=fPdk7* zr#41)pe|{D7pWqI5X!c6y5eCBJhZ4MZg|9QLF}4x0T(t4VkaS6aKzp+i45WBJ>*kk zhFgvOP2&Dbrd)XQ1>8Y=5`Y$D*_y1H-nEMND&UdKdWgJMDi^Clf_RGwi@6CO0Ge)l zEtrhJc~Ge<=;eeWMlT!`F?xxhh|!AyMeMS=;xfb7yVYPq&^fTHTU_5MKPu&4?SPi8 z6IX=b24LSf>Jgp>E_f%+5~#OLS?g)=Zh%}-alI}1^pJ~~Tp|!vS0oT|BEVbAdFU?! zyi_!Ygx3-f#CB>GZTnSWcQ25^INF4*sQ`sef%t?$AP#Q_a-N7*A<#R?E3nox7?I|I z#2G(#{OUL(0DCqG&cMA35u_8);m(zi92Qvy6dNi5u%QxC$$!FzO5A4vU^67e%x9#P z1hJhL5KjdZzL#)IB?$4chd|E1t|&m-P$%EfhB_jh8V*u5NuZT{pg~MP27?9$DJyVA z7!YcK3x&0u{7#XNaX(O3p7U0AS~jU1VAl#F@Em=~iI7;Hok z-z^anB3;7B%wQ#hM+sVD8O}0+DQKeE%HVbeS)r|)2#51Wur)!<@DlW3kRyl*T!O4> zEh6quAr=b3L=ffBHn$^UtTZ^qp~A?Fp2ZWf^$>$M36>wlfm9XF#c_DcJ`PEy@ePKW zb%p&4ObO%l#=_#<0#jO!xnNuo4n*6|hg!@E&XSi}T2ySz4;f_4$}{STEF{@jtTX6} zbs=fSqT-?;O-e~-Uar2cv9zlogoX?B7aq+nG2)#dL<*rSz!o178W9$*4bu`O3nvUe zZG>LX>Wtc~2*DVw*9$S3x)`HQAEOPA(q~0y8Dg^Z#!!8hF(xb8pf`qRMTH4kJp_g7 zbun3)5rQ6EnORyxR=7d0jW!s<4WU}W7#P4LS~jB%AhmE7_@>uDl}9t7>rpldK4u(D@)J`VNo&2 zPjsf7S6MNi^&7jpGW;qj4@=!FAmCo<=5dY)#YGykvB+p1Yc$|+rdq*yXhVdM(D2aEs1N~}O;T_@9YaDOCqF;8Sd*kH%ITzu z)atV`Gg0QSNK}8QP8%7mGem}k3;HY}R2QiWN42BiSsd2{MWH;(S?p0%WX#XZqtmPP z6`Xr2@{p@H>N4|;$~1F{k>ds_xa4OmC#Aq#OhgIejrtOXg(T}tx@@B%B_XaPH_u=+ zcj(f~SlqL~RBSXArxm2;W}CVhMve@{0a~j1_=LE@I6P`la3i0UF6(`QK3^9W79n?p zK}P6>Ibl3x7NP!&SQ-h2+~OW410|JfDlzse$WAa7n{$mtl%5u6djA87Bi#8Ff2WOmNr5a5{ zTg4kQOR}?#=J?#A!aQARV7nmGn92B}D$W!4hGF99pgm5Av%e)cIsMgiuU&zW4g4```0w<+HZeuA z3g1>+#t!9o582-5@CPs4J{nSW?}X=yoo6nXoz8asyv=ugy1HH*@80Rkv`KTWl&t;b zN_F>HSMToIcXRWW&u%B~KlQ6qZspyO3v2JbXpXygvggu!^G#{@$InXseM+ar4=z4_ z_^_*`<>TvJn*O!4{=vT<9{=vI-^O0#;t!2=j*RQ-a&W|3ZaGi;yB|`v_Bgog4Nv{h ztDc)$=J@m(__Y3 z(l(#rw|aeMa4*XrLfr#to%7Bg?e=@@>F!>WPj_!OyCAks(a5-VU3&E_II*f{{IS0H z*yPoIzdq6=KMHI-D7#{E+N6go(!Tw9;^3;?D_=M~qTcWYzs8T6**eRxB`Q^iodHjxni4=gnR6KPx(vf4q40;_Qi`qjD!# zU=S_DTO}^wY*+zaEFs`s6Rq$FLTB#3hT=^G{u5q}al{=juE5)jyg(NOy8a0N6xUzC zzXaEMpxuaM%T&;tbTHtpHX(ofF82lq}{{XT} z5f+B)4%~kPJW|bZ?;wrE$m0{xz6<_n#I-_tb0PN++{YmP0Pc@~?;_H7N4z)kmw|k{ zAPkSvoE3GD1-geQcQDGK$Nl@Lhd|`h8+5x62A7T-f;3-(j8Wj(k2nkDK0jy`g2KoT4mTbtPa>iYR3typ_IPz6+!QwMnH9&{Os#!m}U@ ztW8Kso45q1Od;}Iiki=5jdvf!LH~}}@dM(XP||LWrKIMkHl=Tc7qNCFWsp9lO|>U} zlb#ep{Jwd6i0~s3MQCSH5mJFsr51Ao5!qggTJ=2;52~3;JY-}-eX_ZD z)E%{$9vLIeC`Hp#CJE~aZ6U*YF8~MkDKvVwMg)%UIjG zr-FgnM@%sl`5{I6?b*ye%Sa7rWVIz)Q|evCoEjr=t@aRE$vPNnD3O*6{pZA?Tq=k) zHEYmO@*p;{Oa@U%O`_VPV$C8KaT~!BP?IGEn)+oq_7NAa~ zQ6Ufv{cAJWM+qtOq6a{!N#l`dIC`+W)%5D(A+lv{ki{|D-WMu7>?ZfK7s)xs5eWv2x*CrOhyz{uUP1KCv)APz`owM8DS5gPM+-+CShyEqcs z3t3a=Yg-V>uU-oQXkO8Ww(Esxh)v8LXYK~bLi-~l1a z-UYc$P5zFY7)fo&(m1l-0c*1X(5qsmopDUZNNy2JhsM1$JRNJEPcjrzMN6FvqHr2m z|IVaRqSP~L*W(m0wyDV|*5I?xlFL9EN~W1|C7Khddy;Xa8p>l_BtEH8jJjVBM4E30(A4<$Obiwq)Cp} zK{Ali)AwqyHLK}D)XwWskVF#+4U;rzk$tecvi4_(=Vj|M<^S2COKb^ZHM5a9o2!Fq znL*DIrhuRT?Mw3%)H1cJyQal`mcJ{+W;`1#X>;vjNlhRrRS&dnKO{^~tfa{FK%2n2 zMm{idNb-@uOVr)OUPFEp4L+jQhz~TiHS_N@nankb6dxX+Kf=6=RfM~&0y9F!=9-I3ba`S-j?QGrGb%bJn0jJSQNt>g<+lh+ ztdI{5%3XeLQBkfb8+C|fG(%B{qDjK|LTnQNh0bi&l~T(TIeBMr@ccGJOp0otJ0KMxC+x zL7SO0`hxsIESeXg24oFGZjHM95QR_ge5^%_DpsH=%Gc%Pg(wo`KqK@94O?7bi=#@` zWBFK@Ybw&{Opq=r3u{(e(=ie(GlnR9rM^K5X#laoI3Dd`50&$ki^Xp&sD>yS+9ORx z#X6`n5-5RMwHZQJYM^4Q{c75x4%$iztD`(I>JWvWB%tSjK~zc96R5dE6uqfFnKY7; zm21p1XnN-8%sS|X8O@rjXSHRZ#a)dd7y46NU@k>>Dh8B#>I9>?06H!uVka{j^U#UL zA_bey!ah)?I~2)IEM};IETuqSl22XNgzXR^idIs%m~>$QY6ne#1>Q~?Vf;j)Q*`=d zMLmf~>=q%404X3hAG|P2avv^n*sXGrn0;Ft>tRlrN@`LPY*`CY)R(vrCf7`eB8U{H zPzMVtX+a?~{-RawKe(SpFR2llTW(bh1JFx!1XlI-&S1+3YixzTlw@i`(z8|6Sc=7t zmt2f86Od)e&UnjlQX7USJf$$!njs3AhV>ay>mpNO4RfLX1`H`MQW`^nv51Bg(O{98 zMxU2Q6Px*me)Y>OF3vLs8%>5>^n9IJpOagRIwiYiHjXJlhrw{zSXKvH-;+&8h$2{y z%VkDKO4w{9^F;bja&6me925vWIaILsWt+x^D2&uDlFU?Qe&b>EsmH@S!FcG6ni8^l zD3TaZoQu(r6;EQTF%swK(0_HB!D)%n;wZ`tx}1b<$a%J4tz>E9pu{@q_|VA?qmyIJ z*etU{&Dd*gthnWaSzK`#Xqapp&}e^~-7Y~}lM4(bdB|{0ha^bS0lVr;4vCF{rEjwb zjc6=kYE2`**@)&e!Ihy=pjm&6Bg~{R>&{e}?7wK{(VSHMY%7dCSDJAcfk~2Nr+cC~ zhU6N@g(zC|N3hXUP?DWPCIoFmV?1+kq`~OXjIPg>BGuVyvV| zHe>r-N>Q8SR0Ez%B()X9GDV57_bkyU+s7wyl+2g>JLc&~hP(GaW)rmwwKf>`z?Q`t zqLThz6z!ObmxlzKj{;E?j*XN?Gyb8&h!G)*%>S9Bpy$g8B7LD0Y|`}1&y>>e8HC|k zQ&7URh53XqpT0xQFe|k~$x7Re2GcOsS*04qC@WK#pl7_L7KRH(W%U z+ntXA5*`nR$~<%}NtVqdATNoe;mlVgbp~!ThPHkJ%aU2j+{lUA$<)@&eIj=WO$(Ya zCD@EgMzPHxX(*7BCO?980I^M5p&N!MV(oNAvXQ1It^R zunZKH6fzHs)CofthGe60wEZy(ij!a?&oi2`$!)-HOK3;24jUEmWKvjAB>H8J%|e4z zP61p}9dx}njgJ@s(@2Hsc~W#FY<3frHb=b$6cocRTp8BB`8rdnrl=&7EE_Yi$V$_} zCME<-EWdJvWaU!tXgAnolpc>HTdiRujocoR2k!4c3I)frn4@Fq=MY;^7)-;kZHS4L zAEWFdZDT0uHuL0z(6#8H56^`N(89G3#2^~l34>@mc<%o|0;xRXtSKtgCMwJ(D$pUD zvX+sBqQZA#sS2IOQ=$zVD2qhBfa?PTHP|%TR4~qjCkWJlnHfEH_UceM@6keSR@#w0cU^iPSU6%yJLB~Ux4d%? ztv59O+WouNdYe>xA5~1a`*xeI{eRdob@0B+W8S&j@Qu}vUOv3N$%kKd&6qYY*c|nK zh|B|>PFx?FofR9?<>DtFj^DZ` z1>3o}MR{X}(iJ;rIDhPAT9fa>tr_6L4N8qqUDLX6&x@7s_njr|yjG`AhX#n|;yY#Z z$QVic#xp{-8ATbHxu%SQ%$G8Hm`Vqvh5+_V8H{bU^h9mUkhj1-b6DVCM1>R@GAT#@ z=lQpBsluN8i6 z@N0`-Ab#!f3&O7hegb}>_=VvYj$Z_Q+p6{-ee?-&EOCNqd|jLgC>WP)>lQ2$@$~&Q z`jftSCWb#t&xin|Pn*(bq-=lxk#g29&)?m<-~|>cyuIABp|84e6HTi&Z3Ei}p_b@F zZ}j*4cmc;mBE;+mpbpCZ&;3Aa@~}Ca6LLz5gwJ|$+i|78SO)(!C_}Vo^PQgDR@X0E zY*+OA65}7tAAE{zI3XIn&P2W+=2OijG&QA(ACRiahg}b;Th|TM@;8494imhbAIFu| zBoO!TLph%bC%Pp3(#u@9#Z(a6-(vO+v>{jm8Hq{o1a1&8Z2rbJfRVWN$87olM)|Q4 zUpi!(j1vRgiWen*`ivO;kx1%bj(_pEQLw3Xvpg$LD`r`kucp5M#+8OuAX>dD!d$qx z(}32Y#J^3-hp2c3@?_rwB+c*JC7oh40y?GmFC6pW)Is~BE8}bpQp;xxJG8o0gz*2( zcXcU0{kR6QJaNleDbf%ZjVPXG=JjmFun1{pAvFz4-HdsDTI+Hw-HR-5Qdww?m*(-! zkU;xn#qA^{^M9MyPF!8&RgzzGD*(yW;`_n^exWd5q4*cY?#Yzlv@1{=5(7cDb`{(r;0%{H0GLwg^ zT}~0Zqq?PX&^o;V<)ptXRz_N>!t}V3mgo>0iEUc6PazU9;m{zW7Fb*)!o!izP*BAnJ`yol z0LGB3K+DwJVy1yrpcW~THJ$Psj-QxsF#i94HEUp$3;QyvpJZ@r#{U0z{~xb`8|2>d zJSSMYopEt(Uy)Stpsu10UuErf2tfyUg+l9&*Lgd4@O0uEJ99!m7q<>B_&T#SidQJB zx(Qu`h7KY11Xm{oKCil*FXMz34tz@A*86e-5|3uI>bN}NOLJz?(agA~cdM-Rt%6m# zU$8p8U**Irc;1H`-zB%JeFwicA|i#={Su+BoH2Y!h!e)K968~uaX$RuRIQJocEOFx z$89LiwPI4CxWJ_K5kjnLHq6khZPR zTD)y$>X}D_9jR9cvgL zRCBT_>OmnCZoE~Y;EuMgIQ;UA3Ch`zuPqqx;;PWSxu0xapPcx@$y*zO8!jl>CyX0= z@RtWh=aastE_QkN<+c-fb7ypYb-LTU=qU?7+SYl`(o&}l&9{zM zT!`u%a&zN^T{CAIJI~0BxIVD+xDD+xg4)!7E4stUCLeG4bgTD0ESC*7?E16HYGKRCO-+;a6?_-V~+ zeqm;Oa@Z?gL92VkcPbzA*}~%M-DbL6vGi>*E$_mc8Ew}$JlF01)``(8&IroOxxZF^ zk$BL1@7;_0CVhSQ)Zkrn&wUvaoiO&%8-vy9c?W`K&g7xdiWOFcD{919Xo@Pud$JoS zeY=i~o*C$rI^&a}i$BY){=+$AVc!s@Lrq&L{e%W(zOBL^emf|!(Ct?224=`Dvxh_r%BK^Z@%GuMCaA#){EUM2X{Q)^!she zyL?o>x{Y6`N4FahxupNiPLr=SfAY(tJHDp5$1Y#F`o-=2iUuRs^trn0>eh#kK1}qy z@NLJLnXfOq8#4WB-V4_cwD|79*W+BCsN#0+j=nkXQP)-1t8Y#CZ25POuJql}p|kno z%_-$o^SYV-$awIy&!2e<8od6q{(QqVCr&y~?yz>m?X|EDZ3d{xCNDN zI8!?D-F0wOIE7oSS`$kDBgUeY&_e9=jb&}Yv44Y6Lo<9d<0=`l2)y+nT#JMM;SprW zBJp+v=~l3m|3~sx%aGYDveVyKT)hqKFE!{gZIc?^(ls^iyB$=ner?jUq_O_G#I=nMOvrro(|r+ZAEy@_ z)Vt5?Em)dNyfkIffUUjqM~?U3_|b!fK7)SUaXdNZdeOzC{#|_6E~*=I^woh^GLCn? z^IG=L!l?I>hrQkN<8!Tc?yYyGuh-j4lJ5*$K6UN2C9AuhUh%7&U(%XKoBOX??AdqE z9p8K0p-oArhgV0RnW+wT-r18M(2`r&di~@G)6|^zHGa{7)&9%9Hm{Nl(pSLGF89+#g$o0zbE}oG7b_Emcx|or!N5kUa3{Njc^(EOV%Bavk$(VdXgLH>2-YN@rHpv zR)$4)INS3xr&mjU37dQWy{p-O@#j`G?cXzDM3dg%Umnol&dam!%upY(u3!21-SzL~$Dsq23x)%*0qLBB?P+~~Ec*m=v`Rs}a$vM;e% z^~<^YXIJ%(O!HO`cG@zr!Q)=lk8_^vO~|;~-Mchw`LEW47h@aMxn2LD+gmR<_jvEv zqNSFlPQ#z{`Mz<8^SYE?9V;J|o^7Ui==`|dXg}XaX5}{b)o&VZsz(e+=sl}lO$e?J{zzKt!wh{S_4uP)n*ryE^I*2ALz;40@6<{{2 zC%xSwD;F!LMoo_r?4-f+Xesl`1R*+18;bXpgoVPG;bk`LHk5Avn|Ai!xmF*TU&v@A z81^)MbCgCC_r}=NylzcS7aaZKx1UE>FKXa*`BJCi^2XabR)yYtdU0P||5o3axpNUi z-DV!ypy_@8PR_dIzOz<+T-tZcTfORh_gCvnZ+^gpn zx4SyFW7-8@;f04MW@Y~M#o>{O+LRq_eXhj{Uz^)`1-AS=s(;t2(5`d7To&yzEu;Ss zYhZil&~1Is4AB30A~^H6gswm0;|+f#E?athcx9W^8xz*{xtsWPRF~+bTgPRrYPfXP z7wXwVx_r9Mb)?ft$%4HI3pPxsN0z}yp?Iov7MyT#uwKu#B;*x0t*2Dt!J$I%c5$^m zm(*7%ota>`zj7E)9@}5Xwf#@Fd1b+s#iKf}(H6YhW%t=&p^;4F%PT#axnX9k1hW)9 zxgIrandds|sMsNG7hP}d^Q8S1x6}nMTw5umh_RHvJqWeF$WwO4Tq1t+A zHnU=BlGTD0OA=s|rF&Sh=znI##5WF6hoSxgsn6Ok9KSJVmF6=_|h+) z9ZhR`Klo*2$*q2!gU|F_?_T}IPr=$1t&UDgSzOj)#Ja8>`|Vu5X2_E73wLeb`mprF z-sT70e(o{l$Q6%!j@cN=YF@&32H>Nn;_T!&qTr@8z}Lu=r_8gOEvkoLfw|x}Znf-2L-rFE~8w>{~51)Xi9OXZePT zoN|wsf_IG_%{5)P{%(Vbe>5l$*fHblm)7*sc6{^v_hY)A;a<+{b^NOthqwDZ@-)x- zbVb*VeC$h4bKhEc)oYE{)~FQK>HS>=t4kf&?_VYR-5^JtqxJu9*l!^Uz6A_;M3@jm z_FKzt!vwnh?>+ASJL~<d(UqYH+RG0457_;+~^wT2!q=|HUfg(WQ=D@7pYP_)%RUo$J~4Gu#j)#wi6L#* zRSXzB$m5z*(Bqfp%n?k}@4Xi?-ZovFPQ8Cw%Uywx#9|+L|!uog}VLuPk-j zc3Eo{T|4Pw>9hRLsjJn!d|j>YOuaRDe6`}urYWjvoR^SzYum+EiMtL2r@gbW+4vsX zaYx^})VX}#G9CY6)4H3VJb3E^#aAu+rak@BdH+6*yJWrJhxK0ludMfTAB1aIZ!g&h z!+OJ>bAn|t+16G{%N)TntIYR#=69KXrS3oOURb?K*Ed+!r)t&uensi`>-dBi|F5z7 z|LD;jb?vq2mHin`@sSsP+PZ$+xvxqGCM!0F6ptC6@8R?QSD#Fry*=cV_wvg8%>fAqRI0hfZQ;nS@y3kdiiU2!o+rNZUHp5O9a-sHf;;~B=d_BW1Bcvr zyKsKqx|n{a{wUqE)^9>)yI+^T)h^s+T;t5cU7O`Mx88C8JZRU~J-1x{^XB9azhAkg zIAVMMgJW8Gw;Ai+Wl-gqVTnC`cW>FUDLMPlJ8@6TN?VjItuJKVi1U82@u8(HTO8~8 zQ-_~+-A_6ibn0wqS-&>zlLAH#`+3N(?_PZ4?IWEEKDM+ic2VCR+hWgK)=%4}eYE+d zt}~a7)onE`^LcmA+Fp0O3;uc~H1C7zO9Ky8wmO{k@!L(OdmH$!!5d$gz5QB?>mP19 zqTf0`&G}T1kd$@vH?11~{+6nRC5^wGJKd+GWyjDpDpS?)%GP_Tew})x#pz#~4LJPf z?cSFkD2xR&-6tQ)J@kX==hch8(zbi*d2o2f+2kh6&OYk6w0p?l2BQ!AtoTc74LmPc z1J7cvS3r0B@6AiF+23cTP3)7;RhC2KuGuE3U7fTZ4pYxc%`=Qzq@##L!maJ{-s%zr1NVbevQ4gFkoeu$wmr}?5sgY!$Br!B94vT1j7VbJV^ zoU1b$^96rS?{&QL_up>C3@`1t$NMLt2I>=*Xoh89CQ zZEsZY%CwDN4ynF$tabBV*AAQN7F&K0KD%?wC9M4m{eN5jUdh@AEz6EZwb;C@tKXcT z9;}|%{q#q}K7D*{ZvUb4KOEC{e}A7;zb*?a_J4VM$KkcnU+28yw(GmF)4MwDJDNGv zGj4Lrgey0GHw{rudtoT|<>$w@y||vAJock8H?AeVzOMH&Yn#D>l@GADlZ)2M*GG_= zY36JHHBaFAs}c@+IYRKW=h{i@F5lEqKr3avbJo^lGi{NfQQGKGycl)ZGg@i*Eo#Cq z`2!Sv^#^wC68y%rUU1{4KlZ&%Ta;O+MxM8A2YO~9k_exXN_U!44fGVikiU)8(0xMP&^-}T#?X{2m<}ROOe6OAl*KA$i4uUnHoxQ6n6zY=u0$dQpLwB_Gs0v3_Bq@weN*>)!$gneG6^o{e{&p3MO=vjqDm8t+ALjcg zGrF50r*#YwG-pb3GbG zvw0GOW2@qQ^}@^lktx?ep$+^ftZFs4&!yC!4%T1}P0OZHBD6wibSOOW@JMlSODo_0 zUos~=FXX$kKXhCCZIgP2k;!Y)lYKism@xH87qzz2uQT`c3GT5fX~YHZrN6$P6&U`_ zGqZGSbz{lb*TFS%Bo&sHAz?b7ZNKTYf>=7qxy=&tlRK?GcrP;e_Q;^Bx!h*|epkPE@HC+H zlryvUURY%M>Vt+KeeNH>I^f95mLGo5?r8Ash;GMoZh!J+(y@x54d*>ue7g6Q{kNOU zd%@?A&pMZx{br;-et(b9t!muIgJ$fRaQ4QgdFz)osXX=ayIv_?pIkZQZ+J94*yC}|qO$w}7yekz5-3`_cu zG0Hn1?+W|9Jm=_-Wr+`lZamTQe=t8B86MgpJO=M~4$BG)4h@Tl2@a3SiVW6;Wg3Gc z>7~t45qN=eW@L>yl_ZnldW!Q&>)M7laTi>+>!DmL7pZaWd>64SKn&ZrS!Ot$!Nz!JWZ7&PVid4*tcIt=}E-$?kwZ_g?t%z^_g%Q+%C2Jo?Vo!-0xF zhJUn26&}8Nedm^s$2Hv6ern&*ozu*#Zs<&Lb7oiWDc$Y=x9n217)k6Juc1q3vONcH^*;o>ax0j z*JbS*Mm9PA>K_|!DRzd>Nlj|-r7|<|H@BCsE3dSl>O1f7iW4_FeBb)@P4#*w?^rw3 z^Y$NKSgu`NtUOrvs`t}Fv)`;gT=`^q($YVF>l<mGvX`ZFP%XO3!g)8wtlC|f+mM{}n4ce&Z2 z1HZpKe9D5oe>Dtxe|zVVyNy>q$O&J5Y0T=cazD_mZg}4JXF;&mnSg2YOliu+bIu7i z6gbsV7Qr&(KQb0zT3j3p+S$i~zn@pPj|zCPx`0t3B1W8?iDb80tQTT(=D$5^S@~x- zFYvT^fyd?r^tt!%JTiOvhpazqT5I)64&QnAqx2T<#5HL@`ln$jYqz^ZH&*uEIc2{` zvkOt9Kl488ekXe08!np;#eAdi)yAEiS+~?M{pIU56|)|UymM^O zp33>tckgXc+21d7D9MdQA>q(pEZt!ol`n{~1y5=uk3GDs$$Qf5#k2u+) zZ?{1QJ{;OT!0FEM3Bx;n)9U-e5%mTpj@$B(yRv&7ZykAVZ~ZMFH#s%9?~gId>iyKJ z_in%K@skp+eY)Q~;j;P1fJ=K4-#GZ|KL4TT%4gk7?k%i-|FuguhrhG&$%Rc>S3g~3 znRx5;t-e3@ZnxSe@ZHsuv&(*XC3F194?0dgGjvJDo^gSJzun5;A2>T`c5KvuPp?di zpLxKw-@#L>dUh;c@WAwNye2)!XT+!lZ+06HHubwrGa6o8+W-E-O}i7T@)n=Ce0oNu zJV$j4BA7hbjTFL0hK91i?nP;E!(cZ^ND=x= z_ZaNr{@EhJzmQ)nSl*$`Ym}Bnf@Qv7d0n2o3vq&*D0G*S;}s3U{#9}`cpD1zMcCnj zBWdPRePK~ZPI0~vD+}O-@MfW!rVe|0N3uQ7^iC2zcJ_|MPEUHX5bYx#R#JxJ`*rvZmf8VW6 zNV~Uw=-On}sSlfun;&!aC&S_RuHz@Py5}?b-8seOv+jSTSjQW1U^zRkRQ6X6^2ioaMfEOY-kmW>4`is6RPj_1NpN z?Tst;j~J9$vA?N4a#6*l@9sUk+hEz7ZLfT}YSFRVBlJDKA6{q4^lmQWT#mbJE@|%j ziB9+7o%5eHQGRl%$LF4bw=Wty-dyy@vW$gixzo!MKYrofqE)Valf2$2YkrJtcX0Dt ztGXwQYZmd@iRH`RnJ}T{qof7R-~WHAyYg_T)<13<*<~5KXt+cPXJn1+C1jFq?2$FH z%f1a2A#0JXj9r^8d$L?(-;0E@OO`Ap#o%|)qHg!zp5MLq>E3_lIp>|{yw7>goHL*0 z`}w|SRpA%ErJL_7t&5doN2V{hG0jYg#JMvlZ}b%WVtHXAX9X8BP3kvwPCN$(%;KL6 z8yvh~V-k6^Gf4}1s?ra|j&Y+BVDp%hA<2_k&1y+AsKx{(pd7T2CyrIgHYT{}k@%gk zUUR=yU14Km)u`qKBll2kMflUc1N>MAHj|f#}5@%gDE&k?-y}RR;ul3xOLWgLNZ8^eWH}GZ2Y*>>`!&W z#8T3+SZMxuMSzJBuHdO%Cr;r`v<}WvE)zyWM@f{5&3RQ&J1av_s&-XyIz*FD);a9` z4IW-@oWPSX3*?g^el9t;q3B+J*GNJ{lTS)dV4{{A;F;bGRJ9hfP_W;>t1FSqzt1Ad zLoLdvro|bmbe^t@ccCA_lVw7R>% zbS?_B-h1B0YS>oOuy0pmj6X~P z@Q2BLmTOQb=yJdggJWNQ$4!?51_y`s?t(yn>vH%*ju4Q3x_u}?qr)F^0CbNyK`dkg z@1&1YU(_LiLckQw*A@vr+{dzi*bTKFM5gFz^+r7+^40V)RgG(OXY3P%*7SqM3U?8p z&iS?s*)zaE352shhMDO)OB*pP%*ziEg&^9{0sI72W;3BKDu|?z=v_@Wg^vS5| z+6;qEW0);>9n*))e&vJ4xZ~AaEF2cpj!bO9Im)J2RL|xathw$xI*+<=w<1_pMf!9n zMIwQuh3}Gi6*NZPXRbqe&2~J#DKBf$;~)uQz7I(dSrkMhH0icC_f=f0#7lnpvdp&w zrWI+BYB+JUTPyBiRinItAzdP5_bGOjPyWpWc%?@Ekgs-|9MKO(M7)vn^g7OrJ#49a z$wu>!!Yn_|SG(V7HHS~8=%2OhJbEoc?`c~+L+xLU?S1Bxo5l>l3kZWI(H2+z8)AFE zGdIXnlec*4W}*mv9Y99`=IG`Iqz0cpLLUS^uxnhYYh|;&uM>o>eW*9(3ZDG)WI$-($X>s1N!tE`X3DGg>GSBg}_%MqoZU*dO1n?1`ev>vN(d)MTFXQvFvbFfRa z&qC8fG!@piM9(K6=?3ws}l=Q2Gwm9>M&<(4zzR$5rq>=ka z#AX)oh0URTE$JK`}nc}C53(o z?4s~O&T-S3<+qhSCOVuH9(-abmlTKF1i=(n=*o;UshZ<^_b9~sVLMtgJLbFt=7+@{ zhzAXvZ?F>?_vNax+EpwJ;|;z<5T->RSvFH}n|z;j;?D95M;~KrJJ)P><3PQ6NEWfbLq*si^sZ;m`!Rj6-{m}_r$fsYU?QCXjG z|Kl^^FPwuEsX@T$14{=rJ4y#v6qm@x7DBESY@yGUZ_(%H{-y8iiV+m}SUA}3irL)# zZ=(O70@WiQnZo6TdLcG(BnrtY3fEt{J)p_8CvTsuNT!GP?V!vYXt&t&fWSdoR7K3<`c&iRhl>IY%a(FPhMqIaqNKP7Y&yXTAjLQ+{7~U0*IFs57f6Ff(V_g z$Tuc`)NyprUI|q-he$nkS`V5mx}56~8f*cW#jdO%pWuGSt~VwPB9#*IkmSfinXI=z zWI+SG@^3G{i`b|+5S7+QL34?iPes6{I~HqxsWuEfg>gMOP(FvbcyL{fYH9IYECK){;Wnw)Z&Fy^++ADa2N%t7$bBtX(^^LI;P;t5#jiL^d z9@Skd!hvSh*MZF(ef1Uz1ZPAhbT1zizF!;OeL64&$7u&RLqbc-+0-32EF4#!v}EuoWH|Nt8a~k-cE;8pLPGE=o=7Xn+BNLoOh;}AHB8eR!gefhd|11n~hgYk#DfbOi}mJA=o{D%cX3MUDu#=oQhptN|GwWH); zNuoVpCO^Y-85F>uU|?QhO^t7Ajqe1fKuONQp-zO1!9A@zNf71I8A zhK0-phAkWJDc7~1b#*rl-sRrQB!SfEA2dKSE$H@hk+;5HkqT+MTC4ZYZ{_kb^0wPp z{98pqE~58cb{Rdp)z}yiP-s0@(DDP^6R+ux><gld)Tiea&hs@nDbEq7 zsK6YFnZ#|zZc<|d#?}!}NpHeUFTDw<-h&fU)O<3Kc;6rTP3DFBTYKD?zGkFn5ZO|B~v>9Uho+ zL|rJwW9OX@V$Nn*=vu%7e%<#%RF-T}1*BT97o{jp$?!-S)4#bYTWqJU*(>#)H`}9y z%&4$KvQb-%tZWE+0BdOE-u`QY{p(cAsbvKD%IX0Dju}!MM7dr&sggppjj{7V - - - System.Reflection.Metadata - - - -

- Represents a disposable blob of memory accessed via unsafe pointer. - - - - - Pointer to the underlying data (not valid after disposal). - - - - - Size of the block. - - - - - Returns the content of the entire memory block. - - - Does not check bounds. - - Only creates a copy of the data if they are not represented by a managed byte array, - or if the specified range doens't span the entire block. - - - - - Disposes the block. - - - The operation is idempotent, but must not be called concurrently with any other operations on the block - or with another call to Dispose. - - Using the block after dispose is an error in our code and therefore no effort is made to throw a tidy - ObjectDisposedException and null ref or AV is possible. - - - - - Represents a memory block backed by an array of bytes. - - - - - Class representing raw memory but not owning the memory. - - - - - Represents raw memory owned by an external object. - - - - - Creates and hydrates a memory block representing all data. - - Error while reading from the memory source. - - - - Creates and hydrates a memory block representing data in the specified range. - - Starting offset relative to the beginning of the data represented by this provider. - Size of the resulting block. - Error while reading from the memory source. - - - IO error while reading from the underlying stream. - - - - Gets a seekable and readable that can be used to read all data. - The operations on the stream has to be done under a lock of if non-null. - The image starts at and has size . - It is the caller's responsibility not to read outside those bounds. - - - - - The size of the data. - - - - - Represents memory block allocated on native heap. - - - Owns the native memory resource. - - - - - Represents data read from a stream. - - - Uses memory map to load data from streams backed by files that are bigger than . - - - - Error while reading from the stream. - - - IO error while mapping memory or not enough memory to create the mapping. - - - - Provides helpers to decode strings from unmanaged memory to System.String while avoiding - intermediate allocation. - - This has three components: - - (1) Light-up Encoding.GetString(byte*, int) via reflection and resurface it as extension - method. - - This is a new API that will provide API convergence across all platforms for - this scenario. It is already on .NET 4.6+ and ASP.NET vNext, but not yet available - on every platform we support. See below for how we fall back. - - (2) Deal with WinRT prefixes. - - When reading managed winmds with projections enabled, the metadata reader needs to prepend - a WinRT prefix in some case . Doing this without allocation poses a problem - as we don't have the prefix and input in contiguous data that we can pass to the - Encoding.GetString. We handle this case using pooled managed scratch buffers where we copy - the prefix and input and decode using Encoding.GetString(byte[], int, int). - - (3) Deal with platforms that don't yet have Encoding.GetString(byte*, int). - - If we're running on a full framework earlier than 4.6, we will bind to the internal - String.CreateStringFromEncoding which is equivalent and Encoding.GetString is just a trivial - wrapper around it in .NET 4.6. This means that we always have the fast path on every - full framework version we support. - - If we can't bind to it via reflection, then we emulate it using what is effectively (2) and - with an empty prefix. - - For both (2) and (3), the pooled buffers have a fixed size deemed large enough for the - vast majority of metadata strings. In the rare worst case (byteCount > threshold and - (lightUpAttemptFailed || prefix != null), we give up and allocate a temporary array, - copy to it, decode, and throw it away. - - - - - The offset bias value used in the FNV-1a algorithm - See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function - - - - - The generative factor used in the FNV-1a algorithm - See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function - - - - - Compute the FNV-1a hash of a sequence of bytes - See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function - - The sequence of bytes - The FNV-1a hash of - - - - Compute the FNV-1a hash of a sequence of bytes - See http://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function - - The sequence of bytes - The FNV-1a hash of - - - - Provides tools for using in interop scenarios. - - - *** WARNING *** - - If you decide to copy this code elsewhere, please retain the documentation here - and the Dangerous prefixes in the API names. This will help track down and audit - other places where this technique (with dangerous consequences when misused) may - be applied. - - A generic version of this API was once public in a pre-release of immutable - collections, but it was deemed to be too subject to abuse when available publicly. - - This implementation is scoped to byte arrays as that is all that the metadata reader needs. - - Also, since we don't have access to immutable collection internals, we use a trick involving - overlapping a with a refer. While - unverifiable, it is valid. See ECMA-335, section II.10.7 Controlling instance layout: - - "It is possible to overlap fields in this way, though offsets occupied by an object reference - shall not overlap with offsets occupied by a built-in value type or a part of - another object reference. While one object reference can completely overlap another, this is - unverifiable." - - Furthermore, the fact that backed by a single - field is something inherent to the design of ImmutableArray in order to get its performance - characteristics and therefore something we (Microsoft) are comfortable defining as a contract that - can be depended upon as below. - - - - - Creates a new instance of using a given mutable array as the backing - field, without creating a defensive copy. It is the responsibility of the caller to ensure no other mutable - references exist to the array. Do not mutate the array after calling this method. - - The mutable array to use as the backing field. The incoming reference is set to null - since it should not be retained by the caller. - - Users of this method should take extra care to ensure that the mutable array given as a parameter - is never modified. The returned will use the given array as its backing - field without creating a defensive copy, so changes made to the given mutable array will be observable - on the returned . Instance and static methods of - and may malfunction if they operate on an instance - whose underlying backing field is modified. - - An immutable array. - - - - Access the backing mutable array instance for the given , without - creating a defensive copy. It is the responsibility of the caller to ensure the array is not modified - through the returned mutable reference. Do not mutate the returned array. - - The from which to retrieve the backing field. - - Users of this method should take extra care to ensure that the returned mutable array is never modified. - The returned mutable array continues to be used as the backing field of the given - without creating a defensive copy, so changes made to the returned mutable array will be observable - on the given . Instance and static methods of - and may malfunction if they operate on an instance - whose underlying backing field is modified. - - The underlying array, or null if is true. - - - - Decodes a compressed integer value starting at offset. - See Metadata Specification section II.23.2: Blobs and signatures. - - Offset to the start of the compressed data. - Bytes actually read. - - Value between 0 and 0x1fffffff, or if the value encoding is invalid. - - - - - Read UTF8 at the given offset up to the given terminator, null terminator, or end-of-block. - - Offset in to the block where the UTF8 bytes start. - UTF8 encoded prefix to prepend to the bytes at the offset before decoding. - The UTF8 decoder to use that allows user to adjust fallback and/or reuse existing strings without allocating a new one. - The number of bytes read, which includes the terminator if we did not hit the end of the block. - A character in the ASCII range that marks the end of the string. - If a value other than '\0' is passed we still stop at the null terminator if encountered first. - The decoded string. - - - - Get number of bytes from offset to given terminator, null terminator, or end-of-block (whichever comes first). - Returned length does not include the terminator, but numberOfBytesRead out parameter does. - - Offset in to the block where the UTF8 bytes start. - A character in the ASCII range that marks the end of the string. - If a value other than '\0' is passed we still stop at the null terminator if encountered first. - The number of bytes read, which includes the terminator if we did not hit the end of the block. - Length (byte count) not including terminator. - - - - In a table that specifies children via a list field (e.g. TypeDef.FieldList, TypeDef.MethodList), - searches for the parent given a reference to a child. - - Returns row number [0..RowCount). - - - - In a table ordered by a column containing entity references searches for a row with the specified reference. - - Returns row number [0..RowCount) or -1 if not found. - - - - Calculates a range of rows that have specified value in the specified column in a table that is sorted by that column. - - - - - Calculates a range of rows that have specified value in the specified column in a table that is sorted by that column. - - - - - The usage is: - var inst = PooledStringBuilder.GetInstance(); - var sb = inst.builder; - ... Do Stuff... - ... sb.ToString() ... - inst.Free(); - - - - - Generic implementation of object pooling pattern with predefined pool size limit. The main - purpose is that limited number of frequently used objects can be kept in the pool for - further recycling. - - Notes: - 1) it is not the goal to keep all returned objects. Pool is not meant for storage. If there - is no space in the pool, extra returned objects will be dropped. - - 2) it is implied that if object was obtained from a pool, the caller will return it back in - a relatively short time. Keeping checked out objects for long durations is ok, but - reduces usefulness of pooling. Just new up your own. - - Not returning objects to the pool in not detrimental to the pool's work, but is a bad practice. - Rationale: - If there is no intent for reusing the object, do not use pool - just use "new". - - - - - Produces an instance. - - - Search strategy is a simple linear probing which is chosen for it cache-friendliness. - Note that Free will try to store recycled objects close to the start thus statistically - reducing how far we will typically search. - - - - - Returns objects to the pool. - - - Search strategy is a simple linear probing which is chosen for it cache-friendliness. - Note that Free will try to store recycled objects close to the start thus statistically - reducing how far we will typically search in Allocate. - - - - - Copies specified amount of data from given stream to a target memory pointer. - - unexpected stream end. - - - - Attempts to read all of the requested bytes from the stream into the buffer - - - The number of bytes read. Less than will - only be returned if the end of stream is reached before all bytes can be read. - - - Unlike it is not guaranteed that - the stream position or the output buffer will be unchanged if an exception is - returned. - - - - - Resolve image size as either the given user-specified size or distance from current position to end-of-stream. - Also performs the relevant argument validation and publicly visible caller has same argument names. - - size is 0 and distance from current position to end-of-stream can't fit in Int32. - Size is negative or extends past the end-of-stream from current position. - - - - Sets the capacity of the specified table. - - is not a valid table index. - is negative. - - Use to reduce allocations if the approximate number of rows is known ahead of time. - - - - - Returns the current number of entires in the specified table. - - Table index. - The number of entires in the table. - is not a valid table index. - - - - Returns the current number of entires in each table. - - - An array of size with each item filled with the current row count of the corresponding table. - - - - - Adds a type definition. - - Attributes - Namespace - Type name - , , or nil. - - If the type declares fields the handle of the first one, otherwise the handle of the first field declared by the next type definition. - If no type defines any fields in the module, (1). - - - If the type declares methods the handle of the first one, otherwise the handle of the first method declared by the next type definition. - If no type defines any methods in the module, (1). - - doesn't have the expected handle kind. - - - - Adds an interface implementation to a type. - - The type implementing the interface. - - The interface being implemented: - , or . - - doesn't have the expected handle kind. - - - - Add a type reference. - - - The entity declaring the target type: - , , , , or nil. - - Namespace. - Type name. - doesn't have the expected handle kind. - - - - Adds a property defintion. - - Attributes - Name - Signature of the property. - - - - Adds an event defintion. - - Attributes - Name - Type of the event: , , or - doesn't have the expected handle kind. - - - - Adds a default value for a parameter, field or property. - - , , or - The constant value. - doesn't have the expected handle kind. - - - - Associates a method (a getter, a setter, an adder, etc.) with a property or an event. - - or . - Semantics. - Method definition. - doesn't have the expected handle kind. - - - - Add a custom attribute. - - - An entity to attach the custom attribute to: - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - or - . - - - Custom attribute constructor: or - - - Custom attribute value blob. - - doesn't have the expected handle kind. - - - - Adds a method specification (instantiation). - - Generic method: or - Instantiation blob encoding the generic arguments of the method. - doesn't have the expected handle kind. - - - - Adds a parameter definition. - - - Parameter name (optional). - Sequence number of the parameter. Value of 0 refers to the owner method's return type; its parameters are then numbered from 1 onwards. - is greater than . - - - - Adds a generic parameter definition. - - or - Attributes. - Parameter name. - Zero-based parameter index. - doesn't have the expected handle kind. - is greater than . - - - - Adds a type constraint to a generic parameter. - - Generic parameter to constrain. - Type constraint: , or - doesn't have the expected handle kind. - - - - Add marshalling information to a field or a parameter. - - or . - Descriptor. - doesn't have the expected handle kind. - - - - Adds a mapping from a field to its initial value stored in the PE image. - - Field handle. - - Offset within the block in the PE image that stores initial values of mapped fields (usually in .text section). - The final relative virtual address stored in the metadata is calculated when the metadata is serialized - by adding the offset to the virtual address of the block start. - - is negative. - - - - Adds a method definition. - - - - Method name/ - Method signature. - - Offset within the block in the PE image that stores method bodies (IL stream), - or -1 if the method doesn't have a body. - - The final relative virtual address stored in the metadata is calculated when the metadata is serialized - by adding the offset to the virtual address of the beginning of the block. - - - If the method declares parameters in Params table the handle of the first one, otherwise the handle of the first parameter declared by the next method definition. - If no parameters are declared in the module, (1). - - is less than -1. - - - - Adds import information to a method definition (P/Invoke). - - Method definition. - Attributes - Unmanaged method name. - Module containing the unmanaged method. - - - - Defines an implementation for a method declaration within a type. - - Type - or which provides the implementation. - or the method being implemented. - or doesn't have the expected handle kind. - - - - Adds a MemberRef table row. - - Containing entity: - , - , - , - , or - . - - Member name. - Member signature. - doesn't have the expected handle kind. - - - - Adds a manifest resource. - - Attributes - Resource name - , , or nil - Specifies the byte offset within the referenced file at which this resource record begins. - doesn't have the expected handle kind. - - - - Adds an exported type. - - Attributes - Namespace - Type name - , or - Type definition id - doesn't have the expected handle kind. - - - - Adds declarative security attribute to a type, method or an assembly. - - , , or - Security action - Permission set blob. - doesn't have the expected handle kind. - - - - Add document debug information. - - - Document Name blob. - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#document-name-blob - - - GUID of the hash algorithm used to calculate the value of . - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#document-table-0x30 for common values. - - - The hash of the document content. - - - GUID of the language. - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#document-table-0x30 for common values. - - - - - Add method debug information. - - - The handle of a single document containing all sequence points of the method, or nil if the method doesn't have sequence points or spans multiple documents. - - - Sequence Points blob, or nil if the method doesn't have sequence points. - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#sequence-points-blob. - - - - - Add local scope debug information. - - The containing method. - Handle of the associated import scope. - - If the scope declares variables the handle of the first one, otherwise the handle of the first variable declared by the next scope definition. - If no scope defines any variables, (1). - - - If the scope declares constants the handle of the first one, otherwise the handle of the first constant declared by the next scope definition. - If no scope defines any constants, (1). - - Offset of the first instruction covered by the scope. - The length (in bytes) of the scope. - - - - Add local variable debug information. - - - Local variable index in the local signature (zero-based). - Name of the variable. - is greater than . - - - - Add local constant debug information. - - Name of the variable. - - LocalConstantSig blob, see https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#localconstantsig-blob. - - - - - Add local scope debug information. - - Parent scope handle. - - Imports blob, see https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#imports-blob. - - - - - Add state machine method debug information. - - Handle of the MoveNext method of the state machine (the compiler-generated method). - Handle of the kickoff method (the user defined iterator/async method) - - - - Add custom debug information. - - - An entity to attach the debug information to: - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - or - . - - Information kind. Determines the structure of the blob. - Custom debug information blob. - doesn't have the expected handle kind. - - - - Creates a builder for metadata tables and heaps. - - - Start offset of the User String heap. - The cumulative size of User String heaps of all previous EnC generations. Should be 0 unless the metadata is EnC delta metadata. - - - Start offset of the String heap. - The cumulative size of String heaps of all previous EnC generations. Should be 0 unless the metadata is EnC delta metadata. - - - Start offset of the Blob heap. - The cumulative size of Blob heaps of all previous EnC generations. Should be 0 unless the metadata is EnC delta metadata. - - - Start offset of the Guid heap. - The cumulative size of Guid heaps of all previous EnC generations. Should be 0 unless the metadata is EnC delta metadata. - - Offset is too big. - Offset is negative. - is not a multiple of size of GUID. - - - - Sets the capacity of the specified table. - - Heap index. - Number of bytes. - is not a valid heap index. - is negative. - - Use to reduce allocations if the approximate number of bytes is known ahead of time. - - - - - Adds specified blob to Blob heap, if it's not there already. - - containing the blob. - Handle to the added or existing blob. - is null. - - - - Adds specified blob to Blob heap, if it's not there already. - - Array containing the blob. - Handle to the added or existing blob. - is null. - - - - Adds specified blob to Blob heap, if it's not there already. - - Array containing the blob. - Handle to the added or existing blob. - is null. - - - - Encodes a constant value to a blob and adds it to the Blob heap, if it's not there already. - Uses UTF16 to encode string constants. - - Constant value. - Handle to the added or existing blob. - - - - Encodes a string using UTF16 encoding to a blob and adds it to the Blob heap, if it's not there already. - - String. - Handle to the added or existing blob. - is null. - - - - Encodes a string using UTF8 encoding to a blob and adds it to the Blob heap, if it's not there already. - - Constant value. - - True to encode unpaired surrogates as specified, otherwise replace them with U+FFFD character. - - Handle to the added or existing blob. - is null. - - - - Adds specified Guid to Guid heap, if it's not there already. - - Guid to add. - Handle to the added or existing Guid. - - - - Reserves space on the Guid heap for a GUID. - - - representing the GUID blob as stored on the heap. - - Handle to the reserved Guid. - The remaining space on the heap is too small to fit the string. - - - - Adds specified string to String heap, if it's not there already. - - Array containing the blob. - Handle to the added or existing blob. - is null. - - - - Reserves space on the User String heap for a string of specified length. - - The number of characters to reserve. - - representing the entire User String blob (including its length and terminal character). - Use to fill in the content. - - - Handle to the reserved User String. - May be used in . - - The remaining space on the heap is too small to fit the string. - is negative. - - - - Adds specified string to User String heap, if it's not there already. - - String to add. - - Handle to the added or existing string. - May be used in . - - The remaining space on the heap is too small to fit the string. - is null. - - - - Fills in stringIndexMap with data from stringIndex and write to stringWriter. - Releases stringIndex as the stringTable is sealed after this point. - - - - - Sorts strings such that a string is followed immediately by all strings - that are a suffix of it. - - - - - Builder of a Metadata Root to be embedded in a Portable Executable image. - - - Metadata root constitutes of a metadata header followed by metadata streams (#~, #Strings, #US, #Guid and #Blob). - - - - - Creates a builder of a metadata root. - - - Builder populated with metadata entities stored in tables and values stored in heaps. - The entities and values will be enumerated when serializing the metadata root. - - - The version string written to the metadata header. The default value is "v4.0.30319". - - is null. - is too long (the number of bytes when UTF8-encoded must be less than 255). - - - - Metadata version string. - - - - - Returns sizes of various metadata structures. - - - - - Serialized the metadata root content into the given . - - Builder to write to. - - The relative virtual address of the start of the method body stream. - Used to calculate the final value of RVA fields of MethodDef table. - - - The relative virtual address of the start of the field init data stream. - Used to calculate the final value of RVA fields of FieldRVA table. - - is null. - or is negative. - - - - Decodes custom attribute blobs. - - - - - Calculates a HasCustomAttribute coded index for the specified handle. - - - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - or - . - - Unexpected handle kind. - - - - Calculates a HasConstant coded index for the specified handle. - - , , or - Unexpected handle kind. - - - - Calculates a CustomAttributeType coded index for the specified handle. - - or - Unexpected handle kind. - - - - Calculates a HasDeclSecurity coded index for the specified handle. - - , , or - Unexpected handle kind. - - - - Calculates a HasFieldMarshal coded index for the specified handle. - - or - Unexpected handle kind. - - - - Calculates a HasSemantics coded index for the specified handle. - - or - Unexpected handle kind. - - - - Calculates a Implementation coded index for the specified handle. - - , or - Unexpected handle kind. - - - - Calculates a MemberForwarded coded index for the specified handle. - - , - Unexpected handle kind. - - - - Calculates a MemberRefParent coded index for the specified handle. - - - , - , - , - , or - . - - Unexpected handle kind. - - - - Calculates a MethodDefOrRef coded index for the specified handle. - - or - Unexpected handle kind. - - - - Calculates a ResolutionScope coded index for the specified handle. - - , , or - Unexpected handle kind. - - - - Calculates a TypeDefOrRef coded index for the specified handle. - - or - Unexpected handle kind. - - - - Calculates a TypeDefOrRefOrSpec coded index for the specified handle. - - , or - Unexpected handle kind. - - - - Calculates a TypeOrMethodDef coded index for the specified handle. - - or - Unexpected handle kind. - - - - Calculates a HasCustomDebugInformation coded index for the specified handle. - - - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - , - or - . - - Unexpected handle kind. - - - - Builder of a Portable PDB image. - - - - - Creates a builder of a Portable PDB image. - - - Builder populated with debug metadata entities stored in tables and values stored in heaps. - The entities and values will be enumerated when serializing the Portable PDB image. - - - Row counts of all tables that the associated type-system metadata contain. - Each slot in the array corresponds to a table (). - The length of the array must be equal to . - - - Entry point method definition handle. - - - Function calculating id of content represented as a sequence of blobs. - If not specified a default function that ignores the content and returns current time-based content id is used - (). - You must specify a deterministic function to produce a deterministic Portable PDB image. - - or is null. - - - - Serialized #Pdb stream. - - - - - Serializes Portable PDB content into the given . - - Builder to write to. - The id of the serialized content. - is null. - - - is not in range [0, 0xffff]. - - - is not in range [0, 0xffff]. - - - is not in range [0, 0x1fffffff]. - - - is not in range [0, 0x1fffffff]. - - - - Encodes null literal of type . - - - - - Encodes constant literal. - - - Constant of type - , - , - , - , - , - , - , - , - , - , - , - (encoded as two-byte Unicode character), - (encoded as SerString), or - (encoded as the underlying integer value). - - Unexpected constant type. - - - - Encodes literal of type (possibly null). - - The name of the type, or null. - is empty. - - - - Writes primitive type code. - - Any primitive type code except for and . - is not valid in this context. - - - - Encodes a reference to a type. - - or . - True to mark the type as value type, false to mark it as a reference type in the signature. - doesn't have the expected handle kind. - - - - Starts a function pointer signature. - - Calling convention. - Function pointer attributes. - Generic parameter count. - is invalid. - is not in range [0, 0xffff]. - - - - Starts a generic instantiation signature. - - or . - Generic argument count. - True to mark the type as value type, false to mark it as a reference type in the signature. - doesn't have the expected handle kind. - is not in range [1, 0xffff]. - - - - Encodes a reference to type parameter of a containing generic method. - - Parameter index. - is not in range [0, 0xffff]. - - - - Encodes a reference to type parameter of a containing generic type. - - Parameter index. - is not in range [0, 0xffff]. - - - - Starts pointer signature. - - - - - Encodes void*. - - - - - Starts SZ array (vector) signature. - - - - - Starts a signature of a type with custom modifiers. - - - - - Encodes a custom modifier. - - , or . - Is optional modifier. - Encoder of subsequent modifiers. - is nil or of an unexpected kind. - - - - Encodes array shape. - - The number of dimensions in the array (shall be 1 or more). - - Dimension sizes. The array may be shorter than but not longer. - - - Dimension lower bounds, or default() to set all lower bounds to 0. - The array may be shorter than but not longer. - - - is outside of range [1, 0xffff], - smaller than .Length, or - smaller than .Length. - - is null. - - - - Provides information on sizes of various metadata structures. - - - - - Exact (unaligned) heap sizes. - - Use to get an aligned heap size. - - - - Table row counts. - - - - - External table row counts. - - - - - Non-empty tables that are emitted into the metadata table stream. - - - - - Non-empty tables stored in an external metadata table stream that might be referenced from the metadata table stream being emitted. - - - - - Overall size of metadata stream storage (stream headers, table stream, heaps, additional streams). - Aligned to . - - - - - The size of metadata stream (#- or #~). Aligned. - Aligned to . - - - - - The size of #Pdb stream. Aligned. - - - - - Metadata header size. - Includes: - - metadata storage signature - - storage header - - stream headers - - - - - Total size of metadata (header and all streams). - - - - - Returns aligned size of the specified heap. - - - - - Decodes signature blobs. - See Metadata Specification section II.23.2: Blobs and signatures. - - - - - Creates a new SignatureDecoder. - - The provider used to obtain type symbols as the signature is decoded. - - The metadata reader from which the signature was obtained. It may be null if the given provider allows it. - - - - - Decodes a type embedded in a signature and advances the reader past the type. - - The blob reader positioned at the leading SignatureTypeCode - Allow a to follow a (CLASS | VALUETYPE) in the signature. - At present, the only context where that would be valid is in a LocalConstantSig as defined by the Portable PDB specification. - - The decoded type. - The reader was not positioned at a valid signature type. - - - - Decodes a list of types, with at least one instance that is preceded by its count as a compressed integer. - - - - - Decodes a method (definition, reference, or standalone) or property signature blob. - - BlobReader positioned at a method signature. - The decoded method signature. - The method signature is invalid. - - - - Decodes a method specification signature blob and advances the reader past the signature. - - A BlobReader positioned at a valid method specification signature. - The types used to instantiate a generic method via the method specification. - - - - Decodes a local variable signature blob and advances the reader past the signature. - - The blob reader positioned at a local variable signature. - The local variable types. - The local variable signature is invalid. - - - - Decodes a field signature blob and advances the reader past the signature. - - The blob reader positioned at a field signature. - The decoded field type. - - - - Provides an extension method to access the TypeDefinitionId column of the ExportedType table. - - - - - Gets a hint at the likely row number of the target type in the TypeDef table of its module. - If the namespaces and names do not match, resolution falls back to a full search of the - target TypeDef table. Ignored and should be zero if is - true. - - - - - Provides extension methods for working with certain raw elements of the ECMA-335 metadata tables and heaps. - - - - - Returns the number of rows in the specified table. - - is null. - is not a valid table index. - - - - Returns the size of a row in the specified table. - - is null. - is not a valid table index. - - - - Returns the offset from the start of metadata to the specified table. - - is null. - is not a valid table index. - - - - Returns the size of the specified heap. - - is null. - is not a valid heap index. - - - - Returns the offset from the start of metadata to the specified heap. - - is null. - is not a valid heap index. - - - - Returns the size of the specified heap. - - is null. - is not a valid heap index. - - - - Returns the a handle to the UserString that follows the given one in the UserString heap or a nil handle if it is the last one. - - is null. - - - - Returns the a handle to the Blob that follows the given one in the Blob heap or a nil handle if it is the last one. - - is null. - - - - Returns the a handle to the String that follows the given one in the String heap or a nil handle if it is the last one. - - is null. - - - - Enumerates entries of EnC log. - - is null. - - - - Enumerates entries of EnC map. - - is null. - - - - Enumerate types that define one or more properties. - - - The resulting sequence corresponds exactly to entries in PropertyMap table, - i.e. n-th returned is stored in n-th row of PropertyMap. - - - - - Enumerate types that define one or more events. - - - The resulting sequence corresponds exactly to entries in EventMap table, - i.e. n-th returned is stored in n-th row of EventMap. - - - - - Given a type handle and a raw type kind found in a signature blob determines whether the target type is a value type or a reference type. - - - - - Maximum number of tables that can be present in Ecma335 metadata. - - - - - Maximum number of tables that can be present in Ecma335 metadata. - - - - - Returns the row number of a metadata table entry that corresponds - to the specified in the context of . - - One based row number. - The is not a valid metadata table handle. - - - - Returns the offset of metadata heap data that corresponds - to the specified in the context of . - - Zero based offset, or -1 if isn't a metadata heap handle. - The operation is not supported for the specified . - The is invalid. - - - - Returns the metadata token of the specified in the context of . - - Metadata token. - The operation is not supported for the specified . - - - - Returns the metadata token of the specified in the context of . - - Metadata token. - - Handle represents a metadata entity that doesn't have a token. - A token can only be retrieved for a metadata table handle or a heap handle of type . - - The operation is not supported for the specified . - - - - Returns the row number of a metadata table entry that corresponds - to the specified . - - - One based row number, or -1 if can only be interpreted in a context of a specific . - See . - - - - - Returns the offset of metadata heap data that corresponds - to the specified . - - - An offset in the corresponding heap, or -1 if can only be interpreted in a context of a specific or . - See . - - - - - Returns the offset of metadata heap data that corresponds - to the specified . - - - Zero based offset, or -1 if can only be interpreted in a context of a specific or . - See . - - - - - Returns the offset of metadata heap data that corresponds - to the specified . - - - Zero based offset, or -1 if can only be interpreted in a context of a specific or . - See . - - - - - Returns the offset of metadata heap data that corresponds - to the specified . - - - Zero based offset, or -1 if can only be interpreted in a context of a specific or . - See . - - - - - Returns the offset of metadata heap data that corresponds - to the specified . - - - Zero based offset, or -1 if can only be interpreted in a context of a specific or . - See . - - - - - Returns the metadata token of the specified . - - - Metadata token, or 0 if can only be interpreted in a context of a specific . - See . - - - Handle represents a metadata entity that doesn't have a token. - A token can only be retrieved for a metadata table handle or a heap handle of type . - - - - - Returns the metadata token of the specified . - - - Metadata token, or 0 if can only be interpreted in a context of a specific . - See . - - - - - Gets the of the table corresponding to the specified . - - Handle type. - Table index. - True if the handle type corresponds to an Ecma335 or Portable PDB table, false otherwise. - - - - Gets the of the heap corresponding to the specified . - - Handle type. - Heap index. - True if the handle type corresponds to an Ecma335 heap, false otherwise. - - - - Creates a handle from a token value. - - - is not a valid metadata token. - It must encode a metadata table entity or an offset in heap. - - - - - Creates an entity handle from a token value. - - is not a valid metadata entity token. - - - - Creates an from a token value. - - - is not a valid table index. - - - - Creates an from a token value. - - - is not a valid table index. - - - - Returns true if the given raw (non-virtual) handle represents the same string as given ASCII string. - - - - - Returns the heap index of the given ASCII character or -1 if not found prior null terminator or end of heap. - - - - - Returns true if the given raw (non-virtual) handle represents a string that starts with given ASCII prefix. - - - - - Equivalent to Array.BinarySearch, searches for given raw (non-virtual) handle in given array of ASCII strings. - - - - - These constants are all in the byte range and apply to the interpretation of , - - - - - Use the highest bit to mark tokens that are virtual (synthesized). - We create virtual tokens to represent projected WinMD entities. - - - - - In the case of string handles, the two lower bits that (in addition to the - virtual bit not included in this mask) encode how to obtain the string value. - - - - - Use the highest bit to mark tokens that are virtual (synthesized). - We create virtual tokens to represent projected WinMD entities. - - - - - Returns true if the token value can escape the metadata reader. - We don't allow virtual tokens and heap tokens other than UserString to escape - since the token type ids are internal to the reader and not specified by ECMA spec. - - Spec (Partition III, 1.9 Metadata tokens): - Many CIL instructions are followed by a "metadata token". This is a 4-byte value, that specifies a row in a - metadata table, or a starting byte offset in the User String heap. - - For example, a value of 0x02 specifies the TypeDef table; a value of 0x70 specifies the User - String heap.The value corresponds to the number assigned to that metadata table (see Partition II for the full - list of tables) or to 0x70 for the User String heap.The least-significant 3 bytes specify the target row within that - metadata table, or starting byte offset within the User String heap. - - - - - Returns whether the namespaceTable has been created. If it hasn't, calling a GetXXX method - on this will probably have a very high amount of overhead. - - - - - This will return a StringHandle for the simple name of a namespace name at the given segment index. - If no segment index is passed explicitly or the "segment" index is greater than or equal to the number - of segments, then the last segment is used. "Segment" in this context refers to part of a namespace - name between dots. - - Example: Given a NamespaceDefinitionHandle to "System.Collections.Generic.Test" called 'handle': - - reader.GetString(GetSimpleName(handle)) == "Test" - reader.GetString(GetSimpleName(handle, 0)) == "System" - reader.GetString(GetSimpleName(handle, 1)) == "Collections" - reader.GetString(GetSimpleName(handle, 2)) == "Generic" - reader.GetString(GetSimpleName(handle, 3)) == "Test" - reader.GetString(GetSimpleName(handle, 1000)) == "Test" - - - - - Two distinct namespace handles represent the same namespace if their full names are the same. This - method merges builders corresponding to such namespace handles. - - - - - This will take 'table' and merge all of the NamespaceData instances that point to the same - namespace. It has to create 'stringTable' as an intermediate dictionary, so it will hand it - back to the caller should the caller want to use it. - - - - - Creates a NamespaceDataBuilder instance that contains a synthesized NamespaceDefinitionHandle, - as well as the name provided. - - - - - Quick convenience method that handles linking together child + parent - - - - - Links a child to its parent namespace. If the parent namespace doesn't exist, this will create a - virtual one. This will automatically link any virtual namespaces it creates up to its parents. - - - - - This will link all parents/children in the given namespaces dictionary up to each other. - - In some cases, we need to synthesize namespaces that do not have any type definitions or forwarders - of their own, but do have child namespaces. These are returned via the virtualNamespaces out - parameter. - - - - - Loops through all type definitions in metadata, adding them to the given table - - - - - Loops through all type forwarders in metadata, adding them to the given table - - - - - Populates namespaceList with distinct namespaces. No ordering is guaranteed. - - - - - If the namespace table doesn't exist, populates it! - - - - - If the namespace list doesn't exist, populates it! - - - - - An intermediate class used to build NamespaceData instances. This was created because we wanted to - use ImmutableArrays in NamespaceData, but having ArrayBuilders and ImmutableArrays that served the - same purpose in NamespaceData got ugly. With the current design of how we create our Namespace - dictionary, this needs to be a class because we have a many-to-one mapping between NamespaceHandles - and NamespaceData. So, the pointer semantics must be preserved. - - This class assumes that the builders will not be modified in any way after the first call to - Freeze(). - - - - - Returns a NamespaceData that represents this NamespaceDataBuilder instance. After calling - this method, it is an error to use any methods or fields except Freeze() on the target - NamespaceDataBuilder. - - - - - Returns field offset for given field RowId, or -1 if not available. - - - - - In CLI metadata equal to the actual number of entries in AssemblyRef table. - In WinMD metadata it includes synthesized AssemblyRefs in addition. - - - - - Represents a metadata entity (type reference/definition/specification, method definition, custom attribute, etc.). - - - Use to store multiple kinds of entity handles. - It has smaller memory footprint than . - - - - - Value stored in a specific entity handle (see , , etc.). - - - - - Compares the current content of this writer with another one. - - - - Range specified by and falls outside of the bounds of the buffer content. - - - Range specified by and falls outside of the bounds of the buffer content. - - - is negative. - - - is null. - is negative. - - - is null. - - - is null. - is negative. - - - is null. - - - is null. - Range specified by and falls outside of the bounds of the . - - - is null. - - - is null. - Range specified by and falls outside of the bounds of the . - - - - Writes a reference to a heap (heap offset) or a table (row number). - - Heap offset or table row number. - True to encode the reference as 16-bit integer, false to encode as 32-bit integer. - - - - Writes UTF16 (little-endian) encoded string at the current position. - - is null. - - - - Writes UTF16 (little-endian) encoded string at the current position. - - is null. - - - - Writes string in SerString format (see ECMA-335-II 23.3 Custom attributes). - - - The string is UTF8 encoded and prefixed by the its size in bytes. - Null string is represented as a single byte 0xFF. - - Builder is not writable, it has been linked with another one. - - - - Writes string in User String (#US) heap format (see ECMA-335-II 24.2.4 #US and #Blob heaps): - - - The string is UTF16 encoded and prefixed by the its size in bytes. - - This final byte holds the value 1 if and only if any UTF16 character within the string has any bit set in its top byte, - or its low byte is any of the following: 0x01–0x08, 0x0E–0x1F, 0x27, 0x2D, 0x7F. Otherwise, it holds 0. - The 1 signifies Unicode characters that require handling beyond that normally provided for 8-bit encoding sets. - - Builder is not writable, it has been linked with another one. - - - - Writes UTF8 encoded string at the current position. - - is null. - - - - Implements compressed signed integer encoding as defined by ECMA-335-II chapter 23.2: Blobs and signatures. - - - If the value lies between -64 (0xFFFFFFC0) and 63 (0x3F), inclusive, encode as a one-byte integer: - bit 7 clear, value bits 5 through 0 held in bits 6 through 1, sign bit (value bit 31) in bit 0. - - If the value lies between -8192 (0xFFFFE000) and 8191 (0x1FFF), inclusive, encode as a two-byte integer: - 15 set, bit 14 clear, value bits 12 through 0 held in bits 13 through 1, sign bit(value bit 31) in bit 0. - - If the value lies between -268435456 (0xF000000) and 268435455 (0x0FFFFFFF), inclusive, encode as a four-byte integer: - 31 set, 30 set, bit 29 clear, value bits 27 through 0 held in bits 28 through 1, sign bit(value bit 31) in bit 0. - - can't be represented as a compressed signed integer. - - - - Implements compressed unsigned integer encoding as defined by ECMA-335-II chapter 23.2: Blobs and signatures. - - - If the value lies between 0 (0x00) and 127 (0x7F), inclusive, - encode as a one-byte integer (bit 7 is clear, value held in bits 6 through 0). - - If the value lies between 28 (0x80) and 214 – 1 (0x3FFF), inclusive, - encode as a 2-byte integer with bit 15 set, bit 14 clear(value held in bits 13 through 0). - - Otherwise, encode as a 4-byte integer, with bit 31 set, bit 30 set, bit 29 clear (value held in bits 28 through 0). - - can't be represented as a compressed unsigned integer. - - - - Writes a constant value (see ECMA-335 Partition II section 22.9) at the current position. - - is not of a constant type. - - - - Returns a sequence of all blobs that represent the content of the builder. - - Content is not available, the builder has been linked with another one. - - - - Compares the current content of this writer with another one. - - Content is not available, the builder has been linked with another one. - - - Content is not available, the builder has been linked with another one. - - - Range specified by and falls outside of the bounds of the buffer content. - Content is not available, the builder has been linked with another one. - - - Content is not available, the builder has been linked with another one. - - - Range specified by and falls outside of the bounds of the buffer content. - Content is not available, the builder has been linked with another one. - - - is null. - Content is not available, the builder has been linked with another one. - - - is default(). - Content is not available, the builder has been linked with another one. - - - is null. - Content is not available, the builder has been linked with another one. - - - is null. - Builder is not writable, it has been linked with another one. - - - is null. - Builder is not writable, it has been linked with another one. - - - - Reserves a contiguous block of bytes. - - is negative. - Builder is not writable, it has been linked with another one. - - - is negative. - Builder is not writable, it has been linked with another one. - - - is null. - is negative. - Builder is not writable, it has been linked with another one. - - - is null. - is negative. - Builder is not writable, it has been linked with another one. - Bytes successfully written from the . - - - is null. - Builder is not writable, it has been linked with another one. - - - is null. - Range specified by and falls outside of the bounds of the . - Builder is not writable, it has been linked with another one. - - - is null. - Builder is not writable, it has been linked with another one. - - - is null. - Range specified by and falls outside of the bounds of the . - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - Builder is not writable, it has been linked with another one. - - - - Writes a reference to a heap (heap offset) or a table (row number). - - Heap offset or table row number. - True to encode the reference as 16-bit integer, false to encode as 32-bit integer. - Builder is not writable, it has been linked with another one. - - - - Writes UTF16 (little-endian) encoded string at the current position. - - is null. - Builder is not writable, it has been linked with another one. - - - - Writes UTF16 (little-endian) encoded string at the current position. - - is null. - Builder is not writable, it has been linked with another one. - - - - Writes string in SerString format (see ECMA-335-II 23.3 Custom attributes). - - - The string is UTF8 encoded and prefixed by the its size in bytes. - Null string is represented as a single byte 0xFF. - - Builder is not writable, it has been linked with another one. - - - - Writes string in User String (#US) heap format (see ECMA-335-II 24.2.4 #US and #Blob heaps): - - - The string is UTF16 encoded and prefixed by the its size in bytes. - - This final byte holds the value 1 if and only if any UTF16 character within the string has any bit set in its top byte, - or its low byte is any of the following: 0x01–0x08, 0x0E–0x1F, 0x27, 0x2D, 0x7F. Otherwise, it holds 0. - The 1 signifies Unicode characters that require handling beyond that normally provided for 8-bit encoding sets. - - Builder is not writable, it has been linked with another one. - - - - Writes UTF8 encoded string at the current position. - - Constant value. - - True to encode unpaired surrogates as specified, otherwise replace them with U+FFFD character. - - is null. - Builder is not writable, it has been linked with another one. - - - - Implements compressed signed integer encoding as defined by ECMA-335-II chapter 23.2: Blobs and signatures. - - - If the value lies between -64 (0xFFFFFFC0) and 63 (0x3F), inclusive, encode as a one-byte integer: - bit 7 clear, value bits 5 through 0 held in bits 6 through 1, sign bit (value bit 31) in bit 0. - - If the value lies between -8192 (0xFFFFE000) and 8191 (0x1FFF), inclusive, encode as a two-byte integer: - 15 set, bit 14 clear, value bits 12 through 0 held in bits 13 through 1, sign bit(value bit 31) in bit 0. - - If the value lies between -268435456 (0xF000000) and 268435455 (0x0FFFFFFF), inclusive, encode as a four-byte integer: - 31 set, 30 set, bit 29 clear, value bits 27 through 0 held in bits 28 through 1, sign bit(value bit 31) in bit 0. - - can't be represented as a compressed signed integer. - Builder is not writable, it has been linked with another one. - - - - Implements compressed unsigned integer encoding as defined by ECMA-335-II chapter 23.2: Blobs and signatures. - - - If the value lies between 0 (0x00) and 127 (0x7F), inclusive, - encode as a one-byte integer (bit 7 is clear, value held in bits 6 through 0). - - If the value lies between 28 (0x80) and 214 – 1 (0x3FFF), inclusive, - encode as a 2-byte integer with bit 15 set, bit 14 clear (value held in bits 13 through 0). - - Otherwise, encode as a 4-byte integer, with bit 31 set, bit 30 set, bit 29 clear (value held in bits 28 through 0). - - can't be represented as a compressed unsigned integer. - Builder is not writable, it has been linked with another one. - - - - Writes a constant value (see ECMA-335 Partition II section 22.9) at the current position. - - is not of a constant type. - Builder is not writable, it has been linked with another one. - - - - Gets the TType representation for . - - - - - Returns true if the given type represents . - - - - - Get the type symbol for the given serialized type name. - The serialized type name is in so-called "reflection notation" (i.e. as understood by .) - - The name is malformed. - - - - Gets the underlying type of the given enum type symbol. - - The given type symbol does not represent an enum. - - - - Returns true of the specified op-code is a branch to a label. - - - - - Calculate the size of the specified branch instruction operand. - - Branch op-code. - 1 if is a short branch or 4 if it is a long branch. - Specified is not a branch op-code. - - - - Get a short form of the specified branch op-code. - - Branch op-code. - Short form of the branch op-code. - Specified is not a branch op-code. - - - - Get a long form of the specified branch op-code. - - Branch op-code. - Long form of the branch op-code. - Specified is not a branch op-code. - - - - By default the stream is disposed when is disposed and sections of the PE image are read lazily. - - - - - Keep the stream open when the is disposed. - - - - - Reads PDB metadata into memory right away. - - - The underlying file may be closed and even deleted after is constructed. - closes the stream automatically by the time the constructor returns unless is specified. - - - - - Provides a metadata stored in an array of bytes, a memory block, or a stream. - - - Supported formats: - - ECMA-335 CLI (Common Language Infrastructure) metadata () - - Edit and Continue metadata delta () - - Portable PDB metadata () - - - - - Creates a Portable PDB metadata provider over a blob stored in memory. - - Pointer to the start of the Portable PDB blob. - The size of the Portable PDB blob. - is . - is negative. - - The memory is owned by the caller and not released on disposal of the . - The caller is responsible for keeping the memory alive and unmodified throughout the lifetime of the . - The content of the blob is not read during the construction of the - - - - - Creates a metadata provider over an image stored in memory. - - Pointer to the start of the metadata blob. - The size of the metadata blob. - is . - is negative. - - The memory is owned by the caller and not released on disposal of the . - The caller is responsible for keeping the memory alive and unmodified throughout the lifetime of the . - The content of the blob is not read during the construction of the - - - - - Creates a Portable PDB metadata provider over a byte array. - - Portable PDB image. - - The content of the image is not read during the construction of the - - is null. - - - - Creates a provider over a byte array. - - Metadata image. - - The content of the image is not read during the construction of the - - is null. - - - - Creates a provider for a stream of the specified size beginning at its current position. - - Stream. - Size of the metadata blob in the stream. If not specified the metadata blob is assumed to span to the end of the stream. - - Options specifying how sections of the image are read from the stream. - - Unless is specified, ownership of the stream is transferred to the - upon successful argument validation. It will be disposed by the and the caller must not manipulate it. - - Unless is specified no data - is read from the stream during the construction of the . Furthermore, the stream must not be manipulated - by caller while the is alive and undisposed. - - If , the - will have read all of the data requested during construction. As such, if is also - specified, the caller retains full ownership of the stream and is assured that it will not be manipulated by the - after construction. - - Size is negative or extends past the end of the stream. - - - - Creates a provider for a stream of the specified size beginning at its current position. - - Stream. - Size of the metadata blob in the stream. If not specified the metadata blob is assumed to span to the end of the stream. - - Options specifying how sections of the image are read from the stream. - - Unless is specified, ownership of the stream is transferred to the - upon successful argument validation. It will be disposed by the and the caller must not manipulate it. - - Unless is specified no data - is read from the stream during the construction of the . Furthermore, the stream must not be manipulated - by caller while the is alive and undisposed. - - If , the - will have read all of the data requested during construction. As such, if is also - specified, the caller retains full ownership of the stream and is assured that it will not be manipulated by the - after construction. - - Size is negative or extends past the end of the stream. - - - - Disposes all memory allocated by the reader. - - - can be called multiple times (but not in parallel). - It is not safe to call in parallel with any other operation on the - or reading from the underlying memory. - - - - - Gets a from a . - - - The caller must keep the alive and undisposed throughout the lifetime of the metadata reader. - - The encoding of is not . - The current platform is big-endian. - IO error while reading from the underlying stream. - - - IO error while reading from the underlying stream. - - - - Type codes used to encode types of primitive values in Custom Attribute value blob. - - - - - Returns a handle to corresponding to this handle. - - - The resulting handle is only valid within the context of a open on the Portable PDB blob, - which in case of standalone PDB file is a different reader than the one containing this method definition. - - - - - #UserString heap handle. - - - The handle is 32-bit wide. - - - - - A handle that represents a namespace definition. - - - - - True if the file contains metadata. - - - Corresponds to Flags field of File table in ECMA-335 Standard. - - - - - File name with extension. - - - Corresponds to Name field of File table in ECMA-335 Standard. - - - - - Hash value of the file content calculated using . - - - Corresponds to HashValue field of File table in ECMA-335 Standard. - - - - An array containing the '\0' character. - - - - Reads number. - - - Decimal number is encoded in 13 bytes as follows: - - byte 0: highest bit indicates sign (1 for negative, 0 for non-negative); the remaining 7 bits encode scale - - bytes 1..12: 96-bit unsigned integer in little endian encoding. - - The data at the current position was not a valid number. - - - - Reads UTF8 encoded string starting at the current position. - - The number of bytes to read. - The string. - bytes not available. - - - - Reads UTF16 (little-endian) encoded string starting at the current position. - - The number of bytes to read. - The string. - bytes not available. - - - - Reads bytes starting at the current position. - - The number of bytes to read. - The byte array. - bytes not available. - - - - Reads an unsigned compressed integer value. - See Metadata Specification section II.23.2: Blobs and signatures. - - The value of the compressed integer that was read. - true if the value was read successfully. false if the data at the current position was not a valid compressed integer. - - - - Reads an unsigned compressed integer value. - See Metadata Specification section II.23.2: Blobs and signatures. - - The value of the compressed integer that was read. - The data at the current position was not a valid compressed integer. - - - - Reads a signed compressed integer value. - See Metadata Specification section II.23.2: Blobs and signatures. - - The value of the compressed integer that was read. - true if the value was read successfully. false if the data at the current position was not a valid compressed integer. - - - - Reads a signed compressed integer value. - See Metadata Specification section II.23.2: Blobs and signatures. - - The value of the compressed integer that was read. - The data at the current position was not a valid compressed integer. - - - - Reads type code encoded in a serialized custom attribute value. - - if the encoding is invalid. - - - - Reads type code encoded in a signature. - - if the encoding is invalid. - - - - Reads a string encoded as a compressed integer containing its length followed by - its contents in UTF8. Null strings are encoded as a single 0xFF byte. - - Defined as a 'SerString' in the ECMA CLI specification. - String value or null. - If the encoding is invalid. - - - - Reads a type handle encoded in a signature as TypeDefOrRefOrSpecEncoded (see ECMA-335 II.23.2.8). - - The handle or nil if the encoding is invalid. - - - - Reads a #Blob heap handle encoded as a compressed integer. - - - Blobs that contain references to other blobs are used in Portable PDB format, for example . - - - - - Reads a constant value (see ECMA-335 Partition II section 22.9) from the current position. - - Error while reading from the blob. - is not a valid . - - Boxed constant value. To avoid allocating the object use Read* methods directly. - Constants of type are encoded as UTF16 strings, use to read them. - - - - - The type of the constant value. - - - Corresponds to Type field of Constant table in ECMA-335 Standard. - - - - - The constant value. - - - Corresponds to Value field of Constant table in ECMA-335 Standard. - - - - - The parent handle (, , or ). - - - Corresponds to Parent field of Constant table in ECMA-335 Standard. - - - - - The constructor ( or ) of the custom attribute type. - - - Corresponds to Type field of CustomAttribute table in ECMA-335 Standard. - - - - - The handle of the metadata entity the attribute is applied to. - - - Corresponds to Parent field of CustomAttribute table in ECMA-335 Standard. - - - - - The value of the attribute. - - - Corresponds to Value field of CustomAttribute table in ECMA-335 Standard. - - - - - Decodes the arguments encoded in the value blob. - - - - - Represents the shape of an array type. - - - - - Gets the number of dimensions in the array. - - - - - Gets the sizes of each dimension. Length may be smaller than rank, in which case the trailing dimensions have unspecified sizes. - - - - - Gets the lower-bounds of each dimension. Length may be smaller than rank, in which case the trailing dimensions have unspecified lower bounds. - - - - - Gets the type symbol for a single-dimensional array with zero lower bounds of the given element type. - - - - - Gets the a type symbol for the function pointer type of the given method signature. - - - - - Gets the type symbol for the generic method parameter at the given zero-based index. - - - - - Gets the type symbol for the generic type parameter at the given zero-based index. - - - - - Gets the type symbol for a type with a custom modifier applied. - - The metadata reader that was passed to the . It may be null. - True if the modifier is required, false if it's optional. - The modifier type applied. - The type symbol of the underlying type without modifiers applied. - - - - Gets the type symbol for a local variable type that is marked as pinned. - - - - - Gets the type symbol for a type definition. - - - The metadata reader that was passed to the signature decoder. It may be null. - - - The type definition handle. - - - The kind of the type as specified in the signature. To interpret this value use - Note that when the signature comes from a WinMD file additional processing is needed to determine whether the target type is a value type or a reference type. - - - - - Gets the type symbol for a type reference. - - - The metadata reader that was passed to the signature decoder. It may be null. - - - The type definition handle. - - - The kind of the type as specified in the signature. To interpret this value use - Note that when the signature comes from a WinMD file additional processing is needed to determine whether the target type is a value type or a reference type. - - - - - Gets the type symbol for a type specification. - - - The metadata reader that was passed to the signature decoder. It may be null. - - - The type specification handle. - - - The kind of the type as specified in the signature. To interpret this value use - Note that when the signature comes from a WinMD file additional processing is needed to determine whether the target type is a value type or a reference type. - - - - - It is not known in the current context if the type reference or definition is a class or value type. - - - - - The type definition or reference refers to a class. - - - - - The type definition or reference refers to a value type. - - - - - Gets the type symbol for a primitive type. - - - - - Gets the type symbol for a generic instantiation of the given generic type with the given type arguments. - - - - - Gets the type symbol for a generalized array of the given element type and shape. - - - - - Gets the type symbol for a managed pointer to the given element type. - - - - - Gets the type symbol for an unmanaged pointer to the given element ty - - - - - Represents a method (definition, reference, or standalone) or property signature. - In the case of properties, the signature matches that of a getter with a distinguishing . - - - - - Represents the information in the leading byte of the signature (kind, calling convention, flags). - - - - - Gets the method's return type. - - - - - Gets the number of parameters that are required. Will be equal to the length of - unless this signature represents the standalone call site of a vararg method, in which case the entries - extra entries in are the types used for the optional parameters. - - - - - Gets the number of generic type parameters of the method. Will be 0 for non-generic methods. - - - - - Gets the method's parameter types. - - - - - Represents a primitive type found in metadata signatures. - - - - - Start IL offset of the try block. - - - - - Length in bytes of try block. - - - - - Start IL offset of the exception handler. - - - - - Length in bytes of the exception handler. - - - - - IL offset of the start of the filter block, or -1 if the region is not a filter. - - - - - Returns a TypeRef, TypeDef, or TypeSpec handle if the region represents a catch, nil token otherwise. - - - - - Name of the target type, or nil if the type is nested or defined in a root namespace. - - - - - Full name of the namespace where the target type, or nil if the type is nested or defined in a root namespace. - - - - - The definition handle of the namespace where the target type is defined, or nil if the type is nested or defined in a root namespace. - - - - - Handle to resolve the implementation of the target type. - - - - representing another module in the assembly. - representing another assembly if is true. - representing the declaring exported type in which this was is nested. - - - - - - Returns field layout offset, or -1 if not available. - - - - - or . - - - Corresponds to Owner field of GenericParam table in ECMA-335 Standard. - - - - - Attributes specifying variance and constraints. - - - Corresponds to Flags field of GenericParam table in ECMA-335 Standard. - - - - - Zero-based index of the parameter within the declaring generic type or method declaration. - - - Corresponds to Number field of GenericParam table in ECMA-335 Standard. - - - - - The name of the generic parameter. - - - Corresponds to Name field of GenericParam table in ECMA-335 Standard. - - - - - The constrained . - - - Corresponds to Owner field of GenericParamConstraint table in ECMA-335 Standard. - - - - - Handle (, , or ) - specifying from which type this generic parameter is constrained to derive, - or which interface this generic parameter is constrained to implement. - - - Corresponds to Constraint field of GenericParamConstraint table in ECMA-335 Standard. - - - - - Represents generic type parameters of a method or type. - - - - - Represents constraints of a generic type parameter. - - - - - Collection of parameters of a specified method. - - - - - Represents a collection of . - - - - - Represents a collection of . - - - - - Represents a collection of . - - - - - Represents a collection of . - - - - - Collection of assembly references. - - - - - Represents a collection of . - - - - - Represents a collection of . - - - - - Compares two handles. - - - The order of handles that differ in kind and are not is undefined. - Returns 0 if and only if returns true. - - - - - Compares two entity handles. - - - Returns 0 if and only if returns true. - - - - - Represents any metadata entity (type reference/definition/specification, method definition, custom attribute, etc.) or value (string, blob, guid, user string). - - - Use to store multiple kinds of handles. - - - - - Creates from a token or a token combined with a virtual flag. - - - - - Token type (0x##000000), does not include virtual flag. - - - - - Small token type (0x##), does not include virtual flag. - - - - - Value stored in an . - - - - - Value stored in a concrete entity handle (see , , etc.). - - - - - The interface that is implemented - , , or - - - - - Specifies the byte offset within the referenced file at which this resource record begins. - - - Corresponds to Offset field of ManifestResource table in ECMA-335 Standard. - - - - - Resource attributes. - - - Corresponds to Flags field of ManifestResource table in ECMA-335 Standard. - - - - - Name of the resource. - - - Corresponds to Name field of ManifestResource table in ECMA-335 Standard. - - - - - , , or nil handle. - - - Corresponds to Implementation field of ManifestResource table in ECMA-335 Standard. - - If nil then is an offset in the PE image that contains the metadata, - starting from the Resource entry in the CLI header. - - - - - MethodDef, ModuleRef,TypeDef, TypeRef, or TypeSpec handle. - - - - - Gets a handle to the signature blob. - - - - - Determines if the member reference is to a method or field. - - The member reference signature is invalid. - - - - Indicates whether a represents a standalone method or local variable signature. - - - - - The represents a standalone method signature. - - - - - The references a local variable signature. - - - - - Indicates whether a references a method or field. - - - - - The references a method. - - - - - The references a field. - - - - - CLI metadata. - - - - - Windows Metadata. - - - - - Windows Metadata generated by managed compilers. - - - - - Reads metadata as defined byte the ECMA 335 CLI specification. - - - - - Creates a metadata reader from the metadata stored at the given memory location. - - - The memory is owned by the caller and it must be kept memory alive and unmodified throughout the lifetime of the . - - - - - Creates a metadata reader from the metadata stored at the given memory location. - - - The memory is owned by the caller and it must be kept memory alive and unmodified throughout the lifetime of the . - Use to obtain - metadata from a PE image. - - - - - Creates a metadata reader from the metadata stored at the given memory location. - - - The memory is owned by the caller and it must be kept memory alive and unmodified throughout the lifetime of the . - Use to obtain - metadata from a PE image. - - is not positive. - is null. - The encoding of is not . - The current platform is big-endian. - - - - True if the metadata stream has minimal delta format. Used for EnC. - - - The metadata stream has minimal delta format if "#JTD" stream is present. - Minimal delta format uses large size (4B) when encoding table/heap references. - The heaps in minimal delta only contain data of the delta, - there is no padding at the beginning of the heaps that would align them - with the original full metadata heaps. - - - - - Looks like this function reads beginning of the header described in - ECMA-335 24.2.1 Metadata root - - - - - Reads stream headers described in ECMA-335 24.2.2 Stream header - - - - - A row count for each possible table. May be indexed by . - - - - - Pointer to the underlying data. - - - - - Length of the underlying data. - - - - - Options passed to the constructor. - - - - - Version string read from metadata header. - - - - - Information decoded from #Pdb stream, or null if the stream is not present. - - - - - The kind of the metadata (plain ECMA335, WinMD, etc.). - - - - - Comparer used to compare strings stored in metadata. - - - - - Returns true if the metadata represent an assembly. - - - - - Returns an array of types nested in the specified type. - - - - - The backing field of a WinRT enumeration type is not public although the backing fields - of managed enumerations are. To allow managed languages to directly access this field, - it is made public by the metadata adapter. - - - - - We want to know if a given method implements a redirected interface. - For example, if we are given the method RemoveAt on a class "A" - which implements the IVector interface (which is redirected - to IList in .NET) then this method would return true. The most - likely reason why we would want to know this is that we wish to hide - (mark private) all methods which implement methods on a redirected - interface. - - The declaration token for the method - - Returns true if the redirected interface is . - - True if the method implements a method on a redirected interface. - False otherwise. - - - - Returns the type definition or reference handle of the attribute type. - - or or nil token if the metadata is invalid and the type can't be determined. - - - - All options are disabled. - - - - - The options that are used when a is obtained - via an overload that does not take a - argument. - - - - - Windows Runtime projections are enabled (on by default). - - - - - Provides string comparison helpers to query strings in metadata while - avoiding allocation where possible. - - - - No allocation is performed unless both the handle argument and the - value argument contain non-ascii text. - - Obtain instances using . - - A default-initialized instance is useless and behaves as a null reference. - - The code is optimized such that there is no additional overhead in - re-obtaining a a comparer over hoisting it in to a local. - - That is to say that a construct like: - - - if (reader.StringComparer.Equals(typeDef.Namespace, "System") && - reader.StringComparer.Equals(typeDef.Name, "Object") - { - // found System.Object - } - - - is no less efficient than: - - - var comparer = reader.StringComparer; - if (comparer.Equals(typeDef.Namespace, "System") && - comparer.Equals(typeDef.Name, "Object") - { - // found System.Object - } - - - The choice between them is therefore one of style and not performance. - - - - - Provides the with a custom mechanism for decoding - byte sequences in metadata that represent text. - - - This can be used for the following purposes: - - 1) To customize the treatment of invalid input. When no decoder is provided, - the uses the default fallback replacement - with \uFFFD) - - 2) To reuse existing strings instead of allocating a new one for each decoding - operation. - - - - - The default decoder used by to decode UTF-8 when - no decoder is provided to the constructor. - - - - - Creates a for the given encoding. - - The encoding to use. - - To cache and reuse existing strings. Create a derived class and override - - - - - Gets the encoding used by this instance. - - - - - The mechanism through which the obtains strings - for byte sequences in metadata. Override this to cache strings if required. - Otherwise, it is implemented by forwarding straight to - and every call will allocate a new string. - - Pointer to bytes to decode. - Number of bytes to decode. - The decoded string. - - - - Size of the method body - includes the header, IL and exception regions. - - - - - MethodDef or MemberRef handle specifying to which generic method this refers, - that is which generic method is it an instantiation of. - - - - - Gets a handle to the signature blob. - - - - - Gets the unqualified name of the NamespaceDefinition. - - - - - Gets the parent namespace. - - - - - Gets the namespace definitions that are direct children of the current - namespace definition. - - System.Collections and System.Linq are direct children of System. - System.Collections.Generic is a direct child of System.Collections. - System.Collections.Generic is *not* a direct child of System. - - - - - Gets all type definitions that reside directly in a namespace. - - - - - Gets all exported types that reside directly in a namespace. - - - - - Source document in debug metadata. - - - See also https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#document-table-0x30. - - - - - Returns Document Name Blob. - - - - - Source code language (C#, VB, F#, etc.) - - - - - Hash algorithm used to calculate (SHA1, SHA256, etc.) - - - - - Document content hash. - - - determines the algorithm used to produce this hash. - The source document is hashed in its binary form as stored in the file. - - - - - representing a blob on #Blob heap in Portable PDB - structured as Document Name. - - - The kind of the handle is . - The handle is a specialization of and doesn't have a distinct kind. - - - - - Returns a handle to corresponding to this handle. - - - The resulting handle is only valid within the context of a open on the type system metadata blob, - which in case of standalone PDB file is a different reader than the one containing this method debug information. - - - - Invalid blob format. - - - - Local constant. Stored in debug metadata. - - - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#localconstant-table-0x34. - - - - - The constant signature. - - - - - Lexical scope within which a group of imports are available. Stored in debug metadata. - - - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#importscope-table-0x35 - - - - - Scope of local variables and constants. Stored in debug metadata. - - - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#localscope-table-0x32. - - - - - Local variable. Stored in debug metadata. - - - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#localvariable-table-0x33. - - - - - Debug information associated with a method definition. Stored in debug metadata. - - - See https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#methoddebuginformation-table-0x31. - - - - - Returns a blob encoding sequence points. - Use to decode. - - - - - The document containing the first sequence point of the method, - or nil if the method doesn't have sequence points. - - - - - Returns local signature handle. - - - - - If the method is a MoveNext method of a state machine returns the kickoff method of the state machine, otherwise returns nil handle. - - - - - Returns a body block of a method with specified Relative Virtual Address (RVA); - - is null. - The body is not found in the metadata or is invalid. - Section where the method is stored is not available. - IO error while reading from the underlying stream. - - - - Gets a from a . - - - The caller must keep the alive and undisposed throughout the lifetime of the metadata reader. - - is null - The current platform is big-endian. - IO error while reading from the underlying stream. - - - - Gets a from a . - - - The caller must keep the alive and undisposed throughout the lifetime of the metadata reader. - - is null - The current platform is big-endian. - IO error while reading from the underlying stream. - - - - Gets a from a . - - - The caller must keep the alive and undisposed throughout the lifetime of the metadata reader. - - is null - The encoding of is not . - The current platform is big-endian. - IO error while reading from the underlying stream. - - - - Type codes used to encode types of values in Custom Attribute value blob. - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - Equivalent to . - - - - - The attribute argument is a System.Type instance. - - - - - The attribute argument is "boxed" (passed to a parameter, field, or property of type object) and carries type information in the attribute blob. - - - - - The attribute argument is an Enum instance. - - - - - Specified additional flags that can be applied to method signatures. - Underlying values correspond to the representation in the leading signature - byte represented by . - - - - - No flags. - - - - - Generic method. - - - - - Instance method. - - Ecma 335 CLI Specification refers to this flag as HAS_THIS. - - - - The first explicitly declared parameter represents the instance pointer. - - - - - Specifies how arguments in a given signature are passed from the caller to the callee. - Underlying values correspond to the representation in the leading signature byte - represented by . - - - - - Managed calling convention with fixed-length argument list. - - - - - Unmanaged C/C++-style calling convention where the call stack is cleaned by the caller. - - - - - Unmanaged calling convention where call stack is cleaned up by the callee. - - - - - Unmanaged C++-style calling convention for calling instance member functions with a fixed argument list. - - - - - Unmanaged calling convention where arguments are passed in registers when possible. - - - - - Managed calling convention for passing extra arguments. - - - - - Represents the signature characteristics specified by the leading byte of signature blobs. - - - This header byte is present in all method definition, method reference, standalone method, field, - property, and local variable signatures, but not in type specification signatures. - - - - - Specifies the signature kind. Underlying values correspond to the representation - in the leading signature byte represented by . - - - - - Method reference, method definition, or standalone method signature. - - - - - Field signature. - - - - - Local variables signature. - - - - - Property signature. - - - - - Method specification signature. - - - - - Represents the type codes that are used in signature encoding. - - - - - Represents an invalid or uninitialized type code. It will not appear in valid signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents in signatures. - - - - - Represents a unmanaged pointers in signatures. - It is followed in the blob by the signature encoding of the underlying type. - - - - - Represents managed pointers (byref return values and parameters) in signatures. - It is followed in the blob by the signature encoding of the underlying type. - - - - - Represents a generic type parameter used within a signature. - - - - - Represents a generalized in signatures. - - - - - Represents the instantiation of a generic type in signatures. - - - - - Represents a System.TypedReference in signatures. - - - - - Represents a in signatures. - - - - - Represents a in signatures. - - - - - Represents function pointer types in signatures. - - - - - Represents - - - - - Represents a single dimensional with 0 lower bound. - - - - - Represents a generic method parameter used within a signature. - - - - - Represents a custom modifier applied to a type within a signature that the caller must understand. - - - - - Represents a custom modifier applied to a type within a signature that the caller can ignore. - - - - - Precedes a type in signatures. - - - In raw metadata, this will be encoded as either ELEMENT_TYPE_CLASS (0x12) for reference - types and ELEMENT_TYPE_VALUETYPE (0x11) for value types. This is collapsed to a single - code because Windows Runtime projections can project from class to value type or vice-versa - and the raw code is misleading in those cases. - - - - - Represents a marker to indicate the end of fixed arguments and the beginning of variable arguments. - - - - - Represents a local variable that is pinned by garbage collector - - - - - Gets a handle to the signature blob. - - - - - Determines the kind of signature, which can be or - - The signature is invalid. - - - - Name of the type. - - - - - Full name of the namespace where the type is defined, or nil if the type is nested or defined in a root namespace. - - - - - The definition handle of the namespace where the type is defined, or nil if the type is nested or defined in a root namespace. - - - - - The base type of the type definition: either - , or . - - - - - Returns the enclosing type of a specified nested type or nil handle if the type is not nested. - - - - - Returns an array of types nested in the specified type. - - - - - Resolution scope in which the target type is defined and is uniquely identified by the specified and . - - - Resolution scope can be one of the following handles: - - of the enclosing type, if the target type is a nested type. - , if the target type is defined in another module within the same assembly as this one. - , if the target type is defined in the current module. This should not occur in a CLI compressed metadata module. - , if the target type is defined in a different assembly from the current module. - Nil handle if the target type must be resolved by searching the for a matching and . - - - - - - Name of the target type. - - - - - Full name of the namespace where the target type is defined, or nil if the type is nested or defined in a root namespace. - - - - - Managed .text PE section. - - - Contains in the following order: - - Import Address Table - - COR Header - - IL - - Metadata - - Managed Resource Data - - Strong Name Signature - - Debug Data (directory and extra info) - - Import Table - - Name Table - - Runtime Startup Stub - - Mapped Field Data - - - - - The size of IL stream (unaligned). - - - - - Total size of metadata (header and all streams). - - - - - The size of managed resource data stream. - Aligned to . - - - - - Size of strong name hash. - - - - - Size of Debug data. - - - - - The size of mapped field data stream. - Aligned to . - - - - - If set, the module must include a machine code stub that transfers control to the virtual execution system. - - - - - If set, the module contains instructions that assume a 64 bit instruction set. For example it may depend on an address being 64 bits. - This may be true even if the module contains only IL instructions because of PlatformInvoke and COM interop. - - - - - Serializes .text section data into a specified . - - An empty builder to serialize section data to. - Relative virtual address of the section within the containing PE file. - Entry point token or RVA () - COR Flags (). - Base address of the PE image. - containing metadata. Must be populated with data. Linked into the and can't be expanded afterwards. - containing IL stream. Must be populated with data. Linked into the and can't be expanded afterwards. - containing mapped field data. Must be populated with data. Linked into the and can't be expanded afterwards. - containing managed resource data. Must be populated with data. Linked into the and can't be expanded afterwards. - containing PE debug table and data. Must be populated with data. Linked into the and can't be expanded afterwards. - Blob reserved in the for strong name signature. - - - - Serialize the Debug Table and Data. - - Builder. - The containing PE section location. - Offset of the table within the containing section. - - - - Aka IMAGE_DIRECTORY_ENTRY_EXPORT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_IMPORT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_RESOURCE. - - - - - Aka IMAGE_DIRECTORY_ENTRY_EXCEPTION. - - - - - Aka IMAGE_DIRECTORY_ENTRY_BASERELOC. - - - - - Aka IMAGE_DIRECTORY_ENTRY_DEBUG. - - - - - Aka IMAGE_DIRECTORY_ENTRY_COPYRIGHT or IMAGE_DIRECTORY_ENTRY_ARCHITECTURE. - - - - - Aka IMAGE_DIRECTORY_ENTRY_GLOBALPTR. - - - - - Aka IMAGE_DIRECTORY_ENTRY_TLS. - - - - - Aka IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG. - - - - - Aka IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_IAT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR. - - - - - Base class for PE resource section builder. Implement to provide serialization logic for native resources. - - - - - The type of target machine. - - - - - The number of sections. This indicates the size of the section table, which immediately follows the headers. - - - - - The low 32 bits of the number of seconds since 00:00 January 1, 1970, that indicates when the file was created. - - - - - The file pointer to the COFF symbol table, or zero if no COFF symbol table is present. - This value should be zero for a PE image. - - - - - The number of entries in the symbol table. This data can be used to locate the string table, - which immediately follows the symbol table. This value should be zero for a PE image. - - - - - The size of the optional header, which is required for executable files but not for object files. - This value should be zero for an object file. - - - - - The flags that indicate the attributes of the file. - - - - - COR20Flags - - - - - GUID (Globally Unique Identifier) of the associated PDB. - - - - - Iteration of the PDB. The first iteration is 1. The iteration is incremented each time the PDB content is augmented. - - - - - Path to the .pdb file containing debug information for the PE/COFF file. - - - - - Identifies the location, size and format of a block of debug information. - - - - - The time and date that the debug data was created if the PE/COFF file is not deterministic, - otherwise a value based on the hash of the content. - - - The algorithm used to calculate this value is an implementation - detail of the tool that produced the file. - - - - - The major version number of the debug data format. - - - - - The minor version number of the debug data format. - - - - - The format of debugging information. - - - - - The size of the debug data (not including the debug directory itself). - - - - - The address of the debug data when loaded, relative to the image base. - - - - - The file pointer to the debug data. - - - - - An unknown value that is ignored by all tools. - - - - - The COFF debug information (line numbers, symbol table, and string table). - This type of debug information is also pointed to by fields in the file headers. - - - - - Associated PDB file description. - - - - - Presence of this entry indicates deterministic PE/COFF file. - - - - The tool that produced the deterministic PE/COFF file guarantees that the entire content of the file - is based solely on documented inputs given to the tool (such as source files, resource files, compiler options, etc.) - rather than ambient environment variables (such as the current time, the operating system, - the bitness of the process running the tool, etc.). - - - The value of field TimeDateStamp in COFF File Header of a deterministic PE/COFF file - does not indicate the date and time when the file was produced and should not be interpreted that way. - Instead the value of the field is derived from a hash of the file content. The algorithm to calculate - this value is an implementation detail of the tool that produced the file. - - - The debug directory entry of type must have all fields, except for Type zeroed. - - - - - - The target CPU is unknown or not specified. - - - - - Intel 386. - - - - - MIPS little-endian WCE v2 - - - - - Alpha - - - - - Hitachi SH3 little endian - - - - - Hitachi SH3 DSP. - - - - - Hitachi SH3 little endian. - - - - - Hitachi SH4 little endian. - - - - - Hitachi SH5. - - - - - ARM little endian - - - - - Thumb. - - - - - ARM Thumb-2 little endian. - - - - - Matsushita AM33. - - - - - IBM PowerPC little endian. - - - - - PowerPCFP - - - - - Intel 64 - - - - - MIPS - - - - - ALPHA64 - - - - - MIPS with FPU. - - - - - MIPS16 with FPU. - - - - - Infineon - - - - - EFI Byte Code - - - - - AMD64 (K8) - - - - - M32R little-endian - - - - - Simple BinaryReader wrapper to: - - 1) throw BadImageFormat instead of EndOfStream or ArgumentOutOfRange. - 2) limit reads to a subset of the base stream. - - Only methods that are needed to read PE headers are implemented. - - - - - Reads a fixed-length byte block as a null-padded UTF8-encoded string. - The padding is not included in the returned string. - - Note that it is legal for UTF8 strings to contain NUL; if NUL occurs - between non-NUL codepoints, it is not considered to be padding and - is included in the result. - - - - - Reserved. - - - - - Reserved. - - - - - Reserved. - - - - - Reserved. - - - - - Image can handle a high entropy 64-bit virtual address space. - - - - - DLL can move. - - - - - Image is NX compatible. - - - - - Image understands isolation and doesn't want it. - - - - - Image does not use SEH. No SE handler may reside in this image. - - - - - Do not bind this image. - - - - - The image must run inside an AppContainer. - - - - - Driver uses WDM model. - - - - - Identifies the format of the image file. - - - - - The linker major version number. - - - - - The linker minor version number. - - - - - The size of the code (text) section, or the sum of all code sections if there are multiple sections. - - - - - The size of the initialized data section, or the sum of all such sections if there are multiple data sections. - - - - - The size of the uninitialized data section (BSS), or the sum of all such sections if there are multiple BSS sections. - - - - - The address of the entry point relative to the image base when the PE file is loaded into memory. - For program images, this is the starting address. For device drivers, this is the address of the initialization function. - An entry point is optional for DLLs. When no entry point is present, this field must be zero. - - - - - The address that is relative to the image base of the beginning-of-code section when it is loaded into memory. - - - - - The address that is relative to the image base of the beginning-of-data section when it is loaded into memory. - - - - - The preferred address of the first byte of image when loaded into memory; - must be a multiple of 64K. - - - - - The alignment (in bytes) of sections when they are loaded into memory. It must be greater than or equal to . - The default is the page size for the architecture. - - - - - The alignment factor (in bytes) that is used to align the raw data of sections in the image file. - The value should be a power of 2 between 512 and 64K, inclusive. The default is 512. - If the is less than the architecture's page size, - then must match . - - - - - The major version number of the required operating system. - - - - - The minor version number of the required operating system. - - - - - The major version number of the image. - - - - - The minor version number of the image. - - - - - The major version number of the subsystem. - - - - - The minor version number of the subsystem. - - - - - The size (in bytes) of the image, including all headers, as the image is loaded in memory. - It must be a multiple of . - - - - - The combined size of an MS DOS stub, PE header, and section headers rounded up to a multiple of FileAlignment. - - - - - The image file checksum. - - - - - The subsystem that is required to run this image. - - - - - The size of the stack to reserve. Only is committed; - the rest is made available one page at a time until the reserve size is reached. - - - - - The size of the stack to commit. - - - - - The size of the local heap space to reserve. Only is committed; - the rest is made available one page at a time until the reserve size is reached. - - - - - The size of the local heap space to commit. - - - - - The number of data-directory entries in the remainder of the . Each describes a location and size. - - - - - Aka IMAGE_DIRECTORY_ENTRY_EXPORT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_IMPORT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_RESOURCE. - - - - - Aka IMAGE_DIRECTORY_ENTRY_EXCEPTION. - - - - - The Certificate Table entry points to a table of attribute certificates. - - - These certificates are not loaded into memory as part of the image. - As such, the first field of this entry, which is normally an RVA, is a file pointer instead. - - Aka IMAGE_DIRECTORY_ENTRY_SECURITY. - - - - - Aka IMAGE_DIRECTORY_ENTRY_BASERELOC. - - - - - Aka IMAGE_DIRECTORY_ENTRY_DEBUG. - - - - - Aka IMAGE_DIRECTORY_ENTRY_COPYRIGHT or IMAGE_DIRECTORY_ENTRY_ARCHITECTURE. - - - - - Aka IMAGE_DIRECTORY_ENTRY_GLOBALPTR. - - - - - Aka IMAGE_DIRECTORY_ENTRY_TLS. - - - - - Aka IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG. - - - - - Aka IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_IAT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT. - - - - - Aka IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR. - - - - - An object used to read PE (Portable Executable) and COFF (Common Object File Format) headers from a stream. - - - - - Reads PE headers from the current location in the stream. - - Stream containing PE image starting at the stream's current position and ending at the end of the stream. - The data read from stream have invalid format. - Error reading from the stream. - The stream doesn't support seek operations. - is null. - - - - Reads PE headers from the current location in the stream. - - Stream containing PE image of the given size starting at its current position. - Size of the PE image. - The data read from stream have invalid format. - Error reading from the stream. - The stream doesn't support seek operations. - is null. - Size is negative or extends past the end of the stream. - - - - Gets the offset (in bytes) from the start of the PE image to the start of the CLI metadata. - or -1 if the image does not contain metadata. - - - - - Gets the size of the CLI metadata 0 if the image does not contain metadata.) - - - - - Gets the COFF header of the image. - - - - - Gets the byte offset from the start of the PE image to the start of the COFF header. - - - - - Determines if the image is Coff only. - - - - - Gets the PE header of the image or null if the image is COFF only. - - - - - Gets the byte offset from the start of the image to - - - - - Gets the PE section headers. - - - - - Gets the CLI header or null if the image does not have one. - - - - - Gets the byte offset from the start of the image to the COR header or -1 if the image does not have one. - - - - - Determines if the image represents a Windows console application. - - - - - Determines if the image represents a dynamically linked library. - - - - - Determines if the image represents an executable. - - - - - Gets the offset (in bytes) from the start of the image to the given directory data. - - PE directory entry - Offset from the start of the image to the given directory data - True if the directory data is found, false otherwise. - - - - Searches sections of the PE image for the one that contains specified Relative Virtual Address. - - Address. - - Index of the section that contains , - or -1 if there is none. - - - - - Pointer to the first byte of the block. - - - - - Length of the block. - - - - - Creates for a blob spanning the entire block. - - - - - Creates for a blob spanning a part of the block. - - Specified range is not contained within the block. - - - - Reads the content of the entire block into an array. - - - - - Reads the content of a part of the block into an array. - - Specified range is not contained within the block. - - - - Portable Executable format reader. - - - The implementation is thread-safe, that is multiple threads can read data from the reader in parallel. - Disposal of the reader is not thread-safe (see ). - - - - - Creates a Portable Executable reader over a PE image stored in memory. - - Pointer to the start of the PE image. - The size of the PE image. - is . - is negative. - - The memory is owned by the caller and not released on disposal of the . - The caller is responsible for keeping the memory alive and unmodified throughout the lifetime of the . - The content of the image is not read during the construction of the - - - - - Creates a Portable Executable reader over a PE image stored in a stream. - - PE image stream. - is null. - - Ownership of the stream is transferred to the upon successful validation of constructor arguments. It will be - disposed by the and the caller must not manipulate it. - - - - - Creates a Portable Executable reader over a PE image stored in a stream beginning at its current position and ending at the end of the stream. - - PE image stream. - - Options specifying how sections of the PE image are read from the stream. - - Unless is specified, ownership of the stream is transferred to the - upon successful argument validation. It will be disposed by the and the caller must not manipulate it. - - Unless or is specified no data - is read from the stream during the construction of the . Furthermore, the stream must not be manipulated - by caller while the is alive and undisposed. - - If or , the - will have read all of the data requested during construction. As such, if is also - specified, the caller retains full ownership of the stream and is assured that it will not be manipulated by the - after construction. - - is null. - has an invalid value. - - is specified and the PE headers of the image are invalid. - - - - - Creates a Portable Executable reader over a PE image of the given size beginning at the stream's current position. - - PE image stream. - PE image size. - - Options specifying how sections of the PE image are read from the stream. - - Unless is specified, ownership of the stream is transferred to the - upon successful argument validation. It will be disposed by the and the caller must not manipulate it. - - Unless or is specified no data - is read from the stream during the construction of the . Furthermore, the stream must not be manipulated - by caller while the is alive and undisposed. - - If or , the - will have read all of the data requested during construction. As such, if is also - specified, the caller retains full ownership of the stream and is assured that it will not be manipulated by the - after construction. - - Size is negative or extends past the end of the stream. - Error reading from the stream (only when prefetching data). - - - - Creates a Portable Executable reader over a PE image stored in a byte array. - - PE image. - - The content of the image is not read during the construction of the - - is null. - - - - Disposes all memory allocated by the reader. - - - can be called multiple times (but not in parallel). - It is not safe to call in parallel with any other operation on the - or reading from s retrieved from the reader. - - - - - Gets the PE headers. - - The headers contain invalid data. - Error reading from the stream. - - - Error reading from the stream. - - - Error reading from the stream. - - - - Returns a view of the entire image as a pointer and length. - - PE image not available. - - - IO error while reading from the underlying stream. - - - IO error while reading from the underlying stream. - - - - Return true if the reader can access the entire PE image. - - - Returns false if the is constructed from a stream and only part of it is prefetched into memory. - - - - - Gets a pointer to and size of the PE image if available (). - - The entire PE image is not available. - - - - Returns true if the PE image contains CLI metadata. - - The PE headers contain invalid data. - Error reading from the underlying stream. - - - - Loads PE section that contains CLI metadata. - - The PE image doesn't contain metadata ( returns false). - The PE headers contain invalid data. - IO error while reading from the underlying stream. - - - - Loads PE section that contains the specified into memory - and returns a memory block that starts at and ends at the end of the containing section. - - Relative Virtual Address of the data to read. - - An empty block if doesn't represent a location in any of the PE sections of this PE image. - - The PE headers contain invalid data. - IO error while reading from the underlying stream. - - - - Reads all Debug Directory table entries. - - Bad format of the entry. - IO error while reading from the underlying stream. - - - - Reads the data pointed to by the specified Debug Directory entry and interprets them as CodeView. - - is not a CodeView entry. - Bad format of the data. - IO error while reading from the underlying stream. - - - - By default the stream is disposed when is disposed and sections of the PE image are read lazily. - - - - - Keep the stream open when the is disposed. - - - - - Reads metadata section into memory right away. - - - Reading from other sections of the file is not allowed ( is thrown by the ). - The underlying file may be closed and even deleted after is constructed. - - closes the stream automatically by the time the constructor returns unless is specified. - - - - - Reads the entire image into memory right away. - - - closes the stream automatically by the time the constructor returns unless is specified. - - - - - The name of the section. - - - - - The total size of the section when loaded into memory. - If this value is greater than , the section is zero-padded. - This field is valid only for PE images and should be set to zero for object files. - - - - - For PE images, the address of the first byte of the section relative to the image base when the - section is loaded into memory. For object files, this field is the address of the first byte before - relocation is applied; for simplicity, compilers should set this to zero. Otherwise, - it is an arbitrary value that is subtracted from offsets during relocation. - - - - - The size of the section (for object files) or the size of the initialized data on disk (for image files). - For PE images, this must be a multiple of . - If this is less than , the remainder of the section is zero-filled. - Because the field is rounded but the field is not, - it is possible for to be greater than as well. - When a section contains only uninitialized data, this field should be zero. - - - - - The file pointer to the first page of the section within the COFF file. - For PE images, this must be a multiple of . - For object files, the value should be aligned on a 4 byte boundary for best performance. - When a section contains only uninitialized data, this field should be zero. - - - - - The file pointer to the beginning of relocation entries for the section. - This is set to zero for PE images or if there are no relocations. - - - - - The file pointer to the beginning of line-number entries for the section. - This is set to zero if there are no COFF line numbers. - This value should be zero for an image because COFF debugging information is deprecated. - - - - - The number of relocation entries for the section. This is set to zero for PE images. - - - - - The number of line-number entries for the section. - This value should be zero for an image because COFF debugging information is deprecated. - - - - - The flags that describe the characteristics of the section. - - - - - Used to modify the value of the property. - CLS-compliant setters are named with set_ prefix. - - - - - Used to read the value of the property. - CLS-compliant getters are named with get_ prefix. - - - - - Other method for property (not getter or setter) or event (not adder, remover, or raiser). - - - - - Used to add a handler for an event. - Corresponds to the AddOn flag in the Ecma 335 CLI specification. - CLS-compliant adders are named with add_ prefix. - - - - - Used to remove a handler for an event. - Corresponds to the RemoveOn flag in the Ecma 335 CLI specification. - CLS-compliant removers are named with remove_ prefix. - - - - - Used to indicate that an event has occurred. - Corresponds to the Fire flag in the Ecma 335 CLI specification. - CLS-compliant raisers are named with raise_ prefix. - - - - - Specifies the security actions that can be performed using declarative security. - - - - - No declarative security action. - - - - - Check that all callers in the call chain have been granted specified permission, - - - - - The calling code can access the resource identified by the current permission object, even if callers higher in the stack have not been granted permission to access the resource. - - - - - Without further checks refuse Demand for the specified permission. - - - - - Without further checks, refuse Demand for all permissions other than those specified. - - - - - Check that the immediate caller has been granted the specified permission; - - - - - The derived class inheriting the class or overriding a method is required to have been granted the specified permission. - - - - - The request for the minimum permissions required for code to run. This action can only be used within the scope of the assembly. - - - - - The request for additional permissions that are optional (not required to run). This request implicitly refuses all other permissions not specifically requested. This action can only be used within the scope of the assembly. - - - - - The request that permissions that might be misused will not be granted to the calling code. This action can only be used within the scope of the assembly. - - - - - The Resource is exported from the Assembly - - - - - The Resource is not exported from the Assembly - - - - - Masks just the visibility-related attributes. - - - - - Specifies all the hash algorithms used for hashing assembly files and for generating the strong name. - - - - - A mask indicating that there is no hash algorithm. If you specify None for a multi-module assembly, the common language runtime defaults to the SHA1 algorithm, since multi-module assemblies need to generate a hash. - - - - - Retrieves the MD5 message-digest algorithm. MD5 was developed by Rivest in 1991. It is basically MD4 with safety-belts and while it is slightly slower than MD4, it helps provide more security. The algorithm consists of four distinct rounds, which has a slightly different design from that of MD4. Message-digest size, as well as padding requirements, remain the same. - - - - - Retrieves a revision of the Secure Hash Algorithm that corrects an unpublished flaw in SHA. - - - - - Retrieves a version of the Secure Hash Algorithm with a hash size of 256 bits. - - - - - Retrieves a version of the Secure Hash Algorithm with a hash size of 384 bits. - - - - - Retrieves a version of the Secure Hash Algorithm with a hash size of 512 bits. - - - - - The assembly reference holds the full (unhashed) public key. - Not applicable on assembly definition. - - - - - The implementation of the referenced assembly used at runtime is not expected to match the version seen at compile time. - - - - - The assembly contains Windows Runtime code. - - - - - Content type mask. Masked bits correspond to values of . - - - - - Specifies that just-in-time (JIT) compiler optimization is disabled for the assembly. - - - - - Specifies that just-in-time (JIT) compiler tracking is enabled for the assembly. - - - - diff --git a/tests/fsharpqa/testenv/src/ExecAssembly/ExecAssembly.fsproj b/tests/fsharpqa/testenv/src/ExecAssembly/ExecAssembly.fsproj deleted file mode 100644 index c087f1d7d71..00000000000 --- a/tests/fsharpqa/testenv/src/ExecAssembly/ExecAssembly.fsproj +++ /dev/null @@ -1,140 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - 04c27c52-ecd5-43d2-84d0-40d190640fc0 - Exe - FSharp.Test.ExecAssembly - ExecAssembly - v4.5 - true - True - ..\..\..\..\..\$(Configuration)\net40\bin - 4.4.1.0 - ExecAssembly - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\ExecAssembly.XML - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - AnyCPU - bin\Release\ExecAssembly.XML - true - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - x86 - bin\Debug\ExecAssembly.XML - true - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - x86 - bin\Release\ExecAssembly.XML - true - - - true - full - false - false - bin\Debug\ - DEBUG;TRACE - 3 - x64 - bin\Debug\ExecAssembly.XML - false - - - pdbonly - true - true - bin\Release\ - TRACE - 3 - x64 - bin\Release\ExecAssembly.XML - false - - - - - - - - - - True - - - - - True - - - - - - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - $(OpenDrop) - $(OpenDrop)\Microsoft.FSharp.targets - - - - - - \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/ExecAssembly/Program.fs b/tests/fsharpqa/testenv/src/ExecAssembly/Program.fs deleted file mode 100644 index 913b0e7000b..00000000000 --- a/tests/fsharpqa/testenv/src/ExecAssembly/Program.fs +++ /dev/null @@ -1,32 +0,0 @@ -open System -open System.Security -open System.Security.Permissions - -(* - This program loads a specified .NET exe and runs it in a dedicated appdomain. - Useful for 2 types of tests: - - The exe is build against .NET 2 - - Use this to force it to run in .NET 4+ environment - - The exe is built against an earlier version of FSharp.Core - - Use this to force it to run with binding to latest FSharp.Core - - Usage: ExecAssembly [optional args for exe] -*) - -[] -let main args = - let setup = AppDomainSetup(ApplicationBase = Environment.CurrentDirectory) - let name = "App domain with F# vLatest and .NET vLatest" - let appDomain = AppDomain.CreateDomain(name, null, setup, PermissionSet(PermissionState.Unrestricted)) - - let assemblyUnderTest = args.[0] - let exeArgs = args.[1..] - - try - exit (appDomain.ExecuteAssembly(assemblyUnderTest, exeArgs)) - with - | :? BadImageFormatException as e -> - printfn "%O" e - printfn "" - printfn "Is the loaded assembly built for the same platform (x86/x64) as ExecAssembly?" - exit 1 \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/ExecAssembly/closed/App.config b/tests/fsharpqa/testenv/src/ExecAssembly/closed/App.config deleted file mode 100644 index f37299246de..00000000000 --- a/tests/fsharpqa/testenv/src/ExecAssembly/closed/App.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/ExecAssembly/open/App.config b/tests/fsharpqa/testenv/src/ExecAssembly/open/App.config deleted file mode 100644 index 9bc0eb74acb..00000000000 --- a/tests/fsharpqa/testenv/src/ExecAssembly/open/App.config +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/FSharp.Compiler.Hosted/FSharp.Compiler.Hosted.fsproj b/tests/fsharpqa/testenv/src/FSharp.Compiler.Hosted/FSharp.Compiler.Hosted.fsproj index 2e22a5b0bd1..91ab641308e 100644 --- a/tests/fsharpqa/testenv/src/FSharp.Compiler.Hosted/FSharp.Compiler.Hosted.fsproj +++ b/tests/fsharpqa/testenv/src/FSharp.Compiler.Hosted/FSharp.Compiler.Hosted.fsproj @@ -1,6 +1,9 @@ - + + ..\..\..\..\..\src + + Debug AnyCPU @@ -11,86 +14,62 @@ FSharp.Compiler.Hosted v4.5 true - True - ..\..\..\..\..\$(Configuration)\net40\bin - $(OtherFlags) --delaysign+ --keyfile:"..\..\bin\msft.pubkey" - $(OtherFlags) --delaysign+ --keyfile:"..\..\..\..\..\src\fsharp\msft.pubkey" + $(FSharpSourcesRoot)\..\$(Configuration)\net40\bin + $(OtherFlags) --delaysign+ --keyfile:"$(FSharpSourcesRoot)\fsharp\msft.pubkey" 4.4.1.0 FSharp.Compiler.Hosted + 3 + AnyCPU + true + ..\..\bin\ + true + $(OutputPath)$(AssemblyName).xml true full false false - bin\Debug\ DEBUG;TRACE - 3 - AnyCPU - bin\Debug\FSharp.Compiler.Hosted.XML - true pdbonly true true - bin\Release\ TRACE - 3 - AnyCPU - bin\Release\FSharp.Compiler.Hosted.XML - true + + + + + {DED3BBD7-53F4-428A-8C9F-27968E768605} + FSharp.Core + + + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} + FSharp.Compiler + + $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.PortablePdb.1.1.0\lib\portable-net45+win8\Microsoft.DiaSymReader.PortablePdb.dlltrue + $(FSharpSourcesRoot)\..\packages\Microsoft.DiaSymReader.1.0.8\lib\portable-net45+win8\Microsoft.DiaSymReader.dlltrue + $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.1.4.1-beta-24227-04\lib\portable-net45+win8\System.Reflection.Metadata.dlltrue + $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.1.2.0\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dlltrue + $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.0.0-rc3-24212-01\lib\netstandard1.1\System.ValueTuple.dlltrue - - - True - - - True - - - - - True - - - True - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - $(OpenDrop) - $(OpenDrop)\Microsoft.FSharp.targets - - - - - \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj b/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj index 2cb0144988d..b7a65e32800 100644 --- a/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj +++ b/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj @@ -1,6 +1,9 @@  - + + ..\..\..\..\..\src + + Debug AnyCPU @@ -11,80 +14,46 @@ HostedCompilerServer v4.5 true - True - ..\..\..\..\..\$(Configuration)\net40\bin 4.4.1.0 HostedCompilerServer + ..\..\bin\ + true + $(OutputPath)$(AssemblyName).xml + 3 + AnyCPU + true true full false false - bin\Debug\ DEBUG;TRACE - 3 - AnyCPU - bin\Debug\HostedCompilerServer.XML - true pdbonly true true - bin\Release\ TRACE - 3 - AnyCPU - bin\Release\HostedCompilerServer.XML - true + + + + - - - - True - - - - - True - + + {DED3BBD7-53F4-428A-8C9F-27968E768605} + FSharp.Core + + + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} + FSharp.Compiler + - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - $(OpenDrop) - $(OpenDrop)\Microsoft.FSharp.targets - - - - - + \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj b/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj index 99db1da8c19..129c4c5aeac 100644 --- a/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj +++ b/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj @@ -1,6 +1,9 @@  - + + ..\..\..\..\..\src + + Debug AnyCPU @@ -11,79 +14,41 @@ ILComparer v4.5 true - True - ..\..\..\..\..\$(Configuration)\net40\bin 4.4.1.0 - HostedCompilerServer + ILComparer + ..\..\bin\ + true + $(OutputPath)$(AssemblyName).xml + 3 + AnyCPU + true true full false false - bin\Debug\ DEBUG;TRACE - 3 - AnyCPU - bin\Debug\ILComparer.XML - true pdbonly true true - bin\Release\ TRACE - 3 - AnyCPU - bin\Release\ILComparer.XML - true + + + + + + {DED3BBD7-53F4-428A-8C9F-27968E768605} + FSharp.Core + - - - True - - - - - True - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - $(OpenDrop) - $(OpenDrop)\Microsoft.FSharp.targets - - - - - + \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/PartialTrustRunner/APTCATest.fs b/tests/fsharpqa/testenv/src/PartialTrustRunner/APTCATest.fs deleted file mode 100644 index ff5ba2d2220..00000000000 --- a/tests/fsharpqa/testenv/src/PartialTrustRunner/APTCATest.fs +++ /dev/null @@ -1,12 +0,0 @@ -try - let ps = new System.Security.PermissionSet(System.Security.Permissions.PermissionState.Unrestricted) - ps.Demand() - printfn "You are running in full trust" - 0 -with -| :? System.Security.SecurityException -> printfn "You are running in partial trust" - 1 -| _ -> printfn "Unknown exception!"; - 2 - - diff --git a/tests/fsharpqa/testenv/src/PartialTrustRunner/PartialTrustRunner.cs b/tests/fsharpqa/testenv/src/PartialTrustRunner/PartialTrustRunner.cs deleted file mode 100644 index 046490cd7eb..00000000000 --- a/tests/fsharpqa/testenv/src/PartialTrustRunner/PartialTrustRunner.cs +++ /dev/null @@ -1,327 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Diagnostics; -using System.Security; -using System.Security.Policy; -using System.Reflection; -using System.Collections; -using System.Security.Permissions; -using System.Drawing.Printing; -using System.Net; -using System.Data.OleDb; -using System.Data.SqlClient; -using System.Runtime.CompilerServices; -using System.IO; -using PTRunner; -[assembly: AllowPartiallyTrustedCallers] -[assembly: SecurityRules(SecurityRuleSet.Level2)] - - -/// -/// This class holds the data that was parsed from the command line -/// -internal class CommandLineData -{ - public CommandLineData() - { - programName = null; - arguments = null; - permission = null; - fullTrustAssemblies = new List(); - } - //Program name - public string programName; - //Arguments to the program - public string[] arguments; - //The permission set that will be granted to the progra - public PermissionSet permission; - //The full trust list - public List fullTrustAssemblies; -} - - -class PartialTrustRunner -{ - - /// - /// Print the usage of the program - /// - public static void Usage() - { - string name = Process.GetCurrentProcess().ProcessName; - string possibleVals = Enum.GetNames(typeof(PermSetNames)).Aggregate((workset, next) => workset + ", " + next); - Console.WriteLine("Usage:"); - Console.WriteLine("{0} [-ps NamedPermissionSet]|[-xml ptrunner.xml] [-af fullTrustAssembly] {{program arguments}}\n", name); - Console.WriteLine("Parameters:"); - Console.WriteLine("\t -ps : PermissionSet The named permission set in which the application could be run. This can be any one of {0}", possibleVals); - Console.WriteLine("\n\t -xml : XmlFile File containing the permission set in which the application could be run. "); - Console.WriteLine("\n\t -af AddToFullTrust One assembly that you want in the full trust list. Your full trust assembly should be signed. See \"Strong-Named Assemblies\" in msdn for more information."); - Console.WriteLine("\n\t program arguments Command and arguments for the runned progam. Once you pass anything that doesn't have a \"-\" as a parameter we consider you are passing the name and the parameters for the program that will be run by this runner."); - Console.WriteLine(); - Console.WriteLine("Example usage: PTRunner.exe -af Samples\\librarydemander.dll -ps LocalIntranet Samples\\demander.exe"); - Console.WriteLine("\t This runs Samples\\demander.exe and also makes sure Samples\\librarydemander.dll is loaded as FullTrust"); - Console.WriteLine(); - Console.WriteLine("{0} is a program designed to run an application in partial trust in an easy and simple way. Under the covers it starts an AppDomain with a permission set and a full trust list and uses this AppDomain to run your application in.", name); - Console.WriteLine("If you are creating AppDomains or your application uses a host, you might not be able to use this program. This program is designed to offer an easy solution to those that want to run something in partial trust and don\'t care about the intricacies of this endevour"); - Console.WriteLine(); - Console.WriteLine("NOTE: Make sure you are passing any parameters for the runner before passing the name of the runned program"); - Console.WriteLine("NOTE: For the xml parameter, the file format is exactly what caspol -lp would print.The file samples\\perm.xml is a good example."); - } - - /// - /// Command line parser. - /// - /// The command line arguments - /// A structure with information about the run - private static CommandLineData ParseCommandLine(string[] args) - { - try - { - int i = 0; - CommandLineData ret = new CommandLineData(); - - while (i < args.Length) - { - if (args[i].StartsWith("-")) - { - switch (args[i]) - { - //The partial trust PermissionSet - case "-ps": - PermSetNames permSet = (PermSetNames)Enum.Parse(typeof(PermSetNames), args[++i], true); - ret.permission = PTRunnerLib.GetStandardPermission(permSet); - break; - //Add full trust assembly - case "-af": - Assembly asm = Assembly.LoadFrom(args[++i]); - ret.fullTrustAssemblies.Add(asm); - break; - case "-xml": - StreamReader sr = new StreamReader(args[++i]); - SecurityElement elem = SecurityElement.FromString(sr.ReadToEnd()); - ret.permission = new PermissionSet(PermissionState.None); - ret.permission.FromXml(elem); - break; - default: - Console.WriteLine("{0} - unknonw option", args[i]); - Usage(); - return null; - } - ++i; - } - else break; - } - if (i < args.Length) - { - //This are the arguments for the program that will be run - ret.programName = args[i++]; - int argsSize = args.Length - i; - ret.arguments = new string[argsSize]; - if (argsSize > 0) - Array.Copy(args, i, ret.arguments, 0, argsSize); - if (ret.permission == null) - ret.permission = PTRunnerLib.GetStandardPermission(PermSetNames.Execution); - return ret; - } - } - catch (Exception ex) - { - Console.WriteLine(":RUNNER: Got exception while parsing command line: {0}", ex.Message); - } - Usage(); - return null; - } - - /// - /// The main function of the runner, obviously - /// - /// - /// - [SecuritySafeCritical] - static int Main(string[] args) - { - //Parse the command line - CommandLineData commands = ParseCommandLine(args); - if (commands == null) - return 1; - AssemblyRunner runner =null; - try - { - //Create the sandbox - runner = PTRunnerLib.GetPartialTrustInstance(commands.permission, commands.fullTrustAssemblies.ToArray()); - } - catch (InvalidOperationException ex) - { - Console.WriteLine("ERROR: {0}", ex.Message); - return -1; - } - //And we execute the assembly!!! - return runner.ExecuteAssembly(commands.programName, commands.arguments); - } - -} - -/// -/// The runner. This class will be instantiated on the sandboxed AppDomain. This will be the actual starter -/// -public class AssemblyRunner : MarshalByRefObject -{ - /// - /// Print some preaty information about startup - /// - /// - /// - internal static void PrintStart(string assemblyName, string[] arguments) - { - string args = ""; - if (arguments.Length > 0) - args = " " + arguments.Aggregate((workingSentence, next) => workingSentence + " " + next); - Console.WriteLine(":RUNNER: start: \"{0}{1}\"", assemblyName, args); - } - /// - /// Print some preaty information about shutdown - /// - /// - internal static void PrintStop(int ret) - { - Console.WriteLine(":RUNNER: return: {0}", ret); - } - - public AssemblyRunner() - { - } - - /// - /// Execute the client assembly. Arguments are passed to main - /// - /// The name of the assembly - /// Arguments to the main method - /// The return of the application - public int ExecuteAssembly(string assemblyName, string[] arguments) - { - //Because there are a total of four possible signatures for main, we need a special indirection level which will hide that variety. - //The reason we are not using dirrectly MethodInfo.Invoke is that for calling that a ReflectionPermission is required - //which would taint the sandbox. So off to making the logic a touch more complex just to allow the client to get what he expects - MainDelegates.MainWrapper main = MainDelegates.MainWrapper.ConstructMainWrapper(assemblyName); - PrintStart(assemblyName, arguments); - int ret = 0; - ret = main.Invoke(arguments); - PrintStop(ret); - return ret; - } -} - -namespace MainDelegates -{ - //MSDN says there are only void/int return values, and non/string[] for parameter. That makes a total of 4 possible delegates - - /// - /// This is the base class for each of the wrapper. These wrappers will be an abstraction over the 4 possible delegates - /// - internal abstract class MainWrapper - { - public abstract int Invoke(string[] args); - /// - /// This method is in charge of creating the propper main-delegate wrapper. It loads the assembly, gets the entry point - /// and make a decision about which wrapper to create - /// - /// The assembly name - /// One of the four different main-delegate wrappers - [SecuritySafeCritical] - public static MainWrapper ConstructMainWrapper(string assemblyName) - { - (new PermissionSet(PermissionState.Unrestricted)).Assert(); - Assembly a = Assembly.LoadFrom(assemblyName); - MethodInfo mi = a.EntryPoint; - - if (mi.ReturnType == typeof(void)) - { - //No parameter, void return - if (mi.GetParameters().Length == 0) - return new MainVoidEmpty(mi); - else - //Parameters but void return - return new MainVoidArgs(mi); - } - else - { - //Int return but no parameters - if (mi.GetParameters().Length == 0) - return new MainIntEmpty(mi); - else - //int return and string[] as parameters - return new MainIntFull(mi); - } - - } - } - /// - /// This wrapper treats the int Main(string[]args) signature - /// - internal class MainIntFull : MainWrapper - { - delegate int MainDelegateIntArg(string[] args); - MainDelegateIntArg _dlg; - public MainIntFull(MethodInfo mi) - { - - _dlg = (MainDelegateIntArg)Delegate.CreateDelegate(typeof(MainDelegateIntArg), mi); - } - public override int Invoke(string[] args) - { - return _dlg(args); - } - } - /// - /// This wrapper treats the void Main(string[]args) signature - /// - internal class MainVoidArgs : MainWrapper - { - delegate void MainDelegateVoidArg(string[] args); - MainDelegateVoidArg _dlg; - public MainVoidArgs(MethodInfo mi) - { - _dlg = (MainDelegateVoidArg)Delegate.CreateDelegate(typeof(MainDelegateVoidArg), mi); - } - public override int Invoke(string[] args) - { - _dlg(args); - return 0; - } - } - /// - /// This wrapper treats the int Main() signature - /// - internal class MainIntEmpty : MainWrapper - { - delegate int MainDelegateIntNoArg(); - MainDelegateIntNoArg _dlg; - public MainIntEmpty(MethodInfo mi) - { - _dlg = (MainDelegateIntNoArg)Delegate.CreateDelegate(typeof(MainDelegateIntNoArg), mi); - } - public override int Invoke(string[] args) - { - return _dlg(); - } - } - /// - /// This wrapper treats the int Main() signature - /// - internal class MainVoidEmpty : MainWrapper - { - delegate void MainDelegateVoidNoArg(); - MainDelegateVoidNoArg _dlg; - public MainVoidEmpty(MethodInfo mi) - { - _dlg = (MainDelegateVoidNoArg)Delegate.CreateDelegate(typeof(MainDelegateVoidNoArg), mi); - } - public override int Invoke(string[] args) - { - _dlg(); - return 0; - } - } -} \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/PartialTrustRunner/build.cmd b/tests/fsharpqa/testenv/src/PartialTrustRunner/build.cmd deleted file mode 100644 index fd1d7d3cdc5..00000000000 --- a/tests/fsharpqa/testenv/src/PartialTrustRunner/build.cmd +++ /dev/null @@ -1,4 +0,0 @@ -REM == -REM == Latest sources \\clrdrop\drops\CLRv4\PUCLR\sources\\QA\CLR\Testsrc\Desktop\tools\PartialTrustRunner -REM == -csc /out:PTRunner.exe PartialTrustRunner.cs ptrunnerlib.cs /keyfile:ptkey.snk diff --git a/tests/fsharpqa/testenv/src/PartialTrustRunner/ptkey.snk b/tests/fsharpqa/testenv/src/PartialTrustRunner/ptkey.snk deleted file mode 100644 index 80655c43ab2889a8143a8c3719925129d658bb26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097H6*O9d*ExE|)!9~9Xuqq&HAy6i1 zql2|6N%uTyl9#~yp+tTtkDJwE#8c*-vmT~kxpKByN{F!7M;>HTi!0EP2 zOmp)21kVGr>C*h(Wp)s%eFobHT^Ybn*Z4(&5->it1aP-KvBER;;7z6k;2wtA#o6!PAobDE<5aKySoxYxf7q1A7^fcKjMg z2J!(sj)nZ=r}?Q5x_bT?M|G8+>;z1rQ7z^Q#d|ROe(2L=ceP~-b@ButDos}}v$}jb zTPHTBm1IF-LNo;>qnGi_p2U;6D!3Ca$3Db8&#{l1SM%H}^%PZSQw;XjW8OVF8Z-iR z`OTS-re4Yv4qr5l?G<=rpev44+VuGVa_8l}>R^c}j;08#Y;bl^@># diff --git a/tests/fsharpqa/testenv/src/PartialTrustRunner/ptrunnerlib.cs b/tests/fsharpqa/testenv/src/PartialTrustRunner/ptrunnerlib.cs deleted file mode 100644 index 08c5fe96f0b..00000000000 --- a/tests/fsharpqa/testenv/src/PartialTrustRunner/ptrunnerlib.cs +++ /dev/null @@ -1,196 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Diagnostics; -using System.Security; -using System.Security.Policy; -using System.Reflection; -using System.Collections; -using System.Security.Permissions; -using System.Drawing.Printing; -using System.Net; -using System.Data.OleDb; -using System.Data.SqlClient; -using System.Runtime.CompilerServices; -using System.IO; - -namespace PTRunner -{ - public enum PermSetNames { Everything, Internet, LocalIntranet, Execution, FullTrust }; - - public class PTRunnerLib - { - - #region NamedPermissionSets - - private static PermissionSet GetFullTrustPermissionSet() - { - PermissionSet ps = new PermissionSet(PermissionState.Unrestricted); - return ps; - } - private static PermissionSet GetExecutionPermissionSet() - { - PermissionSet ps = new PermissionSet(PermissionState.None); - ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); - return ps; - } - private static PermissionSet GetInternetPermissionSet() - { - Evidence ev = new Evidence(); - ev.AddHostEvidence(new Zone(SecurityZone.Internet)); - return SecurityManager.GetStandardSandbox(ev); - } - private static PermissionSet GetIntranetPermissionSet() - { - Evidence ev = new Evidence(); - ev.AddHostEvidence(new Zone(SecurityZone.Intranet)); - return SecurityManager.GetStandardSandbox(ev); - } - //The mediapermission and webbrowserpermission are conditionally added to intranet and internet. - private static void AddAdditionalPermissions(PermissionSet partialEverything) - { - foreach (IPermission perm in GetIntranetPermissionSet()) - { - if(partialEverything.GetPermission(perm.GetType())==null) - { - ConstructorInfo ci = perm.GetType().GetConstructor(new Type[] { typeof(PermissionState) }); - partialEverything.AddPermission((IPermission)ci.Invoke(new object[]{PermissionState.Unrestricted})); - } - } - } - private static PermissionSet GetEverythingPermissionSet() - { - PermissionSet ps = new PermissionSet(PermissionState.None); - ps.AddPermission(new IsolatedStorageFilePermission(PermissionState.Unrestricted)); - ps.AddPermission(new EnvironmentPermission(PermissionState.Unrestricted)); - ps.AddPermission(new FileIOPermission(PermissionState.Unrestricted)); - ps.AddPermission(new FileDialogPermission(PermissionState.Unrestricted)); - ps.AddPermission(new ReflectionPermission(PermissionState.Unrestricted)); - ps.AddPermission(new SecurityPermission(SecurityPermissionFlag.Assertion | SecurityPermissionFlag.UnmanagedCode | SecurityPermissionFlag.Execution | SecurityPermissionFlag.ControlThread | SecurityPermissionFlag.ControlEvidence | SecurityPermissionFlag.ControlPolicy | SecurityPermissionFlag.ControlAppDomain | SecurityPermissionFlag.SerializationFormatter | SecurityPermissionFlag.ControlDomainPolicy | SecurityPermissionFlag.ControlPrincipal | SecurityPermissionFlag.RemotingConfiguration | SecurityPermissionFlag.Infrastructure | SecurityPermissionFlag.BindingRedirects)); - ps.AddPermission(new UIPermission(PermissionState.Unrestricted)); - ps.AddPermission(new SocketPermission(PermissionState.Unrestricted)); - ps.AddPermission(new WebPermission(PermissionState.Unrestricted)); - ps.AddPermission(new DnsPermission(PermissionState.Unrestricted)); - ps.AddPermission(new KeyContainerPermission(PermissionState.Unrestricted)); - ps.AddPermission(new RegistryPermission(PermissionState.Unrestricted)); - ps.AddPermission(new PrintingPermission(PermissionState.Unrestricted)); - ps.AddPermission(new EventLogPermission(PermissionState.Unrestricted)); - ps.AddPermission(new StorePermission(PermissionState.Unrestricted)); - ps.AddPermission(new PerformanceCounterPermission(PermissionState.Unrestricted)); - ps.AddPermission(new OleDbPermission(PermissionState.Unrestricted)); - ps.AddPermission(new SqlClientPermission(PermissionState.Unrestricted)); - ps.AddPermission(new DataProtectionPermission(PermissionState.Unrestricted)); - AddAdditionalPermissions(ps); - return ps; - } - #endregion - - //The available settings for the partial trust sandboxes - - /// - /// Transform from a PermSetNames enum tu a PermissionSet - /// - /// The sandbox that we want - /// The actual permission set - public static PermissionSet GetStandardPermission(PermSetNames permSetName) - { - PermissionSet ps = null; - switch (permSetName) - { - case PermSetNames.Execution: - ps = GetExecutionPermissionSet(); - break; - case PermSetNames.Internet: - ps = GetInternetPermissionSet(); - break; - case PermSetNames.LocalIntranet: - ps = GetIntranetPermissionSet(); - break; - case PermSetNames.Everything: - ps = GetEverythingPermissionSet(); - break; - case PermSetNames.FullTrust: - ps = GetFullTrustPermissionSet(); - break; - } - return ps; - } - /// - /// Return the strong name of an Assembly - /// - /// The assembly that we want to get the strong name from - /// The strong name - private static StrongName GetStrongName(Assembly assembly) - { - //This should actually use assembly.Evidence.GetHostEvidence(), but due to a bug that doesn't work - if (assembly == null) - throw new ArgumentNullException("assembly"); - - StrongName sn = assembly.Evidence.GetHostEvidence(); - if (sn == null) - throw new InvalidOperationException(String.Format("Assembly \"{0}\" is not strongly named. Use /keyfile flag when compiling it", assembly.FullName)); - - return sn; - } - /// - /// Construct the Sandbox in which the program will run. This will have the reduced grant set - /// - /// The permission set in which the program will be run - /// The full trust list - /// The sandbox AppDomain - public static AppDomain CreateSandboxedDomain(PermissionSet ps, params Assembly[] fullTrustList) - { - int ftLen = fullTrustList.Length; - StrongName[] fullTrustStrongNames = new StrongName[ftLen + 1]; - //We have to add ourselves to the list of full trust assemblies - fullTrustStrongNames[0] = GetStrongName(typeof(PTRunnerLib).Assembly); - int i = 1; - foreach (Assembly asm in fullTrustList) - { - StrongName asmStrongName = GetStrongName(asm); - fullTrustStrongNames[i++] = asmStrongName; - } - - return AppDomain.CreateDomain("Sandbox", null, AppDomain.CurrentDomain.SetupInformation, ps, fullTrustStrongNames); - } - /// - /// Create a new sandbox AppDomain with the permission and full trust list passed and initialize - /// a new instance of the type T in it - /// - /// The type that will be instantiated in the new domain. This has to be a MarshalByRefObject - /// Permission set for the new domain - /// List of full trust assemblies. All assemblies in this list have to be fully trusted - /// An instance in the new sandboxed AppDomain - [SecuritySafeCritical] - public static T GetPartialTrustInstance(PermissionSet ps, params Assembly[] fullTrustList) where T : MarshalByRefObject - { - AppDomain domain = CreateSandboxedDomain(ps, fullTrustList); - return (T)domain.CreateInstanceAndUnwrap(typeof(T).Assembly.FullName, typeof(T).FullName); - } - /// - /// Create a new sandbox AppDomain with the permission and full trust list passed and initialize - /// a new instance of the type T in it - /// - /// The type that will be instantiated in the new domain. This has to be a MarshalByRefObject - /// Name of standard permission set for the new domain - /// List of full trust assemblies. All assemblies in this list have to be fully trusted - /// An instance in the new sandboxed AppDomain - public static T GetPartialTrustInstance(PermSetNames psName, params Assembly[] fullTrustList) where T : MarshalByRefObject - { - return GetPartialTrustInstance(GetStandardPermission(psName), fullTrustList); - } - /// - /// Create a new sandbox AppDomain with the permission and full trust list passed and initialize - /// a new instance of the type T in it. The permission in the new AppDomain is Execution - /// - /// The type that will be instantiated in the new domain. This has to be a MarshalByRefObject - /// List of full trust assemblies. All assemblies in this list have to be fully trusted - /// An instance in the new sandboxed AppDomain - public static T GetPartialTrustInstance(params Assembly[] fullTrustList) where T : MarshalByRefObject - { - return GetPartialTrustInstance(GetStandardPermission(PermSetNames.Execution), fullTrustList); - } - - } -} \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/deployProj/CompileProj.fsx b/tests/fsharpqa/testenv/src/deployProj/CompileProj.fsx index 5362274270d..b0f3de779b2 100644 --- a/tests/fsharpqa/testenv/src/deployProj/CompileProj.fsx +++ b/tests/fsharpqa/testenv/src/deployProj/CompileProj.fsx @@ -1,170 +1,64 @@ -#r @"..\..\..\..\..\packages\FSharp.Data.2.2.5\lib\net40\FSharp.Data.dll" +#load @"../../../../../src/buildtools/scriptlib.fsx" +#load "crackProjectJson.fsx" open System -open System.Diagnostics open System.IO -open FSharp.Data -open FSharp.Data.JsonExtensions -type AssemblyReferenceType = | forBuild = 0 | forExecute = 1 - -// Try head was introduced in F# 4.0 -let tryHead (source : seq<_>) = - let checkNonNull argName arg = - match box arg with - | null -> nullArg argName - | _ -> () - checkNonNull "source" source - use e = source.GetEnumerator() - if (e.MoveNext()) then Some e.Current - else None - -let Arguments = fsi.CommandLineArgs |> Seq.skip 1 -let Sources = Arguments |> Seq.filter(fun t -> printfn "%s" t; t.StartsWith("--source:")) |> Seq.map(fun t -> t.Remove(0, 9).Trim()) |> Seq.distinct -let Defines = Arguments |> Seq.filter(fun t -> printfn "%s" t; t.StartsWith("--define:")) |> Seq.map(fun t -> t.Remove(0, 9).Trim()) -let GetArgumentFromCommandLine switchName defaultValue = - match Arguments |> Seq.filter(fun t -> t.StartsWith(switchName)) |> Seq.map(fun t -> t.Remove(0, switchName.Length).Trim()) |> tryHead with - | Some(file) -> if file.Length <> 0 then file else defaultValue - | _ -> defaultValue - -let ProjectJsonLock = GetArgumentFromCommandLine "--projectJsonLock:" @"tests\fsharp\project.lock.json" -let PackagesDir = GetArgumentFromCommandLine "--packagesDir:" @"packages" -let TargetPlatformName = GetArgumentFromCommandLine "--targetPlatformName:" @"DNXCore,Version=v5.0/win7-x64" -let FSharpCore = GetArgumentFromCommandLine "--fsharpCore:" @"Release\coreclr\bin\FSharp.Core.dll" -let Output = GetArgumentFromCommandLine "--output:" @"." -let Verbosity = GetArgumentFromCommandLine "--v:" @"quiet" -let CompilerPath = GetArgumentFromCommandLine "--compilerPath:" @"." -let TestKeyFile = GetArgumentFromCommandLine "--keyfile:" @"" -let TestDelaySign = GetArgumentFromCommandLine "--delaysign:" @"" -let TestPublicSign = GetArgumentFromCommandLine "--publicsign:" @"" -let ExtraDefines = GetArgumentFromCommandLine "--ExtraDefines:" @"" - -let GetKeyFileOption = if String.IsNullOrEmpty(TestKeyFile) then "" else (sprintf "--keyfile:%s" TestKeyFile) -let GetDelaySignOption = if String.IsNullOrEmpty(TestDelaySign) then "" else "--delaysign" -let GetPublicSignOption = if String.IsNullOrEmpty(TestPublicSign) then "" else "--publicsign" - -let FSharpCoreDir = Path.GetDirectoryName(FSharpCore) -let Win32Manifest = Path.Combine(FSharpCoreDir, "default.win32manifest") +let Sources = argv |> Seq.filter(fun t -> printfn "%s" t; t.StartsWith("--source:")) |> Seq.map(fun t -> t.Remove(0, 9).Trim()) |> Seq.distinct +let Defines = argv |> Seq.filter(fun t -> printfn "%s" t; t.StartsWith("--define:")) |> Seq.map(fun t -> t.Remove(0, 9).Trim()) + +let ProjectJsonLock = getCmdLineArg "--projectJsonLock:" @"tests\fsharp\project.lock.json" +let PackagesDir = getCmdLineArg "--packagesDir:" @"packages" +let TargetPlatformName = getCmdLineArg "--targetPlatformName:" @"DNXCore,Version=v5.0/win7-x64" +let FSharpCore = getCmdLineArg "--fsharpCore:" @"Release\coreclr\bin\FSharp.Core.dll" +let Output = getCmdLineArg "--output:" @"." +let Verbosity = getCmdLineArg "--v:" @"quiet" +let CompilerPath = getCmdLineArg "--compilerPath:" @"." +let TestKeyFile = getCmdLineArg "--keyfile:" @"" +let TestDelaySign = getCmdLineArg "--delaysign:" @"" +let TestPublicSign = getCmdLineArg "--publicsign:" @"" +let ExtraDefines = getCmdLineArg "--ExtraDefines:" @"" + +let KeyFileOption = if isNullOrEmpty TestKeyFile then "" else sprintf "--keyfile:%s" TestKeyFile +let DelaySignOption = if isNullOrEmpty TestDelaySign then "" else "--delaysign" +let PublicSignOption = if isNullOrEmpty TestPublicSign then "" else "--publicsign" + +let FSharpCoreDir = getDirectoryName FSharpCore +let Win32Manifest = FSharpCoreDir ++ "default.win32manifest" let FSharpCompilerFiles = - seq { - yield Path.Combine(FSharpCoreDir, "fsc.exe") - yield Path.Combine(FSharpCoreDir, "FSharp.Compiler.dll") - yield Path.Combine(FSharpCoreDir, "FSharp.Core.sigdata") - yield Path.Combine(FSharpCoreDir, "FSharp.Core.optdata") - yield Win32Manifest - yield Path.Combine(FSharpCoreDir, "fsi.exe") - yield Path.Combine(FSharpCoreDir, "FSharp.Compiler.Interactive.Settings.dll") - } + [ FSharpCoreDir ++ "fsc.exe" + FSharpCoreDir ++ "FSharp.Compiler.dll" + FSharpCoreDir ++ "FSharp.Core.sigdata" + FSharpCoreDir ++ "FSharp.Core.optdata" + Win32Manifest + FSharpCoreDir ++ "fsi.exe" + FSharpCoreDir ++ "FSharp.Compiler.Interactive.Settings.dll"] let isVerbose = Verbosity = "verbose" -let makeDirectory (output) = - if not (Directory.Exists(output)) then Directory.CreateDirectory(output) |>ignore - () - -let executeProcess filename arguments = - let processWriteMessage (chan:TextWriter) (message:string) = - match message with - | null -> () - | _ as m -> chan.WriteLine(m) |>ignore - let info = new ProcessStartInfo() - let p = new Process() - printfn "%s %s" filename arguments - info.Arguments <- arguments - info.UseShellExecute <- false - info.RedirectStandardOutput <- true - info.RedirectStandardError <- true - info.CreateNoWindow <- true - info.FileName <- filename - p.StartInfo <- info - p.OutputDataReceived.Add(fun x -> processWriteMessage stdout x.Data) - p.ErrorDataReceived.Add(fun x -> processWriteMessage stderr x.Data) - if p.Start() then - p.BeginOutputReadLine() - p.BeginErrorReadLine() - p.WaitForExit() - p.ExitCode - else - 0 +let dependencies = CrackProjectJson.collectReferences (isVerbose, PackagesDir, TargetPlatformName, ProjectJsonLock, false) let executeCompiler sources references = let Win32manifest=Path.Combine(CompilerPath, "default.win32manifest") let listToPrefixedSpaceSeperatedString prefix list = list |> Seq.fold(fun a t -> sprintf "%s %s%s" a prefix t) "" let listToSpaceSeperatedString list = list |> Seq.fold(fun a t -> sprintf "%s %s" a t) "" let addReferenceSwitch list = list |> Seq.map(fun i -> sprintf "--reference:%s" i) - printfn ">%s<" (GetKeyFileOption) - printfn ">%s<" (GetDelaySignOption) + printfn ">%s<" (KeyFileOption) + printfn ">%s<" (DelaySignOption) let arguments = sprintf @"%s --debug:portable --debug+ --noframework --simpleresolution --out:%s --define:BASIC_TEST --targetprofile:netcore --target:exe -g --times --win32manifest:%s %s -r:%s %s %s %s %s %s %s" - (System.IO.Path.Combine(CompilerPath, "fsc.exe")) - (Output) - (Win32Manifest) + (CompilerPath ++ "fsc.exe") + Output + Win32Manifest (listToSpaceSeperatedString (addReferenceSwitch references)) - (FSharpCore) + FSharpCore (listToPrefixedSpaceSeperatedString "--define:" Defines) - (GetKeyFileOption) - (GetDelaySignOption) - (GetPublicSignOption) - (ExtraDefines) + KeyFileOption + DelaySignOption + PublicSignOption + ExtraDefines (listToSpaceSeperatedString sources) - File.WriteAllText(@"coreclr.fsc.cmd",(CompilerPath + @"\CoreRun.exe" + arguments)) - executeProcess (CompilerPath + @"\CoreRun.exe") arguments - -let setPathSeperators (path:string) = path.Replace('/', '\\') - -let splitNameAndVersion (ref:string) = - let elements = ref.Split [| '/' |] - if elements.Length >= 2 then - Some(elements.[0], elements.[1]) - else - None - -let collectReferenciesFromProjectJson lockFile assemblyReferenceType = - let getAssemblyReferenciesFromTargets (targets:JsonValue) = - let getReferencedFiles (referencedFiles:JsonValue) = - seq { - for path, _ in referencedFiles.Properties do - let path = setPathSeperators path - if Path.GetFileName(path) = "_._" then () - else yield setPathSeperators path - } - let buildReferencePaths name version paths = - seq { - for path in paths do - yield sprintf @"%s\%s\%s\%s" PackagesDir name version path - } - if isVerbose then - printfn "lockFile: %A" lockFile - printfn "TargetPlatformName: %A" TargetPlatformName - printfn "PackagesDir: %A" PackagesDir - seq { - let target = targets.TryGetProperty(TargetPlatformName) - match target with - | Some(t) -> - for ref, value in t.Properties do - match splitNameAndVersion ref with - | Some(name, version) -> - if isVerbose then - printfn "name: %A" name - printfn "version: %A" version - if assemblyReferenceType = AssemblyReferenceType.forBuild then - match value.TryGetProperty("compile") with - | None -> () - | Some x -> yield! buildReferencePaths name version (getReferencedFiles x) - else - match value.TryGetProperty("runtime") with - | None -> () - | Some x -> yield! buildReferencePaths name version (getReferencedFiles value?runtime) - match value.TryGetProperty("native") with - | None -> () - | Some x -> yield! buildReferencePaths name version (getReferencedFiles value?native) - | _ -> () - | _ -> () - } - - let getReferencesFromJson (filename:string) = - let projectJson = JsonValue.Load( filename ) - getAssemblyReferenciesFromTargets projectJson?targets - (getReferencesFromJson lockFile) |> Seq.distinct + File.WriteAllText("coreclr.fsc.cmd",(CompilerPath ++ "CoreRun.exe") + arguments) + executeProcess (CompilerPath ++ "CoreRun.exe") arguments -makeDirectory (Path.GetDirectoryName(Output)) -exit (executeCompiler Sources (collectReferenciesFromProjectJson ProjectJsonLock AssemblyReferenceType.forBuild) ) +makeDirectory (getDirectoryName Output) +exit (executeCompiler Sources dependencies) diff --git a/tests/fsharpqa/testenv/src/deployProj/DeployProj.fsx b/tests/fsharpqa/testenv/src/deployProj/DeployProj.fsx index cb63359f7fd..f932df01778 100644 --- a/tests/fsharpqa/testenv/src/deployProj/DeployProj.fsx +++ b/tests/fsharpqa/testenv/src/deployProj/DeployProj.fsx @@ -1,164 +1,35 @@ -#r @"..\..\..\..\..\packages\FSharp.Data.2.2.5\lib\net40\FSharp.Data.dll" +#load "../../../../../src/buildtools/scriptlib.fsx" +#load "crackProjectJson.fsx" -open System.Diagnostics open System.IO open FSharp.Data open FSharp.Data.JsonExtensions -type AssemblyReferenceType = | forBuild = 0 | forExecute = 1 - -// Try head was introduced in F# 4.0 -let tryHead (source : seq<_>) = - let checkNonNull argName arg = - match box arg with - | null -> nullArg argName - | _ -> () - checkNonNull "source" source - use e = source.GetEnumerator() - if (e.MoveNext()) then Some e.Current - else None - -let Arguments = fsi.CommandLineArgs |> Seq.skip 1 - -let GetArgumentFromCommandLine switchName defaultValue = - match Arguments |> Seq.filter(fun t -> t.StartsWith(switchName)) |> Seq.map(fun t -> t.Remove(0, switchName.Length).Trim()) |> tryHead with - | Some(file) -> if file.Length <> 0 then file else defaultValue - | _ -> defaultValue - -let ProjectJson = GetArgumentFromCommandLine "--projectJson:" @"tests\fsharp\project.json" -let configFile = GetArgumentFromCommandLine "--nugetConfig:" @".nuget\nuget.config" -let ProjectJsonLock = GetArgumentFromCommandLine "--projectJsonLock:" @"tests\fsharp\project.lock.json" -let PackagesDir = GetArgumentFromCommandLine "--packagesDir:" @"packages" -let TargetPlatformName = GetArgumentFromCommandLine "--targetPlatformName:" @"DNXCore,Version=v5.0/win7-x64" -let FSharpCore = GetArgumentFromCommandLine "--fsharpCore:" @"Release\coreclr\bin\FSharp.Core.dll" -let Output = GetArgumentFromCommandLine "--output:" @"." -let NugetPath = GetArgumentFromCommandLine "--nugetPath:" @".nuget\nuget.exe" -let Verbosity = GetArgumentFromCommandLine "--v:" @"quiet" -let CopyCompiler = GetArgumentFromCommandLine "--copyCompiler:" @"no" +let ProjectJsonLock = getCmdLineArg "--projectJsonLock:" @"tests\fsharp\project.lock.json" +let PackagesDir = getCmdLineArg "--packagesDir:" @"packages" +let TargetPlatformName = getCmdLineArg "--targetPlatformName:" @".NETStandard,Version=v1.6/win7-x64" +let FSharpCore = getCmdLineArg "--fsharpCore:" @"release\coreclr\bin\FSharp.Core.dll" +let Output = getCmdLineArg "--output:" @"." +let Verbosity = getCmdLineArg "--v:" @"quiet" +let CopyCompiler = getCmdLineArg "--copyCompiler:" @"no" let FSharpCompilerFiles = - let FSharpCoreDir = Path.GetDirectoryName(FSharpCore) - seq { - yield Path.Combine(FSharpCoreDir, "fsc.exe") - yield Path.Combine(FSharpCoreDir, "FSharp.Compiler.dll") - yield Path.Combine(FSharpCoreDir, "FSharp.Core.sigdata") - yield Path.Combine(FSharpCoreDir, "FSharp.Core.optdata") - yield Path.Combine(FSharpCoreDir, "default.win32manifest") - yield Path.Combine(FSharpCoreDir, "fsi.exe") - yield Path.Combine(FSharpCoreDir, "FSharp.Compiler.Interactive.Settings.dll") - } + let FSharpCoreDir = getDirectoryName FSharpCore + [ FSharpCoreDir ++ "fsc.exe" + FSharpCoreDir ++ "FSharp.Compiler.dll" + FSharpCoreDir ++ "FSharp.Core.sigdata" + FSharpCoreDir ++ "FSharp.Core.optdata" + FSharpCoreDir ++ "default.win32manifest" + FSharpCoreDir ++ "fsi.exe" + FSharpCoreDir ++ "FSharp.Compiler.Interactive.Settings.dll" ] let isVerbose = Verbosity = "verbose" -// Utility functions -let copyFile source dir = - let dest = - if not (Directory.Exists(dir)) then Directory.CreateDirectory(dir) |>ignore - let result = Path.Combine(dir, Path.GetFileName(source)) - result - if isVerbose then - printfn "source: %s" source - printfn "dest: %s" dest - File.Copy(source, dest, true) - -let deleteDirectory (output) = - if (Directory.Exists(output)) then Directory.Delete(output, true) |>ignore - () - -let makeDirectory (output) = - if not (Directory.Exists(output)) then Directory.CreateDirectory(output) |>ignore - () - -let executeProcess filename arguments = - let processWriteMessage (chan:TextWriter) (message:string) = - match message with - | null -> () - | _ as m -> chan.WriteLine(m) |>ignore - let info = new ProcessStartInfo() - let p = new Process() - if isVerbose then printfn "%s %s" filename arguments - info.Arguments <- arguments - info.UseShellExecute <- false - info.RedirectStandardOutput <- true - info.RedirectStandardError <- true - info.CreateNoWindow <- true - info.FileName <- filename - p.StartInfo <- info - p.OutputDataReceived.Add(fun x -> processWriteMessage stdout x.Data) - p.ErrorDataReceived.Add(fun x -> processWriteMessage stderr x.Data) - if p.Start() then - p.BeginOutputReadLine() - p.BeginErrorReadLine() - p.WaitForExit() - p.ExitCode - else - 0 -let _ = - let arguments = "restore -configFile "+ configFile + " -PackagesDirectory " + PackagesDir + " " + ProjectJson - executeProcess NugetPath arguments - -let setPathSeperators (path:string) = path.Replace('/', '\\') - -let splitNameAndVersion (ref:string) = - let elements = ref.Split [| '/' |] - if elements.Length >= 2 then - Some(elements.[0], elements.[1]) - else - None - -let collectReferenciesFromProjectJson lockFile assemblyReferenceType = - let getAssemblyReferenciesFromTargets (targets:JsonValue) = - let getReferencedFiles (referencedFiles:JsonValue) = - seq { - for path, _ in referencedFiles.Properties do - let path = setPathSeperators path - if Path.GetFileName(path) = "_._" then () - else yield setPathSeperators path - } - let buildReferencePaths name version paths = - seq { - for path in paths do - yield sprintf @"%s\%s\%s\%s" PackagesDir name version path - } - if isVerbose then - printfn "lockFile: %A" lockFile - printfn "TargetPlatformName: %A" TargetPlatformName - printfn "PackagesDir: %A" PackagesDir - seq { - let target = targets.TryGetProperty(TargetPlatformName) - match target with - | Some(t) -> - for ref, value in t.Properties do - match splitNameAndVersion ref with - | Some(name, version) -> - if isVerbose then - printfn "name: %A" name - printfn "version: %A" version - if assemblyReferenceType = AssemblyReferenceType.forBuild then - match value.TryGetProperty("compile") with - | None -> () - | Some x -> yield! buildReferencePaths name version (getReferencedFiles x) - else - match value.TryGetProperty("runtime") with - | None -> () - | Some x -> yield! buildReferencePaths name version (getReferencedFiles value?runtime) - match value.TryGetProperty("native") with - | None -> () - | Some x -> yield! buildReferencePaths name version (getReferencedFiles value?native) - | _ -> () - | _ -> () - } - - let getReferencesFromJson (filename:string) = - let projectJson = JsonValue.Load( filename ) - getAssemblyReferenciesFromTargets projectJson?targets - (getReferencesFromJson lockFile) |> Seq.distinct - -let dependencies = (collectReferenciesFromProjectJson ProjectJsonLock AssemblyReferenceType.forExecute) +let dependencies = CrackProjectJson.collectReferences (isVerbose, PackagesDir, TargetPlatformName, ProjectJsonLock, true) //Okay copy everything -makeDirectory(Output) -copyFile FSharpCore Output +makeDirectory Output dependencies |> Seq.iter(fun source -> copyFile source Output) if CopyCompiler = "yes" then + copyFile FSharpCore Output FSharpCompilerFiles |> Seq.iter(fun source -> copyFile source Output) diff --git a/tests/fsharpqa/testenv/src/deployProj/crackProjectJson.fsx b/tests/fsharpqa/testenv/src/deployProj/crackProjectJson.fsx new file mode 100644 index 00000000000..99fba3e10fd --- /dev/null +++ b/tests/fsharpqa/testenv/src/deployProj/crackProjectJson.fsx @@ -0,0 +1,66 @@ +module CrackProjectJson + +#load "../../../../../src/buildtools/scriptlib.fsx" +#r "../../../../../packages/FSharp.Data.2.2.5/lib/net40/FSharp.Data.dll" + +open FSharp.Data +open FSharp.Data.JsonExtensions + +/// Collects references from project.json.lock +let collectReferences (isVerbose, packagesDir, targetPlatformName, lockFile:string, isForExecute) = + let setPathSeperators (path:string) = path.Replace('/', '\\') + + let splitNameAndVersion (ref:string) = + let elements = ref.Split [| '/' |] + if elements.Length >= 2 then + Some(elements.[0], elements.[1]) + else + None + + let getReferencedFiles (referencedFiles:JsonValue) = + seq { + for path, _ in referencedFiles.Properties do + let path = setPathSeperators path + if getFilename path = "_._" then () + else yield setPathSeperators path + } + + let buildReferencePaths name version paths = + seq { + for path in paths do + yield sprintf @"%s\%s\%s\%s" packagesDir name version path + } + + let getAssemblyReferenciesFromTargets (targets:JsonValue) = + seq { + let target = targets.TryGetProperty(targetPlatformName) + match target with + | Some t -> + for ref, value in t.Properties do + match splitNameAndVersion ref with + | Some(name, version) -> + if isVerbose then + printfn "name: %A" name + printfn "version: %A" version + if not isForExecute then + match value.TryGetProperty("compile") with + | None -> () + | Some x -> yield! buildReferencePaths name version (getReferencedFiles x) + else + match value.TryGetProperty("runtime") with + | None -> () + | Some x -> yield! buildReferencePaths name version (getReferencedFiles value?runtime) + match value.TryGetProperty("native") with + | None -> () + | Some x -> yield! buildReferencePaths name version (getReferencedFiles value?native) + | _ -> () + | _ -> () + } + + if isVerbose then + printfn "lockFile: %A" lockFile + printfn "targetPlatformName: %A" targetPlatformName + printfn "packagesDir: %A" packagesDir + let projectJson = JsonValue.Load(lockFile) + getAssemblyReferenciesFromTargets projectJson?targets |> Seq.distinct + diff --git a/tests/fsharpqa/testenv/src/diff/diff.fsproj b/tests/fsharpqa/testenv/src/diff/diff.fsproj index cb79fba9f13..035dbbed0ea 100644 --- a/tests/fsharpqa/testenv/src/diff/diff.fsproj +++ b/tests/fsharpqa/testenv/src/diff/diff.fsproj @@ -1,6 +1,9 @@  - + + ..\..\..\..\..\src + + Debug AnyCPU @@ -11,79 +14,41 @@ diff v4.5 true - True - ..\..\..\..\..\$(Configuration)\net40\bin 4.4.1.0 - HostedCompilerServer + diff + ..\..\bin\ + true + $(OutputPath)$(AssemblyName).xml + 3 + AnyCPU + true true full false false - bin\Debug\ DEBUG;TRACE - 3 - AnyCPU - bin\Debug\ILComparer.XML - true pdbonly true true - bin\Release\ TRACE - 3 - AnyCPU - bin\Release\ILComparer.XML - true + + + + + + {DED3BBD7-53F4-428A-8C9F-27968E768605} + FSharp.Core + - - - True - - - - - True - - - - - - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - $(OpenDrop) - $(OpenDrop)\Microsoft.FSharp.targets - - - - - + \ No newline at end of file diff --git a/vsintegration/packages.config b/vsintegration/packages.config new file mode 100644 index 00000000000..e87dd65f176 --- /dev/null +++ b/vsintegration/packages.config @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj index 40b2bf4cb12..3e42e9cf8c0 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj @@ -179,6 +179,7 @@
+ diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index ed162cda832..3eb0bb06ef3 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -30,6 +30,7 @@ + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index 43b1560a39a..4fdfa66452f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -161,6 +161,7 @@ + true diff --git a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj index 62ca43be8c0..8f6c6a7b67c 100644 --- a/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj +++ b/vsintegration/src/FSharp.VS.FSI/FSHarp.VS.FSI.fsproj @@ -144,6 +144,7 @@ + diff --git a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj index 69f97bb9182..da888e68b85 100644 --- a/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj +++ b/vsintegration/tests/Salsa/VisualFSharp.Salsa.fsproj @@ -77,7 +77,6 @@ $(FSharpSourcesRoot)\..\packages\RoslynDependencies.Microsoft.VisualStudio.Platform.VSEditor.$(RoslynVSPackagesVersion)\lib\net46\Microsoft.VisualStudio.Platform.VSEditor.Interop.dll True - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualStudio.Threading.14.1.131\lib\net45\Microsoft.VisualStudio.Threading.dll @@ -148,4 +147,5 @@ +
\ No newline at end of file diff --git a/vsintegration/tests/unittests/Resources.MockTypeProviders/DummyProviderForLanguageServiceTesting/DummyProviderForLanguageServiceTesting.fsproj b/vsintegration/tests/unittests/Resources.MockTypeProviders/DummyProviderForLanguageServiceTesting/DummyProviderForLanguageServiceTesting.fsproj index d2e7fa36c00..8e95fcbefe2 100644 --- a/vsintegration/tests/unittests/Resources.MockTypeProviders/DummyProviderForLanguageServiceTesting/DummyProviderForLanguageServiceTesting.fsproj +++ b/vsintegration/tests/unittests/Resources.MockTypeProviders/DummyProviderForLanguageServiceTesting/DummyProviderForLanguageServiceTesting.fsproj @@ -38,4 +38,5 @@ + \ No newline at end of file diff --git a/vsintegration/tests/unittests/Resources.MockTypeProviders/EmptyAssembly/EmptyAssembly.fsproj b/vsintegration/tests/unittests/Resources.MockTypeProviders/EmptyAssembly/EmptyAssembly.fsproj index 34fce6941ec..c4617d49a1e 100644 --- a/vsintegration/tests/unittests/Resources.MockTypeProviders/EmptyAssembly/EmptyAssembly.fsproj +++ b/vsintegration/tests/unittests/Resources.MockTypeProviders/EmptyAssembly/EmptyAssembly.fsproj @@ -35,4 +35,5 @@ + \ No newline at end of file diff --git a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj index f1c06ce344a..38a515cc607 100644 --- a/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj +++ b/vsintegration/tests/unittests/VisualFSharp.Unittests.fsproj @@ -275,4 +275,5 @@ + \ No newline at end of file diff --git a/vsintegration/vsintegration.targets b/vsintegration/vsintegration.targets new file mode 100644 index 00000000000..be081b09473 --- /dev/null +++ b/vsintegration/vsintegration.targets @@ -0,0 +1,7 @@ + + + + + + + From 513f6e2473df58d72eaaf993e163f4359fdc31ed Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sun, 16 Oct 2016 15:03:46 -0700 Subject: [PATCH 12/17] Replaced missed file --- setup/packages.config | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 setup/packages.config diff --git a/setup/packages.config b/setup/packages.config new file mode 100644 index 00000000000..46a7701a755 --- /dev/null +++ b/setup/packages.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + From 560ba922abde4dd1cd5458f55ea4e47d266ef252 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 20 Oct 2016 11:15:11 -0700 Subject: [PATCH 13/17] Fix merge issue --- tests/fsharpqa/testenv/src/diff/diff.fsproj | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fsharpqa/testenv/src/diff/diff.fsproj b/tests/fsharpqa/testenv/src/diff/diff.fsproj index ca3078640aa..97a17aee007 100644 --- a/tests/fsharpqa/testenv/src/diff/diff.fsproj +++ b/tests/fsharpqa/testenv/src/diff/diff.fsproj @@ -45,7 +45,6 @@ - {DED3BBD7-53F4-428A-8C9F-27968E768605} FSharp.Core From 53adf556065a8976ae1d332c0f6f5c4246d67097 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Thu, 20 Oct 2016 11:22:47 -0700 Subject: [PATCH 14/17] fix merge error --- tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj b/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj index 93d263edf07..5dfe0bc9b41 100644 --- a/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj +++ b/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj @@ -45,7 +45,6 @@ - {DED3BBD7-53F4-428A-8C9F-27968E768605} FSharp.Core From 30a7e2f844ac1e06a553ea3cd0794771b66fe41e Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Tue, 25 Oct 2016 21:43:17 -0700 Subject: [PATCH 15/17] Update to nunit 3.5 --- .gitignore | 2 + build.cmd | 48 +++++++++---------- packages.config | 7 ++- src/FSharpSource.targets | 11 +++-- .../FSharp.Core.Unittests.fsproj | 8 ++-- src/fsharp/FSharp.Core.Unittests/Program.fs | 3 +- tests/fsharp/FSharp.Tests.fsproj | 2 +- tests/fsharpqa/Source/FSharpQA.Tests.fsproj | 2 +- 8 files changed, 43 insertions(+), 40 deletions(-) diff --git a/.gitignore b/.gitignore index 1bd35450673..d2ab9630afb 100644 --- a/.gitignore +++ b/.gitignore @@ -104,3 +104,5 @@ tests/fsharp/typecheck/sigs/neg94-pre.dll times /tests/fsharpqa/testenv/bin/System.ValueTuple.dll source_link.json +/.vs +/VSRelease/net40/bin diff --git a/build.cmd b/build.cmd index 6486e0a1e0f..17cd00c39da 100644 --- a/build.cmd +++ b/build.cmd @@ -525,8 +525,8 @@ if '%BUILD_NET40%' == '1' ( call src\update.cmd %BUILD_CONFIG% -ngen ) -@echo set NUNITPATH=packages\NUnit.Console.3.0.0\tools\ -set NUNITPATH=packages\NUnit.Console.3.0.0\tools\ +@echo set NUNITPATH=packages\NUnit.ConsoleRunner.3.5.0\tools\ +set NUNITPATH=packages\NUnit.ConsoleRunner.3.5.0\tools\ if not exist %NUNITPATH% echo Error: Could not find %NUNITPATH% && goto :failure @echo xcopy "%NUNITPATH%*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y @@ -541,20 +541,20 @@ if '%BUILD_CORECLR%' == '1' ( %_nugetexe% restore .\tests\fsharp\project.json -PackagesDirectory packages echo Deploy x86 version of compiler and dependencies, ready for testing - %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\win7-x86 --copyCompiler:yes --v:quiet - %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\win7-x86 --copyCompiler:no --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:%USERPROFILE%\.nuget\packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\win7-x86 --copyCompiler:yes --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x86 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:%USERPROFILE%\.nuget\packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\win7-x86 --copyCompiler:no --v:quiet echo Deploy x64 version of compiler, ready for testing - %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\win7-x64 --copyCompiler:yes --v:quiet - %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\win7-x64 --copyCompiler:no --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:%USERPROFILE%\.nuget\packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\win7-x64 --copyCompiler:yes --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/win7-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:%USERPROFILE%\.nuget\packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\win7-x64 --copyCompiler:no --v:quiet echo Deploy linux version of built compiler, ready for testing - %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\ubuntu.14.04-x64 --copyCompiler:yes --v:quiet - %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\ubuntu.14.04-x64 --copyCompiler:no --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:%USERPROFILE%\.nuget\packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\ubuntu.14.04-x64 --copyCompiler:yes --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/ubuntu.14.04-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:%USERPROFILE%\.nuget\packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\ubuntu.14.04-x64 --copyCompiler:no --v:quiet echo Deploy osx version of built compiler, ready for testing - %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\osx.10.10-x64 --copyCompiler:yes --v:quiet - %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\osx.10.10-x64 --copyCompiler:no --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:%USERPROFILE%\.nuget\packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\fsc\osx.10.10-x64 --copyCompiler:yes --v:quiet + %_fsiexe% --exec tests\fsharpqa\testenv\src\DeployProj\DeployProj.fsx --targetPlatformName:.NETStandard,Version=v1.6/osx.10.10-x64 --projectJsonLock:%~dp0tests\fsharp\project.lock.json --packagesDir:%USERPROFILE%\.nuget\packages --fsharpCore:%BUILD_CONFIG%\coreclr\bin\FSharp.Core.dll --output:tests\testbin\%BUILD_CONFIG%\coreclr\osx.10.10-x64 --copyCompiler:no --v:quiet ) @@ -596,7 +596,7 @@ setlocal enableDelayedExpansion set NUNITPATH=%~dp0tests\fsharpqa\testenv\bin\nunit\ -set NUNIT3_CONSOLE=%~dp0packages\NUnit.Console.3.0.0\tools\nunit3-console.exe +set NUNIT3_CONSOLE=%~dp0packages\NUnit.ConsoleRunner.3.5.0\tools\nunit3-console.exe set link_exe=%~dp0packages\VisualCppTools.14.0.24519-Pre\lib\native\bin\link.exe if not exist "%link_exe%" ( echo Error: failed to find '%link_exe%' use nuget to restore the VisualCppTools package @@ -622,12 +622,12 @@ set XMLFILE=%RESULTSDIR%\test-net40-fsharp-results.xml set OUTPUTFILE=%RESULTSDIR%\test-net40-fsharp-output.log set ERRORFILE=%RESULTSDIR%\test-net40-fsharp-errors.log -set command="%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\FSharp.Tests.FSharp.dll" --framework:V4.0 --work:"%FSCBINPATH%" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --result:"!XMLFILE!;format=nunit2" +set command="%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\FSharp.Tests.FSharp.dll" --framework:V4.0 --work:"%FSCBINPATH%" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --result:"!XMLFILE!;format=nunit3" if '%TEST_NET40_FSHARP_SUITE%' == '1' ( - rem Turn off delayed expansion when manipulating variables where a ! may appear in the argument text (CMD batch file oddity) - rem Note: each setlocal must be matched by an executed endlocal - setlocal disableDelayedExpansion + rem Turn off delayed expansion when manipulating variables where a ! may appear in the argument text (CMD batch file oddity) + rem Note: each setlocal must be matched by an executed endlocal + setlocal disableDelayedExpansion echo %command% %WHERE_ARG_NUNIT% %command% %WHERE_ARG_NUNIT% endlocal @@ -739,17 +739,17 @@ REM ---------------- net40-compilerunit ----------------------- set XMLFILE=%RESULTSDIR%\test-net40-compilerunit-results.xml set OUTPUTFILE=%RESULTSDIR%\test-net40-compilerunit-output.log set ERRORFILE=%RESULTSDIR%\test-net40-compilerunit-errors.log -set command="%NUNIT3_CONSOLE%" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit2" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\net40\bin\FSharp.Compiler.Unittests.dll" +set command="%NUNIT3_CONSOLE%" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit3" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --work:"%FSCBINPATH%" "%FSCBINPATH%\..\..\net40\bin\FSharp.Compiler.Unittests.dll" if '%TEST_NET40_COMPILERUNIT_SUITE%' == '1' ( - rem Turn off delayed expansion when manipulating variables where a ! may appear in the argument text (CMD batch file oddity) - rem Note: each setlocal must be matched by an executed endlocal - setlocal disableDelayedExpansion + rem Turn off delayed expansion when manipulating variables where a ! may appear in the argument text (CMD batch file oddity) + rem Note: each setlocal must be matched by an executed endlocal + setlocal disableDelayedExpansion echo %command% %WHERE_ARG_NUNIT% %command% %WHERE_ARG_NUNIT% endlocal - call :UPLOAD_TEST_RESULTS "!XMLFILE!" "!OUTPUTFILE!" "!ERRORFILE!" + call :UPLOAD_TEST_RESULTS "!XMLFILE!" "!OUTPUTFILE!" "!ERRORFILE!" if NOT '!saved_errorlevel!' == '0' ( type "!OUTPUTFILE!" type "!ERRORFILE!" @@ -763,7 +763,7 @@ REM ---------------- net40-coreunit ----------------------- set XMLFILE=%RESULTSDIR%\test-net40-coreunit-results.xml set OUTPUTFILE=%RESULTSDIR%\test-net40-coreunit-output.log set ERRORFILE=%RESULTSDIR%\test-net40-coreunit-errors.log -set command="%NUNIT3_CONSOLE%" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit2" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --work:"%FSCBINPATH%" "%FSCBINPATH%\FSharp.Core.Unittests.dll" +set command="%NUNIT3_CONSOLE%" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit3" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --work:"%FSCBINPATH%" "%FSCBINPATH%\FSharp.Core.Unittests.dll" if '%TEST_NET40_COREUNIT_SUITE%' == '1' ( rem Turn off delayed expansion when manipulating variables where a ! may appear in the argument text (CMD batch file oddity) @@ -787,7 +787,7 @@ REM ---------------- portable-coreunit ----------------------- set XMLFILE=%RESULTSDIR%\test-portable-coreunit-results.xml set OUTPUTFILE=%RESULTSDIR%\test-portable-coreunit-output.log set ERRORFILE=%RESULTSDIR%\test-portable-coreunit-errors.log -set command="%NUNIT3_CONSOLE%" /framework:V4.0 /result="!XMLFILE!;format=nunit2" /output="!OUTPUTFILE!" /err="!ERRORFILE!" /work="%FSCBINPATH%" "%FSCBINPATH%\..\..\portable7\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable47\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable78\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable259\bin\FSharp.Core.Unittests.dll" +set command="%NUNIT3_CONSOLE%" /framework:V4.0 /result="!XMLFILE!;format=nunit3" /output="!OUTPUTFILE!" /err="!ERRORFILE!" /work="%FSCBINPATH%" "%FSCBINPATH%\..\..\portable7\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable47\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable78\bin\FSharp.Core.Unittests.dll" "%FSCBINPATH%\..\..\portable259\bin\FSharp.Core.Unittests.dll" if '%TEST_PORTABLE_COREUNIT_SUITE%' == '1' ( rem Turn off delayed expansion when manipulating variables where a ! may appear in the argument text (CMD batch file oddity) @@ -844,7 +844,7 @@ set XMLFILE=%RESULTSDIR%\test-coreclr-fsharp-results.xml set OUTPUTFILE=%RESULTSDIR%\test-coreclr-fsharp-output.log set ERRORFILE=%RESULTSDIR%\test-coreclr-fsharp-errors.log -set command="%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\..\..\coreclr\bin\FSharp.Tests.FSharp.dll" --framework:V4.0 --work:"%FSCBINPATH%" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --result:"!XMLFILE!;format=nunit2" +set command="%NUNIT3_CONSOLE%" --verbose "%FSCBINPATH%\..\..\coreclr\bin\FSharp.Tests.FSharp.dll" --framework:V4.0 --work:"%FSCBINPATH%" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --result:"!XMLFILE!;format=nunit3" if '%TEST_CORECLR_FSHARP_SUITE%' == '1' ( rem Turn off delayed expansion when manipulating variables where a ! may appear in the argument text (CMD batch file oddity) @@ -870,7 +870,7 @@ set XMLFILE=%RESULTSDIR%\test-vs-ideunit-results.xml set OUTPUTFILE=%RESULTSDIR%\test-vs-ideunit-output.log set ERRORFILE=%RESULTSDIR%\test-vs-ideunit-errors.log -set command="%NUNIT3_CONSOLE%" --verbose --x86 --framework:V4.0 --result:"!XMLFILE!;format=nunit2" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --work:"%FSCBINPATH%" --workers=1 --agents=1 --full "%FSCBINPATH%\VisualFSharp.Unittests.dll" +set command="%NUNIT3_CONSOLE%" --verbose --x86 --framework:V4.0 --result:"!XMLFILE!;format=nunit3" --output:"!OUTPUTFILE!" --err:"!ERRORFILE!" --work:"%FSCBINPATH%" --workers=1 --agents=1 --full "%FSCBINPATH%\VisualFSharp.Unittests.dll" if '%TEST_VS_IDEUNIT_SUITE%' == '1' ( rem Turn off delayed expansion when manipulating variables where a ! may appear in the argument text (CMD batch file oddity) rem Note: each setlocal must be matched by an executed endlocal diff --git a/packages.config b/packages.config index c2e734072bb..dd84372923b 100644 --- a/packages.config +++ b/packages.config @@ -20,10 +20,9 @@ - - - - + + + diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets index dc955f4adfb..c5e8fae1e14 100644 --- a/src/FSharpSource.targets +++ b/src/FSharpSource.targets @@ -102,10 +102,10 @@ - 3.0.0 - 3.0.5797.27534 + 3.5.0 + 3.5.0.0 $(FSharpSourcesRoot)\..\packages\NUnit.$(NUnitVersion)\lib\net45 - $(FSharpSourcesRoot)\..\packages\NUnit.Console.$(NUnitVersion)\tools\ + $(FSharpSourcesRoot)\..\packages\NUnit.ConsoleRunner\$(NUnitVersion)\tools\ 2.0.3 2.0.3.0 $(FSharpSourcesRoot)\..\packages\FsCheck.$(FsCheckVersion)\lib\ @@ -185,6 +185,7 @@ v5.0 false + .NETStandard,Version=v1.6 true @@ -541,8 +542,8 @@
- - + + diff --git a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj index 2dfb034adac..fac4e6fa3a2 100644 --- a/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj +++ b/src/fsharp/FSharp.Core.Unittests/FSharp.Core.Unittests.fsproj @@ -69,15 +69,15 @@ - + true True - ..\..\..\packages\NUnit.3.0.0\lib\portable-net45+win8+wp8+wpa81+Xamarin.Mac+MonoAndroid10+MonoTouch10+Xamarin.iOS10\nunit.framework.dll + ..\..\..\packages\NUnit.3.5.0\lib\portable-net45+win8+wp8+wpa81+Xamarin.Mac+MonoAndroid10+MonoTouch10+Xamarin.iOS10\nunit.framework.dll - + true True - ..\..\..\packages\NUnitLite.3.0.0\lib\portable-net45+win8+wp8+wpa81+Xamarin.Mac\nunitlite.dll + ..\..\..\packages\NUnitLite.3.5.0\lib\portable-net45+win8+wp8+wpa81+Xamarin.Mac\nunitlite.dll diff --git a/src/fsharp/FSharp.Core.Unittests/Program.fs b/src/fsharp/FSharp.Core.Unittests/Program.fs index b5cb7404af3..28ff2aa8434 100644 --- a/src/fsharp/FSharp.Core.Unittests/Program.fs +++ b/src/fsharp/FSharp.Core.Unittests/Program.fs @@ -3,9 +3,10 @@ module Program open System open System.Reflection open NUnitLite +open NUnit.Common type HelperType() = inherit System.Object() [] let main argv = - AutoRun().Execute(typeof.GetTypeInfo().Assembly, Console.Out, Console.In, argv) + AutoRun(typeof.GetTypeInfo().Assembly).Execute(argv, new ExtendedTextWrapper(Console.Out), Console.In) diff --git a/tests/fsharp/FSharp.Tests.fsproj b/tests/fsharp/FSharp.Tests.fsproj index c20d501b852..e20e619885b 100644 --- a/tests/fsharp/FSharp.Tests.fsproj +++ b/tests/fsharp/FSharp.Tests.fsproj @@ -76,7 +76,7 @@ - ..\..\packages\NUnit.3.0.0\lib\net45\nunit.framework.dll + ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True diff --git a/tests/fsharpqa/Source/FSharpQA.Tests.fsproj b/tests/fsharpqa/Source/FSharpQA.Tests.fsproj index 691ac57ccaa..036e07e9e7c 100644 --- a/tests/fsharpqa/Source/FSharpQA.Tests.fsproj +++ b/tests/fsharpqa/Source/FSharpQA.Tests.fsproj @@ -48,7 +48,7 @@ - ..\..\..\packages\NUnit.3.0.0\lib\net45\nunit.framework.dll + ..\..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True From e5c3723640b082cf7566a80cc14a0cd4aef6f81b Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Wed, 26 Oct 2016 13:50:42 -0700 Subject: [PATCH 16/17] revert unit runner to 3.0.0 --- build.cmd | 6 +++--- packages.config | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.cmd b/build.cmd index 17cd00c39da..a017f925e8f 100644 --- a/build.cmd +++ b/build.cmd @@ -525,8 +525,8 @@ if '%BUILD_NET40%' == '1' ( call src\update.cmd %BUILD_CONFIG% -ngen ) -@echo set NUNITPATH=packages\NUnit.ConsoleRunner.3.5.0\tools\ -set NUNITPATH=packages\NUnit.ConsoleRunner.3.5.0\tools\ +@echo set NUNITPATH=packages\NUnit.Console.3.0.0\tools\ +set NUNITPATH=packages\NUnit.Console.3.0.0\tools\ if not exist %NUNITPATH% echo Error: Could not find %NUNITPATH% && goto :failure @echo xcopy "%NUNITPATH%*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y @@ -596,7 +596,7 @@ setlocal enableDelayedExpansion set NUNITPATH=%~dp0tests\fsharpqa\testenv\bin\nunit\ -set NUNIT3_CONSOLE=%~dp0packages\NUnit.ConsoleRunner.3.5.0\tools\nunit3-console.exe +set NUNIT3_CONSOLE=%~dp0packages\NUnit.Console.3.0.0\tools\nunit3-console.exe set link_exe=%~dp0packages\VisualCppTools.14.0.24519-Pre\lib\native\bin\link.exe if not exist "%link_exe%" ( echo Error: failed to find '%link_exe%' use nuget to restore the VisualCppTools package diff --git a/packages.config b/packages.config index dd84372923b..6e0a76090e8 100644 --- a/packages.config +++ b/packages.config @@ -21,7 +21,7 @@ - + From 24ea78c514eb4f5b06acfe0440f406d504c2e42a Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 26 Oct 2016 14:27:26 -0700 Subject: [PATCH 17/17] Reduce number of times check path for illegal chars occurs in cropextension --- src/utils/filename.fs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/utils/filename.fs b/src/utils/filename.fs index ad494a0fd75..e80a4564998 100644 --- a/src/utils/filename.fs +++ b/src/utils/filename.fs @@ -29,16 +29,18 @@ let checkPathForIllegalChars (path:string) = // Case sensitive (original behaviour preserved). let checkSuffix (x:string) (y:string) = x.EndsWith(y,System.StringComparison.Ordinal) -let hasExtension (s:string) = - checkPathForIllegalChars s +let hasExtensionWithValidate (validate:bool) (s:string) = + if validate then (checkPathForIllegalChars s) |> ignore let sLen = s.Length (sLen >= 1 && s.[sLen - 1] = '.' && s <> ".." && s <> ".") || Path.HasExtension(s) +let hasExtension (s:string) = hasExtensionWithValidate true s + let chopExtension (s:string) = checkPathForIllegalChars s if s = "." then "" else // for OCaml compatibility - if not (hasExtension s) then + if not (hasExtensionWithValidate false s) then raise (System.ArgumentException("chopExtension")) // message has to be precisely this, for OCaml compatibility, and no argument name can be set Path.Combine (Path.GetDirectoryName s,Path.GetFileNameWithoutExtension(s))