From 68e35b9bdef516653ba4e28b6b9d3c2fd8b04019 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 2 Jun 2017 21:55:25 +0100 Subject: [PATCH 001/136] [SL.Core] Initial commit --- .gitignore | 288 +++++++++++++++++++++++++++++++++++++++++++++++++++++ LICENSE | 201 +++++++++++++++++++++++++++++++++++++ README.md | 2 + 3 files changed, 491 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..940794e60 --- /dev/null +++ b/.gitignore @@ -0,0 +1,288 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..8dada3eda --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 000000000..635228705 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Primitives +Point, Rectangle, Size Primitives for use across SixLabors libraries. From 979573d395aedd56fa34b26c073745027e989f47 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 2 Jun 2017 23:13:20 +0100 Subject: [PATCH 002/136] [SL.Core] initial primitive --- .editorconfig | 3 + SixLabors.Primitives.ruleset | 6 + SixLabors.Primitives.sln | 71 + SixLabors.Primitives.sln.DotSettings | 5 + appveyor.yml | 31 + build.cmd | 38 + codecov.yml | 21 + gitversion.yml | 13 + src/Shared/AssemblyInfo.Common.cs | 38 + src/Shared/stylecop.json | 9 + src/SixLabors.Primitives/Constants.cs | 18 + src/SixLabors.Primitives/Ellipse.cs | 183 +++ src/SixLabors.Primitives/LongRational.cs | 355 +++++ src/SixLabors.Primitives/MathF.cs | 293 +++++ src/SixLabors.Primitives/Matrix.cs | 360 ++++++ src/SixLabors.Primitives/Point.cs | 257 ++++ src/SixLabors.Primitives/PointF.cs | 233 ++++ src/SixLabors.Primitives/Rational.cs | 189 +++ src/SixLabors.Primitives/Rectangle.cs | 467 +++++++ src/SixLabors.Primitives/RectangleF.cs | 400 ++++++ src/SixLabors.Primitives/SignedRational.cs | 189 +++ .../SixLabors.Primitives.csproj | 40 + src/SixLabors.Primitives/Size.cs | 225 ++++ src/SixLabors.Primitives/SizeF.cs | 190 +++ src/SixLabors.Primitives/stylecop.json | 9 + tests/CodeCoverage/CodeCoverage.cmd | 21 + .../OpenCover.4.6.519/License.rtf | 166 +++ .../MSBuild/OpenCover.MSBuild.dll | Bin 0 -> 10240 bytes .../MSBuild/OpenCover.targets | 10 + .../SampleSln/.nuget/packages.config | 6 + .../SampleSln/Bom/Bom.csproj | 53 + .../SampleSln/Bom/BomManager.cs | 17 + .../SampleSln/Bom/Properties/AssemblyInfo.cs | 36 + .../OpenCover.4.6.519/SampleSln/BomSample.sln | 31 + .../SampleSln/BomTest/BomManagerTests.cs | 39 + .../SampleSln/BomTest/BomTest.csproj | 65 + .../BomTest/Properties/AssemblyInfo.cs | 36 + .../SampleSln/BomTest/packages.config | 4 + .../OpenCover.4.6.519/SampleSln/coverage.bat | 5 + .../OpenCover.4.6.519/docs/ReleaseNotes.txt | 137 ++ .../OpenCover.4.6.519/docs/Usage.rtf | 1138 +++++++++++++++++ .../CodeCoverage/OpenCover.4.6.519/readme.txt | 21 + .../tools/Autofac.Configuration.dll | Bin 0 -> 40448 bytes .../OpenCover.4.6.519/tools/Autofac.dll | Bin 0 -> 203264 bytes .../tools/CrashReporter.NET.dll | Bin 0 -> 109056 bytes .../tools/Gendarme.Framework.dll | Bin 0 -> 84992 bytes .../tools/Gendarme.Rules.Maintainability.dll | Bin 0 -> 36352 bytes .../tools/Mono.Cecil.Mdb.dll | Bin 0 -> 45056 bytes .../tools/Mono.Cecil.Pdb.dll | Bin 0 -> 81920 bytes .../OpenCover.4.6.519/tools/Mono.Cecil.dll | Bin 0 -> 280576 bytes .../tools/OpenCover.Console.exe | Bin 0 -> 80384 bytes .../tools/OpenCover.Console.exe.config | 26 + .../tools/OpenCover.Extensions.dll | Bin 0 -> 11264 bytes .../tools/OpenCover.Framework.dll | Bin 0 -> 151040 bytes .../OpenCover.4.6.519/tools/log4net.config | 39 + .../OpenCover.4.6.519/tools/log4net.dll | Bin 0 -> 301056 bytes .../transform/simple_report.xslt | 332 +++++ .../OpenCover.4.6.519/transform/transform.ps1 | 17 + tests/CodeCoverage/packages.config | 4 + .../SixLabors.Primitives.Tests/PointFTests.cs | 192 +++ .../SixLabors.Primitives.Tests/PointTests.cs | 252 ++++ .../RationalTests.cs | 115 ++ .../RectangleFTests.cs | 267 ++++ .../RectangleTests.cs | 308 +++++ .../SignedRationalTests.cs | 122 ++ .../SixLabors.Primitives.Tests.csproj | 34 + .../SixLabors.Primitives.Tests/SizeFTests.cs | 163 +++ tests/SixLabors.Primitives.Tests/SizeTests.cs | 195 +++ 68 files changed, 7494 insertions(+) create mode 100644 .editorconfig create mode 100644 SixLabors.Primitives.ruleset create mode 100644 SixLabors.Primitives.sln create mode 100644 SixLabors.Primitives.sln.DotSettings create mode 100644 appveyor.yml create mode 100644 build.cmd create mode 100644 codecov.yml create mode 100644 gitversion.yml create mode 100644 src/Shared/AssemblyInfo.Common.cs create mode 100644 src/Shared/stylecop.json create mode 100644 src/SixLabors.Primitives/Constants.cs create mode 100644 src/SixLabors.Primitives/Ellipse.cs create mode 100644 src/SixLabors.Primitives/LongRational.cs create mode 100644 src/SixLabors.Primitives/MathF.cs create mode 100644 src/SixLabors.Primitives/Matrix.cs create mode 100644 src/SixLabors.Primitives/Point.cs create mode 100644 src/SixLabors.Primitives/PointF.cs create mode 100644 src/SixLabors.Primitives/Rational.cs create mode 100644 src/SixLabors.Primitives/Rectangle.cs create mode 100644 src/SixLabors.Primitives/RectangleF.cs create mode 100644 src/SixLabors.Primitives/SignedRational.cs create mode 100644 src/SixLabors.Primitives/SixLabors.Primitives.csproj create mode 100644 src/SixLabors.Primitives/Size.cs create mode 100644 src/SixLabors.Primitives/SizeF.cs create mode 100644 src/SixLabors.Primitives/stylecop.json create mode 100644 tests/CodeCoverage/CodeCoverage.cmd create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/License.rtf create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/readme.txt create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Framework.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Rules.Maintainability.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Mdb.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Pdb.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe.config create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 create mode 100644 tests/CodeCoverage/packages.config create mode 100644 tests/SixLabors.Primitives.Tests/PointFTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/PointTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/RationalTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/RectangleFTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/RectangleTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/SignedRationalTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj create mode 100644 tests/SixLabors.Primitives.Tests/SizeFTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/SizeTests.cs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..f39b26725 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,3 @@ +[*.cs] +indent_style = space +indent_size = 4 diff --git a/SixLabors.Primitives.ruleset b/SixLabors.Primitives.ruleset new file mode 100644 index 000000000..4106b892c --- /dev/null +++ b/SixLabors.Primitives.ruleset @@ -0,0 +1,6 @@ + + + + + + diff --git a/SixLabors.Primitives.sln b/SixLabors.Primitives.sln new file mode 100644 index 000000000..1d728f98c --- /dev/null +++ b/SixLabors.Primitives.sln @@ -0,0 +1,71 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.6 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + appveyor.yml = appveyor.yml + build.cmd = build.cmd + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C0625-CD3D-440F-9F80-2D83856AB7AE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A07-F879-4811-9C41-5CBDC6BAFDB7}" + ProjectSection(SolutionItems) = preProject + src\Shared\AssemblyInfo.Common.cs = src\Shared\AssemblyInfo.Common.cs + src\Shared\stylecop.json = src\Shared\stylecop.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives", "src\SixLabors.Primitives\SixLabors.Primitives.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives.Tests", "tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.Build.0 = Release|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.Build.0 = Release|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.Build.0 = Debug|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.ActiveCfg = Release|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.Build.0 = Release|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.Build.0 = Release|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9E574A07-F879-4811-9C41-5CBDC6BAFDB7} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {999EDFB3-9FE4-4E09-B669-CB02E597EC20} = {9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D} + {87E262FA-57FE-4AA7-853C-9DD91E769D4B} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {32D7A12E-B392-42CE-8EFB-1B685680F5B8} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + EndGlobalSection + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection +EndGlobal diff --git a/SixLabors.Primitives.sln.DotSettings b/SixLabors.Primitives.sln.DotSettings new file mode 100644 index 000000000..613ba3882 --- /dev/null +++ b/SixLabors.Primitives.sln.DotSettings @@ -0,0 +1,5 @@ + + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..e534e5855 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,31 @@ +version: 0.0.{build} +image: Visual Studio 2017 + +install: + - choco install gitversion.portable -pre -y + +before_build: + - cmd: dotnet --version + - ps: gitversion /l console /output buildserver + +build_script: + - cmd: build.cmd + - cmd: tests\CodeCoverage\CodeCoverage.cmd + +after_build: + - cmd: appveyor PushArtifact "artifacts\SixLabors.Primitives.%GitVersion_NuGetVersion%.nupkg" + +deploy: + - provider: NuGet + server: https://www.myget.org/F/sixlabors/api/v2/package + symbol_server: https://www.myget.org/F/sixlabors/symbols/api/v2/package + api_key: + secure: SyrSERGrjkK21TSCsHtqke5279SMxXCg2NXKjR2qaErP0khEplwxPwE8Ch5bxzyf + artifact: /.*\.nupkg/ + on: + branch: master + +# prevent the double build when a branch has an active PR +skip_branch_with_pr: true + +test: off diff --git a/build.cmd b/build.cmd new file mode 100644 index 000000000..727bdf880 --- /dev/null +++ b/build.cmd @@ -0,0 +1,38 @@ +@echo Off + +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet restore /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet restore +) + +ECHO Building nuget packages +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet build -c Release /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet build -c Release +) +if not "%errorlevel%"=="0" goto failure + +dotnet test ./tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj + + +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build +) + +if not "%errorlevel%"=="0" goto failure + +:success +ECHO successfully built project +REM exit 0 +goto end + +:failure +ECHO failed to build. +REM exit -1 +goto end + +:end \ No newline at end of file diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 000000000..cadf5c5da --- /dev/null +++ b/codecov.yml @@ -0,0 +1,21 @@ +codecov: + notify: + require_ci_to_pass: true +comment: off +coverage: + precision: 2 + range: + - 70.0 + - 100.0 + round: down + status: + changes: false + patch: true + project: true +parsers: + gcov: + branch_detection: + conditional: true + loop: true + macro: false + method: false \ No newline at end of file diff --git a/gitversion.yml b/gitversion.yml new file mode 100644 index 000000000..e07c90f0d --- /dev/null +++ b/gitversion.yml @@ -0,0 +1,13 @@ +# to create a new package you create a new release/tag +# in github appveyor will build it without the -cixxx tag +# it will then be deployable cleanly to nuget.org + +branches: + master: + tag: ci + mode: ContinuousDeployment + increment: Minor + prevent-increment-of-merged-branch-version: false + track-merge-target: true +ignore: + sha: [] \ No newline at end of file diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/Shared/AssemblyInfo.Common.cs new file mode 100644 index 000000000..081b01994 --- /dev/null +++ b/src/Shared/AssemblyInfo.Common.cs @@ -0,0 +1,38 @@ +// +// Copyright (c) Scott Williams and contributors. +// Licensed under the Apache License, Version 2.0. +// + +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyDescription("A cross-platform library for processing of image files; written in C#")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Scott Williams")] +[assembly: AssemblyProduct("SixLabors.Shapes")] +[assembly: AssemblyCopyright("Copyright (c) Scott Williams and contributors.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyInformationalVersion("1.0.0.0")] + +// Ensure the internals can be tested. +[assembly: InternalsVisibleTo("SixLabors.Shapes.Tests")] +[assembly: InternalsVisibleTo("SixLabors.Shapes.Benchmarks")] diff --git a/src/Shared/stylecop.json b/src/Shared/stylecop.json new file mode 100644 index 000000000..df3c8c9d8 --- /dev/null +++ b/src/Shared/stylecop.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "documentationRules": { + "companyName": "Scott Williams", + "copyrightText": "Copyright (c) Scott Williams and contributors.\nLicensed under the Apache License, Version 2.0." + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Constants.cs b/src/SixLabors.Primitives/Constants.cs new file mode 100644 index 000000000..44f68f898 --- /dev/null +++ b/src/SixLabors.Primitives/Constants.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + /// + /// Common constants used throughout the project + /// + internal static class Constants + { + /// + /// The epsilon for comparing floating point numbers. + /// + public static readonly float Epsilon = 0.001f; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Ellipse.cs b/src/SixLabors.Primitives/Ellipse.cs new file mode 100644 index 000000000..d5611bb23 --- /dev/null +++ b/src/SixLabors.Primitives/Ellipse.cs @@ -0,0 +1,183 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + + /// + /// Represents an ellipse. + /// + public struct Ellipse : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly Ellipse Empty = default(Ellipse); + + /// + /// The center point. + /// + private Point center; + + /// + /// Initializes a new instance of the struct. + /// + /// The center point. + /// The x-radius. + /// The y-radius. + public Ellipse(Point center, float radiusX, float radiusY) + { + this.center = center; + this.RadiusX = radiusX; + this.RadiusY = radiusY; + } + + /// + /// Gets the x-radius of this . + /// + public float RadiusX { get; } + + /// + /// Gets the y-radius of this . + /// + public float RadiusY { get; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + public static bool operator ==(Ellipse left, Ellipse right) + { + return left.Equals(right); + } + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + public static bool operator !=(Ellipse left, Ellipse right) + { + return !left.Equals(right); + } + + /// + /// Returns the center point of the given + /// + /// The ellipse + /// + public static Vector2 Center(Ellipse ellipse) + { + return new Vector2(ellipse.center.X, ellipse.center.Y); + } + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + public bool Contains(int x, int y) + { + if (this.RadiusX <= 0 || this.RadiusY <= 0) + { + return false; + } + + // TODO: SIMD? + // This is a more general form of the circle equation + // X^2/a^2 + Y^2/b^2 <= 1 + Point normalized = new Point(x - this.center.X, y - this.center.Y); + int nX = normalized.X; + int nY = normalized.Y; + + return ((double)(nX * nX) / (this.RadiusX * this.RadiusX)) + + ((double)(nY * nY) / (this.RadiusY * this.RadiusY)) + <= 1.0; + } + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Ellipse [ Empty ]"; + } + + return + $"Ellipse [ RadiusX={this.RadiusX}, RadiusY={this.RadiusX}, Centre={this.center.X},{this.center.Y} ]"; + } + + /// + public override bool Equals(object obj) + { + if (obj is Ellipse) + { + return this.Equals((Ellipse)obj); + } + + return false; + } + + /// + public bool Equals(Ellipse other) + { + return this.center.Equals(other.center) + && this.RadiusX.Equals(other.RadiusX) + && this.RadiusY.Equals(other.RadiusY); + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(Ellipse ellipse) + { + unchecked + { + int hashCode = ellipse.center.GetHashCode(); + hashCode = (hashCode * 397) ^ ellipse.RadiusX.GetHashCode(); + hashCode = (hashCode * 397) ^ ellipse.RadiusY.GetHashCode(); + return hashCode; + } + } + } +} diff --git a/src/SixLabors.Primitives/LongRational.cs b/src/SixLabors.Primitives/LongRational.cs new file mode 100644 index 000000000..d33484338 --- /dev/null +++ b/src/SixLabors.Primitives/LongRational.cs @@ -0,0 +1,355 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + using System.Text; + + /// + /// Represents a number that can be expressed as a fraction + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + internal struct LongRational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// + /// The number above the line in a vulgar fraction showing how many of the parts + /// indicated by the denominator are taken. + /// + /// + /// The number below the line in a vulgar fraction; a divisor. + /// + public LongRational(long numerator, long denominator) + : this(numerator, denominator, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The number above the line in a vulgar fraction showing how many of the parts + /// indicated by the denominator are taken. + /// + /// + /// The number below the line in a vulgar fraction; a divisor. + /// + /// + /// Whether to attempt to simplify the fractional parts. + /// + public LongRational(long numerator, long denominator, bool simplify) + : this() + { + this.Numerator = numerator; + this.Denominator = denominator; + + if (simplify) + { + this.Simplify(); + } + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public LongRational(double value, bool bestPrecision) + : this() + { + if (double.IsNaN(value)) + { + this.Numerator = this.Denominator = 0; + return; + } + + if (double.IsPositiveInfinity(value)) + { + this.Numerator = 1; + this.Denominator = 0; + return; + } + + if (double.IsNegativeInfinity(value)) + { + this.Numerator = -1; + this.Denominator = 0; + return; + } + + this.Numerator = 1; + this.Denominator = 1; + + double val = Math.Abs(value); + double df = this.Numerator / (double)this.Denominator; + double epsilon = bestPrecision ? double.Epsilon : .000001; + + while (Math.Abs(df - val) > epsilon) + { + if (df < val) + { + this.Numerator++; + } + else + { + this.Denominator++; + this.Numerator = (int)(val * this.Denominator); + } + + df = this.Numerator / (double)this.Denominator; + } + + if (value < 0.0) + { + this.Numerator *= -1; + } + + this.Simplify(); + } + + /// + /// Gets the numerator of a number. + /// + public long Numerator + { + get; + private set; + } + + /// + /// Gets the denominator of a number. + /// + public long Denominator + { + get; + private set; + } + + /// + /// Gets a value indicating whether this instance is indeterminate. + /// + public bool IsIndeterminate + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == 0; + } + } + + /// + /// Gets a value indicating whether this instance is an integer (n, 1) + /// + public bool IsInteger => this.Denominator == 1; + + /// + /// Gets a value indicating whether this instance is equal to negative infinity (-1, 0) + /// + public bool IsNegativeInfinity + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == -1; + } + } + + /// + /// Gets a value indicating whether this instance is equal to positive infinity (1, 0) + /// + public bool IsPositiveInfinity + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == 1; + } + } + + /// + /// Gets a value indicating whether this instance is equal to 0 (0, 1) + /// + public bool IsZero + { + get + { + if (this.Denominator != 1) + { + return false; + } + + return this.Numerator == 0; + } + } + + /// + public bool Equals(LongRational other) + { + if (this.Denominator == other.Denominator) + { + return this.Numerator == other.Numerator; + } + + if (this.Numerator == 0 && this.Denominator == 0) + { + return other.Numerator == 0 && other.Denominator == 0; + } + + if (other.Numerator == 0 && other.Denominator == 0) + { + return this.Numerator == 0 && this.Denominator == 0; + } + + return (this.Numerator * other.Denominator) == (this.Denominator * other.Numerator); + } + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + if (this.IsIndeterminate) + { + return "[ Indeterminate ]"; + } + + if (this.IsPositiveInfinity) + { + return "[ PositiveInfinity ]"; + } + + if (this.IsNegativeInfinity) + { + return "[ NegativeInfinity ]"; + } + + if (this.IsZero) + { + return "0"; + } + + if (this.IsInteger) + { + return this.Numerator.ToString(provider); + } + + StringBuilder sb = new StringBuilder(); + sb.Append(this.Numerator.ToString(provider)); + sb.Append("/"); + sb.Append(this.Denominator.ToString(provider)); + return sb.ToString(); + } + + /// + /// Finds the greatest common divisor of two values. + /// + /// The first value + /// The second value + /// The + private static long GreatestCommonDivisor(long left, long right) + { + return right == 0 ? left : GreatestCommonDivisor(right, left % right); + } + + /// + /// Simplifies the + /// + private void Simplify() + { + if (this.IsIndeterminate) + { + return; + } + + if (this.IsNegativeInfinity) + { + return; + } + + if (this.IsPositiveInfinity) + { + return; + } + + if (this.IsInteger) + { + return; + } + + if (this.IsZero) + { + return; + } + + if (this.Numerator == 0) + { + this.Denominator = 0; + return; + } + + if (this.Numerator == this.Denominator) + { + this.Numerator = 1; + this.Denominator = 1; + } + + long gcd = GreatestCommonDivisor(Math.Abs(this.Numerator), Math.Abs(this.Denominator)); + if (gcd > 1) + { + this.Numerator = this.Numerator / gcd; + this.Denominator = this.Denominator / gcd; + } + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(LongRational rational) + { + return ((rational.Numerator * 397) ^ rational.Denominator).GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/MathF.cs b/src/SixLabors.Primitives/MathF.cs new file mode 100644 index 000000000..a15b7fb20 --- /dev/null +++ b/src/SixLabors.Primitives/MathF.cs @@ -0,0 +1,293 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Runtime.CompilerServices; + + /// + /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. + /// + // ReSharper disable InconsistentNaming + internal static class MathF + { + /// + /// Represents the ratio of the circumference of a circle to its diameter, specified by the constant, π. + /// + public const float PI = (float)Math.PI; + + /// + /// Returns the absolute value of a single-precision floating-point number. + /// + /// + /// A number that is greater than or equal to , but less than or equal to . + /// + /// + /// A single-precision floating-point number, x, such that 0 ≤ x ≤. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Abs(float f) + { + return Math.Abs(f); + } + + /// + /// Returns the angle whose tangent is the quotient of two specified numbers. + /// + /// The y coordinate of a point. + /// The x coordinate of a point. + /// + /// An angle, θ, measured in radians, such that -π≤θ≤π, and tan(θ) = y / x, where + /// (x, y) is a point in the Cartesian plane. Observe the following: For (x, y) in + /// quadrant 1, 0 < θ < π/2.For (x, y) in quadrant 2, π/2 < θ≤π.For (x, y) in quadrant + /// 3, -π < θ < -π/2.For (x, y) in quadrant 4, -π/2 < θ < 0.For points on the boundaries + /// of the quadrants, the return value is the following:If y is 0 and x is not negative, + /// θ = 0.If y is 0 and x is negative, θ = π.If y is positive and x is 0, θ = π/2.If + /// y is negative and x is 0, θ = -π/2.If y is 0 and x is 0, θ = 0. If x or y is + /// , or if x and y are either or + /// , the method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Atan2(float y, float x) + { + return (float)Math.Atan2(y, x); + } + + /// + /// Returns the smallest integral value that is greater than or equal to the specified single-precision floating-point number. + /// + /// A single-precision floating-point number. + /// + /// The smallest integral value that is greater than or equal to . + /// If is equal to , , + /// or , that value is returned. + /// Note that this method returns a instead of an integral type. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Ceiling(float f) + { + return (float)Math.Ceiling(f); + } + + /// + /// Returns the cosine of the specified angle. + /// + /// An angle, measured in radians. + /// + /// The cosine of . If is equal to , , + /// or , this method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Cos(float f) + { + return (float)Math.Cos(f); + } + + /// + /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + /// + /// The angle in degrees. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float DegreeToRadian(float degree) + { + return degree * (PI / 180F); + } + + /// + /// Returns e raised to the specified power. + /// + /// A number specifying a power. + /// + /// The number e raised to the power . + /// If equals or , that value is returned. + /// If equals , 0 is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Exp(float f) + { + return (float)Math.Exp(f); + } + + /// + /// Returns the largest integer less than or equal to the specified single-precision floating-point number. + /// + /// A single-precision floating-point number. + /// + /// The largest integer less than or equal to . + /// If is equal to , , + /// or , that value is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Floor(float f) + { + return (float)Math.Floor(f); + } + + /// + /// Returns the larger of two single-precision floating-point numbers. + /// + /// The first of two single-precision floating-point numbers to compare. + /// The second of two single-precision floating-point numbers to compare. + /// + /// Parameter or , whichever is larger. + /// If , or , or both and are + /// equal to , is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Max(float val1, float val2) + { + return Math.Max(val1, val2); + } + + /// + /// Returns the smaller of two single-precision floating-point numbers. + /// + /// The first of two single-precision floating-point numbers to compare. + /// The second of two single-precision floating-point numbers to compare. + /// + /// Parameter or , whichever is smaller. + /// If , , or both and are equal + /// to , is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Min(float val1, float val2) + { + return Math.Min(val1, val2); + } + + /// + /// Returns a specified number raised to the specified power. + /// + /// A single-precision floating-point number to be raised to a power. + /// A single-precision floating-point number that specifies a power. + /// The number raised to the power . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Pow(float x, float y) + { + return (float)Math.Pow(x, y); + } + + /// + /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + /// + /// The angle in radians. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float RadianToDegree(float radian) + { + return radian / (PI / 180F); + } + + /// + /// Rounds a single-precision floating-point value to the nearest integral value. + /// + /// A single-precision floating-point number to be rounded. + /// + /// The integer nearest . + /// If the fractional component of is halfway between two integers, one of which is even and the other odd, then the even number is returned. + /// Note that this method returns a instead of an integral type. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Round(float f) + { + return (float)Math.Round(f); + } + + /// + /// Rounds a single-precision floating-point value to the nearest integer. + /// A parameter specifies how to round the value if it is midway between two numbers. + /// + /// A single-precision floating-point number to be rounded. + /// Specification for how to round if it is midway between two other numbers. + /// + /// The integer nearest . If is halfway between two integers, one of which is even + /// and the other odd, then determines which of the two is returned. + /// Note that this method returns a instead of an integral type. + /// + /// + /// is not a valid value of . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Round(float f, MidpointRounding mode) + { + return (float)Math.Round(f, mode); + } + + /// + /// Returns the sine of the specified angle. + /// + /// An angle, measured in radians. + /// + /// The sine of . + /// If is equal to , , + /// or , this method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Sin(float f) + { + return (float)Math.Sin(f); + } + + /// + /// Returns the result of a normalized sine cardinal function for the given value. + /// SinC(x) = sin(pi*x)/(pi*x). + /// + /// A single-precision floating-point number to calculate the result for. + /// + /// The sine cardinal of . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float SinC(float f) + { + if (Abs(f) > Constants.Epsilon) + { + f *= PI; + return Clean(Sin(f) / f); + } + + return 1F; + } + + /// + /// Returns the square root of a specified number. + /// + /// The number whose square root is to be found. + /// + /// One of the values in the following table. + /// parameter Return value Zero or positive The positive square root of . + /// Negative Equals + /// Equals + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Sqrt(float f) + { + return (float)Math.Sqrt(f); + } + + /// + /// Ensures that any passed float is correctly rounded to zero + /// + /// The value to clean. + /// + /// The + /// . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static float Clean(float x) + { + if (Abs(x) < Constants.Epsilon) + { + return 0F; + } + + return x; + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Matrix.cs b/src/SixLabors.Primitives/Matrix.cs new file mode 100644 index 000000000..6da436cfb --- /dev/null +++ b/src/SixLabors.Primitives/Matrix.cs @@ -0,0 +1,360 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// A Matrix object for applying matrix transforms to primitives. + /// + public struct Matrix : IEquatable + { + private Matrix3x2 backingMatrix; + + private static readonly Matrix _identity = new Matrix + { + backingMatrix = Matrix3x2.Identity + }; + + /// + /// Returns the multiplicative identity matrix. + /// + public static Matrix Identity => _identity; + + /// + /// Returns whether the matrix is the identity matrix. + /// + public bool IsIdentity => this.backingMatrix.IsIdentity; + + /// + /// Gets or sets the translation component of this matrix. + /// + public Vector2 Translation => this.backingMatrix.Translation; + + /// + /// Constructs a Matrix3x2 from the given components. + /// + public Matrix(float m11, float m12, + float m21, float m22, + float m31, float m32) + { + this.backingMatrix = new Matrix3x2(m11, m12, m21, m22, m31, m32); + } + + /// + /// Creates a translation matrix from the given vector. + /// + /// The translation position. + /// A translation matrix. + public static Matrix CreateTranslation(PointF position) => Matrix3x2.CreateTranslation(position); + + /// + /// Creates a translation matrix from the given X and Y components. + /// + /// The X position. + /// The Y position. + /// A translation matrix. + public static Matrix CreateTranslation(float xPosition, float yPosition) => Matrix3x2.CreateTranslation(xPosition, yPosition); + + /// + /// Creates a scale matrix from the given X and Y components. + /// + /// Value to scale by on the X-axis. + /// Value to scale by on the Y-axis. + /// A scaling matrix. + public static Matrix CreateScale(float xScale, float yScale) => Matrix3x2.CreateScale(xScale, yScale); + + /// + /// Creates a scale matrix that is offset by a given center point. + /// + /// Value to scale by on the X-axis. + /// Value to scale by on the Y-axis. + /// The center point. + /// A scaling matrix. + public static Matrix CreateScale(float xScale, float yScale, PointF centerPoint) => Matrix3x2.CreateScale(xScale, yScale, centerPoint); + + /// + /// Creates a scale matrix from the given vector scale. + /// + /// The scale to use. + /// A scaling matrix. + public static Matrix CreateScale(SizeF scales) => Matrix3x2.CreateScale(scales); + + /// + /// Creates a scale matrix from the given vector scale with an offset from the given center point. + /// + /// The scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix CreateScale(SizeF scales, PointF centerPoint) => Matrix3x2.CreateScale(scales, centerPoint); + + /// + /// Creates a scale matrix that scales uniformly with the given scale. + /// + /// The uniform scale to use. + /// A scaling matrix. + public static Matrix CreateScale(float scale) => Matrix3x2.CreateScale(scale); + + /// + /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. + /// + /// The uniform scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians. + /// + /// The X angle, in radians. + /// The Y angle, in radians. + /// A skew matrix. + public static Matrix CreateSkew(float radiansX, float radiansY) => Matrix3x2.CreateSkew(radiansX, radiansY); + + /// + /// Creates a skew matrix from the given angles in radians. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// A skew matrix. + public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY)); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in radians. + /// The Y angle, in radians. + /// The center point. + /// A skew matrix. + public static Matrix CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// The center point. + /// A skew matrix. + public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY), centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians. + /// + /// The amount of rotation, in radians. + /// A rotation matrix. + public static Matrix CreateRotation(float radians) => System.Numerics.Matrix3x2.CreateRotation(radians); + + /// + /// Creates a rotation matrix using the given rotation in radians. + /// + /// The amount of rotation, in degrees. + /// A rotation matrix. + public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees)); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in radians. + /// The center point. + /// A rotation matrix. + public static Matrix CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in degrees. + /// The center point. + /// A rotation matrix. + public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees), centerPoint); + + /// + /// Calculates the determinant for this matrix. + /// The determinant is calculated by expanding the matrix with a third column whose values are (0,0,1). + /// + /// The determinant. + public float GetDeterminant() => this.backingMatrix.GetDeterminant(); + + /// + /// Attempts to invert the given matrix. If the operation succeeds, the inverted matrix is stored in the result parameter. + /// + /// The source matrix. + /// The output matrix. + /// True if the operation succeeded, False otherwise. + public static bool Invert(Matrix matrix, out Matrix result) + { + Matrix3x2 m; + var b = System.Numerics.Matrix3x2.Invert(matrix.backingMatrix, out m); + result = m; + return b; + } + + /// + /// Linearly interpolates from matrix1 to matrix2, based on the third parameter. + /// + /// The first source matrix. + /// The second source matrix. + /// The relative weighting of matrix2. + /// The interpolated matrix. + public static Matrix Lerp(Matrix matrix1, Matrix matrix2, float amount) => Matrix3x2.Lerp(matrix1.backingMatrix, matrix2.backingMatrix, amount); + + /// + /// Negates the given matrix by multiplying all values by -1. + /// + /// The source matrix. + /// The negated matrix. + public static Matrix Negate(Matrix value) => -value.backingMatrix; + + /// + /// Adds each matrix element in value1 with its corresponding element in value2. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the summed values. + public static Matrix Add(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; + + /// + /// Subtracts each matrix element in value2 from its corresponding element in value1. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the resulting values. + public static Matrix Subtract(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; + + /// + /// Multiplies two matrices together and returns the resulting matrix. + /// + /// The first source matrix. + /// The second source matrix. + /// The product matrix. + public static Matrix Multiply(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; + + /// + /// Scales all elements in a matrix by the given scalar factor. + /// + /// The source matrix. + /// The scaling value to use. + /// The resulting matrix. + public static Matrix Multiply(Matrix value1, float value2) => value1.backingMatrix * value2; + + /// + /// Negates the given matrix by multiplying all values by -1. + /// + /// The source matrix. + /// The negated matrix. + public static Matrix operator -(Matrix value) => -value.backingMatrix; + + /// + /// Adds each matrix element in value1 with its corresponding element in value2. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the summed values. + public static Matrix operator +(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; + + /// + /// Subtracts each matrix element in value2 from its corresponding element in value1. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the resulting values. + public static Matrix operator -(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; + + /// + /// Multiplies two matrices together and returns the resulting matrix. + /// + /// The first source matrix. + /// The second source matrix. + /// The product matrix. + public static Matrix operator *(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; + + /// + /// Scales all elements in a matrix by the given scalar factor. + /// + /// The source matrix. + /// The scaling value to use. + /// The resulting matrix. + public static Matrix operator *(Matrix value1, float value2) => value1.backingMatrix * value2; + + /// + /// Returns a boolean indicating whether the given matrices are equal. + /// + /// The first source matrix. + /// The second source matrix. + /// True if the matrices are equal; False otherwise. + public static bool operator ==(Matrix value1, Matrix value2) => value1.backingMatrix == value2.backingMatrix; + + /// + /// Returns a boolean indicating whether the given matrices are not equal. + /// + /// The first source matrix. + /// The second source matrix. + /// True if the matrices are not equal; False if they are equal. + public static bool operator !=(Matrix value1, Matrix value2) + { + return value1.backingMatrix != value2.backingMatrix; + + } + + /// + /// Returns a boolean indicating whether the matrix is equal to the other given matrix. + /// + /// The other matrix to test equality against. + /// True if this matrix is equal to other; False otherwise. + public bool Equals(Matrix other) + { + return this.backingMatrix == other.backingMatrix; + } + + /// + /// Returns a boolean indicating whether the given Object is equal to this matrix instance. + /// + /// The Object to compare against. + /// True if the Object is equal to this matrix; False otherwise. + public override bool Equals(object obj) + { + if (obj is Matrix) + { + return Equals((Matrix)obj); + } + + return false; + } + + /// + /// Returns a String representing this matrix instance. + /// + /// The string representation. + public override string ToString() => this.backingMatrix.ToString(); + + /// + /// Returns the hash code for this instance. + /// + /// The hash code. + public override int GetHashCode() => this.backingMatrix.GetHashCode(); + + /// + /// Creates a with the values of the specified . + /// + /// The matrix. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Matrix3x2(Matrix matrix) => matrix.backingMatrix; + + /// + /// Creates a with the values of the specified . + /// + /// The matrix. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Matrix(Matrix3x2 matrix) => new Matrix { backingMatrix = matrix }; + } +} diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Primitives/Point.cs new file mode 100644 index 000000000..243cb8eb3 --- /dev/null +++ b/src/SixLabors.Primitives/Point.cs @@ -0,0 +1,257 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Represents an ordered pair of integer x- and y-coordinates that defines a point in + /// a two-dimensional plane. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Point : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly Point Empty = default(Point); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal and vertical position of the point. + public Point(int value) + : this() + { + this.X = LowInt16(value); + this.Y = HighInt16(value); + } + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the point. + /// The vertical position of the point. + public Point(int x, int y) + : this() + { + this.X = x; + this.Y = y; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The size + public Point(Size size) + { + this.X = size.Width; + this.Y = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public int X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public int Y { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator PointF(Point point) => new PointF(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(Point point) => new Vector2(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Size(Point point) => new Size(point.X, point.Y); + + /// + /// Translates a by a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point operator +(Point point, Size size) => Add(point, size); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point operator -(Point point, Size size) => Subtract(point, size); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Point left, Point right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Point left, Point right) => !left.Equals(right); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Add(Point point, Size size) => new Point(unchecked(point.X + size.Width), unchecked(point.Y + size.Height)); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Subtract(Point point, Size size) => new Point(unchecked(point.X - size.Width), unchecked(point.Y - size.Height)); + + /// + /// Converts a to a by performing a ceiling operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Ceiling(PointF point) => new Point(unchecked((int)MathF.Ceiling(point.X)), unchecked((int)MathF.Ceiling(point.Y))); + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); + + /// + /// Converts a to a by performing a truncate operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Truncate(PointF point) => new Point(unchecked((int)point.X), unchecked((int)point.Y)); + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The vector + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); + + /// + /// Rotates a point around the given rotation matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + + /// + /// Skews a point using the given skew matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + + /// + /// Translates this by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(int dx, int dy) + { + unchecked + { + this.X += dx; + this.Y += dy; + } + } + + /// + /// Translates this by the specified amount. + /// + /// The used offset this . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(Point point) => this.Offset(point.X, point.Y); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Point [ Empty ]"; + } + + return $"Point [ X={this.X}, Y={this.Y} ]"; + } + + /// + public override bool Equals(object obj) => obj is Point && this.Equals((Point)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Point other) => this.X == other.X && this.Y == other.Y; + + private static short HighInt16(int n) => unchecked((short)((n >> 16) & 0xffff)); + + private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); + + private int GetHashCode(Point point) => point.X ^ point.Y; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Primitives/PointF.cs new file mode 100644 index 000000000..a49a1996b --- /dev/null +++ b/src/SixLabors.Primitives/PointF.cs @@ -0,0 +1,233 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Represents an ordered pair of single precision floating point x- and y-coordinates that defines a point in + /// a two-dimensional plane. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct PointF : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly PointF Empty = default(PointF); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the point. + /// The vertical position of the point. + public PointF(float x, float y) + : this() + { + this.X = x; + this.Y = y; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The size + public PointF(SizeF size) + { + this.X = size.Width; + this.Y = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public float X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public float Y { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The vector. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator PointF(Vector2 vector) => new PointF(vector.X, vector.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(PointF point) => new Vector2(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified by truncating each of the coordinates. + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Point(PointF point) => Point.Truncate(point); + + /// + /// Translates a by a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator +(PointF point, SizeF size) => Add(point, size); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator -(PointF point, SizeF size) => Subtract(point, size); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(PointF left, PointF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(PointF left, PointF right) => !left.Equals(right); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Add(PointF point, SizeF size) => new PointF(point.X + size.Width, point.Y + size.Height); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Subtract(PointF point, SizeF size) => new PointF(point.X - size.Width, point.Y - size.Height); + + /// + /// Rotates a point around the given rotation matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Rotate(PointF point, Matrix rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); + + /// + /// Skews a point using the given skew matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Skew(PointF point, Matrix skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); + + /// + /// Translates this by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(float dx, float dy) + { + this.X += dx; + this.Y += dy; + } + + /// + /// Translates this by the specified amount. + /// + /// The used offset this . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(PointF point) => this.Offset(point.X, point.Y); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "PointF [ Empty ]"; + } + + return $"PointF [ X={this.X}, Y={this.Y} ]"; + } + + /// + public override bool Equals(object obj) => obj is PointF && this.Equals((PointF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(PointF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y); + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(PointF point) => point.X.GetHashCode() ^ point.Y.GetHashCode(); + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rational.cs b/src/SixLabors.Primitives/Rational.cs new file mode 100644 index 000000000..3d7003b4e --- /dev/null +++ b/src/SixLabors.Primitives/Rational.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + + /// + /// Represents a number that can be expressed as a fraction. + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + public struct Rational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// The to create the rational from. + public Rational(uint value) + : this(value, 1) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + public Rational(uint numerator, uint denominator) + : this(numerator, denominator, true) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + /// Specified if the rational should be simplified. + public Rational(uint numerator, uint denominator, bool simplify) + { + LongRational rational = new LongRational(numerator, denominator, simplify); + + this.Numerator = (uint)rational.Numerator; + this.Denominator = (uint)rational.Denominator; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + public Rational(double value) + : this(value, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public Rational(double value, bool bestPrecision) + { + LongRational rational = new LongRational(Math.Abs(value), bestPrecision); + + this.Numerator = (uint)rational.Numerator; + this.Denominator = (uint)rational.Denominator; + } + + /// + /// Gets the numerator of a number. + /// + public uint Numerator { get; } + + /// + /// Gets the denominator of a number. + /// + public uint Denominator { get; } + + /// + /// Determines whether the specified instances are considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator ==(Rational left, Rational right) + { + return Rational.Equals(left, right); + } + + /// + /// Determines whether the specified instances are not considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator !=(Rational left, Rational right) + { + return !Rational.Equals(left, right); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// + /// The . + /// + public static Rational FromDouble(double value) + { + return new Rational(value, false); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// Whether to use the best possible precision when parsing the value. + /// + /// The . + /// + public static Rational FromDouble(double value, bool bestPrecision) + { + return new Rational(value, bestPrecision); + } + + /// + public override bool Equals(object obj) + { + if (obj is Rational) + { + return this.Equals((Rational)obj); + } + + return false; + } + + /// + public bool Equals(Rational other) + { + LongRational left = new LongRational(this.Numerator, this.Denominator); + LongRational right = new LongRational(other.Numerator, other.Denominator); + + return left.Equals(right); + } + + /// + public override int GetHashCode() + { + LongRational self = new LongRational(this.Numerator, this.Denominator); + return self.GetHashCode(); + } + + /// + /// Converts a rational number to the nearest . + /// + /// + /// The . + /// + public double ToDouble() + { + return this.Numerator / (double)this.Denominator; + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + LongRational rational = new LongRational(this.Numerator, this.Denominator); + return rational.ToString(provider); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Primitives/Rectangle.cs new file mode 100644 index 000000000..9c9a0599e --- /dev/null +++ b/src/SixLabors.Primitives/Rectangle.cs @@ -0,0 +1,467 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores a set of four integers that represent the location and size of a rectangle. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Rectangle : IEquatable + { + /// + /// Represents a that has X, Y, Width, and Height values set to zero. + /// + public static readonly Rectangle Empty = default(Rectangle); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the rectangle. + /// The vertical position of the rectangle. + /// The width of the rectangle. + /// The height of the rectangle. + public Rectangle(int x, int y, int width, int height) + { + this.X = x; + this.Y = y; + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The which specifies the rectangles point in a two-dimensional plane. + /// + /// + /// The which specifies the rectangles height and width. + /// + public Rectangle(Point point, Size size) + { + this.X = point.X; + this.Y = point.Y; + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public int X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public int Y { get; set; } + + /// + /// Gets or sets the width of this . + /// + public int Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public int Height { get; set; } + + /// + /// Gets or sets the coordinates of the upper-left corner of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Point Location + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new Point(this.X, this.Y); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.X = value.X; + this.Y = value.Y; + } + } + + /// + /// Gets or sets the size of this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Size Size + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new Size(this.Width, this.Height); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.Width = value.Width; + this.Height = value.Height; + } + } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Gets the y-coordinate of the top edge of this . + /// + public int Top + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y; + } + } + + /// + /// Gets the x-coordinate of the right edge of this . + /// + public int Right + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return unchecked(this.X + this.Width); + } + } + + /// + /// Gets the y-coordinate of the bottom edge of this . + /// + public int Bottom + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return unchecked(this.Y + this.Height); + } + } + + /// + /// Gets the x-coordinate of the left edge of this . + /// + public int Left + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X; + } + } + + /// + /// Creates a with the coordinates of the specified . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator RectangleF(Rectangle rectangle) => new RectangleF(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector4(Rectangle rectangle) => new Vector4(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Rectangle left, Rectangle right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Rectangle left, Rectangle right) => !left.Equals(right); + + /// + /// Creates a new with the specified location and size. + /// The left coordinate of the rectangle + /// The top coordinate of the rectangle + /// The right coordinate of the rectangle + /// The bottom coordinate of the rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + + // ReSharper disable once InconsistentNaming + public static Rectangle FromLTRB(int left, int top, int right, int bottom) => new Rectangle(left, top, unchecked(right - left), unchecked(bottom - top)); + + /// + /// Returns the center point of the given + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Center(Rectangle rectangle) => new Point(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); + + /// + /// Creates a rectangle that represents the intersection between and + /// . If there is no intersection, an empty rectangle is returned. + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Intersect(Rectangle a, Rectangle b) + { + int x1 = Math.Max(a.X, b.X); + int x2 = Math.Min(a.Right, b.Right); + int y1 = Math.Max(a.Y, b.Y); + int y2 = Math.Min(a.Bottom, b.Bottom); + + if (x2 >= x1 && y2 >= y1) + { + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } + + return Empty; + } + + /// + /// Creates a that is inflated by the specified amount. + /// + /// The rectangle + /// The amount to inflate the width by + /// The amount to inflate the height by + /// A new + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Inflate(Rectangle rectangle, int x, int y) + { + Rectangle r = rectangle; + r.Inflate(x, y); + return r; + } + + /// + /// Converts a to a by performing a ceiling operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Ceiling(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)MathF.Ceiling(rectangle.X), + (int)MathF.Ceiling(rectangle.Y), + (int)MathF.Ceiling(rectangle.Width), + (int)MathF.Ceiling(rectangle.Height)); + } + } + + /// + /// Converts a to a by performing a truncate operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Truncate(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)rectangle.X, + (int)rectangle.Y, + (int)rectangle.Width, + (int)rectangle.Height); + } + } + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Round(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)MathF.Round(rectangle.X), + (int)MathF.Round(rectangle.Y), + (int)MathF.Round(rectangle.Width), + (int)MathF.Round(rectangle.Height)); + } + } + + /// + /// Creates a rectangle that represents the union between and . + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Union(Rectangle a, Rectangle b) + { + int x1 = Math.Min(a.X, b.X); + int x2 = Math.Max(a.Right, b.Right); + int y1 = Math.Min(a.Y, b.Y); + int y2 = Math.Max(a.Bottom, b.Bottom); + + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } + + /// + /// Creates a Rectangle that represents the intersection between this Rectangle and the . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Intersect(Rectangle rectangle) + { + Rectangle result = Intersect(rectangle, this); + + this.X = result.X; + this.Y = result.Y; + this.Width = result.Width; + this.Height = result.Height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The width + /// The height + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(int width, int height) + { + unchecked + { + this.X -= width; + this.Y -= height; + + this.Width += 2 * width; + this.Height += 2 * height; + } + } + + /// + /// Inflates this by the specified amount. + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(Size size) => this.Inflate(size.Width, size.Height); + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(int x, int y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; + + /// + /// Determines if the specified point is contained within the rectangular region defined by this . + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(Point point) => this.Contains(point.X, point.Y); + + /// + /// Determines if the rectangular region represented by is entirely contained + /// within the rectangular region represented by this . + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(Rectangle rectangle) => + (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && + (this.Y <= rectangle.Y) && (rectangle.Bottom <= this.Bottom); + + /// + /// Determines if the specfied intersects the rectangular region defined by + /// this . + /// + /// The other Rectange + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IntersectsWith(Rectangle rectangle) => + (rectangle.X < this.Right) && (this.X < rectangle.Right) && + (rectangle.Y < this.Bottom) && (this.Y < rectangle.Bottom); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(Point point) => this.Offset(point.X, point.Y); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(int dx, int dy) + { + unchecked + { + this.X += dx; + this.Y += dy; + } + } + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Rectangle [ Empty ]"; + } + + return $"Rectangle [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is Rectangle && this.Equals((Rectangle)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Rectangle other) => this.X == other.X && this.Y == other.Y && this.Width == other.Width && this.Height == other.Height; + + private int GetHashCode(Rectangle rectangle) + { + unchecked + { + int hashCode = rectangle.X; + hashCode = (hashCode * 397) ^ rectangle.Y; + hashCode = (hashCode * 397) ^ rectangle.Width; + hashCode = (hashCode * 397) ^ rectangle.Height; + return hashCode; + } + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Primitives/RectangleF.cs new file mode 100644 index 000000000..c7d8b0ebb --- /dev/null +++ b/src/SixLabors.Primitives/RectangleF.cs @@ -0,0 +1,400 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores a set of four single precision floating points that represent the location and size of a rectangle. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct RectangleF : IEquatable + { + /// + /// Represents a that has X, Y, Width, and Height values set to zero. + /// + public static readonly RectangleF Empty = default(RectangleF); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the rectangle. + /// The vertical position of the rectangle. + /// The width of the rectangle. + /// The height of the rectangle. + public RectangleF(float x, float y, float width, float height) + { + this.X = x; + this.Y = y; + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The which specifies the rectangles point in a two-dimensional plane. + /// + /// + /// The which specifies the rectangles height and width. + /// + public RectangleF(PointF point, SizeF size) + { + this.X = point.X; + this.Y = point.Y; + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public float X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public float Y { get; set; } + + /// + /// Gets or sets the width of this . + /// + public float Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public float Height { get; set; } + + /// + /// Gets or sets the coordinates of the upper-left corner of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public PointF Location + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new PointF(this.X, this.Y); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.X = value.X; + this.Y = value.Y; + } + } + + /// + /// Gets or sets the size of this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public SizeF Size + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new SizeF(this.Width, this.Height); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.Width = value.Width; + this.Height = value.Height; + } + } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => (this.Width <= 0) || (this.Height <= 0); + + /// + /// Gets the y-coordinate of the top edge of this . + /// + public float Top + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y; + } + } + + /// + /// Gets the x-coordinate of the right edge of this . + /// + public float Right + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X + this.Width; + } + } + + /// + /// Gets the y-coordinate of the bottom edge of this . + /// + public float Bottom + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y + this.Height; + } + } + + /// + /// Gets the x-coordinate of the left edge of this . + /// + public float Left + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X; + } + } + + /// + /// Creates a with the coordinates of the specified by truncating each coordinate. + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Rectangle(RectangleF rectangle) => Rectangle.Truncate(rectangle); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(RectangleF left, RectangleF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(RectangleF left, RectangleF right) => !left.Equals(right); + + /// + /// Creates a new with the specified location and size. + /// The left coordinate of the rectangle + /// The top coordinate of the rectangle + /// The right coordinate of the rectangle + /// The bottom coordinate of the rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + + // ReSharper disable once InconsistentNaming + public static RectangleF FromLTRB(float left, float top, float right, float bottom) => new RectangleF(left, top, right - left, bottom - top); + + /// + /// Returns the center point of the given + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Center(RectangleF rectangle) => new PointF(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); + + /// + /// Creates a rectangle that represents the intersection between and + /// . If there is no intersection, an empty rectangle is returned. + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Intersect(RectangleF a, RectangleF b) + { + float x1 = MathF.Max(a.X, b.X); + float x2 = MathF.Min(a.Right, b.Right); + float y1 = MathF.Max(a.Y, b.Y); + float y2 = MathF.Min(a.Bottom, b.Bottom); + + if (x2 >= x1 && y2 >= y1) + { + return new RectangleF(x1, y1, x2 - x1, y2 - y1); + } + + return Empty; + } + + /// + /// Creates a that is inflated by the specified amount. + /// + /// The rectangle + /// The amount to inflate the width by + /// The amount to inflate the height by + /// A new + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Inflate(RectangleF rectangle, float x, float y) + { + RectangleF r = rectangle; + r.Inflate(x, y); + return r; + } + + /// + /// Creates a rectangle that represents the union between and . + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Union(RectangleF a, RectangleF b) + { + float x1 = MathF.Min(a.X, b.X); + float x2 = MathF.Max(a.Right, b.Right); + float y1 = MathF.Min(a.Y, b.Y); + float y2 = MathF.Max(a.Bottom, b.Bottom); + + return new RectangleF(x1, y1, x2 - x1, y2 - y1); + } + + /// + /// Creates a RectangleF that represents the intersection between this RectangleF and the . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Intersect(RectangleF rectangle) + { + RectangleF result = Intersect(rectangle, this); + + this.X = result.X; + this.Y = result.Y; + this.Width = result.Width; + this.Height = result.Height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The width + /// The height + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(float width, float height) + { + this.X -= width; + this.Y -= height; + + this.Width += 2 * width; + this.Height += 2 * height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(SizeF size) => this.Inflate(size.Width, size.Height); + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(float x, float y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; + + /// + /// Determines if the specified point is contained within the rectangular region defined by this . + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(PointF point) => this.Contains(point.X, point.Y); + + /// + /// Determines if the rectangular region represented by is entirely contained + /// within the rectangular region represented by this . + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(RectangleF rectangle) => + (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && + (this.Y <= rectangle.Y) && (rectangle.Bottom <= this.Bottom); + + /// + /// Determines if the specfied intersects the rectangular region defined by + /// this . + /// + /// The other Rectange + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IntersectsWith(RectangleF rectangle) => + (rectangle.X < this.Right) && (this.X < rectangle.Right) && + (rectangle.Y < this.Bottom) && (this.Y < rectangle.Bottom); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(PointF point) => this.Offset(point.X, point.Y); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(float dx, float dy) + { + this.X += dx; + this.Y += dy; + } + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "RectangleF [ Empty ]"; + } + + return $"RectangleF [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is RectangleF && this.Equals((RectangleF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(RectangleF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y) && this.Width.Equals(other.Width) && this.Height.Equals(other.Height); + + private int GetHashCode(RectangleF rectangle) + { + unchecked + { + int hashCode = rectangle.X.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Y.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Width.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Height.GetHashCode(); + return hashCode; + } + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SignedRational.cs b/src/SixLabors.Primitives/SignedRational.cs new file mode 100644 index 000000000..07fd105da --- /dev/null +++ b/src/SixLabors.Primitives/SignedRational.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + + /// + /// Represents a number that can be expressed as a fraction. + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + public struct SignedRational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// The to create the rational from. + public SignedRational(int value) + : this(value, 1) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + public SignedRational(int numerator, int denominator) + : this(numerator, denominator, true) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + /// Specified if the rational should be simplified. + public SignedRational(int numerator, int denominator, bool simplify) + { + LongRational rational = new LongRational(numerator, denominator, simplify); + + this.Numerator = (int)rational.Numerator; + this.Denominator = (int)rational.Denominator; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + public SignedRational(double value) + : this(value, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public SignedRational(double value, bool bestPrecision) + { + LongRational rational = new LongRational(value, bestPrecision); + + this.Numerator = (int)rational.Numerator; + this.Denominator = (int)rational.Denominator; + } + + /// + /// Gets the numerator of a number. + /// + public int Numerator { get; } + + /// + /// Gets the denominator of a number. + /// + public int Denominator { get; } + + /// + /// Determines whether the specified instances are considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator ==(SignedRational left, SignedRational right) + { + return SignedRational.Equals(left, right); + } + + /// + /// Determines whether the specified instances are not considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator !=(SignedRational left, SignedRational right) + { + return !SignedRational.Equals(left, right); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// + /// The . + /// + public static SignedRational FromDouble(double value) + { + return new SignedRational(value, false); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// Whether to use the best possible precision when parsing the value. + /// + /// The . + /// + public static SignedRational FromDouble(double value, bool bestPrecision) + { + return new SignedRational(value, bestPrecision); + } + + /// + public override bool Equals(object obj) + { + if (obj is SignedRational) + { + return this.Equals((SignedRational)obj); + } + + return false; + } + + /// + public bool Equals(SignedRational other) + { + LongRational left = new LongRational(this.Numerator, this.Denominator); + LongRational right = new LongRational(other.Numerator, other.Denominator); + + return left.Equals(right); + } + + /// + public override int GetHashCode() + { + LongRational self = new LongRational(this.Numerator, this.Denominator); + return self.GetHashCode(); + } + + /// + /// Converts a rational number to the nearest . + /// + /// + /// The . + /// + public double ToDouble() + { + return this.Numerator / (double)this.Denominator; + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + LongRational rational = new LongRational(this.Numerator, this.Denominator); + return rational.ToString(provider); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SixLabors.Primitives.csproj b/src/SixLabors.Primitives/SixLabors.Primitives.csproj new file mode 100644 index 000000000..3a1265cff --- /dev/null +++ b/src/SixLabors.Primitives/SixLabors.Primitives.csproj @@ -0,0 +1,40 @@ + + + + Low level primitives for use across Six Labors projects.. + SixLabors.Primitives + $(packageversion) + 0.1.0-alpha1 + Six Labors + netstandard1.1 + true + true + SixLabors.Primitives + SixLabors.Primitives + rectangle;point;size,primitives + https://raw.githubusercontent.com/SixLabors/Home/master/logo.png + https://github.com/SixLabors/Primitives + http://www.apache.org/licenses/LICENSE-2.0 + git + https://github.com/SixLabors/Primitives + false + false + false + false + false + false + false + false + false + full + + + + + + + + + + + \ No newline at end of file diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs new file mode 100644 index 000000000..1605232b1 --- /dev/null +++ b/src/SixLabors.Primitives/Size.cs @@ -0,0 +1,225 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Runtime.CompilerServices; + + /// + /// Stores an ordered pair of integers, which specify a height and width. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Size : IEquatable + { + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly Size Empty = default(Size); + + /// + /// Initializes a new instance of the struct. + /// + /// The width and height of the size + public Size(int value) + : this() + { + this.Width = value; + this.Height = value; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The width of the size. + /// The height of the size. + public Size(int width, int height) + { + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The size + public Size(Size size) + : this() + { + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The point + public Size(Point point) + { + this.Width = point.X; + this.Height = point.Y; + } + + /// + /// Gets or sets the width of this . + /// + public int Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public int Height { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the dimensions of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator SizeF(Size size) => new SizeF(size.Width, size.Height); + + /// + /// Converts the given into a . + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Point(Size size) => new Point(size.Width, size.Height); + + /// + /// Computes the sum of adding two sizes. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size operator +(Size left, Size right) => Add(left, right); + + /// + /// Computes the difference left by subtracting one size from another. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size operator -(Size left, Size right) => Subtract(left, right); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Size left, Size right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Size left, Size right) => !left.Equals(right); + + /// + /// Performs vector addition of two objects. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Add(Size left, Size right) => new Size(unchecked(left.Width + right.Width), unchecked(left.Height + right.Height)); + + /// + /// Contracts a by another + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); + + /// + /// Converts a to a by performing a ceiling operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Ceiling(SizeF size) => new Size(unchecked((int)MathF.Ceiling(size.Width)), unchecked((int)MathF.Ceiling(size.Height))); + + /// + /// Converts a to a by performing a round operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Round(SizeF size) => new Size(unchecked((int)MathF.Round(size.Width)), unchecked((int)MathF.Round(size.Height))); + + /// + /// Converts a to a by performing a round operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Size [ Empty ]"; + } + + return $"Size [ Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is Size && this.Equals((Size)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Size other) => this.Width == other.Width && this.Height == other.Height; + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(Size size) => size.Width ^ size.Height; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs new file mode 100644 index 000000000..a11d2e443 --- /dev/null +++ b/src/SixLabors.Primitives/SizeF.cs @@ -0,0 +1,190 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores an ordered pair of single precision floating points, which specify a height and width. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct SizeF : IEquatable + { + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly SizeF Empty = default(SizeF); + + /// + /// Initializes a new instance of the struct. + /// + /// The width of the size. + /// The height of the size. + public SizeF(float width, float height) + { + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The size + public SizeF(SizeF size) + : this() + { + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The point + public SizeF(PointF point) + { + this.Width = point.X; + this.Height = point.Y; + } + + /// + /// Gets or sets the width of this . + /// + public float Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public float Height { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the dimensions of the specified by truncating each of the dimensions. + /// + /// The size. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Size(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); + + /// + /// Converts the given into a . + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator PointF(SizeF size) => new PointF(size.Width, size.Height); + + /// + /// Computes the sum of adding two sizes. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF operator +(SizeF left, SizeF right) => Add(left, right); + + /// + /// Computes the difference left by subtracting one size from another. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF operator -(SizeF left, SizeF right) => Subtract(left, right); + + /// + /// Compares two objects for equality. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(SizeF left, SizeF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(SizeF left, SizeF right) => !left.Equals(right); + + /// + /// Performs vector addition of two objects. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF Add(SizeF left, SizeF right) => new SizeF(left.Width + right.Width, left.Height + right.Height); + + /// + /// Contracts a by another + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "SizeF [ Empty ]"; + } + + return $"SizeF [ Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is SizeF && this.Equals((SizeF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(SizeF other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); + + private int GetHashCode(SizeF size) => size.Width.GetHashCode() ^ size.Height.GetHashCode(); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/stylecop.json b/src/SixLabors.Primitives/stylecop.json new file mode 100644 index 000000000..de88a8bfe --- /dev/null +++ b/src/SixLabors.Primitives/stylecop.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "documentationRules": { + "companyName": "Six Labors", + "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." + } + } +} \ No newline at end of file diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd new file mode 100644 index 000000000..498e55b36 --- /dev/null +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -0,0 +1,21 @@ +@echo off + +cd tests\CodeCoverage + +nuget restore packages.config -PackagesDirectory . + +cd .. +cd .. + +dotnet restore SixLabors.Primitives.sln +dotnet build SixLabors.Primitives.sln --no-incremental -c debug /p:codecov=true + +rem The -threshold options prevents this taking ages... +rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Shapes.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Shapes.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" + +if %errorlevel% neq 0 exit /b %errorlevel% + +SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH% +pip install codecov +codecov -f "SixLabors.Primitives.Coverage.xml" \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/License.rtf b/tests/CodeCoverage/OpenCover.4.6.519/License.rtf new file mode 100644 index 000000000..0916f4d61 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/License.rtf @@ -0,0 +1,166 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;} +{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f380\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f382\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f387\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp +\f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive +\ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}} +{\*\rsidtbl \rsid11275983\rsid14818796\rsid15367925\rsid16724145}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun} +{\creatim\yr2012\mo1\dy5\hr7\min52}{\revtim\yr2012\mo2\dy21\hr8\min10}{\version3}{\edmins2}{\nofpages1}{\nofwords157}{\nofchars900}{\*\company Microsoft}{\nofcharsws1055}{\vern49273}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word +ml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale60\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot15367925\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14818796 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Copyright (c) 2011}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16724145 -2012}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Shaun Wilde +\par Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is fu +rnished to do so, subject to the following conditions: +\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +\par THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11275983 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000e00b +b50e14f0cc01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll new file mode 100644 index 0000000000000000000000000000000000000000..4e5b94aaf085b8bf29f639361809f7216d39d51e GIT binary patch literal 10240 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 T?}OP1_r=xp|DOL3_Q3xDcd->A literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets new file mode 100644 index 000000000..caf2b79ba --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets @@ -0,0 +1,10 @@ + + + + + $(MSBuildExtensionsPath32)\OpenCover + $(OpenCoverMSBuildTasksPath)\OpenCover.MSBuild.dll + + + + diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config new file mode 100644 index 000000000..cfe9c46fb --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj new file mode 100644 index 000000000..400bb251a --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} + Library + Properties + Bom + Bom + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs new file mode 100644 index 000000000..ad91490d3 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Bom +{ + public class BomManager + { + public int MethodToTest(IEnumerable collection) + { + return (collection ?? new int[0]).Sum(); + } + } +} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..cc769d0e4 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Bom")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Bom")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2b4e3956-c04a-42f8-a367-87bc16ffa08d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln new file mode 100644 index 000000000..f5edc5b2d --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bom", "Bom\Bom.csproj", "{0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BomTest", "BomTest\BomTest.csproj", "{E25E828A-5D71-4E95-AEBC-7AD21315DFEC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{A3CD3B1D-4C14-4A8C-A57F-A265BC49FB29}" + ProjectSection(SolutionItems) = preProject + .nuget\packages.config = .nuget\packages.config + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.Build.0 = Release|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs new file mode 100644 index 000000000..486e2b389 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Bom; +using NUnit.Framework; + +namespace BomTest +{ + [TestFixture] + public class BomManagerTests + { + [Test] + public void Sum_Is_Zero_When_No_Entries() + { + var bomManager = new BomManager(); + Assert.AreEqual(0, bomManager.MethodToTest(new Collection())); + } + + [Test] + [TestCase(new[] { 0 }, 0)] + [TestCase(new[] { 1 }, 1)] + [TestCase(new[] { 1, 2, 3 }, 6)] + public void Sum_Is_Calculated_Correctly_When_Entries_Supplied(int[] data, int expected) + { + var bomManager = new BomManager(); + Assert.AreEqual(expected, bomManager.MethodToTest(new Collection(data))); + } + + [Test] + public void Sum_Is_Zero_When_Null_Collection() + { + var bomManager = new BomManager(); + Assert.AreEqual(0, bomManager.MethodToTest(null)); + } + } +} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj new file mode 100644 index 000000000..4942e9f28 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj @@ -0,0 +1,65 @@ + + + + + Debug + AnyCPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC} + Library + Properties + BomTest + BomTest + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + + + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} + Bom + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..60d4b26d9 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BomTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BomTest")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("688e9792-727d-4e39-a0ae-93461aa13b49")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config new file mode 100644 index 000000000..c714ef3a2 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat new file mode 100644 index 000000000..02415f7e3 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat @@ -0,0 +1,5 @@ +.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user "-filter:+[Bom]* -[*Test]*" "-target:.\packages\NUnit.Runners.2.6.4\tools\nunit-console-x86.exe" "-targetargs:/noshadow .\BomTest\bin\Debug\BomTest.dll" + +.\packages\ReportGenerator.2.1.8.0\tools\ReportGenerator.exe "-reports:results.xml" "-targetdir:.\coverage" + +pause \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt b/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt new file mode 100644 index 000000000..cc71c4a16 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt @@ -0,0 +1,137 @@ +Version 4.6.519 +#528 -safemode:on to address incomplete coverage due to thread based buffers (feature) +#521 add exclude paths (feature) +#376 protect buffer allocation in multithreaded environment (fix) +#335 allow short wait timeout to be configured (feature) +#310 improved reporting - hide branches due to iterators (feature) +#352 improved reporting - hide branches due to async (feature) +#363 calculate npath comlexity (feature) +#282 exclude by process (feature) +#246 auto crash reports (feature) +#329 address ArgumentOutOfRangeException (potentially related to #274) (fix for VS2015) +#335 error on unrecognized arguments/prefixes (fix) +#328 exclude types when declaredtype is excluded (fix-feature) +#302 ignore branches in known autogenerated sequences (feature) + +Version 4.6.166 +#323 push releases and candidates to github via appveyor (prj-mgmt) +#315 update nuget package (fix for VS2015) +#320 update packages (fix for VS2015) +#304 add switch to control timeout wait (feature) +#307 add -version to args (feature) +#305 add corclr_profiler_path support (feature) +#303 support for test cases and theories during track by test (feature) +#295 exclude assembly by attribute (feature) +#288 report (to console) if can't ready body of method (diag) +#287 fix crash (fix) +#283 Add visited class/method to summary entity (feature) +#274 Use thread based buffers for performance improvement (fix) + +Version 4.5.3723 +#244 support ApplicationUnderTest.Launch to propagate required OPENCOVER environment variables (feature) +#256 support Microsoft Fakes (feature) - beta support until we bed feature in (feature) +#248 address issue with Mono.Cecil and latest PDB (.NET 4.6) version (fix) +#252 use AppVeyor for building code and pull requests (prj-mgmt) + +Version 4.5.3522 +#243 null reference exception when excluding branch point in using finally block (fix) + +Version 4.5.3427 +#234 improved IIS support (fix) +#237 handle multiple files for a method e.g. during code contract re-writes (fix) +#228 add MDB support (feature) +#226 remove branch points on methods without sequence points (fix) +#225 Enable filters to use regular expressions (feature) +#218 Auto tag release notes (prj-mgmt) +#116 output results to accumulate with previous coverage file activate by -mergeoutput (feature) + +Version 4.5.3207 +#209 The number of WaitHandles must be less than or equal to 64 (fix) +#208 Line Number for Branch Points (feature) +#207 "using" statement causes incorrect Branch Coverage (fix) +#201 NETWORK SERVICE support (feature) + +Version 4.5.2506 +#188 Bring back COR_PRF_DISABLE_ALL_NGEN_IMAGES +#190 Compiler generated "Empty" Branch Points feature high close on next release +#191 SequencePoint FileID [CodeContractClass/For] + +Version 4.5.2316 +#170 - Overflow fixed +#188 - re-introduced COR_PRF_DISABLE_ALL_NGEN_IMAGES +#174 / #176 - pass arguments as multiple variable + +Version 4.5.1923 +#168 - skip auto implemented properties +#164 - allow registryless loading +#163 - improved error messages + +Version 4.5.1604 +#156 - prepend targetdir when applying test strategies (silverlight) + +Version 4.5.1528 +#158 - fix app domain crash due to timeout of proxy + +Version 4.5.1403 +#154 - Add xUnit to the list of supported strategies for the Cover by Test feature +#150 - fix for Xslt issue +Build Environment now uses BDD tests to ensure the packages have all assemblies required to run + +Version 4.5.1314 +#148 - Fix issue with nuget and zip packages and missing Autofac assembly. + +Version 4.5.1313 +#118 - Fix communication issue between profiler and host when many processes are vying for the channel + - improved thread management + - only check if method needs tracing if coverbytest option is utilised + +Version 4.5.1310 +#128 - Add threshold limits (optional commandline) to reduce reporting of visits +#135 - Add performance counters (admin privileges required) around the memory processing queues + +Version 4.5.1302 +Update version number to reflect 4.5 support +Fix bug in summaries + +Version 4.0.1229 +Supports .NET 4.5 (not windows store apps) +#120 - Built in Summary Reports - useful for build systems + +Version 4.0.1128 +#125 - Hide compiler generated method when no source remains after skipping +#107 - fix 'sporadic' crash when dealing with Generic methods. + +Version 4.0.1118 +#137 - Fix instrumentation issue when dealing with typed clauses +#107 - fix 'sporadic' crash when dealing with Generic methods. + +Version 4.0.1107 +#133 - Remove skipped File/Module/Class/Methods from report +#130 - Support for 'returntargetcode' switch in msbuild task +#126, #127, #132 - ReportGenerator upgrades +#122 - filter from file instead of command line list option (#123 patch) + +Version 4.0.804 +#117 - fix filter crash with anonymous types +#110 - fix timeout issues due to performance woes in dealing with large number of types/methods + +Version 4.0.724 +#94 - remove thread that "may" have been the cause of the nunit-agent.exe closedown issue - switched to a shared memory buffer per child process/profiler object instantiated +#108 - merge pull request - ToolPath property for MSBuild command + +Version 4.0.519 +#102 - add msbuild parts to zip and nuget package +#99 - exclude anonymous functions if containing method is excluded +#97 - fix crash based on receiving corrupt data (sequence point with id==0) +#88 - only use COR_PRF_DISABLE_TRANSPARENCY_CHECKS_UNDER_FULL_TRUST if oldStyle instrumentation + +Version 4.0.408 +#83 - build a zip package +#88 - provide a switch for "old school" instrumentation +#95 - fix for namespaces with spaces + +Version 4.0.301.10 +#78 - fix for endfault/endfinally +#71 - detect disabled service + + diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf b/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf new file mode 100644 index 000000000..a078a647e --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf @@ -0,0 +1,1138 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f39\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\f40\fbidi \fmodern\fcharset0\fprq1{\*\panose 020b0609020204030204}Consolas;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f64\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f65\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f66\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f67\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f68\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f69\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f81\fbidi \fswiss\fcharset238\fprq2 Helvetica CE;}{\f82\fbidi \fswiss\fcharset204\fprq2 Helvetica Cyr;} +{\f84\fbidi \fswiss\fcharset161\fprq2 Helvetica Greek;}{\f85\fbidi \fswiss\fcharset162\fprq2 Helvetica Tur;}{\f86\fbidi \fswiss\fcharset177\fprq2 Helvetica (Hebrew);}{\f87\fbidi \fswiss\fcharset178\fprq2 Helvetica (Arabic);} +{\f88\fbidi \fswiss\fcharset186\fprq2 Helvetica Baltic;}{\f89\fbidi \fswiss\fcharset163\fprq2 Helvetica (Vietnamese);}{\f381\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f382\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f384\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f385\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f388\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f389\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f419\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f431\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f432\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\f434\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f435\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f438\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f439\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);} +{\f441\fbidi \fmodern\fcharset238\fprq1 Consolas CE;}{\f442\fbidi \fmodern\fcharset204\fprq1 Consolas Cyr;}{\f444\fbidi \fmodern\fcharset161\fprq1 Consolas Greek;}{\f445\fbidi \fmodern\fcharset162\fprq1 Consolas Tur;} +{\f448\fbidi \fmodern\fcharset186\fprq1 Consolas Baltic;}{\f449\fbidi \fmodern\fcharset163\fprq1 Consolas (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; +\caccentone\ctint255\cshade191\red54\green95\blue145;\caccentone\ctint255\cshade255\red79\green129\blue189;\ctexttwo\ctint255\cshade191\red23\green54\blue93;\cfollowedhyperlink\ctint255\cshade255\red128\green0\blue128; +\ctextone\ctint255\cshade255\red0\green0\blue0;\red51\green51\blue51;\red43\green145\blue175;\cbackgroundone\ctint255\cshade191\red191\green191\blue191;}{\*\defchp \f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af0\afs28\alang1025 \ltrch\fcs0 \b\fs28\cf17\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink15 \sqformat \spriority9 \styrsid13184707 heading 1;}{\s2\ql \li0\ri0\sb200\sl276\slmult1 +\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 \b\fs26\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext0 \slink16 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 2;}{\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af0\afs22\alang1025 \ltrch\fcs0 \b\fs22\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink17 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 3;}{\*\cs10 \additive +\sunhideused \spriority1 Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused +Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\fs28\cf17\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 \styrsid13184707 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af0\afs26 \ltrch\fcs0 +\b\fs26\cf18\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink2 \slocked \spriority9 \styrsid12068581 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf18\loch\f31502\hich\af31502\dbch\af31501 +\sbasedon10 \slink3 \slocked \spriority9 \styrsid12068581 Heading 3 Char;}{\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 +\b\fs28\cf17\lang1033\langfe1041\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 \sbasedon1 \snext0 \ssemihidden \sunhideused \sqformat \spriority39 \styrsid7372180 TOC Heading;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 +\sbasedon10 \sunhideused \styrsid8939988 Hyperlink;}{\s20\ql \li0\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 1;}{\s21\ql \li220\ri0\sa100\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 +toc 2;}{\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 3;}{\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\contextualspace \rtlch\fcs1 +\af0\afs52\alang1025 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink24 \sqformat \spriority10 \styrsid7372180 Title;}{\*\cs24 \additive +\rtlch\fcs1 \af0\afs52 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\kerning28\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink23 \slocked \spriority10 \styrsid7372180 Title Char;}{\s25\ql \li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext25 \sqformat \spriority34 \styrsid6453762 List Paragraph;}{\s26\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang3081\langfe3081\cgrid\langnp3081\langfenp3081 \sbasedon0 \snext26 \ssemihidden \sunhideused \styrsid11687369 Normal (Web);}{\*\cs27 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \spriority0 \styrsid11687369 apple-converted-space;}{\* +\ts28\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af37\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon11 \snext28 \spriority59 \styrsid5114927 +Table Grid;}{\*\cs29 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf20 \sbasedon10 \styrsid11032164 FollowedHyperlink;}}{\*\listtable{\list\listtemplateid740077246\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid382339409}{\list\listtemplateid1903328102\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360 +\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext +\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid401637325}{\list\listtemplateid508579338 +\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916433\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel +\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid405616751}{\list\listtemplateid1306685724\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid484125747}{\list\listtemplateid1826631064{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers +\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 +\ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid723678808} +{\list\listtemplateid-842228772\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1138174080\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 +\fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li6840\lin6840 }{\listname ;}\listid950892184}{\list\listtemplateid-1038568524\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 } +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel +\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2 +\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid1199853486} +{\list\listtemplateid-1235995406\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 +\fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li6480\lin6480 }{\listname ;}\listid1997226378}{\list\listtemplateid-2031863006\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1313997542 +\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6840\lin6840 }{\listname ;}\listid2120176231}}{\*\listoverridetable{\listoverride\listid405616751\listoverridecount0\ls1}{\listoverride\listid2120176231\listoverridecount0\ls2} +{\listoverride\listid950892184\listoverridecount0\ls3}{\listoverride\listid484125747\listoverridecount0\ls4}{\listoverride\listid1997226378\listoverridecount0\ls5}{\listoverride\listid723678808\listoverridecount0\ls6}{\listoverride\listid1199853486 +\listoverridecount0\ls7}{\listoverride\listid382339409\listoverridecount0\ls8}{\listoverride\listid401637325\listoverridecount0\ls9}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid97460\rsid221265\rsid284426\rsid537180\rsid664540\rsid735477\rsid735614\rsid738226\rsid879886\rsid935281\rsid1070110\rsid1510934\rsid1583585\rsid1586953\rsid1598011\rsid1775295\rsid1841268\rsid1903893\rsid1926955\rsid1967093\rsid2060806 +\rsid2177067\rsid2243939\rsid2312332\rsid2783484\rsid2827362\rsid2846494\rsid2890017\rsid2959880\rsid2981254\rsid3290111\rsid3490457\rsid3741585\rsid3829756\rsid4010500\rsid4327818\rsid4477453\rsid4484449\rsid4522593\rsid4545630\rsid5050788\rsid5114927 +\rsid5794820\rsid5921453\rsid6438937\rsid6453762\rsid6518571\rsid6886783\rsid7160127\rsid7237901\rsid7289096\rsid7292194\rsid7372180\rsid7816154\rsid8091909\rsid8145172\rsid8329235\rsid8339308\rsid8475156\rsid8479050\rsid8651410\rsid8728997\rsid8847473 +\rsid8852142\rsid8939988\rsid9049101\rsid9068514\rsid9132688\rsid9137041\rsid9332253\rsid9639182\rsid9639869\rsid10224112\rsid10314410\rsid10845574\rsid11032164\rsid11212548\rsid11687369\rsid11802269\rsid12024666\rsid12060006\rsid12068581\rsid12129336 +\rsid12348517\rsid12584760\rsid13184707\rsid13261933\rsid13513498\rsid13586263\rsid13596290\rsid13722641\rsid13847658\rsid14041828\rsid14097242\rsid14228117\rsid14243083\rsid14371182\rsid14497238\rsid14513928\rsid14565649\rsid14684873\rsid14885541 +\rsid15205038\rsid15221525\rsid15280621\rsid15795287\rsid15819295\rsid15938139\rsid16071677\rsid16142742\rsid16259852\rsid16349201\rsid16469695\rsid16712264}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 +\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun Wilde}{\creatim\yr2012\mo1\dy3\hr1\min4}{\revtim\yr2016\mo1\dy31\hr14\min3}{\printim\yr2016\mo1\dy31\hr14\min2}{\version61}{\edmins4613}{\nofpages11}{\nofwords3439}{\nofchars19608} +{\*\company Microsoft}{\nofcharsws23001}{\vern57439}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot284426\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180\contextualspace \rtlch\fcs1 \af0\afs52\alang1025 \ltrch\fcs0 +\fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13184707 \hich\af31502\dbch\af31501\loch\f31502 OpenCover Usage Guide}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 {\*\bkmkstart _Toc442012125}\hich\af31502\dbch\af31501\loch\f31502 Intro{\*\bkmkend _Toc442012125} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 The following guide describes how to use }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 HYPERLINK "https://github.com/OpenCover/opencover"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 +{\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b66000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f004f00700065006e0043006f007600650072002f006f00700065006e0063006f007600650072000000795881f4 +3b1d7f48af2c825dc485276300000000a5ab000000000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 OpenCover}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 HYPERLINK "http://nuget.org/packages/OpenCover/" }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6200000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f004f00700065006e0043006f007600650072002f000000795881f43b1d7f48 +af2c825dc485276300000000a5ab0000004500000000ff00ffe65b0000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid221265\charrsid221265 NUGET}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 ) }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 to gather coverage statistics of your application. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid879886\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid879886 C}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 an handle 32 and 64 bit .NET processes running on the .NET 2 and .NET 4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 +}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 frameworks. }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid879886 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 b)\tab}W}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 ill gather sequence and branch coverage informatio +n of your assemblies that match the filters and for which the PDB files can be found.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 c)\tab}Can gather coverage reports of Silverlight applications +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 d)\tab}Can gather coverage reports of Windows Service applications. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 e)\tab}Can record which tests where executing at a particular time when a coverage point was visited \endash + only MSTest and NUnit supported (requests accepted for others).}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 Currently OpenCover has no }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid735477 full }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 presentation of results other than the XML output file; }{\field{\*\fldinst { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 HYPERLINK "http://www.palmmedia.de/Net/ReportGenerator" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7000000068007400740070003a002f002f007700770077002e00700061006c006d006d0065006400690061002e00640065002f004e00650074002f005200650070006f0072007400470065006e006500720061007400 +6f0072000000795881f43b1d7f48af2c825dc485276300000000a5ab00006c0000000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 ReportGenerator}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 + HYPERLINK "http://nuget.org/packages/ReportGenerator/" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6e00000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f005200650070006f0072007400470065006e0065007200610074006f007200 +2f000000795881f43b1d7f48af2c825dc485276300000000a5ab0000005600000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid879886\charrsid879886 NUGET}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 )}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 is currently the recommended tool for visualizing the results. +\par NOTE: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 When there is n}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 o PDB for an assembly then no coverage data will be gathered; this is different to }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid879886 HYPERLINK "https://github.com/sawilde/partcover.net4" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6c000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0073006100770069006c00640065002f00700061007200740063006f007600650072002e006e00650074003400 +0000795881f43b1d7f48af2c825dc485276300000000a5ab0000da0000000000ff00ff1f000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 PartCover}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 which will default to IL coverage under this situation but it + was considered as not required as this is supposed to be a code-coverage tool which can relate such coverage to }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\i\insrsid1775295\charrsid4484449 your}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 code. +\par }\pard\plain \ltrpar\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 +\b\fs28\cf17\lang1033\langfe1041\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 \hich\af31502\dbch\af31501\loch\f31502 Table of Contents +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 TOC \\o "1-3" \\h \\z \\u }}{\fldrslt {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012125"}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +{\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Intro}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012125 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 1}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012126"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Command Arguments}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012126 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012127"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Mandatory}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012127 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012128"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012128 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012129"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Handling Spaces}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012129 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 5}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012130"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Understanding Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012130 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012131"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012131 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012132"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Regular Expressions in Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012132 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012133"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012133 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012134"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against IIS}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012134 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012135"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Running against an application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +\tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012135 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012136"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012136 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012137"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against a Silverlight application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012137 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012138"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012138 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012139"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against a Service application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012139 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012140"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012140 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012141"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludeb\hich\af31506\dbch\af31501\loch\f31506 +yattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012141 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012142"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012142 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012143"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Shimming support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012143 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012144"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Microsoft Moles support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012144 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012145"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Microsoft Fakes support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012145 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012146"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 TypeMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012146 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012147"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 JustMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012147 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012148"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Build system integration}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 + PAGEREF _Toc442012148 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012149"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 all-users (32-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012149 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012150"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 all-users (64-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012150 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012151"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 single-user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012151 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012152"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 R\hich\af31506\dbch\af31501\loch\f31506 eporting}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012152 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012153"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 FAQ}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012153 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012154"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Why do I have no results?}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012154 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012155"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 All my tests are failing and I am getting MissingMethodException}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012155 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid16712264 11}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 }}\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1 +\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 +{\*\bkmkstart _Toc442012126}\hich\af31502\dbch\af31501\loch\f31502 Command Arguments{\*\bkmkend _Toc442012126} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988 OpenCover has a number of arguments that can be used to control the code coverage gathering. If an argument requires s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988\charrsid8939988 paces}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid8939988\charrsid8939988 then use "}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8939988 \rquote s to wrap the argument, where they are applicable they will be indicated with an optional syntax [].}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid4484449 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12068581 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012127}\hich\af31502\dbch\af31501\loch\f31502 Mandatory{\*\bkmkend _Toc442012127} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 ["]-target:<}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 target application}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 >["] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid16349201 +The name of the target application or service that will be started; this can also be a path to the target application. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 Alternatively use }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid8728997\charrsid5050788 -?}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 to show command line help, or }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2060806\charrsid2060806 -version}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 + to print the current version and exit.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012128}\hich\af31502\dbch\af31501\loch\f31502 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid8939988 {\*\bkmkend _Toc442012128} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16349201 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 ["]-targetdir:["] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 +The path to the target directory; if the target argument already contains a path then this argument can be used to provide an alternate path wh}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 ere PDB files may be found. }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid16349201 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8728997\charrsid5050788 -targetargs:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Arguments to be passed to the target process.}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1841268 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 [\'93]-searchdirs:[;[\'93] + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 \tab Additional locations to check for PDB files.\page +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 -register[:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid9639182 |path32|path64}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Use this switch to register and d +e-register the code coverage profiler. Alternatively use the optional }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid9639182 user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 + argument to do per-user registration where the user account does not have administrative permissions. }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 +\par If access to registry is limited then try the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 or }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path64}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid9639182 , depending on your application (32- or 64-bit), to use an alternate method to load the profiler; unfortunately you cannot profile 32- and 64-bit processes at the same time using these switches.}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid9639182\charrsid9639182 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Alternatively use an administrative account to register the profi}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 lers using t +he regsvr32 utility; this is the recommended option when running on a build server especially if \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 \endash register:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 does not work. + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid13513498 -returntargetcode[:] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953\charrsid2783484 +Return the target process return code instead of the OpenCover console return code. Use the offset to return the OpenCover console at a value outside the range returned by the target process. }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid1586953\charrsid1586953 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid15205038 -safemode:on|off|yes|no +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Use this switch to disable safe mode (default is }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \b\insrsid15205038\charrsid15205038 on}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 /yes). When in safe mode the profiler will use a common buffer for all threads which may have performance impacts if you code or tests use threads he +avily. When safe mode is disabled, there may on occasions be some data loss if the runtime closes the application under profile before the profiler has been able to retrieve the visit count data. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid5050788\charrsid13513498 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12068581\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5050788 +The location and name of the output xml file. If no value is supplied then the current directory will be used and the outpu}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 t filename will be results.xml.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid2312332 -threshold: +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 +Limits the number of visit counts recorded/reported for an instrumentation point. May have some performance gains as it can reduce the number of messages sent fr +om the profiler. Coverage results should not be affected but will have an obvious impact on the Visit Counts reported.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 +\par +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid664540\charrsid13513498 -filter:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["] +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 A list of filters to apply to selectively include or +exclude assemblies and classes from coverage results. Filters have their own form}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid9332253 at }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540 \'b1[module}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\b\insrsid664540\charrsid9332253 -filter]class-filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 . If no filter(s) are supplied then a default include all filter is applied +[*]*. As can be seen you can use an * as a wildcard. +\par +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540\charrsid13261933 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 : Also an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 exclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (-) +filter takes precedence over an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 inclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid13261933 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (+) filter.}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9639869 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid9639869\charrsid9639869 -regex +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 \tab +\par \tab Filters are supplied using regular expressions rather than wildcards. +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14243083\charrsid13513498 -nodefaultfilters +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 A list of default exclusion filters are usually applied}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid10314410\charrsid2783484 , this option can be used to turn them off. The default filters are:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 +\par }\pard \ltrpar\ql \li1440\ri0\widctlpar\wrapdefault\faauto\rin0\lin1440\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -[mscorlib]* +\par -[mscorlib.*]* +\par -[System]* +\par -[System.*]* +\par -[Microsoft.VisualBasic]* +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid13513498 -mergebyhash +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +Under some scenarios e.g. using MSTest, an assembly may be loaded many times from different locations. This option is used to merge the coverage results for an assembly regardless of where it was loaded as +suming the assembly has the same file-hash in each location. +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 -skipautoprops}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid2846494 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 +\par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid2846494 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 Neither track nor record Auto-Implemented properties. +\par +\par i.e. skip getters and setters like these +\par +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 public}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 bool}{ +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 Service \{ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 get}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; }{ +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 set}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; \}}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid2846494 +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 -showunvisited +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 Show a list of unvisited methods and classes after the coverage run is finished}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid664540 and the results are presented.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15205038 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid9639182 [\'93]-}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid15205038 excludeddirs:[;[\'93 +] +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Any assembly found in an excluded folder (or its children) will be ignored, regardless of any inclusive +filter matches.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2846494 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14228117\charrsid2783484 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyattribute:[;][;]} +{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2783484\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 +Exclude a class or method by filter(s) that match attributes that have been applied that have been applied.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid4327818 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyfile:[;][;] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid4327818 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 Exclude a class (or methods) by filter(s)}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid13513498 that match the filenames.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 -hideskipped:}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid3490457\charrsid15280621 File|Filter|Attribute|MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 +MissingPdb }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid664540 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 Excl +udedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 [}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457 {\*\bkmkstart OLE_LINK1}{\*\bkmkstart OLE_LINK2};}{ +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 File|}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid15280621 Filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |Attribute}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid15280621\charrsid15280621 |MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 MissingPdb }{ +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15205038 {\*\bkmkend OLE_LINK1}{\*\bkmkend OLE_LINK2}|ExcludedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 ] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 Remove information from output file (}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \i\insrsid12060006\charrsid8475156 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ) that relates to classes/modules that have been skipped (filtered) due to the use of}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 + the following switches}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3741585 excludeb}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid12060006\charrsid8475156 yfile}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ,}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid3741585\charrsid3741585 \_}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid3741585 e}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 xcludebyattribut}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 e:}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid3741585 and}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 filter}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \i\insrsid8475156\charrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 or where the PDB is missing}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 . +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5794820 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5794820 -coverbytest}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid5794820\charrsid13513498 :[;][;] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1967093 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 +Gather coverage by test by analysing the assemblies that match these filters for Test m}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 ethods. Currently only }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8339308 MSTest and }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid5794820 NUnit tests}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 are supported; other frameworks can be added on request \endash please raise support request on GitHub.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -log:[Off|Fatal|Error|Warn|Info|Debug|Verbose|All] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 Change the logging level, default is set to Info. }{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid13513498\charrsid13513498 Logging is based on log4net logging levels and appenders}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 . +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -service +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15795287 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid15795287\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid15795287 : \'93Administrator\'94 privileges recommended. +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 +The value provided in the target parameter is the name of a service rather than a name of a process. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8145172\charrsid8145172 -servicestarttimeout:[1m|23s|1m23s] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8145172 Overrides the default time to wait for the profiled service t +o start. The examples above correspond to a timeout of 1 minute, 23 seconds and 1 minutes and 23 seconds accordingly. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 -}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid14513928 oldstyle}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14513928 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 Use old style instru}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid3490457 mentation \endash the instrumentation}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 is not Silverlight friendly and is provided to support environments where mscorlib instrumentation is not working. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2312332\charrsid2312332 -enableperformancecounters +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid2312332\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid2312332 : \'93Administrator\'94 privileges}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15795287 required}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 . +\par Allows the monitoring in \'93Performance Monitor\'94 of the following }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 values}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 : +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li1080\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1080\itap0\pararsid2312332\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid2312332\charrsid2312332 \'93messages remaining on the queue}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 \'94 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 2)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 \'93number of messages processed\'94 +}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 +\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7816154 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 These values are usually cleared at the end of a performance run.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154\charrsid7816154 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 {\*\bkmkstart _Toc442012129}\hich\af31502\dbch\af31501\loch\f31502 Handling Spaces}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid14513928 {\*\bkmkend _Toc442012129} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 If your argument needs to escape quotes i.e. to pass arguments with spaces to the target process then you can use \\". +\par e.g. +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid4484449\charrsid8847473 -targetargs:"\\"c:\\program files\\" arg2 arg3" + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 Or +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8847473\charrsid8847473 \'93-targetargs:\\"c:\\program files\\ +" arg2 arg3" +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid4484449 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 {\*\bkmkstart _Toc442012130}\hich\af31502\dbch\af31501\loch\f31502 Understanding Filters +{\*\bkmkend _Toc442012130} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2827362 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 Filters are core to understanding how OpenCover works and how it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 is determined}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 + which assemblies are to be instrumented to provide coverage results. +\par Filters can be inclusive and exclusive represented by + and }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 \endash prefix }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 respectively, }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 where e}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid2827362 xclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (-) filters take precedence}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 over inclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (+)}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid2827362 filters. +\par The next }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 part of a filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 +is the module-filter and usually this happens to be the same name as the assembly but without the extension and this rule will normally apply 99.999% of the time. If this filter isn\rquote +t working look in the coverage XML and compare the found entries against the filter.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 The final part of the filter is the class-filter and this also }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 includes}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 the namespace part of the class as well. + +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 {\*\bkmkstart _Toc442012131}\hich\af31502\dbch\af31501\loch\f31502 Examples{\*\bkmkend _Toc442012131} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 +[Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 +*]* -[Open.Test]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid3290111\charrsid3290111 +\par +[Open]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 -[Open]Data.*\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid3290111\charrsid3290111 +\par +[Open]* -[Open]*Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes ending with Attribute. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012132}\hich\af31502\dbch\af31501\loch\f31502 Regular Expressions in Filters +{\*\bkmkend _Toc442012132} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 It is also possible to use regular expressions instead of wildcards but to do so require that you use the \endash regex swit +ch when specifying the filters. NOTE: When using this feature it is required that all filters use regular expressions rather than wildcards. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid9639869 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012133}\hich\af31502\dbch\af31501\loch\f31502 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid9639869 {\*\bkmkend _Toc442012133}\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid9639869 +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 \\.}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 +\af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 \\}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 .Test}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 ) -[(Open)](Data\\..*)\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 +Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 +\af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 +Include all classes in module Open but exclude all classes ending with Attribute.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639869 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid3290111 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 {\*\bkmkstart _Toc442012134}\hich\af31502\dbch\af31501\loch\f31502 Running against IIS +{\*\bkmkend _Toc442012134} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 Normally I\rquote d suggest running against }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 HYPERLINK "http://www.microsoft.com/en-us/download/details.aspx?id=1038" }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9200000068007400740070003a002f002f007700770077002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f0064006f0077006e006c006f00610064002f006400 +65007400610069006c0073002e0061007300700078003f00690064003d0031003000330038000000795881f43b1d7f48af2c825dc485276300000000a5ab0000000000000039000065960800}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid10224112\charrsid10224112 IISEXPPRESS}}} +\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 as I think it is easier to automate. However for those}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14565649 + who really want to run against a full blown IIS then the following instructions (supplied by a }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid14565649\charrsid14565649 user) will hopefully suffice.}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cf21\insrsid11687369\charrsid14565649 +\par \'93}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 The trick is to start OpenCover to run the}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid14565649 w3wp.exe process in debug mode}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\insrsid11687369\charrsid14565649 e.g. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe -targetargs:-debug\~\line -targetdir:C:\\Inetpub\\wwwwoot\\MyWebApp +\\bin\\ -filter:+[*]* -register:user +\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 There are some prerequisites tho}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 ugh:}{ +\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 \hich\af31506\dbch\af0\loch\f31506 1.\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin720\itap0\pararsid14565649\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ll applications running under the site must }{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 make use of the same app pool; y}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ou'll get error}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 s in the EventLog otherwise. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 \hich\af31506\dbch\af0\loch\f31506 2.\tab}}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 inetserver needs to be stopped, before starting w3wp.exe in debug mode. You can use the following command: +\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net stop w3svc /y +\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 +fter testing/code coverage completion you can close the w3wp.exe proce}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 s}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 s and start the inetserver again: +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net start w3svc +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 {\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 +This procedure was tested on a Win2008 machine with IIS7.5}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 \'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 You can also run multiple OpenCover instances against separate IIS sites by using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\cf21\insrsid12584760 \endash }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\cf21\insrsid12584760\charrsid12584760 s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 option when running IIS to choose the siteid e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760\charrsid12584760 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12584760 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 +OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetargs:"-debug -s 1" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetdir:%WebSite_Path% }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -filter:+[*]* }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -output:%CoverageResult_Path%}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12584760 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12584760 Then you can use ReportGenerator to merge the coverage results. }{ +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012135}\hich\af31502\dbch\af31501\loch\f31502 Running against an application +{\*\bkmkend _Toc442012135} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid7237901 This most common usage }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 of any code coverage utility such as OpenCover }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7237901 is in a testing environment}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid12068581 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7237901 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13513498 {\*\bkmkstart _Toc442012136}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012136} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13513498 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid13513498\charrsid7237901 OpenCover.Console.exe -register:user -target:..\\..\\..\\tools\\NUnit-2.5.10.11092\\bin\\net-2.0\\nunit-console-x86.exe -targetargs:"OpenCover.Test +.dll /noshadow" -filter:"+[Open*]* -[OpenCover.T*]*" -output:opencovertests.xml +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012137}\hich\af31502\dbch\af31501\loch\f31502 Running against a Silverlight application +{\*\bkmkend _Toc442012137} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid16469695 To run against a Silverlight application it is necessary to ensure the site hosting the application is runni +ng beforehand. To profile a Silverlight application it is necessary to launch a browser against the site and as the PDB files are not packaged in the XAP files it is necessary to give the console a hint where to look for the PDB files}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1510934 (using the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 \endash targetdir}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 option)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 . +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12068581 {\*\bkmkstart _Toc442012138}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012138} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "-target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid16469695\charrsid12068581 C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid16469695\charrsid12068581 -targetar}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 gs:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 http://localhost:4128/SampleSilverlightTestPage.aspx}{ +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 -t}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid8728997 argetdir:..}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 \\SampleSilverlight\\SampleSilverlight\\Bin\\Debug"}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012139}\hich\af31502\dbch\af31501\loch\f31502 Running against a Service application +{\*\bkmkend _Toc442012139} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid7289096 It is preferable to run the service in a console mode if it has one rather than as a service however if you do decide to use it against a service then you will nee +d to make sure you use an account that can access the windows synchronisation objects in the Global namespace (rather than Local namespace). \'93Local System\'94 seems to work quite well and so do user accounts w}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid8479050 ith the appropriate permissions;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 \'93Local Service\'94 is}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 usually}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 + problematic and is not recommended. The console host will also need to be run from an account that can access the Global namespace as such an Administrator account or an Administrative prompt is recommended}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 +.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 {\*\bkmkstart _Toc442012140}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012140} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16349201 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 +OpenCover Sample Service" -service }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid8479050 \endash }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 register}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8479050 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid8479050 NOTE}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 +: Rather than use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 \endash register}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 switch, it is usually simpler to use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8479050\charrsid8479050 regsvr32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 utility to pre-register the two profiler assemblies (32 and 64-bit) beforehand.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid738226 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkstart _Toc442012141}\hich\af31502\dbch\af31501\loch\f31502 Using +\hich\af31502\dbch\af31501\loch\f31502 the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid4327818\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyattribute}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid4327818 \hich\af31502\dbch\af31501\loch\f31502 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkend _Toc442012141} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid4327818 Normally you would include/exclude modules and classes by using the inclusion/exclusion filters, however there may be situations where you can\rquote t get coverage via testing and you wish to ignore the uncovered method. + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 First create a \'93public\'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 + attribute that you can apply to class/method/property which you use to mark up something to ignore. You can have more than one and you can add other data to provide a reason why you are excluding it. +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 e.g. +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 [}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 +AttributeUsage}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 (}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 +\f40\fs16\insrsid738226\charrsid738226 .Class|}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 .Method|}{\rtlch\fcs1 \af40\afs16 +\ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226 .Property)] +\par }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \b\f40\fs16\cf2\insrsid738226\charrsid1775295 public}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf2\insrsid738226\charrsid738226 class} +{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 ExcludeFromCoverageAttribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 +\f40\fs16\insrsid738226\charrsid738226 : }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 Attribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 \{\} +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\insrsid738226 +\par +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 Then you apply this attribute to the class/method/property that you wish to exclude. + +\par Then you add this attribute to the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid1510934 excludebyattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 + option using namespaces and wildcards where necessary. +\par e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 +-excludebyattribute:*.ExcludeFromCoverage* +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 NOTE: Use with care as you could exclude a method which you should be testing}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 ;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 {\*\bkmkstart _Toc442012142}\hich\af31502\dbch\af31501\loch\f31502 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 \hich\af31502\dbch\af31501\loch\f31502 option}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012142} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid738226 This is a useful option to use to ignore a}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 uto}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 generated files}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid738226 . This works on file and pathnames. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 + the following would ignore all code in files ending in }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9049101\charrsid9049101 generated.cs}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 -excludebyfile}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid738226\charrsid738226 :}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 *\\}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid2177067 *.generated.cs}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +NOTE: Use with care as you could exclude a method which you should be testing; also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid5114927 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012143}\hich\af31502\dbch\af31501\loch\f31502 Shimming support}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid5114927\charrsid5114927 {\*\bkmkend _Toc442012143} +\par \ltrrow}\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 +\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\pard\plain \ltrpar\qj \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid5114927\yts28 \rtlch\fcs1 \af0\afs22\alang1025 +\ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 In comput +er programming, a shim is a small library that transparently intercepts API calls and changes the arguments passed, handles the operation itself, or redirects the operation elsewhere. Shims typically come about when the behavior of an API changes, thereby + +causing compatibility issues for older applications which still rely on the older functionality. In such cases, the older API can still be supported by a thin compatibility layer on top of the newer code. Web polyfills are a related concept. Shims can als +o be used for running programs on different software platforms than they were developed for. +\par - }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 HYPE +RLINK "http://en.wikipedia.org/wiki/Shim_%28computing%29" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7c00000068007400740070003a002f002f0065006e002e00770069006b006900700065006400690061002e006f00720067002f00770069006b0069002f005300680069006d005f0025003200380063006f006d007000 +7500740069006e0067002500320039000000795881f43b1d7f48af2c825dc485276300000000a5ab00000465a901000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid5114927\charrsid5114927 wikipedia}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 \cell }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 +\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 +\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\row }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5114927 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid5114927 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 Depending on the provider of the Shimming utility will determine on how the OpenCover will be used alongside it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid2243939\charrsid2243939 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012144}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Moles support +{\*\bkmkend _Toc442012144} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 To use Moles with OpenCover requires that you first inform Moles that you are using OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid5921453 Before you run moles you need to set an environment variable +\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 +set CLRMONITOR_EXTERNAL_PROFILERS=\{1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8\} +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 Then use OpenCover to run the moles runner +\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012145}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Fakes support +{\*\bkmkend _Toc442012145} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 OpenCover has support for }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 HYPERLINK "https://msdn.microsoft.com/en-us/library/hh549175.aspx" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 +{\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b86000000680074007400700073003a002f002f006d00730064006e002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f006c006900620072006100720079002f00 +680068003500340039003100370035002e0061007300700078000000795881f43b1d7f48af2c825dc485276300000000a5ab00003000000000eb08}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid2243939\charrsid2243939 Microsoft Fakes}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 just use OpenCover to execute vstest.cons +ole.exe and it will detect if the Microsoft Fakes profiler is going to be activated and it will do the rest. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid5921453 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 {\*\bkmkstart _Toc442012146}\hich\af31502\dbch\af31501\loch\f31502 TypeMock support +{\*\bkmkend _Toc442012146} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 The }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 developers}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 at TypeMock add}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 ed}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid5921453 OpenCover support several years ago; please review their documentation to get both TypeMock and OpenCover to work correctly with the versions you have installed. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8091909 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\bkmkstart _Toc442012147}\hich\af31502\dbch\af31501\loch\f31502 JustMock support +{\*\bkmkend _Toc442012147} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 The developers at JustMock have also added support for OpenCover; please review their }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 + HYPERLINK "http://www.telerik.com/help/justmock/integration-opencover.html" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9800000068007400740070003a002f002f007700770077002e00740065006c006500720069006b002e0063006f006d002f00680065006c0070002f006a007500730074006d006f0063006b002f0069006e0074006500 +670072006100740069006f006e002d006f00700065006e0063006f007600650072002e00680074006d006c000000795881f43b1d7f48af2c825dc485276300000000a5ab0000002f00000700}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid8091909\charrsid8091909 documentation}}} +\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 to get both JustMock and OpenCover to work correctly with the versions you have installed.}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid8091909\charrsid2243939 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 {\*\bkmkstart _Toc442012148}\hich\af31502\dbch\af31501\loch\f31502 Build system integration}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012148} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 It is not unexpected that OpenCover will be used in a build environment and that the build will be running under a system account under these scenarios it is recommended that you pre-register the prof +iler DLLs using the regsvr32 utility where applicable for your environment. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid1926955\charrsid1903893 regsvr32 x86\\OpenCover.Profiler.dll\line regsvr32 x64\\OpenCover.Profiler.dll +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 To assist your build environment when you install OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 using the MSI}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 it will store in the registry a lo +cation of the installation folder. The location in the registry depends on whether it is a single-user or}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 an}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 all-user installation and}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1903893 also}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 if you}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 are on a 32/64 bit environment. +\par See the following examples based on default settings:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012149}\hich\af31502\dbch\af31501\loch\f31502 all-users +\hich\af31502\dbch\af31501\loch\f31502 (32-bit){\*\bkmkend _Toc442012149} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012150}\hich\af31502\dbch\af31501\loch\f31502 all-users (64-bit) +{\*\bkmkend _Toc442012150} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\Wow6432Node\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES(X86)%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012151}\hich\af31502\dbch\af31501\loch\f31502 single-user{\*\bkmkend _Toc442012151} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKCU\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %LOCALAPPDATA%\\Apps\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 {\*\bkmkstart _Toc442012152}\hich\af31502\dbch\af31501\loch\f31502 Reporting{\*\bkmkend _Toc442012152} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7160127 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 It is recommended that ReportGenerator (also available on Nuget) is used to view the coverage results however if you want to make your own reporting then a sample XSLT has been made available by }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 Pavan Tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 (}{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 HYPERLINK "}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 +https://github.com/pawan52tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 " }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5a000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0070006100770061006e00350032007400690077006100720069000000795881f43b1d7f48af2c825dc4852763 +00000000a5ab0000006f000000005b5a088700ff00}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid7160127\charrsid2981254 https://github.com/pawan52tiwari}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 ). It is simple to use with the supplied powershell script. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid7160127\charrsid7160127 powershell -noexit -file ..\\..\\transform\\transform.ps1 -xsl ..\\..\\transform\\simple_report.xslt -xml opencovertests.xml -output simple_output.html +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 Feel free to extend it to your own requirements. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012153}\hich\af31502\dbch\af31501\loch\f31502 FAQ{\*\bkmkend _Toc442012153} +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 {\*\bkmkstart _Toc442012154}\hich\af31502\dbch\af31501\loch\f31502 Why do I have no results?}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkend _Toc442012154} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 There are two common reasons why this may happen.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid8847473 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 1) Instrumentation skipped due to filters. +\par The usual reason for no results}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 because OpenCover cannot locate the PDBs for assemblies that match the filters to be profiled i.e. gather c +overage results from. When each assembly is loaded the location and reason the assembly wasn\rquote t profiled is provided in the coverage results file e.g. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8852142 {\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 +\f2\fs14\insrsid8852142\charrsid8852142 \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 C:\\Personal\\opencover.git +\\working\\main\\bin\\Debug\\OpenCover.Test.dll\line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 OpenCover.Test\line \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid7372180 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 The two most common reasons}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8329235 provided}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 are }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter} +{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 . }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 is obviously connected to the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8852142\charrsid1510934 \endash filter:}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid8852142 argument and that the ModuleName was not matched}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid2827362\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 is usually because the PDB is not where the assembly is being loaded from}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 +. The most common reason is }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 due to }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 test tools such as NUnit or MSTest which copy the assembly under test to a new location}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid8329235 ; t}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 his can be corrected by either using the /no}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 shadow or /noisolation option. An alternative is to use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 +\i\insrsid8329235\charrsid1510934 \endash targetdir:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 argument to provide an alternative location for OpenCover to use.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 The other reasons are only applicable to classes and are related to the use of \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyattribute}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \i\insrsid8329235\charrsid1510934 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyfile:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 options. +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 2) Failure to register the profiler assemblies. +\par The profiler assemblies are COM objects and need to be registered in the Registry before the target process is run. +\par This can }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 usually }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 be solved in }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 one of }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 two ways}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid13596290 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid8847473\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid8847473 Use the }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8847473\charrsid1510934 \endash register[:user] }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 switch +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 b)\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 Pre-register the assemblies using the regsvr32 utility}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid5921453\charrsid5921453 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012155}\hich\af31502\dbch\af31501\loch\f31502 +All my tests are failing and I am getting MissingMethodException{\*\bkmkend _Toc442012155} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 This has been seen on a few systems}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6453762 where the following command has been executed to improve performance (or something similar)}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid14513928 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen install /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 The}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3490457 re}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 are two ways to fix or handle this issue +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid6453762\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid6453762 Undo the previous command - }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen uninstall /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 .}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 + +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 2)\tab}Use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid6453762\charrsid1510934 \endash oldstyle}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid6453762 switch, note however that this is not Silverlight friendly. }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762\charrsid6453762 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text; +\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; +\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; +\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; +\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; +\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; +\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; +\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; +\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; +\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; +\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; +\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; +\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; +\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; +\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; +\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000d03b +4506d45bd1010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000d03b4506d45bd101 +d03b4506d45bd101000000000000000000000000dc00c600d3004b00c000350050003100c600d400d200d600d1004400c2005900cd00d3004700c300490041003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000d03b4506d45b +d101d03b4506d45bd1010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 +2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 +0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b38314341 +364346322d444246332d344339422d423643342d3338393842373331413332307d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/readme.txt b/tests/CodeCoverage/OpenCover.4.6.519/readme.txt new file mode 100644 index 000000000..7e5988f73 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/readme.txt @@ -0,0 +1,21 @@ +Welcome to OpenCover. + +OpenCover is an open source (MIT licence) code coverage utility for all .NET +Frameworks (2 and above, including Silverlight). It can handle all .NET +languages as long as the compiled assemblies use the .NET Runtime. + +It is most commonly used to gather coverage data of code that is being +exercised by unit testing i.e. nunit, mstest etc. + +We recommend that you view the documents that have also been installed +alongside the utility to get started or you can look at the documentation +provided on the wiki https://github.com/OpenCover/opencover/wiki/Usage. + +Currently OpenCover has no visualization of its results and we recommend that +your use ReportGenerator (2.1.8 and above) to view the results against your code. + +A sample project showing a possible way to use OpenCover with ReportGenerator +has also been provided for your convenience. + +If you have any issues or feature requests with OpenCover please raise them +with the project owners on https://github.com/opencover/opencover. diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll new file mode 100644 index 0000000000000000000000000000000000000000..230786aa2498e16803f418a8d2c8a8a3bf349312 GIT binary patch literal 40448 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 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll new file mode 100644 index 0000000000000000000000000000000000000000..f2d05ec7ac96b4ad498e8edd3214379a08bb61ec GIT binary patch literal 109056 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 OTJMg-`82$=T)n$Y}m zgs%s-0%HR28d94v!c27~U=a2#4BX!X^4FWIfcXcEJ-n$2(8LSPYk+wLqp(7q12i$( zYJvGjtXnG7tAHlnK~<0Nk1#@m>NP+U@0wZ+xDDf!?`K?!5(hD=abg9C`!E>YriudM z%`$kSfr(!rB8)=@Cf?T90(bzU-NdhetO88}&{Q{Ibn_j$5x^uyH{J>aXsQ%Oxv6ea zmjUx3*aTDE3}~oZAsbWO0?2Eg8xj63Km$+mUWxE+fIN}!MEID%JJ2%TXzB($iCPw}O5PpsD(d4+Hk&8h;3$DL_;GfpH4(UgJK%DdPd)PXU_hkBmP? z_&z{W-H#nk6T2gS3it`*Q-FVBdx|0)e;qQZ#(KRI;US|NFlJl>%m|*LsDT950;WJ&qsBm4 zqcWhZ!Q0Hb0S|++MjZv^BAiY=g)x^0N<)P`5?uw?Mf_-3H1<>LZ|BrB?f% z!YEneyA0uW-$xN%=ld$)dS5p%m;0_kxWl*ISclV(r!Xfz2Fi8n&q29PJpsyf>MuaK zPECVyo%%8;xh^L68G1HVUMUgF#2JLG$_;Kzk;6^8ta{7e0Z{8|64{xAE#?tj() zhCdXj4eSqGABYD=1Fr?{41PNJ?cmwqyNcEn?Js&?(OpF+@r3<97cD8?T>MD!7mLl3 zqLS8Q$!GxaqM1$oTSu$BD7#YTMU05PFDfA_)S=s$WT`tKoy<8A!S zrn~YyxT^$L4f|Px&mw$Q!B<%WYt@ENJ3i~wTF}(NMjpm_sZ!@m{r#%-{bTFemPV%|{oig|Ul;ak6`$agC~H{(4$cz+!1 z3I4XnQ?Y1fG~T)`6CI5oNoNkV#*)eNpw(!0IGsr*hSaWfD&5)@A5J7y-$XVSA8qYQ zXW~{^b?i#V#*^_)s;B2b3izFgY)&1B=LYtTr&95Z>Wsxy&#rhb8jI$l{pmyT)ZR?` za3Y4J4DzW_D@pZaHG`P4a&C!c6T=>+dxma^59d@uicwn=!?{E{70pZxu5s&?Oo9aH zY%3ZX&m@M`j%fB^UpzM$Q5~A^rb7b*TcX2<@G9DEiFh)my3(U#iDWz@Iik6EtTTrf z)eep4>^8O{V=e)i*_3_p%;CgvJgZuVb7{6iTAFnmeK?vNkE{O7#P)dZY6;JhfZ7|S z^mFmd*7!&wm0*pP$fkc{EH2WUO;35c={;R(yParOS2~r8CQ?}~bi6@VcZi3xB?_ld z#ZvagN8*`yYB;V?)WLMjjdvf8r*fX`A|+28{WliRbfse$3G(jdE#rwKN3LZD`r}7)s&j0N z1@)&jiL%vWUwZgZ_B@8ARVVaho$)3GWaCLx;b<v9_GH|SVAw~KiT6|H92~>r8R$9cnM|gSK({j!T~Q35jPh`Hi*rLX zZ1LngYtbQmvK~hBNGw6H>?q3392g%(1-g$8$H!!(L&wn=OQjKl_^I3$ZXSP0pO5Vt zPf|&HQX^@*KepqA+0t|=h6VJb4r5S6Q#p%TY0Xm3$g(?qY(PSZ+=NOV%&H7N=`m!F zQz?kul1@VlQ?xFq==|z9g4>^s9*8?J<%Ig98Pq6?x{eN|p=WzzLpu_&SUj~ek&1)i zXgZsdI`pS4Q{oxGJ*jLiGcKmxGat2fVNRN54E0>)m`8USpz6dkQJQNJyx2UdXKqeP zm!&Sd(ud=_soy&QpJF@bvhV zF2al|`J^;r`XF>#=Dq0z^mcY^R4T5vB~mfkxNVvA=*~3Mj5A2m4lq?$U{*SLZ%q%2 zHYz7T?EZ|_$3EH(=?|#~V-WB7Xv)%?*>%Z|srXTdfo26(t9x_|dJ?k>NU~dpb#8Lo zn~5Jzq{nsh_l%4{>nZ-e^mqn#oD-PVO$#v`O~n%M8SpMG%v30(53JZsN1;@QjhZ(C zvlgw$)uxhhoL zXJH&vG!`4^OhuCu?~gn4E9_PZRy`Gi1;mV$iH}0h=TUibqRn*EW)oUS51Gumvxx-d zA<-H+my_1#9y&oZU2&MEu{0*HtR)wykSz>M*;yJF)sN{=W;NYkR^!+i9?9EMpC$3R z(w;BrIa0PIY?%d*bmvOeid&+wVj=@OMK={r#^*i_E>VTF;;@MJXXY- zR4EQ+g|&UR+;dq4=&FjP+Y%qa+Mw%TeE1OD5-ROLEKa`xO3r?Z538;5Wc&cfI|MXD z+aXebO*<5a8>5G$p0Y99lL+2f9Fyun@p$%$BJ0uP4g?wUp04wzTlM95wJ0nM=gedx zwg*nG*j0DpChaVBB4Vz>IMci>Nz6GIX;;N3#O2!?O=PfQ;n1fCW2uXW)^4jiuVv}R zz@+JwL3bvDNsO-7HLx45GuE?52|~>G_IOTIPkK;&2% zsy!(&PYPX1`-Gh?87T=mAX;~@CdC5jupU34ckJ38TatV9+5>St+(gh~!?J9)@@m8E ze&3NmdosfZ6T{J@)B`m}J83W_WDgXt5;^62)X2fHXsZaTn>|z(#zP~5^H50KlWsN0 zLt$a8GMsW}muWW=eQh`1%BO9c+rSQ}SuR88DKl?Ig@~ zqoc5*cV;37nXyyZR69#obod}Fz^p~SoyNtV7(anQ1)*6Sc0bQa^ROHX!hCUKaiP{(X0*dnoJ4uu|^zo9~gY6J}#U~314MTTgA zliw4bv;JoDrFkH6!mY!yy`j}a?HS`b&5B^{Hg_9Ir)2GwW!B0-+a>!GFo4n?%}0W= z@DpGUS82 zT+6uxn_>e4t5wIQH3I{~)*_%|Q)FNOi)nO4$EM`KfVFnl(@;-Lb)>SJ)(#9{Z)wwI z0|Q4g(Xll&^sec)7MZ%WnyIx+W!LVCrr^%R9Cqh%Jgwb^R*ymLu*mc>a}##Dyla@P z@uBep2jUsMwsH)%ZKSs*qS!yn<`To_^>aPN%;C%WqG{*NHMf!&EORT#?3N``7@d9N zWAyUko)LPU#@n?4zgCPLZgglrz_TW6wbx|7BEPo+9h*i62CztqV$8SMJl#%nR*jC- z&(k2gF~6c%o2s|fYfS_CXsOsP>Vd*nj zLMO?RjPwBL$dQ2Tpu-F^IN~yltX_x!FppzD#NG#PWudMCovVW95y|;9#K~p0zKhdSN_*|XHS#nH=f1p^YK=d+|B8%vrRq6H`iJ;2Z@d5*&aL^q)%bk4;1C>WP49x zj@M6Or>~?(k+n00a}Ml{W15U{Hg^bk_~J(NK8x#aq6RQ4?wUe%SeSXEZA?>&2rU{J zS9aL`*4_af4(-KSOUiEQOqHA@Rok*%2-{YJ7iw7hoyV$k!sBu&dAa#d48iI zF7EskZnDhB+B;eEQ}i~*dGOdWn1{{DuDr@|r<*c!>#z4toaRWXrv;MijWf612uXAz zOp%=;E)^v}jNJgCbt00YWyzptlg0`PmbE1_eE?;Yl9 z9f<=6;g{mnEva^x$CSrv15U%>mUyL*u?HsY|n_5rZ=B$R_>bC-ci{zj^jHy_;b_P zHmg4T!cVDU3hc~eq7zssM`N-{#EPP6I4p=C#Wt%PD0abejg4h6!`c3Uiplv0H{Dn< zyBZ>YC*rNHgVcl4nX$4Eurru>f}!_&yOL>a_F0+i2@X|QZtVi;)-90kvIWwuUm)Fv1=2+qNH?@V zy5R-V;V#aC`WG9S3!)oY7+u=}^{;J#`iHa71=X)@f%@0BK>cf5p#HTjQ2*K%sDEt> z)W5a`>R;Oe^{;J#`q#EV{cDTK4CnZE_FB|~kW&axJc_Gg@DH>4un5!8n0;j^t2*@l z>82ssR&*oSEp#Jmypc9}?>y2RB$Yp>{A~%AKA~%AqA~%AaA~!PRjSPDu*gkT} zuwmpzuw~>%uxaFt&1z9(R+A#L+7y}9sK~5VMP@ZCGOJyYSq;OF%zI0p)wIa0wng+l zMo)Ijgu8EHt)#6hO*)pyV*2$moh68f%zp6JFq7JQG~$z>>m7eqmV&r?1s}-@(p}<4 z5x;Ru3M>EUkep@p$tjjl&PQ9B#W{4g;?I-4$6jGc4YXp~p0M6yw|CF6$DrWR;Lgpk zTs9M5BbkoI2H^bb+aMCd0j&5n5`kAJ=N`CK0z$Zt@Qkq;kcqpQbW|se;BwUf*mLDQ zFqFX>_@J7F%gEl7+K*G+b?vy%9z$iY3$#B4$LE>^_FP0ts42g>{bB7uxHV?NPE^Kr zdxeq+YpcbH_t;gpb8t0aUvNPSW-;hvn_PlzXb0R%He-u!1(|rTdX33r2b}w`mY~L# zmdJEg?YuQ(*r^pGxspu2SZaq-V{70=mZlr%ckg3<0BPNjH%kauJY}_`4H2dy zY+FiS1wdimin(RW-mF|=mP@312`9HJcxA>G6_453QF12cDuj!3FAw9MRo@scb93<} zYaUnyIVkKvC%b2g^A@bMRObu@x+;kEI>9 z2@Jt^G(O<+@fXEd9$%>+-D#TxW@ zHg$Wl_M*??BX@Lhx{!=Qbo@?3%TfpQd4(>@qaH+9mr;}+@pcSG3mFgF)x()PdrdRw z9D)Ig^5UWQv;sM#4YLo=HO`(ZEe3nXhcFu}p8vWXVW0ov_)IP%yC-M(y;*%i(vjfl z862D(dXB+1+$nMH+igw9v)DG^Ts?tp6gekQ+oFji?~->8@m3ou%{Eb#az>}d;U7f3 zPQZY^;=+c?VA($J?v2V}=n+0y=OJho*5GaytB7v<3&-jsl@aBg;y8i8Y5>~z2x*6KR1PL^5W^?TOI zz9b+UuN)6<`Esuqn^(NB*om9)yh~s3y`u@9jb295R0~<|xhn~e@82!@8 zLS!|ULXgcZa$X^BgVbp^H`26c;W!ntxy|Vgr))Zm-9p4|P9kW@EsQA?j3Y9#zud{* zZKt$Ww z7-Jw4AF-~jE5l;5LorRyD294E~>8nbV#^JWouXfZi; z+Yc&8zsQYtop&}T*=x14Q_Ad4N1s&Jo?UK4-+p%EB-NKWP)(Z$`-gnE5z5>$77T%voNZ|Q;4;qor75;&uzIPos|PO z6R`Blp%7Y4to!WyGV7!>Fb=hy){QuTR(j*!D-V}Bx45(>k=C~Eo(6b=QEOEsbC+nU z*fX&w+B|W53?H)Yq^I@O^e)VQ+y_>>ASFC@(m4(9H^VS??I0#X+!2O-_6UQI zT_t5?;r;?ngQaaEBle;7{1ok# z`!I%GA9*swj=&V+KgXkER&~@~c`R{Yq$+U zZIdCxfXi6$E-zg-@fx97a(1G9NSG*3CQk-F42ssdYXWOBv(KG&=}Z3F2XRiLEUX%t zHvn}<{k#{7gmsX66oT9ji611-S;sW*mYkta>NK^}y@LG3}HPJ8$ipGIl^vk+W$=|^dE zd@5IqF(zIqyKXGW)dYy_g*Z$lZ}HkuUU1N|uoA4YJKRgzdY-^f&GoCUoqckO#z)ay zi>aqKu8!v7AY+__L5FP9E;cviadh2;u?g`nTo$BFB;oO-Q~Tn{=uruI)-2W%;~mVn zZlLpcw9D4I)@J2y#l3$nE~yQ6UHTI_Z&Pga);O<%$g_VgH$02&Ta6E1^xoZ!cUffd zjvE}&!MSh7b)jawjXH|=S>To#!u@#T1#iPg5!(ft7{W=1W*o6rrB?k0-f?piuphvu z6X{7%9>IGn4kJCIu+SBbNr|c2ag-L7QWBu#1tq4add+2p`VAEUx0U!_gYOolYTXoK zbUN_99TynGtkIAf$NM=Bpw8G!K^?Lva}?M#IJ0%`dIeGkW+%>yFLD~Z%C(2`|$c@wo(E^q+1Z*7XEM4;%L9PtqInZb+XQU=6 zq~l$vN?k;`q=Y9qkpp`I(-H7^++5_R>bC+jg3mB;SlR$TicbzNykXnz6jem2jsl}9 zStHhhGDt!es>)95Q)8eSCRGh-SvU6TZYS?H@Fq1i;Qgd4>jQ@@D9KM1T@8BbhAP?x zD$=Tw9>5&lE3gJ-_aTIhI$#dq%_8_Y*D9?Cr07J-0q|0ndU>`&KeT3T#rG&A!}us_ zO8ua$)T-_H)^ej{@MNBorxS5qBDH{N>dM*N_leXgPquhI_dZ}Vkaa@jg4(T}TmJmg z&r@mZ!#^2u0bZbL}-&JnaNgSW=C;+-vHPAj@aUX&W@Uqn5TF;RwfJE*aD zM81_ASHr-tEosoIWm?)CpQEA~%)bvGj#rUf8Kpw)mRJc(V9HUY0v*sc*nyH^@ZtzT z30Ju3&3OAnGfK15n(@{i>Zr@D6(zD)4j|`2=t;M_5vkN1$gpX4A8Y|1jz-oD^PM-9 zXZcp?%Q3_`j?~(@Wq8wV3)YJF4p9S~T-VReHCGR{-eD64<#MdK{o0CJv%k)l#`e*& zsQ3L>xO2p4tznPjp*CqbN6%6A0p6v?zM!V6#aiy(KH4gEjY9Tmv~~b*8KT9YrQeIT zjI;lj%}v=2-nLy6-Ce9HcA^woZt8Usc8K$kx=^R>k=}q~1uX3W^@n3vbk!=G@)(xZ z%uU$}$~h_Jnr}boId`c_9p5HpOHbEoOeb^;J1nS+HPV_iz7P3^faPeWgsfC6*Dj21?>y=J<$^Ae~sp*XH@19nOPFq0;(M5PtwB=0zIs))!NxRT&8o+C=?m&I zHJJW`jChM9>%qCn!C#^!asFIvfm;W4k*1x?V-8grYj+rO#`B)&VfHoklKLq)5w?OsI=BC2eabuUko4Fn(z7U4UFmud?}7htx#dwr5c0;? z%!#*IaaDLV#+345wk^@MZ-zgjDrxzs3mgT4DSS7+RbjKh_wda?g_m2H3y>da<@Cx{ zK-!c6Jf<2Q_j00t#r9^URpVZ*E~iCfe^EoAwUw>#fjIWqv+N61-wMexMvsL3s`VS= zzlgF1>mWHiwxSbj~_d1PP78d4(Kwt&lp z?kJ>9VY}whG;KqkDDuF~NBW%pgcfKGAYWBRuY{vs$Fv0YN*-0d-;#(G-}uXI@@(n# zf%`1KqsrSaoW&u%o?VV)wQu`ANSxBw^%;eSMX!Bs8|c&07qvZ!R=hHEKBqoV(e~JO zY{9%nX)kinfGl+OQv9O@rx!puaqghKz7(mP3u)h|7dfG$^>#g@OU2IN)ig-cUVf|P z-*X*c`Ts?0z%xQ$rHt*N$4tqo8tr|sukdsoG#qb*fM3HnG;A^ZnClRGZllzas4vFF zMRV6ZS@0c`+G05mE-{p-md@@?T5GP8oRW%K(aIQFtnxp!6X{-Z+M(;(iX{`1?QgGR zraO_7LJag7EO(k^fyDyO$Ajrt3#C2CHbNk+c(GtB27W8Tr05c1+XHH&2!`ED)0Gs8 zy`Z4#aKgO`{3g&GZ7NfE8R2TYw6G07Lc}H22B;rj7Pbbl81QTH!Z3vj&SY=OzH$QyuXGTi%@AIqt6yB1n3i1j+c!bxt;(d~g@9XP~ z@XdC3$)vjHGgTKKU-rab-t>*5yRJBTUH9So&Zl>*c&O*epRTRD{IeIVzy8=4&wc;- z8$bM|>t6cO9eclj%LkgaZy5Q~_kMWgy)~=u8H{&dIy(IHS0)U5;4+hr1`iE7me|vR7vkI^9H=9N%To`ON&2avuv)s6BPW@kN-FFgv=cmR0Rsc`QzdIUHD&9nZL(Cthia#g!6YZ7_Y1 z77Gpx^T*Lgp>Pg@3PD2bqhBE*LpR~i(5Bni@^Bu(9x5F>-3UW7EM!hX6%hW*LE;cP zO1d%Bx-$P*F{qLIaU*+NB&oc)&>IaEuds?kb?jgd z2Y=9svUNJ9D?>7=45-Emp(pvr0(MPk8}O@mx>-2}Bu_vGjuu%d`P*!o9zmT(osK!7 zDJS$+fgf^$<)QV#FlcI&d~7rjW3>UFRq*UDjL>lYtNMRwh2dMGDwg245SOT;VpnF+ zr`xF9_@Y>$3tBmx|GsZL1|xv0`*V^ z>`UE&FF+}YVGgP)QqX8SZ=pizf6tK$ZA0*!sO-7Q{EuKgn;L;I%PORQPa8{+{`10O zN=V?8z_-9$L~BVFy>Chf!{F-Tavb0}+V#dNRf;d5DLCj0j79!64tIQ+Wf&9rV^+$Pow79&hW3)`c=#fnHARqVCI+glYVls>XLNO}fp$$kZ-=Jepxf=@5i>9{ngM_`M< zUg?A5S{aTrlZ=2ChI)mQ&ND{k!+a?G)}wd{%YdFNBDydjiU8x?6P_%CrGOn);mMi; z7>Q5;`h2|%H%$x+9$wEr+DP@=2=iiwC!2H;;awq^s>*syjxbz3dNQ0h6^6TY>aOBI z0VdU+a8G4DO?fCJro2#8q09s`u~NG*Zy21TfTBUTlLCZBv{UCB>*@m#&I39HcFyXD zyDBG_VUn}6*e05m7AXQR5*-5@8tOYmlkWr@?L2V2R2m_#C($d;gO%WMBznW>$Xnnx~C60Q-o9Ly$_68M=)@cJWHOvrE{l$v<4HWtg@%PwqFhou!@aqL5ROYX# zoLpr&HN6~&lM%76Ok{WEzlRCX43^O5PPSkguQD*s5z>B8FB8Z?CwO>aqHTn!Z1hW2 zL$G<3lN*f?6`6r5OxJ>-F=SKF)r^OGZHqyb))?sNWG5>#*(q9y2y}6>b76A~UVL1@ zUJq#xVy$${@iLhV(UNW>+$6Pl)J!kzf9S#>(Jozy=JY<$bW?hLBJU~`A0_J!F&3JKP(N9U#tdWz_3OT92#pkddB+ZUr_R)w4FqNSaybaR^=fv>Uzj&Dt1 z#nJZ?7gx7ictQi(R|SeJe&TztvU_lYrru~V(O+)2Zm_uGTexm;%HL?E;9F8Qa%lif zYnSg9>$@l1UP>`zD8$(bdLTw+yrC;6qc)Q19E9jrO$j?H%Z%_=OyDZKqi_ZKB}6N} zqX^EKJaVq!OCRMla94pJ^JPV|A3cfnj^#Opw14Cxs+-ZdLg4yPp(-bri$sZ)M>(BT z9@P_xn8^IgjG!RY0?DWfTv@tIFLQ{G!lUu&0e+)DP!RM5efZ(vV3RKxgfgOMZw&@v z;_zd9{-zKs{U$x5$&Z@hwWjF*ar|rrB9)WJ@w*lX1mUeVh4_z>61q^Jz#20cuMsSg z{CbR4PTqxC0q!svA;|l`7iIa)$9(;wullMr2pw#S-@Z_mREc)Q| zCjgp)9Jq8F?h0b6L6mX&CgS@`0%o2Ne07LDobU;3WX~sR1HqjNwX)elcTjQ@6zfGag-sDdLRnO_Qa#@k+R(&8) z5Hiud7&2yveMt2@iRx*3l#VE;L?{gOtUjQ-ve#U~)#63)CgBj%7i17W4<0~*RB4I0 zt8_OxN?*WtrAr75Q>0OoPlhL-lvYkY$*Bwln|?T}NH50kWNhu;vVS}F)8KXkg9TNP zY~aN1q9(&L@xd43YKr>}yPzhf#Y0;1NQpI%!z^I(D3CQ4ryP+w7LfGpk0UAnruZxN zTx3GV4iU^2bsw`Al(7mEZ>{1i6pmn=plr*qhM}H7VYE48> z+Yxw^n1lsFw=vs&11@ZYbJFA)Ff4;~A{Y}ETMJu&g+he2iO{}1#!-8Yq1UuRp5x>N zUBeed--sn|QzLpqcWfs-3|a0@qu0b%kroPd?j8LO{En@=`ZvmT-B6_$v9x$DD1-Y9 zY{_$%1&TR-?S!Vv{EQoO(DMWAt226uB@7*k60GEGZrDsALyWTJfubPjD)Y~>e1|~B z=Q2zaFR(5cEZ~U%Cnn-#=Rv1!3{-GP2O*%l^#6HGthR|gu^C&q@@6^{y6r4zTcDa_ zALYTqiD`j@@u0<9Mj4_O4>5HT^KjN_Sn%m;)B4c_S+t@QFIJ#Xt3jYb(@U_$CI$)6 zkKG>p$*^IADjF9Bf)LTOLU9pcJ^oEDgE<2h6jg!1ymZlp2dGA0E1-cYfMutdxSn}n ziSYHcAa#h0^Uq==144Bex5%Dj?&k{qY+NyN;7fu5lV1|lGae_sl4f=v@c1tkW4K6@ zk_%_7=QRK4bg^hRN@&vFJ{Bu2kP(E1WfTpR9gT>B!Zh^iaJO_2ucZ0o_T6NeJ0X_Y6CwguqS&sUkk#KaR10>W?xq>t zO*0s#w0JGBhn&DF_>H#4i(n@PS~R&VfXGJjv1VC8tOWw*58eiLlBwz! zA-5h@GDCphU9i}tFseEkkVAlK27CjYjQv5(p35q4t`ve#0X8)PP_=HZq%25^WraVy z-y)QB)Qu_SfkKxvvblmeYYXNqH=!oa>Jr&{giukt9Tz!6GQ1yF7-MpBnan?^APNq0 zX1%$_2+7iv0T?+b2SeP;vGi-LS%zJ|kQ0OV$k~-z4-*&CYX+zt*PfDBV_=S|R5_eD zcQ#xL?Y7rg+=+xU$(bh+405|q*94>bF^F$$_UYk&^bm%3fc|5LFnZ4djl@QR?Epv2 zCi+#kL36lY_KGCdh+&isAlb9fSvVVV4~|12Vpc+LZmtiB)*?`ObCcb9i0RIg0JRzc zQHUliGehBOBaSg1<-EJC=9As<`*)5``D_ldEk0;#@eBP5c)NMT4 zv;J=L;og(F8rE_Eup75u`*0^`4{i+&;CnZI^Kp+*K3RYxH*m*%BXRp%|8^RjHDGm$ zBn#LIXn-rP7w}#*ZvgSafZV@C+H%Ro+f}@ol|?#l;#hb5gu`bGUI9}Bb<%f?c!y^` zr>_XjYP4JbYsd8q$N*O}nvhrDezb2l!Z4tX`hM^#(D9N4FK9GN$a`Ia82ezKH@RiV z;#WG$9G<)jp2D%ebFl)vcjJ=4VNmlHKd+Rqy~Dh$fWHp;6tJ=9}3XMU?BO* z_nH5GKP9^FF6W+m?z!ijd+ze&)n|T2XhH}Vz8`)l#65V@X9MYf2Yp`t8iE+b=(9w|RY^DH5dHF_2!VY1Xky7Hg{bBK zm8YGQAmU2kT|@DQ@zp6Z=5tsG|Cp@5D;X=3&fq4}E2}CtmomFcNWXRw0+exIZMu=- zPfUn&n+wH452c8qgeTX(y zxJ3-i$ZZh9!?~5<#?yrut|X5c+plVIH0@R68igO|7(cy;(eYYt1T*rgD~_&sEdzm8 z75_k)5ovLWlYki`7*Z`%^!ma|9F%w`O>0)8GgQlqc&P>uUcCUQfdb+Kg~QMht3;%p^y^$iwCXct+^eUaPwdsW`9N5c z%@54((bPB^^LkMg66N(7DNtlsA;fJg-o!ket3_O4m#nvc_9VcMu9x(hvKo3Etu*>* z!q6lgQFMd*aU!0eETpOR@i4V*)8JF}I5?^&P1WEC@Eq6T7PkW)`611U06J-E@j7~f z&Uigl*R^;QPpbg|QLkBzlx(749D+dNbaePQ#C%44JRW{CxzMyGAXedad?J#`Df=hk zVOlXtG-^g1gR3WN~g<0HgGH9mz(H1ugJW#FT_tf|PerXgsY)#b9{l$uTfFn9~CBm)V=QZppve#nO_ z6{`C{hXCotB#MS9i}T|tBonTNgc7xy5uG8Ht7E#zvZRVr&^G!8d1M*VC)LGgQ7d4d zBQMEXIqW2?vr(2*8&Ea}F_lA%GdkX)ir)YiWZxd2d9NZVM`S;8T|6xFo~Fz(am_-k8i8^_F*}`N7x9A zf3=Mu9bSZfz(jyoZ9tq-AguEc@kV`#kg6Njd?ZNcb)#Xk&(N&}NY4yPYORGxL|dK* z+rf92cpc*oYXV%r>P^*Z7Dm;ZGBs;4Ju#H(9*nUo8P*CNWKjA^n3kXn^5NC2cEqfu z2qNyp;;=go7-)#K43FeY!|J5s&dWTtw6M}k5H^62ylvcYe-h3dKZD-12(xo zh(b0UmC)jlFkQ1wrAjAj7Dmu(twIpd6E$Hyz8X=#YBCg(rz4sA6|m?ZM8O9K3lFQ! zhBW|D?Feqle|YzCUu2XN#LlI5 zY@@_7r3y4kb7V-3?jzB$tOH76}*n*f>mj;Riiw#uLP#d@o0L}zJ>Zju?p--^rqxDG@>!1T()&XdO zw>(2d+#&a*-7OnJ?#3;hP(y){AN9Q&>FVzjNLPQMDuTY0N4_JWYu?@Vkc{qW?hm@8XWaDZh_rA8Ae|7b(L^6RK@hsGvzob%x&@ zj36uENgAGb4*{A*x?H0~Bla-5wWSkE!IKINVItUok)Rrk z0Imnq)`cPvdn9eq=2m0UB#9$r<4MFMrC*1kmc;NtejVnSlMRFw>VWzGaXg_J_MA!N z{(Zho#Fen%g|Rb(>4K%e4dYAfuy!Cwt~I3e)SywnDQEw$K+X!^Bu&LwdXp*5kp3Yg zOot3iFu3C$BB9FLf%SrJdePkRc%&|aKD(-Cz-n(t>h&zK_jak*j<2(Al!Nnu3qxdk zCd3Dq7y=(aDfr;bSyl5=Ah8gx7EMb~51M{_y46Rd7=?dEXAtRnD%O`3O2Ey78PAvN7Fu0-Ge%=8ON*IK8}D^XS6eA)Afa)4q+_9fa3D~GfN z(}Srv*(zI0O|V&=N48;E1TjFt1qhNZyE?xVVgpsfp$tQuyxALDHI1JfWu$kDd;0B)+|S^Ny6 zILfn-o|Cl~KoPy|MKBna7XAtOF#GXHt~1!OS|29}BQYJuau`v+Y{O*JYK;)2EjVVQ zEjUK}6Ua_IjV9p}Kr3v)G2{xQV6d?bc&v-4c8|w87f?He@YPo!fL~JjuDK>fCW>#+#7_Jah-DE_H_^z>hqrh0NoK%!3%oJdVh`u#?9T zN+9Xq~i7 zT5Ut6HI|OtS@eKDsl0W9NjKC0$Dt9FSFdO{lvlKJ4xptu5WtlWxueZS$lcVOO2CN^ zAP>vkDf5`NsqHh-T9a0#o^Vazq z{9|d1xY`cW;K<1ex>BC2m`**UN1MGNy{S3ZMh=!f?>h)RayiP>+M5oJk0YsdnGKt< zFTuD>Xba(Lnth=z=R7~m8O-MS`!Tg*WpV`ylON-RCk|p0iFGy^p0J0f%t^~;o1XX_ zG@m%hQ;kE?p(kTNE3%r)AZ<oo-gwOWuNeqiugQQ^^BJ!~` zfk{YU?i3+ppPIcVs|(`QIeW+QYmegGLZm~MR*2_1AxJYZTG4`h?^ ze9p#m&C&5Nm~MT36do)!%6Kp)j0a9V)ANO+<6$t}`l5};%{CPKPq0lnsF zO6rkcoRf9zl3PF`1PBLzZbT*PCIo@Rc`$A_BL+|MYj{YSHcFb>%QQ*1h#?%e2tMa6 zRADgql8n?%dzfq;%^5~YFH9Kxr%s) z*B5_A(mqSYnm_(+K+AOv`3*hj3w^XP>Pj;)e2MvBqGsKJDyXW(7jP1k$|MW{O7C=% zi#UmCL6*XC##BwZVef}H@&^WEtk0o>k0bCWNdATq1Mlv_W0d@Tzsx&Q2reHZe;Rjb z^oXj`A++TWnr^#Z_Pkh;Kk`Xdp#L$Z>24;1+b?Urra21WH=&UxD}6;HiJha`mcDfX zI58IJCoG)TI+p_SH~ooDbe7yrboRS=$j-Ldf?aNlJ4@xGJF7J{l=c2nl%~ETHLT)z zmi0a)*7wM9kF@C6g%Sd*!jOA(=PoKYh|am~&UxLoDI<+`dg?M7bnBncB+UW3*aLhg z5I*p!4i(xk*vW~q7k8DBq8Dzv172)5@D@Jy^vSX&C)v7D24-D09JRnE@dUR$vP6gD z!eJ7xrehd%oLEK2JVJefME!ahHFb^`q)rbLt&$i?iVZ)?)VZro9X4QRxU0yGk;dh@Bo*k{NU`xJ_reTe*+A`OW}s%BK}a>P49U?N`0bi>ZZmr-VcBIQ;H8#j68_qLlh$)0KSMy z<0ht}+v*_tietTGlWu(<5LlZ&j7P(4j}f*088J9eP%$w}jh_nI;;Rr)ns7kV1y&{@ zS;TG-5E;B>u48L~V9*nRMO!H9O@zpiS1bDmz)b6n92!ZzMo3AfpjTo#;2W?2{}+__ z6IjALf{0JA!>QY&i19w!RvdyoMm1k~*=r_sQ=V@*>i~~9AxYb=LYySsGcCSW5>7Nh zUIdy8soumahz}T`!zp(e-h>ay(~(T7s!eH1t3&QsqNTlfgx5iuI1GI7NwLmQD;`gv z4VF@1lKcu0Z=X&yxx|3n3z~lbr3UlNZ_b0I6ec50?!|TllTg&*zLBt0R+dJ;vPOR}0YX{}LrbHY#0kj~q~H#@5g&#b$2BV@M-+HST< zsgnd2CSU~Qp08R5if96q`^$i(bMQ5=X{kzobn7WVjGqN_Ly<|ft?(1{DgJrW0rx>< zKUBz->YrGA8ii8|^ME`W|2K}GhIoS=??JrLj^j*zpvjJZ4)Jkz{OgDxXUFeCe7qh1 z3E~qt{y}7znzLIqF;+i9OY^=8$~~PXLiH$LKk{bbdm6rpU6L8R4b6jL4^*<=;6Z6< z#y%a5P9rv|X){>D<9u0qFVEOTpH+ne`t*a-qQuMo&Z`&|p_NuNF?G z9O#KR}#3HuEA%T5&lSTLpD_(oD%-lL@T{8i{fGsdR)6O=*Mp2Z`O=<`_5 zA%czmJwL^>vfbc8iqBc5HT!Wql5f@#7G}3OfUpnpQiGq5zx32ZdFEbeI_1~-*i5(n z9k3p0a6a?0*OSyej==#<(hdhiX++wb{B1dahWy-#h&zh&7Yy{geR8Lwa(Khgpgp(*|gU{-vbPRQF(7a_QH! zhV4wx&32Y~gK5lGUmgcu)66mdvJY@*?hpBs269e7&Py|dXvboa^oZuIk7HnN!k2W2 zJ~XaLq+7tb;tQyNVMSwA`(D^nLie0KC3t@Sf#P{LA`6#HY7vL6|144_OGW*HOAyE0 z^&(1A8Pfviy{SRd!q9nB{U*zd+=oBcPP|Md-7>*D^Qq=?>{qqo zVZ`=PnQj(eLEQQU0<`uj9unBFUZec~MBr=_wI5}hNVk3o2-xZI*z0~B(SQo$^DC;Q z#oxdqz8T#>*{=~#y$BB-``{4%@*0GB+9-bTvYa2d`IM`%3|`!MgHjVImjP^~wq4Kl*gaiC?JF(qY8m9X)%0El7a{mDIe!uA30Tc}i- z!@Y^LF1P+Wb-vvo_vl?XC3iU+^lwu$0h~j{5J|ck0x!=(;boLdr{vg1t1EX;uId2+2Z((&bWld*?DJf z*TlC$XB>3e_nP3>lTE;RNoDU^dj6GN?f5$cfkDyej2%Np``hOrkEaN1WwWAwI@{W) z>Q}j;(fdeo5no7g(p-38TTl~^kI{qSqfWK>Z-7dwGx7-h(^;7}cHIqriaAU>w@&MB zSd=1;DZqVVZwL>c#A|#hd8S-xvsJ=C22FN`t;Ye>(6Y#0rjzxSts2*C!BVgFMC`|J zMP|h1X_}?sR#RidZEsz{AHlgv3H8zBC-6vJj3L0W2t4qzUce%#IK3Ud%Hg@nduMY& zck#EVgWGloF(+ETLwqXMKxoS=6B^qFCN~+>3;$e(O8E7HraN_H|KuF>C7*7@)1X!_ zq{;xgJW`kb{C4o{B<9)gsd3HvFFXcoFfz#ob?|IFA&&vW`UA3c>yHRAxC}!hnH(>t z|3NSu2fN9DY5i#|p!F{2yhl|@N8REZX!B%l^9RU;pZsS${AS991%uC=1Yfq%n^2p) z8hdF0)f4rwC#G+)F#FluFr%%#QQT@N%r1A#u-->8hCCk9t-n$f8_>~KcpfL0VN~o6 z5JN&P>`=P^N7F*;-!La&6@w(t32I?MxdLdGbNyy9_bNFpT%t}|QYFYpR3te*1^7^B zR+N3+VRD7ZHqm~^sG9Ylqb;1h^&uDL?Lz1hhL#VK`tUp%b`)KcAAL4iP(8i_1@^JhV)R!Y!qTRU4Y_5> znOS)nJLZI`(K%s~{xb$2HwwvSOaKk8*_f8V1(#;wcBy^DdLpM4N*|~0q0|(wHU-jY zsmN>CY-xBTaD9sb8!Q)+4i+~-5D#fC{tM>f`P5d*Tkg+{C}63gr31A32-XkB4^y+> zvG5VlHxG=$Dh#6Soe!xNQFszWu4SOIJVdSRD?|cqcLN3v*>Qj;7tTJc35J7l6BQyg zp_&GqZPkoxo|71`k85D)74kxpd$7h?hKk7oA{Ym6Dhv6;8J;(FZpaPWe~MirKsCs_ z>4FS;seB0{L}Th?EO)*~IGPcuqsSCQeAG4$bCZo~$fdk+tJ%=7?}Qk#f| zYvVzRdO{{nvT6{`ZH}18twj`T_F%a7gD7l`Z3;t9eZrnQE8>jjZx`#ikavroJ8Mg0 zJVXfL09J$-g3!K7`fFKGh$XVX@sKp8L@~b8@STFZRb%oGAWh`oU6sEL2cze)g76t> zj-!oo{eg4fNe~RaYrzrJMPAIwA>cIl5S#I&k7|#>;l=xiEcJvhT}Pi67VnEyC7)QlkBCtl zxh>p-BUEZJ0s{8YxT(cDijwHtmneR9)5gO2&#BtfPp*6PinlLY+J3^^zwPH^KmE11b=#ufy}0`JmS4AwOZq;0<)-+@R$TS? z_isEm^3I8W-Sh6E4<8vnb>!KLzxvMNxl>w}{Z}FQ-ksYX>pb!Ir~PX7^8>NqE!wru z?)l;;Hh-b*=`SyB{Goek_o+)2*bMsk@!dJ6xutn_%j{Md7rGf-Lij)<#t<$^3k>TW z;}GvI6|(sqMS?gCz3VfOx3OESTp-^)IAO)cE@+_GjC399oUk-U7am4^AT!=GCf)4u zn8^N%GMf$>i3$h<(=ip#0>0D;rgAX}g#@}5U)UnLH%|A_s2a^{T-R+sDJ6Rp6$iz6 zfVrK+`w#}j>o}Xx#XH!Y3W~pq1|=$1DwKbg(gVoz5RZz_DYq!PctUvz;hP-3t8}22 zsZ!1gmEvb`ynrw&E>a2p3!Hy9hwpJ1)jEJ}nYJFTLceyQ)+0U#!lU9*?HS~FT~zmM z*DVOQyVh$_aS4ZCcQMTfu?OTLs@~!p&3zu)O}MG`l^mYO;Uye?1z}L!pxJ@T)!k~UN8-!uKLHTEL{3^sBVVZ+tt4aC0P3n=` za|@Og2@f3v?B;MkhYur+if263V!!qqZ&1wiE${`!dA=Up&bZWfy)P`jgD@&)`U%6; z{sVecObk-|k3ot@YlxF=HPp)O9DfXPUA)fWNwpMThcGH03=vn~2ocR~;RAY5EDx^_ z>*C2U!MubpDz1&J*Mj0tkpub(3UOW+2kQuaVm(p5qJCq&F80+E{O34)h{KwOmq1T@ z1HrU3Qn;*Xb5l_4YHC3K7n;7=^f~1r$aPRW#W`;_xyAwKxVZ>daM;V?$2t7sxE{!* z5TE3bBvZi+uutQ3!Od|6uFe*nQYuD;${sW+Wq@Opy4E98<2d!Uof^-n7kyObgM}r? zGyIhDW6zmVPX;L!fp##K5T&9xi>B1{D5b`UUZ&|y==a-VDs(L*9u^M)Vz2%+I0yH0 z_!x&j(!ZsJ#Lx6Qv~|N??}Ns=;fdaF0j3RcMRao9?Z4ZzZrJiaXoPTA><++R>i1#N zycRi%xQD}^a`-O8{3duP5E5$5GYH-O7cr;Z8yb&^>qnu<2ww_Ktqq9X*v9uHPtLaSf&x zAuee=SviE!xSmrZ;vM%K)hEmoWIat^pa#TvJJn!JgDmxNYDB#2`n^^oN|+)X%4)?m zoEi~dH;#9O#9>bTQu)03T~}C`G~L?mMZ_FV$@U`RR!$vg{3r8mSG{8bEmse+-j%No+sSn#4>XJPl4K-oRW0L#KL3+abM4d@yff9~MUGP= z;&$(o#tGs|PRSNd6suB|7N&@^N2LZhB_XGXBz8(1s;7#DoRWN*Dz1@bW;F0VJelk5 zR3dQ5m?mzuQ%g`57kAjHbtsFA2kg`~luZ|p+Nqr=n=XE2r#^+U8RB_6bv?>vh}SqJ z`I!&{Elim>6nN4|ifcG^t@w3df-fZ==F|b91}FHM#ks8nc|e?u)J$;)HeD#SF?g}B zMYLfirc{6MYG11ukSUgeS>jf^Y+cO)b(Z*TIkguPZ`&MM4`snQVwh7SVx;DH*Ieyl1DT)*kO_6Su<2q_P{3nkRZ`N(L>vYW6DgMTt{#92SVz zI5i@sYp(872aWCBg{@&@AGv#!ygmp+Nr1Nt_p7z@7bx}Ae9z3E+I$}?fQ4Z+l7m^5y6R2batdqJkBX;3(ga7$ugF@^Tb~{ zCCB|d@$9J*r{3^x-T7k4X_UG|tZF#3zF%CkT9)-Rr0etI4o+QSe!O8vy(R9kQ=e}* zAE`&})HhK!AfB{SkD+WpJa4CdjLWs9;5h~&i4k@l4Bd&-K-BgOn1n_kn zR%$tzzhh9T46ET~yT`&$cvNwLXEY_FTa-92^b(8=@8fuNi?Wq!nCdvSu87wI6v}vY zDElHqiBp!IT|@BItsEJbkkz%SF;iS}RkQI_=d1}i^f)lGMTz0awkkQ;BMv*X{daMR ztvcKuaq24KK90YIP_^ULkQ7(Nn{^dBD{+UDR9D7TA>&iAxKT&(jruh@hxToq(X1XR zC$8cxF53Il#Dn+-@cyg^-vGS72k{NS^L-HC0KCly@eN>&<-s?A@Iid(UjSaI2j2iZ zn+Nd?;0%HM91nX?9O$pLxYO~V@_TWC7^l83(&A%ktui9AYQ2&c zyVP;Y0dciDQGu0&hm{u3s`C(k1@U#_9rYB19&LqkC)cH%tx8thpzTJjf7JFW_lo

i7N)^{N$_t|2b)8Ztrn(NoSDE9w7kHMq9#XCor@9_fUO|ihs=Og~ zxqhttPF(BysWMO8fR)#Haj$E);!&P<9RlS)b-kf@xL-|5llxs|va-FA0gnj?#Zf0yy~8*Zc$EF+SN3|e^)Qy_&V{ne!n&%eycyC zrG?*kADlVGcu`A=6~&Xl-u?=8)vuJ!%d=u&!o9|GnEm&a^UX^bW#gvW_+rg{zcr6z*YN0E&;7cE z`!yu|{@u!6&bf_qu3`MQaerSB6H$6Gm)^~#)72Gz-Fr8e-ojy4+#c8s`J|D3fa}gv zn}cWh9Pk}BqQS)KoNl;=2pXHn(^mG#9l=BkjT&_Itor^f-c+_n* ze+FlE!Mi)CTwSv%_!`sm7Sr<<)38NFY4D)(e9fnWf8f%;a%oombIoH)TJ_dW3Z~UY zgnwoDgUa&SdxI{8bjq)gP7SH&);^|OpymN{fx4H&s}TAXk`3wW9aR3YmSpS!4xdJN zr+5jqhQvEmR|Gx%!vTreK{y zJRGl(rkn`c_SYtvwpXCoG=Pcv82i14Nk3p`E zkGzi^OOl6G3UP9kLj2#$wWf=KNR7IIO2ygSRxh`8r~0OHVQ2&3_lNFO4@Dj{atyOh zxa+1VIi;@dE$t=|tJ|&IBxWF-F6JQ|Q9J7<1xFxtzt>6(pHtS>nZX?BnH(Nbx75YM zB_&sPg)4`)TElzM*6Q%Z%3$5S%EijQx-4?2cUf^Musxv?m$Kr1#1DvI{a)o6^=k85 z;TK4@#S3b>{+aOQ>Oa)KFD_T_uK!i|74`Xgk_zJ68yx?gD!D{CS2Ab16eD_EzL=G1Rdpvp~hzMs`+(2i}w-l5POv6YKOQ;c^Tmq${AXhxL?bgUBFy2dpN%b`M-1Z z0CKuJi~MVSS+xGF?;^@~UxfTq^otnsa+LnkcR5Ob=KC7*59wb6Oq=mF(XH(@4x)6i z{~(t>f}Cf}M^GB_JOapzJx`$Y%l;?0^i`Dly|1ElGr~Q}<=!{MH_h+VBh*UuIEw@a zG-Z$SN57_YYo`V@h3MCmE0oIv9_5?b_v;aw_0bqZp1`Fi0RFz369BWNW;#lbk0R7& zMmvCEVWb14`w?EDgzLJH|Gj9Ja+h{{vShwU83G|E5hqENUgjB&Vx!*e+t=I}-iALh`bq?FA{R=HbyLVHh}?s~}8=RWAZ z&;5-1dG{UqkBvt>b-ojPZN9wkQ@&pYYJ(>Rmj+h``-A&}w+4R_d_DM^;NOB1YG&80 ztZA;@T>G)wZ0&bzpRWB~Z6eeex;FH5C?DP%zBc?%;U~f`hu;hTsP2Wj58?JJ@US#U z794$Xp)ZPU?ZyyyAQ)9oAfy&Z@K6Tz*)?ZGbwZwx*X{9$lGZAb0S+RJL+s11gqp|;Su zp}x=sIMQkiFA8r7ha;0CGa|pNd#7$`{b}{CVe)}};2n9s^yRHF^bLzE{(MdFl9+xg zru?~0@Ir1(-kDrJ8m@=)oE9kYUGQTco=r;DCst(gz3D=Krg{BfE>mn?ozCV<_@=jI zbJ@~Rb8jy9-++kKR^Dpv$n<1$qI;-V%JesPScQz}FZNi4Ty~qCS;4X#KQ@)wWfjgB z`OILckj{yPtF2zNev0U@^2Ka#rm(Sy^O)|EHLxpP>gglO1P5KKGo?POSH?N)=st1b zDf6~&?MV0ZWqRB5R(`188Z1h{gP?7LrHs>&^@I6R7QAsFyEBEI*`7>MH20LOg6PU;OWAZTdtpX& z0Tfuoj!bE*9qrti$(L59^Sx*S8(lJ&GusO|Y)bd`Zf(z}b3+$qWcNiuqUg#OONGIn zQr60^w|dSm9))wwPC;o?x{yt81Am;zvds1@k!9tp2Bx_KgHwf9IQ%KYI@K%Op`LW* zdo#O5dm*zrTPRqCDhx%D>lMY4=;r~k@l`6X8R)=E=MvLJnnq>*eQOO~)D-ZS+K?^s*_@zj2l$sqi)~Gp#s*b?| zl&C~FWkp7`EYp*NK<0OlqDgJzVU-|dW*3Duu(f+|8+=zlwFZTd0I^@?7UzQ)(3o%q)DUDo*x=*=87P*9em!I5eq98>y&LP!GclguNXurL(4J)5HIk5s8Yg1-EHLt$>vnD+jm;o-uB$C^ic8i!CY>6Hj}gM zHd99?J@4cf1%$k>J5z#Ml&26!RVs=hag@zB`o%d#F<8v>R-(l-viap!p}#1|B(V0| zgjY2)Dh}t6(}J`FQv>$I;!Jcm^Ve&Co{IN;*?sQ5=;P(k3!*%Yl}a zbj`N&$Y5@;Yz5?&2!cyN%c@L%N2!mA=l0kVj>U^LoITd};P9(Y>A-I1b&wQx?#7e>e?^w` zSA+E&SxyWdg^H}usEnN?W6Y;5xuBOR>?%4=9-~^CE=swDowst(Mxw(O zpe!boqgWR?tgxUN={eZezN#Y6JLD8&1_y`WEp+9#TMn)jxC}%-AovaTQ#E_quwez+ zBK*8Wmwc8*eH1g6Wr{t8?7(OfS|+xCz{pk7V z_+n}uBTw5ab^(@SjG7?F!BjkomnkQmD(8f?fvrDDVJ@@VHeA(0);-t*FS@v)uaGJB zS@0ww(BK>_wzQoK#{!&k{?@JJw>i2X7Ot{(m8&0Fx;oRF9qj)IfR))Dea9}QQ5;Kx zAelTOlOU@}VW?3V1Tlsj1{#}3aHFVVsL?qD(^Yg&-% zI0j{9>FGHZ2<0zN7mr%K%3-yAi{9R@?WbpUQKjx(SxC~+S{3a*J%jy&Im|8+NIFMF zOrLqo(}iMbW4_1A_wp(womehneM% zCeNZ+mSwjyT^Pceu%A~jMX{kUgkG^)LCuRLtK$90&O;F@`qniDq^#C3=60ik)ru`b zSAHk0)AA+9CUg}yWs6x_xAAmQHd{MrfXO$fsoY*do@&7WsjXbxT~2XhRp{7F9@84<6$L*=H^W)wHsC5%wIRo>Dg&&7 zM_^}gyEbBC4ThkK8+J|=U3N}Yjj}N-x4%9E3!djBqpwO+b;s6K0Gu3qIH;hbkdfw| zF-T%*Eheyp$l1;#*;FV3%p4|ohtpCTir~Q-IahQQB?rn$=m*vVF9;SCi zri4`j78Km`Q7Jj)Ba4b;!g1`dN`+%rm2#%ViYp6!vogi@T&}#nEAk}7?T~BD3vjtS z#q`}plLmR)_WE}$;S5-of@`wG{5AN6j zry3pv(^VN*-eIs8t<}`hq9?t>UfII0AxW^;E*l5nS7*uty^3Uku?{%1+WeP;Q=JR|*>swA{ejh`b#@+48z(P;L~Er%FWHn=D<$_Cg^ofozSXNs`wxL~L0+ z!-lqm#uy!%4DIbQ+K)T3-qN8p z*gGg-aUmdTM~5g26N=e%kScGZT_V{%Y5g4L6-O&0+|LqeBJFxC9n9uv6=OSY8)$o? zeSntCJYkl{cr|G?_+U#6ZMBdqZnJPqE)N~?2P+A=uSbbByJ)wuYpim>&d7xn!Pte) zxU%Au*_G+Fi>1H~Zi68}7i@a5nkkidAA#Mu;x=iLR8+b^{z zaKJdL2h8AADLI9Y%AhUX)!4MevV+}Nry|d8qY8@BZ=~8eiM2n|OR0X=#jX7k%hn!V zHuL;DCU3b|4iR$OIr97>8sBwFcssXF&^Ek@tRlrrbM{?lky*VbaM`_>As%mAS zz2i}yGI&l{hJA=^u6W9x*4Zs{md&2kmYUt!*_xU&Z(c{L?c}+0Qk}CpXSKDov@KiO zHg}&m@kA+VExS)@!DmiysulLK-}dGz{-JFG>0_C!78gmBbiXKd?3jw zEE@xR^KwJBbQDT3+uGaND2OF3Dc!zHp?qpGX15Wz-@f0;X5SH+F2u{c5<}N_=1G)$C0#5$2VjF%Y zrW!*tehE5@bHHAP#?F#h&ahNV;2jMMWhKUYsL?AtVRi8v_Shbv>rp_Iih1Utue8kxzZ0@)|lEv{}8CAo=meTo<=mU=wj|sD>PQbzoXSA{t*=g zw2=n=N8nko9R0|E+FsN@T3a!c6Gz5U1{&JeGTlU7f$RQ{F)Zj5J5gIw|37TKV=a1A zz?b?j`}jX@f6;obI|w}a|BL=_VhXYdxAA!YkK3QQ;V7f~5geagEveNK@ey@et4FvZ zLmyE?gFYR%f;rO(z6>&liPI%W0p7d|5ym{yWCbn+oM@2HE0I@(9+9q-wuu^<@AOhk zBKrHmEs_|VKmr=ecHkk~0Qk@b#71d;pcD592DvR*g-JAC+qpJL4axJU^2wDHS%D$^ zeIqHIW!fh%MGF=*XccghC21DxfuAJMwt8rzI^E5!?L;ZH1{$V}wt3Xo9FKkvUc(g1FH(MPIFFt5^$p&v=h*oD*Ws78ci)c;iGsVejRBYoEAvUgN zYKYGyQ`NFeT$EfVY&0@?N5goGb5tu5-U%z_ZU6qyUSE7eed;UcW;$o~_Z)h3=+N!GUwZuCT5h`X)xRve{fTe9U3>m} z<2o+AYZ0Up@vi8*6>`^F+D<45l2cl)bOHEJ8H_H6UF0Ay#E|t9SjC>T?ueL z!wt}NW~iNE!mWghYHy^-Izoe6Olo*;xRubM1o&-$py3LigZQHQP(}&20=vpc7lF&+ zb8y)TrE@{O8a{`p?>A$jKAZ+5x_t5&?h^N3})aR;o~MP*>`MK}`=2F`h;K zm`fpALi<9)BW`qT_;MqrAf$#wc=!P4eV*gjarhOGg}$n4FlgAE#g!`+pmxdyHmW*t z6pSUF)KgAy_-aKAU(SDZPP)-C9NiXUrM^t8H@n@wmxI4RSK5`yR%{s-{~PEE z4laMhXm<_JRt&4tLN>EA6B{U4v_%GAHO3cpVjBn*N^-O#I<1I5V^_kKMyx+Q6tn-h z9kv68Vm;U)E5IAjNeqU+yIT=-yFy-sDtpMz#ffHl!9yN_Cu2tfCS$hGyl7T)Yb#zj zZ%M}No!&+E9j9b$?clatwg=lDeB!x?4!_~WDPsA?Vum?jFBz)*`{wc$s8|VmS=94v zKe~*L_rT!?8*qebU(|vh3JDngXLRQ=6+eTcLs&?*LhUSSt)WgH#V10L&EcoQtx`H5 zp`Ex^$2q1`ouncnHDs>WP?7x%Lfcq%;n9EVSF zJHz(lx%$xX&xk_j>9M7E_$i=)_|lW)e)y?!$#ZrIo?P;rmsNE56*Nvjgb`#o7=1Af z)&G-a*_2W|{G1=07`{o?zp0G*CL1%JjQJ)5ir~XXgF!o45wkjR!kQ_7&2+HOW5inu zF{?m=2La0sLBO0lV6kio5_O6q=COeDi1nq5u{41Bs68fY@9MKK;yda1GnPd$-;s!s zJfM1wVVdUn@M;d(2h*1ub5*vmVq{`CdAR}n#4l;U5 zX<)-c$*=)IA#+oa2paxSCw};11+L%ZuzeZZW|jJ4J#;8vjN#O$4_zXa%RvmGktCLK z|Eqb_A$(l!C{0JNE>Q4C3h8f6+FIX>4Pl8@!f@|nI0294_zb<=7%t_Y<#e9@DrH}~ zfX%g-l|MrGXZF(;Hog^QATv7rR4`~ulM#ch3Jw2x0JlJSOP~mJ7}Ngp5qpgGXp6~M zrg=v*2379J$q@so8QiU+6|wC8@x`sjlMnz1%kX0X^=~~ME)`xWU!Nh|75OQ~iWXAo z5@lrzvgO!zTm>T=XXWYMAQs@@8_h|<;1WeNtw(#PJt~P{n*fsZNpAJtgOsNUt!H@{C8y`FF5qYF*=wGIqJm? zjvmq*{16V22sbT`8IPuDyrm${=-M8`Wk|`q0xk_n47|TLx(y)0^|#)bHCUo6q|9w< z9e1yA0EQ8y(M!wwmc3|i@kcQ=#!PLU&*w0-)rBc$CrSF2hZq|m*gb?G z3|WH(+1ps3eVc4Z&QraE&>!5tK}T_+qB%zUuXNJ|6CV+T9pVf!Ak$Jacy{B=UXq{{us}$cKY+QwuU+ug>N2WpkZyDoqDR8j^WR&rgJd2@}6u=T3=R39G1hVp-L4x z+rUHW*paZWGx89iaTk6iLy$8$(nPM7;W9(}NPC20hUeB9hDlBwvkLQWX!wax`#8f( zc_6+}VW1ty*ha;%PA^Yu&IAQkz(F{+_Do{!nKj1n@J=Yq0d9KogwhQ! zFqhp96N9nu=kc=bNx`;A7=Y~gnONs;KHrGRPM~q}5l1G|O2~;VQoVK_`HcoS@z0U* zXCM>PW<=CR@B<-OG>lA#yN?+uA|i^LAm`eEi&R=!(9(!pKaZ>pbUdp(1zAP*W2gaD z31D8Xm$P#Hgz=6yQx6j0{oz4oroKi_-kcbIYQp$h_^czXL6tK`S|^NmT)2@|>B7;I zYL2ur=sX8>UKQv(8x&6lokygslccPp84${~2;LLOlVql3S!%*~_Nn$EH|DM^l!6}e zG~r-{>#^PohU-Isp!V$CMIOTylzCn!Z}>5yufNI|be^k-v*Z;3+vM0cY%}EOSoT#C z>G8mv^=9x=1(rmB#caxp0Cvbo5YBQgo}2^Cw_jwykf#-Kc4gK84qISQpH@WWCh*<^ zO;T6|70W)B(_F8#2FGZ@rH4n_UHXJ@y{1nv@ePu{J<=(c3H9JREfDyLg#>=02tl}> zjb^>ufVc6SW+*1I$sh3>khCF)P?r)OqN=ap$>WWjh(HdPkb659Xomc>?yR@rg2)|y zuADTT21}D&> zm%6l$o&-Q$8VWB$mxAF%evG@FAEeb0R4Hh>paj8jG$WJE9}10Z!3v+cf*8Byb^$HI zUZG4aT+pn-k%B6U?VYRu%pL^ftW3sW*=afr_u= znnVruE9yfd=Tv1eXE1Gzq^mM(P@%dWk=aD_V)+-Lby!T9!03FmG(%M~7Byp#$g*?F zW!0_1l0+0k4%`qJieV<5!DwN)r3ILa!H0Zh!b4H4UeG6$$&z}e8RgKykt{f47#KZp z!-OVs**Zc!(hn(&0i-_&&IZFgG@*W6?2tR z$c7AzU|o&zH7N;E<$RJ*LvGiApt|*(%L%T@dww!SB0;))V{x3 zY_GnCDTY6beUmF$i*4<-7nWsLN4hn<=A>m7x!^_T(h$62o~+B)iJGxZLgoV#cz+tx zL>8Kl?U!s1x#hgQf^C`V$px-DmVoeDu{tTiJtc2+_!7`G>?{$<0970>rlV|_`f*wr z+rckcVX;UX8PYA`#Q?nsMvfX2Ld{yz_hRZn5{!||*iP4Ib7L9-9jYEMrT21pvFZGZ zp&fZ*u}ejnGuN#)9p7y=e76AmZZK6+q*t5a)ugRZ&($Q=ka9p_0)!mY&oS`!-dx(M zTg^VS8j#Ae+6*9unMbXdA+sq0iAT9m0|66)7=Q>v z5JUR{*jEdPln1IyB)h9KUktB%VNf_^a)78}aXKFHUn$#i=~%;s10w z<+03+q3TGN5S}fKyAU0UIAsGlN%AHG_8I6B5s8%4BU&%;DmB)RE1z;t01AKxc)P=K zlO-#cDq_*mk@2eG@4?lHUqsnr4YKN`2L`ZzM2h3MX}pXkWpFa^j+CU%@#|nBNcAp* z>V1Mqv7L1&sPqVE#SJI5=X|KDyrmP1r?DvALE1}iWb&R9c33gk(``F|y->{g=(hAH zc*y|sVDGnlq%+I6X`@?gBm@fkRHI@xbk%o+_|=P6_pi=7}tDy z=Z5lLYtq?4r624>&0t-*h+gW-rH5!CSxa?d<&xMO{KlT??8gfHh=&+Ymm^cO5QgJz z-(GN*{Wt}juZX$jYY4G;$Mo2&mX^7xSun-1)3M2y%Ozu7`JQHW+R51Q`=A!y-4pm3 zS${PMegpPvEMpuzP4QSIT^)P43Qh>T*HBoN%h8Lr@*UYshTpQK8Xry(u_e`2|C>1d z_MxD^r!zbnkeH9P^-=N(ZY92(AI9JR)+i-E_h@qv*(ADgFJTkTC)Xp^CDz~;#a28| z$E}Dp4EUhyHy_YOlFwE!=LwzXj|-txJv#%BW%y$KhtsbD@MQVik!}-g$7vaTP83vY z1E2iS8DI{Obh1gOlJawhs}Zzfamwd|bUL`>D470$h86VM`8NmWaP)I?8}K%{!somF zd@4-mrWjB@L!~pi6yWF#Se`gijN)|So5N{r3}y1%c!sffp#JvI9SD3D;@xiS``esY1}M6rLU%yurbngUbPi27Q;2W zVmv5Dy@(x?k8)J#gt&+0r24iBo%hrD4sgHM*zHT&@x~uhPn>l|>wl~NZ9F#een~G* whUsj5>c4$9R81c8Q-3^1DHgqevF<7iN% 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 dcQ~f^cj_Ex&Hq%`#-4${vTJ~v8ez6 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll new file mode 100644 index 0000000000000000000000000000000000000000..bf3acf1795f96526cf4c86b1cb18d1cacfb9dd79 GIT binary patch literal 280576 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 N(3l^$;op`5{~x`C!AAf9 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1c416d5314029b540c5720c85122dd8fec09f5a GIT binary patch literal 80384 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 cfJf}V$Db + + +

+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll new file mode 100644 index 0000000000000000000000000000000000000000..cb691377e090bc944deb1dfcd219763c23985093 GIT binary patch literal 11264 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 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..1accffc18dd5a1b62ef223bcffabc9cb156b3d64 GIT binary patch literal 151040 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 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config new file mode 100644 index 000000000..d6c61f707 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config @@ -0,0 +1,39 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..47cd9ad41bd21c765693ef396831e01a13f80f8f GIT binary patch literal 301056 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 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt b/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt new file mode 100644 index 000000000..e8367515a --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt @@ -0,0 +1,332 @@ + + + + + + + + + +

Code Coverage Report

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Generated on: + + +
+ Parser: + + Pawan Tiwari's Parser +
+ Assemblies: + + +
+ Files: + + +
+ Coverage: + + % +
+ Covered lines: + + +
+ UnCovered lines: + + +
+ Coverable lines: + + +
+ Total lines: + + Yet To be discovered + +
+

+ Assemblies +

+

+ Collapse all classes | Expand all classes +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Details +
+ + + + + + + + + + + + + + + + + + + + + +
+ Classes: + + +
+ Covered lines: + + +
+ Coverable lines: + + +
+ Coverage: + + + + % + + + 0 + + +
+
+
+ + % + + + + + + + + +
+   + +   +
+
+

+ Class Name: +

+
+ % + + + + + + + +
+   + +   +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class: + + +
+ Assembly: + + +
+ File(s): + + + + + + + +
+ Coverage: + + + % +
+ Covered lines: + + +
+ Coverable lines: + + +
+ Total lines: + + 51 +
+
+ + + + + + + + + + + + + + + + + +
+ Method + + Cyclomatic Complexity + + Sequence Coverage + + Branch Coverage + + Static Method +
+ + + + + + + + + + +
+
+ + + diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 b/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 new file mode 100644 index 000000000..72008aafa --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 @@ -0,0 +1,17 @@ +[CmdletBinding()] +Param( + [Parameter(Mandatory=$True,Position=1)] + [string]$xsl, + + [Parameter(Mandatory=$True)] + [string]$xml, + + [Parameter(Mandatory=$True)] + [string]$output +) + +$xslt = New-Object System.Xml.Xsl.XslCompiledTransform; +$xslt.Load($xsl); +$xslt.Transform($xml, $output); + +Write-Host "The file has been transformed." diff --git a/tests/CodeCoverage/packages.config b/tests/CodeCoverage/packages.config new file mode 100644 index 000000000..973b7f81b --- /dev/null +++ b/tests/CodeCoverage/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs new file mode 100644 index 000000000..b6dd64511 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -0,0 +1,192 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests.Numerics +{ + using System; + using System.Globalization; + using System.Numerics; + using System.Reflection; + using Xunit; + + public class PointFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(PointF.Empty, new PointF()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(0.0, 0.0)] + public void NonDefaultConstructorTest(float x, float y) + { + var p1 = new PointF(x, y); + + Assert.Equal(x, p1.X); + Assert.Equal(y, p1.Y); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(PointF.Empty.IsEmpty); + Assert.True(new PointF().IsEmpty); + Assert.True(new PointF(0, 0).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + public void IsEmptyRandomTest(float x, float y) + { + Assert.False(new PointF(x, y).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void CoordinatesTest(float x, float y) + { + var p = new PointF(x, y); + Assert.Equal(x, p.X); + Assert.Equal(y, p.Y); + + p.X = 10; + Assert.Equal(10, p.X); + + p.Y = -10.123f; + Assert.Equal(-10.123, p.Y, 3); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, int.MaxValue, int.MinValue)] + [InlineData(float.MinValue, float.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(0, 0, 0, 0)] + public void ArithmeticTestWithSize(float x, float y, int x1, int y1) + { + var p = new PointF(x, y); + var s = new Size(x1, y1); + + var addExpected = new PointF(x + x1, y + y1); + var subExpected = new PointF(x - x1, y - y1); + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, PointF.Add(p, s)); + Assert.Equal(subExpected, PointF.Subtract(p, s)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTestWithSizeF(float x, float y) + { + var p = new PointF(x, y); + var s = new SizeF(y, x); + + var addExpected = new PointF(x + y, y + x); + var subExpected = new PointF(x - y, y - x); + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, PointF.Add(p, s)); + Assert.Equal(subExpected, PointF.Subtract(p, s)); + } + + [Fact] + public void RotateTest() + { + var p = new PointF(13, 17); + Matrix matrix = Matrix.CreateRotationDegrees(45, PointF.Empty); + + var pout = PointF.Rotate(p, matrix); + + Assert.Equal(new PointF(-2.82842732F, 21.2132034F), pout); + } + + [Fact] + public void SkewTest() + { + var p = new PointF(13, 17); + Matrix matrix = Matrix.CreateSkewDegrees(45, 45, PointF.Empty); + + var pout = PointF.Skew(p, matrix); + Assert.Equal(new PointF(30, 30), pout); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(float x, float y) + { + var pLeft = new PointF(x, y); + var pRight = new PointF(y, x); + + if (x == y) + { + Assert.True(pLeft == pRight); + Assert.False(pLeft != pRight); + Assert.True(pLeft.Equals(pRight)); + Assert.True(pLeft.Equals((object)pRight)); + Assert.Equal(pLeft.GetHashCode(), pRight.GetHashCode()); + return; + } + + Assert.True(pLeft != pRight); + Assert.False(pLeft == pRight); + Assert.False(pLeft.Equals(pRight)); + Assert.False(pLeft.Equals((object)pRight)); + } + + [Fact] + public static void EqualityTest_NotPointF() + { + var point = new PointF(0, 0); + Assert.False(point.Equals(null)); + Assert.False(point.Equals(0)); + + // If PointF implements IEquatable (e.g. in .NET Core), then structs that are implicitly + // convertible to var can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToPointF = typeof(IEquatable).IsAssignableFrom(point.GetType()); + Assert.Equal(expectsImplicitCastToPointF, point.Equals(new Point(0, 0))); + + Assert.False(point.Equals((object)new Point(0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var point = new PointF(10, 10); + Assert.Equal(point.GetHashCode(), new PointF(10, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new PointF(20, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new PointF(10, 20).GetHashCode()); + } + + [Fact] + public void ToStringTest() + { + var p = new PointF(5.1F, -5.123F); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "PointF [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); + } + + [Fact] + public void ToStringEmptyTest() + { + var p = new PointF(0, 0); + Assert.Equal("PointF [ Empty ]", p.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Primitives.Tests/PointTests.cs new file mode 100644 index 000000000..150e21987 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/PointTests.cs @@ -0,0 +1,252 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System.Globalization; + using System.Numerics; + + using Xunit; + + public class PointTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Point.Empty, new Point()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(new Size(x, y)); + + Assert.Equal(p1, p2); + } + + [Theory] + [InlineData(int.MaxValue)] + [InlineData(int.MinValue)] + [InlineData(0)] + public void SingleIntConstructorTest(int x) + { + var p1 = new Point(x); + var p2 = new Point(unchecked((short)(x & 0xFFFF)), unchecked((short)((x >> 16) & 0xFFFF))); + + Assert.Equal(p1, p2); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(Point.Empty.IsEmpty); + Assert.True(new Point().IsEmpty); + Assert.True(new Point(0, 0).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + public void IsEmptyRandomTest(int x, int y) + { + Assert.False(new Point(x, y).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void CoordinatesTest(int x, int y) + { + var p = new Point(x, y); + Assert.Equal(x, p.X); + Assert.Equal(y, p.Y); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void PointFConversionTest(int x, int y) + { + PointF p = new Point(x, y); + Assert.Equal(new PointF(x, y), p); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void SizeConversionTest(int x, int y) + { + var sz = (Size)new Point(x, y); + Assert.Equal(new Size(x, y), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(int x, int y) + { + Point addExpected, subExpected, p = new Point(x, y); + var s = new Size(y, x); + + unchecked + { + addExpected = new Point(x + y, y + x); + subExpected = new Point(x - y, y - x); + } + + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, Point.Add(p, s)); + Assert.Equal(subExpected, Point.Subtract(p, s)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void PointFMathematicalTest(float x, float y) + { + var pf = new PointF(x, y); + Point pCeiling, pTruncate, pRound; + + unchecked + { + pCeiling = new Point((int)MathF.Ceiling(x), (int)MathF.Ceiling(y)); + pTruncate = new Point((int)x, (int)y); + pRound = new Point((int)MathF.Round(x), (int)MathF.Round(y)); + } + + Assert.Equal(pCeiling, Point.Ceiling(pf)); + Assert.Equal(pRound, Point.Round(pf)); + Assert.Equal(pTruncate, (Point)pf); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void OffsetTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(y, x); + + p1.Offset(p2); + + Assert.Equal(unchecked(p2.X + p2.Y), p1.X); + Assert.Equal(p1.X, p1.Y); + + p2.Offset(x, y); + Assert.Equal(p1, p2); + } + + [Fact] + public void RotateTest() + { + var p = new Point(13, 17); + Matrix matrix = Matrix.CreateRotationDegrees(45, Point.Empty); + + var pout = Point.Rotate(p, matrix); + + Assert.Equal(new Point(-3, 21), pout); + } + + [Fact] + public void SkewTest() + { + var p = new Point(13, 17); + Matrix3x2 matrix = Matrix.CreateSkewDegrees(45, 45, Point.Empty); + + var pout = Point.Skew(p, matrix); + Assert.Equal(new Point(30, 30), pout); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(x / 2 - 1, y / 2 - 1); + var p3 = new Point(x, y); + + Assert.True(p1 == p3); + Assert.True(p1 != p2); + Assert.True(p2 != p3); + + Assert.True(p1.Equals(p3)); + Assert.False(p1.Equals(p2)); + Assert.False(p2.Equals(p3)); + + Assert.True(p1.Equals((object)p3)); + Assert.False(p1.Equals((object)p2)); + Assert.False(p2.Equals((object)p3)); + + Assert.Equal(p1.GetHashCode(), p3.GetHashCode()); + } + + [Fact] + public static void EqualityTest_NotPoint() + { + var point = new Point(0, 0); + Assert.False(point.Equals(null)); + Assert.False(point.Equals(0)); + Assert.False(point.Equals(new PointF(0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var point = new Point(10, 10); + Assert.Equal(point.GetHashCode(), new Point(10, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new Point(20, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new Point(10, 20).GetHashCode()); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(1, -2, 3, -4)] + public void ConversionTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + RectangleF rectF = rect; + Assert.Equal(x, rectF.X); + Assert.Equal(y, rectF.Y); + Assert.Equal(width, rectF.Width); + Assert.Equal(height, rectF.Height); + } + + [Fact] + public void ToStringTest() + { + var p = new Point(5, -5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Point [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); + } + + [Fact] + public void ToStringEmptyTest() + { + var p = new Point(0, 0); + Assert.Equal("Point [ Empty ]", p.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RationalTests.cs b/tests/SixLabors.Primitives.Tests/RationalTests.cs new file mode 100644 index 000000000..e59505cf5 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RationalTests.cs @@ -0,0 +1,115 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using Xunit; + + /// + /// Tests the struct. + /// + public class RationalTests + { + /// + /// Tests the equality operators for equality. + /// + [Fact] + public void AreEqual() + { + Rational r1 = new Rational(3, 2); + Rational r2 = new Rational(3, 2); + + Assert.Equal(r1, r2); + Assert.True(r1 == r2); + + Rational r3 = new Rational(7.55); + Rational r4 = new Rational(755, 100); + Rational r5 = new Rational(151, 20); + + Assert.Equal(r3, r4); + Assert.Equal(r4, r5); + } + + /// + /// Tests the equality operators for inequality. + /// + [Fact] + public void AreNotEqual() + { + Rational first = new Rational(0, 100); + Rational second = new Rational(100, 100); + + Assert.NotEqual(first, second); + Assert.True(first != second); + } + + /// + /// Tests whether the Rational constructor correctly assign properties. + /// + [Fact] + public void ConstructorAssignsProperties() + { + Rational rational = new Rational(7, 55); + Assert.Equal(7U, rational.Numerator); + Assert.Equal(55U, rational.Denominator); + + rational = new Rational(755, 100); + Assert.Equal(151U, rational.Numerator); + Assert.Equal(20U, rational.Denominator); + + rational = new Rational(755, 100, false); + Assert.Equal(755U, rational.Numerator); + Assert.Equal(100U, rational.Denominator); + + rational = new Rational(-7.55); + Assert.Equal(151U, rational.Numerator); + Assert.Equal(20U, rational.Denominator); + + rational = new Rational(7); + Assert.Equal(7U, rational.Numerator); + Assert.Equal(1U, rational.Denominator); + } + + [Fact] + public void Fraction() + { + Rational first = new Rational(1.0 / 1600); + Rational second = new Rational(1.0 / 1600, true); + Assert.False(first.Equals(second)); + } + + [Fact] + public void ToDouble() + { + Rational rational = new Rational(0, 0); + Assert.Equal(double.NaN, rational.ToDouble()); + + rational = new Rational(2, 0); + Assert.Equal(double.PositiveInfinity, rational.ToDouble()); + } + + [Fact] + public void ToStringRepresention() + { + Rational rational = new Rational(0, 0); + Assert.Equal("[ Indeterminate ]", rational.ToString()); + + rational = new Rational(double.PositiveInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new Rational(double.NegativeInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new Rational(0, 1); + Assert.Equal("0", rational.ToString()); + + rational = new Rational(2, 1); + Assert.Equal("2", rational.ToString()); + + rational = new Rational(1, 2); + Assert.Equal("1/2", rational.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RectangleFTests.cs b/tests/SixLabors.Primitives.Tests/RectangleFTests.cs new file mode 100644 index 000000000..4dc7d9d35 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RectangleFTests.cs @@ -0,0 +1,267 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + using System.Reflection; + + using Xunit; + + /// + /// Tests the struct. + /// + public class RectangleFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(RectangleF.Empty, new RectangleF()); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void NonDefaultConstructorTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var p = new PointF(x, y); + var s = new SizeF(width, height); + var rect2 = new RectangleF(p, s); + + Assert.Equal(rect1, rect2); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void FromLTRBTest(float left, float top, float right, float bottom) + { + var expected = new RectangleF(left, top, right - left, bottom - top); + var actual = RectangleF.FromLTRB(left, top, right, bottom); + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void DimensionsTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + var p = new PointF(x, y); + var s = new SizeF(width, height); + + Assert.Equal(p, rect.Location); + Assert.Equal(s, rect.Size); + Assert.Equal(x, rect.X); + Assert.Equal(y, rect.Y); + Assert.Equal(width, rect.Width); + Assert.Equal(height, rect.Height); + Assert.Equal(x, rect.Left); + Assert.Equal(y, rect.Top); + Assert.Equal(x + width, rect.Right); + Assert.Equal(y + height, rect.Bottom); + } + + [Fact] + public void IsEmptyTest() + { + Assert.True(RectangleF.Empty.IsEmpty); + Assert.True(new RectangleF().IsEmpty); + Assert.True(new RectangleF(1, -2, -10, 10).IsEmpty); + Assert.True(new RectangleF(1, -2, 10, -10).IsEmpty); + Assert.True(new RectangleF(1, -2, 0, 0).IsEmpty); + + Assert.False(new RectangleF(0, 0, 10, 10).IsEmpty); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(float.MaxValue, float.MinValue)] + public static void LocationSetTest(float x, float y) + { + var point = new PointF(x, y); + var rect = new RectangleF(10, 10, 10, 10) { Location = point }; + Assert.Equal(point, rect.Location); + Assert.Equal(point.X, rect.X); + Assert.Equal(point.Y, rect.Y); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(float.MaxValue, float.MinValue)] + public static void SizeSetTest(float x, float y) + { + var size = new SizeF(x, y); + var rect = new RectangleF(10, 10, 10, 10) { Size = size }; + Assert.Equal(size, rect.Size); + Assert.Equal(size.Width, rect.Width); + Assert.Equal(size.Height, rect.Height); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void EqualityTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var rect2 = new RectangleF(width, height, x, y); + + Assert.True(rect1 != rect2); + Assert.False(rect1 == rect2); + Assert.False(rect1.Equals(rect2)); + Assert.False(rect1.Equals((object)rect2)); + } + + [Fact] + public static void EqualityTestNotRectangleF() + { + var rectangle = new RectangleF(0, 0, 0, 0); + Assert.False(rectangle.Equals(null)); + Assert.False(rectangle.Equals(0)); + + // If RectangleF implements IEquatable (e.g. in .NET Core), then classes that are implicitly + // convertible to RectangleF can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToRectangleF = typeof(IEquatable).IsAssignableFrom(rectangle.GetType()); + Assert.Equal(expectsImplicitCastToRectangleF, rectangle.Equals(new Rectangle(0, 0, 0, 0))); + + Assert.False(rectangle.Equals((object)new Rectangle(0, 0, 0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var rect1 = new RectangleF(10, 10, 10, 10); + var rect2 = new RectangleF(10, 10, 10, 10); + Assert.Equal(rect1.GetHashCode(), rect2.GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(20, 10, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 20, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 10, 20, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 10, 10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void ContainsTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + float X = (x + width) / 2; + float Y = (y + height) / 2; + var p = new PointF(X, Y); + var r = new RectangleF(X, Y, width / 2, height / 2); + + Assert.False(rect.Contains(X, Y)); + Assert.False(rect.Contains(p)); + Assert.False(rect.Contains(r)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue / 2, float.MinValue / 2, float.MinValue / 2, float.MaxValue / 2)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void InflateTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + var inflatedRect = new RectangleF(x - width, y - height, width + 2 * width, height + 2 * height); + + rect.Inflate(width, height); + Assert.Equal(inflatedRect, rect); + + var s = new SizeF(x, y); + inflatedRect = RectangleF.Inflate(rect, x, y); + + rect.Inflate(s); + Assert.Equal(inflatedRect, rect); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue / 2, float.MinValue / 2)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void IntersectTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var rect2 = new RectangleF(y, x, width, height); + var expectedRect = RectangleF.Intersect(rect1, rect2); + rect1.Intersect(rect2); + Assert.Equal(expectedRect, rect1); + Assert.False(rect1.IntersectsWith(expectedRect)); + } + + [Fact] + public static void IntersectIntersectingRectsTest() + { + var rect1 = new RectangleF(0, 0, 5, 5); + var rect2 = new RectangleF(1, 1, 3, 3); + var expected = new RectangleF(1, 1, 3, 3); + + Assert.Equal(expected, RectangleF.Intersect(rect1, rect2)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void UnionTest(float x, float y, float width, float height) + { + var a = new RectangleF(x, y, width, height); + var b = new RectangleF(width, height, x, y); + + float x1 = Math.Min(a.X, b.X); + float x2 = Math.Max(a.X + a.Width, b.X + b.Width); + float y1 = Math.Min(a.Y, b.Y); + float y2 = Math.Max(a.Y + a.Height, b.Y + b.Height); + + var expectedRectangle = new RectangleF(x1, y1, x2 - x1, y2 - y1); + + Assert.Equal(expectedRectangle, RectangleF.Union(a, b)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void OffsetTest(float x, float y, float width, float height) + { + var r1 = new RectangleF(x, y, width, height); + var expectedRect = new RectangleF(x + width, y + height, width, height); + var p = new PointF(width, height); + + r1.Offset(p); + Assert.Equal(expectedRect, r1); + + expectedRect.Offset(p); + r1.Offset(width, height); + Assert.Equal(expectedRect, r1); + } + + [Fact] + public void ToStringTest() + { + var r = new RectangleF(5, 5.1F, 1.3F, 1); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "RectangleF [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); + } + + [InlineData(0, 0, 0, 0)] + [InlineData(5, -5, 0.2, -1.3)] + public void ToStringTestEmpty(float x, float y, float width, float height) + { + var r = new RectangleF(x, y, width, height); + Assert.Equal("RectangleF [ Empty ]", r.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RectangleTests.cs b/tests/SixLabors.Primitives.Tests/RectangleTests.cs new file mode 100644 index 000000000..24ac4fae1 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RectangleTests.cs @@ -0,0 +1,308 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + + using Xunit; + + /// + /// Tests the struct. + /// + public class RectangleTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Rectangle.Empty, new Rectangle()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void NonDefaultConstructorTest(int x, int y, int width, int height) + { + var rect1 = new Rectangle(x, y, width, height); + var rect2 = new Rectangle(new Point(x, y), new Size(width, height)); + + Assert.Equal(rect1, rect2); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void FromLTRBTest(int left, int top, int right, int bottom) + { + var rect1 = new Rectangle(left, top, unchecked(right - left), unchecked(bottom - top)); + var rect2 = Rectangle.FromLTRB(left, top, right, bottom); + + Assert.Equal(rect1, rect2); + } + + [Fact] + public void EmptyTest() + { + Assert.True(Rectangle.Empty.IsEmpty); + Assert.True(new Rectangle(0, 0, 0, 0).IsEmpty); + Assert.True(new Rectangle().IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void NonEmptyTest(int x, int y, int width, int height) + { + Assert.False(new Rectangle(x, y, width, height).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + public void DimensionsTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + Assert.Equal(new Point(x, y), rect.Location); + Assert.Equal(new Size(width, height), rect.Size); + + Assert.Equal(x, rect.X); + Assert.Equal(y, rect.Y); + Assert.Equal(width, rect.Width); + Assert.Equal(height, rect.Height); + Assert.Equal(x, rect.Left); + Assert.Equal(y, rect.Top); + Assert.Equal(unchecked(x + width), rect.Right); + Assert.Equal(unchecked(y + height), rect.Bottom); + + var p = new Point(width, height); + var s = new Size(x, y); + rect.Location = p; + rect.Size = s; + + Assert.Equal(p, rect.Location); + Assert.Equal(s, rect.Size); + + Assert.Equal(width, rect.X); + Assert.Equal(height, rect.Y); + Assert.Equal(x, rect.Width); + Assert.Equal(y, rect.Height); + Assert.Equal(width, rect.Left); + Assert.Equal(height, rect.Top); + Assert.Equal(unchecked(x + width), rect.Right); + Assert.Equal(unchecked(y + height), rect.Bottom); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(int.MaxValue, int.MinValue)] + public static void LocationSetTest(int x, int y) + { + var point = new Point(x, y); + var rect = new Rectangle(10, 10, 10, 10) { Location = point }; + Assert.Equal(point, rect.Location); + Assert.Equal(point.X, rect.X); + Assert.Equal(point.Y, rect.Y); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(int.MaxValue, int.MinValue)] + public static void SizeSetTest(int x, int y) + { + var size = new Size(x, y); + var rect = new Rectangle(10, 10, 10, 10) { Size = size }; + Assert.Equal(size, rect.Size); + Assert.Equal(size.Width, rect.Width); + Assert.Equal(size.Height, rect.Height); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + public void EqualityTest(int x, int y, int width, int height) + { + var rect1 = new Rectangle(x, y, width, height); + var rect2 = new Rectangle(width / 2, height / 2, x, y); + + Assert.True(rect1 != rect2); + Assert.False(rect1 == rect2); + Assert.False(rect1.Equals(rect2)); + Assert.False(rect1.Equals((object)rect2)); + } + + [Fact] + public static void EqualityTestNotRectangle() + { + var rectangle = new Rectangle(0, 0, 0, 0); + Assert.False(rectangle.Equals(null)); + Assert.False(rectangle.Equals(0)); + Assert.False(rectangle.Equals(new RectangleF(0, 0, 0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var rect1 = new Rectangle(10, 10, 10, 10); + var rect2 = new Rectangle(10, 10, 10, 10); + Assert.Equal(rect1.GetHashCode(), rect2.GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(20, 10, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 20, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 10, 20, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 10, 10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MaxValue)] + [InlineData(0, 0, 0, 0)] + public void RectangleFConversionTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + Rectangle rCeiling, rTruncate, rRound; + + unchecked + { + rCeiling = new Rectangle((int)Math.Ceiling(x), (int)Math.Ceiling(y), + (int)Math.Ceiling(width), (int)Math.Ceiling(height)); + rTruncate = new Rectangle((int)x, (int)y, (int)width, (int)height); + rRound = new Rectangle((int)Math.Round(x), (int)Math.Round(y), + (int)Math.Round(width), (int)Math.Round(height)); + } + + Assert.Equal(rCeiling, Rectangle.Ceiling(rect)); + Assert.Equal(rTruncate, Rectangle.Truncate(rect)); + Assert.Equal(rRound, Rectangle.Round(rect)); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void ContainsTest(int x, int y, int width, int height) + { + var rect = new Rectangle(unchecked(2 * x - width), unchecked(2 * y - height), width, height); + var p = new Point(x, y); + var r = new Rectangle(x, y, width / 2, height / 2); + + Assert.False(rect.Contains(x, y)); + Assert.False(rect.Contains(p)); + Assert.False(rect.Contains(r)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void InflateTest(int x, int y, int width, int height) + { + Rectangle inflatedRect, rect = new Rectangle(x, y, width, height); + unchecked + { + inflatedRect = new Rectangle(x - width, y - height, width + 2 * width, height + 2 * height); + } + + Assert.Equal(inflatedRect, Rectangle.Inflate(rect, width, height)); + + rect.Inflate(width, height); + Assert.Equal(inflatedRect, rect); + + var s = new Size(x, y); + unchecked + { + inflatedRect = new Rectangle(rect.X - x, rect.Y - y, rect.Width + 2 * x, rect.Height + 2 * y); + } + + rect.Inflate(s); + Assert.Equal(inflatedRect, rect); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void IntersectTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + var expectedRect = Rectangle.Intersect(rect, rect); + rect.Intersect(rect); + Assert.Equal(expectedRect, rect); + Assert.False(rect.IntersectsWith(expectedRect)); + } + + [Fact] + public static void IntersectIntersectingRectsTest() + { + var rect1 = new Rectangle(0, 0, 5, 5); + var rect2 = new Rectangle(1, 1, 3, 3); + var expected = new Rectangle(1, 1, 3, 3); + + Assert.Equal(expected, Rectangle.Intersect(rect1, rect2)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, 0, 0, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void UnionTest(int x, int y, int width, int height) + { + var a = new Rectangle(x, y, width, height); + var b = new Rectangle(width, height, x, y); + + int x1 = Math.Min(a.X, b.X); + int x2 = Math.Max(a.X + a.Width, b.X + b.Width); + int y1 = Math.Min(a.Y, b.Y); + int y2 = Math.Max(a.Y + a.Height, b.Y + b.Height); + + var expectedRectangle = new Rectangle(x1, y1, x2 - x1, y2 - y1); + + Assert.Equal(expectedRectangle, Rectangle.Union(a, b)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, 0, 0, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void OffsetTest(int x, int y, int width, int height) + { + var r1 = new Rectangle(x, y, width, height); + var expectedRect = new Rectangle(x + width, y + height, width, height); + var p = new Point(width, height); + + r1.Offset(p); + Assert.Equal(expectedRect, r1); + + expectedRect.Offset(p); + r1.Offset(width, height); + Assert.Equal(expectedRect, r1); + } + + [Fact] + public void ToStringTest() + { + var r = new Rectangle(5, -5, 0, 1); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Rectangle [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var r = new Rectangle(0, 0, 0, 0); + Assert.Equal("Rectangle [ Empty ]", r.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs b/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs new file mode 100644 index 000000000..bc7a5b810 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs @@ -0,0 +1,122 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using Xunit; + + /// + /// Tests the struct. + /// + public class SignedRationalTests + { + /// + /// Tests the equality operators for equality. + /// + [Fact] + public void AreEqual() + { + SignedRational r1 = new SignedRational(3, 2); + SignedRational r2 = new SignedRational(3, 2); + + Assert.Equal(r1, r2); + Assert.True(r1 == r2); + + SignedRational r3 = new SignedRational(7.55); + SignedRational r4 = new SignedRational(755, 100); + SignedRational r5 = new SignedRational(151, 20); + + Assert.Equal(r3, r4); + Assert.Equal(r4, r5); + } + + /// + /// Tests the equality operators for inequality. + /// + [Fact] + public void AreNotEqual() + { + SignedRational first = new SignedRational(0, 100); + SignedRational second = new SignedRational(100, 100); + + Assert.NotEqual(first, second); + Assert.True(first != second); + } + + /// + /// Tests whether the Rational constructor correctly assign properties. + /// + [Fact] + public void ConstructorAssignsProperties() + { + SignedRational rational = new SignedRational(7, -55); + Assert.Equal(7, rational.Numerator); + Assert.Equal(-55, rational.Denominator); + + rational = new SignedRational(-755, 100); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(20, rational.Denominator); + + rational = new SignedRational(-755, -100, false); + Assert.Equal(-755, rational.Numerator); + Assert.Equal(-100, rational.Denominator); + + rational = new SignedRational(-151, -20); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(-20, rational.Denominator); + + rational = new SignedRational(-7.55); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(20, rational.Denominator); + + rational = new SignedRational(7); + Assert.Equal(7, rational.Numerator); + Assert.Equal(1, rational.Denominator); + } + + [Fact] + public void Fraction() + { + SignedRational first = new SignedRational(1.0 / 1600); + SignedRational second = new SignedRational(1.0 / 1600, true); + Assert.False(first.Equals(second)); + } + + [Fact] + public void ToDouble() + { + SignedRational rational = new SignedRational(0, 0); + Assert.Equal(double.NaN, rational.ToDouble()); + + rational = new SignedRational(2, 0); + Assert.Equal(double.PositiveInfinity, rational.ToDouble()); + + rational = new SignedRational(-2, 0); + Assert.Equal(double.NegativeInfinity, rational.ToDouble()); + } + + [Fact] + public void ToStringRepresention() + { + SignedRational rational = new SignedRational(0, 0); + Assert.Equal("[ Indeterminate ]", rational.ToString()); + + rational = new SignedRational(double.PositiveInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new SignedRational(double.NegativeInfinity); + Assert.Equal("[ NegativeInfinity ]", rational.ToString()); + + rational = new SignedRational(0, 1); + Assert.Equal("0", rational.ToString()); + + rational = new SignedRational(2, 1); + Assert.Equal("2", rational.ToString()); + + rational = new SignedRational(1, 2); + Assert.Equal("1/2", rational.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj new file mode 100644 index 000000000..a300a0b06 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj @@ -0,0 +1,34 @@ + + + + 0.0.0 + netcoreapp1.1 + SixLabors.Shapes.Tests + SixLabors.Shapes.Tests + true + false + false + false + false + false + false + full + + + + + + + + + + + + + + + + + + + diff --git a/tests/SixLabors.Primitives.Tests/SizeFTests.cs b/tests/SixLabors.Primitives.Tests/SizeFTests.cs new file mode 100644 index 000000000..baa16c7e4 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SizeFTests.cs @@ -0,0 +1,163 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + using System.Reflection; + using Xunit; + + public class SizeFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(SizeF.Empty, new SizeF()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorAndDimensionsTest(float width, float height) + { + var s1 = new SizeF(width, height); + var p1 = new PointF(width, height); + var s2 = new SizeF(s1); + + Assert.Equal(s1, s2); + Assert.Equal(s1, new SizeF(p1)); + Assert.Equal(s2, new SizeF(p1)); + + Assert.Equal(width, s1.Width); + Assert.Equal(height, s1.Height); + + s1.Width = 10; + Assert.Equal(10, s1.Width); + + s1.Height = -10.123f; + Assert.Equal(-10.123, s1.Height, 3); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(SizeF.Empty.IsEmpty); + Assert.True(new SizeF().IsEmpty); + Assert.True(new SizeF(0, 0).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + public void IsEmptyRandomTest(float width, float height) + { + Assert.False(new SizeF(width, height).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(float width, float height) + { + var s1 = new SizeF(width, height); + var s2 = new SizeF(height, width); + var addExpected = new SizeF(width + height, width + height); + var subExpected = new SizeF(width - height, height - width); + + Assert.Equal(addExpected, s1 + s2); + Assert.Equal(addExpected, SizeF.Add(s1, s2)); + + Assert.Equal(subExpected, s1 - s2); + Assert.Equal(subExpected, SizeF.Subtract(s1, s2)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(float width, float height) + { + var sLeft = new SizeF(width, height); + var sRight = new SizeF(height, width); + + if (width == height) + { + Assert.True(sLeft == sRight); + Assert.False(sLeft != sRight); + Assert.True(sLeft.Equals(sRight)); + Assert.True(sLeft.Equals((object)sRight)); + Assert.Equal(sLeft.GetHashCode(), sRight.GetHashCode()); + return; + } + + Assert.True(sLeft != sRight); + Assert.False(sLeft == sRight); + Assert.False(sLeft.Equals(sRight)); + Assert.False(sLeft.Equals((object)sRight)); + } + + [Fact] + public static void EqualityTest_NotSizeF() + { + var size = new SizeF(0, 0); + Assert.False(size.Equals(null)); + Assert.False(size.Equals(0)); + + // If SizeF implements IEquatable (e.g in .NET Core), then classes that are implicitly + // convertible to SizeF can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToSizeF = typeof(IEquatable).IsAssignableFrom(size.GetType()); + Assert.Equal(expectsImplicitCastToSizeF, size.Equals(new Size(0, 0))); + + Assert.False(size.Equals((object)new Size(0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var size = new SizeF(10, 10); + Assert.Equal(size.GetHashCode(), new SizeF(10, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new SizeF(20, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new SizeF(10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void ConversionTest(float width, float height) + { + var s1 = new SizeF(width, height); + var p1 = (PointF)s1; + var s2 = new Size(unchecked((int)width), unchecked((int)height)); + + Assert.Equal(new PointF(width, height), p1); + Assert.Equal(p1, (PointF)s1); + Assert.Equal(s2, (Size)s1); + } + + [Fact] + public void ToStringTest() + { + var sz = new SizeF(10, 5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "SizeF [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var sz = new SizeF(0, 0); + Assert.Equal("SizeF [ Empty ]", sz.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SizeTests.cs b/tests/SixLabors.Primitives.Tests/SizeTests.cs new file mode 100644 index 000000000..3eabf6221 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SizeTests.cs @@ -0,0 +1,195 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System.Globalization; + using Xunit; + + /// + /// Tests the struct. + /// + public class SizeTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Size.Empty, new Size()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorTest(int width, int height) + { + var s1 = new Size(width, height); + var s2 = new Size(new Point(width, height)); + + Assert.Equal(s1, s2); + + s1.Width = 10; + Assert.Equal(10, s1.Width); + + s1.Height = -10; + Assert.Equal(-10, s1.Height); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(Size.Empty.IsEmpty); + Assert.True(new Size().IsEmpty); + Assert.True(new Size(0, 0).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + public void IsEmptyRandomTest(int width, int height) + { + Assert.False(new Size(width, height).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void DimensionsTest(int width, int height) + { + var p = new Size(width, height); + Assert.Equal(width, p.Width); + Assert.Equal(height, p.Height); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void PointFConversionTest(int width, int height) + { + SizeF sz = new Size(width, height); + Assert.Equal(new SizeF(width, height), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void SizeConversionTest(int width, int height) + { + var sz = (Point)new Size(width, height); + Assert.Equal(new Point(width, height), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(int width, int height) + { + var sz1 = new Size(width, height); + var sz2 = new Size(height, width); + Size addExpected, subExpected; + + unchecked + { + addExpected = new Size(width + height, height + width); + subExpected = new Size(width - height, height - width); + } + + Assert.Equal(addExpected, sz1 + sz2); + Assert.Equal(subExpected, sz1 - sz2); + Assert.Equal(addExpected, Size.Add(sz1, sz2)); + Assert.Equal(subExpected, Size.Subtract(sz1, sz2)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void PointFMathematicalTest(float width, float height) + { + var szF = new SizeF(width, height); + Size pCeiling, pTruncate, pRound; + + unchecked + { + pCeiling = new Size((int)MathF.Ceiling(width), (int)MathF.Ceiling(height)); + pTruncate = new Size((int)width, (int)height); + pRound = new Size((int)MathF.Round(width), (int)MathF.Round(height)); + } + + Assert.Equal(pCeiling, Size.Ceiling(szF)); + Assert.Equal(pRound, Size.Round(szF)); + Assert.Equal(pTruncate, (Size)szF); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(int width, int height) + { + var p1 = new Size(width, height); + var p2 = new Size(unchecked(width - 1), unchecked(height - 1)); + var p3 = new Size(width, height); + + Assert.True(p1 == p3); + Assert.True(p1 != p2); + Assert.True(p2 != p3); + + Assert.True(p1.Equals(p3)); + Assert.False(p1.Equals(p2)); + Assert.False(p2.Equals(p3)); + + Assert.True(p1.Equals((object)p3)); + Assert.False(p1.Equals((object)p2)); + Assert.False(p2.Equals((object)p3)); + + Assert.Equal(p1.GetHashCode(), p3.GetHashCode()); + } + + [Fact] + public static void EqualityTest_NotSize() + { + var size = new Size(0, 0); + Assert.False(size.Equals(null)); + Assert.False(size.Equals(0)); + Assert.False(size.Equals(new SizeF(0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var size = new Size(10, 10); + Assert.Equal(size.GetHashCode(), new Size(10, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new Size(20, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new Size(10, 20).GetHashCode()); + } + + [Fact] + public void ToStringTest() + { + var sz = new Size(10, 5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Size [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var sz = new Size(0, 0); + Assert.Equal("Size [ Empty ]", sz.ToString()); + } + } +} \ No newline at end of file From 82902009df5f82fd1b99443a37f30e69a4357752 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 2 Jun 2017 23:21:15 +0100 Subject: [PATCH 003/136] [SL.Core] update api key --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index e534e5855..0c1d45047 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,7 +20,7 @@ deploy: server: https://www.myget.org/F/sixlabors/api/v2/package symbol_server: https://www.myget.org/F/sixlabors/symbols/api/v2/package api_key: - secure: SyrSERGrjkK21TSCsHtqke5279SMxXCg2NXKjR2qaErP0khEplwxPwE8Ch5bxzyf + secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4 artifact: /.*\.nupkg/ on: branch: master From 9c910db94c2c5e22788cdad2c825e7149508f4b1 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 2 Jun 2017 23:23:12 +0100 Subject: [PATCH 004/136] [SL.Core] update sln --- SixLabors.Primitives.sln | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/SixLabors.Primitives.sln b/SixLabors.Primitives.sln index 1d728f98c..b1a03f64f 100644 --- a/SixLabors.Primitives.sln +++ b/SixLabors.Primitives.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26430.6 +VisualStudioVersion = 15.0.26430.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject @@ -21,8 +21,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A src\Shared\stylecop.json = src\Shared\stylecop.json EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives", "src\SixLabors.Primitives\SixLabors.Primitives.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives.Tests", "tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" @@ -41,18 +39,6 @@ Global {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.Build.0 = Debug|Any CPU {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.ActiveCfg = Release|Any CPU {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.Build.0 = Release|Any CPU - {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.Build.0 = Debug|Any CPU - {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.ActiveCfg = Release|Any CPU - {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.Build.0 = Release|Any CPU - {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.Build.0 = Release|Any CPU - {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -61,9 +47,6 @@ Global {9E574A07-F879-4811-9C41-5CBDC6BAFDB7} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} - {999EDFB3-9FE4-4E09-B669-CB02E597EC20} = {9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D} - {87E262FA-57FE-4AA7-853C-9DD91E769D4B} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} - {32D7A12E-B392-42CE-8EFB-1B685680F5B8} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} EndGlobalSection GlobalSection(Performance) = preSolution HasPerformanceSessions = true From f4626c1cebc534cd2eb28102e79abb63728c32aa Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 3 Jun 2017 10:15:40 +0100 Subject: [PATCH 005/136] [SL.Core] add matrix tests & fix GetHashCode --- src/Shared/AssemblyInfo.Common.cs | 9 +- .../ApproximateFloatComparer.cs | 210 ++++ src/SixLabors.Primitives/Ellipse.cs | 11 +- src/SixLabors.Primitives/HashHelpers.cs | 23 + src/SixLabors.Primitives/LongRational.cs | 5 +- src/SixLabors.Primitives/MathF.cs | 4 +- src/SixLabors.Primitives/Matrix.cs | 51 +- src/SixLabors.Primitives/Point.cs | 25 +- src/SixLabors.Primitives/PointF.cs | 65 +- src/SixLabors.Primitives/Rectangle.cs | 26 +- src/SixLabors.Primitives/RectangleF.cs | 26 +- src/SixLabors.Primitives/Size.cs | 21 +- src/SixLabors.Primitives/SizeF.cs | 20 +- tests/CodeCoverage/.gitignore | 1 + tests/CodeCoverage/CodeCoverage.cmd | 2 +- .../SixLabors.Primitives.Tests/MatrixTests.cs | 1015 +++++++++++++++++ .../SixLabors.Primitives.Tests/PointFTests.cs | 2 +- .../SixLabors.Primitives.Tests.csproj | 3 +- 18 files changed, 1470 insertions(+), 49 deletions(-) create mode 100644 src/SixLabors.Primitives/ApproximateFloatComparer.cs create mode 100644 src/SixLabors.Primitives/HashHelpers.cs create mode 100644 tests/CodeCoverage/.gitignore create mode 100644 tests/SixLabors.Primitives.Tests/MatrixTests.cs diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/Shared/AssemblyInfo.Common.cs index 081b01994..b140dd917 100644 --- a/src/Shared/AssemblyInfo.Common.cs +++ b/src/Shared/AssemblyInfo.Common.cs @@ -10,11 +10,11 @@ using System.Runtime.CompilerServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyDescription("A cross-platform library for processing of image files; written in C#")] +[assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Scott Williams")] -[assembly: AssemblyProduct("SixLabors.Shapes")] -[assembly: AssemblyCopyright("Copyright (c) Scott Williams and contributors.")] +[assembly: AssemblyProduct("SixLabors.Primitives")] +[assembly: AssemblyCopyright("Copyright (c) Six Labors and contributors.")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: NeutralResourcesLanguage("en")] @@ -34,5 +34,4 @@ using System.Runtime.CompilerServices; [assembly: AssemblyInformationalVersion("1.0.0.0")] // Ensure the internals can be tested. -[assembly: InternalsVisibleTo("SixLabors.Shapes.Tests")] -[assembly: InternalsVisibleTo("SixLabors.Shapes.Benchmarks")] +[assembly: InternalsVisibleTo("SixLabors.Primitives.Tests")] diff --git a/src/SixLabors.Primitives/ApproximateFloatComparer.cs b/src/SixLabors.Primitives/ApproximateFloatComparer.cs new file mode 100644 index 000000000..0d854a110 --- /dev/null +++ b/src/SixLabors.Primitives/ApproximateFloatComparer.cs @@ -0,0 +1,210 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace SixLabors.Primitives +{ + internal struct ApproximateFloatComparer + : IEqualityComparer, + IEqualityComparer, + IEqualityComparer, + IEqualityComparer, + IEqualityComparer, + IEqualityComparer, + IEqualityComparer + + { + private readonly float tolerance; + const float defaultTolerance = 1e-5f; + + public ApproximateFloatComparer(float tolerance = defaultTolerance) + { + this.tolerance = tolerance; + } + + public static bool Equal(float x, float y, float tolerance) + { + float d = x - y; + + return d > -tolerance && d < tolerance; + } + + public static bool Equal(float x, float y) + { + return Equal(x, y, defaultTolerance); + } + + public bool Equals(float x, float y) + { + return Equal(x, y, this.tolerance); + } + + public int GetHashCode(float obj) + { + var diff = obj % this.tolerance;// how different from tollerance are we? + return (obj - diff).GetHashCode(); + } + + public bool Equals(Vector4 a, Vector4 b) + { + return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z) && this.Equals(a.W, b.W); + } + + public int GetHashCode(Vector4 obj) + { + int hash = GetHashCode(obj.X); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.W)); + return hash; + } + + public bool Equals(Vector2 a, Vector2 b) + { + return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y); + } + + public int GetHashCode(Vector2 obj) + { + int hash = GetHashCode(obj.X); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); + return hash; + } + + public bool Equals(Vector3 a, Vector3 b) + { + return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z); + } + + public int GetHashCode(Vector3 obj) + { + int hash = GetHashCode(obj.X); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); + return hash; + } + + public static bool Equal(Matrix3x2 a, Matrix3x2 b, float tolerance) + { + return Equal(a.M11, b.M11, tolerance) && + Equal(a.M12, b.M12, tolerance) && + Equal(a.M21, b.M21, tolerance) && + Equal(a.M22, b.M22, tolerance) && + Equal(a.M31, b.M31, tolerance) && + Equal(a.M32, b.M32, tolerance); + } + + public static bool Equal(Matrix3x2 a, Matrix3x2 b) + { + return Equal(a, b, defaultTolerance); + } + + public bool Equals(Matrix3x2 a, Matrix3x2 b) + { + return Equal(a, b, this.tolerance); + } + + public int GetHashCode(Matrix3x2 obj) + { + int hash = GetHashCode(obj.M11); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M11)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); + return hash; + } + + + public static bool Equal(Matrix4x4 a, Matrix4x4 b, float tolerance) + { + return + Equal(a.M11, b.M11, tolerance) && + Equal(a.M12, b.M12, tolerance) && + Equal(a.M13, b.M13, tolerance) && + Equal(a.M14, b.M14, tolerance) && + + Equal(a.M21, b.M21, tolerance) && + Equal(a.M22, b.M22, tolerance) && + Equal(a.M23, b.M23, tolerance) && + Equal(a.M24, b.M24, tolerance) && + + Equal(a.M31, b.M31, tolerance) && + Equal(a.M32, b.M32, tolerance) && + Equal(a.M33, b.M33, tolerance) && + Equal(a.M34, b.M34, tolerance) && + + Equal(a.M41, b.M41, tolerance) && + Equal(a.M42, b.M42, tolerance) && + Equal(a.M43, b.M43, tolerance) && + Equal(a.M44, b.M44, tolerance); + } + + public static bool Equal(Matrix4x4 a, Matrix4x4 b) + { + return Equal(a, b, defaultTolerance); + } + + public bool Equals(Matrix4x4 a, Matrix4x4 b) + { + return Equal(a, b, this.tolerance); + } + + + public int GetHashCode(Matrix4x4 obj) + { + int hash = GetHashCode(obj.M11); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M13)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M14)); + + hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M23)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M24)); + + hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M33)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M34)); + + hash = HashHelpers.Combine(hash, GetHashCode(obj.M41)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M42)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M43)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M44)); + return hash; + } + + + public static bool Equal(PointF a, PointF b, float tolerance) + { + return + Equal(a.X, b.X, tolerance) && + Equal(a.Y, b.Y, tolerance); + } + + public static bool Equal(PointF a, PointF b) + { + return Equal(a, b, defaultTolerance); + } + + public bool Equals(PointF a, PointF b) + { + return Equal(a, b, this.tolerance); + } + + + public int GetHashCode(PointF obj) + { + int hash = GetHashCode(obj.X); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); + return hash; + } + } +} diff --git a/src/SixLabors.Primitives/Ellipse.cs b/src/SixLabors.Primitives/Ellipse.cs index d5611bb23..e1890df27 100644 --- a/src/SixLabors.Primitives/Ellipse.cs +++ b/src/SixLabors.Primitives/Ellipse.cs @@ -171,13 +171,10 @@ namespace SixLabors.Primitives /// private int GetHashCode(Ellipse ellipse) { - unchecked - { - int hashCode = ellipse.center.GetHashCode(); - hashCode = (hashCode * 397) ^ ellipse.RadiusX.GetHashCode(); - hashCode = (hashCode * 397) ^ ellipse.RadiusY.GetHashCode(); - return hashCode; - } + int hashCode = ellipse.center.GetHashCode(); + hashCode = HashHelpers.Combine(hashCode, ellipse.RadiusX.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, ellipse.RadiusY.GetHashCode()); + return hashCode; } } } diff --git a/src/SixLabors.Primitives/HashHelpers.cs b/src/SixLabors.Primitives/HashHelpers.cs new file mode 100644 index 000000000..d622d308c --- /dev/null +++ b/src/SixLabors.Primitives/HashHelpers.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SixLabors.Primitives +{ + // lifted from coreFX repo + internal static class HashHelpers + { + public static readonly int RandomSeed = Guid.NewGuid().GetHashCode(); + + public static int Combine(int h1, int h2) + { + unchecked + { + // RyuJIT optimizes this to use the ROL instruction + // Related GitHub pull request: dotnet/coreclr#1830 + uint rol5 = ((uint)h1 << 5) | ((uint)h1 >> 27); + return ((int)rol5 + h1) ^ h2; + } + } + } +} diff --git a/src/SixLabors.Primitives/LongRational.cs b/src/SixLabors.Primitives/LongRational.cs index d33484338..4f01936ee 100644 --- a/src/SixLabors.Primitives/LongRational.cs +++ b/src/SixLabors.Primitives/LongRational.cs @@ -347,9 +347,6 @@ namespace SixLabors.Primitives /// /// A 32-bit signed integer that is the hash code for this instance. /// - private int GetHashCode(LongRational rational) - { - return ((rational.Numerator * 397) ^ rational.Denominator).GetHashCode(); - } + private int GetHashCode(LongRational rational) => HashHelpers.Combine(rational.Numerator.GetHashCode(), rational.Denominator.GetHashCode()); } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/MathF.cs b/src/SixLabors.Primitives/MathF.cs index a15b7fb20..eeaca821b 100644 --- a/src/SixLabors.Primitives/MathF.cs +++ b/src/SixLabors.Primitives/MathF.cs @@ -94,7 +94,7 @@ namespace SixLabors.Primitives /// The representing the degree as radians. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float DegreeToRadian(float degree) + public static float ToRadians(float degree) { return degree * (PI / 180F); } @@ -181,7 +181,7 @@ namespace SixLabors.Primitives /// The representing the degree as radians. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float RadianToDegree(float radian) + public static float ToDegree(float radian) { return radian / (PI / 180F); } diff --git a/src/SixLabors.Primitives/Matrix.cs b/src/SixLabors.Primitives/Matrix.cs index 6da436cfb..aa97c3ed7 100644 --- a/src/SixLabors.Primitives/Matrix.cs +++ b/src/SixLabors.Primitives/Matrix.cs @@ -32,9 +32,43 @@ namespace SixLabors.Primitives public bool IsIdentity => this.backingMatrix.IsIdentity; /// - /// Gets or sets the translation component of this matrix. + /// Gets or Sets the translation component of this matrix. /// - public Vector2 Translation => this.backingMatrix.Translation; + public PointF Translation + { + get => this.backingMatrix.Translation; + set => this.backingMatrix.Translation = value; + } + + /// + /// The first element of the first row + /// + public float M11 { get => this.backingMatrix.M11; set => this.backingMatrix.M11 = value; } + + /// + /// The second element of the first row + /// + public float M12 { get => this.backingMatrix.M12; set => this.backingMatrix.M12 = value; } + + /// + /// The first element of the second row + /// + public float M21 { get => this.backingMatrix.M21; set => this.backingMatrix.M21 = value; } + + /// + /// The second element of the second row + /// + public float M22 { get => this.backingMatrix.M22; set => this.backingMatrix.M22 = value; } + + /// + /// The first element of the third row + /// + public float M31 { get => this.backingMatrix.M31; set => this.backingMatrix.M31 = value; } + + /// + /// The second element of the third row + /// + public float M32 { get => this.backingMatrix.M32; set => this.backingMatrix.M32 = value; } /// /// Constructs a Matrix3x2 from the given components. @@ -122,7 +156,7 @@ namespace SixLabors.Primitives /// The X angle, in degrees. /// The Y angle, in degrees. /// A skew matrix. - public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY)); + public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -140,7 +174,7 @@ namespace SixLabors.Primitives /// The Y angle, in degrees. /// The center point. /// A skew matrix. - public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY), centerPoint); + public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); /// /// Creates a rotation matrix using the given rotation in radians. @@ -154,7 +188,7 @@ namespace SixLabors.Primitives /// /// The amount of rotation, in degrees. /// A rotation matrix. - public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees)); + public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -170,7 +204,7 @@ namespace SixLabors.Primitives /// The amount of rotation, in degrees. /// The center point. /// A rotation matrix. - public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees), centerPoint); + public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); /// /// Calculates the determinant for this matrix. @@ -356,5 +390,10 @@ namespace SixLabors.Primitives /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Matrix(Matrix3x2 matrix) => new Matrix { backingMatrix = matrix }; + + internal static Matrix CreateScale(Vector2 scale, object zero) + { + throw new NotImplementedException(); + } } } diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Primitives/Point.cs index 243cb8eb3..206d0545a 100644 --- a/src/SixLabors.Primitives/Point.cs +++ b/src/SixLabors.Primitives/Point.cs @@ -25,6 +25,11 @@ namespace SixLabors.Primitives /// public static readonly Point Empty = default(Point); + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly Point Zero = new Point(0, 0); + /// /// Initializes a new instance of the struct. /// @@ -95,6 +100,13 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Size(Point point) => new Size(point.X, point.Y); + /// + /// Negates the given point by multiplying all values by -1. + /// + /// The source point. + /// The negated point. + public static Point operator -(Point value) => new Point(-value.X, -value.Y); + /// /// Translates a by a given . /// @@ -252,6 +264,17 @@ namespace SixLabors.Primitives private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); - private int GetHashCode(Point point) => point.X ^ point.Y; + private int GetHashCode(Point point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); + + /// + /// Transforms a point by the given matrix. + /// + /// The source point + /// The transformation matrix. + /// + public static PointF Transform(Point position, Matrix matrix) + { + return Vector2.Transform(position, matrix); + } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Primitives/PointF.cs index a49a1996b..8df9ef7bf 100644 --- a/src/SixLabors.Primitives/PointF.cs +++ b/src/SixLabors.Primitives/PointF.cs @@ -25,6 +25,11 @@ namespace SixLabors.Primitives /// public static readonly PointF Empty = default(PointF); + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly PointF Zero = new PointF(0, 0); + /// /// Initializes a new instance of the struct. /// @@ -93,6 +98,13 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Point(PointF point) => Point.Truncate(point); + /// + /// Negates the given point by multiplying all values by -1. + /// + /// The source point. + /// The negated point. + public static PointF operator -(PointF value) => new PointF(-value.X, -value.Y); + /// /// Translates a by a given . /// @@ -104,6 +116,26 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator +(PointF point, SizeF size) => Add(point, size); + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator -(PointF point, PointF size) => Subtract(point, size); + + /// + /// Translates a by a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator +(PointF point, PointF size) => Add(point, size); + /// /// Translates a by the negative of a given . /// @@ -144,7 +176,7 @@ namespace SixLabors.Primitives public static bool operator !=(PointF left, PointF right) => !left.Equals(right); /// - /// Translates a by the negative of a given . + /// Translates a by the given . /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. @@ -152,6 +184,15 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Add(PointF point, SizeF size) => new PointF(point.X + size.Width, point.Y + size.Height); + /// + /// Translates a by the given . + /// + /// The point on the left hand of the operand. + /// The point on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Add(PointF point, PointF pointb) => new PointF(point.X + pointb.X, point.Y + pointb.Y); + /// /// Translates a by the negative of a given . /// @@ -161,6 +202,15 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Subtract(PointF point, SizeF size) => new PointF(point.X - size.Width, point.Y - size.Height); + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The point on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Subtract(PointF point, PointF pointb) => new PointF(point.X - pointb.X, point.Y - pointb.Y); + /// /// Rotates a point around the given rotation matrix. /// @@ -228,6 +278,17 @@ namespace SixLabors.Primitives /// /// A 32-bit signed integer that is the hash code for this instance. /// - private int GetHashCode(PointF point) => point.X.GetHashCode() ^ point.Y.GetHashCode(); + private int GetHashCode(PointF point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); + + /// + /// Transforms a point by the given matrix. + /// + /// The source point + /// The transformation matrix. + /// + public static PointF Transform(PointF position, Matrix matrix) + { + return Vector2.Transform(position, matrix); + } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Primitives/Rectangle.cs index 9c9a0599e..173ee5d1b 100644 --- a/src/SixLabors.Primitives/Rectangle.cs +++ b/src/SixLabors.Primitives/Rectangle.cs @@ -454,14 +454,24 @@ namespace SixLabors.Primitives private int GetHashCode(Rectangle rectangle) { - unchecked - { - int hashCode = rectangle.X; - hashCode = (hashCode * 397) ^ rectangle.Y; - hashCode = (hashCode * 397) ^ rectangle.Width; - hashCode = (hashCode * 397) ^ rectangle.Height; - return hashCode; - } + int hashCode = rectangle.X.GetHashCode(); + hashCode = HashHelpers.Combine(hashCode, rectangle.Y.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, rectangle.Width.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); + return hashCode; + } + + /// + /// Transforms a rectangle by the given matrix. + /// + /// The source rectangle + /// The transformation matrix. + /// + public static RectangleF Transform(Rectangle rectangle, Matrix matrix) + { + PointF bottomRight = Point.Transform(new Point(rectangle.Right, rectangle.Bottom), matrix); + PointF topLeft = Point.Transform(rectangle.Location, matrix); + return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Primitives/RectangleF.cs index c7d8b0ebb..d74fb796f 100644 --- a/src/SixLabors.Primitives/RectangleF.cs +++ b/src/SixLabors.Primitives/RectangleF.cs @@ -387,14 +387,24 @@ namespace SixLabors.Primitives private int GetHashCode(RectangleF rectangle) { - unchecked - { - int hashCode = rectangle.X.GetHashCode(); - hashCode = (hashCode * 397) ^ rectangle.Y.GetHashCode(); - hashCode = (hashCode * 397) ^ rectangle.Width.GetHashCode(); - hashCode = (hashCode * 397) ^ rectangle.Height.GetHashCode(); - return hashCode; - } + int hashCode = rectangle.X.GetHashCode(); + hashCode = HashHelpers.Combine(hashCode, rectangle.Y.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, rectangle.Width.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); + return hashCode; + } + + /// + /// Transforms a rectangle by the given matrix. + /// + /// The source rectangle + /// The transformation matrix. + /// + public static RectangleF Transform(RectangleF rectangle, Matrix matrix) + { + PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); + PointF topLeft = PointF.Transform(rectangle.Location, matrix); + return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs index 1605232b1..fb306f128 100644 --- a/src/SixLabors.Primitives/Size.cs +++ b/src/SixLabors.Primitives/Size.cs @@ -7,6 +7,7 @@ namespace SixLabors.Primitives { using System; using System.ComponentModel; + using System.Numerics; using System.Runtime.CompilerServices; /// @@ -22,6 +23,11 @@ namespace SixLabors.Primitives /// Represents a that has Width and Height values set to zero. /// public static readonly Size Empty = default(Size); + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly Size Zero = new Size(0, 0); + /// /// Initializes a new instance of the struct. @@ -220,6 +226,19 @@ namespace SixLabors.Primitives /// /// A 32-bit signed integer that is the hash code for this instance. /// - private int GetHashCode(Size size) => size.Width ^ size.Height; + private int GetHashCode(Size size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); + + /// + /// Transforms a size by the given matrix. + /// + /// The source size + /// The transformation matrix. + /// + public static SizeF Transform(Size size, Matrix matrix) + { + var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + + return new SizeF(v.X, v.Y); + } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs index a11d2e443..b822740cd 100644 --- a/src/SixLabors.Primitives/SizeF.cs +++ b/src/SixLabors.Primitives/SizeF.cs @@ -24,6 +24,11 @@ namespace SixLabors.Primitives /// public static readonly SizeF Empty = default(SizeF); + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly SizeF Zero = new SizeF(0, 0); + /// /// Initializes a new instance of the struct. /// @@ -175,7 +180,7 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(SizeF other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); - private int GetHashCode(SizeF size) => size.Width.GetHashCode() ^ size.Height.GetHashCode(); + private int GetHashCode(SizeF size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); /// /// Creates a with the coordinates of the specified . @@ -186,5 +191,18 @@ namespace SixLabors.Primitives /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); + + /// + /// Transforms a size by the given matrix. + /// + /// The source size + /// The transformation matrix. + /// + public static SizeF Transform(SizeF size, Matrix matrix) + { + var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + + return new SizeF(v.X, v.Y); + } } } \ No newline at end of file diff --git a/tests/CodeCoverage/.gitignore b/tests/CodeCoverage/.gitignore new file mode 100644 index 000000000..861c19344 --- /dev/null +++ b/tests/CodeCoverage/.gitignore @@ -0,0 +1 @@ +/OpenCover.4.6.519 diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd index 498e55b36..2547eace1 100644 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -12,7 +12,7 @@ dotnet build SixLabors.Primitives.sln --no-incremental -c debug /p:codecov=true rem The -threshold options prevents this taking ages... rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Shapes.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Shapes.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Primitives.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Primitives.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" if %errorlevel% neq 0 exit /b %errorlevel% diff --git a/tests/SixLabors.Primitives.Tests/MatrixTests.cs b/tests/SixLabors.Primitives.Tests/MatrixTests.cs new file mode 100644 index 000000000..c228f7493 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/MatrixTests.cs @@ -0,0 +1,1015 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System.Globalization; + using System.Numerics; + using Xunit; + + /// + /// Tests the struct. + /// + public class MatrixTests + { + + [Fact] + public void ImplicitCastMatrixToMatrix3x2() + { + Matrix matrix = new Matrix(1, 2, 3, 4, 5, 6); + + Matrix3x2 convertedMatrix = matrix; + Assert.Equal(1, convertedMatrix.M11); + Assert.Equal(2, convertedMatrix.M12); + Assert.Equal(3, convertedMatrix.M21); + Assert.Equal(4, convertedMatrix.M22); + Assert.Equal(5, convertedMatrix.M31); + Assert.Equal(6, convertedMatrix.M32); + } + + [Fact] + public void ImplicitCastMatrix3x2ToMatrix() + { + Matrix3x2 matrix = new Matrix3x2(1, 2, 3, 4, 5, 6); + + Matrix convertedMatrix = matrix; + Assert.Equal(1, convertedMatrix.M11); + Assert.Equal(2, convertedMatrix.M12); + Assert.Equal(3, convertedMatrix.M21); + Assert.Equal(4, convertedMatrix.M22); + Assert.Equal(5, convertedMatrix.M31); + Assert.Equal(6, convertedMatrix.M32); + } + + /// matrix test mostly tken directly from CoreFX + /// + static Matrix GenerateMatrixNumberFrom1To6() + { + Matrix a = new Matrix(); + a.M11 = 1.0f; + a.M12 = 2.0f; + a.M21 = 3.0f; + a.M22 = 4.0f; + a.M31 = 5.0f; + a.M32 = 6.0f; + return a; + } + + static Matrix GenerateTestMatrix() + { + Matrix m = Matrix.CreateRotation(MathF.ToRadians(30.0f)); + m.Translation = new Vector2(111.0f, 222.0f); + return m; + } + + // A test for Identity + [Fact] + public void MatrixIdentityTest() + { + Matrix val = new Matrix(); + val.M11 = val.M22 = 1.0f; + + Assert.True(ApproximateFloatComparer.Equal(val, Matrix.Identity), "Matrix.Indentity was not set correctly."); + } + + // A test for Determinant + [Fact] + public void MatrixDeterminantTest() + { + Matrix target = Matrix.CreateRotation(MathF.ToRadians(30.0f)); + + float val = 1.0f; + float det = target.GetDeterminant(); + + Assert.True(ApproximateFloatComparer.Equal(val, det), "Matrix.Determinant was not set correctly."); + } + + // A test for Determinant + // Determinant test |A| = 1 / |A'| + [Fact] + public void MatrixDeterminantTest1() + { + Matrix a = new Matrix(); + a.M11 = 5.0f; + a.M12 = 2.0f; + a.M21 = 12.0f; + a.M22 = 6.8f; + a.M31 = 6.5f; + a.M32 = 1.0f; + Matrix i; + Assert.True(Matrix.Invert(a, out i)); + + float detA = a.GetDeterminant(); + float detI = i.GetDeterminant(); + float t = 1.0f / detI; + + // only accurate to 3 precision + Assert.True(System.Math.Abs(detA - t) < 1e-3, "Matrix.Determinant was not set correctly."); + + // sanity check against 4x4 version + Assert.Equal(new Matrix4x4(a).GetDeterminant(), detA); + Assert.Equal(new Matrix4x4(i).GetDeterminant(), detI); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertTest() + { + Matrix mtx = Matrix.CreateRotation(MathF.ToRadians(30.0f)); + + Matrix expected = new Matrix(); + expected.M11 = 0.8660254f; + expected.M12 = -0.5f; + + expected.M21 = 0.5f; + expected.M22 = 0.8660254f; + + expected.M31 = 0; + expected.M32 = 0; + + Matrix actual; + + Assert.True(Matrix.Invert(mtx, out actual)); + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.Invert did not return the expected value."); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity), "Matrix.Invert did not return the expected value."); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertIdentityTest() + { + Matrix mtx = Matrix.Identity; + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Assert.True(ApproximateFloatComparer.Equal(actual, Matrix.Identity)); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertTranslationTest() + { + Matrix mtx = Matrix.CreateTranslation(23, 42); + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertRotationTest() + { + Matrix mtx = Matrix.CreateRotation(2); + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertScaleTest() + { + Matrix mtx = Matrix.CreateScale(23, -42); + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertAffineTest() + { + Matrix mtx = Matrix.CreateRotation(2) * + Matrix.CreateScale(23, -42) * + Matrix.CreateTranslation(17, 53); + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); + } + + // A test for CreateRotation (float) + [Fact] + public void MatrixCreateRotationTest() + { + float radians = MathF.ToRadians(50.0f); + + Matrix expected = new Matrix(); + expected.M11 = 0.642787635f; + expected.M12 = 0.766044438f; + expected.M21 = -0.766044438f; + expected.M22 = 0.642787635f; + + Matrix actual; + actual = Matrix.CreateRotation(radians); + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.CreateRotation did not return the expected value."); + } + + // A test for CreateRotation (float, Vector2f) + [Fact] + public void MatrixCreateRotationCenterTest() + { + float radians = MathF.ToRadians(30.0f); + Vector2 center = new Vector2(23, 42); + + Matrix rotateAroundZero = Matrix.CreateRotation(radians, Vector2.Zero); + Matrix rotateAroundZeroExpected = Matrix.CreateRotation(radians); + Assert.True(ApproximateFloatComparer.Equal(rotateAroundZero, rotateAroundZeroExpected)); + + Matrix rotateAroundCenter = Matrix.CreateRotation(radians, center); + Matrix rotateAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateRotation(radians) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(rotateAroundCenter, rotateAroundCenterExpected)); + } + + // A test for CreateRotation (float) + [Fact] + public void MatrixCreateRotationRightAngleTest() + { + // 90 degree rotations must be exact! + Matrix actual = Matrix.CreateRotation(0); + Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI / 2); + Assert.Equal(new Matrix(0, 1, -1, 0, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI); + Assert.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI * 3 / 2); + Assert.Equal(new Matrix(0, -1, 1, 0, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI * 2); + Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI * 5 / 2); + Assert.Equal(new Matrix(0, 1, -1, 0, 0, 0), actual); + + actual = Matrix.CreateRotation(-MathF.PI / 2); + Assert.Equal(new Matrix(0, -1, 1, 0, 0, 0), actual); + + // But merely close-to-90 rotations should not be excessively clamped. + float delta = MathF.ToRadians(0.01f); + + actual = Matrix.CreateRotation(MathF.PI + delta); + Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual)); + + actual = Matrix.CreateRotation(MathF.PI - delta); + Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual)); + } + + // A test for CreateRotation (float, Vector2f) + [Fact] + public void MatrixCreateRotationRightAngleCenterTest() + { + Vector2 center = new Vector2(3, 7); + + // 90 degree rotations must be exact! + Matrix actual = Matrix.CreateRotation(0, center); + Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI / 2, center); + Assert.Equal(new Matrix(0, 1, -1, 0, 10, 4), actual); + + actual = Matrix.CreateRotation(MathF.PI, center); + Assert.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual); + + actual = Matrix.CreateRotation(MathF.PI * 3 / 2, center); + Assert.Equal(new Matrix(0, -1, 1, 0, -4, 10), actual); + + actual = Matrix.CreateRotation(MathF.PI * 2, center); + Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI * 5 / 2, center); + Assert.Equal(new Matrix(0, 1, -1, 0, 10, 4), actual); + + actual = Matrix.CreateRotation(-MathF.PI / 2, center); + Assert.Equal(new Matrix(0, -1, 1, 0, -4, 10), actual); + + // But merely close-to-90 rotations should not be excessively clamped. + float delta = MathF.ToRadians(0.01f); + + actual = Matrix.CreateRotation(MathF.PI + delta, center); + Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual)); + + actual = Matrix.CreateRotation(MathF.PI - delta, center); + Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual)); + } + + // A test for Invert (Matrix) + // Non invertible matrix - determinant is zero - singular matrix + [Fact] + public void MatrixInvertTest1() + { + Matrix a = new Matrix(); + a.M11 = 0.0f; + a.M12 = 2.0f; + a.M21 = 0.0f; + a.M22 = 4.0f; + a.M31 = 5.0f; + a.M32 = 6.0f; + + float detA = a.GetDeterminant(); + Assert.True(ApproximateFloatComparer.Equal(detA, 0.0f), "Matrix.Invert did not return the expected value."); + + Matrix actual; + Assert.False(Matrix.Invert(a, out actual)); + + // all the elements in Actual is NaN + Assert.True( + float.IsNaN(actual.M11) && float.IsNaN(actual.M12) && + float.IsNaN(actual.M21) && float.IsNaN(actual.M22) && + float.IsNaN(actual.M31) && float.IsNaN(actual.M32) + , "Matrix.Invert did not return the expected value."); + } + + // A test for Lerp (Matrix, Matrix, float) + [Fact] + public void MatrixLerpTest() + { + Matrix a = new Matrix(); + a.M11 = 11.0f; + a.M12 = 12.0f; + a.M21 = 21.0f; + a.M22 = 22.0f; + a.M31 = 31.0f; + a.M32 = 32.0f; + + Matrix b = GenerateMatrixNumberFrom1To6(); + + float t = 0.5f; + + Matrix expected = new Matrix(); + expected.M11 = a.M11 + (b.M11 - a.M11) * t; + expected.M12 = a.M12 + (b.M12 - a.M12) * t; + + expected.M21 = a.M21 + (b.M21 - a.M21) * t; + expected.M22 = a.M22 + (b.M22 - a.M22) * t; + + expected.M31 = a.M31 + (b.M31 - a.M31) * t; + expected.M32 = a.M32 + (b.M32 - a.M32) * t; + + Matrix actual; + actual = Matrix.Lerp(a, b, t); + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.Lerp did not return the expected value."); + } + + // A test for operator - (Matrix) + [Fact] + public void MatrixUnaryNegationTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = -1.0f; + expected.M12 = -2.0f; + expected.M21 = -3.0f; + expected.M22 = -4.0f; + expected.M31 = -5.0f; + expected.M32 = -6.0f; + + Matrix actual = -a; + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator - did not return the expected value."); + } + + // A test for operator - (Matrix, Matrix) + [Fact] + public void MatrixSubtractionTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + Matrix expected = new Matrix(); + + Matrix actual = a - b; + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator - did not return the expected value."); + } + + // A test for operator * (Matrix, Matrix) + [Fact] + public void MatrixMultiplyTest1() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = a.M11 * b.M11 + a.M12 * b.M21; + expected.M12 = a.M11 * b.M12 + a.M12 * b.M22; + + expected.M21 = a.M21 * b.M11 + a.M22 * b.M21; + expected.M22 = a.M21 * b.M12 + a.M22 * b.M22; + + expected.M31 = a.M31 * b.M11 + a.M32 * b.M21 + b.M31; + expected.M32 = a.M31 * b.M12 + a.M32 * b.M22 + b.M32; + + Matrix actual = a * b; + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator * did not return the expected value."); + + // Sanity check by comparison with 4x4 multiply. + a = Matrix.CreateRotation(MathF.ToRadians(30)) * Matrix.CreateTranslation(23, 42); + b = Matrix.CreateScale(3, 7) * Matrix.CreateTranslation(666, -1); + + actual = a * b; + + Matrix4x4 a44 = new Matrix4x4(a); + Matrix4x4 b44 = new Matrix4x4(b); + Matrix4x4 expected44 = a44 * b44; + Matrix4x4 actual44 = new Matrix4x4(actual); + + Assert.True(ApproximateFloatComparer.Equal(expected44, actual44), "Matrix.operator * did not return the expected value."); + } + + // A test for operator * (Matrix, Matrix) + // Multiply with identity matrix + [Fact] + public void MatrixMultiplyTest4() + { + Matrix a = new Matrix(); + a.M11 = 1.0f; + a.M12 = 2.0f; + a.M21 = 5.0f; + a.M22 = -6.0f; + a.M31 = 9.0f; + a.M32 = 10.0f; + + Matrix b = new Matrix(); + b = Matrix.Identity; + + Matrix expected = a; + Matrix actual = a * b; + + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator * did not return the expected value."); + } + + // A test for operator + (Matrix, Matrix) + [Fact] + public void MatrixAdditionTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = a.M11 + b.M11; + expected.M12 = a.M12 + b.M12; + expected.M21 = a.M21 + b.M21; + expected.M22 = a.M22 + b.M22; + expected.M31 = a.M31 + b.M31; + expected.M32 = a.M32 + b.M32; + + Matrix actual; + + actual = a + b; + + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator + did not return the expected value."); + } + + // A test for ToString () + [Fact] + public void MatrixToStringTest() + { + Matrix a = new Matrix(); + a.M11 = 11.0f; + a.M12 = -12.0f; + a.M21 = 21.0f; + a.M22 = 22.0f; + a.M31 = 31.0f; + a.M32 = 32.0f; + + string expected = "{ {M11:11 M12:-12} " + + "{M21:21 M22:22} " + + "{M31:31 M32:32} }"; + string actual; + + actual = a.ToString(); + Assert.Equal(expected, actual); + } + + // A test for Add (Matrix, Matrix) + [Fact] + public void MatrixAddTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = a.M11 + b.M11; + expected.M12 = a.M12 + b.M12; + expected.M21 = a.M21 + b.M21; + expected.M22 = a.M22 + b.M22; + expected.M31 = a.M31 + b.M31; + expected.M32 = a.M32 + b.M32; + + Matrix actual; + + actual = Matrix.Add(a, b); + Assert.Equal(expected, actual); + } + + // A test for Equals (object) + [Fact] + public void MatrixEqualsTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + // case 1: compare between same values + object obj = b; + + bool expected = true; + bool actual = a.Equals(obj); + Assert.Equal(expected, actual); + + // case 2: compare between different values + b.M11 = 11.0f; + obj = b; + expected = false; + actual = a.Equals(obj); + Assert.Equal(expected, actual); + + // case 3: compare between different types. + obj = new Vector4(); + expected = false; + actual = a.Equals(obj); + Assert.Equal(expected, actual); + + // case 3: compare against null. + obj = null; + expected = false; + actual = a.Equals(obj); + Assert.Equal(expected, actual); + } + + // A test for GetHashCode () + [Fact] + public void MatrixGetHashCodeTest() + { + Matrix target = GenerateMatrixNumberFrom1To6(); + int expected = unchecked(target.M11.GetHashCode() + target.M12.GetHashCode() + + target.M21.GetHashCode() + target.M22.GetHashCode() + + target.M31.GetHashCode() + target.M32.GetHashCode()); + int actual; + + actual = target.GetHashCode(); + Assert.Equal(expected, actual); + } + + // A test for Multiply (Matrix, Matrix) + [Fact] + public void MatrixMultiplyTest3() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = a.M11 * b.M11 + a.M12 * b.M21; + expected.M12 = a.M11 * b.M12 + a.M12 * b.M22; + + expected.M21 = a.M21 * b.M11 + a.M22 * b.M21; + expected.M22 = a.M21 * b.M12 + a.M22 * b.M22; + + expected.M31 = a.M31 * b.M11 + a.M32 * b.M21 + b.M31; + expected.M32 = a.M31 * b.M12 + a.M32 * b.M22 + b.M32; + Matrix actual; + actual = Matrix.Multiply(a, b); + + Assert.Equal(expected, actual); + + // Sanity check by comparison with 4x4 multiply. + a = Matrix.CreateRotation(MathF.ToRadians(30)) * Matrix.CreateTranslation(23, 42); + b = Matrix.CreateScale(3, 7) * Matrix.CreateTranslation(666, -1); + + actual = Matrix.Multiply(a, b); + + Matrix4x4 a44 = new Matrix4x4(a); + Matrix4x4 b44 = new Matrix4x4(b); + Matrix4x4 expected44 = Matrix4x4.Multiply(a44, b44); + Matrix4x4 actual44 = new Matrix4x4(actual); + + Assert.True(ApproximateFloatComparer.Equal(expected44, actual44), "Matrix.Multiply did not return the expected value."); + } + + // A test for Multiply (Matrix, float) + [Fact] + public void MatrixMultiplyTest5() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix expected = new Matrix(3, 6, 9, 12, 15, 18); + Matrix actual = Matrix.Multiply(a, 3); + + Assert.Equal(expected, actual); + } + + // A test for Multiply (Matrix, float) + [Fact] + public void MatrixMultiplyTest6() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix expected = new Matrix(3, 6, 9, 12, 15, 18); + Matrix actual = a * 3; + + Assert.Equal(expected, actual); + } + + // A test for Negate (Matrix) + [Fact] + public void MatrixNegateTest() + { + Matrix m = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = -1.0f; + expected.M12 = -2.0f; + expected.M21 = -3.0f; + expected.M22 = -4.0f; + expected.M31 = -5.0f; + expected.M32 = -6.0f; + Matrix actual; + + actual = Matrix.Negate(m); + Assert.Equal(expected, actual); + } + + // A test for operator != (Matrix, Matrix) + [Fact] + public void MatrixInequalityTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + // case 1: compare between same values + bool expected = false; + bool actual = a != b; + Assert.Equal(expected, actual); + + // case 2: compare between different values + b.M11 = 11.0f; + expected = true; + actual = a != b; + Assert.Equal(expected, actual); + } + + // A test for operator == (Matrix, Matrix) + [Fact] + public void MatrixEqualityTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + // case 1: compare between same values + bool expected = true; + bool actual = a == b; + Assert.Equal(expected, actual); + + // case 2: compare between different values + b.M11 = 11.0f; + expected = false; + actual = a == b; + Assert.Equal(expected, actual); + } + + // A test for Subtract (Matrix, Matrix) + [Fact] + public void MatrixSubtractTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + Matrix expected = new Matrix(); + Matrix actual; + + actual = Matrix.Subtract(a, b); + Assert.Equal(expected, actual); + } + + // A test for CreateScale (Vector2f) + [Fact] + public void MatrixCreateScaleTest1() + { + SizeF scales = new SizeF(2.0f, 3.0f); + Matrix expected = new Matrix( + 2.0f, 0.0f, + 0.0f, 3.0f, + 0.0f, 0.0f); + Matrix actual = Matrix.CreateScale(scales); + Assert.Equal(expected, actual); + } + + // A test for CreateScale (Vector2f, Vector2f) + [Fact] + public void MatrixCreateScaleCenterTest1() + { + SizeF scale = new SizeF(3, 4); + PointF center = new PointF(23, 42); + + Matrix scaleAroundZero = Matrix.CreateScale(scale, PointF.Zero); + Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); + + Matrix scaleAroundCenter = Matrix.CreateScale(scale, center); + Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); + } + + // A test for CreateScale (float) + [Fact] + public void MatrixCreateScaleTest2() + { + float scale = 2.0f; + Matrix expected = new Matrix( + 2.0f, 0.0f, + 0.0f, 2.0f, + 0.0f, 0.0f); + Matrix actual = Matrix.CreateScale(scale); + Assert.Equal(expected, actual); + } + + // A test for CreateScale (float, Vector2f) + [Fact] + public void MatrixCreateScaleCenterTest2() + { + float scale = 5; + PointF center = new PointF(23, 42); + + Matrix scaleAroundZero = Matrix.CreateScale(scale, PointF.Zero); + Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); + + Matrix scaleAroundCenter = Matrix.CreateScale(scale, center); + Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); + } + + // A test for CreateScale (float, float) + [Fact] + public void MatrixCreateScaleTest3() + { + float xScale = 2.0f; + float yScale = 3.0f; + Matrix expected = new Matrix( + 2.0f, 0.0f, + 0.0f, 3.0f, + 0.0f, 0.0f); + Matrix actual = Matrix.CreateScale(xScale, yScale); + Assert.Equal(expected, actual); + } + + // A test for CreateScale (float, float, Vector2f) + [Fact] + public void MatrixCreateScaleCenterTest3() + { + SizeF scale = new SizeF(3, 4); + PointF center = new PointF(23, 42); + + Matrix scaleAroundZero = Matrix.CreateScale(scale.Width, scale.Height, Vector2.Zero); + Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale.Width, scale.Height); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); + + Matrix scaleAroundCenter = Matrix.CreateScale(scale.Width, scale.Height, center); + Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale.Width, scale.Height) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); + } + + // A test for CreateTranslation (Vector2f) + [Fact] + public void MatrixCreateTranslationTest1() + { + PointF position = new PointF(2.0f, 3.0f); + Matrix expected = new Matrix( + 1.0f, 0.0f, + 0.0f, 1.0f, + 2.0f, 3.0f); + + Matrix actual = Matrix.CreateTranslation(position); + Assert.Equal(expected, actual); + } + + // A test for CreateTranslation (float, float) + [Fact] + public void MatrixCreateTranslationTest2() + { + float xPosition = 2.0f; + float yPosition = 3.0f; + + Matrix expected = new Matrix( + 1.0f, 0.0f, + 0.0f, 1.0f, + 2.0f, 3.0f); + + Matrix actual = Matrix.CreateTranslation(xPosition, yPosition); + Assert.Equal(expected, actual); + } + + // A test for Translation + [Fact] + public void MatrixTranslationTest() + { + Matrix a = GenerateTestMatrix(); + Matrix b = a; + + // Transformed vector that has same semantics of property must be same. + PointF val = new PointF(a.M31, a.M32); + Assert.Equal(val, a.Translation); + + // Set value and get value must be same. + val = new PointF(1.0f, 2.0f); + a.Translation = val; + Assert.Equal(val, a.Translation); + + // Make sure it only modifies expected value of matrix. + Assert.True( + a.M11 == b.M11 && a.M12 == b.M12 && + a.M21 == b.M21 && a.M22 == b.M22 && + a.M31 != b.M31 && a.M32 != b.M32, + "Matrix.Translation modified unexpected value of matrix."); + } + + // A test for Equals (Matrix) + [Fact] + public void MatrixEqualsTest1() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + // case 1: compare between same values + bool expected = true; + bool actual = a.Equals(b); + Assert.Equal(expected, actual); + + // case 2: compare between different values + b.M11 = 11.0f; + expected = false; + actual = a.Equals(b); + Assert.Equal(expected, actual); + } + + // A test for CreateSkew (float, float) + [Fact] + public void MatrixCreateSkewIdentityTest() + { + Matrix expected = Matrix.Identity; + Matrix actual = Matrix.CreateSkew(0, 0); + Assert.Equal(expected, actual); + } + + // A test for CreateSkew (float, float) + [Fact] + public void MatrixCreateSkewXTest() + { + Matrix expected = new Matrix(1, 0, -0.414213562373095f, 1, 0, 0); + Matrix actual = Matrix.CreateSkew(-MathF.PI / 8, 0); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + expected = new Matrix(1, 0, 0.414213562373095f, 1, 0, 0); + actual = Matrix.CreateSkew(MathF.PI / 8, 0); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + PointF result = PointF.Transform(new PointF(0, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new PointF(0, 0), result)); + + result = PointF.Transform(new Vector2(0, 1), actual); + Assert.True(ApproximateFloatComparer.Equal(new PointF(0.414213568f, 1), result)); + result = PointF.Transform(new PointF(0, -1), actual); + Assert.True(ApproximateFloatComparer.Equal(new PointF(-0.414213568f, -1), result)); + + result = PointF.Transform(new PointF(3, 10), actual); + Assert.True(ApproximateFloatComparer.Equal(new PointF(7.14213568f, 10), result)); + } + + // A test for CreateSkew (float, float) + [Fact] + public void MatrixCreateSkewYTest() + { + Matrix expected = new Matrix(1, -0.414213562373095f, 0, 1, 0, 0); + Matrix actual = Matrix.CreateSkew(0, -MathF.PI / 8); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + expected = new Matrix(1, 0.414213562373095f, 0, 1, 0, 0); + actual = Matrix.CreateSkew(0, MathF.PI / 8); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + Vector2 result = Vector2.Transform(new Vector2(0, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(0, 0), result)); + + result = Vector2.Transform(new Vector2(1, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, 0.414213568f), result)); + + result = Vector2.Transform(new Vector2(-1, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(-1, -0.414213568f), result)); + + result = Vector2.Transform(new Vector2(10, 3), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(10, 7.14213568f), result)); + } + + // A test for CreateSkew (float, float) + [Fact] + public void MatrixCreateSkewXYTest() + { + Matrix expected = new Matrix(1, -0.414213562373095f, 1, 1, 0, 0); + Matrix actual = Matrix.CreateSkew(MathF.PI / 4, -MathF.PI / 8); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + Vector2 result = Vector2.Transform(new Vector2(0, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(0, 0), result)); + + result = Vector2.Transform(new Vector2(1, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, -0.414213562373095f), result)); + + result = Vector2.Transform(new Vector2(0, 1), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, 1), result)); + + result = Vector2.Transform(new Vector2(1, 1), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(2, 0.585786437626905f), result)); + } + + // A test for CreateSkew (float, float, Vector2f) + [Fact] + public void MatrixCreateSkewCenterTest() + { + float skewX = 1, skewY = 2; + Vector2 center = new Vector2(23, 42); + + Matrix skewAroundZero = Matrix.CreateSkew(skewX, skewY, Vector2.Zero); + Matrix skewAroundZeroExpected = Matrix.CreateSkew(skewX, skewY); + Assert.True(ApproximateFloatComparer.Equal(skewAroundZero, skewAroundZeroExpected)); + + Matrix skewAroundCenter = Matrix.CreateSkew(skewX, skewY, center); + Matrix skewAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateSkew(skewX, skewY) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(skewAroundCenter, skewAroundCenterExpected)); + } + + // A test for IsIdentity + [Fact] + public void MatrixIsIdentityTest() + { + Assert.True(Matrix.Identity.IsIdentity); + Assert.True(new Matrix(1, 0, 0, 1, 0, 0).IsIdentity); + Assert.False(new Matrix(0, 0, 0, 1, 0, 0).IsIdentity); + Assert.False(new Matrix(1, 1, 0, 1, 0, 0).IsIdentity); + Assert.False(new Matrix(1, 0, 1, 1, 0, 0).IsIdentity); + Assert.False(new Matrix(1, 0, 0, 0, 0, 0).IsIdentity); + Assert.False(new Matrix(1, 0, 0, 1, 1, 0).IsIdentity); + Assert.False(new Matrix(1, 0, 0, 1, 0, 1).IsIdentity); + } + + // A test for Matrix comparison involving NaN values + [Fact] + public void MatrixEqualsNanTest() + { + Matrix a = new Matrix(float.NaN, 0, 0, 0, 0, 0); + Matrix b = new Matrix(0, float.NaN, 0, 0, 0, 0); + Matrix c = new Matrix(0, 0, float.NaN, 0, 0, 0); + Matrix d = new Matrix(0, 0, 0, float.NaN, 0, 0); + Matrix e = new Matrix(0, 0, 0, 0, float.NaN, 0); + Matrix f = new Matrix(0, 0, 0, 0, 0, float.NaN); + + Assert.False(a == new Matrix()); + Assert.False(b == new Matrix()); + Assert.False(c == new Matrix()); + Assert.False(d == new Matrix()); + Assert.False(e == new Matrix()); + Assert.False(f == new Matrix()); + + Assert.True(a != new Matrix()); + Assert.True(b != new Matrix()); + Assert.True(c != new Matrix()); + Assert.True(d != new Matrix()); + Assert.True(e != new Matrix()); + Assert.True(f != new Matrix()); + + Assert.False(a.Equals(new Matrix())); + Assert.False(b.Equals(new Matrix())); + Assert.False(c.Equals(new Matrix())); + Assert.False(d.Equals(new Matrix())); + Assert.False(e.Equals(new Matrix())); + Assert.False(f.Equals(new Matrix())); + + Assert.False(a.IsIdentity); + Assert.False(b.IsIdentity); + Assert.False(c.IsIdentity); + Assert.False(d.IsIdentity); + Assert.False(e.IsIdentity); + Assert.False(f.IsIdentity); + + // Counterintuitive result - IEEE rules for NaN comparison are weird! + Assert.False(a.Equals(a)); + Assert.False(b.Equals(b)); + Assert.False(c.Equals(c)); + Assert.False(d.Equals(d)); + Assert.False(e.Equals(e)); + Assert.False(f.Equals(f)); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs index b6dd64511..28429f057 100644 --- a/tests/SixLabors.Primitives.Tests/PointFTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -3,7 +3,7 @@ // Licensed under the Apache License, Version 2.0. // -namespace SixLabors.Primitives.Tests.Numerics +namespace SixLabors.Primitives.Tests { using System; using System.Globalization; diff --git a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj index a300a0b06..2dd674fdc 100644 --- a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj +++ b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj @@ -3,7 +3,7 @@ 0.0.0 netcoreapp1.1 - SixLabors.Shapes.Tests + SixLabors.Primitives.Tests SixLabors.Shapes.Tests true false @@ -17,7 +17,6 @@ - From d5495aa4a64877d33a6b6f17b06175034346bf25 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Wed, 7 Jun 2017 19:49:16 +0100 Subject: [PATCH 006/136] [SL.Core] Remove matrix in favour of Matrix3x2 --- .../ApproximateFloatComparer.cs | 11 +- src/SixLabors.Primitives/Matrix.cs | 399 ------- .../Matrix3x2Extentions.cs | 105 ++ src/SixLabors.Primitives/Point.cs | 6 +- src/SixLabors.Primitives/PointF.cs | 6 +- src/SixLabors.Primitives/Rectangle.cs | 2 +- src/SixLabors.Primitives/RectangleF.cs | 2 +- src/SixLabors.Primitives/Size.cs | 2 +- src/SixLabors.Primitives/SizeF.cs | 2 +- .../SixLabors.Primitives.Tests/MatrixTests.cs | 1015 ----------------- .../SixLabors.Primitives.Tests/PointFTests.cs | 4 +- .../SixLabors.Primitives.Tests/PointTests.cs | 4 +- 12 files changed, 124 insertions(+), 1434 deletions(-) delete mode 100644 src/SixLabors.Primitives/Matrix.cs create mode 100644 src/SixLabors.Primitives/Matrix3x2Extentions.cs delete mode 100644 tests/SixLabors.Primitives.Tests/MatrixTests.cs diff --git a/src/SixLabors.Primitives/ApproximateFloatComparer.cs b/src/SixLabors.Primitives/ApproximateFloatComparer.cs index 0d854a110..9722508a4 100644 --- a/src/SixLabors.Primitives/ApproximateFloatComparer.cs +++ b/src/SixLabors.Primitives/ApproximateFloatComparer.cs @@ -14,10 +14,9 @@ namespace SixLabors.Primitives IEqualityComparer, IEqualityComparer, IEqualityComparer, - IEqualityComparer, + IEqualityComparer, IEqualityComparer, IEqualityComparer - { private readonly float tolerance; const float defaultTolerance = 1e-5f; @@ -89,7 +88,7 @@ namespace SixLabors.Primitives return hash; } - public static bool Equal(Matrix3x2 a, Matrix3x2 b, float tolerance) + public static bool Equal(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b, float tolerance) { return Equal(a.M11, b.M11, tolerance) && Equal(a.M12, b.M12, tolerance) && @@ -99,17 +98,17 @@ namespace SixLabors.Primitives Equal(a.M32, b.M32, tolerance); } - public static bool Equal(Matrix3x2 a, Matrix3x2 b) + public static bool Equal(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b) { return Equal(a, b, defaultTolerance); } - public bool Equals(Matrix3x2 a, Matrix3x2 b) + public bool Equals(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b) { return Equal(a, b, this.tolerance); } - public int GetHashCode(Matrix3x2 obj) + public int GetHashCode(System.Numerics.Matrix3x2 obj) { int hash = GetHashCode(obj.M11); hash = HashHelpers.Combine(hash, GetHashCode(obj.M11)); diff --git a/src/SixLabors.Primitives/Matrix.cs b/src/SixLabors.Primitives/Matrix.cs deleted file mode 100644 index aa97c3ed7..000000000 --- a/src/SixLabors.Primitives/Matrix.cs +++ /dev/null @@ -1,399 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.Numerics; - using System.Runtime.CompilerServices; - - /// - /// A Matrix object for applying matrix transforms to primitives. - /// - public struct Matrix : IEquatable - { - private Matrix3x2 backingMatrix; - - private static readonly Matrix _identity = new Matrix - { - backingMatrix = Matrix3x2.Identity - }; - - /// - /// Returns the multiplicative identity matrix. - /// - public static Matrix Identity => _identity; - - /// - /// Returns whether the matrix is the identity matrix. - /// - public bool IsIdentity => this.backingMatrix.IsIdentity; - - /// - /// Gets or Sets the translation component of this matrix. - /// - public PointF Translation - { - get => this.backingMatrix.Translation; - set => this.backingMatrix.Translation = value; - } - - /// - /// The first element of the first row - /// - public float M11 { get => this.backingMatrix.M11; set => this.backingMatrix.M11 = value; } - - /// - /// The second element of the first row - /// - public float M12 { get => this.backingMatrix.M12; set => this.backingMatrix.M12 = value; } - - /// - /// The first element of the second row - /// - public float M21 { get => this.backingMatrix.M21; set => this.backingMatrix.M21 = value; } - - /// - /// The second element of the second row - /// - public float M22 { get => this.backingMatrix.M22; set => this.backingMatrix.M22 = value; } - - /// - /// The first element of the third row - /// - public float M31 { get => this.backingMatrix.M31; set => this.backingMatrix.M31 = value; } - - /// - /// The second element of the third row - /// - public float M32 { get => this.backingMatrix.M32; set => this.backingMatrix.M32 = value; } - - /// - /// Constructs a Matrix3x2 from the given components. - /// - public Matrix(float m11, float m12, - float m21, float m22, - float m31, float m32) - { - this.backingMatrix = new Matrix3x2(m11, m12, m21, m22, m31, m32); - } - - /// - /// Creates a translation matrix from the given vector. - /// - /// The translation position. - /// A translation matrix. - public static Matrix CreateTranslation(PointF position) => Matrix3x2.CreateTranslation(position); - - /// - /// Creates a translation matrix from the given X and Y components. - /// - /// The X position. - /// The Y position. - /// A translation matrix. - public static Matrix CreateTranslation(float xPosition, float yPosition) => Matrix3x2.CreateTranslation(xPosition, yPosition); - - /// - /// Creates a scale matrix from the given X and Y components. - /// - /// Value to scale by on the X-axis. - /// Value to scale by on the Y-axis. - /// A scaling matrix. - public static Matrix CreateScale(float xScale, float yScale) => Matrix3x2.CreateScale(xScale, yScale); - - /// - /// Creates a scale matrix that is offset by a given center point. - /// - /// Value to scale by on the X-axis. - /// Value to scale by on the Y-axis. - /// The center point. - /// A scaling matrix. - public static Matrix CreateScale(float xScale, float yScale, PointF centerPoint) => Matrix3x2.CreateScale(xScale, yScale, centerPoint); - - /// - /// Creates a scale matrix from the given vector scale. - /// - /// The scale to use. - /// A scaling matrix. - public static Matrix CreateScale(SizeF scales) => Matrix3x2.CreateScale(scales); - - /// - /// Creates a scale matrix from the given vector scale with an offset from the given center point. - /// - /// The scale to use. - /// The center offset. - /// A scaling matrix. - public static Matrix CreateScale(SizeF scales, PointF centerPoint) => Matrix3x2.CreateScale(scales, centerPoint); - - /// - /// Creates a scale matrix that scales uniformly with the given scale. - /// - /// The uniform scale to use. - /// A scaling matrix. - public static Matrix CreateScale(float scale) => Matrix3x2.CreateScale(scale); - - /// - /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. - /// - /// The uniform scale to use. - /// The center offset. - /// A scaling matrix. - public static Matrix CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); - - /// - /// Creates a skew matrix from the given angles in radians. - /// - /// The X angle, in radians. - /// The Y angle, in radians. - /// A skew matrix. - public static Matrix CreateSkew(float radiansX, float radiansY) => Matrix3x2.CreateSkew(radiansX, radiansY); - - /// - /// Creates a skew matrix from the given angles in radians. - /// - /// The X angle, in degrees. - /// The Y angle, in degrees. - /// A skew matrix. - public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); - - /// - /// Creates a skew matrix from the given angles in radians and a center point. - /// - /// The X angle, in radians. - /// The Y angle, in radians. - /// The center point. - /// A skew matrix. - public static Matrix CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); - - /// - /// Creates a skew matrix from the given angles in radians and a center point. - /// - /// The X angle, in degrees. - /// The Y angle, in degrees. - /// The center point. - /// A skew matrix. - public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); - - /// - /// Creates a rotation matrix using the given rotation in radians. - /// - /// The amount of rotation, in radians. - /// A rotation matrix. - public static Matrix CreateRotation(float radians) => System.Numerics.Matrix3x2.CreateRotation(radians); - - /// - /// Creates a rotation matrix using the given rotation in radians. - /// - /// The amount of rotation, in degrees. - /// A rotation matrix. - public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); - - /// - /// Creates a rotation matrix using the given rotation in radians and a center point. - /// - /// The amount of rotation, in radians. - /// The center point. - /// A rotation matrix. - public static Matrix CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); - - /// - /// Creates a rotation matrix using the given rotation in radians and a center point. - /// - /// The amount of rotation, in degrees. - /// The center point. - /// A rotation matrix. - public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); - - /// - /// Calculates the determinant for this matrix. - /// The determinant is calculated by expanding the matrix with a third column whose values are (0,0,1). - /// - /// The determinant. - public float GetDeterminant() => this.backingMatrix.GetDeterminant(); - - /// - /// Attempts to invert the given matrix. If the operation succeeds, the inverted matrix is stored in the result parameter. - /// - /// The source matrix. - /// The output matrix. - /// True if the operation succeeded, False otherwise. - public static bool Invert(Matrix matrix, out Matrix result) - { - Matrix3x2 m; - var b = System.Numerics.Matrix3x2.Invert(matrix.backingMatrix, out m); - result = m; - return b; - } - - /// - /// Linearly interpolates from matrix1 to matrix2, based on the third parameter. - /// - /// The first source matrix. - /// The second source matrix. - /// The relative weighting of matrix2. - /// The interpolated matrix. - public static Matrix Lerp(Matrix matrix1, Matrix matrix2, float amount) => Matrix3x2.Lerp(matrix1.backingMatrix, matrix2.backingMatrix, amount); - - /// - /// Negates the given matrix by multiplying all values by -1. - /// - /// The source matrix. - /// The negated matrix. - public static Matrix Negate(Matrix value) => -value.backingMatrix; - - /// - /// Adds each matrix element in value1 with its corresponding element in value2. - /// - /// The first source matrix. - /// The second source matrix. - /// The matrix containing the summed values. - public static Matrix Add(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; - - /// - /// Subtracts each matrix element in value2 from its corresponding element in value1. - /// - /// The first source matrix. - /// The second source matrix. - /// The matrix containing the resulting values. - public static Matrix Subtract(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; - - /// - /// Multiplies two matrices together and returns the resulting matrix. - /// - /// The first source matrix. - /// The second source matrix. - /// The product matrix. - public static Matrix Multiply(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; - - /// - /// Scales all elements in a matrix by the given scalar factor. - /// - /// The source matrix. - /// The scaling value to use. - /// The resulting matrix. - public static Matrix Multiply(Matrix value1, float value2) => value1.backingMatrix * value2; - - /// - /// Negates the given matrix by multiplying all values by -1. - /// - /// The source matrix. - /// The negated matrix. - public static Matrix operator -(Matrix value) => -value.backingMatrix; - - /// - /// Adds each matrix element in value1 with its corresponding element in value2. - /// - /// The first source matrix. - /// The second source matrix. - /// The matrix containing the summed values. - public static Matrix operator +(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; - - /// - /// Subtracts each matrix element in value2 from its corresponding element in value1. - /// - /// The first source matrix. - /// The second source matrix. - /// The matrix containing the resulting values. - public static Matrix operator -(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; - - /// - /// Multiplies two matrices together and returns the resulting matrix. - /// - /// The first source matrix. - /// The second source matrix. - /// The product matrix. - public static Matrix operator *(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; - - /// - /// Scales all elements in a matrix by the given scalar factor. - /// - /// The source matrix. - /// The scaling value to use. - /// The resulting matrix. - public static Matrix operator *(Matrix value1, float value2) => value1.backingMatrix * value2; - - /// - /// Returns a boolean indicating whether the given matrices are equal. - /// - /// The first source matrix. - /// The second source matrix. - /// True if the matrices are equal; False otherwise. - public static bool operator ==(Matrix value1, Matrix value2) => value1.backingMatrix == value2.backingMatrix; - - /// - /// Returns a boolean indicating whether the given matrices are not equal. - /// - /// The first source matrix. - /// The second source matrix. - /// True if the matrices are not equal; False if they are equal. - public static bool operator !=(Matrix value1, Matrix value2) - { - return value1.backingMatrix != value2.backingMatrix; - - } - - /// - /// Returns a boolean indicating whether the matrix is equal to the other given matrix. - /// - /// The other matrix to test equality against. - /// True if this matrix is equal to other; False otherwise. - public bool Equals(Matrix other) - { - return this.backingMatrix == other.backingMatrix; - } - - /// - /// Returns a boolean indicating whether the given Object is equal to this matrix instance. - /// - /// The Object to compare against. - /// True if the Object is equal to this matrix; False otherwise. - public override bool Equals(object obj) - { - if (obj is Matrix) - { - return Equals((Matrix)obj); - } - - return false; - } - - /// - /// Returns a String representing this matrix instance. - /// - /// The string representation. - public override string ToString() => this.backingMatrix.ToString(); - - /// - /// Returns the hash code for this instance. - /// - /// The hash code. - public override int GetHashCode() => this.backingMatrix.GetHashCode(); - - /// - /// Creates a with the values of the specified . - /// - /// The matrix. - /// - /// The . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator Matrix3x2(Matrix matrix) => matrix.backingMatrix; - - /// - /// Creates a with the values of the specified . - /// - /// The matrix. - /// - /// The . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator Matrix(Matrix3x2 matrix) => new Matrix { backingMatrix = matrix }; - - internal static Matrix CreateScale(Vector2 scale, object zero) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/SixLabors.Primitives/Matrix3x2Extentions.cs b/src/SixLabors.Primitives/Matrix3x2Extentions.cs new file mode 100644 index 000000000..f20e19a1b --- /dev/null +++ b/src/SixLabors.Primitives/Matrix3x2Extentions.cs @@ -0,0 +1,105 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// A Matrix object for applying matrix transforms to primitives. + /// + public static class Matrix3x2Extentions + { + /// + /// Creates a translation matrix from the given vector. + /// + /// The translation position. + /// A translation matrix. + public static Matrix3x2 CreateTranslation(PointF position) => System.Numerics.Matrix3x2.CreateTranslation(position); + + /// + /// Creates a scale matrix that is offset by a given center point. + /// + /// Value to scale by on the X-axis. + /// Value to scale by on the Y-axis. + /// The center point. + /// A scaling matrix. + public static Matrix3x2 CreateScale(float xScale, float yScale, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(xScale, yScale, centerPoint); + + /// + /// Creates a scale matrix from the given vector scale. + /// + /// The scale to use. + /// A scaling matrix. + public static Matrix3x2 CreateScale(SizeF scales) => System.Numerics.Matrix3x2.CreateScale(scales); + + /// + /// Creates a scale matrix from the given vector scale with an offset from the given center point. + /// + /// The scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix3x2 CreateScale(SizeF scales, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(scales, centerPoint); + + /// + /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. + /// + /// The uniform scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix3x2 CreateScale(float scale, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(scale, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// A skew matrix. + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => System.Numerics.Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in radians. + /// The Y angle, in radians. + /// The center point. + /// A skew matrix. + public static Matrix3x2 CreateSkew(float radiansX, float radiansY, PointF centerPoint) => System.Numerics.Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// The center point. + /// A skew matrix. + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => System.Numerics.Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians. + /// + /// The amount of rotation, in degrees. + /// A rotation matrix. + public static Matrix3x2 CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in radians. + /// The center point. + /// A rotation matrix. + public static Matrix3x2 CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in degrees. + /// The center point. + /// A rotation matrix. + public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); + } +} diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Primitives/Point.cs index 206d0545a..5d37d01a6 100644 --- a/src/SixLabors.Primitives/Point.cs +++ b/src/SixLabors.Primitives/Point.cs @@ -206,7 +206,7 @@ namespace SixLabors.Primitives /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + public static Point Rotate(Point point, System.Numerics.Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); /// /// Skews a point using the given skew matrix. @@ -215,7 +215,7 @@ namespace SixLabors.Primitives /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + public static Point Skew(Point point, System.Numerics.Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); /// /// Translates this by the specified amount. @@ -272,7 +272,7 @@ namespace SixLabors.Primitives /// The source point /// The transformation matrix. /// - public static PointF Transform(Point position, Matrix matrix) + public static PointF Transform(Point position, Matrix3x2 matrix) { return Vector2.Transform(position, matrix); } diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Primitives/PointF.cs index 8df9ef7bf..ca011483e 100644 --- a/src/SixLabors.Primitives/PointF.cs +++ b/src/SixLabors.Primitives/PointF.cs @@ -218,7 +218,7 @@ namespace SixLabors.Primitives /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static PointF Rotate(PointF point, Matrix rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); + public static PointF Rotate(PointF point, Matrix3x2 rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); /// /// Skews a point using the given skew matrix. @@ -227,7 +227,7 @@ namespace SixLabors.Primitives /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static PointF Skew(PointF point, Matrix skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); + public static PointF Skew(PointF point, Matrix3x2 skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); /// /// Translates this by the specified amount. @@ -286,7 +286,7 @@ namespace SixLabors.Primitives /// The source point /// The transformation matrix. /// - public static PointF Transform(PointF position, Matrix matrix) + public static PointF Transform(PointF position, Matrix3x2 matrix) { return Vector2.Transform(position, matrix); } diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Primitives/Rectangle.cs index 173ee5d1b..735920f0a 100644 --- a/src/SixLabors.Primitives/Rectangle.cs +++ b/src/SixLabors.Primitives/Rectangle.cs @@ -467,7 +467,7 @@ namespace SixLabors.Primitives /// The source rectangle /// The transformation matrix. /// - public static RectangleF Transform(Rectangle rectangle, Matrix matrix) + public static RectangleF Transform(Rectangle rectangle, Matrix3x2 matrix) { PointF bottomRight = Point.Transform(new Point(rectangle.Right, rectangle.Bottom), matrix); PointF topLeft = Point.Transform(rectangle.Location, matrix); diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Primitives/RectangleF.cs index d74fb796f..36578a455 100644 --- a/src/SixLabors.Primitives/RectangleF.cs +++ b/src/SixLabors.Primitives/RectangleF.cs @@ -400,7 +400,7 @@ namespace SixLabors.Primitives /// The source rectangle /// The transformation matrix. /// - public static RectangleF Transform(RectangleF rectangle, Matrix matrix) + public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) { PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); PointF topLeft = PointF.Transform(rectangle.Location, matrix); diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs index fb306f128..d0716d5ac 100644 --- a/src/SixLabors.Primitives/Size.cs +++ b/src/SixLabors.Primitives/Size.cs @@ -234,7 +234,7 @@ namespace SixLabors.Primitives /// The source size /// The transformation matrix. /// - public static SizeF Transform(Size size, Matrix matrix) + public static SizeF Transform(Size size, Matrix3x2 matrix) { var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs index b822740cd..54db16b77 100644 --- a/src/SixLabors.Primitives/SizeF.cs +++ b/src/SixLabors.Primitives/SizeF.cs @@ -198,7 +198,7 @@ namespace SixLabors.Primitives /// The source size /// The transformation matrix. /// - public static SizeF Transform(SizeF size, Matrix matrix) + public static SizeF Transform(SizeF size, Matrix3x2 matrix) { var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); diff --git a/tests/SixLabors.Primitives.Tests/MatrixTests.cs b/tests/SixLabors.Primitives.Tests/MatrixTests.cs deleted file mode 100644 index c228f7493..000000000 --- a/tests/SixLabors.Primitives.Tests/MatrixTests.cs +++ /dev/null @@ -1,1015 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives.Tests -{ - using System.Globalization; - using System.Numerics; - using Xunit; - - /// - /// Tests the struct. - /// - public class MatrixTests - { - - [Fact] - public void ImplicitCastMatrixToMatrix3x2() - { - Matrix matrix = new Matrix(1, 2, 3, 4, 5, 6); - - Matrix3x2 convertedMatrix = matrix; - Assert.Equal(1, convertedMatrix.M11); - Assert.Equal(2, convertedMatrix.M12); - Assert.Equal(3, convertedMatrix.M21); - Assert.Equal(4, convertedMatrix.M22); - Assert.Equal(5, convertedMatrix.M31); - Assert.Equal(6, convertedMatrix.M32); - } - - [Fact] - public void ImplicitCastMatrix3x2ToMatrix() - { - Matrix3x2 matrix = new Matrix3x2(1, 2, 3, 4, 5, 6); - - Matrix convertedMatrix = matrix; - Assert.Equal(1, convertedMatrix.M11); - Assert.Equal(2, convertedMatrix.M12); - Assert.Equal(3, convertedMatrix.M21); - Assert.Equal(4, convertedMatrix.M22); - Assert.Equal(5, convertedMatrix.M31); - Assert.Equal(6, convertedMatrix.M32); - } - - /// matrix test mostly tken directly from CoreFX - /// - static Matrix GenerateMatrixNumberFrom1To6() - { - Matrix a = new Matrix(); - a.M11 = 1.0f; - a.M12 = 2.0f; - a.M21 = 3.0f; - a.M22 = 4.0f; - a.M31 = 5.0f; - a.M32 = 6.0f; - return a; - } - - static Matrix GenerateTestMatrix() - { - Matrix m = Matrix.CreateRotation(MathF.ToRadians(30.0f)); - m.Translation = new Vector2(111.0f, 222.0f); - return m; - } - - // A test for Identity - [Fact] - public void MatrixIdentityTest() - { - Matrix val = new Matrix(); - val.M11 = val.M22 = 1.0f; - - Assert.True(ApproximateFloatComparer.Equal(val, Matrix.Identity), "Matrix.Indentity was not set correctly."); - } - - // A test for Determinant - [Fact] - public void MatrixDeterminantTest() - { - Matrix target = Matrix.CreateRotation(MathF.ToRadians(30.0f)); - - float val = 1.0f; - float det = target.GetDeterminant(); - - Assert.True(ApproximateFloatComparer.Equal(val, det), "Matrix.Determinant was not set correctly."); - } - - // A test for Determinant - // Determinant test |A| = 1 / |A'| - [Fact] - public void MatrixDeterminantTest1() - { - Matrix a = new Matrix(); - a.M11 = 5.0f; - a.M12 = 2.0f; - a.M21 = 12.0f; - a.M22 = 6.8f; - a.M31 = 6.5f; - a.M32 = 1.0f; - Matrix i; - Assert.True(Matrix.Invert(a, out i)); - - float detA = a.GetDeterminant(); - float detI = i.GetDeterminant(); - float t = 1.0f / detI; - - // only accurate to 3 precision - Assert.True(System.Math.Abs(detA - t) < 1e-3, "Matrix.Determinant was not set correctly."); - - // sanity check against 4x4 version - Assert.Equal(new Matrix4x4(a).GetDeterminant(), detA); - Assert.Equal(new Matrix4x4(i).GetDeterminant(), detI); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertTest() - { - Matrix mtx = Matrix.CreateRotation(MathF.ToRadians(30.0f)); - - Matrix expected = new Matrix(); - expected.M11 = 0.8660254f; - expected.M12 = -0.5f; - - expected.M21 = 0.5f; - expected.M22 = 0.8660254f; - - expected.M31 = 0; - expected.M32 = 0; - - Matrix actual; - - Assert.True(Matrix.Invert(mtx, out actual)); - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.Invert did not return the expected value."); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity), "Matrix.Invert did not return the expected value."); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertIdentityTest() - { - Matrix mtx = Matrix.Identity; - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Assert.True(ApproximateFloatComparer.Equal(actual, Matrix.Identity)); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertTranslationTest() - { - Matrix mtx = Matrix.CreateTranslation(23, 42); - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertRotationTest() - { - Matrix mtx = Matrix.CreateRotation(2); - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertScaleTest() - { - Matrix mtx = Matrix.CreateScale(23, -42); - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertAffineTest() - { - Matrix mtx = Matrix.CreateRotation(2) * - Matrix.CreateScale(23, -42) * - Matrix.CreateTranslation(17, 53); - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); - } - - // A test for CreateRotation (float) - [Fact] - public void MatrixCreateRotationTest() - { - float radians = MathF.ToRadians(50.0f); - - Matrix expected = new Matrix(); - expected.M11 = 0.642787635f; - expected.M12 = 0.766044438f; - expected.M21 = -0.766044438f; - expected.M22 = 0.642787635f; - - Matrix actual; - actual = Matrix.CreateRotation(radians); - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.CreateRotation did not return the expected value."); - } - - // A test for CreateRotation (float, Vector2f) - [Fact] - public void MatrixCreateRotationCenterTest() - { - float radians = MathF.ToRadians(30.0f); - Vector2 center = new Vector2(23, 42); - - Matrix rotateAroundZero = Matrix.CreateRotation(radians, Vector2.Zero); - Matrix rotateAroundZeroExpected = Matrix.CreateRotation(radians); - Assert.True(ApproximateFloatComparer.Equal(rotateAroundZero, rotateAroundZeroExpected)); - - Matrix rotateAroundCenter = Matrix.CreateRotation(radians, center); - Matrix rotateAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateRotation(radians) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(rotateAroundCenter, rotateAroundCenterExpected)); - } - - // A test for CreateRotation (float) - [Fact] - public void MatrixCreateRotationRightAngleTest() - { - // 90 degree rotations must be exact! - Matrix actual = Matrix.CreateRotation(0); - Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI / 2); - Assert.Equal(new Matrix(0, 1, -1, 0, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI); - Assert.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI * 3 / 2); - Assert.Equal(new Matrix(0, -1, 1, 0, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI * 2); - Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI * 5 / 2); - Assert.Equal(new Matrix(0, 1, -1, 0, 0, 0), actual); - - actual = Matrix.CreateRotation(-MathF.PI / 2); - Assert.Equal(new Matrix(0, -1, 1, 0, 0, 0), actual); - - // But merely close-to-90 rotations should not be excessively clamped. - float delta = MathF.ToRadians(0.01f); - - actual = Matrix.CreateRotation(MathF.PI + delta); - Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual)); - - actual = Matrix.CreateRotation(MathF.PI - delta); - Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual)); - } - - // A test for CreateRotation (float, Vector2f) - [Fact] - public void MatrixCreateRotationRightAngleCenterTest() - { - Vector2 center = new Vector2(3, 7); - - // 90 degree rotations must be exact! - Matrix actual = Matrix.CreateRotation(0, center); - Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI / 2, center); - Assert.Equal(new Matrix(0, 1, -1, 0, 10, 4), actual); - - actual = Matrix.CreateRotation(MathF.PI, center); - Assert.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual); - - actual = Matrix.CreateRotation(MathF.PI * 3 / 2, center); - Assert.Equal(new Matrix(0, -1, 1, 0, -4, 10), actual); - - actual = Matrix.CreateRotation(MathF.PI * 2, center); - Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI * 5 / 2, center); - Assert.Equal(new Matrix(0, 1, -1, 0, 10, 4), actual); - - actual = Matrix.CreateRotation(-MathF.PI / 2, center); - Assert.Equal(new Matrix(0, -1, 1, 0, -4, 10), actual); - - // But merely close-to-90 rotations should not be excessively clamped. - float delta = MathF.ToRadians(0.01f); - - actual = Matrix.CreateRotation(MathF.PI + delta, center); - Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual)); - - actual = Matrix.CreateRotation(MathF.PI - delta, center); - Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual)); - } - - // A test for Invert (Matrix) - // Non invertible matrix - determinant is zero - singular matrix - [Fact] - public void MatrixInvertTest1() - { - Matrix a = new Matrix(); - a.M11 = 0.0f; - a.M12 = 2.0f; - a.M21 = 0.0f; - a.M22 = 4.0f; - a.M31 = 5.0f; - a.M32 = 6.0f; - - float detA = a.GetDeterminant(); - Assert.True(ApproximateFloatComparer.Equal(detA, 0.0f), "Matrix.Invert did not return the expected value."); - - Matrix actual; - Assert.False(Matrix.Invert(a, out actual)); - - // all the elements in Actual is NaN - Assert.True( - float.IsNaN(actual.M11) && float.IsNaN(actual.M12) && - float.IsNaN(actual.M21) && float.IsNaN(actual.M22) && - float.IsNaN(actual.M31) && float.IsNaN(actual.M32) - , "Matrix.Invert did not return the expected value."); - } - - // A test for Lerp (Matrix, Matrix, float) - [Fact] - public void MatrixLerpTest() - { - Matrix a = new Matrix(); - a.M11 = 11.0f; - a.M12 = 12.0f; - a.M21 = 21.0f; - a.M22 = 22.0f; - a.M31 = 31.0f; - a.M32 = 32.0f; - - Matrix b = GenerateMatrixNumberFrom1To6(); - - float t = 0.5f; - - Matrix expected = new Matrix(); - expected.M11 = a.M11 + (b.M11 - a.M11) * t; - expected.M12 = a.M12 + (b.M12 - a.M12) * t; - - expected.M21 = a.M21 + (b.M21 - a.M21) * t; - expected.M22 = a.M22 + (b.M22 - a.M22) * t; - - expected.M31 = a.M31 + (b.M31 - a.M31) * t; - expected.M32 = a.M32 + (b.M32 - a.M32) * t; - - Matrix actual; - actual = Matrix.Lerp(a, b, t); - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.Lerp did not return the expected value."); - } - - // A test for operator - (Matrix) - [Fact] - public void MatrixUnaryNegationTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = -1.0f; - expected.M12 = -2.0f; - expected.M21 = -3.0f; - expected.M22 = -4.0f; - expected.M31 = -5.0f; - expected.M32 = -6.0f; - - Matrix actual = -a; - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator - did not return the expected value."); - } - - // A test for operator - (Matrix, Matrix) - [Fact] - public void MatrixSubtractionTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - Matrix expected = new Matrix(); - - Matrix actual = a - b; - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator - did not return the expected value."); - } - - // A test for operator * (Matrix, Matrix) - [Fact] - public void MatrixMultiplyTest1() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = a.M11 * b.M11 + a.M12 * b.M21; - expected.M12 = a.M11 * b.M12 + a.M12 * b.M22; - - expected.M21 = a.M21 * b.M11 + a.M22 * b.M21; - expected.M22 = a.M21 * b.M12 + a.M22 * b.M22; - - expected.M31 = a.M31 * b.M11 + a.M32 * b.M21 + b.M31; - expected.M32 = a.M31 * b.M12 + a.M32 * b.M22 + b.M32; - - Matrix actual = a * b; - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator * did not return the expected value."); - - // Sanity check by comparison with 4x4 multiply. - a = Matrix.CreateRotation(MathF.ToRadians(30)) * Matrix.CreateTranslation(23, 42); - b = Matrix.CreateScale(3, 7) * Matrix.CreateTranslation(666, -1); - - actual = a * b; - - Matrix4x4 a44 = new Matrix4x4(a); - Matrix4x4 b44 = new Matrix4x4(b); - Matrix4x4 expected44 = a44 * b44; - Matrix4x4 actual44 = new Matrix4x4(actual); - - Assert.True(ApproximateFloatComparer.Equal(expected44, actual44), "Matrix.operator * did not return the expected value."); - } - - // A test for operator * (Matrix, Matrix) - // Multiply with identity matrix - [Fact] - public void MatrixMultiplyTest4() - { - Matrix a = new Matrix(); - a.M11 = 1.0f; - a.M12 = 2.0f; - a.M21 = 5.0f; - a.M22 = -6.0f; - a.M31 = 9.0f; - a.M32 = 10.0f; - - Matrix b = new Matrix(); - b = Matrix.Identity; - - Matrix expected = a; - Matrix actual = a * b; - - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator * did not return the expected value."); - } - - // A test for operator + (Matrix, Matrix) - [Fact] - public void MatrixAdditionTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = a.M11 + b.M11; - expected.M12 = a.M12 + b.M12; - expected.M21 = a.M21 + b.M21; - expected.M22 = a.M22 + b.M22; - expected.M31 = a.M31 + b.M31; - expected.M32 = a.M32 + b.M32; - - Matrix actual; - - actual = a + b; - - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator + did not return the expected value."); - } - - // A test for ToString () - [Fact] - public void MatrixToStringTest() - { - Matrix a = new Matrix(); - a.M11 = 11.0f; - a.M12 = -12.0f; - a.M21 = 21.0f; - a.M22 = 22.0f; - a.M31 = 31.0f; - a.M32 = 32.0f; - - string expected = "{ {M11:11 M12:-12} " + - "{M21:21 M22:22} " + - "{M31:31 M32:32} }"; - string actual; - - actual = a.ToString(); - Assert.Equal(expected, actual); - } - - // A test for Add (Matrix, Matrix) - [Fact] - public void MatrixAddTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = a.M11 + b.M11; - expected.M12 = a.M12 + b.M12; - expected.M21 = a.M21 + b.M21; - expected.M22 = a.M22 + b.M22; - expected.M31 = a.M31 + b.M31; - expected.M32 = a.M32 + b.M32; - - Matrix actual; - - actual = Matrix.Add(a, b); - Assert.Equal(expected, actual); - } - - // A test for Equals (object) - [Fact] - public void MatrixEqualsTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - // case 1: compare between same values - object obj = b; - - bool expected = true; - bool actual = a.Equals(obj); - Assert.Equal(expected, actual); - - // case 2: compare between different values - b.M11 = 11.0f; - obj = b; - expected = false; - actual = a.Equals(obj); - Assert.Equal(expected, actual); - - // case 3: compare between different types. - obj = new Vector4(); - expected = false; - actual = a.Equals(obj); - Assert.Equal(expected, actual); - - // case 3: compare against null. - obj = null; - expected = false; - actual = a.Equals(obj); - Assert.Equal(expected, actual); - } - - // A test for GetHashCode () - [Fact] - public void MatrixGetHashCodeTest() - { - Matrix target = GenerateMatrixNumberFrom1To6(); - int expected = unchecked(target.M11.GetHashCode() + target.M12.GetHashCode() + - target.M21.GetHashCode() + target.M22.GetHashCode() + - target.M31.GetHashCode() + target.M32.GetHashCode()); - int actual; - - actual = target.GetHashCode(); - Assert.Equal(expected, actual); - } - - // A test for Multiply (Matrix, Matrix) - [Fact] - public void MatrixMultiplyTest3() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = a.M11 * b.M11 + a.M12 * b.M21; - expected.M12 = a.M11 * b.M12 + a.M12 * b.M22; - - expected.M21 = a.M21 * b.M11 + a.M22 * b.M21; - expected.M22 = a.M21 * b.M12 + a.M22 * b.M22; - - expected.M31 = a.M31 * b.M11 + a.M32 * b.M21 + b.M31; - expected.M32 = a.M31 * b.M12 + a.M32 * b.M22 + b.M32; - Matrix actual; - actual = Matrix.Multiply(a, b); - - Assert.Equal(expected, actual); - - // Sanity check by comparison with 4x4 multiply. - a = Matrix.CreateRotation(MathF.ToRadians(30)) * Matrix.CreateTranslation(23, 42); - b = Matrix.CreateScale(3, 7) * Matrix.CreateTranslation(666, -1); - - actual = Matrix.Multiply(a, b); - - Matrix4x4 a44 = new Matrix4x4(a); - Matrix4x4 b44 = new Matrix4x4(b); - Matrix4x4 expected44 = Matrix4x4.Multiply(a44, b44); - Matrix4x4 actual44 = new Matrix4x4(actual); - - Assert.True(ApproximateFloatComparer.Equal(expected44, actual44), "Matrix.Multiply did not return the expected value."); - } - - // A test for Multiply (Matrix, float) - [Fact] - public void MatrixMultiplyTest5() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix expected = new Matrix(3, 6, 9, 12, 15, 18); - Matrix actual = Matrix.Multiply(a, 3); - - Assert.Equal(expected, actual); - } - - // A test for Multiply (Matrix, float) - [Fact] - public void MatrixMultiplyTest6() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix expected = new Matrix(3, 6, 9, 12, 15, 18); - Matrix actual = a * 3; - - Assert.Equal(expected, actual); - } - - // A test for Negate (Matrix) - [Fact] - public void MatrixNegateTest() - { - Matrix m = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = -1.0f; - expected.M12 = -2.0f; - expected.M21 = -3.0f; - expected.M22 = -4.0f; - expected.M31 = -5.0f; - expected.M32 = -6.0f; - Matrix actual; - - actual = Matrix.Negate(m); - Assert.Equal(expected, actual); - } - - // A test for operator != (Matrix, Matrix) - [Fact] - public void MatrixInequalityTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - // case 1: compare between same values - bool expected = false; - bool actual = a != b; - Assert.Equal(expected, actual); - - // case 2: compare between different values - b.M11 = 11.0f; - expected = true; - actual = a != b; - Assert.Equal(expected, actual); - } - - // A test for operator == (Matrix, Matrix) - [Fact] - public void MatrixEqualityTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - // case 1: compare between same values - bool expected = true; - bool actual = a == b; - Assert.Equal(expected, actual); - - // case 2: compare between different values - b.M11 = 11.0f; - expected = false; - actual = a == b; - Assert.Equal(expected, actual); - } - - // A test for Subtract (Matrix, Matrix) - [Fact] - public void MatrixSubtractTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - Matrix expected = new Matrix(); - Matrix actual; - - actual = Matrix.Subtract(a, b); - Assert.Equal(expected, actual); - } - - // A test for CreateScale (Vector2f) - [Fact] - public void MatrixCreateScaleTest1() - { - SizeF scales = new SizeF(2.0f, 3.0f); - Matrix expected = new Matrix( - 2.0f, 0.0f, - 0.0f, 3.0f, - 0.0f, 0.0f); - Matrix actual = Matrix.CreateScale(scales); - Assert.Equal(expected, actual); - } - - // A test for CreateScale (Vector2f, Vector2f) - [Fact] - public void MatrixCreateScaleCenterTest1() - { - SizeF scale = new SizeF(3, 4); - PointF center = new PointF(23, 42); - - Matrix scaleAroundZero = Matrix.CreateScale(scale, PointF.Zero); - Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); - - Matrix scaleAroundCenter = Matrix.CreateScale(scale, center); - Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); - } - - // A test for CreateScale (float) - [Fact] - public void MatrixCreateScaleTest2() - { - float scale = 2.0f; - Matrix expected = new Matrix( - 2.0f, 0.0f, - 0.0f, 2.0f, - 0.0f, 0.0f); - Matrix actual = Matrix.CreateScale(scale); - Assert.Equal(expected, actual); - } - - // A test for CreateScale (float, Vector2f) - [Fact] - public void MatrixCreateScaleCenterTest2() - { - float scale = 5; - PointF center = new PointF(23, 42); - - Matrix scaleAroundZero = Matrix.CreateScale(scale, PointF.Zero); - Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); - - Matrix scaleAroundCenter = Matrix.CreateScale(scale, center); - Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); - } - - // A test for CreateScale (float, float) - [Fact] - public void MatrixCreateScaleTest3() - { - float xScale = 2.0f; - float yScale = 3.0f; - Matrix expected = new Matrix( - 2.0f, 0.0f, - 0.0f, 3.0f, - 0.0f, 0.0f); - Matrix actual = Matrix.CreateScale(xScale, yScale); - Assert.Equal(expected, actual); - } - - // A test for CreateScale (float, float, Vector2f) - [Fact] - public void MatrixCreateScaleCenterTest3() - { - SizeF scale = new SizeF(3, 4); - PointF center = new PointF(23, 42); - - Matrix scaleAroundZero = Matrix.CreateScale(scale.Width, scale.Height, Vector2.Zero); - Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale.Width, scale.Height); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); - - Matrix scaleAroundCenter = Matrix.CreateScale(scale.Width, scale.Height, center); - Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale.Width, scale.Height) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); - } - - // A test for CreateTranslation (Vector2f) - [Fact] - public void MatrixCreateTranslationTest1() - { - PointF position = new PointF(2.0f, 3.0f); - Matrix expected = new Matrix( - 1.0f, 0.0f, - 0.0f, 1.0f, - 2.0f, 3.0f); - - Matrix actual = Matrix.CreateTranslation(position); - Assert.Equal(expected, actual); - } - - // A test for CreateTranslation (float, float) - [Fact] - public void MatrixCreateTranslationTest2() - { - float xPosition = 2.0f; - float yPosition = 3.0f; - - Matrix expected = new Matrix( - 1.0f, 0.0f, - 0.0f, 1.0f, - 2.0f, 3.0f); - - Matrix actual = Matrix.CreateTranslation(xPosition, yPosition); - Assert.Equal(expected, actual); - } - - // A test for Translation - [Fact] - public void MatrixTranslationTest() - { - Matrix a = GenerateTestMatrix(); - Matrix b = a; - - // Transformed vector that has same semantics of property must be same. - PointF val = new PointF(a.M31, a.M32); - Assert.Equal(val, a.Translation); - - // Set value and get value must be same. - val = new PointF(1.0f, 2.0f); - a.Translation = val; - Assert.Equal(val, a.Translation); - - // Make sure it only modifies expected value of matrix. - Assert.True( - a.M11 == b.M11 && a.M12 == b.M12 && - a.M21 == b.M21 && a.M22 == b.M22 && - a.M31 != b.M31 && a.M32 != b.M32, - "Matrix.Translation modified unexpected value of matrix."); - } - - // A test for Equals (Matrix) - [Fact] - public void MatrixEqualsTest1() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - // case 1: compare between same values - bool expected = true; - bool actual = a.Equals(b); - Assert.Equal(expected, actual); - - // case 2: compare between different values - b.M11 = 11.0f; - expected = false; - actual = a.Equals(b); - Assert.Equal(expected, actual); - } - - // A test for CreateSkew (float, float) - [Fact] - public void MatrixCreateSkewIdentityTest() - { - Matrix expected = Matrix.Identity; - Matrix actual = Matrix.CreateSkew(0, 0); - Assert.Equal(expected, actual); - } - - // A test for CreateSkew (float, float) - [Fact] - public void MatrixCreateSkewXTest() - { - Matrix expected = new Matrix(1, 0, -0.414213562373095f, 1, 0, 0); - Matrix actual = Matrix.CreateSkew(-MathF.PI / 8, 0); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - expected = new Matrix(1, 0, 0.414213562373095f, 1, 0, 0); - actual = Matrix.CreateSkew(MathF.PI / 8, 0); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - PointF result = PointF.Transform(new PointF(0, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new PointF(0, 0), result)); - - result = PointF.Transform(new Vector2(0, 1), actual); - Assert.True(ApproximateFloatComparer.Equal(new PointF(0.414213568f, 1), result)); - result = PointF.Transform(new PointF(0, -1), actual); - Assert.True(ApproximateFloatComparer.Equal(new PointF(-0.414213568f, -1), result)); - - result = PointF.Transform(new PointF(3, 10), actual); - Assert.True(ApproximateFloatComparer.Equal(new PointF(7.14213568f, 10), result)); - } - - // A test for CreateSkew (float, float) - [Fact] - public void MatrixCreateSkewYTest() - { - Matrix expected = new Matrix(1, -0.414213562373095f, 0, 1, 0, 0); - Matrix actual = Matrix.CreateSkew(0, -MathF.PI / 8); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - expected = new Matrix(1, 0.414213562373095f, 0, 1, 0, 0); - actual = Matrix.CreateSkew(0, MathF.PI / 8); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - Vector2 result = Vector2.Transform(new Vector2(0, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(0, 0), result)); - - result = Vector2.Transform(new Vector2(1, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, 0.414213568f), result)); - - result = Vector2.Transform(new Vector2(-1, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(-1, -0.414213568f), result)); - - result = Vector2.Transform(new Vector2(10, 3), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(10, 7.14213568f), result)); - } - - // A test for CreateSkew (float, float) - [Fact] - public void MatrixCreateSkewXYTest() - { - Matrix expected = new Matrix(1, -0.414213562373095f, 1, 1, 0, 0); - Matrix actual = Matrix.CreateSkew(MathF.PI / 4, -MathF.PI / 8); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - Vector2 result = Vector2.Transform(new Vector2(0, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(0, 0), result)); - - result = Vector2.Transform(new Vector2(1, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, -0.414213562373095f), result)); - - result = Vector2.Transform(new Vector2(0, 1), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, 1), result)); - - result = Vector2.Transform(new Vector2(1, 1), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(2, 0.585786437626905f), result)); - } - - // A test for CreateSkew (float, float, Vector2f) - [Fact] - public void MatrixCreateSkewCenterTest() - { - float skewX = 1, skewY = 2; - Vector2 center = new Vector2(23, 42); - - Matrix skewAroundZero = Matrix.CreateSkew(skewX, skewY, Vector2.Zero); - Matrix skewAroundZeroExpected = Matrix.CreateSkew(skewX, skewY); - Assert.True(ApproximateFloatComparer.Equal(skewAroundZero, skewAroundZeroExpected)); - - Matrix skewAroundCenter = Matrix.CreateSkew(skewX, skewY, center); - Matrix skewAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateSkew(skewX, skewY) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(skewAroundCenter, skewAroundCenterExpected)); - } - - // A test for IsIdentity - [Fact] - public void MatrixIsIdentityTest() - { - Assert.True(Matrix.Identity.IsIdentity); - Assert.True(new Matrix(1, 0, 0, 1, 0, 0).IsIdentity); - Assert.False(new Matrix(0, 0, 0, 1, 0, 0).IsIdentity); - Assert.False(new Matrix(1, 1, 0, 1, 0, 0).IsIdentity); - Assert.False(new Matrix(1, 0, 1, 1, 0, 0).IsIdentity); - Assert.False(new Matrix(1, 0, 0, 0, 0, 0).IsIdentity); - Assert.False(new Matrix(1, 0, 0, 1, 1, 0).IsIdentity); - Assert.False(new Matrix(1, 0, 0, 1, 0, 1).IsIdentity); - } - - // A test for Matrix comparison involving NaN values - [Fact] - public void MatrixEqualsNanTest() - { - Matrix a = new Matrix(float.NaN, 0, 0, 0, 0, 0); - Matrix b = new Matrix(0, float.NaN, 0, 0, 0, 0); - Matrix c = new Matrix(0, 0, float.NaN, 0, 0, 0); - Matrix d = new Matrix(0, 0, 0, float.NaN, 0, 0); - Matrix e = new Matrix(0, 0, 0, 0, float.NaN, 0); - Matrix f = new Matrix(0, 0, 0, 0, 0, float.NaN); - - Assert.False(a == new Matrix()); - Assert.False(b == new Matrix()); - Assert.False(c == new Matrix()); - Assert.False(d == new Matrix()); - Assert.False(e == new Matrix()); - Assert.False(f == new Matrix()); - - Assert.True(a != new Matrix()); - Assert.True(b != new Matrix()); - Assert.True(c != new Matrix()); - Assert.True(d != new Matrix()); - Assert.True(e != new Matrix()); - Assert.True(f != new Matrix()); - - Assert.False(a.Equals(new Matrix())); - Assert.False(b.Equals(new Matrix())); - Assert.False(c.Equals(new Matrix())); - Assert.False(d.Equals(new Matrix())); - Assert.False(e.Equals(new Matrix())); - Assert.False(f.Equals(new Matrix())); - - Assert.False(a.IsIdentity); - Assert.False(b.IsIdentity); - Assert.False(c.IsIdentity); - Assert.False(d.IsIdentity); - Assert.False(e.IsIdentity); - Assert.False(f.IsIdentity); - - // Counterintuitive result - IEEE rules for NaN comparison are weird! - Assert.False(a.Equals(a)); - Assert.False(b.Equals(b)); - Assert.False(c.Equals(c)); - Assert.False(d.Equals(d)); - Assert.False(e.Equals(e)); - Assert.False(f.Equals(f)); - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs index 28429f057..b415e302c 100644 --- a/tests/SixLabors.Primitives.Tests/PointFTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -106,7 +106,7 @@ namespace SixLabors.Primitives.Tests public void RotateTest() { var p = new PointF(13, 17); - Matrix matrix = Matrix.CreateRotationDegrees(45, PointF.Empty); + Matrix3x2 matrix = Matrix3x2Extentions.CreateRotationDegrees(45, PointF.Empty); var pout = PointF.Rotate(p, matrix); @@ -117,7 +117,7 @@ namespace SixLabors.Primitives.Tests public void SkewTest() { var p = new PointF(13, 17); - Matrix matrix = Matrix.CreateSkewDegrees(45, 45, PointF.Empty); + Matrix3x2 matrix = Matrix3x2Extentions.CreateSkewDegrees(45, 45, PointF.Empty); var pout = PointF.Skew(p, matrix); Assert.Equal(new PointF(30, 30), pout); diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Primitives.Tests/PointTests.cs index 150e21987..c20fed339 100644 --- a/tests/SixLabors.Primitives.Tests/PointTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointTests.cs @@ -161,7 +161,7 @@ namespace SixLabors.Primitives.Tests public void RotateTest() { var p = new Point(13, 17); - Matrix matrix = Matrix.CreateRotationDegrees(45, Point.Empty); + Matrix3x2 matrix = Matrix3x2Extentions.CreateRotationDegrees(45, Point.Empty); var pout = Point.Rotate(p, matrix); @@ -172,7 +172,7 @@ namespace SixLabors.Primitives.Tests public void SkewTest() { var p = new Point(13, 17); - Matrix3x2 matrix = Matrix.CreateSkewDegrees(45, 45, Point.Empty); + Matrix3x2 matrix = Matrix3x2Extentions.CreateSkewDegrees(45, 45, Point.Empty); var pout = Point.Skew(p, matrix); Assert.Equal(new Point(30, 30), pout); From 345ac1bf066023b5c664a89fbe4868a91c3ebf6b Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 8 Jun 2017 10:32:07 +1000 Subject: [PATCH 007/136] [SL.Core] Fix naming --- ...x2Extentions.cs => Matrix3x2Extensions.cs} | 30 +++++++++---------- .../SixLabors.Primitives.Tests/PointFTests.cs | 4 +-- .../SixLabors.Primitives.Tests/PointTests.cs | 4 +-- 3 files changed, 18 insertions(+), 20 deletions(-) rename src/SixLabors.Primitives/{Matrix3x2Extentions.cs => Matrix3x2Extensions.cs} (77%) diff --git a/src/SixLabors.Primitives/Matrix3x2Extentions.cs b/src/SixLabors.Primitives/Matrix3x2Extensions.cs similarity index 77% rename from src/SixLabors.Primitives/Matrix3x2Extentions.cs rename to src/SixLabors.Primitives/Matrix3x2Extensions.cs index f20e19a1b..626be8ed7 100644 --- a/src/SixLabors.Primitives/Matrix3x2Extentions.cs +++ b/src/SixLabors.Primitives/Matrix3x2Extensions.cs @@ -1,25 +1,23 @@ -// +// // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. // namespace SixLabors.Primitives { - using System; using System.Numerics; - using System.Runtime.CompilerServices; /// - /// A Matrix object for applying matrix transforms to primitives. + /// Extension methods for the struct. /// - public static class Matrix3x2Extentions + public static class Matrix3x2Extensions { /// /// Creates a translation matrix from the given vector. /// /// The translation position. /// A translation matrix. - public static Matrix3x2 CreateTranslation(PointF position) => System.Numerics.Matrix3x2.CreateTranslation(position); + public static Matrix3x2 CreateTranslation(PointF position) => Matrix3x2.CreateTranslation(position); /// /// Creates a scale matrix that is offset by a given center point. @@ -28,14 +26,14 @@ namespace SixLabors.Primitives /// Value to scale by on the Y-axis. /// The center point. /// A scaling matrix. - public static Matrix3x2 CreateScale(float xScale, float yScale, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(xScale, yScale, centerPoint); + public static Matrix3x2 CreateScale(float xScale, float yScale, PointF centerPoint) => Matrix3x2.CreateScale(xScale, yScale, centerPoint); /// /// Creates a scale matrix from the given vector scale. /// /// The scale to use. /// A scaling matrix. - public static Matrix3x2 CreateScale(SizeF scales) => System.Numerics.Matrix3x2.CreateScale(scales); + public static Matrix3x2 CreateScale(SizeF scales) => Matrix3x2.CreateScale(scales); /// /// Creates a scale matrix from the given vector scale with an offset from the given center point. @@ -43,7 +41,7 @@ namespace SixLabors.Primitives /// The scale to use. /// The center offset. /// A scaling matrix. - public static Matrix3x2 CreateScale(SizeF scales, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(scales, centerPoint); + public static Matrix3x2 CreateScale(SizeF scales, PointF centerPoint) => Matrix3x2.CreateScale(scales, centerPoint); /// /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. @@ -51,7 +49,7 @@ namespace SixLabors.Primitives /// The uniform scale to use. /// The center offset. /// A scaling matrix. - public static Matrix3x2 CreateScale(float scale, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(scale, centerPoint); + public static Matrix3x2 CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); /// /// Creates a skew matrix from the given angles in radians. @@ -59,7 +57,7 @@ namespace SixLabors.Primitives /// The X angle, in degrees. /// The Y angle, in degrees. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => System.Numerics.Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -68,7 +66,7 @@ namespace SixLabors.Primitives /// The Y angle, in radians. /// The center point. /// A skew matrix. - public static Matrix3x2 CreateSkew(float radiansX, float radiansY, PointF centerPoint) => System.Numerics.Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); + public static Matrix3x2 CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -77,14 +75,14 @@ namespace SixLabors.Primitives /// The Y angle, in degrees. /// The center point. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => System.Numerics.Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); /// /// Creates a rotation matrix using the given rotation in radians. /// /// The amount of rotation, in degrees. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); + public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -92,7 +90,7 @@ namespace SixLabors.Primitives /// The amount of rotation, in radians. /// The center point. /// A rotation matrix. - public static Matrix3x2 CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); + public static Matrix3x2 CreateRotation(float radians, PointF centerPoint) => Matrix3x2.CreateRotation(radians, centerPoint); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -100,6 +98,6 @@ namespace SixLabors.Primitives /// The amount of rotation, in degrees. /// The center point. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); + public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); } } diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs index b415e302c..7406b10cd 100644 --- a/tests/SixLabors.Primitives.Tests/PointFTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -106,7 +106,7 @@ namespace SixLabors.Primitives.Tests public void RotateTest() { var p = new PointF(13, 17); - Matrix3x2 matrix = Matrix3x2Extentions.CreateRotationDegrees(45, PointF.Empty); + Matrix3x2 matrix = Matrix3x2Extensions.CreateRotationDegrees(45, PointF.Empty); var pout = PointF.Rotate(p, matrix); @@ -117,7 +117,7 @@ namespace SixLabors.Primitives.Tests public void SkewTest() { var p = new PointF(13, 17); - Matrix3x2 matrix = Matrix3x2Extentions.CreateSkewDegrees(45, 45, PointF.Empty); + Matrix3x2 matrix = Matrix3x2Extensions.CreateSkewDegrees(45, 45, PointF.Empty); var pout = PointF.Skew(p, matrix); Assert.Equal(new PointF(30, 30), pout); diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Primitives.Tests/PointTests.cs index c20fed339..495a34ff6 100644 --- a/tests/SixLabors.Primitives.Tests/PointTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointTests.cs @@ -161,7 +161,7 @@ namespace SixLabors.Primitives.Tests public void RotateTest() { var p = new Point(13, 17); - Matrix3x2 matrix = Matrix3x2Extentions.CreateRotationDegrees(45, Point.Empty); + Matrix3x2 matrix = Matrix3x2Extensions.CreateRotationDegrees(45, Point.Empty); var pout = Point.Rotate(p, matrix); @@ -172,7 +172,7 @@ namespace SixLabors.Primitives.Tests public void SkewTest() { var p = new Point(13, 17); - Matrix3x2 matrix = Matrix3x2Extentions.CreateSkewDegrees(45, 45, Point.Empty); + Matrix3x2 matrix = Matrix3x2Extensions.CreateSkewDegrees(45, 45, Point.Empty); var pout = Point.Skew(p, matrix); Assert.Equal(new Point(30, 30), pout); From 15d0258f98c3a2fe7482903574c3a60a6a6d9760 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Thu, 8 Jun 2017 07:49:45 +0100 Subject: [PATCH 008/136] [SL.Core] Drop unneeded types plus added Size operators. --- .../ApproximateFloatComparer.cs | 209 ----------- src/SixLabors.Primitives/Ellipse.cs | 180 --------- src/SixLabors.Primitives/LongRational.cs | 352 ------------------ src/SixLabors.Primitives/Rational.cs | 189 ---------- src/SixLabors.Primitives/SignedRational.cs | 189 ---------- src/SixLabors.Primitives/Size.cs | 67 ++++ src/SixLabors.Primitives/SizeF.cs | 34 ++ .../RationalTests.cs | 115 ------ .../SignedRationalTests.cs | 122 ------ .../SixLabors.Primitives.Tests/SizeFTests.cs | 81 ++++ tests/SixLabors.Primitives.Tests/SizeTests.cs | 180 +++++++++ 11 files changed, 362 insertions(+), 1356 deletions(-) delete mode 100644 src/SixLabors.Primitives/ApproximateFloatComparer.cs delete mode 100644 src/SixLabors.Primitives/Ellipse.cs delete mode 100644 src/SixLabors.Primitives/LongRational.cs delete mode 100644 src/SixLabors.Primitives/Rational.cs delete mode 100644 src/SixLabors.Primitives/SignedRational.cs delete mode 100644 tests/SixLabors.Primitives.Tests/RationalTests.cs delete mode 100644 tests/SixLabors.Primitives.Tests/SignedRationalTests.cs diff --git a/src/SixLabors.Primitives/ApproximateFloatComparer.cs b/src/SixLabors.Primitives/ApproximateFloatComparer.cs deleted file mode 100644 index 9722508a4..000000000 --- a/src/SixLabors.Primitives/ApproximateFloatComparer.cs +++ /dev/null @@ -1,209 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -using System; -using System.Collections.Generic; -using System.Numerics; - -namespace SixLabors.Primitives -{ - internal struct ApproximateFloatComparer - : IEqualityComparer, - IEqualityComparer, - IEqualityComparer, - IEqualityComparer, - IEqualityComparer, - IEqualityComparer, - IEqualityComparer - { - private readonly float tolerance; - const float defaultTolerance = 1e-5f; - - public ApproximateFloatComparer(float tolerance = defaultTolerance) - { - this.tolerance = tolerance; - } - - public static bool Equal(float x, float y, float tolerance) - { - float d = x - y; - - return d > -tolerance && d < tolerance; - } - - public static bool Equal(float x, float y) - { - return Equal(x, y, defaultTolerance); - } - - public bool Equals(float x, float y) - { - return Equal(x, y, this.tolerance); - } - - public int GetHashCode(float obj) - { - var diff = obj % this.tolerance;// how different from tollerance are we? - return (obj - diff).GetHashCode(); - } - - public bool Equals(Vector4 a, Vector4 b) - { - return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z) && this.Equals(a.W, b.W); - } - - public int GetHashCode(Vector4 obj) - { - int hash = GetHashCode(obj.X); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.W)); - return hash; - } - - public bool Equals(Vector2 a, Vector2 b) - { - return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y); - } - - public int GetHashCode(Vector2 obj) - { - int hash = GetHashCode(obj.X); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); - return hash; - } - - public bool Equals(Vector3 a, Vector3 b) - { - return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z); - } - - public int GetHashCode(Vector3 obj) - { - int hash = GetHashCode(obj.X); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); - return hash; - } - - public static bool Equal(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b, float tolerance) - { - return Equal(a.M11, b.M11, tolerance) && - Equal(a.M12, b.M12, tolerance) && - Equal(a.M21, b.M21, tolerance) && - Equal(a.M22, b.M22, tolerance) && - Equal(a.M31, b.M31, tolerance) && - Equal(a.M32, b.M32, tolerance); - } - - public static bool Equal(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b) - { - return Equal(a, b, defaultTolerance); - } - - public bool Equals(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b) - { - return Equal(a, b, this.tolerance); - } - - public int GetHashCode(System.Numerics.Matrix3x2 obj) - { - int hash = GetHashCode(obj.M11); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M11)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); - return hash; - } - - - public static bool Equal(Matrix4x4 a, Matrix4x4 b, float tolerance) - { - return - Equal(a.M11, b.M11, tolerance) && - Equal(a.M12, b.M12, tolerance) && - Equal(a.M13, b.M13, tolerance) && - Equal(a.M14, b.M14, tolerance) && - - Equal(a.M21, b.M21, tolerance) && - Equal(a.M22, b.M22, tolerance) && - Equal(a.M23, b.M23, tolerance) && - Equal(a.M24, b.M24, tolerance) && - - Equal(a.M31, b.M31, tolerance) && - Equal(a.M32, b.M32, tolerance) && - Equal(a.M33, b.M33, tolerance) && - Equal(a.M34, b.M34, tolerance) && - - Equal(a.M41, b.M41, tolerance) && - Equal(a.M42, b.M42, tolerance) && - Equal(a.M43, b.M43, tolerance) && - Equal(a.M44, b.M44, tolerance); - } - - public static bool Equal(Matrix4x4 a, Matrix4x4 b) - { - return Equal(a, b, defaultTolerance); - } - - public bool Equals(Matrix4x4 a, Matrix4x4 b) - { - return Equal(a, b, this.tolerance); - } - - - public int GetHashCode(Matrix4x4 obj) - { - int hash = GetHashCode(obj.M11); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M13)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M14)); - - hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M23)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M24)); - - hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M33)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M34)); - - hash = HashHelpers.Combine(hash, GetHashCode(obj.M41)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M42)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M43)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M44)); - return hash; - } - - - public static bool Equal(PointF a, PointF b, float tolerance) - { - return - Equal(a.X, b.X, tolerance) && - Equal(a.Y, b.Y, tolerance); - } - - public static bool Equal(PointF a, PointF b) - { - return Equal(a, b, defaultTolerance); - } - - public bool Equals(PointF a, PointF b) - { - return Equal(a, b, this.tolerance); - } - - - public int GetHashCode(PointF obj) - { - int hash = GetHashCode(obj.X); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); - return hash; - } - } -} diff --git a/src/SixLabors.Primitives/Ellipse.cs b/src/SixLabors.Primitives/Ellipse.cs deleted file mode 100644 index e1890df27..000000000 --- a/src/SixLabors.Primitives/Ellipse.cs +++ /dev/null @@ -1,180 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.ComponentModel; - using System.Numerics; - - /// - /// Represents an ellipse. - /// - public struct Ellipse : IEquatable - { - /// - /// Represents a that has X and Y values set to zero. - /// - public static readonly Ellipse Empty = default(Ellipse); - - /// - /// The center point. - /// - private Point center; - - /// - /// Initializes a new instance of the struct. - /// - /// The center point. - /// The x-radius. - /// The y-radius. - public Ellipse(Point center, float radiusX, float radiusY) - { - this.center = center; - this.RadiusX = radiusX; - this.RadiusY = radiusY; - } - - /// - /// Gets the x-radius of this . - /// - public float RadiusX { get; } - - /// - /// Gets the y-radius of this . - /// - public float RadiusY { get; } - - /// - /// Gets a value indicating whether this is empty. - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public bool IsEmpty => this.Equals(Empty); - - /// - /// Compares two objects for equality. - /// - /// - /// The on the left side of the operand. - /// - /// - /// The on the right side of the operand. - /// - /// - /// True if the current left is equal to the parameter; otherwise, false. - /// - public static bool operator ==(Ellipse left, Ellipse right) - { - return left.Equals(right); - } - - /// - /// Compares two objects for inequality. - /// - /// - /// The on the left side of the operand. - /// - /// - /// The on the right side of the operand. - /// - /// - /// True if the current left is unequal to the parameter; otherwise, false. - /// - public static bool operator !=(Ellipse left, Ellipse right) - { - return !left.Equals(right); - } - - /// - /// Returns the center point of the given - /// - /// The ellipse - /// - public static Vector2 Center(Ellipse ellipse) - { - return new Vector2(ellipse.center.X, ellipse.center.Y); - } - - /// - /// Determines if the specfied point is contained within the rectangular region defined by - /// this . - /// - /// The x-coordinate of the given point. - /// The y-coordinate of the given point. - /// The - public bool Contains(int x, int y) - { - if (this.RadiusX <= 0 || this.RadiusY <= 0) - { - return false; - } - - // TODO: SIMD? - // This is a more general form of the circle equation - // X^2/a^2 + Y^2/b^2 <= 1 - Point normalized = new Point(x - this.center.X, y - this.center.Y); - int nX = normalized.X; - int nY = normalized.Y; - - return ((double)(nX * nX) / (this.RadiusX * this.RadiusX)) - + ((double)(nY * nY) / (this.RadiusY * this.RadiusY)) - <= 1.0; - } - - /// - public override int GetHashCode() - { - return this.GetHashCode(this); - } - - /// - public override string ToString() - { - if (this.IsEmpty) - { - return "Ellipse [ Empty ]"; - } - - return - $"Ellipse [ RadiusX={this.RadiusX}, RadiusY={this.RadiusX}, Centre={this.center.X},{this.center.Y} ]"; - } - - /// - public override bool Equals(object obj) - { - if (obj is Ellipse) - { - return this.Equals((Ellipse)obj); - } - - return false; - } - - /// - public bool Equals(Ellipse other) - { - return this.center.Equals(other.center) - && this.RadiusX.Equals(other.RadiusX) - && this.RadiusY.Equals(other.RadiusY); - } - - /// - /// Returns the hash code for this instance. - /// - /// - /// The instance of to return the hash code for. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - private int GetHashCode(Ellipse ellipse) - { - int hashCode = ellipse.center.GetHashCode(); - hashCode = HashHelpers.Combine(hashCode, ellipse.RadiusX.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, ellipse.RadiusY.GetHashCode()); - return hashCode; - } - } -} diff --git a/src/SixLabors.Primitives/LongRational.cs b/src/SixLabors.Primitives/LongRational.cs deleted file mode 100644 index 4f01936ee..000000000 --- a/src/SixLabors.Primitives/LongRational.cs +++ /dev/null @@ -1,352 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.Globalization; - using System.Text; - - /// - /// Represents a number that can be expressed as a fraction - /// - /// - /// This is a very simplified implementation of a rational number designed for use with metadata only. - /// - internal struct LongRational : IEquatable - { - /// - /// Initializes a new instance of the struct. - /// - /// - /// The number above the line in a vulgar fraction showing how many of the parts - /// indicated by the denominator are taken. - /// - /// - /// The number below the line in a vulgar fraction; a divisor. - /// - public LongRational(long numerator, long denominator) - : this(numerator, denominator, false) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// - /// The number above the line in a vulgar fraction showing how many of the parts - /// indicated by the denominator are taken. - /// - /// - /// The number below the line in a vulgar fraction; a divisor. - /// - /// - /// Whether to attempt to simplify the fractional parts. - /// - public LongRational(long numerator, long denominator, bool simplify) - : this() - { - this.Numerator = numerator; - this.Denominator = denominator; - - if (simplify) - { - this.Simplify(); - } - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - /// Whether to use the best possible precision when parsing the value. - public LongRational(double value, bool bestPrecision) - : this() - { - if (double.IsNaN(value)) - { - this.Numerator = this.Denominator = 0; - return; - } - - if (double.IsPositiveInfinity(value)) - { - this.Numerator = 1; - this.Denominator = 0; - return; - } - - if (double.IsNegativeInfinity(value)) - { - this.Numerator = -1; - this.Denominator = 0; - return; - } - - this.Numerator = 1; - this.Denominator = 1; - - double val = Math.Abs(value); - double df = this.Numerator / (double)this.Denominator; - double epsilon = bestPrecision ? double.Epsilon : .000001; - - while (Math.Abs(df - val) > epsilon) - { - if (df < val) - { - this.Numerator++; - } - else - { - this.Denominator++; - this.Numerator = (int)(val * this.Denominator); - } - - df = this.Numerator / (double)this.Denominator; - } - - if (value < 0.0) - { - this.Numerator *= -1; - } - - this.Simplify(); - } - - /// - /// Gets the numerator of a number. - /// - public long Numerator - { - get; - private set; - } - - /// - /// Gets the denominator of a number. - /// - public long Denominator - { - get; - private set; - } - - /// - /// Gets a value indicating whether this instance is indeterminate. - /// - public bool IsIndeterminate - { - get - { - if (this.Denominator != 0) - { - return false; - } - - return this.Numerator == 0; - } - } - - /// - /// Gets a value indicating whether this instance is an integer (n, 1) - /// - public bool IsInteger => this.Denominator == 1; - - /// - /// Gets a value indicating whether this instance is equal to negative infinity (-1, 0) - /// - public bool IsNegativeInfinity - { - get - { - if (this.Denominator != 0) - { - return false; - } - - return this.Numerator == -1; - } - } - - /// - /// Gets a value indicating whether this instance is equal to positive infinity (1, 0) - /// - public bool IsPositiveInfinity - { - get - { - if (this.Denominator != 0) - { - return false; - } - - return this.Numerator == 1; - } - } - - /// - /// Gets a value indicating whether this instance is equal to 0 (0, 1) - /// - public bool IsZero - { - get - { - if (this.Denominator != 1) - { - return false; - } - - return this.Numerator == 0; - } - } - - /// - public bool Equals(LongRational other) - { - if (this.Denominator == other.Denominator) - { - return this.Numerator == other.Numerator; - } - - if (this.Numerator == 0 && this.Denominator == 0) - { - return other.Numerator == 0 && other.Denominator == 0; - } - - if (other.Numerator == 0 && other.Denominator == 0) - { - return this.Numerator == 0 && this.Denominator == 0; - } - - return (this.Numerator * other.Denominator) == (this.Denominator * other.Numerator); - } - - /// - public override int GetHashCode() - { - return this.GetHashCode(this); - } - - /// - public override string ToString() - { - return this.ToString(CultureInfo.InvariantCulture); - } - - /// - /// Converts the numeric value of this instance to its equivalent string representation using - /// the specified culture-specific format information. - /// - /// - /// An object that supplies culture-specific formatting information. - /// - /// The - public string ToString(IFormatProvider provider) - { - if (this.IsIndeterminate) - { - return "[ Indeterminate ]"; - } - - if (this.IsPositiveInfinity) - { - return "[ PositiveInfinity ]"; - } - - if (this.IsNegativeInfinity) - { - return "[ NegativeInfinity ]"; - } - - if (this.IsZero) - { - return "0"; - } - - if (this.IsInteger) - { - return this.Numerator.ToString(provider); - } - - StringBuilder sb = new StringBuilder(); - sb.Append(this.Numerator.ToString(provider)); - sb.Append("/"); - sb.Append(this.Denominator.ToString(provider)); - return sb.ToString(); - } - - /// - /// Finds the greatest common divisor of two values. - /// - /// The first value - /// The second value - /// The - private static long GreatestCommonDivisor(long left, long right) - { - return right == 0 ? left : GreatestCommonDivisor(right, left % right); - } - - /// - /// Simplifies the - /// - private void Simplify() - { - if (this.IsIndeterminate) - { - return; - } - - if (this.IsNegativeInfinity) - { - return; - } - - if (this.IsPositiveInfinity) - { - return; - } - - if (this.IsInteger) - { - return; - } - - if (this.IsZero) - { - return; - } - - if (this.Numerator == 0) - { - this.Denominator = 0; - return; - } - - if (this.Numerator == this.Denominator) - { - this.Numerator = 1; - this.Denominator = 1; - } - - long gcd = GreatestCommonDivisor(Math.Abs(this.Numerator), Math.Abs(this.Denominator)); - if (gcd > 1) - { - this.Numerator = this.Numerator / gcd; - this.Denominator = this.Denominator / gcd; - } - } - - /// - /// Returns the hash code for this instance. - /// - /// - /// The instance of to return the hash code for. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - private int GetHashCode(LongRational rational) => HashHelpers.Combine(rational.Numerator.GetHashCode(), rational.Denominator.GetHashCode()); - } -} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rational.cs b/src/SixLabors.Primitives/Rational.cs deleted file mode 100644 index 3d7003b4e..000000000 --- a/src/SixLabors.Primitives/Rational.cs +++ /dev/null @@ -1,189 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.Globalization; - - /// - /// Represents a number that can be expressed as a fraction. - /// - /// - /// This is a very simplified implementation of a rational number designed for use with metadata only. - /// - public struct Rational : IEquatable - { - /// - /// Initializes a new instance of the struct. - /// - /// The to create the rational from. - public Rational(uint value) - : this(value, 1) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. - /// The number below the line in a vulgar fraction; a divisor. - public Rational(uint numerator, uint denominator) - : this(numerator, denominator, true) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. - /// The number below the line in a vulgar fraction; a divisor. - /// Specified if the rational should be simplified. - public Rational(uint numerator, uint denominator, bool simplify) - { - LongRational rational = new LongRational(numerator, denominator, simplify); - - this.Numerator = (uint)rational.Numerator; - this.Denominator = (uint)rational.Denominator; - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - public Rational(double value) - : this(value, false) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - /// Whether to use the best possible precision when parsing the value. - public Rational(double value, bool bestPrecision) - { - LongRational rational = new LongRational(Math.Abs(value), bestPrecision); - - this.Numerator = (uint)rational.Numerator; - this.Denominator = (uint)rational.Denominator; - } - - /// - /// Gets the numerator of a number. - /// - public uint Numerator { get; } - - /// - /// Gets the denominator of a number. - /// - public uint Denominator { get; } - - /// - /// Determines whether the specified instances are considered equal. - /// - /// The first to compare. - /// The second to compare. - /// The - public static bool operator ==(Rational left, Rational right) - { - return Rational.Equals(left, right); - } - - /// - /// Determines whether the specified instances are not considered equal. - /// - /// The first to compare. - /// The second to compare. - /// The - public static bool operator !=(Rational left, Rational right) - { - return !Rational.Equals(left, right); - } - - /// - /// Converts the specified to an instance of this type. - /// - /// The to convert to an instance of this type. - /// - /// The . - /// - public static Rational FromDouble(double value) - { - return new Rational(value, false); - } - - /// - /// Converts the specified to an instance of this type. - /// - /// The to convert to an instance of this type. - /// Whether to use the best possible precision when parsing the value. - /// - /// The . - /// - public static Rational FromDouble(double value, bool bestPrecision) - { - return new Rational(value, bestPrecision); - } - - /// - public override bool Equals(object obj) - { - if (obj is Rational) - { - return this.Equals((Rational)obj); - } - - return false; - } - - /// - public bool Equals(Rational other) - { - LongRational left = new LongRational(this.Numerator, this.Denominator); - LongRational right = new LongRational(other.Numerator, other.Denominator); - - return left.Equals(right); - } - - /// - public override int GetHashCode() - { - LongRational self = new LongRational(this.Numerator, this.Denominator); - return self.GetHashCode(); - } - - /// - /// Converts a rational number to the nearest . - /// - /// - /// The . - /// - public double ToDouble() - { - return this.Numerator / (double)this.Denominator; - } - - /// - public override string ToString() - { - return this.ToString(CultureInfo.InvariantCulture); - } - - /// - /// Converts the numeric value of this instance to its equivalent string representation using - /// the specified culture-specific format information. - /// - /// - /// An object that supplies culture-specific formatting information. - /// - /// The - public string ToString(IFormatProvider provider) - { - LongRational rational = new LongRational(this.Numerator, this.Denominator); - return rational.ToString(provider); - } - } -} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SignedRational.cs b/src/SixLabors.Primitives/SignedRational.cs deleted file mode 100644 index 07fd105da..000000000 --- a/src/SixLabors.Primitives/SignedRational.cs +++ /dev/null @@ -1,189 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.Globalization; - - /// - /// Represents a number that can be expressed as a fraction. - /// - /// - /// This is a very simplified implementation of a rational number designed for use with metadata only. - /// - public struct SignedRational : IEquatable - { - /// - /// Initializes a new instance of the struct. - /// - /// The to create the rational from. - public SignedRational(int value) - : this(value, 1) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. - /// The number below the line in a vulgar fraction; a divisor. - public SignedRational(int numerator, int denominator) - : this(numerator, denominator, true) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. - /// The number below the line in a vulgar fraction; a divisor. - /// Specified if the rational should be simplified. - public SignedRational(int numerator, int denominator, bool simplify) - { - LongRational rational = new LongRational(numerator, denominator, simplify); - - this.Numerator = (int)rational.Numerator; - this.Denominator = (int)rational.Denominator; - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - public SignedRational(double value) - : this(value, false) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - /// Whether to use the best possible precision when parsing the value. - public SignedRational(double value, bool bestPrecision) - { - LongRational rational = new LongRational(value, bestPrecision); - - this.Numerator = (int)rational.Numerator; - this.Denominator = (int)rational.Denominator; - } - - /// - /// Gets the numerator of a number. - /// - public int Numerator { get; } - - /// - /// Gets the denominator of a number. - /// - public int Denominator { get; } - - /// - /// Determines whether the specified instances are considered equal. - /// - /// The first to compare. - /// The second to compare. - /// The - public static bool operator ==(SignedRational left, SignedRational right) - { - return SignedRational.Equals(left, right); - } - - /// - /// Determines whether the specified instances are not considered equal. - /// - /// The first to compare. - /// The second to compare. - /// The - public static bool operator !=(SignedRational left, SignedRational right) - { - return !SignedRational.Equals(left, right); - } - - /// - /// Converts the specified to an instance of this type. - /// - /// The to convert to an instance of this type. - /// - /// The . - /// - public static SignedRational FromDouble(double value) - { - return new SignedRational(value, false); - } - - /// - /// Converts the specified to an instance of this type. - /// - /// The to convert to an instance of this type. - /// Whether to use the best possible precision when parsing the value. - /// - /// The . - /// - public static SignedRational FromDouble(double value, bool bestPrecision) - { - return new SignedRational(value, bestPrecision); - } - - /// - public override bool Equals(object obj) - { - if (obj is SignedRational) - { - return this.Equals((SignedRational)obj); - } - - return false; - } - - /// - public bool Equals(SignedRational other) - { - LongRational left = new LongRational(this.Numerator, this.Denominator); - LongRational right = new LongRational(other.Numerator, other.Denominator); - - return left.Equals(right); - } - - /// - public override int GetHashCode() - { - LongRational self = new LongRational(this.Numerator, this.Denominator); - return self.GetHashCode(); - } - - /// - /// Converts a rational number to the nearest . - /// - /// - /// The . - /// - public double ToDouble() - { - return this.Numerator / (double)this.Denominator; - } - - /// - public override string ToString() - { - return this.ToString(CultureInfo.InvariantCulture); - } - - /// - /// Converts the numeric value of this instance to its equivalent string representation using - /// the specified culture-specific format information. - /// - /// - /// An object that supplies culture-specific formatting information. - /// - /// The - public string ToString(IFormatProvider provider) - { - LongRational rational = new LongRational(this.Numerator, this.Denominator); - return rational.ToString(provider); - } - } -} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs index d0716d5ac..abc7ad4cb 100644 --- a/src/SixLabors.Primitives/Size.cs +++ b/src/SixLabors.Primitives/Size.cs @@ -124,6 +124,55 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size operator -(Size left, Size right) => Subtract(left, right); + /// + /// Multiplies a by an producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static Size operator *(int left, Size right) => Multiply(right, left); + + /// + /// Multiplies by an producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static Size operator *(Size left, int right) => Multiply(left, right); + + /// + /// Divides by an producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static Size operator /(Size left, int right) => new Size(unchecked(left.Width / right), unchecked(left.Height / right)); + + /// + /// Multiplies by a producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static SizeF operator *(float left, Size right) => Multiply(right, left); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static SizeF operator *(Size left, float right) => Multiply(left, right); + + /// + /// Divides by a producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static SizeF operator /(Size left, float right) + => new SizeF(left.Width / right, left.Height / right); + /// /// Compares two objects for equality. /// @@ -172,6 +221,24 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); + /// + /// Multiplies by an producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + private static Size Multiply(Size size, int multiplier) => + new Size(unchecked(size.Width * multiplier), unchecked(size.Height * multiplier)); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type SizeF. + private static SizeF Multiply(Size size, float multiplier) => + new SizeF(size.Width * multiplier, size.Height * multiplier); + /// /// Converts a to a by performing a ceiling operation on all the dimensions. /// diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs index 54db16b77..e356a4edb 100644 --- a/src/SixLabors.Primitives/SizeF.cs +++ b/src/SixLabors.Primitives/SizeF.cs @@ -116,6 +116,31 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF operator -(SizeF left, SizeF right) => Subtract(left, right); + /// + /// Multiplies by a producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static SizeF operator *(float left, SizeF right) => Multiply(right, left); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static SizeF operator *(SizeF left, float right) => Multiply(left, right); + + /// + /// Divides by a producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static SizeF operator /(SizeF left, float right) + => new SizeF(left.Width / right, left.Height / right); + /// /// Compares two objects for equality. /// @@ -156,6 +181,15 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type SizeF. + private static SizeF Multiply(SizeF size, float multiplier) => + new SizeF(size.Width * multiplier, size.Height * multiplier); + /// public override int GetHashCode() { diff --git a/tests/SixLabors.Primitives.Tests/RationalTests.cs b/tests/SixLabors.Primitives.Tests/RationalTests.cs deleted file mode 100644 index e59505cf5..000000000 --- a/tests/SixLabors.Primitives.Tests/RationalTests.cs +++ /dev/null @@ -1,115 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives.Tests -{ - using Xunit; - - /// - /// Tests the struct. - /// - public class RationalTests - { - /// - /// Tests the equality operators for equality. - /// - [Fact] - public void AreEqual() - { - Rational r1 = new Rational(3, 2); - Rational r2 = new Rational(3, 2); - - Assert.Equal(r1, r2); - Assert.True(r1 == r2); - - Rational r3 = new Rational(7.55); - Rational r4 = new Rational(755, 100); - Rational r5 = new Rational(151, 20); - - Assert.Equal(r3, r4); - Assert.Equal(r4, r5); - } - - /// - /// Tests the equality operators for inequality. - /// - [Fact] - public void AreNotEqual() - { - Rational first = new Rational(0, 100); - Rational second = new Rational(100, 100); - - Assert.NotEqual(first, second); - Assert.True(first != second); - } - - /// - /// Tests whether the Rational constructor correctly assign properties. - /// - [Fact] - public void ConstructorAssignsProperties() - { - Rational rational = new Rational(7, 55); - Assert.Equal(7U, rational.Numerator); - Assert.Equal(55U, rational.Denominator); - - rational = new Rational(755, 100); - Assert.Equal(151U, rational.Numerator); - Assert.Equal(20U, rational.Denominator); - - rational = new Rational(755, 100, false); - Assert.Equal(755U, rational.Numerator); - Assert.Equal(100U, rational.Denominator); - - rational = new Rational(-7.55); - Assert.Equal(151U, rational.Numerator); - Assert.Equal(20U, rational.Denominator); - - rational = new Rational(7); - Assert.Equal(7U, rational.Numerator); - Assert.Equal(1U, rational.Denominator); - } - - [Fact] - public void Fraction() - { - Rational first = new Rational(1.0 / 1600); - Rational second = new Rational(1.0 / 1600, true); - Assert.False(first.Equals(second)); - } - - [Fact] - public void ToDouble() - { - Rational rational = new Rational(0, 0); - Assert.Equal(double.NaN, rational.ToDouble()); - - rational = new Rational(2, 0); - Assert.Equal(double.PositiveInfinity, rational.ToDouble()); - } - - [Fact] - public void ToStringRepresention() - { - Rational rational = new Rational(0, 0); - Assert.Equal("[ Indeterminate ]", rational.ToString()); - - rational = new Rational(double.PositiveInfinity); - Assert.Equal("[ PositiveInfinity ]", rational.ToString()); - - rational = new Rational(double.NegativeInfinity); - Assert.Equal("[ PositiveInfinity ]", rational.ToString()); - - rational = new Rational(0, 1); - Assert.Equal("0", rational.ToString()); - - rational = new Rational(2, 1); - Assert.Equal("2", rational.ToString()); - - rational = new Rational(1, 2); - Assert.Equal("1/2", rational.ToString()); - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs b/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs deleted file mode 100644 index bc7a5b810..000000000 --- a/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs +++ /dev/null @@ -1,122 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives.Tests -{ - using Xunit; - - /// - /// Tests the struct. - /// - public class SignedRationalTests - { - /// - /// Tests the equality operators for equality. - /// - [Fact] - public void AreEqual() - { - SignedRational r1 = new SignedRational(3, 2); - SignedRational r2 = new SignedRational(3, 2); - - Assert.Equal(r1, r2); - Assert.True(r1 == r2); - - SignedRational r3 = new SignedRational(7.55); - SignedRational r4 = new SignedRational(755, 100); - SignedRational r5 = new SignedRational(151, 20); - - Assert.Equal(r3, r4); - Assert.Equal(r4, r5); - } - - /// - /// Tests the equality operators for inequality. - /// - [Fact] - public void AreNotEqual() - { - SignedRational first = new SignedRational(0, 100); - SignedRational second = new SignedRational(100, 100); - - Assert.NotEqual(first, second); - Assert.True(first != second); - } - - /// - /// Tests whether the Rational constructor correctly assign properties. - /// - [Fact] - public void ConstructorAssignsProperties() - { - SignedRational rational = new SignedRational(7, -55); - Assert.Equal(7, rational.Numerator); - Assert.Equal(-55, rational.Denominator); - - rational = new SignedRational(-755, 100); - Assert.Equal(-151, rational.Numerator); - Assert.Equal(20, rational.Denominator); - - rational = new SignedRational(-755, -100, false); - Assert.Equal(-755, rational.Numerator); - Assert.Equal(-100, rational.Denominator); - - rational = new SignedRational(-151, -20); - Assert.Equal(-151, rational.Numerator); - Assert.Equal(-20, rational.Denominator); - - rational = new SignedRational(-7.55); - Assert.Equal(-151, rational.Numerator); - Assert.Equal(20, rational.Denominator); - - rational = new SignedRational(7); - Assert.Equal(7, rational.Numerator); - Assert.Equal(1, rational.Denominator); - } - - [Fact] - public void Fraction() - { - SignedRational first = new SignedRational(1.0 / 1600); - SignedRational second = new SignedRational(1.0 / 1600, true); - Assert.False(first.Equals(second)); - } - - [Fact] - public void ToDouble() - { - SignedRational rational = new SignedRational(0, 0); - Assert.Equal(double.NaN, rational.ToDouble()); - - rational = new SignedRational(2, 0); - Assert.Equal(double.PositiveInfinity, rational.ToDouble()); - - rational = new SignedRational(-2, 0); - Assert.Equal(double.NegativeInfinity, rational.ToDouble()); - } - - [Fact] - public void ToStringRepresention() - { - SignedRational rational = new SignedRational(0, 0); - Assert.Equal("[ Indeterminate ]", rational.ToString()); - - rational = new SignedRational(double.PositiveInfinity); - Assert.Equal("[ PositiveInfinity ]", rational.ToString()); - - rational = new SignedRational(double.NegativeInfinity); - Assert.Equal("[ NegativeInfinity ]", rational.ToString()); - - rational = new SignedRational(0, 1); - Assert.Equal("0", rational.ToString()); - - rational = new SignedRational(2, 1); - Assert.Equal("2", rational.ToString()); - - rational = new SignedRational(1, 2); - Assert.Equal("1/2", rational.ToString()); - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SizeFTests.cs b/tests/SixLabors.Primitives.Tests/SizeFTests.cs index baa16c7e4..e4dec3fd6 100644 --- a/tests/SixLabors.Primitives.Tests/SizeFTests.cs +++ b/tests/SixLabors.Primitives.Tests/SizeFTests.cs @@ -159,5 +159,86 @@ namespace SixLabors.Primitives.Tests var sz = new SizeF(0, 0); Assert.Equal("SizeF [ Empty ]", sz.ToString()); } + + [Theory] + [InlineData(1000.234f, 0.0f)] + [InlineData(1000.234f, 1.0f)] + [InlineData(1000.234f, 2400.933f)] + [InlineData(1000.234f, float.MaxValue)] + [InlineData(1000.234f, -1.0f)] + [InlineData(1000.234f, -2400.933f)] + [InlineData(1000.234f, float.MinValue)] + [InlineData(float.MaxValue, 0.0f)] + [InlineData(float.MaxValue, 1.0f)] + [InlineData(float.MaxValue, 2400.933f)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(float.MaxValue, -1.0f)] + [InlineData(float.MaxValue, -2400.933f)] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, 0.0f)] + [InlineData(float.MinValue, 1.0f)] + [InlineData(float.MinValue, 2400.933f)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, -1.0f)] + [InlineData(float.MinValue, -2400.933f)] + [InlineData(float.MinValue, float.MinValue)] + public void MultiplicationTest(float dimension, float multiplier) + { + SizeF sz1 = new SizeF(dimension, dimension); + SizeF mulExpected; + + mulExpected = new SizeF(dimension * multiplier, dimension * multiplier); + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + [Theory] + [InlineData(1111.1111f, 2222.2222f, 3333.3333f)] + public void MultiplicationTestWidthHeightMultiplier(float width, float height, float multiplier) + { + SizeF sz1 = new SizeF(width, height); + SizeF mulExpected; + + mulExpected = new SizeF(width * multiplier, height * multiplier); + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + [Theory] + [InlineData(0.0f, 1.0f)] + [InlineData(1.0f, 1.0f)] + [InlineData(-1.0f, 1.0f)] + [InlineData(1.0f, -1.0f)] + [InlineData(-1.0f, -1.0f)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, 1.0f)] + [InlineData(float.MinValue, 1.0f)] + [InlineData(float.MaxValue, -1.0f)] + [InlineData(float.MinValue, -1.0f)] + [InlineData(float.MinValue, 0.0f)] + [InlineData(1.0f, float.MinValue)] + [InlineData(1.0f, float.MinValue)] + [InlineData(-1.0f, float.MinValue)] + [InlineData(-1.0f, float.MinValue)] + public void DivideTestSizeFloat(float dimension, float divisor) + { + SizeF size = new SizeF(dimension, dimension); + SizeF expected = new SizeF(dimension / divisor, dimension / divisor); + Assert.Equal(expected, size / divisor); + } + + [Theory] + [InlineData(-111.111f, 222.222f, 333.333f)] + public void DivideTestSizeFloatWidthHeightDivisor(float width, float height, float divisor) + { + SizeF size = new SizeF(width, height); + SizeF expected = new SizeF(width / divisor, height / divisor); + Assert.Equal(expected, size / divisor); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SizeTests.cs b/tests/SixLabors.Primitives.Tests/SizeTests.cs index 3eabf6221..821cf1691 100644 --- a/tests/SixLabors.Primitives.Tests/SizeTests.cs +++ b/tests/SixLabors.Primitives.Tests/SizeTests.cs @@ -5,6 +5,7 @@ namespace SixLabors.Primitives.Tests { + using System; using System.Globalization; using Xunit; @@ -191,5 +192,184 @@ namespace SixLabors.Primitives.Tests var sz = new Size(0, 0); Assert.Equal("Size [ Empty ]", sz.ToString()); } + + [Theory] + [InlineData(1000, 0)] + [InlineData(1000, 1)] + [InlineData(1000, 2400)] + [InlineData(1000, int.MaxValue)] + [InlineData(1000, -1)] + [InlineData(1000, -2400)] + [InlineData(1000, int.MinValue)] + [InlineData(int.MaxValue, 0)] + [InlineData(int.MaxValue, 1)] + [InlineData(int.MaxValue, 2400)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(int.MaxValue, -1)] + [InlineData(int.MaxValue, -2400)] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, 0)] + [InlineData(int.MinValue, 1)] + [InlineData(int.MinValue, 2400)] + [InlineData(int.MinValue, int.MaxValue)] + [InlineData(int.MinValue, -1)] + [InlineData(int.MinValue, -2400)] + [InlineData(int.MinValue, int.MinValue)] + public void MultiplicationTestSizeInt(int dimension, int multiplier) + { + Size sz1 = new Size(dimension, dimension); + Size mulExpected; + + unchecked + { + mulExpected = new Size(dimension * multiplier, dimension * multiplier); + } + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + [Theory] + [InlineData(1000, 2000, 3000)] + public void MultiplicationTestSizeIntWidthHeightMultiplier(int width, int height, int multiplier) + { + Size sz1 = new Size(width, height); + Size mulExpected; + + unchecked + { + mulExpected = new Size(width * multiplier, height * multiplier); + } + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + + [Theory] + [InlineData(1000, 0.0f)] + [InlineData(1000, 1.0f)] + [InlineData(1000, 2400.933f)] + [InlineData(1000, float.MaxValue)] + [InlineData(1000, -1.0f)] + [InlineData(1000, -2400.933f)] + [InlineData(1000, float.MinValue)] + [InlineData(int.MaxValue, 0.0f)] + [InlineData(int.MaxValue, 1.0f)] + [InlineData(int.MaxValue, 2400.933f)] + [InlineData(int.MaxValue, float.MaxValue)] + [InlineData(int.MaxValue, -1.0f)] + [InlineData(int.MaxValue, -2400.933f)] + [InlineData(int.MaxValue, float.MinValue)] + [InlineData(int.MinValue, 0.0f)] + [InlineData(int.MinValue, 1.0f)] + [InlineData(int.MinValue, 2400.933f)] + [InlineData(int.MinValue, float.MaxValue)] + [InlineData(int.MinValue, -1.0f)] + [InlineData(int.MinValue, -2400.933f)] + [InlineData(int.MinValue, float.MinValue)] + public void MultiplicationTestSizeFloat(int dimension, float multiplier) + { + Size sz1 = new Size(dimension, dimension); + SizeF mulExpected; + + mulExpected = new SizeF(dimension * multiplier, dimension * multiplier); + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + [Theory] + [InlineData(1000, 2000, 30.33f)] + public void MultiplicationTestSizeFloatWidthHeightMultiplier(int width, int height, float multiplier) + { + Size sz1 = new Size(width, height); + SizeF mulExpected; + + mulExpected = new SizeF(width * multiplier, height * multiplier); + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + + [Fact] + public void DivideByZeroChecks() + { + Size size = new Size(100, 100); + Assert.Throws(() => size / 0); + + SizeF expectedSizeF = new SizeF(float.PositiveInfinity, float.PositiveInfinity); + Assert.Equal(expectedSizeF, size / 0.0f); + } + + [Theory] + [InlineData(0, 1)] + [InlineData(1, 1)] + [InlineData(-1, 1)] + [InlineData(1, -1)] + [InlineData(-1, -1)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MaxValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, 1)] + [InlineData(int.MinValue, 1)] + [InlineData(int.MaxValue, -1)] + public void DivideTestSizeInt(int dimension, int divisor) + { + Size size = new Size(dimension, dimension); + Size expected; + + expected = new Size(dimension / divisor, dimension / divisor); + + Assert.Equal(expected, size / divisor); + } + + [Theory] + [InlineData(1111, 2222, 3333)] + public void DivideTestSizeIntWidthHeightDivisor(int width, int height, int divisor) + { + Size size = new Size(width, height); + Size expected; + + expected = new Size(width / divisor, height / divisor); + + Assert.Equal(expected, size / divisor); + } + + [Theory] + [InlineData(0, 1.0f)] + [InlineData(1, 1.0f)] + [InlineData(-1, 1.0f)] + [InlineData(1, -1.0f)] + [InlineData(-1, -1.0f)] + [InlineData(int.MaxValue, float.MaxValue)] + [InlineData(int.MaxValue, float.MinValue)] + [InlineData(int.MinValue, float.MaxValue)] + [InlineData(int.MinValue, float.MinValue)] + [InlineData(int.MaxValue, 1.0f)] + [InlineData(int.MinValue, 1.0f)] + [InlineData(int.MaxValue, -1.0f)] + [InlineData(int.MinValue, -1.0f)] + public void DivideTestSizeFloat(int dimension, float divisor) + { + SizeF size = new SizeF(dimension, dimension); + SizeF expected; + + expected = new SizeF(dimension / divisor, dimension / divisor); + Assert.Equal(expected, size / divisor); + } + + [Theory] + [InlineData(1111, 2222, -333.33f)] + public void DivideTestSizeFloatWidthHeightDivisor(int width, int height, float divisor) + { + SizeF size = new SizeF(width, height); + SizeF expected; + + expected = new SizeF(width / divisor, height / divisor); + Assert.Equal(expected, size / divisor); + } } } \ No newline at end of file From 29ca4195ec4da6853446da6735be85f9cdae5598 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Thu, 8 Jun 2017 18:01:47 +0100 Subject: [PATCH 009/136] [SL.Core] remove opencover --- tests/CodeCoverage/.gitignore | 2 +- .../OpenCover.4.6.519/License.rtf | 166 --- .../MSBuild/OpenCover.MSBuild.dll | Bin 10240 -> 0 bytes .../MSBuild/OpenCover.targets | 10 - .../SampleSln/.nuget/packages.config | 6 - .../SampleSln/Bom/Bom.csproj | 53 - .../SampleSln/Bom/BomManager.cs | 17 - .../SampleSln/Bom/Properties/AssemblyInfo.cs | 36 - .../OpenCover.4.6.519/SampleSln/BomSample.sln | 31 - .../SampleSln/BomTest/BomManagerTests.cs | 39 - .../SampleSln/BomTest/BomTest.csproj | 65 - .../BomTest/Properties/AssemblyInfo.cs | 36 - .../SampleSln/BomTest/packages.config | 4 - .../OpenCover.4.6.519/SampleSln/coverage.bat | 5 - .../OpenCover.4.6.519/docs/ReleaseNotes.txt | 137 -- .../OpenCover.4.6.519/docs/Usage.rtf | 1138 ----------------- .../CodeCoverage/OpenCover.4.6.519/readme.txt | 21 - .../tools/Autofac.Configuration.dll | Bin 40448 -> 0 bytes .../OpenCover.4.6.519/tools/Autofac.dll | Bin 203264 -> 0 bytes .../tools/CrashReporter.NET.dll | Bin 109056 -> 0 bytes .../tools/Gendarme.Framework.dll | Bin 84992 -> 0 bytes .../tools/Gendarme.Rules.Maintainability.dll | Bin 36352 -> 0 bytes .../tools/Mono.Cecil.Mdb.dll | Bin 45056 -> 0 bytes .../tools/Mono.Cecil.Pdb.dll | Bin 81920 -> 0 bytes .../OpenCover.4.6.519/tools/Mono.Cecil.dll | Bin 280576 -> 0 bytes .../tools/OpenCover.Console.exe | Bin 80384 -> 0 bytes .../tools/OpenCover.Console.exe.config | 26 - .../tools/OpenCover.Extensions.dll | Bin 11264 -> 0 bytes .../tools/OpenCover.Framework.dll | Bin 151040 -> 0 bytes .../OpenCover.4.6.519/tools/log4net.config | 39 - .../OpenCover.4.6.519/tools/log4net.dll | Bin 301056 -> 0 bytes .../transform/simple_report.xslt | 332 ----- .../OpenCover.4.6.519/transform/transform.ps1 | 17 - 33 files changed, 1 insertion(+), 2179 deletions(-) delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/License.rtf delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/readme.txt delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Framework.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Rules.Maintainability.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Mdb.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Pdb.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe.config delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 diff --git a/tests/CodeCoverage/.gitignore b/tests/CodeCoverage/.gitignore index 861c19344..6a14856d0 100644 --- a/tests/CodeCoverage/.gitignore +++ b/tests/CodeCoverage/.gitignore @@ -1 +1 @@ -/OpenCover.4.6.519 +/OpenCover* \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/License.rtf b/tests/CodeCoverage/OpenCover.4.6.519/License.rtf deleted file mode 100644 index 0916f4d61..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/License.rtf +++ /dev/null @@ -1,166 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;} -{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} -{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} -{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f380\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} -{\f382\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f387\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} -{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} -{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; -\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp -\f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive -\ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}} -{\*\rsidtbl \rsid11275983\rsid14818796\rsid15367925\rsid16724145}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun} -{\creatim\yr2012\mo1\dy5\hr7\min52}{\revtim\yr2012\mo2\dy21\hr8\min10}{\version3}{\edmins2}{\nofpages1}{\nofwords157}{\nofchars900}{\*\company Microsoft}{\nofcharsws1055}{\vern49273}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word -ml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen -\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 -\jexpand\viewkind1\viewscale60\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot15367925\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14818796 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Copyright (c) 2011}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16724145 -2012}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Shaun Wilde -\par Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation -files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is fu -rnished to do so, subject to the following conditions: -\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -\par THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11275983 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f -7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 -615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad -79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b -5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab -999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 -699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 -8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 -0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f -9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be -15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 -3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d -32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a -f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 -e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 -fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 -ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae -a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 -399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 -4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 -0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b -c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 -689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 -5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 -aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d -316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 -545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a -c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 -0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 -8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 -d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 -1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f -bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 -a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a -0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 -0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 -00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; -\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; -\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; -\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 -4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000e00b -b50e14f0cc01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll deleted file mode 100644 index 4e5b94aaf085b8bf29f639361809f7216d39d51e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 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 T?}OP1_r=xp|DOL3_Q3xDcd->A diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets deleted file mode 100644 index caf2b79ba..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $(MSBuildExtensionsPath32)\OpenCover - $(OpenCoverMSBuildTasksPath)\OpenCover.MSBuild.dll - - - - diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config deleted file mode 100644 index cfe9c46fb..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj deleted file mode 100644 index 400bb251a..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Debug - AnyCPU - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} - Library - Properties - Bom - Bom - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs deleted file mode 100644 index ad91490d3..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Bom -{ - public class BomManager - { - public int MethodToTest(IEnumerable collection) - { - return (collection ?? new int[0]).Sum(); - } - } -} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs deleted file mode 100644 index cc769d0e4..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bom")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Bom")] -[assembly: AssemblyCopyright("Copyright © 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("2b4e3956-c04a-42f8-a367-87bc16ffa08d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln deleted file mode 100644 index f5edc5b2d..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bom", "Bom\Bom.csproj", "{0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BomTest", "BomTest\BomTest.csproj", "{E25E828A-5D71-4E95-AEBC-7AD21315DFEC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{A3CD3B1D-4C14-4A8C-A57F-A265BC49FB29}" - ProjectSection(SolutionItems) = preProject - .nuget\packages.config = .nuget\packages.config - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.Build.0 = Release|Any CPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs deleted file mode 100644 index 486e2b389..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Bom; -using NUnit.Framework; - -namespace BomTest -{ - [TestFixture] - public class BomManagerTests - { - [Test] - public void Sum_Is_Zero_When_No_Entries() - { - var bomManager = new BomManager(); - Assert.AreEqual(0, bomManager.MethodToTest(new Collection())); - } - - [Test] - [TestCase(new[] { 0 }, 0)] - [TestCase(new[] { 1 }, 1)] - [TestCase(new[] { 1, 2, 3 }, 6)] - public void Sum_Is_Calculated_Correctly_When_Entries_Supplied(int[] data, int expected) - { - var bomManager = new BomManager(); - Assert.AreEqual(expected, bomManager.MethodToTest(new Collection(data))); - } - - [Test] - public void Sum_Is_Zero_When_Null_Collection() - { - var bomManager = new BomManager(); - Assert.AreEqual(0, bomManager.MethodToTest(null)); - } - } -} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj deleted file mode 100644 index 4942e9f28..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Debug - AnyCPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC} - Library - Properties - BomTest - BomTest - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\NUnit.2.6.4\lib\nunit.framework.dll - - - - - - - - - - - - - - - - - - - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} - Bom - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 60d4b26d9..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BomTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("BomTest")] -[assembly: AssemblyCopyright("Copyright © 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("688e9792-727d-4e39-a0ae-93461aa13b49")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config deleted file mode 100644 index c714ef3a2..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat deleted file mode 100644 index 02415f7e3..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat +++ /dev/null @@ -1,5 +0,0 @@ -.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user "-filter:+[Bom]* -[*Test]*" "-target:.\packages\NUnit.Runners.2.6.4\tools\nunit-console-x86.exe" "-targetargs:/noshadow .\BomTest\bin\Debug\BomTest.dll" - -.\packages\ReportGenerator.2.1.8.0\tools\ReportGenerator.exe "-reports:results.xml" "-targetdir:.\coverage" - -pause \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt b/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt deleted file mode 100644 index cc71c4a16..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt +++ /dev/null @@ -1,137 +0,0 @@ -Version 4.6.519 -#528 -safemode:on to address incomplete coverage due to thread based buffers (feature) -#521 add exclude paths (feature) -#376 protect buffer allocation in multithreaded environment (fix) -#335 allow short wait timeout to be configured (feature) -#310 improved reporting - hide branches due to iterators (feature) -#352 improved reporting - hide branches due to async (feature) -#363 calculate npath comlexity (feature) -#282 exclude by process (feature) -#246 auto crash reports (feature) -#329 address ArgumentOutOfRangeException (potentially related to #274) (fix for VS2015) -#335 error on unrecognized arguments/prefixes (fix) -#328 exclude types when declaredtype is excluded (fix-feature) -#302 ignore branches in known autogenerated sequences (feature) - -Version 4.6.166 -#323 push releases and candidates to github via appveyor (prj-mgmt) -#315 update nuget package (fix for VS2015) -#320 update packages (fix for VS2015) -#304 add switch to control timeout wait (feature) -#307 add -version to args (feature) -#305 add corclr_profiler_path support (feature) -#303 support for test cases and theories during track by test (feature) -#295 exclude assembly by attribute (feature) -#288 report (to console) if can't ready body of method (diag) -#287 fix crash (fix) -#283 Add visited class/method to summary entity (feature) -#274 Use thread based buffers for performance improvement (fix) - -Version 4.5.3723 -#244 support ApplicationUnderTest.Launch to propagate required OPENCOVER environment variables (feature) -#256 support Microsoft Fakes (feature) - beta support until we bed feature in (feature) -#248 address issue with Mono.Cecil and latest PDB (.NET 4.6) version (fix) -#252 use AppVeyor for building code and pull requests (prj-mgmt) - -Version 4.5.3522 -#243 null reference exception when excluding branch point in using finally block (fix) - -Version 4.5.3427 -#234 improved IIS support (fix) -#237 handle multiple files for a method e.g. during code contract re-writes (fix) -#228 add MDB support (feature) -#226 remove branch points on methods without sequence points (fix) -#225 Enable filters to use regular expressions (feature) -#218 Auto tag release notes (prj-mgmt) -#116 output results to accumulate with previous coverage file activate by -mergeoutput (feature) - -Version 4.5.3207 -#209 The number of WaitHandles must be less than or equal to 64 (fix) -#208 Line Number for Branch Points (feature) -#207 "using" statement causes incorrect Branch Coverage (fix) -#201 NETWORK SERVICE support (feature) - -Version 4.5.2506 -#188 Bring back COR_PRF_DISABLE_ALL_NGEN_IMAGES -#190 Compiler generated "Empty" Branch Points feature high close on next release -#191 SequencePoint FileID [CodeContractClass/For] - -Version 4.5.2316 -#170 - Overflow fixed -#188 - re-introduced COR_PRF_DISABLE_ALL_NGEN_IMAGES -#174 / #176 - pass arguments as multiple variable - -Version 4.5.1923 -#168 - skip auto implemented properties -#164 - allow registryless loading -#163 - improved error messages - -Version 4.5.1604 -#156 - prepend targetdir when applying test strategies (silverlight) - -Version 4.5.1528 -#158 - fix app domain crash due to timeout of proxy - -Version 4.5.1403 -#154 - Add xUnit to the list of supported strategies for the Cover by Test feature -#150 - fix for Xslt issue -Build Environment now uses BDD tests to ensure the packages have all assemblies required to run - -Version 4.5.1314 -#148 - Fix issue with nuget and zip packages and missing Autofac assembly. - -Version 4.5.1313 -#118 - Fix communication issue between profiler and host when many processes are vying for the channel - - improved thread management - - only check if method needs tracing if coverbytest option is utilised - -Version 4.5.1310 -#128 - Add threshold limits (optional commandline) to reduce reporting of visits -#135 - Add performance counters (admin privileges required) around the memory processing queues - -Version 4.5.1302 -Update version number to reflect 4.5 support -Fix bug in summaries - -Version 4.0.1229 -Supports .NET 4.5 (not windows store apps) -#120 - Built in Summary Reports - useful for build systems - -Version 4.0.1128 -#125 - Hide compiler generated method when no source remains after skipping -#107 - fix 'sporadic' crash when dealing with Generic methods. - -Version 4.0.1118 -#137 - Fix instrumentation issue when dealing with typed clauses -#107 - fix 'sporadic' crash when dealing with Generic methods. - -Version 4.0.1107 -#133 - Remove skipped File/Module/Class/Methods from report -#130 - Support for 'returntargetcode' switch in msbuild task -#126, #127, #132 - ReportGenerator upgrades -#122 - filter from file instead of command line list option (#123 patch) - -Version 4.0.804 -#117 - fix filter crash with anonymous types -#110 - fix timeout issues due to performance woes in dealing with large number of types/methods - -Version 4.0.724 -#94 - remove thread that "may" have been the cause of the nunit-agent.exe closedown issue - switched to a shared memory buffer per child process/profiler object instantiated -#108 - merge pull request - ToolPath property for MSBuild command - -Version 4.0.519 -#102 - add msbuild parts to zip and nuget package -#99 - exclude anonymous functions if containing method is excluded -#97 - fix crash based on receiving corrupt data (sequence point with id==0) -#88 - only use COR_PRF_DISABLE_TRANSPARENCY_CHECKS_UNDER_FULL_TRUST if oldStyle instrumentation - -Version 4.0.408 -#83 - build a zip package -#88 - provide a switch for "old school" instrumentation -#95 - fix for namespaces with spaces - -Version 4.0.301.10 -#78 - fix for endfault/endfinally -#71 - detect disabled service - - diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf b/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf deleted file mode 100644 index a078a647e..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf +++ /dev/null @@ -1,1138 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} -{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} -{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f39\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} -{\f40\fbidi \fmodern\fcharset0\fprq1{\*\panose 020b0609020204030204}Consolas;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} -{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} -{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} -{\f64\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f65\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f66\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f67\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} -{\f68\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f69\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f81\fbidi \fswiss\fcharset238\fprq2 Helvetica CE;}{\f82\fbidi \fswiss\fcharset204\fprq2 Helvetica Cyr;} -{\f84\fbidi \fswiss\fcharset161\fprq2 Helvetica Greek;}{\f85\fbidi \fswiss\fcharset162\fprq2 Helvetica Tur;}{\f86\fbidi \fswiss\fcharset177\fprq2 Helvetica (Hebrew);}{\f87\fbidi \fswiss\fcharset178\fprq2 Helvetica (Arabic);} -{\f88\fbidi \fswiss\fcharset186\fprq2 Helvetica Baltic;}{\f89\fbidi \fswiss\fcharset163\fprq2 Helvetica (Vietnamese);}{\f381\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f382\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} -{\f384\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f385\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f388\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f389\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} -{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f419\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f431\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f432\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} -{\f434\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f435\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f438\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f439\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);} -{\f441\fbidi \fmodern\fcharset238\fprq1 Consolas CE;}{\f442\fbidi \fmodern\fcharset204\fprq1 Consolas Cyr;}{\f444\fbidi \fmodern\fcharset161\fprq1 Consolas Greek;}{\f445\fbidi \fmodern\fcharset162\fprq1 Consolas Tur;} -{\f448\fbidi \fmodern\fcharset186\fprq1 Consolas Baltic;}{\f449\fbidi \fmodern\fcharset163\fprq1 Consolas (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} -{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; -\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; -\caccentone\ctint255\cshade191\red54\green95\blue145;\caccentone\ctint255\cshade255\red79\green129\blue189;\ctexttwo\ctint255\cshade191\red23\green54\blue93;\cfollowedhyperlink\ctint255\cshade255\red128\green0\blue128; -\ctextone\ctint255\cshade255\red0\green0\blue0;\red51\green51\blue51;\red43\green145\blue175;\cbackgroundone\ctint255\cshade191\red191\green191\blue191;}{\*\defchp \f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af0\afs28\alang1025 \ltrch\fcs0 \b\fs28\cf17\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink15 \sqformat \spriority9 \styrsid13184707 heading 1;}{\s2\ql \li0\ri0\sb200\sl276\slmult1 -\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 \b\fs26\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 -\sbasedon0 \snext0 \slink16 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 2;}{\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af0\afs22\alang1025 \ltrch\fcs0 \b\fs22\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink17 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 3;}{\*\cs10 \additive -\sunhideused \spriority1 Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused -Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\fs28\cf17\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 \styrsid13184707 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af0\afs26 \ltrch\fcs0 -\b\fs26\cf18\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink2 \slocked \spriority9 \styrsid12068581 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf18\loch\f31502\hich\af31502\dbch\af31501 -\sbasedon10 \slink3 \slocked \spriority9 \styrsid12068581 Heading 3 Char;}{\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 -\b\fs28\cf17\lang1033\langfe1041\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 \sbasedon1 \snext0 \ssemihidden \sunhideused \sqformat \spriority39 \styrsid7372180 TOC Heading;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 -\sbasedon10 \sunhideused \styrsid8939988 Hyperlink;}{\s20\ql \li0\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 1;}{\s21\ql \li220\ri0\sa100\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 -toc 2;}{\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 -\sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 3;}{\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\contextualspace \rtlch\fcs1 -\af0\afs52\alang1025 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink24 \sqformat \spriority10 \styrsid7372180 Title;}{\*\cs24 \additive -\rtlch\fcs1 \af0\afs52 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\kerning28\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink23 \slocked \spriority10 \styrsid7372180 Title Char;}{\s25\ql \li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 -\sbasedon0 \snext25 \sqformat \spriority34 \styrsid6453762 List Paragraph;}{\s26\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 -\fs24\lang3081\langfe3081\cgrid\langnp3081\langfenp3081 \sbasedon0 \snext26 \ssemihidden \sunhideused \styrsid11687369 Normal (Web);}{\*\cs27 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \spriority0 \styrsid11687369 apple-converted-space;}{\* -\ts28\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af37\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon11 \snext28 \spriority59 \styrsid5114927 -Table Grid;}{\*\cs29 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf20 \sbasedon10 \styrsid11032164 FollowedHyperlink;}}{\*\listtable{\list\listtemplateid740077246\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid382339409}{\list\listtemplateid1903328102\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360 -\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext -\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417 -\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;} -\f2\fbias0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 -\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid401637325}{\list\listtemplateid508579338 -\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916433\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel -\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2 -\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid405616751}{\list\listtemplateid1306685724\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid484125747}{\list\listtemplateid1826631064{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers -\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 -\ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4320 -\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 } -{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc0 -\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid723678808} -{\list\listtemplateid-842228772\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1138174080\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li6840\lin6840 }{\listname ;}\listid950892184}{\list\listtemplateid-1038568524\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431 -\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 } -{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel -\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0 -\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2 -\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid1199853486} -{\list\listtemplateid-1235995406\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li6480\lin6480 }{\listname ;}\listid1997226378}{\list\listtemplateid-2031863006\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1313997542 -\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 -\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 -\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 -\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 -\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 -\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 -\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 -\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 -\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6840\lin6840 }{\listname ;}\listid2120176231}}{\*\listoverridetable{\listoverride\listid405616751\listoverridecount0\ls1}{\listoverride\listid2120176231\listoverridecount0\ls2} -{\listoverride\listid950892184\listoverridecount0\ls3}{\listoverride\listid484125747\listoverridecount0\ls4}{\listoverride\listid1997226378\listoverridecount0\ls5}{\listoverride\listid723678808\listoverridecount0\ls6}{\listoverride\listid1199853486 -\listoverridecount0\ls7}{\listoverride\listid382339409\listoverridecount0\ls8}{\listoverride\listid401637325\listoverridecount0\ls9}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} -{\*\rsidtbl \rsid97460\rsid221265\rsid284426\rsid537180\rsid664540\rsid735477\rsid735614\rsid738226\rsid879886\rsid935281\rsid1070110\rsid1510934\rsid1583585\rsid1586953\rsid1598011\rsid1775295\rsid1841268\rsid1903893\rsid1926955\rsid1967093\rsid2060806 -\rsid2177067\rsid2243939\rsid2312332\rsid2783484\rsid2827362\rsid2846494\rsid2890017\rsid2959880\rsid2981254\rsid3290111\rsid3490457\rsid3741585\rsid3829756\rsid4010500\rsid4327818\rsid4477453\rsid4484449\rsid4522593\rsid4545630\rsid5050788\rsid5114927 -\rsid5794820\rsid5921453\rsid6438937\rsid6453762\rsid6518571\rsid6886783\rsid7160127\rsid7237901\rsid7289096\rsid7292194\rsid7372180\rsid7816154\rsid8091909\rsid8145172\rsid8329235\rsid8339308\rsid8475156\rsid8479050\rsid8651410\rsid8728997\rsid8847473 -\rsid8852142\rsid8939988\rsid9049101\rsid9068514\rsid9132688\rsid9137041\rsid9332253\rsid9639182\rsid9639869\rsid10224112\rsid10314410\rsid10845574\rsid11032164\rsid11212548\rsid11687369\rsid11802269\rsid12024666\rsid12060006\rsid12068581\rsid12129336 -\rsid12348517\rsid12584760\rsid13184707\rsid13261933\rsid13513498\rsid13586263\rsid13596290\rsid13722641\rsid13847658\rsid14041828\rsid14097242\rsid14228117\rsid14243083\rsid14371182\rsid14497238\rsid14513928\rsid14565649\rsid14684873\rsid14885541 -\rsid15205038\rsid15221525\rsid15280621\rsid15795287\rsid15819295\rsid15938139\rsid16071677\rsid16142742\rsid16259852\rsid16349201\rsid16469695\rsid16712264}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 -\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun Wilde}{\creatim\yr2012\mo1\dy3\hr1\min4}{\revtim\yr2016\mo1\dy31\hr14\min3}{\printim\yr2016\mo1\dy31\hr14\min2}{\version61}{\edmins4613}{\nofpages11}{\nofwords3439}{\nofchars19608} -{\*\company Microsoft}{\nofcharsws23001}{\vern57439}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 -\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 -\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot284426\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180\contextualspace \rtlch\fcs1 \af0\afs52\alang1025 \ltrch\fcs0 -\fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13184707 \hich\af31502\dbch\af31501\loch\f31502 OpenCover Usage Guide}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid12068581 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 {\*\bkmkstart _Toc442012125}\hich\af31502\dbch\af31501\loch\f31502 Intro{\*\bkmkend _Toc442012125} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 The following guide describes how to use }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 HYPERLINK "https://github.com/OpenCover/opencover"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 -{\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b66000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f004f00700065006e0043006f007600650072002f006f00700065006e0063006f007600650072000000795881f4 -3b1d7f48af2c825dc485276300000000a5ab000000000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 OpenCover}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 HYPERLINK "http://nuget.org/packages/OpenCover/" }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6200000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f004f00700065006e0043006f007600650072002f000000795881f43b1d7f48 -af2c825dc485276300000000a5ab0000004500000000ff00ffe65b0000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid221265\charrsid221265 NUGET}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 ) }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 to gather coverage statistics of your application. -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid879886\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid879886 C}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 an handle 32 and 64 bit .NET processes running on the .NET 2 and .NET 4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 +}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 frameworks. }{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid879886 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 b)\tab}W}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 ill gather sequence and branch coverage informatio -n of your assemblies that match the filters and for which the PDB files can be found.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 c)\tab}Can gather coverage reports of Silverlight applications -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 d)\tab}Can gather coverage reports of Windows Service applications. -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 e)\tab}Can record which tests where executing at a particular time when a coverage point was visited \endash - only MSTest and NUnit supported (requests accepted for others).}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 Currently OpenCover has no }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid735477 full }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 presentation of results other than the XML output file; }{\field{\*\fldinst { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 HYPERLINK "http://www.palmmedia.de/Net/ReportGenerator" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7000000068007400740070003a002f002f007700770077002e00700061006c006d006d0065006400690061002e00640065002f004e00650074002f005200650070006f0072007400470065006e006500720061007400 -6f0072000000795881f43b1d7f48af2c825dc485276300000000a5ab00006c0000000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 ReportGenerator}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 - HYPERLINK "http://nuget.org/packages/ReportGenerator/" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6e00000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f005200650070006f0072007400470065006e0065007200610074006f007200 -2f000000795881f43b1d7f48af2c825dc485276300000000a5ab0000005600000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid879886\charrsid879886 NUGET}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 )}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 is currently the recommended tool for visualizing the results. -\par NOTE: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 When there is n}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 o PDB for an assembly then no coverage data will be gathered; this is different to }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid879886 HYPERLINK "https://github.com/sawilde/partcover.net4" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6c000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0073006100770069006c00640065002f00700061007200740063006f007600650072002e006e00650074003400 -0000795881f43b1d7f48af2c825dc485276300000000a5ab0000da0000000000ff00ff1f000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 PartCover}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 which will default to IL coverage under this situation but it - was considered as not required as this is supposed to be a code-coverage tool which can relate such coverage to }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\i\insrsid1775295\charrsid4484449 your}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 code. -\par }\pard\plain \ltrpar\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 -\b\fs28\cf17\lang1033\langfe1041\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 \hich\af31502\dbch\af31501\loch\f31502 Table of Contents -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 TOC \\o "1-3" \\h \\z \\u }}{\fldrslt {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012125"}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -{\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 -\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Intro}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 -\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012125 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 1}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012126"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Command Arguments}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012126 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012127"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Mandatory}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012127 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012128"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012128 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012129"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Handling Spaces}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012129 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 5}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012130"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Understanding Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -PAGEREF _Toc442012130 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012131"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012131 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012132"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Regular Expressions in Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012132 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012133"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012133 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012134"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Running against IIS}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -PAGEREF _Toc442012134 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012135"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Running against an application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -\tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012135 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012136"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012136 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012137"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Running against a Silverlight application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012137 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012138"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012138 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012139"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Running against a Service application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012139 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012140"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012140 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012141"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludeb\hich\af31506\dbch\af31501\loch\f31506 -yattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012141 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012142"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 -\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012142 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012143"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Shimming support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012143 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012144"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Microsoft Moles support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -PAGEREF _Toc442012144 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012145"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Microsoft Fakes support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012145 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012146"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 TypeMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012146 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012147"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 JustMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012147 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012148"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Build system integration}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 - PAGEREF _Toc442012148 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012149"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 all-users (32-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -PAGEREF _Toc442012149 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012150"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 all-users (64-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012150 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012151"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 single-user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012151 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012152"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 R\hich\af31506\dbch\af31501\loch\f31506 eporting}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012152 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012153"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 FAQ}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012153 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012154"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Why do I have no results?}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012154 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012155"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 All my tests are failing and I am getting MissingMethodException}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012155 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid16712264 11}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 }}\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1 -\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 -{\*\bkmkstart _Toc442012126}\hich\af31502\dbch\af31501\loch\f31502 Command Arguments{\*\bkmkend _Toc442012126} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988 OpenCover has a number of arguments that can be used to control the code coverage gathering. If an argument requires s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988\charrsid8939988 paces}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid8939988\charrsid8939988 then use "}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8939988 \rquote s to wrap the argument, where they are applicable they will be indicated with an optional syntax [].}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid4484449 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12068581 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012127}\hich\af31502\dbch\af31501\loch\f31502 Mandatory{\*\bkmkend _Toc442012127} - -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 ["]-target:<}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 target application}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 >["] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid16349201 -The name of the target application or service that will be started; this can also be a path to the target application. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 Alternatively use }{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid8728997\charrsid5050788 -?}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 to show command line help, or }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2060806\charrsid2060806 -version}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 - to print the current version and exit.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012128}\hich\af31502\dbch\af31501\loch\f31502 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid8939988 {\*\bkmkend _Toc442012128} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16349201 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 ["]-targetdir:["] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 -The path to the target directory; if the target argument already contains a path then this argument can be used to provide an alternate path wh}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 ere PDB files may be found. }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid16349201 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid8728997\charrsid5050788 -targetargs:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Arguments to be passed to the target process.}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid1841268 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 [\'93]-searchdirs:[;[\'93] - -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 \tab Additional locations to check for PDB files.\page -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 -register[:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid9639182 |path32|path64}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Use this switch to register and d -e-register the code coverage profiler. Alternatively use the optional }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid9639182 user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 - argument to do per-user registration where the user account does not have administrative permissions. }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 -\par If access to registry is limited then try the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 or }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path64}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid9639182 , depending on your application (32- or 64-bit), to use an alternate method to load the profiler; unfortunately you cannot profile 32- and 64-bit processes at the same time using these switches.}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid9639182\charrsid9639182 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Alternatively use an administrative account to register the profi}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 lers using t -he regsvr32 utility; this is the recommended option when running on a build server especially if \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 \endash register:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 does not work. - -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid13513498 -returntargetcode[:] - -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953\charrsid2783484 -Return the target process return code instead of the OpenCover console return code. Use the offset to return the OpenCover console at a value outside the range returned by the target process. }{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid1586953\charrsid1586953 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid15205038 -safemode:on|off|yes|no -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Use this switch to disable safe mode (default is }{\rtlch\fcs1 -\af0 \ltrch\fcs0 \b\insrsid15205038\charrsid15205038 on}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 /yes). When in safe mode the profiler will use a common buffer for all threads which may have performance impacts if you code or tests use threads he -avily. When safe mode is disabled, there may on occasions be some data loss if the runtime closes the application under profile before the profiler has been able to retrieve the visit count data. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid5050788\charrsid13513498 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12068581\charrsid13513498 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5050788 -The location and name of the output xml file. If no value is supplied then the current directory will be used and the outpu}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 t filename will be results.xml.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 - -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid2312332 -threshold: -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 -Limits the number of visit counts recorded/reported for an instrumentation point. May have some performance gains as it can reduce the number of messages sent fr -om the profiler. Coverage results should not be affected but will have an obvious impact on the Visit Counts reported.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 -\par -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid664540\charrsid13513498 -filter:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["] -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 A list of filters to apply to selectively include or -exclude assemblies and classes from coverage results. Filters have their own form}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid9332253 at }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540 \'b1[module}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\b\insrsid664540\charrsid9332253 -filter]class-filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 . If no filter(s) are supplied then a default include all filter is applied +[*]*. As can be seen you can use an * as a wildcard. -\par -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540\charrsid13261933 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 : Also an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 exclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (-) -filter takes precedence over an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 inclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid13261933 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (+) filter.}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid664540 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9639869 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid9639869\charrsid9639869 -regex -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 \tab -\par \tab Filters are supplied using regular expressions rather than wildcards. -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14243083\charrsid13513498 -nodefaultfilters -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083 -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 A list of default exclusion filters are usually applied}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid10314410\charrsid2783484 , this option can be used to turn them off. The default filters are:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 -\par }\pard \ltrpar\ql \li1440\ri0\widctlpar\wrapdefault\faauto\rin0\lin1440\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -[mscorlib]* -\par -[mscorlib.*]* -\par -[System]* -\par -[System.*]* -\par -[Microsoft.VisualBasic]* -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid13513498 -mergebyhash -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -Under some scenarios e.g. using MSTest, an assembly may be loaded many times from different locations. This option is used to merge the coverage results for an assembly regardless of where it was loaded as -suming the assembly has the same file-hash in each location. -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 -skipautoprops}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid2846494 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 -\par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid2846494 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 Neither track nor record Auto-Implemented properties. -\par -\par i.e. skip getters and setters like these -\par -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 public}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 bool}{ -\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 Service \{ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 get}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; }{ -\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 set}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; \}}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid2846494 -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid664540 -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 -showunvisited -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 Show a list of unvisited methods and classes after the coverage run is finished}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid664540 and the results are presented.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15205038 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid664540 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid9639182 [\'93]-}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid15205038 excludeddirs:[;[\'93 -] -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Any assembly found in an excluded folder (or its children) will be ignored, regardless of any inclusive -filter matches.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2846494 -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14228117\charrsid2783484 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyattribute:[;][;]} -{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2783484\charrsid13513498 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 -Exclude a class or method by filter(s) that match attributes that have been applied that have been applied.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid4327818 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyfile:[;][;] - -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid4327818 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 Exclude a class (or methods) by filter(s)}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid13513498 that match the filenames.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 -hideskipped:}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid3490457\charrsid15280621 File|Filter|Attribute|MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 -MissingPdb }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid664540 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 Excl -udedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 [}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457 {\*\bkmkstart OLE_LINK1}{\*\bkmkstart OLE_LINK2};}{ -\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 File|}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid15280621 Filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |Attribute}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid15280621\charrsid15280621 |MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 MissingPdb }{ -\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15205038 {\*\bkmkend OLE_LINK1}{\*\bkmkend OLE_LINK2}|ExcludedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 ] - -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 Remove information from output file (}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \i\insrsid12060006\charrsid8475156 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ) that relates to classes/modules that have been skipped (filtered) due to the use of}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 - the following switches}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3741585 excludeb}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid12060006\charrsid8475156 yfile}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ,}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid3741585\charrsid3741585 \_}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid3741585 e}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 xcludebyattribut}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 e:}{\rtlch\fcs1 -\af37 \ltrch\fcs0 \insrsid3741585 and}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 filter}{\rtlch\fcs1 -\af37 \ltrch\fcs0 \i\insrsid8475156\charrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 or where the PDB is missing}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 . -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5794820 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5794820 -coverbytest}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid5794820\charrsid13513498 :[;][;] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1967093 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 -Gather coverage by test by analysing the assemblies that match these filters for Test m}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 ethods. Currently only }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8339308 MSTest and }{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid5794820 NUnit tests}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 are supported; other frameworks can be added on request \endash please raise support request on GitHub.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -log:[Off|Fatal|Error|Warn|Info|Debug|Verbose|All] - -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 Change the logging level, default is set to Info. }{\rtlch\fcs1 -\af37 \ltrch\fcs0 \insrsid13513498\charrsid13513498 Logging is based on log4net logging levels and appenders}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 . -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -service -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15795287 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid15795287\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid15795287 : \'93Administrator\'94 privileges recommended. -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 -The value provided in the target parameter is the name of a service rather than a name of a process. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8145172\charrsid8145172 -servicestarttimeout:[1m|23s|1m23s] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8145172 Overrides the default time to wait for the profiled service t -o start. The examples above correspond to a timeout of 1 minute, 23 seconds and 1 minutes and 23 seconds accordingly. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 -}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid14513928 oldstyle}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14513928 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 Use old style instru}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid3490457 mentation \endash the instrumentation}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 is not Silverlight friendly and is provided to support environments where mscorlib instrumentation is not working. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2312332\charrsid2312332 -enableperformancecounters -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid2312332\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid2312332 : \'93Administrator\'94 privileges}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15795287 required}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 . -\par Allows the monitoring in \'93Performance Monitor\'94 of the following }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 values}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 : -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li1080\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1080\itap0\pararsid2312332\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid2312332\charrsid2312332 \'93messages remaining on the queue}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 \'94 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 2)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 \'93number of messages processed\'94 -}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 -\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7816154 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 These values are usually cleared at the end of a performance run.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154\charrsid7816154 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 {\*\bkmkstart _Toc442012129}\hich\af31502\dbch\af31501\loch\f31502 Handling Spaces}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid14513928 {\*\bkmkend _Toc442012129} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 If your argument needs to escape quotes i.e. to pass arguments with spaces to the target process then you can use \\". -\par e.g. -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid4484449\charrsid8847473 -targetargs:"\\"c:\\program files\\" arg2 arg3" - -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 Or -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8847473\charrsid8847473 \'93-targetargs:\\"c:\\program files\\ -" arg2 arg3" -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid4484449 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 {\*\bkmkstart _Toc442012130}\hich\af31502\dbch\af31501\loch\f31502 Understanding Filters -{\*\bkmkend _Toc442012130} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2827362 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 Filters are core to understanding how OpenCover works and how it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 is determined}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 - which assemblies are to be instrumented to provide coverage results. -\par Filters can be inclusive and exclusive represented by + and }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 \endash prefix }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 respectively, }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 where e}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid2827362 xclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (-) filters take precedence}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 over inclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (+)}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid2827362 filters. -\par The next }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 part of a filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 -is the module-filter and usually this happens to be the same name as the assembly but without the extension and this rule will normally apply 99.999% of the time. If this filter isn\rquote -t working look in the coverage XML and compare the found entries against the filter.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 The final part of the filter is the class-filter and this also }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 includes}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 the namespace part of the class as well. - -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 {\*\bkmkstart _Toc442012131}\hich\af31502\dbch\af31501\loch\f31502 Examples{\*\bkmkend _Toc442012131} - -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 +[Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 -*]* -[Open.Test]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 -\f2\insrsid3290111\charrsid3290111 -\par +[Open]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 -[Open]Data.*\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 -\f2\insrsid3290111\charrsid3290111 -\par +[Open]* -[Open]*Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes ending with Attribute. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012132}\hich\af31502\dbch\af31501\loch\f31502 Regular Expressions in Filters -{\*\bkmkend _Toc442012132} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 It is also possible to use regular expressions instead of wildcards but to do so require that you use the \endash regex swit -ch when specifying the filters. NOTE: When using this feature it is required that all filters use regular expressions rather than wildcards. -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid9639869 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012133}\hich\af31502\dbch\af31501\loch\f31502 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid9639869 {\*\bkmkend _Toc442012133}\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid9639869 -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 \\.}{ -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 -\af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 \\}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 .Test}{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 -\f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 ) -[(Open)](Data\\..*)\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 -Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 -\af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 -Include all classes in module Open but exclude all classes ending with Attribute.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639869 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid3290111 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 {\*\bkmkstart _Toc442012134}\hich\af31502\dbch\af31501\loch\f31502 Running against IIS -{\*\bkmkend _Toc442012134} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 Normally I\rquote d suggest running against }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 HYPERLINK "http://www.microsoft.com/en-us/download/details.aspx?id=1038" }{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9200000068007400740070003a002f002f007700770077002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f0064006f0077006e006c006f00610064002f006400 -65007400610069006c0073002e0061007300700078003f00690064003d0031003000330038000000795881f43b1d7f48af2c825dc485276300000000a5ab0000000000000039000065960800}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid10224112\charrsid10224112 IISEXPPRESS}}} -\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 as I think it is easier to automate. However for those}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14565649 - who really want to run against a full blown IIS then the following instructions (supplied by a }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid14565649\charrsid14565649 user) will hopefully suffice.}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\cf21\insrsid11687369\charrsid14565649 -\par \'93}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 The trick is to start OpenCover to run the}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid14565649 w3wp.exe process in debug mode}{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\insrsid11687369\charrsid14565649 e.g. -\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe -targetargs:-debug\~\line -targetdir:C:\\Inetpub\\wwwwoot\\MyWebApp -\\bin\\ -filter:+[*]* -register:user -\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 There are some prerequisites tho}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 ugh:}{ -\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 \hich\af31506\dbch\af0\loch\f31506 1.\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin720\itap0\pararsid14565649\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ll applications running under the site must }{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 make use of the same app pool; y}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ou'll get error}{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 s in the EventLog otherwise. -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 \hich\af31506\dbch\af0\loch\f31506 2.\tab}}{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 inetserver needs to be stopped, before starting w3wp.exe in debug mode. You can use the following command: -\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 -{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net stop w3svc /y -\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 -fter testing/code coverage completion you can close the w3wp.exe proce}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 s}{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 s and start the inetserver again: -\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net start w3svc -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 {\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 -This procedure was tested on a Win2008 machine with IIS7.5}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 \'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 You can also run multiple OpenCover instances against separate IIS sites by using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\cf21\insrsid12584760 \endash }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\cf21\insrsid12584760\charrsid12584760 s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 option when running IIS to choose the siteid e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760\charrsid12584760 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12584760 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetargs:"-debug -s 1" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetdir:%WebSite_Path% }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -filter:+[*]* }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -output:%CoverageResult_Path%}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12584760 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12584760 Then you can use ReportGenerator to merge the coverage results. }{ -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012135}\hich\af31502\dbch\af31501\loch\f31502 Running against an application -{\*\bkmkend _Toc442012135} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid7237901 This most common usage }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 of any code coverage utility such as OpenCover }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7237901 is in a testing environment}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid12068581 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7237901 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13513498 {\*\bkmkstart _Toc442012136}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012136} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13513498 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid13513498\charrsid7237901 OpenCover.Console.exe -register:user -target:..\\..\\..\\tools\\NUnit-2.5.10.11092\\bin\\net-2.0\\nunit-console-x86.exe -targetargs:"OpenCover.Test -.dll /noshadow" -filter:"+[Open*]* -[OpenCover.T*]*" -output:opencovertests.xml -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012137}\hich\af31502\dbch\af31501\loch\f31502 Running against a Silverlight application -{\*\bkmkend _Toc442012137} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid16469695 To run against a Silverlight application it is necessary to ensure the site hosting the application is runni -ng beforehand. To profile a Silverlight application it is necessary to launch a browser against the site and as the PDB files are not packaged in the XAP files it is necessary to give the console a hint where to look for the PDB files}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid1510934 (using the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 \endash targetdir}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 option)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 . -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12068581 {\*\bkmkstart _Toc442012138}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012138} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "-target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\insrsid16469695\charrsid12068581 C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\insrsid16469695\charrsid12068581 -targetar}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 gs:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 http://localhost:4128/SampleSilverlightTestPage.aspx}{ -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 -t}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\insrsid8728997 argetdir:..}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 \\SampleSilverlight\\SampleSilverlight\\Bin\\Debug"}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012139}\hich\af31502\dbch\af31501\loch\f31502 Running against a Service application -{\*\bkmkend _Toc442012139} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid7289096 It is preferable to run the service in a console mode if it has one rather than as a service however if you do decide to use it against a service then you will nee -d to make sure you use an account that can access the windows synchronisation objects in the Global namespace (rather than Local namespace). \'93Local System\'94 seems to work quite well and so do user accounts w}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid8479050 ith the appropriate permissions;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 \'93Local Service\'94 is}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 usually}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 - problematic and is not recommended. The console host will also need to be run from an account that can access the Global namespace as such an Administrator account or an Administrative prompt is recommended}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 -.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 {\*\bkmkstart _Toc442012140}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012140} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16349201 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 -OpenCover Sample Service" -service }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid8479050 \endash }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 register}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695 - -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8479050 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid8479050 NOTE}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 -: Rather than use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 \endash register}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 switch, it is usually simpler to use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid8479050\charrsid8479050 regsvr32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 utility to pre-register the two profiler assemblies (32 and 64-bit) beforehand.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid12068581 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid738226 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkstart _Toc442012141}\hich\af31502\dbch\af31501\loch\f31502 Using -\hich\af31502\dbch\af31501\loch\f31502 the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid4327818\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyattribute}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid4327818 \hich\af31502\dbch\af31501\loch\f31502 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkend _Toc442012141} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid4327818 Normally you would include/exclude modules and classes by using the inclusion/exclusion filters, however there may be situations where you can\rquote t get coverage via testing and you wish to ignore the uncovered method. - -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 First create a \'93public\'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 - attribute that you can apply to class/method/property which you use to mark up something to ignore. You can have more than one and you can add other data to provide a reason why you are excluding it. -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 e.g. -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 [}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 -AttributeUsage}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 (}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 -\f40\fs16\insrsid738226\charrsid738226 .Class|}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 .Method|}{\rtlch\fcs1 \af40\afs16 -\ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226 .Property)] -\par }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \b\f40\fs16\cf2\insrsid738226\charrsid1775295 public}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf2\insrsid738226\charrsid738226 class} -{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 ExcludeFromCoverageAttribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 -\f40\fs16\insrsid738226\charrsid738226 : }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 Attribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 \{\} -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\insrsid738226 -\par -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 Then you apply this attribute to the class/method/property that you wish to exclude. - -\par Then you add this attribute to the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid1510934 excludebyattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 - option using namespaces and wildcards where necessary. -\par e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 --excludebyattribute:*.ExcludeFromCoverage* -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 NOTE: Use with care as you could exclude a method which you should be testing}{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 ;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 {\*\bkmkstart _Toc442012142}\hich\af31502\dbch\af31501\loch\f31502 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 \hich\af31502\dbch\af31501\loch\f31502 option}{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012142} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid738226 This is a useful option to use to ignore a}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 uto}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 generated files}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid738226 . This works on file and pathnames. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 - the following would ignore all code in files ending in }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9049101\charrsid9049101 generated.cs}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 -excludebyfile}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\insrsid738226\charrsid738226 :}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 *\\}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid2177067 *.generated.cs}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 - -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 -NOTE: Use with care as you could exclude a method which you should be testing; also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid5114927 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012143}\hich\af31502\dbch\af31501\loch\f31502 Shimming support}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid5114927\charrsid5114927 {\*\bkmkend _Toc442012143} -\par \ltrrow}\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 -\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\pard\plain \ltrpar\qj \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid5114927\yts28 \rtlch\fcs1 \af0\afs22\alang1025 -\ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 In comput -er programming, a shim is a small library that transparently intercepts API calls and changes the arguments passed, handles the operation itself, or redirects the operation elsewhere. Shims typically come about when the behavior of an API changes, thereby - -causing compatibility issues for older applications which still rely on the older functionality. In such cases, the older API can still be supported by a thin compatibility layer on top of the newer code. Web polyfills are a related concept. Shims can als -o be used for running programs on different software platforms than they were developed for. -\par - }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 HYPE -RLINK "http://en.wikipedia.org/wiki/Shim_%28computing%29" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7c00000068007400740070003a002f002f0065006e002e00770069006b006900700065006400690061002e006f00720067002f00770069006b0069002f005300680069006d005f0025003200380063006f006d007000 -7500740069006e0067002500320039000000795881f43b1d7f48af2c825dc485276300000000a5ab00000465a901000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid5114927\charrsid5114927 wikipedia}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 \cell }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 -\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 -\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\row }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5114927 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid5114927 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 Depending on the provider of the Shimming utility will determine on how the OpenCover will be used alongside it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid2243939\charrsid2243939 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012144}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Moles support -{\*\bkmkend _Toc442012144} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 To use Moles with OpenCover requires that you first inform Moles that you are using OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid5921453 Before you run moles you need to set an environment variable -\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 -set CLRMONITOR_EXTERNAL_PROFILERS=\{1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8\} -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 Then use OpenCover to run the moles runner -\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012145}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Fakes support -{\*\bkmkend _Toc442012145} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 OpenCover has support for }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 HYPERLINK "https://msdn.microsoft.com/en-us/library/hh549175.aspx" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 -{\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b86000000680074007400700073003a002f002f006d00730064006e002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f006c006900620072006100720079002f00 -680068003500340039003100370035002e0061007300700078000000795881f43b1d7f48af2c825dc485276300000000a5ab00003000000000eb08}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid2243939\charrsid2243939 Microsoft Fakes}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 just use OpenCover to execute vstest.cons -ole.exe and it will detect if the Microsoft Fakes profiler is going to be activated and it will do the rest. -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid5921453 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 {\*\bkmkstart _Toc442012146}\hich\af31502\dbch\af31501\loch\f31502 TypeMock support -{\*\bkmkend _Toc442012146} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 The }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 developers}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 at TypeMock add}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 ed}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid5921453 OpenCover support several years ago; please review their documentation to get both TypeMock and OpenCover to work correctly with the versions you have installed. -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8091909 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\bkmkstart _Toc442012147}\hich\af31502\dbch\af31501\loch\f31502 JustMock support -{\*\bkmkend _Toc442012147} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 The developers at JustMock have also added support for OpenCover; please review their }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 - HYPERLINK "http://www.telerik.com/help/justmock/integration-opencover.html" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9800000068007400740070003a002f002f007700770077002e00740065006c006500720069006b002e0063006f006d002f00680065006c0070002f006a007500730074006d006f0063006b002f0069006e0074006500 -670072006100740069006f006e002d006f00700065006e0063006f007600650072002e00680074006d006c000000795881f43b1d7f48af2c825dc485276300000000a5ab0000002f00000700}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid8091909\charrsid8091909 documentation}}} -\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 to get both JustMock and OpenCover to work correctly with the versions you have installed.}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid8091909\charrsid2243939 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 {\*\bkmkstart _Toc442012148}\hich\af31502\dbch\af31501\loch\f31502 Build system integration}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012148} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 It is not unexpected that OpenCover will be used in a build environment and that the build will be running under a system account under these scenarios it is recommended that you pre-register the prof -iler DLLs using the regsvr32 utility where applicable for your environment. -\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid1926955\charrsid1903893 regsvr32 x86\\OpenCover.Profiler.dll\line regsvr32 x64\\OpenCover.Profiler.dll -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 To assist your build environment when you install OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 using the MSI}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 it will store in the registry a lo -cation of the installation folder. The location in the registry depends on whether it is a single-user or}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 an}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 all-user installation and}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid1903893 also}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 if you}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 are on a 32/64 bit environment. -\par See the following examples based on default settings:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012149}\hich\af31502\dbch\af31501\loch\f31502 all-users -\hich\af31502\dbch\af31501\loch\f31502 (32-bit){\*\bkmkend _Toc442012149} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012150}\hich\af31502\dbch\af31501\loch\f31502 all-users (64-bit) -{\*\bkmkend _Toc442012150} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\Wow6432Node\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{ -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES(X86)%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012151}\hich\af31502\dbch\af31501\loch\f31502 single-user{\*\bkmkend _Toc442012151} - -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKCU\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %LOCALAPPDATA%\\Apps\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 {\*\bkmkstart _Toc442012152}\hich\af31502\dbch\af31501\loch\f31502 Reporting{\*\bkmkend _Toc442012152} - -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7160127 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 It is recommended that ReportGenerator (also available on Nuget) is used to view the coverage results however if you want to make your own reporting then a sample XSLT has been made available by }{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 Pavan Tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 (}{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 HYPERLINK "}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 -https://github.com/pawan52tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 " }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5a000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0070006100770061006e00350032007400690077006100720069000000795881f43b1d7f48af2c825dc4852763 -00000000a5ab0000006f000000005b5a088700ff00}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid7160127\charrsid2981254 https://github.com/pawan52tiwari}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 ). It is simple to use with the supplied powershell script. -\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid7160127\charrsid7160127 powershell -noexit -file ..\\..\\transform\\transform.ps1 -xsl ..\\..\\transform\\simple_report.xslt -xml opencovertests.xml -output simple_output.html -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 Feel free to extend it to your own requirements. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012153}\hich\af31502\dbch\af31501\loch\f31502 FAQ{\*\bkmkend _Toc442012153} -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 {\*\bkmkstart _Toc442012154}\hich\af31502\dbch\af31501\loch\f31502 Why do I have no results?}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkend _Toc442012154} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 There are two common reasons why this may happen.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid8847473 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 1) Instrumentation skipped due to filters. -\par The usual reason for no results}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 because OpenCover cannot locate the PDBs for assemblies that match the filters to be profiled i.e. gather c -overage results from. When each assembly is loaded the location and reason the assembly wasn\rquote t profiled is provided in the coverage results file e.g. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8852142 {\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 -\f2\fs14\insrsid8852142\charrsid8852142 \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 C:\\Personal\\opencover.git -\\working\\main\\bin\\Debug\\OpenCover.Test.dll\line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 OpenCover.Test\line \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid7372180 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 The two most common reasons}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8329235 provided}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 are }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter} -{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 . }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 -\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 is obviously connected to the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8852142\charrsid1510934 \endash filter:}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid8852142 argument and that the ModuleName was not matched}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 -\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid2827362\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 is usually because the PDB is not where the assembly is being loaded from}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 -. The most common reason is }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 due to }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 test tools such as NUnit or MSTest which copy the assembly under test to a new location}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid8329235 ; t}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 his can be corrected by either using the /no}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 shadow or /noisolation option. An alternative is to use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 -\i\insrsid8329235\charrsid1510934 \endash targetdir:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 argument to provide an alternative location for OpenCover to use.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 The other reasons are only applicable to classes and are related to the use of \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyattribute}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \i\insrsid8329235\charrsid1510934 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyfile:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 options. -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 2) Failure to register the profiler assemblies. -\par The profiler assemblies are COM objects and need to be registered in the Registry before the target process is run. -\par This can }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 usually }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 be solved in }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 one of }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 two ways}{\rtlch\fcs1 -\af37 \ltrch\fcs0 \insrsid13596290 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid8847473\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid8847473 Use the }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8847473\charrsid1510934 \endash register[:user] }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 switch -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 b)\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 Pre-register the assemblies using the regsvr32 utility}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid5921453\charrsid5921453 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012155}\hich\af31502\dbch\af31501\loch\f31502 -All my tests are failing and I am getting MissingMethodException{\*\bkmkend _Toc442012155} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 This has been seen on a few systems}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6453762 where the following command has been executed to improve performance (or something similar)}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid14513928 -\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen install /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 The}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3490457 re}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 are two ways to fix or handle this issue -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid6453762\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid6453762 Undo the previous command - }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen uninstall /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 .}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 - -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 2)\tab}Use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid6453762\charrsid1510934 \endash oldstyle}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid6453762 switch, note however that this is not Silverlight friendly. }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762\charrsid6453762 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f -7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 -615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad -79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b -5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab -999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 -699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 -8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 -0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f -9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be -15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 -3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d -32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a -f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 -e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 -fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 -ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae -a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 -399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 -4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 -0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b -c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 -689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 -5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 -aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d -316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 -545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a -c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 -0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 -8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 -d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 -1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f -bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 -a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a -0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 -0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 -00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text; -\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; -\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; -\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; -\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; -\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; -\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; -\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; -\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; -\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; -\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; -\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; -\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; -\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; -\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; -\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; -\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; -\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; -\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; -\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; -\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; -\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; -\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; -\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; -\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; -\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; -\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; -\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; -\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; -\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; -\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; -\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; -\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; -\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; -\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; -\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; -\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; -\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 -4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000d03b -4506d45bd1010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000d03b4506d45bd101 -d03b4506d45bd101000000000000000000000000dc00c600d3004b00c000350050003100c600d400d200d600d1004400c2005900cd00d3004700c300490041003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000d03b4506d45b -d101d03b4506d45bd1010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 -00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 -2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 -0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b38314341 -364346322d444246332d344339422d423643342d3338393842373331413332307d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c -64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 -0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f -72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/readme.txt b/tests/CodeCoverage/OpenCover.4.6.519/readme.txt deleted file mode 100644 index 7e5988f73..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/readme.txt +++ /dev/null @@ -1,21 +0,0 @@ -Welcome to OpenCover. - -OpenCover is an open source (MIT licence) code coverage utility for all .NET -Frameworks (2 and above, including Silverlight). It can handle all .NET -languages as long as the compiled assemblies use the .NET Runtime. - -It is most commonly used to gather coverage data of code that is being -exercised by unit testing i.e. nunit, mstest etc. - -We recommend that you view the documents that have also been installed -alongside the utility to get started or you can look at the documentation -provided on the wiki https://github.com/OpenCover/opencover/wiki/Usage. - -Currently OpenCover has no visualization of its results and we recommend that -your use ReportGenerator (2.1.8 and above) to view the results against your code. - -A sample project showing a possible way to use OpenCover with ReportGenerator -has also been provided for your convenience. - -If you have any issues or feature requests with OpenCover please raise them -with the project owners on https://github.com/opencover/opencover. diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll deleted file mode 100644 index 230786aa2498e16803f418a8d2c8a8a3bf349312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 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 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll deleted file mode 100644 index f2d05ec7ac96b4ad498e8edd3214379a08bb61ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109056 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 OTJMg-`82$=T)n$Y}m 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 whUsj5>c4$9R81c8Q-3^1DHgqevF<7iN% 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 dcQ~f^cj_Ex&Hq%`#-4${vTJ~v8ez6 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll deleted file mode 100644 index bf3acf1795f96526cf4c86b1cb18d1cacfb9dd79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280576 zcmc${33wdExh~x5p6Q-V%SiH!7F#p6k!fZm*^+D+Y{16GEM~L85Xlf^c>@_+ZDwQ^ zk4KoD5HK-e31&%Hv+o<(frR8_A;BbMk3&LMa*~te-kW=}9P_{LSJg8u*>LXtpZ|G& z**#VD)>mJBwSBdA_1Wv*W>|({gz&ufnqfQzlYh(P_l1SqmWMg#wi<@~ArEkjQA6*q75Kq#_8X6Au$>S1)tYoU~F2lEww zl+854#;<-`XUyDb8c{)OKdZBbv8U#IUE4SBylvF}@w<-8{^ppCzr5t=pDn!b@rU-D zc+)F?TlV=2-v5`E?)zJQw>@^l7ryn5-(A*UKKhP?wVzwi0x{`(iNGTk|b5i=*};YAx;Cso z;D>J00x*7*uYH-sA2KckAJhV0-q+(3{0>{Lm?uf1V%RaL`n`e1Suo85xmozVs_f+JU88>V(=hb3K>u@w9q$U51L(&|l_9WGiwWOnDlZKvF$VdR3@B}iPCtIjNk<*Ilg zbd^`vG+ypuyomU`x>UvsuaI%3pH3-NCBWXXLB~w9o!D9;Rl90c)Oyg=^lS(H3A77V zaMdd2nbwPL3j!nQQV+MnM14a2AyM0qA4|Vuw!L92FCrSYH@}I*brW%{u8s5~JF|Rb z5e~RBC<5EtjD;CfJglxw>s4hnt?X-{AJJ9UWJzV822%A$ zxdus0gq`XRx>)xuv{kk*{#mJkm}#XqxSbTz$~@g4$t<&mn(FdLL86ymdu<>t`b3~4 zAj5chAW9=kh(XiqRbaHKu(1w4)KAvlF?0y5PIj`Cm8e06)Ou3N4Mp8dv8KJayg=yH8m#NCkGL6bBv|E*5&?xnQRppnkQumw2 zX^1n#I9=H6n8p6X?rE{g{}D1my=E#0{eiy3&ZjKz8pp6*^fz{o!jWnl9nTpw+*SCs zbK_=tZk-WwQI+yN3A5Zy2c*mAQn{k(T@4OB&8Bw?MC?I5`zs=8JyZwJF01?=NH6;J zTF8W68Tmkw%O3@9P5v6z-el_`8!f;tA**702np_CRFaR`mf2kAT?+4n8F4c(o$?M7 z@gsftp1Pc4m3M(vWjin@;<)I+H?9U9estL!m2#qY5vKMQ-# z>{2zugATPz?B zGDi0(J}5Q22LVqMNHT%K#q6GhPqIx#E&cZ{#Enq}@{6Hk?Qz@tiEwZ-P3vETOZbJI zE;vj_x>7Tqxru3DfpajcoT6{8Z+E3dA(r z(*Z~xn8wMF15+O@hX*Bs0ZDm2iYjiG7r;oQ>hoPrbbm|8OoqyB436q(!{PSAjHZX` zqmhAwxo}ZW#-sw37I53Hw;H;SPX4?sN{;<*af$ zqD(}3?GlEvv0Y9}BpF%RijceUR8VKZ+c+K%?f2;Ce3*ZQ|9Y5VO-KK4!j7SW%;v&y zpNi*kxIc}j@HRLi6G&WVy&2s*CRu8EpFkoZ5tBC50XRLhZm1=cY6<7tO*5Jd?{`tJ z?PO?J=#%K|TEfXN2nSxyMJ7qVnjv>W8XGSK_ z0!$YLWBZ*Hu_EfO|nW`o^Ge{P|?qSfC2&yWDJ^3I@82M@U)SHnfpeO2-h;Xc+ zLk4wlKzGzhk|ER+Xy0{i2U7yaS#)Hz<7_%+ivy6c17e&*2sO+uy_eNODkIe1FVGGm z6X!x6?{gs^SA~v%9P=)L+01&<+pn69=&gWNDr|b#L*tF17N?OE+j|x<4WS;J6c2;tL-Re zi>Amdn?Faj>)sCCHk(z;?ghmUAz0TTGnWPnX$NnCiRzF{LCaDrNb=&2w8n%ZiK|aZ z-D^di3aFik*=)ND!7kO}fY>_wYj-RoE-1dFY)R-0)L^2U@bmgpMr=XEf*(k2cpVSJ=l3Rv3q6_)AzpL0 zs5dH~L?qQ0k7Qzf?U77lA4D=m4@r9txdk%N2=xVXqrtMB{mM%v2^!$v)m#m|gqr&x zU8YJ`C}ys<(DRA#5!(^5iP<`}?B~%&I2TT8xfVdKm@SzMZAp!3*t3SkjU3@f(8yV- zwJOdJ!i7E|7&h*-4eruX-;IL8#PdgB*)v1)pASc-*k@batJ1@3Z7;&=-vpQKMPc=j z>e%qwAhA1GC60ljd@UMOdayA_QXD*n{D#*0xjTqhEEi4L)?^C>I3Z9b+aNo}@kvOS z9$twSFKLSeOxpQ0YIC|D@#zmr8Tlh=qtQ0JmPR`bWE%Ag>X{#JrgeCw11B@pXYOaR zZwfOcjLcxL4Vwn_02E=;A7iOj`U|8EEuNJ;Gh=>}?VbdnH-Z7@GNv2m$<_3$_J%0} z^gwbD7(8HHk3tJbPh5)X=Y9qW|~(Uc*RURILk8au8mXO znWm|Lg(%P#s?k;LDmv*~_Cj)<=M^+U$@7pSip_&6iNVeSkem@9Z0f>b_aE>a_Q|RI zrjkoBDe|hPBF6|1ovST{qf)x`Dy&jTow5vc!UiTLNlV1hDu8+x6%C_w-FI5vt&FkO zcOw6(azzH+Q>T=PV63aq>3U5M^%FhehtTaJbKO%B3Q-FU%FDn5-LGgq9H5C?j+a5Z z$1)OVL&iy<#Sk8}za&5CW;F9yk7?(cjV%1COg;!E()nM9<^u7B-1eXYV(f~`7`29S zi#b;O0F;AT3)y9*hcO5C=b+Y>5oH~gDwVqgJ})B}CNmhrhPDoEmnjsu=oO;h0v*O& z$0~1xmU1nm5%a6x0X0LF-@wRy4DR34ZIuAql~-vm)61&78(~cMdi&@N5lEF~cAI6U$GeJiz%`6lFOs&8)JNM?&%tVR6rOxR zCCqNys0RW}W|#LP33efV^E35yJFO%(-L*vR5@tLx^ed9`Cm>*XTi6K2ou2unr=#pi z6=RuNR4A&WfXE^H8TgkjMiG0X_z@j^H)KKCU~U@)cMOE26vQE85+8`eHz255BbLdX zn(0V5JJU3hI#h@MmDw`5A+y~w1$qJz_RQ4Wl%eKE7mzWhz^2Po+g&4^)vbpW@|gza z)y8b8%938zH3%t{#QUU$S&MSmQmA^Z_I(I5N0kTZE3Aq-$}A$n((gd4zaF|36^ukf z;|olV14(NSfh$FaerUU>1mW!N7Q4bpd(uwiPo7f6>rEG98oMPFO@>NO(-v+H$%Lx2 zuQ3@mlVNuVXob_NNHXl9(IOf~=?r`dbMQAarK;_-KeVMR@QeN{dkDZ_YI3*a4zWAY zO`BKnCpTFJ8U&P1xUSAH=7NV+8(X!6k|CMFtpYpF!ft{2er?B))!_3^xc`9XKZ$EU z(tZW@gLp7-G9aq)c08ZPa{y1F83d-Aps=QkX@=cluN#WncOarV&SM)RQAha?JuDMf zd*F|eoas6sRRM->CoLc{nF6WFX<&MkP~mQec4h!($L%X>fqh08rrEcnvm*_LGWPA9 z5y9R-`c--(ozEr^vZy4 zDz88@g?4>{P45{tJ!p|vQ3Wjbl_{=YY1eP)=V7Tz_X}YuALtFt*)d9u#Vnbf#8ZjF z^(Y8CvcEnWC~(X(QhkY}gYk3*zm0I(AHZHMxFa*y4Y{F=28hb>+}7QXk@tUB24|AWN1I9_(IWQTS@jZida*!rY(23ezZ{JirYw_4ZX&<3Pz%4N}?L zG})%YMnCwWrt3YgOyZ&#_E6ABuo#4qjt5I=8BzoL4&Ux>RKX=Y#xp9sTDGm~bJqE; zjhQy^BO^L}Mpe7di2cm{;G@P&h1*~ac_$;*StF&}5istU$}J`3T?@#;h-nh03`oL4 zJfwWD6W<{HO`873Bho`**cdWxq9OIx`vvK}<%nO6p_Y1T_=NOY#<>vgh~uXWJn{=L zw`2VdG?@u>^rrU~@WjMV=>jF_4TLbXXJ+SKe?%hQ1A#t?{c_lVkj6ZeTd5AgV`0nN zgAqb$9opC$f9Rol5;fegrgz+Nr+tKtBG7fCMi}{1kn|R?lx4p}c(sE*{Bo|5+Tqn@ zT0-ttc<1L#>%ie1YBt@==w~Y}p_N3n8^_w}f{M1L648v-SII-d@bz1Dmbk;19)(VNN9!KX5x-?{b*bov$ zl{)tLkl7Hrfxe?!nNKAhM~PyD&HCo$=a`X3jFGuEg3s{m_OTj$4ZIC)NzC* zKiIX`n^suT<6aIz~0KLIgV8e%B=ggX&5fjrb5RoEGtC7!9zW> zE$L3wwMtMsLk0H48qx;?3ZWXL zcccq{0T)fBH$1@u#1YC#x#NDgK7>OH zOipY5YM=xzs1X?FQt?a3veE+!%h!C%zxkH0`<8F`mT%I6g6Dkq44C}G$dQ^T(>&OQ%FVcB zpDE;F_#1P-%Md# zdC|9s%nT*sEjBTuzY~7$M@euJoFVsZ)7)qnQ~dW$bH9C>8xz|p^!HA4-!sj9-!%6- zrnxcrn!<1YH1`A3+z(E3KQzt#aMdk+;HfBQXnO3m#EUR@l+dfjc7@<-th&rH>y|~` zitUyegPIaSxgJ12JLH`Pm+n_j|Nn+(dPs8}r*MahgU&CO``8-_j`I8n(u-pLIE>t* zM`i?hV}1;hDC!*UsfcP23jppJ2p|>!oLLJX762VSAQk|fJ|GqVGkriT7gpOb#vK_ibb!i#QrbQbCLiBTe++D@bm+0T`p4A^ zdFb!k^GDg~z#honu_5&DIlBu_2c9-O*d+7ERKG_^^h3!Kln5$|>3#(nZ)X;JtKgnz zXR_L&<;GaV_Rgf2ilP@=L}$T?Q+=8;kihzAsxKAIMAeEG7|IwYih1T1%nz7NvTq|% z=5ZcT5Ok)Un6KtLBB}nUo$1l>JCXfD7m-QiUhLxL`|QjdUpfivVG2)~HJY#2v1nWg zdY4(m*ms9cgtePRS)31q3llK~=dNs2d)=LV@gl~xJ4)xmZ10HvUoF< zqO1lc1b5$@izKEX}m1TG)-#f(8ovmcw#1c0^*SQRrD} zHA8jewPLG({c!I+EL=-1T*DE=LA7xwoqAI?lsTjl3ji*C(t|6rqAtY(fa|jYhy|^g zI<6fiS`Wt7T=wklZJcM8jzZaX$7CIpy>uDw5U1vOEckNF;)jFQLOA-WaI4YC5RQO^ z>t;Bpz3Jf=NI3eca5w?L_z1{0#XML z1jp=FXa;>6^!ZRESTqyb(Bnc3LFwE(mK(=1T2zOb?}xFt>>SI*Qu_a~;Eict>~;xk z#8Jj`CFeLblvpw9dV-!@{)`<=%sXh!J7}l_AvvRNCW#%RF=beY7DE)++YJli)?u{_ zYpE(OGq*}-z$E5|u?j`ZU8x`|Rg>-x#-w~@tb4LAi{u_#<`=5fA0z8GgH0_6(n`K5 z?-KlC*G1(+MKTzCxL$xdr`FsgCw&s0vGzt7NN1O~o(^Gv*%}$hfooc9OY#{ov^8H8 zpn>AGxN;bqA=@0e^Hf+K`eYccZ0BXKioGKL{Jeb~F;KFb5DrI8Id`2}!qZ|_?Thst zS(gkH`H`v;RunC7i*TM1;H;!fyO+{uYQn&m?RObW6fVx_NisRil!J`6;%5J!aZBeu zYkHSe6XfTPM4OUwnil(oDj!o88l+_87y_#{7?u&xpy&pANj1-hl&#q0O%^Zpf2ZIv9m6RP;7k^#a8Y0V_GgA#Z!?~+l-cwv-`YmIcP(O zuiKB$Qtfvu1(&$f!_ykF%q>-0#=cM5Z_BWERNM092%hUhqf5Xt17{Ez2m1q6FH{_C z1F?efk;-#5}X+raDpM&HCC4@c1aGj*D`gU7sswvq=G$4}#t zWI?aUC6`$4$hEG^EMcG(%MB>=b`)plR0ov#6{NV?bc-;}atXhw1=X!tdMZ6TZXTM! z@aPUENNI^OsqBPZtx-dNs(cM{n$IRDOwBTbNmRClPDj8wE0Ew=O^6~>&- znKLRP5j!IhFeUEX-xP!1PV)*1B`I^SL=f*P{FJW74>}|Yr(>eZ>(j|X&)X`AKwsuw z0}pn^?k=%dp$gtlW2Z?S!akFAMWdlu9^0)LgvRXsn4$=!EG(Jj-2ew(;rc-^eBKW~ zLr`q)OyMwm1P&0X;)^s%3+3QUsu^;~Su@#i!gkSqDE12HftFp7`Js}T<$yfV`%^re zrUHPxw?o?z7>CVOU`GYEWwM!w^fW}YM?^dj2bm)dnQ}4?)4=#fKu|j}leL9dCqG&lXh}4POzdQZPPKrC{X63S%`xweXDH3!ACv-@g0x{ZRY*kf}@?%L@H7&$cD4oeaqXu+|f_p;a-F z&4w6*O)3ZBWQ20U|7JzeST}_N&MF1wKH}$-B;lrKkY@ihn%3zw9IvyyT~7PaKaP7l z!W)X4M=y7_Z5l0J+P6TP{n{MR<{(VG(JKBl=}(jXGzXp1gz{HrzjhC3li|s~6cKZ@ zuLKVPGy{5of$|`ylD%!y_|9$HqT4oY>>FFyx4j<}Vq4%_s>pzk4EmOZzGabbIo7uv z=UWQCg;9~SG74f8m8)2=HtpPD?eKP3Tet5BZ5-XUEzF-WtGIb0w4vBnif$-w8QoUe zjHGQSP84^-65g=+3jSUy_Dd&d-zN5LutzqGZ|>VUP74UMWkOp(rVvolVs0opIs#j< zx4_&&NIVl3*y5S66-!$&gu%cz;}k<&rK`p!HeQA#kBx8Y8)MedveUPWF%JdtEo00> zL43JB()Ng5`Xpe8c3XbT;(bB}mZKI`G)C>x1WovXYlATHuG|9I z!71PznCe_O)mfP0+&MMu&Z%K{P7S-0Ve4!0PI2vo%R*w9=+R;ksoA!99FlL|wt4#~ zikv1y^=&(=wy}XKR<(^StYTH$7#pGD;(HdWp2b2;d!kyQerP)1(vO;^pncG$EQR zN4G^bUcO~)d~9NKWc%d`L=I1Qmm{Y|hMl_l?(Db4Jr=8pRB z0%?;FT9!cC1Qgpmz6k=L#$OZOwt4i*&5rzvik8-{qD2J7OSg@cCajInKpQWeu<@{d zY=i>B11oF$#5f9)O$Ro(5yn<3A2l2fRv~XAAS!!6Fe0>W!%tKM**3Ac7~2VP#x5P- zys0mGrMGQ#Vhp-0JTW@9t*)`%rkDu>>(@y$!mn&FD%62N%vZeCS%#3!21p? zB-icX7%Ihu>?L-j8;jQa?!Y=n9p4klCvgN&gAegY63>qC#iZZKz{`o2_JG%;^0tB? z@cNt@51B?Gi5T#g{RMvR;AmkF2P2t`vUBjkp;|Z_4jV0{Md-Kp-~}sSb#-+CY*H}O z3}@@YMysN`Rxry7VtWJ&g@PE44uW4e9K@~{%(jEr4T3pN5W7*ZNF<2eBv>>W#BLTW z79&=t({YPn@pursRj@=Nh`mLy`uZStn_vwMz*_wDzE!ZsM!`}l4{jH%sfm~$?;V0A zlfat&uzLk-ZWc_3y;HE37Gi!_yt{_HYHgMB=umO&6Kuu|(1i^h_AbFvsUY@t!P4m< zcDG<{Z9(iF!P?t{*u8>vbOf>c1ncY!V($=a=FA{=zhJXw1+o2tb#(=?2L#JxfHnE) zcu=rx7U{*@Tc!6Q!Di0}W*KRPJuKLqIlz)eo5J2H*xb3m9HU)f?-H#0C}82b847zu zuzB5r>ALZ#U`Nk0v*D0m?;jJ)J(^hOOcnNV!H#i(MSScD!E(nqh@(^Uds47`&dAm^ z`uyH4SWn&pW@)*dX?C!3xJ2S*+dbbbLav;|mrr zKMy`B*y7`Z*rx)~EDvH|66}-}LF{S4R-S^i#r*U>BiN}cS^q3u$DbAKv{QrF zmjyfhv>^5s!Ol26h&?CRsxyMvR|PwBRS^4{U}v2vm~Kb^CfM0$1?j#n*g0nlrrXvx z1UvT}!F1cg!8g>k)#nPPb`9bUj!7f-! z%+~x42zKEG#3CAdQLr~%NGz(c?+P~bCSurnmA>qIf(;J^v6lo}Hyp&iFW5!vg4hoP zyZE9Y_Cvwmd~p!_kzkj+If(sOu#roG*iQsoKN7@#D%j}yAoerCHjD}A0=Zz5Kw^WYbPZP^^eeks_cTLjZ}@)f}@yEKUXO0coZg4nMG+d3wgu2;Vi z?DDOG={odV!M0s4n65*=6KwmoAiv)WHoiT`?^VIPaWiXGb@3kr+u?H4q|1Q`S zJBV32y?+#}cm=Siq3h|N1S=JVpT_<}u!$1G#x(Y4!FEmvrt{@5f?c^Yn2x^+cFmQ* z5;0BpKLp!#RU~VLW4ccMPr=GpgI`@t%lE$o+kK5-I_%#BtL!2c*J1y+V3TEH{y5@4 z1-o{)U^?vI1=~|0=8q%(A=q`3z!D+N@1KHQe{C@D|0UQBdxF@133lUkLF|xVH(f87 zF7wv}yZMG79ZsD}_|D&c|Yc?b{o~;)30EXAnyW z_V%|0v3kMo-WS9g1iR<1Al4|@y>Ayx=V_B*_uU<&OA7Xmdj!*Mt68x7?-fk9tro%d z-zS*PgI2*Fcn7h1T@Pjm_Tc?NEG5`O`-50ou!kQAVr_!G^Fd+_nqRwM?|O(>qsBS} zd*oqaO&aSI?9q1;OKNPUV2`~ESR$d@$1K4fe}tG%*Cp5!j}r6SQAV(jKNhSTS;0Q> zco3T{*e9O|Vsixh)RRGMu3(>jcMv;Du&3S=#JUCh%zFjXxh(?1c{ji~Hl^ykG}DEMYaj9>HGxND%84?7JTg zVts;r?_)u1zF;qXJcwbH8S;Jq6U6*Jv|q3vd@_g)2=>EI1+hWFe)Q=ewotGiKNZ9l z3HFoE1hHcU`{`#nruN5<#|iec&v882tm{ibu!EoHINQgL7wqR>AV0rfSS;AfUnJ(| z{Ssn_j4u)M^YjG4>Yf%^be^6lnE6Z)J4rC>*&w!5u+W!-*fPPwUkPF-3uZqDEab<# zTrlUW#C+YfLa^x9fHnB~{uIGt|0bB0Z>3=IuM_k2{i%W_z5%S>4||$m_1_dshdo`e zhHnw`!=52n(c z7ukM&e&-67`ffNIO8ER%3zq&KWpQ+wuMw>6r66{mVC~;W*s3h&3)b-i_P;*AwSvw3 zA;Kp7yuU!OSwA8_ziwP8Sl5riuNwAEz_@8OOp_;`!~$TQ4~PZ8MLr-F02lj!SO5(9 zfLLm0dBh3-&Az`_0BrFAv7BUD`VK|DWo8A;6=DcvN! zhNN^T5^mJY0fZn{WsGpBvK0ndcrb%3=&rJ$Ly_R9x?J-_uj|Quhj{UqId{1>w`p^` zHpgk!GC{m+PNCvHD^A@R1+1ODa1@rU+#A5(yOBRP;U`wQ8NZ20@#{FwGkFCVy0_5p zR{TV4zVj9HZlj%-lDw6!+wtSz%z+4yI1y=e?_$VU#Pr?{OZ~x^e^j6~7tN`&0*j5A7h>)!Ti37;8x~F% z)p0*>G33CLoGe0o+;T-DSNtvFb}xe*?iTz|y1N+%PMF#5J+MvSc$L|`M~Jz`Xvw}H z_HmP)vXY3`kR?+dwbPO>kJ@d;aGkN^QM+BcJIqII_g=8VBHbS@KCBQEG})BI0^mv?5DS2v1dcT)?*l8#y%ITq zyUWymef0nw1Ea1=kl!e#E{@g5a4U<7L9s~5`0yK>1;&X|2W4Zc<9#-MYs87&+X{HUF~ zFw`-K_n*}557j$I&I|FSsA(V$!I|Yr#P8n9Y!&CVRj1VTSx9qD&d`1weZl>1wr4}m zd|gTf1P#yXxiE23GigC4=7@baPBNGd%0gU-i|KcDulsjNd}O z@cahOKX?FYiY4t^?My@|W@tim!+T;7#+&lqB3@9phE$;|+)-~mstX4smVxKYh`RM-j=l&| z$^)ftghYNuhZ?Fcp+kK~^~HO&RcclKP1ET$*|ACmqz{=qSTSk34kiGxqAPcDnI_TSF?F>~P17qqZw=WgygYdn6Ipr>ewnAALC!$8zh;b7UEuuMi1d#1 zWKWcGu@9hxSYHv4osPDmvlM8$sp`~haLZ86ojBcP_N1*RXyQ&r38aF`(V$ath=+V| z(1!-F^QI%LeblEsf5&nyzKOl6i#-qfcIXZ$z$ah@Z}ncxdyz!T`ahAL0f2v?pF z+EC?LF~gNFi)mNBBBoP$PRvNhwlNNQ&VW1tX$~Ljjb{#R9oe3Uq!;SUh_qe&vfAr+ z)P1D0Z~+QV0JMa0AId&F`euJ@{kO^1|5j&fWPE7gM{3_+>Q2bG5^=L_n%1g)**$QK z^x{s0Rr_L=+}fAFhz`E2-X#>*LiOM>eVib-aH-$E^(4dPclm|lyOh4TS>N~O-TGq3 zrvSRN6`uf*P#r^S{c+412(XGWBqA&8Awn1rbfw%2^jsb80K&5v-S>Vx&*R|*QGHPbkSr`_yzoP9t&10)*VfK>;aOO9c)6em z&Z!*Ut7${=!oAuWi5K3gt?77S53E)vB*&u z^A&B4BK_JLL;7J&#S356NJG5vIc-IHKBBFy@xl|@nv54%2xQ+8FWjlE$h{l2H5)IW z5edQEcmeZuvCfMZHfrn9@xqX{y79u<+M0_Omcwe{8w*x?gjf1tv8tB;gpej>EVTr-4Tf&S%FO|u_D{B7bjN8iY-UOYDc8AM&w>$me!FL-f#c1%gskfuZauGCiK`r<&4STZ&>NVld#EX~@A zQgi}A;>q~bAb&-YvUrenKi5`-h9;|KT_Tw{JnPWyNw9hG0)`%9MS)@;>FXr%BBv4OP$3l7G}#EctiX3rw|Q6zs#LKh7+mNO4NIu7RG{RNuaoe^Dq(ifxymQ)^KD)7NR>Rjg!-@0 zP$lnJvbXBlx#X6rJ-cKN34e`(Qtaj}N-N9UzHyE8Z7n=k^*_3ARKafFo0TQkH!QlX zRycM$3aJB6C!U#jX5s0=lZo;t#-BKU68x#>PXm7%`P0OoB!8Ou(^4(#bgjtHF=Qcj zsINg;B7II_4n$NU99B1|3rTPGrIp3*Yf_dh>Ib&K53gA5waB0qB``8ZEOmVgG}6~C zI!(FkzS+vs(buXhoqa6@ENBFn`x&Dp45SEGO*4{Kq)04jq-b?D?BVoKgrv7YFP0eS zvu{8TEl7Iim{@Gk|CtP=MID}FP=TbM+t;ov^AJ#wqmg46?FSO20|#;p%8-F6oLFLg zQMver4VPJPcyv&H3{khJDOsPw{dUULm(8E6tQ~!tVs2jqhcv5dAiyn?D@rc{83}c(4X#;AoZcZ9IR% zQ!v4%E!KVqG$1b7!`(b>58?{@G=ADLo%oFxa6+R-fy$Wbco5g_b>XKi13L62IBSIE zyiBWN!n^)vK8WkZLFcrA!f6Ljrvo9J&P)`)Gcz&#c4Zpyn~9PME(XlB(uil0G!hvG z&eT%`C)1G0(rC=grO}j`Mr|mp>qrq}X2jYkP^=xqu?`A_P8U<4T2!cVDW)KvW^&>f zI|Y4FrGR?)DD@N;`vN9XOhVz)0SkMN%WnnW~F#VW~+tCkM|OK z*ND6bnvi8H2Mcz;iKH`4_Amyw8wSh{EThe_Oz*qA67q|di*q-2Pq$@G<}lxpPk!Kp zh+XY@u{Cxs1eST9<$sYSI-S@a zLV|l3KIC(^nZ5C%hsA}`De&E8%G?joHH6M3Bym2catigqI ziswPR7>CQ*`ipOQPFN&a|X;Ah}B zRARWc#QZ}l1Nrwe1gqv>pU)AI+a)Z@#r6=I=tQ)rCGTCrk) zQ6sj*5L9j)SGV=Q3~b;Pwf{e$7`ZAM zVI{ltD~2T`IImF4gC)(s0V8z>w#<;!Mcw%B8!D#$PJ*$FhleTjleSyXmO|~j6eq@)B!GP zj%*E$BZ-%Uu`z&v2P7o@8T5c(hfhG-&u1N$OE$0!Bp>l;w6MqL{f1q?thL&ng~I1` zuTjh4otv=%6pCX>hDaWEfzJYI3n*0FT}et?y&udSRm)p}K)L0nw*z@)jT}JkvjFZ5 z^)#8?3S57{y8@m$-@WC)h(-|1Mu~Nfyr_ez_Q!UNwuJTDMYMV@@pY!{Nu zfro(M;F*W};4|CxEO>Kwk5av$30F5b|C zT8-wWwIJ7UExG^uBGNZwkn3WF5Fu>$(3{I&f8qxhmT;fu82C8e{{mpy#TBS_FF>(&3a$4ypc8bi z3E9OF_<8>u$ePexItKw974F9;z5jwm{g&ETrrhN}L}FOH*L;gnr;$3}V)_=#w}gC4 zn3i#TbD@l-)sRO@Iu`m4*=EDIB9u}e;PY$-fF{H0Q$RSD%@XA6n~|@IFeLkceSGU& zKIRt-iNROa8tlkEC$f)za^IQ?Fz|bP5s7@d!RHe2N#S~N#>^n~cBXqB!i>g(Azqc8 zH)bPmz+nP$By~Rt=zf zagyz3SjNk7dGQ8>8w!=>vk}ZAlXtTk>lv=R7=F}$ZTJpRB2vBt>4}FK$V1Re4L@ zJvH21hO;8V{J3UqiIhhf<-)4M1B)Mk1>z1Hs3XQG<2K7DflBgSOD_jjN*3BWE&{Ll z+DdfU`);-l&6oxC*o=)>XbZdYX6(LH9hYba^o3nP;}RcntPhfn1|1uM4lFp=xNU+X znrJr5BN2YD*rE508nAmJV{q3Ka1gM{1!XhXJhBDQh+M=Z`|2 zi{$P?vDqjjv(%2?%IU}rv&>)1#hV6p<#<@J5$~}fD-XY&b%B1|i?A&%R{nTTRGiFX z%lH(^X#?|E!g@Gd70d1cwiVa##NfbWCr<2aC{NssqM*!T*P%2@MY!Fxi_XaMQ|eVR zkOY7A8(%Qb^V%}(|#n0+&qyRRePfmJFKNQ0BzbTiCQK9Yj+nMOUyhi0$UDi%|&Xbvm=VgbGbU+Wumgn;`>qmTb<&^Z0aT z0`cNxOv16TKNpKUWLpETnlo@sX69cbL-w#Ra8h=u9(2;SLUI-Y{cw#B6gyUHV+nl3 z!rq5#*)_8$nf|o+{|mLU zLY?B<+2(yaRSxfPCavv69>sA948Lp{O<4o)Ru#amQ2VGn2+Mr%QYi=4cdrp*$8bi2 zoTM(|(ji#mjv7@=*RVz~2$k?Uo<9lSx9qzZIjO7n{ zM~dSp$b*!rDz6G_6~n0#RmsEZ^Hku38lZwKoenGmfN`#6JdD^bV|vUo`MMIHYER40 zU$wm2p0o%mTGLBHUX|U)l69LBP`5EfB>Yr|ORXPwa7UnO!s72#mLMd0J$?cd3Ad%s zvj_g7k|rGzzZKCBFI{giqcg@RYmK#~l&&ggd_7AfkF!j%-+@ZeU4Q(?5Gq={0b>{$ z74|NV7T;2JEQ%Jf)2Dq-h!!8II#xuBAFMi7MT;1^X|gprB_ihfCA4+B!oD+rJx%Q7 zsn{g3-Co%tJoXk9adlQ+3Uvi(`#) z$lzL*-#@UeZP$^q?nt8>)_qQyf|bb@C)y;dCX;kgdaJ$N3&^Fcgc#`6*$ zOer~hGSKXeId}%}EXT77&nTW9c&^98ZP)kU;qvvj@Vtr#Gcuf!#K$S2>Cwp<+$Kg| z8mHjF8wSP&cyJEhK$4A{@o>W$wb#JWUE?cwzK7=*cnW{UPn(0Q_9W3PEy;y;eCpLH z{0N?AChjgop5w#Lgt%eeK|4;n5gvjv9Tan>GC}hwgDDuUyHyMkhQ5_PiV&_{aCJFD zks+us;Q@?7YbRXXFz;{}@*LuALgvQ|v_P~|$p=0_<^gF#)fU+VX;mQ!m^f@&^Y|z7 z&ukY!2>$?g8|1E0{0PWQ9V?lC9qtZ4!Ej@N$cVuFC`@0tOlvhQI1h*HQ*Kbb6;5Wg z&Nv{~1jD7P;WkJ(Y&bA6h7x%(D*~4; zMF)v8x(q?`8`Q~Q62A|37w~Trhxt{QnWhN8^UWOjw1z)SI04{Eu|(jjDOmG6%*@TVQ@0FvK{B4+CH+q$G?Wukt%^6OAP%z%59pUtW&Fwk+}p74_b_t84x!V!MCX_dzR z;0wN{6c&A!bShEQ`>NZnIB?=Su~kGSJ?n;I{x^;@y-WZ4Pk#J@_c6{xdbUvymFA*~ zVciW?(6*&LB@Q;kO&JF}r55O?T@fg5u7&e2l`iX@=b>>#0>)0}(K1 zJCBCty%)<@*cDfnwnKIKx^(4DH7`u{DnoR-Xb|WXkLNEw-3Fs_K5@KG1EbeU=j+-I zRNgG4tq=$&5VIe1c>iQ+2ApmRKXI%oq+xEa41-S1nXn$nbt&|%6sY`h{9vJ?E{89f zt|hbG7vR^s97+-IwaCn(LIip`ENe{T4C^k2JSvz>lJJGA6-Yn6w#~6l3L`lU%hbYj zWD-@mkbLen%ghj2&{H=D(^H*WVVFijCa zF_ZbeqsT5InSxy?HS~u>(EYF^@F@|q2<^HflhEWiY$18A&ZTiaECW|wk;oyd9qx5x z{GU&UWl$3?uLmrUdlJ|W$uQOqRS1I`-zC`$ILk?e5ajE_(j|t~ytcyefei+}e}yAc zJ2#+C9PNWqWPDc9s2HVg))~toS5fMogk-aR zz180~nIYz6HkgxQ%E{bOPY2N=SY@!vEhYw-tX_1|gp(Ci#z}ue31b+-F}%($P7jd^ z%n6MHDi6Bc7_%j%3>8@FiOxESgJ)_{e;KX#si-u{SXIrMl7-TGGL5*F04c?aW%=3= zn))Jea^RSRLy@bBEafCp_O?P8aUvU+8Dh;ROmS>=as17O9WI{+DN@!Bm7vs-jOl*D z-(3M_m}N+-a;CQ`#Z+eqn~VaqY^HlE0{hiSiu8jhQk|(PA$=6OsVXRxzc2F<(EI{L zT}>j$t9H;=?KNDBf;o*!&PwKu(ps5%&!c=vLaKfo1urQoPI~>s39#M=^5{T>N$^({ zd$0xs8L&zO{i?jQ90?Ea-r1@CS-xNiZwCbvi8C|BJYuv#5tLnVOa&4a#M9Gptba~v z)4Cn@88|~*Ylm#Xfp&<>BpQ!qKGcpy7_rQB8GyJ9W8lKdjbPGelIOZYheqx~e^%(o61GWs_xY={rJ0dPZIK-lB6s z6^o^cbrpoe`!TBi^PM%8GbVWB(r{Hj95Sv&y1B;fuaBGoBDFq}<+$E0N9A*Y8z3H9{J}R{CIo^+8 zKEP4d?k}?tKY%fnk5Y{GKn+)HI|In!?L{GN?wJ%@58pmd#?1uUr{G_#;%b=p1-NBM zlj`TZD9D0dip5NYyQ|61y^y~uzx+nuz~Q-sb%(`QhN778XX-VKgQu99HEP$zaA7;f zXF^30%)ep3{%|aE73)uyOHnG1(yAb|p)0!d(&Zw?ithPfhW#z9UW@9{?MOEP(_I5^ z#X(}9B?UGma;yp0%~H!n=TWfcx-PXuq+J=k6y!T&YMID)#?=xMow;vgOd+G`r;(T5 zbsRf$e4ZLgV>T`x&rI{+*v2vjk?xS_F4l*Ts8$(Oo7S0rvLtn3Nv^00tNToQXf1Y# z)B&ONP&*f3U91vtWkrF?rPgx05y#bt!%{j4>!^+L5mTj%WCc_O8u*=ztEm^)APoOZ z+~Y6eKg&AuCgu`exDw<`RU{J)Bwi7@nCzn(V1!Xkym;g`sNCt{8j-3as_Ka@H)YA? z8s-Nk_qvKoPy7)ob)08v=fsBk67-al?s`gf5 zDjKDmG7XwWg-iwX4OSsqR1$-_OjuygL$a;f3N8Yn>R|MEu=rc9Zmtc$aoBTT4GejE z+5--LFz7Wu2u?0oIyC2!A$f=YurY9I@F+9;8mgUYepwFsf~imm(_>$DI_zPUn$~ly zW{Sl2fq69FC-Hk*t;;3ZjgljHFGmgBIs9(x!y=%W$)bbE8h^%1JX~;A`I1m(jW!WU z;i~W~Psi9p&ailEk^W@5OCf;io-DsuhJ*by`Nhf=BBZ=rutsfzOU46mVXsfmOG7x3 zY8Yi{*HZsKfdDbv*AZ0NqKd2YkS4sI>up1L8(A+QsJ?}!OX0XIU+}6LSM<}-R6jmu zCWLITc8BDVcQ^DAHicbOUO*DhOnj*sF7I+i8f@eesU`|G^&mc_!7FWt9Y%?k`cFuq z{4^JwifvNyOwk8Z!%;m>4VQxQkk*vOz^!+VYQs3S?p*J9x?-<;19Av3~xIVoN1WqY@Fi6nRgYgKAKq|@0?{ChcbVbj}}LVGo5%h z4ezMoligFQUc4=7izXh*N0K;fA|Vh}J!q#yjn^51?nZnJ+=b$?10d?YDPMm(LfbND z>T3Gq%;|wlSJ@fLB-ra@nhx)FaA!Zg)PDO4v@7-rItA4eRjPf^sg6~(;8<16=4;@2 z?p30*#W!EG{bBqJ=VUt1#eB9$HFC*al6?nQtI0NG;37=M#Rv6xwBu4FQtNs4`%%Pi zA*aJ=ftClC{vG00UmWz8fnFVV8u*KZQ};gXX1ER=ERJ9pX8)Y$DlD6?6kj_cd*09h zhOuX)C#oaPJFtv_qvfb~)@9G-I1p8s4{AM2eMHy)z|Xj zWCJO+?)(zFBFilyo{*I1bwqOKgww-K78bF>L*XqWE*o9$oM4!cqFWWju8^SY!_~JB zCZ)V;@rXYOJ#{PBIx$q1`yt5H7U_jViJ<|`@`reE zq!zVAsrZ<3G*0osRTP-cOfYpaq0c?3UkML{t<0^lki5X-o^n;vcl#uL2>b2mY8$QdUU3M;lk z`$f~mYYKMHY{m6Q^y{$I>vx%wUjm?;bkb=2Zu?8LQXj2q>z8N(Ix&BF5SKMJQ1%VB7I0R z#1fOZb?EC6aq&1w8ezHp2fRGu|rX9nleq`6 z!{|poG;^kZB)UQ;6b|zi0acuVNFHM(xX6Qn*v5EvN#ycrB2Y+=3z1b3s$-Rm`d}RL zgAz-A+z5-GZVTh0Gr^00xNAkrCRv4bOKkSpl5e;+0D(}e6jRCL;)#;?q?No^gu;W_ z@CN?}OgZJ~{srtsSDHo^@yj_*ef}{u*kG#f>{*%STqcRMU(2*V$y;A2zg4RwQjTPR z8^Yd4iKUuufCh6vNz!nIWyWg>Bx7)QMJS99+<%IG4PjN>C_Uu8>c^(kYyAO1Y*7CM z9S!Tx^^^lips9{`c9c%UTFEXSyB~~m(=aK&X_!%YWyiV%d4G6;eMl)xY@IE4L10fqhnvFv<&Oy=J-b{FC zDzsAxg?38Q!)rV-=o(+Q*ZB70G--e)-489G+$paMfjA4II$|?GebDL0*8x8V&~(3z zU%3hl3fp~l8l?0-#?!|2Oo#h*`1jbwlTqn%`ir(joaxgqIG`6^#6$IV;H3u)c__Xk zqTnRjp%happNduAf>qPWS{etwU>DDEs5oh&!8>DxX7ju{;cIRC@~ZY=&{8l>g1($MUC%!np~C=xOXAiNoAYA9M08 z_?5Sa{)}{#vJia_A;GrmCjHc`j#hbeh9PaI(Cr~VN}rAJ8pN6l8b{zTVeT@*NH%oE!+CvIMrO!*S~;zoY_+1;D*NAQl9qIVe@!ght5I|)LQQI`4wjfdM>)MP7BNz#a2=DVF z6icj)ucCz9e^9>Vz71Mkd_n#WlCwjn1s&TXbOXQN$7u=R`+c020R8}R4gkc0s!KEN z{)EZI0+w=G?oXM@AW3Q}Nh(NkstP6>cZzI-<|NP&NiiLtP6{YUy4);32-&0yoXfh* zJ9LPEHw~EsLFu|UPi32vB&j?^Z=E@;M`8IM<}IQl=%?mQg#d%zyy>Pnr&1dPaT_zL zu3;zDC7;ElIS;MRbQJ3{nbag=c}$H`&Mfe(=B*Ov!yw1&`_>*@ED~{#2B%owc3qk_ zzwXU+c*npQKNySl*ikPB`%fLTN%c-&#%SzQ@ARQ(L3%)rf&E*AH){ZOp40^Y^XF1e z{12S7=v&=9SoY*>xkFO<*hMHk-KRhZk_9@9sg$S#HA>bo^)^UE)jZs%_`w>%lqkMX z#Z7kxGC1x?=J)pDozGOiiyaue0u#A&1(I6)8ED-e$f@L0+c7v1elU-|?v)xN)mwGf zOYM)MuMQjMAU|%?dJ8AUroXBA8X>&H7~55v%~Cega(b56dZaQv4<#M1m${!x6b_-# z@R4?}5AOO%Zvur8LWsgIfk$;HzWJLu@u6fyLh%jhy<_~ucRu9Df~AE09*zs)q-pf{ zcOz&rTExu``t)KKT*Fn@Y`Dg%u1vnnyLI-Lp!{N91X1U=3gFqaUqU~=NiF%IPE)S3 zlVNoO*+sIF?4>}NYO!&&&|{V-;g8p;*R^^5;F-19=5P!SFAJkj<^=$X3>p0$Kg*Z? z{m^T#iH2m=6-6NyXqtEWfLH*$%Ll~bPjFsU6CA!%=vChs^YvD!BI+nrAyYGp{F$r9 zcs>j1^gE<6=Qfxw%S_1h5TGJ-Td5!C9MNmPKfS6v${4KDH_%g59;3a?U)(5*or>Ir zcvpf>4_%!N#p~i-Vs&pI2D!#tQEZlX4j|0=aMKeh+bbmoEWH8+%`05l!zmx9at(aY z5J^^%;Q@GX+{8J@?W~)YcP%@tUg0QoIBawsAb!VEES2rxVR<+B7%i1?V7BKXlw-L) zG?WfNeKzh88E*j@WNfg!w=ksbUJAX98QY*~S1uQhHv#W$#Ok~EVc5Kl@W;C@kcb}M zCOEMq>-`-LH8*gy_lhuPNbpwV`N_1J(}*5Fl#vm z7R!a2vMs!pASuisrg@9+_NFsc_J&{T4og}K+sbZcqXfI1{s`420zBk5qhdk>8W|Xo;plJEk$Vr zH5B@|pJN$YdO@)ue(oVM-}r}<4m=}SMjKT(DMMAGy(zTvI8gL^Pl!<-17YP!+RZY3 zB#_CWiCuXQ+?+)cw>&w5zsl+ubksetIg{6{t9hEm-7y|_#~Pb(S&kr3VXgYA*fw<~ ztm;3}@=rsGylbK4rMzbyF|5828cSiQ+;csJTIFFa$H|bx zPZ{ks67LyCf60+OvF7e4o9`hgp66L6dgK*gFK+kizWhx4y|uKjlHR!0V4`lxHNm+knqFnqmnlq-(yn+d*WI5 zEX2cA;8Hg%=mmJ`FV>mhz{2}QFaSYN+iO+O#e~3zYm%IE^N$B!0QZ_!4hOKqU|^Z< z=?vtdRbZ$hMUDKfW-;x7EPfn$;C+;|NNb4cH13zQvci@3V3D5N`#2@eXkuoWuzklR zh`GBZT%kX1$IQ%=jEJWb`I0KIdX?X}a#@

z3nXPb>p^<4zNXVFgETC4EQK!Jr6Lx{T?)BzTG?I3jA9v&BHRPDGQQ3)BsGp0GAs9E|i^kR5Pf~*=H~mY8pkVkmk(tDf7{X7m z{(Judn#5Zs`3nO<<_#`4HFHTr3wDgbVJo_r7Tn*|94(&$Ilar^PU75cw7e2d_f#;g ze2p0$13z7em}q*Z!dD93KFLMj%jrGJUY*r=Sjv#S3+tujo((4cT32(O$^w;gRW;qy zzzm~%h9D#I83Dg{3LjAv=*HAL(`e}gY;QIa8MoCT++k}d;mE51_0h=7`=Su+WnQ8h zjkLkSn^mKccG}uDtVctSbPOTorz6tbv(QTHi4OlQodJKDvw}nvU<}E~ZSmDu2rl1l z(?`{v>mc{LD7QNTQ0s&1k%2KR!f59$aC&%WD>jVN2W-Ml=_+*oe7iGaNB46M?zI4L z*MmiGBm(D|pjMZnV`lpkl?R<(2lAj7=g65O?c(Bq`VxfVYa`MYISze9@=^4rNP5ntmPStT>7hHreskGOFgj)JrxVPbS{Bg0dO7zmBW|G z@FK09&}O|EjkuctsAB4WIrlLgd!TY*DWMbdQSbYZ=l@~tJ>VoOs{ZfZdwaTjdS-Ta z!p>~&A?$MLo*7|QU=<}P2&hOfu&972h&;;0>BT^A?}Ir33kn9zD5#*Qm=k7!%?iB#ln@O^-iUQhSYEdNRE@9Z&lP7`;5`_Dk(=;PLS@HPp}i{ZyepRp@lE%r2qWX&({dyJX{g-x?`# zdYiH>S)=Q+rIo9bGf2doYu%}_flN|(7wKp}?$dNt=JP&lu(sPEXlU9g+oD~DF{oP- zD!?|a2_n#;c>1~*WpHO$gJ*gUBCDZjgMEo1nGFM1CDv!BThG|?442mGbtx+1z&nPNypnnc$;ZpLB<(g4mNSqW7QujD^@f)M93&WV0<)=)6>-u zPrk?COV{Gb$4egzbYq4ausj9w6+b_f?^PXox0IWWhh@Fvfm`oUGnU#4=e|US-juUu zq?s^f`gj=aD-Y`^e3P4jtLYa0*l?6Ic7yH9e3)u(J&qP}zA{PvCs_Tvd^t|PMjNAA z(iOLHlB#)+?diy|F{wI+3`V0Dgi@Q&n`0tf0~0=98MPHG{v{b`3*UEJerJ(vF8&2i zt1_$~fFvAQzJpsKInCHchmyOsb^Xc}|yrGw)^+NgJQlwIY_!B;RxA+n^urE2Xk+K&bo@2@Utz7>(>G z^wpG?dqkD8o*q(4x>rcwrn9|&9_E3ADcbv# zMr}=(=vZiI6`MTUD3snKVwAf>ayr~Ao1=7DSL!wI0?}v_7gmt&`>kw@K5&r79#5AOmv24+2c~ewVHt62%glB=5FDas>W{P9CuSpz2(x#1!^i3O z$*oM^a{a*vl$Vc`mu2I-zju6}NHT2&B7=0NHs|TO)FNq78=up zSxB5-PTG{rcuYuczaKWnqgAW1a^G1}So29FpP-LuWHKyzsKSSg{t_{}^P$?FD@o`x z|E+kZAaeVxSj@G!*SSBvk&5;wZvYW~$s+X>RViagFAQYPF{IVbkiH^@q~I`?)>D=b zt1NNW>yWHUYq^gDX@D(g>x72uviC=<+%F*8+*}cs*{$u!{FyOs52l+_C& zzV}0@scshr=lIT8v@1*IC_rxNwg^5Pg3YBIhd3Qy5QyURZjubiP3uK7XOK~CG%y91 zclW~vs0XkJ>v$l1_~)V__Z&Z9a{h69%c6huR$dN#PS#?jGKe7k^Uy#bEEpnGutbDZA>>ZL14<+Uf`Yrma3@bzTIYwtBj15}G`{lSDe4{TYOC6S1-R zp0<*ia+k}~RuesdMcV58McZn;#?B9IrO@V?ptYt#xk4q5(t`4L76389pcrIrhc0wn~7W_qw~q81@4z& zW7_Y-@-die=T~Lzyke1dR^YsL-l5`l+WC%!?YyEk(bLYaT~a8p_F;@&Ow`c3E+*mJ z)WHxvixT>5@pU?_n(LWBj3WE&hADvGhsuGL!jt)N2+Iy$L9dzd&CBpXt>rWOi)J(H z+_Zrt=F}D!kuAFt&enlz!(7H)Hl{LVAz0Mum*)~CJ%>M? zh2ZrV%f;!*44woFGd2?Bt__b9yTite?Gh;2SRm@U2in)+f+xMzDCw7ju1$WUk)t=<+*Q6_0yWWS2=Asvn?&pJ5x2Q2L?FD<6qNy8c!bP3h_UB}7Wv>z%?u`gQUJBK>UZG-CL9YOU) zpsJm%)m_$G>w@a_5>yrJbJS&&=?l=Pc_T?>dr$3O6CQN5X-Yumeuldbr=Y1$3z%}e zl;e?I7Fn{f<_j;K`*|I422naotrT$`F19s+b(PYa;dy9XR6ki0*pBHCi=yPsLh27k zdu)!=zG+eYc^$^F-R8P~w7$pB#i~`769HB_K2F|BQcg(EXuluQTZ#$BK%MnlCYKR) zrjvfBeb$HeSs&Ub!k}hBqF;6y+2@2Ws+^|oW-TJIBGb*4r0kL6Z&(f;de#@k^j=j(I1%Ro?3;8tn2V`Z? z9Q`Ggp_{bvowdDl;){s1VYJ*<);yBI`u^b=-&ybMhCQ1jsD<`yHaaINjTAeYkJ6@z zGTzH!gW6vyHD9bUzJxz6aqsc zSkuvdi{K+0J%xCIZrsd{C-xMYr{d03*xiFpaXF#mJG;<|{)ZCamCqdcd{z0>P_yJZ zv~}QPoE96i-lJpsq=H`~aIjKro=9%qU$W?>u;Xf)UMw3xK-76D6!G4_#M#K@mVZ=O zMgE9Z!z@`?l3=s%S+CtO{dz} zYq+nHyiYS7I~x7Tm1H&&gKQ~)-&i&;24Qx>Q>wemvMAD<6br{wwy#sRpp6o{Q8ze` z0!**N4$Y38p`o&-^8VWn{X7HjChv znmepj(5GF9Bd1T>Wu89GG}Bi|1#l6F&KDShw}ysEe;vqTd?F>!8@hDakmorWhTXuA9nrs?A+6c;k-IvQ4+xi87m57qIve`)|CD_`Mp_61lF+s#3Cr z6ZgR~bCh*<$97Uz@CK=^qYw#8=_{eM?Vp}eK6CcR?2byFmEPzk@(W{6+x(h)e!z^* z2`UK&LqT%ZB4rZnV)h8zl9})dtN}Dd+|qBZNnEl789?P&NZ zW;%qZpc3CKdgk_`o@vUBdGkMBIdfjkx>T{bH`x!Cik0-Iq!jwg11QJ0t*)N~m=*Mvd|j_40OF37 zQXK{4(63EayoL)>7$-&9PZz#p^{M9Sv&IJNJS{P1K(@*Z{V&RT){>d<%3w4z)~IK_ zZAIu}o7k`Bp7Bppn4!jqxj$>}pzZCSqy*I*VRY^wwzsFh>vVaB)gyhkDgpa)DY>td zd3&yv6G&h)9F)vO~kDh+MBo^N2ke-0IejTB3KtZ>%L$gN?$eDe@j+uAxg*nw%|)Yi+~*HKL`$z~vlCfA4YhJLm1eWSq_$Rn3? zY^!|4lUEZB9eqOHLFjBLXAe(bL#UJw=!L3`s--i7JU%zWbq;Gct$$O)Cg$ohR(hW|21PA3U(KcPRE zT-77PyWPnhM%P8~OHD|QRA+ITuNUdqftt`(+^6X`c0EBk`5GB@B!;^~mg!H)(0IP* z!6<`Q4lb16?~i2Q70*b}<({ksMU25>rQE!YSvh?JMKBTl3=+~(_{`bQ_!@l|=(&wN z#-$qJf|9b8&~T2gn*2p;&HmJ%S~-kFLt8$Lcz3F7aceE6z+Qx8+F|o39%N5U*FuRk^1$|{!PEW+v>Fle#ssv%=-0Z6o0XP z{Vg(D*sp({_3NVE+AI7>dDNCJ?AL+U4TRcWh(;7?RPFHUvBQlJBLrkuIgp;w!`i9hKJG_ibwI`PDP z6ZxRpUQR-lmj2HD3yfT}^fe$GzbuWj&`S}ds?Dzww|TvY@(yBiXQT>OEO*LNEZhSf zerojI!$*lMINu3Y-Cm70gVxW2lkG5O);XC$tAAO)2gBC#*l1;Jw11@R@=SO-b~oP8 z9h@YYji}GfvB%8P#=2;@oZJS@M*A_ZAd1u}XmqY5d#qjA5%KyB_cz~79Y%Rkv_E|& zuHgYj<#XIoNw=Cq#;wX>kBZ+h@lWQg@^Cf1ip0Ff9k4kVuu29x5!9cl-X^_NgZ%HJ zUjPm>&2;N`Z}v_M_TY3FOphqvbfYRgZ`Kz4r*r0e+2smX0k_ZzL6%wg|^Wtk0e2pMvBgo8X}eCl3UAleKS!x%HPB z&XM5QV-t;G-8~;A$U&tyWw*}jEHCqL`X!O*YAVM;+Rc|zgOT#i6^~}uW~Aa@#uTXc z8yrD494=j~ZJg?GiJb2DnBnqhKV$BaQB1_cO-3UFAr_ZB0z?zW7(2eHNTY)zgBjLP zz#3{S1t_eEEsn&}Tt(u({7Q41$_6#a&kyjjLO<{cj7U>5sKdmmRwJk!qD1TdlS^WR8KNF#!M%$+E z&yRurGiUEI+2l{EICa)q@L;~ukrva<%qFO-$griMM|U^x(bo{I{t2;}n&@ zsR$>^{W}C=Cs!4Jp4_e^gi+rempz`Jk36X0{}!cO%w8y6sJ0flFi!qRTD;=w_ zQ_7y2XnP1r{hl&=EWPnIt|jtPS+I(B^>~i%de+jTph~q7=Bs}J&oVl{GP|}e14lR=8v=2iJeQ%gYmHs zVT1mu=N-}YoCnua0G+U8Pp0Co%FPVlfj`IH6vGc8gQKQ7PtzH0?CeVCJ>1PrHJb^P|^w+}y!7Sb?F>{IzZ zlb<;B%lKWwZ}S`Y6WG$raxCZNIrl4a?(=f)^KO0;#>N~Y{GrN~-NBcnANS(_1)gHqWf&27wT@BA>m@m9L86)m?Hd|Oo z>ul`y#GKUR9W&Vk^K#i~S2AJj4b$D}pvX>7qR81HFH-n5P#Xy_3-PWQ@c&@tR?fC~ zsX8y^wkTt_Hk9P7O1O?*2X zQr~hY@~m|Vb_2A{TG+fAN3#t-hCfMpz%3O~qU73#i(z(Q;{5F+7J(hP2<+j&P+Pu? zbTOazbSqJ^Q|TT}Sf$>)fH3q29u@?-_OZFNfLS??0oGq{UIe}l23mw6O%Yb2;|OIM zZN6B+$a&%uSckF2>_-O5+dsnaXq4G<{wR+2BZMFD+K&t#k-mLYKIBp6VNJJ{bh&%U z#(d`s;YRl=6}IyIljv`HU0(}aH2E)}TyEU6{6)KG#Wf4w*A!SSCU50$K4RWoI(}ly zMN@I9A@SK(rUM~8UZ+8e1#M6B?9PZAG?g6E^G@9gR+|r(dPYTuF&@Iv&$IC34!0w5a9prT=0C z@p=+Py@cV*8*yIPoQ&=KFi)AQNb65d-_3_8 z{mrKkhqgsnif~1(r;{PKW!TrQNg^mt_GfyM5RsmQBjm6&9`18z@-YTl=Uydbg!Bxh zRsXhE7OQsyFjZ`SH;TA7ir+rV z;v<(%Y-fgH^__H9o^ZZ!LJH8zlea@?ETiS4Oh-j44bA+_ODf;7jyvwjN67{%T7O_% zoTem#H# zpR7wbDEkd~va&y}Q})IYr11@cN;_Vtg5QWUBYqBilfa?iIq=N_W3~}4rfJ=RfA(tS z_Dx)_w|rYCug#hX$nIN&m3F*H*?n6HOn6)8z~2!#bb%cByNiQw6*v?whkcvCDqL@t zw*y|Er_%QT9C&J=()aOrx#!X74gyL$UaUg@0B2UZ9Qe+~!FLI)(uGF(A%3UP-MBn2 z$(|ao$o2Q9v_B%Cv;*Lp*4OEaE3>xF!LJAIeIq1`+*F}D$8nKTjnclP5A}SO6^Zp`bc`S3jf9`ya>&IOF(JI z%SH3w;ml~B1G8>{b%fgH;C~Q$uC{-~pV3@#D1tt^vDJ$3XMLUK^VI*c;os9d%WNLWorUIyPoTNR z7Mba@2+b$E?K?vI{)K4y-Zd3?4)ex)53 zs1E%&vpVF!Re?hta$w#v>FL6Q_?^%43{BYu zmV@&Y8*q)I(0_QgL^6UgDFxDh^wDcA)>+5&{f~H5nAhj=sCC((&B4W@93Bc0coeM` z1QpeJ@&1~dkQV8$i^s|FhehIOB_DY2lOfg$DqPy}O3`*4XGYr`cmnYHtXetvN}-4L z&4E_|uJw#rF50NhUhFhiV$fWlgtOm9b1r%cG=F3$8++VZz_j0oz|CB{2!H-iIMa6nA}?{*HDoDbM#K491RfZYUee(GuLE`S;<%XWhRPEp6$ zm;p4x_rMeQD0_>c4L9Fn#cm}8mUf_sTGQH7k-`wkf$NKd8;gUd76(rY9Oi^v+A{)s zP4XqVpTMDq^dF8+lS{(dffkP2;*as{QJ`ixN zKhL!e0&-w0km6uGp&y*pE#E1W?+`*tJ6@ymJp^Y)iyZi&i-Wn=vs1ntHm_~YE6Bru z%wD42csMSbZ~kvGagPKMWMX5=_bEt;N6xG75tN~{dwm~;>pzeiJN$p15R>m|L2iVIVF_UK&A*pDYW4qkaWPN!KxCAj zhkGm97^D^Xe9=D`kIDBX|6o)l-&gcWq_^P2E{59dUMHub7-)Y`?qd5x`t-FicebY` zKHy(}Zlle1J^0Ptqy)r#Jm&u9YA<#F;iKQj_l&JYa zc`za*y@>?9Y@_{E^KfOOJYO@<>Liip>*iUTpu29guQ$*7gb~tc-(ViBC>ru%VMKD6 zuT9B!qx%MuY58t)-(WH$AC@@6T$@6RrH^LlC(6=<&-*(@M z1Z7O4{T=sBB=?sOdlzA@N%oQNR`)fMedWVkquBg3RmNndc{Dw(ja@Dzp`g_^M$E+w z{84uwBb1LB%CT}{B+P|BB0mbT=5Ydj0uTMQSbz|PztaBAXQ2?QmeA~|S?!7QDc%KM zvOd*YN2Q6{;o%)K_KI7ge4Oq_+3F`|*Q)4N0ySEkzMhf-x5vO_s)zo^;BR(#=PfGk zDT?U}$?4K89T_G6#n;o;@e0$0$FdhH{7wCHJlRZsoLUPdlyye(RP{Y+mjX~X^s)zu zhV1E#RL3S%JptHIlyE_=rGrJ(W6&TP~fs$wOw>-7J?05f`*;0F(Ab$C; zyl?Nuw9A9p&oyEiUMQd*fS8(yvP#ICe1drG&qE@$#pqrGx*xCbch%Y3!mk}R<>`Q~ zkbD4i;L4|T4eHi%TIO&1Xxj9q;C@Wb{n(uQaqjMylD3?V@=2bi5@Y)(w@8V*FLO7K z2friJKDu=W$qqfs0 z*z*h8W{6ti6X_d(Y6CawH;bF(Op>?v+1QJX(8qFf&9!_+OXcwl#mb6yUgd8-p2X89 z@Moi&99cnUUuJWlzeo8n${4z7W-Qbar|P{W(P{rR>h#ZUopiZ0)!8lC->b9vGQz3R z6TL=8MP!P`G^h6EX>h`P1z%lxsg|*;l)QORI$P85wPxXKP12uQlc2b^=IGBgM}N0D zsQNlJjaB(XRT&L-b+pt!Nr84_XW~kRj9tAMsBkjD2OcY-fIih{yOTS+^^&<0^;(@g zC^XXym4d6%OiFNdIZx{JNu=c&=*Gv8fmuR*#rtfZZ0-vvwzEE~8@Ne7Ngf>Nb~WK- zaSAC7jTFcG)8Esl$mF+ttnZB{PbREC{UZQr=xv(`(y~S=6iB7ec>D-`Wb5a&vDl>H z+Y(|Lj~FS|tjHS)`>Mj`)G6KtHIlE2B$84Z8->-s^$CQhe^+O&iI&~)&@HggNuL6K z){{=fec)jo8Xie05csf@+?c3)W1(~!<_Z2z0p=DX^bCs3yavq?I$)V>S$pN9go(M5%^6C)wYG<)?*q=UIMiY!7 zK0cWHQ}#eIcXBplVXEWWno{#L>Xkl~KXlVcGTMW?zO4VSS(Y{L=>*SSYBG%!;}KBcDHXY>{^^A664SSbclDI1_ zpGy$uzrKaun|(=|EUsVqulAv$ar<)mg?E?Aw$XAnttuh?69c39L; zesVlq@=3o3q)$^H={G`$B0YfAXJ5yTn&HL8^bAnAZNnj1x|go2AFO`fAM}i-z^$TLgXxph+W$6B4U*4HJC7s!JC*^qD}vFg}X~1Uj<~ zw<@yTCW)<>W0dFM_v}MrT&oJNtttWKixgZasZa70AIX9wnNB$(Z*_9y?7sD3-{Y^T zoN>aPpA0xosc0<2U(ThjKH}r_b(y>Qbdf}P`JKUKYqQHm7A%v@L@O~O#CCI>Z7Lh> z!Z_unJdNnsGSLNT#w|52=GA>k)ROF7)Vr)H?i6?D*~O;Y1l2_Fh}?Am*+Ih!d3(<8gwp_RT>s= zGxKsbAx|@S6};e;6jHnZQC)&PgYEtdhps_wFxb6IZB^1eM}>;|nIX5HNk!>virAXN zJy04iH$O!-$$?BPI`exF-@%Bp!D!roV5X^?`0me_j}9nvh@86_ zxxBis+Yy^h5p^qnWJWPb5$c(QqP_v@LB!-`SFV{%xQlCg3|t$S>JsCfS|$RG1La3RZJ1-aK2yU}4jl(C-v4yCvggM|RTGD;x9E z+>;$u^7vmQe1nZQAFEZ-ytXVk1S+yApROW@n_|0qELZmCvsJ?9sDu_bE*wXh2CSZX z=7TAJ&xEDFNz(gJLrqs)Q=8Zb>F*LDpXP#E->X`GPIUA)V+Sq$?A;5S1~nffoJ7us z-93u(6Ur3Rhh9RN^p6cJ2ok6JBH#3kJNote)rYi_Yd%+1I!9HC{ZR~)kJa}tBslh$ zG~~U=ybmHV8)QBd?CA|SRJiu;Erw$cYA6cFG#C)7hxqT1(Rf|*P@^%X3068i#F4%h zhQByX0-ezl6qZ{2BL+?R7}u-A~V5jJW`7t?HsyxT-x=)n~}L@R6Ph&;}= zE+ZB5a?u8%XJ=j~a5M8dud%m86qg$vAg%HD(<$+CtEb)#X;lzqICncn4pZOfAnOD&TfE*mO(|W4&t|+*x&~+ZO#bL3{^hiKvn>KKciE6K9;m&| z5ldSyrZA>fB`gVTOg#{j9-VH@jihxUmrDBIBx0-cbuKn*O0{V&TOTm^r(H`1b(RE0Utn~jnOYLvX5gu}$X zzhtfWsK8hG=2{a<8+DoLsuSZzDR_8afgt46Gr(OA?4^Hq@K$$Lay&nZPY=G zr^ya%MF+OL1DgQm)Ln@yP!!_@ zsPr#Y>FGn|0)yP$TZ{T;~|MI6rhT?4xU%Am{+K&Z>h2_(gTR#-M9X!R= zufKNi%yT!hBa5m7`wpGrm3i>g5GMYb^sL@>y$`(z7ekL87f!5{r{<2>K%G8M`j7W8X88)E1+w&v}((t%T-=}6@Ddt zus);aAm63@6h6vtoZl*bYx(V(`?2&XG$vQp*VI?nSJl_n*VWh8YyI_FwO$*j*9Pmg zA=NiZpG~rEpGpMr7TF4*zo1{-9OUMQA~Dm-Rc2r*@_FXTgWMM=CmFxg7-(N5CmsSBR3 zE*O&DT}gkYvpx;$#4CsZ!uD9UXlD75r+1GPR_PSyw>wUFRf0 zK58j;mdg&p>aV6AE9j8930Q0NcX!IJsfn$|=CwdnrpQiZtTi66R3b@G>cv~%Mc>09 z{wff45lKo%)8!an#9!8ShW2b?Tf3uDAdmNDdAPSDfq7fUcDLU;>)%SUT3Tl*GPPVt zkaD^`gvu>0|c-lVa?tZ%B+sQK9|@TaPT1J&jAP=Xe*b&hQAl0MpiZhLkxWHg3Om_2LkLvOWO?strZSv%s zk>tiWi*=kJJQ(>@7GWKTfHoC`rUk4$RnQ?cxTbC)9)G1VRNs7 zcSp%Z^d@_;*2ln2#MxDSf$oo{fV&>fKH59QQV!k17d-D7=D?4W4p%{FX5^|-Q{4Jl z?CL)EuS}9ow9klrm&}~t{+Xj2bLJ|}9A@9r%mMbT&K%n~-dqzQ&e+WE?w?uPaGW(W zV+N_ugv*0wh8w$=QLNcZ5+<0)^A7S&-bvAPR_1bjvo34x!&Qn-p7+F zo7Tprs~9ZWhf}^Yl}i6!!9u-Mc3X9}*qLLhyhOS-p`#!#wZ8`|u(N^c-#*@5e?~Yo z9gOT~Mq;7KTZtT}m+=?HHIKMxFi>dq5#!yTpscWR%36|+JWeA%yc(*}g|8TV2g!H# zG1OZFwd@aVvP5KNm#)W7PV;)q-b7q(5m}Jg8j|s<6OT3~xkA%Q1zwqX%Zk$PpE#|8 zm1tbqNy^SK$-c&F4n?4Q(PGV)3qs0HIQMf*@+h=SqDh=;m$IV+j0+e?6gKqqGdrfo z0V1Bvs;$^(6Hg!SkIY}dx6B7^Ce<)07W9(@^do*J@!Pz&qptB+i6q{z(zf3)?yJI& z#15WG`FrTh)9jk!cq>5>x1J@RrhH{@^va4&**>3Bq8^*%GZfWU7#`asuZObJ#o7ou zuVIG)lw6d2P8ALG(-c8uNkME-dM1#}5k)HkFIONpR<7}6P+*BO6Yy~b&>`5Uyv`wy z5kxP1eMPyW{wgP5P)Jl;7b2H)NizX1Qp&hnK!!{5CE{l@o%h$i!W5L-NZZKpKx82y ztCOl!Oj%*;w=-$ziAj1g1TD&>^nktA0MrPDK zipuOgD9qHLYf2;bSLAYOCxO<1s$U( z={k(rU(_$98H~)V;jfa!((OS-e~G|)iq9|N>Byv=^QmSa;T>y2Mi3ak1fJr2M0cos zgWSAri-pG%Ke002EG{6miypcqj;{1^6%5-i6ugvP48gK1e^AS;i-KOphB{Tbgz)5R zSyddL$4|G1bGS>x3Fcz*brnE2=w5Fn(H;PkN?}jRu`EiyLdIt^xYwYysYENZ9V+Gx zL)3)J*Gj1#DCN)u%dg6gw=fc(sXvyakrKq&yX$%{^|7R_e~XtRI}f~RkC6A}Zy}xK z-2a<=nUXAD0>y5koSpJ={jwJ_xxtEWvd_t+Ul$z%+k(N)>{j8N@L?_#o5YtR@-0bNWT~W= zKSv%qq@J^A(TQ$D?5%NriNDr51b?`h_9*SWXzYONoxNB0moCx-)pTf^7AO$W+q)1?(|M!SDh zJI03S!shFbYDareRC`R|mWelI+2KBJ;UA{siIZDsUgrCojB>W^94FsYlbd|9SHR=F zl=S^{$El^f^!))1%~vzpjt6>82K`_cTB?6I4(L(sxY!~j-y+dCphvYw$EhM16lS0? zIN8aoF+#^HrLWO|{x;Eq+DTb*hC%exWXrsu@%nX=sWM0;#BgDpjT#>@1b$6LenF2j{GagGkFmbp2#%d-%t5lz9_owYk5x0*!86<&$u>O(P|hCx)(>;Wde4mr(G3A zyW7{A-D10c+!{&pwkT~EO4<8lQ=|`2Z6i&#c&aT^Sf9qp0iw3CA1miG;V0aiLOZk` zMuC#=s~yZK!x>I*e~XIX2&cEV;=9lx;q*4~HJA!t<%^(l4UD8(Y8_5mwbN#}`_!D4 zY^ikw&=q?ND3{T`)H<>Qlq&!q-T}&GKob8TiF3u*(SW8n+-r{H4oXbehX~^ZhhsxT zcUillDm8h2W0i1J~g@QTB6A&R@QygopnodIq=f^a*vom@&|O_%NN$i~QUahpPR zj!!b0?dAjT>%+yC&T)4c8y&+!NTQg$34l}(T;PI?{bu>FYH;6M@NHzMTbu8}cYj*d16%A= zSI^fn7PXDATbBXQTx*ATb)ipe4-%)p5vAv1j&A=F1L-EqCys8%$!e@@is_#e=;`lC z`pDp<|3i|~-3KVXNpmZ6PBa*86O?F2dD9QFaxE6`?f*f%2Kmh@KU;!DE1Q@m zFsSCREji2RP?|d#y1BEhD%R(?8kH6Ebh#MWqsfr(AJRL>KC)ZkPM!K>r&8EN9;$sx zx?cO@blFI=9954KubBK9LZCN6cY)>{(oF5fZWiBh{@G)-&0X;gl(#c&RqfsC^717& zMw;VZAjlOIK79v&%%l(lsWRxvUr2RowJsW0OAYmpS1#-C%}aUAeV?NFHDgFz#pJJ@ zvdH((oX^vdaTO^I7xPJZvrUcq7Y2Q2CtlqA3GQ>C_ZoQI1$?m=7+z^*62BOqI~_t_ z#;R{_&K)eL-$`A#M(5!?e)BGz1KbNCA%2tO?@I?^TO@yAnJ`cz<8= z2l5*&-mym}qYsx6?Y>A-SAjD9?mGsDQT^jZ{;Ga&j2m|8OiPy2&$u=0_;x|kP~qBW zEMcavPVXL>`Q-HK$jm3FMT@<)sp)z+~7a$4Gmj;ihv zp8KJH+I`H-fp$wx<516d@<)(()6&Y^uhsJoq7?=k`&Z_83pVpjSLP<7j;~gko9_CC z7i3(S<7EYpn)L(Tg$?B6HBHGX$5I9s{liYAQu25DNIi`Dxt)ssK1iaA#!;`8=LX9m zL1zHvx%B|LP%E?t(RY;om86eWpZD91ktF{hebgysbOPe4a}QL4%3`n*-T^IPQFy+j zUOfagzWx1#y^&6dfWyYMclTqhyNjY0XPWEC=T68B}0+%}K>%rzkGRzvPg-BYBIRN}X4~U(^zMDg7WN9fQ&SyyI;hV6+&QE0@wZDkr2bI_XDg17k*2tcgOI z?dmD5Fh62z&6TrPg)(bP4K>wp^9aUKoUovQv50%8tYE5hAEp?ofU>yS1yNqqF7JSH zOXis8&q|P~tA^lvH;zC)-(-?9yLt_;l8YL0I@CCAmwVPvm_zSyR)PRp9ZO)*)pNy5 z>a$VnZc+Ik)K5}^JaPI@`Ldv$JwgA<2eHwXi?u|)ES5|*I-Xdb!$MZF_(*SM??JZ7 zmboCY-NV+2Ay9p_HCBDKUn$({n~f4K*m8w)C+U7AjZD$W*{w6PdYOTztuwR)#yr5= zMDG+?TG&IBoYE-bZevfysan4*h!A$cd0R#Hf=`ml@OXERss7?9(Gv-h20lr%23aT& zwW=zi5S|nT&*+?S;)*_9;Bo~`(*7}S8#j+3Wwzpnn-2w9<*V~;-$O9&X}P&Zksaub zIHyL?0JiSMpX{xWUpW?51En?+Suvg(B+{(B+|ZW2DIFCKArH3q8Jkf{DYH)76Qro6 zqzB6CsEz5BjES`O|(uyi>ajw~JjXydzmg%;tR@l)l|g_e=5^%JsBVF=aQ z6E-cyvOsw{k(6NrRG1T^u^Vk#jfGoc7RX zb;Zslk_hf-%**qCN)Y8iby`Nw($}ECH(7hE+8E-^ackZLy$8DDMlvHJ{Jd1ZxhKip z7nCu!`R#Q7}EQJsy)ZL-`={k11<+IxNmwSQVFjRWTgOgMZGo>Z}S-DGfTl>OaEp=@DM z?TH52*gzu4)B3>W9LUhJ#pr<2sQ_Pv4tboJ6$?rU5tLBv@t!K|eBaD7NF!I04K!@> zDCkkaTqw&tE7!&-nIhbGaA&XUgoknz3s0vU2dho9ijx9wWyF(3X^?nx8k7VZ3?F#O> z8p~Wbo;(Qf^s-p{-4Dc>Y*r-HIr|v8(e{ntKSXtklYN0MFT^deETm_&zm2IVszb$R zm&zAQLaP1KcU@5~ngk#5WvA1wU0q&iJR)l9mQ`GbM0QUeuFdYkAmvNq?N?JLrutRx z9qHS-g5Jp#Za3Ka1YW*)_O8nEg6n!qx7=*Z3D=z5)A8!>xY=V1r^QZC$tSKEmw z4rt-x4J?nC?YHzphZ}jx!+Dp=-LEz_YwRx5rlnRyDO!RB7ciG*e_FpfZfW*$$#@Wp zAFZqP#0CPRhe%`!^Ej*-3JewgZ*+7UUEj>>i{j^vRg0@ zSN$cS%HUOV9o^1mrvAA01fR&b9rs90Xg)QY9D%{BwN=sVs*f-l%3ufm!$>I}@3XAp zS|iMa(l)Y^@de0ov@!=$l9*m;=|*-Fu(h>^*rSSm-eu6ux8mdwVnlt(L-=u(yHwWL6*g(Iy@lGKn~3$)@u`Op}+hV<_Imhx-tTH1OdAR}hIwDoSe zrHQd~st(P+O)9&(hg-U)r?&$+bRKzZdo`5Oc4O=g%CKo%CNJ#(-;?{Pjh-U7?&n-l zk2(Er#K5&NxFWlIm*Q)ul}n804n|lH^^9wecPu8Kp}02Xp3p(R4F2praqWqngs!A! z^l7mVutQW0(#N5P*_);g3CP}ssaS8@^_iH> zb?B!xV1w@?)GmfNJswRoKfxH)k%dq4Em@q9jDvJ-q$Om3(@%lL1(VnE@ie0XY`gHt zPMQIOJJCE|Dg89KXCqR}-eC<^Qs+`LQ-V(qmD37zF4~b6%xtzG7v1m6zQS<+2A3=x zwJ`0y^Jym!r-E>Ntr+4?!s30s34bjltbRXDx{p%2XS2&88!GlJkb+@=SxE=O#nuM( znCN^(W^}&Xaa`1sv^-RJlu=hU)~_YabLpmW@>pP8WZ#!O3J2l^tMFrmW^6uAKLbIc zmeOFY@j_Bewh)Sm7w{&cxlPQ+18V;_IB{}}Qo#y8PCo|*H%Kc_n;kH3iqp>n+%R3* zXsM?tz=3@M7)y;f{UVO!MDRJIA31m^O0QEeozk>vz?qP%*zBeZhc0}5q~XM4y7U`L zY5y>R63QrL`5KO5@<@`lsUB78*B1%0YuMxTdIhcOiNzK+z~)V&dML0_>M^7U;2Vm; zJ(J0C?q@4AD85vlCx`Oz*u$ZOPlcCmq7*F)YibfDyJbtjC)sZ*AT90K|a}S2UM3!#CUQ3k}RlYhp*PeD@gY61zGz;%V9B1QM6-ye!^dbq%X2%ymn_cL1f|)t?eG34m8X7gM3*zE$wG zf`|TZ(nKk}4Y=C?9zuCc&amOp5jJ*5y{0qxsM^_}sJh7EL%pw9K@P~v8@C`}Xziu8 zIFEh*z<2qQtSQ2yYCcT;bv7Stn6K-;gV5>yowdPklbB5A zdhJGGug80v92uqGBTAHhpTFrH{81n2D{NtYJWg~?PEu2eR~)U<*a$co7tF;+`@#~B z#+D`~ic0eb{8_%lv>}>xa>d5O^$|}ZG1DQ*dyspjHyZBn6YrlcZI%WwkXDqbW#tX2 zR7z`3x;d3H$t;QBDQpJZNtVV_mSHBL-W#9&62xcTM;S}*B5WE3`%3}XW{KX#KxrKf zSF9$Dp{SDn5Tww}rHF~sy8$p6NHyh8aO}!$&Aj@1Y5JoMYO{N_e;}F4UhjXZ^zDW!c(E%eNB4-AkQA*ps{6la;YXoyLxF zN7_)_F^nDcEk?ZF#=s6&wXc@Ok{^T6VMV3%Co21R@!Q1)jKop?i)v|&}v2sl34 zXKxs&%K7o1tLR;o(NeC4j8CuMLkfF7-TT@BQTkJIj8CGBDyHTntxe9gImtvY>t0W# zJTO=ZnrQy93py?HS?1w12tc953I_cUNZ)`-lm z=P|}RBve*Q9ieh>3bl+Mm#W7mRVGidB6&GBMKPU!o`mTb&7V=fb20M?>|NnufY3cNz@ig^e^hSlp8C|Up`;$9bm#oFq%1;MN#EQDz z*$uAzWuM#W7sUdNUpQWAxCFjpctve;pF{Z@LniG|!lqlG~TafxB; zZG;TMD{>+BZcDuNT0%G!n-8&9T;i=iC&UZ_@?rKQOT6_H3hR@8;XMpJ&r7~s`u4y} zy!Dg9#1x>Eek6z4Q~J*kfOP_zVGKMmG0dle1R|?gxB8rlhbwj5(s+#aV-jf&%oM{L zLR`-<+&?_vmXd?RRbKabHmH1_%P04uPq1Aa=3W@I5VKz;S+{Z>9g2pBa`}%g9bW2h z$t(jdA!Bs;@G^G{kB^Qt)(vA6xqNuURxe=~OD8fs0#_Xw9vNQl%aQL6FC&YqRK?NZ zQ9ERUWex`K)pM3b0bnvWZXFa)OlAr(#)ikz!vW@EIKZTT0xgCKW8MXGk5hb%!ubBR z+Z~4a`vnlhi_4vnE;V(gYW4T|Q?*W1gzDLos6A7)^Um?YUWYmF6hHqJJ(zi!;jQx| zJ{6xK#?-^|sy@{+{W$ZqY~|6ejZd_Av`>@TG|PLcuE&XOI<>i!ClRw_ysYrWG_#37 zGKMxzLcx7@v=g^|W%&Q2e2zp6(o|_iyc;TdGN^0Q?J;wcWq2^%&vMM(q-45cq?onS zVq4*2gunSNLFiP>JTfdHf%OPLaok~K#yXe^(TEXD{h+uz@IaKIRN}61DNB? zsPzv3n0DCL?)yO@@K+&$tT0Q?902~A0n7p5?-{@xm^Ufeb>qqRQQvXxYvzxWI{>sT z&kSi|9@4~ONGs6~t zTNwy-LLd}?MbXxKVqLWLd9*{a)N0Ee@5D}WwdHxlEZfQX*-rLko256&g2LLdlOB+K zdWU(&ljp)elH1kdr-Ymh6er*7GPS`>A1Au6Ce z>XD&ZKnsCVr)BjrSe^zatb7E6|C>nBeME{VR(ITVNXUWO`IQBfuR#Zu zrOKMP2smD!>tw8aXo6vV z`r5*Q?PsO3z=^hwNzRWlZct*5C~#k_HI+pAZ5BtimOY;GX?+p3gurbA_T?J5&rl(b zyc&8Ysxa7;bF_VezxHy^bzn8`r6%VJWbpLS)Srqey;6N6#x`7U!2>{Fjr<%Z?@uXh zj37d4JoWq~CG$&?Ns;~=8@VOd>H?uxl8UCtRr)?Q*0T$&mfHeTDT5NaI$*5{ST{J9 zz+f2^tn~`jtZfeLc=Rf4;q>%WMareI>wl1jaC*`Z!1|Obs6J&CeF=k!K9$v5`zpEKq8HDh zl`y06c1Da{;TVBnG>SpHeKLnj%o;JRgDIu-dUY`B8lx{kLbHESOE~Idh8rc{RX@lM zCM36t@Y@s=ZQqT**1>+Dp7CpSFo6u7K8|Kl+5@bN=`Z$=ZpO_xrBKK_9w(n6u5WYj4V5g@aY zlc#GXXF*zh$$-v-v<&OS%BPu@<>quSD!KE3zjs_ayBfKTkomHMSvDua4ELdeN-a0L!?PIRH#$ z0CNDC&H&~(AZqOiAlVX_6>AOoIeHg0|DbH;a~Ok0`*f?R^NHeP#`~(Jv#+FM%h1g>0cs87hi&bje1f$cqEp($(BS+>e<|r}LgVDPblM_M@?#hWL zt6y56&z$H;B#jB1?r*#Qx;X_pCHlIQa9EVwOnb5km~2p>-9r}HzUh-lFPOSm1TIi8 zom09<_Y9lh-H`npJ^9gdLoZ~M|%+Q17v$NA?%fhT~02zi@D?7A1Mipw-8M*OjFvZX+WIJoG4by{& zPXebGk&nqMX#9MQnY;#&uQ3@0^1%G9{U&D0bEQh*tVZ8lm5(>>c}Gf##$F|(D|s#0 z^Nrpyh_HE`e#L*fg3L2?fKOdy)p&B32p|oY`{U$?0NU1nGNg%lNNBhgBCVW*Nt1AtEdS_pp(A_Fvq33P*|@YN43-ZE$9{g{PT*oBG5eyjd(hhYw^qh zK*w3$3_`mhliH!jIl*NS~!R3k^n2kxIG-LfqG09*&G0l%>d>& zEUK;V6g)#YE<-T~sZKb`inakr0${H(&!jL z`AZ*P>5&Caqg1Dg?p(D^?tZ8@O7)bBO+l$%QqbP`1F+e>lIe^)&CX=`6|Tr*i>o@l z+Fwoxx2YS5R~D|;sxjE{p01&LEl0>~%s+rUkFlt~0i9ZDcaK|jAo805u>ug)ELcEj?O$`W98g;%lBf4ch7bT3%vc^IYd;HN)kpv!a}8CpBEqd?h*Pwm;`- z_Rc`(JfPM*Mi=Un7k+(q@79N#+(~8ml9IiOkk#w5o_gI9>ZO~Px$5?RRj(^4$5X9d zn=iph)pS4WB2{}9Pw0@cZ^dpp-F;Il-6++pC1SHrHRq~#ARu4Rh!!23A(mJo7dPjDjk4$p4W}A^Q-Zbkx z7I+)5l;|w*u%zv{tvE8<^TpomcM$iPPb0JcAz4H$3BBQBD3#qz?{%aZGjzWw)XfQ! zcM^zv`d&gjmRpr#p>q&zr13#=`7W#}aCNn-h!6BcBtbVKrOZ_Qqf)~@qHcSzQXD7 zgW8B|H~&e)bM?f_Dd)s^b0@y^U;HV}T?}O9L>}^XAgg*HR|8qy1L5$@S!;SAyf|~# z+8)S_K-Tp@?f|mB2XYUPT7M7dF9KD2K*fGQ13e%NoX)BZ_JAe@8tMVf2(+}Pz7G&b6*S9;W?5wuzM&xO>?sKe7ktq@4S&Fw~dI-EM4)F zCQ|NlT%&e$Lshf=>4(*MVtnU(>;|i6I`bq`m^26|Zl=_@lsuwEWO`pW1K&?^E+-w^S<0Ma*r&JQ4cbuOKV7X*;LX~jT0 z0!ZJGnPhV`ld(l>xE4j_Hg0mHf^fb>lV4fN^&(l;dk zngG(*%Eje!6Z;Lt=y{(H=z^!6vA5k@AWuB8<<3jlcd(G$ZRmjG%ewJikdG%%C!Tq_ z7lqG@_riQUc{=gTbD!~El#eG*C!TrkGv15y@#N{mGtc~Zr+BBz)w`GuK~`xK)Z2LE zXsNsl@pNGg_XH83F4&U*3lK}d0*WcJoh2|2FJ&#@38=&NB(OY`zygZta45k%ymZ7$ zKuOhSDCuaxGjF%1#dK`(0GZEH0uoR^%q3vn#S)ko5E3{lYN_-2owmjFJk_@cCaYXB z0;XXxAFm7R;%ThR$LqoZ9<)~vUzBtf&?VhGyg)h<(9m5p0So9RFb}Uwdmlr|@8Dyi zq;{B-xT-w{d5UtwGs7mWy{_l7-J1;yZX|ZOh9Pn-q(RgQv%6a+&mZBQYrzo4p4f6)W5z_5z;=Eul{+ON=#`d1>NKk zG9W)Id_L{9i>IBgS0Sg{&N48 zbP}8m)$zUVt<)zAlZApIjTW1`0LKn=V3^BVI6uv$THMi693N&T=)}1j8*IxS3HUPV zU=px7<{V&(5!*2Hy)w7?p#?fyRGeJS6d%R5MJ27bWoem%v@QprM$i`#em6)JJd(K$ z3f2_?OWzKbd4y#Su-*}{^zC4oM_A^#CThJ?Sm@IAwKqY03&3+0FnMCO*`q!yeZVtB zbB{<-h0{siQtJSlP1=K9AVE!W|8^Y8OyB!d+$%6B?&ZuY?%9eKr6#2sb)~Q@_d1}U z7dB#cP-Tv1`r|IDnd6xX*-+V&dI1Az>%DYUwQM3YDQVB2A93WVs5U6Jg=uQrv7AC! z+a9mBofX+;&q13rtv_nx1f9wf*2AUr*C<;y3?f0^3PNHt1ejZaDl} zp0EZ{j78rLo;+O5wS6}_QCpr6t`(|z$J>?>J?UD-Q?1N#0h?-{7rs$9`G%I}EdjPC ztcv_(*8!+7w?Ae`+5T7$ z(yDpcVF7NNXgx@)=OM9;wh(E}JR~f@7b2~lhlBq4rnpdUaoJb0xgO?Gu4ajw} z(iiEU(|58!4>@W2L78t-z8NR=q#lksX?oIq6DM(hg*CzIlQ1DO*D4);4Mr0m=+LmQ zpnam$WUJqiZ`dYEo|7?6o7$!}d#R>6W)#AWw*P^@M%8bMsvAXBfefBL397;tn?K|3 z&J6=?#n9p7HO#rPbL^2>c#+r;77<-MpjYs4xnr!ba?0fnhRSb9-uQ6BZHhi?zs+hX z+ttqAyraj#7sWRL>R2;OSGWv6?$vbXElG%`-SuY<+F7CqE#*83u#` zLvNNd^yY6Vl*vmBAwR>pKghcpu*$km0N5tU+xZSWg#k{MNuagq5{gJVj84^f0E<+{HiW!*oIv^v-Q1z(+Y{~n~A zWNJuRm&haKd$!=6o^43bOy7C^u>%T(=t0#~)+Mi@3Y13;7V(6?CdGXzZNUV@Vrb$7Ry8r5R*w( z+F0IB)r<0V&CfC#ugz#|4v21gV!rFM0CNDSWdL*BfI>p3u8fw+`j@*(lelv+R$Ix^ z_*o)ZE|Xbe<{))xsq1g@@3g5M1W9gXM6i4ArSi|j@#qPnZM!OAD`kGkF6iP*c7a^Z4^`74;mKlx%jq% zC%ythd^z*+JIi`u)aScnlXpseggfpr+S%A@40R|STZEI`RIG@)eH ztCk83P2W6Ec7Hw{c(Q=DX6Q274ro!-o(a@ZyA!DVnD?4dDpSM?x-tF9y2}H5p!KW6 z0#wZ@zVk;05~xbR7)`|)lXYKbG+Yhp48|PvLM~}_fH?qg8K(ox0jY(VYYp>;N?9Th zN#C`(+0Ff7#_d7M37m$M37kDhxyjU!vdOduDJLcxQYI$mk+_GdqvH^~md!+l1nbjx zlFf|5JRz(Xp07x6B?7sgIf+l!8FdFa%=3NFavh?5HtnQ0d(#$F<=B#?P!&*1kRNke3@NH$KoIn8xW{Hnlo ze)VJa)2#Qx{AAlS_an{TT%J`GJJczT9Hjd1%zc)1Y?KZmS(};7k>3^iS$7sFwk?!V z^w1359FQA(kB1ceU$pHZgeG;?j7+=kY2aa{sdwcy6(0tIA3Tf_JuENS!#Xfcy>WAj zC~c)AMG2P^8Y9;?$H;x6FdqIaM+!?z;pG)2uy5rlg_6D$o7$L0AEW&> z*{41eJ%YiiQ83aZqUD2qsLUja^4_nkq~4Za^9Ysx~72wH@B|JZ02w=oX)DO16mYS<9i+|pgbx9 z+Tz=DqStxQYfkh!0zz=_L1NE7qpb@sVDPZ5-@DdBNA{MqY_Rv_ zwc7qtc7ZN;Iy;Gf%j}qTPMBqPC#x}LZz$FF40-rv%-PH;@@Zy0RHLET79DJ6oydv& zQd37E$=Wtu10m{XAV|Ba5ye8b(lF=4($pdjW(;DHU>xh zZi;kq+oBTBzJO<_6yW=5-01WR9iii=<0gA6V4(x~Y*r!Acnv&Nw(0Cpb7plD(1FHM z_Gs__{}_7@z$mKs`}@w!X0sd86H*|MgalYh0wna_1OlN;gn)p8O4C3>4+)_~DGEWv zfPkO~(gdZ66p<#10wO3XA}C@*L`4xrea~~|?h@4B_x(pXdq4MiZk;=Q<_MZum0vcRJXn8k>bI25vHjLMlQYji{Or007%>qlloy_qq9hzGn83?Sk`Zv+E~ zc*q;UKxMmpIcdm)A=bWa2{$3`t{FhYSc!NL15N@sypbQzRn(&(S1j=0uXsoR9`eJQ zGKqMM6HnQwGJuHj-UtQ|F~J+b03yan1b!!a4Gf^V!w`Y_v*j)VXw+?jvrx@|7)dut zf;fH3$1mOhnIgYtUMAidiS*!JgPi;~_9=J@xicuCvSigR#8M&RnpsmtXAbnYtEseZpqp3@C3I z;8|p69$p9zD3U0~d$5s}*Gd~B7Eh;00;klg5CN%|{N`-*-gB~Z_SUOHnR;dYqh8}! zFXn=J$#2!2?ZFucmgrBmqXcm2;0SNA6=_t`7d;y-t{= zw(^_vz@5FQ#|ZXv(u*loO|x(o+*q(v3T`F^OBCZhqoiQDIEB*svNUgBk7t`$7TP4g zW!ofd78ZN6_Lr=iOV$#_c+bOjn_Adyk_4Dy+{~YXfYe@o%N%psZ|~l3$5%}WmP-cW zVtRO?;59RUnocOcIajb%u%B1r;>Tf?44#-W%jn)R%SfI_o51!k6SPNu%eF_@EPNEo zu5w9xT1tB)it(OD*d8-)JZu;|l7fS$2mxu3{N~8JSY_(v9X!>`RO}X8vTD~$u zWXp*#)?-J3Y%~$Z8s#XE4JU4Qwnf_uMk9=^q<%^G9pqHA(Bb(|a^#xLw`%Yx- zZK}Rdg2?0Ij^lENs*buAq3`ZU>gOkuc>Bq7mXf?`Ku>QLSyqV3KZ@?a&)c%=8Y9c$ zC3xoHs}BK%b5JXGaXIN?R5YMSq8RTPBVCL&ah#+%uB+)RYzHsg#VwrcO&cg_+e=!B zV!Q{>pfT;iJJaG-Nv56WO&cU>J4jlIDirbLN!o65V2Lj%OUv<_E^ip3?ect93Vw0B z3G;zV_gV3EB=~p;PEiytWhk6CsITyE9sV``9D*yg%r&Z@IXoNh zk|PhHRm|6 zmqdUwrXOEdM=FU{H6?ec%kAe9W0YCJ&eEITWZ$J1cJ}SXTp&xi<|Doyl>U&{Ti7o( zv30ZGD-AjlThA=ZFAP3-gq$|2m1k&?RB{$(&i&AK7xx0 zCJcVOHonesyy=^Q{PAs_sHGhL_KU;OfwjtG&T9M9K0$6dMRu37C#!y9c-oi#*tmFh zVdPplPs*hNA1%6r77DeLy5UNWuA9xb->S9wzT5U*ro3>(Nh7ROUlXt{8Y&WPm?Gmj zB_LeclhiWODMh|cNeOK}OY zHK$viPsRElDROXDq1R6bzegwKW2Q&A>zsWxiORWGd{Mku|0^?Z@$^GmN#OxeB-LEjZ%c|_qDNTRDo_=Q{giDTIX=6{BD9NSQa*J3AG&Vkn%gmSteb6g^n zu(Lqi?67}4hruTXnG=TIl$Q^b5_FKKzcf#%8KP$1rG&cUzC z%6S|=JRU-LKEgR`?D!Iim(xj?r@QPhsfSY_d1@Gq+%tG%ub7ZH@hnFxh#Su24&YD+Eeoi*02kMm)Wb$*~gxX zXfZa#m)+$e2fx&QoBk3T#vwWrEl+yDjQkilBi_Zj^Ir5r{cUNRDYSYsYJ!*My3Ex?Bsq7wx`qJCo zyz0RKcK+{rBkTY+c_V$x9LK$CCYSk1 zc;N^S+pG5&y8UE-2o4OyiXSog9@zUBzys=$XlCBsXh4xf6^i7H!}c-&D{Our#M{XM zIDHSWGkM$0mpr5Dxa|V<fz<5bv2hckc**kK+RQ4IhQz%hRHsv?x0*1JKvU%scU7x_nE*T|V zf{O?NMG{pgl7mU=z0WXCk|Mm%Fk&Nyb&mO?p7M*9F<;*^j1p-Uo`W*?hb4DhGzch? zD8|corsQN)&)X#l?A_aaY|Wi*c^_73i~N>3p}(^&pTfw}9`UtBq6$UIw&i|rTjV;) zEVhODqb>6LueL~}S$H1G+;b%Ne$p0+Vtmd-wguPCu+rnKS5i1@9x(GyBOvvb-!iwU zSnm*XioCVRHxi@%vT$KVcJ52{vXs7-`q}SMF(1@Ve*aZJi8Kp8gR*|3rG9wP4&UNN z6ytLy>H6V_R_Z4ySids}Nd4rObD)$NBdFhTME|3HQ~puEV)h^NLH*?SU-gqnv+x3x z^&2Dg>o4__D8}bZ*7X}?*H2Q|gP~Z8yK^jj0Hf4desfwNL76)HR`rW8vb0>^Sdgef zk+Ngq(XwOVQMQHoqb>6LueL~}S@=1Wx#vml1Eehy#rT|j-4^VDq^~7~-IlrkZp()- zN?YVNr`i9}mM>srX=8nDk*GqEvTd1Hwk?mbEzBQnk>7u{MIz0@OHk%MPIAYkuz(_o zVtmdN-Ih^yTO2Rl8nNK>{Zn&p*yYg+lx#3|D-zOMsKY1ABwxhS$vY&LI zpYM|nEY_Rf9iMct{d}KvpkoKS;DjPmERC*{?s?HITTn-H!*6 zdiTzM5%r(0xNh~&-bPee z*Xi~#XYDBam(#K2j>kc^=Vw_;GJmnm>DWWrf3}xB)sh^d{=+{drEE4u-fVDM`430? zv@)7=!nlz&<~azHQ^uom9SAJfQzQNn&#B2h+vJ=Rx5;r;bPa;H-%4I9h6D2Ym>f^a zuN)=H5xGo0iN}_tS9ueiw*mAt$(`lI!6T<;c=g{Ch2NTZnh%%X24Z)BBh4=*QQqt5 zi@ZUIDYy)-IUV=Z2bZxsY=`@N4svh3K=S(UK%tm$E@E=s!nYdF@nsoykZa=M z3QcK*t2(CB-^0t=ylzkdcA0NZ7i(Ys$5iwWAqQFBoXk`1n_y93o;P{B!-MbG;ak6E z-V*6WGw)gXk!w7ik=GpbWfZPCh_C%-c@WB#H_NRa_*ia_!1Fcip@^9rkuJdL$8#~u zSvA7ZGt3dlM?c*5wH*1TmG?SH^Op8Gtd!I9|EZk1|5c7Nno}YDpT+sgYj>Ajo?Oe6 z_rB-K7#a5?F52MC9!E9o3un$MX*;gnxX|3HDUotJP=dMk}|6IbM48&?9{R)nkLJX>s+wC0+EFgf^ri3k*>R>zPjiTS1UoT#qTEBo6nttPkKJW-=gWQ304Ix+ z`5?GP%Oy3>a@5gg@9n}0@aKX23YhYSVcSt8QH3Ho1#%!S`xESA)Z@PVZ_h7kXDySA zO0()roN)ll#o_TT?f2kFG~8)PtW(cFC+|&N5$&$BZr5 zS`|nlTyEBNkmp3w-Z5pm7H5!~-ZCAT(~Va~Q4N`N%;~QDIPR_(RZliVQqNShi=RAo zGb?ndWc^T-wnlZjm z1z*S>Q@t$gWh5)pBik>2lBs4^;czTAnF>5_ganENWj}BKk9(E!P+QFr_OFG@ehX1i zT)M;;em%HG7J!Fq=u*a%k7+Ffto+_k+vN$<@whyBRzL#|dE_?=lR@JLPauk;cg{sU z_2U2fLE*7|OX6ehH?0`_hTcEew4(c#RF>b8!PqSSPqXx`pGrlq;Z;_dzqN|#EWzj1 zpBV1!$Hi0*drIHeY5nzVtyo>o%3P!J{poac{Q{(w`#w)#xuVoc=@@vZLri*QRw^Z$ zmB9LARqpHAir!A>)w@j^js*70k-#YQ8>$%}*w^z4Y~?Dj;6TKL_H{*7@Fb%{T%Kys zaOLuBgG<4~NMglD_6_on9TMRP#~pvBDZmCGz;xrXp#(5H5YuX84*0-j-yqBbJOp=M zRG6QgD#x2j0#Ue$A|)b~pibr2H|VziXs^En%J>WZmp>jWuxllOGX8@9<)7>Imp~bR z!T<8l^ZHAmjKAO={<@dOB3?Se>Wk%Ew-P%{;>vWGAd{XCiE!qAjl~q^%)_G&0h1#m z{5|6li0}`??UV@!ov&XlD#Dd_6`h6;)4HQ`en2S9o%fSO-1c%-i;i%eS7EN&=3f=? zi~6(3Vs*Fr+1+~E1!Er{ zEdS?H(%&t|GXqNPQekhaB%(!W*AD9@`{mt@x<_jQNi7k!L-)#Y*><-9j# zER2w}a=F10!6SBbEuJMw4R^-b&lAW7SEj_Tm5g==_C>!}WWcjS^2XlY`@3B@x4vY= z6<)UKu}CP}9h@KGtP5{oIz77~vd!_lCjQx`H6kkK76wu^(-9?;eO18%z;U)cC&EHm z)}9+U5)W|Z;UYYyX3iam5^`|0JOH1UpNyYCd(+_xDtlYS?Y*z!uaawdkExyNJ=Et( zZOHc{ksmz>(xPTjg#hHgw7pxv;l&^td{&-oyvls0)U3Ww}I=lMW@nMb; z(Yiat+n!6!(HZOVh*tBVPLmU=1z6sB*8H6PLM^|jx_D4T?z;^|nnmpQ_1N{LI17`obZWAp0dg;n zx4+8WZgC(R?6lh(X5f2gJ=}9#dACXTgRO%#tx9n0X zsrT62;g39&Cmuy1rW%GjdtFQ4uCN2@Fq>guZcT!kAOkzZqXCECOdNHL1XC!3DPV_Q!*73;~STM_=gjl^Hf5WUn@ z((dUg;dh3J^*r_YVdB5Nq38p{MZcm}%avLUoY``wQ#D#FsUBM_Ih0VBQGa;$)*8`=sB5U#X$@H`@n6vA531`Ki78Kwqn6f}m`CZkiuxt>531+I=og);{fkoP z{x6E>XzIKdrRL93H!-HgI;l_QI`J9DJaZU6woZEEQ-*(~hOL*SX0Y@R*Gv9mH;T_x z>Vl23bXHJLQ@`IROF?ZCZMsQ3J8zOw?q_%c!*i((Uy}Icl_iH&)PwO7&VT8_mz=6E zOMIAhyUO0UP7P*!`^}Q}8R{155$gN~()NHxQtk(vMK4f)qsDHLR719iPy3gpl-_=W zUq(JJOUy8qwT9st%f)jL%R0H^Af{aZdWW=q?WVm>%6V#J*S#@K&0ZjLu8bcaRx~gd^ z=_gGKNXih;P_-81Ru)OAEws6fLfQ_~7Od$5QhDQX+CC>m8{2p`con2nCF2Zj0fyvR z$@mcU4prriDu!ECH@;N?C=WNvR8>{eh{i8k1kWgyYE&i-0aXAc8`2Y#KsdiJYLaG= z8f#iWYNcrz>28o4C2Rmy#XDm)jUwdo3doHoLz^4ZVB1H^H(DUiP<4dV*KEmjr&~WlEkS&EBk8FsOkVV-7G@p$`&3c*D;eOiI->1a%2j?U``iU93VGtE^XT(}4M zfu1L&lNORfRV&bHwF@MD*2&7Us)AlHT%h}4tEzUJTS*U*_L|#B50mzr+evw(L*@?B zB+^^vPSRA;3G-FfY!=9^&YHW}h9#iYp#7}bYLFk=e30qZGo8P6km+{QGXNyx>@e!- zr-H2`w4H$Mx~c|}C3YS*H|Qu!xMVd}EmXSY#Evyo-2k-#xlQTa0Eeup=~kpEt*r{G z3c>?upmf?ASh1ugpirZel|;G=6lrv^8j*U^bD%W>gnJ4gKQ+`EN!tUojRQ&VKJ1X* z9dAuAS7E$O0Vy@nDl}#EJPC4xifDVDwtQ>8xe}gxH7zn_-Fz3++Q_$_X1Y&6nZ|VM zHB;7(??F9`8P=Q3ePpO3zZuvZO9AfhHQyS;>~H0f%XO&Z=%n@16n`8LO>S z($|_=kp2V(s?}C&QlL|4opk~Jp(+mKRvRtDA$isyZL<7GjXF|bicN>B;|n~fvq)Z8Ymakmb4fowZ>&OafrTJllyi{G7FiwzaSYg7!IN%P@h_#fkM^$pbXF#4kIB{ zT>*8)mgGx^tf?-yjPlQ{uN|^JQ~9A|koK$&K; z<09+X2IPlr<0X3b0QE3DLa5nLP-~-x!?ZE4C-OjbEJ_Df-;RXM>8CjhN{z`#j2@eC~Qjo0P<7K93z=$Ksm{?JxFYEAU{wJ zZS`pD2$Gt00J&91M=nd~1v+GQa*QJlA!RxWN#jU89FLObka{}ikXDj5*FgB5 zu4AE7M#wv$o}i~#-UX0b^>Hkr=a2Nva%^BOe}j4$S&mJl$Uvcc96LeyKpMzT^>w^K zTYcIJK{6&s+KseGhHrdl(E$DJM)|Y@>44uhQBP8 zCqb=^=RmSlo&zcMyu;})OJy4<)Oy|#0#fP_)2(+@^Oqhx&2)Q(;Q0k80qadF>1WU= z<4wndOlJm3d2cyJks?SJNujD1sMP#M+nUq%o8v5V=?QWxe?K97W0AH1zpJDvq;Qb5 zVF5kkXbV-(gF0CWe!tOkCq1kBMZ2V)Z_%@frZb=(MsvUBuqkzsp3VK*x+Kr*pw>oP zkfd`4XIX=-c77d6v7jDC7r$XlR|Djyy7)apYDVfVgj}*fZk%;Ig6&MGdJwci_3;}| z&l&X0@|(&$=hL&Frj?{Yevi}kGHIya64C+CSZkQybIj#^ke_S4XB6lqPC^c_M%?|^K4DpL<&{iL7B!oAQ@)^LC>i#{l?RC0zJR- zo931toC(76b53*1mUe!KQhTfl&LyN3q>9dGnQk-F#W`1lLe=h&D#i*`4^#v?8FD_v ztBfFKzOY z)U3*O@f4fWnTu{Go-^nbdjIMbu@~)zppDZPY!~L)3Sur>WfC2DnQU1}3*TWS~T-PC)j4^nfe6RFdvk5T7S7gLv0S5aS}uA{z0-9~+t zx|jMU^(6HJ>N)D?)UT;msW+$!*Dte*+|+PtMQUYgHEIgA9<>3r3AF{a4Yd=sJ2i`X zFLfw&By}vcfLctQPc5acqOPaDLfuV0L_JPDOT9?_mijaG7S%73%Y_fE{j-cjJCsU_W=TH|?pP{azuBC3GZlms_9;Tk4 zo}qq1y-59}r>Lu_o2a{}hpF#T zKc#*{{e}8B)fFxE38ThR6R9<*b*as$9jM)?{iyd*M^VR8r&8xo7f?&7E2(R#o2gr= zJE{Aq2dHmRPf$Oien!1ay+ZwodXxG$)fFSH2&cwTt5R!H)2J<}?Wvj6?$mpz1F6HI zmdcIk<+RkK7~H8*MbJd`W$Y1WlKLU`EoY+gt8g4gJrye)fhJWr>kL!xu1QQyQtRR_ zMsQ7rdy^mLZ)s_wv>G zYJ639R?&6pA5<%$D(-5y6KX&ss1>OmYC~$# z8MV`iv!Uk_YasqhsG+`1oEMP9ezTNc(j(<86`3UdNz|02Jj66f8V|K|%Sg&c`0k_` z<&c+JhQmQq(x*HAZ8cR;aa;?Wx_V{is8z6R0z(CDfHrZ|R$B?L^MosJo~KsYj`&sOP9(QGcZxwIx*`HG&#X ztwn84?M59;&85zw&Z91*mQq(!*Hd4nzDj+a`X==_G*Nv}`N)Bq z>J{oQ)IX_y;ZjyGHHun^TAf;#+JxGc+J$;I^NM(O)cMrK)aBGw)EB7h zs4r2sQD3F*rM^i$N&SF&j`}(EYwA_%4XTQewz#R`)QZ%~)N0feYCUQLY7=S;Y8z@N zYIkZD^PYHXY5}#FI-gofT}53_eTBN4dWd?QdX{>T`YrWm>Mg2YB$o>{oEk-~ zK&?!zO07YyORZ0BL~TZGMQumzOzlSPMa`z(PaQ$crB0?!r_P}+q&`DkMO{nXMBPT+ zM?FkEK|MqLgnE(sHT5d>7wVr>M|o*)05z8Cp*Es+p!T5-rRGtmQx{NIP@ki&qi&|| zq`pBtMm9+XOz?=lv;sWm6}RzOl?ceq-IeEQ%6w8QH!W^sZUW?Q8!U{ zQ4dq!qkc;LhWZQjZ>lR=>Jvtdr6y8qQ0r2gQ9Dq(QTtKvqmH7ErB0>Jp)R17Qdd&f zQa4k#Qg>4KQ4dhxqMo3BME#6lRsS`ki-qgJKXq^40@QrlBAsokmf zPzO?nLk-m@H8co&%v9M+4yTT%PK7#E^E#rL)a*LRc#ilX>fLUMAItcu)CEvE=8=8( zsyd=C)Txe~Wsh7<6<2nc)o{;h9`^F~9^6s)D4vQ8tt)$Qdp|CovN!J(R8PGIYnY0t zwYElAY^XtLc{nN<1x-{F(!ya~kQN2aOCJKAlRh%oyMJ7sJ~=q6XgzfY^)2d0)NiOa zsm}W1S)N*zTA$j9+7~K$9>Y;qY2~T#99CcSVd^;QWNHDmh&qE>Or1@gN1abyNPUW0 zN`034JoULy$$uTgo2d~ViP_5V>(sZY?@*6ZYcSPmhR;ziQop7CME!&6Xdt--QSWw3 zIFjLHA#UwBSzFaTQ6U~q_xfzu)0B{jdn#gMF`#nctlHPp@2?bPAP;`2JgN2$lD=ct#d zu>s=q1H-qd?uHUmo|;IlLv2iLL+wcIO&vrXMx98VL4BOMn7V?xmiiKPJ9QuRB=r;O zSJYe7fJRc261Qjw!wJ;d)F#ySP$$DB(fW8PvzA+o_*W1L#@e z7S9ldYg3z0OY2MgTGTVEXcsg>)oeUFAVQ@<SntUv$@%R=yvMs)Fswoi80@Xp0G|pTUn=}yRDDH@7zW;YHr}d zUW?}Y!wqcH_J{W@YS`k4vuDv=)PB@q)X6Q{Mf5J3g>czzV4`}WMR(-zbc?&8Yg_cf zx#}w|`bH$G11)5G_$Ku|q{8`Ei|_n#-bB3&#d%YU0eB1JYKpX1`oXDwYc1+%Bf6lD zXn333XNb{ljznY?)uhHM32$#E8qS#d)K1jhmc%cio}jj(ZZ{?V9{M~;9Z#JDO;n59 z978L9YZDe}C`VgS*)JGsY1ImToAW2gh|B<7uVa)vlCsUQ;X3}KI8sSn#t#lGNE zSRLweyXldM>a7lPW_r293FZ@5-crAG^oNhpDX~1xYCF}0R_v5sK1_wYG^CMtoUiV* zyL?vBOVoqZlhn_szeByArIk;>Ga^HD6~f-y#%0JAgJ(1RqP#I5Wk{W`B-clbZT%)g zmeh6X?@TLa;@&p;bw27!Rx&n{*}5c#lXUop*lSVPzGeObJzx9xs6<|oNW|V*#>V|w zM|h>8JZ>!4=_lLj^nP-teETYgH=mCE_6H@Yf&D7PC2L*Jr zAY1w*f?A2{p{7w=K@(L*_9G~zZ+0H^q3ns!yzByKQTBA`yzEDz%d_V}U&=0l?#*5d zJ)Qjw^z-bM&>Pt=K>ho#heq_@46W9G8?-_HUC{RZ_n}r<{bjwdukgq+O5~ENr+yeB z@i&GP#v95SD%xe}ocKhQ^5Cyf8CQwyLxWd}vWlLqFI%DKsi&b%_2omd9{v1~h2tnS zOk$kF!twT1;ILx}c;adptoq7)^T>D^>Q3qb z>Iv!vsG)|9mbGuf=%H0CRR~Q&pUBdDW^^wsHGAz_Ia-dv){U+VpDm*wt|D9G*_{$` z-6;jvh1!jo9gxU%8B2N0%Q^>3*{Oz&`4zn_xmjxLn75I`?Xo1F?~zaa+;U0Y^{z{9 zrKGH)0nkL1llv=Xwwah)CCN}Ta;rn<=SodVscUj;Cs}&j9*mPx#*VoMKBD#&KWq~! z4@S6W-UEn_%NT&|&pmnKBijcleR78EQ#NLxrSS3g_S@sup$;EXKc`-y{!R@YFIEq= zBhK5%{dK%t`;u!}mMS+v^u&ath(A3+j*7pSApL)h;kPr;`vnWr{qWmOLNkxWJ|dwpM}OwJ`atbdQIuO|DiZJoXOd_MIoa`=hrS0v#e>h^{bj%7H3T8o-S zZ9;8J?Mz)$DE@sJeud$;(j{gnV{)K|$}hUJhSEA2y&H>owpb)>+*dR^z))`%{f2tJ zyXIQZx2zar5f>h^{bj%7H3T8o-Soz7H`Q5R5` zQa4byQ}-fK-1;)@ImW!gnCdwae+4nplX7PF=ZxAI)oUt?`ppy#qDE2Usnwv~ zWt2K|K!l}+&#Y4&d)t`}s+T>+kUo*|Ib&v1#Lu1C3O?R@3UOVePr5_5tbY{hzhM`& z(}wT5c$ewQ*;`S!P1G&aoz%V5!_@bvpHRP`UZws{^`9d-bZ59d)Z&=LRrfiMU~4%e z*WOmhQYfw50G%K0 zrFNkXpbn!>pgu}nMcoJWF5ka!bR>IWm&aR^(#kD8vd)UWLLFKp;bn7Ldax&2AZy3` z+)RYauEp;xkTv&1s;s|uOJyw{kSRIKaYd(`vDu-(C9j25#hnOcyvQX}_k}bIQvb99^nA;bw!8yol3%`W* zz`_j(|Jz@V7!4jl87k$;q#8K3bQoA(cLmB3>5Smz9_-T>ZV9r~*(bZfDmhq6O2l6H z$=)@*N2+q1X{n!{6#aL(aT&W&y18fzG<=cl2P+TjTf@MSq}*kTUUVOET~v&+YAv?U3SZBZ^(&|=&iJK0bmz7+(BHRJ=^mzP?%dklyF~7PdQCX`lllmCJk)C~dU^w_v#4{a3!q->;-`1R zx}3U!x(DjD9(#HVtRGRoq<%-ePBlt#2C7Fz`O@NASw(Tws!(ry{n9V7teaEYQ!}Ar zwa3g{q`JFQv{sSmK!!(BCsB*3Pf^!WU!@+T9;bdry-HnIU-D5)MBkqw8o=*F4 z{lZ7tpc_6KgopGiCDK#Pj~Rrcf)<*diph35R1ZzdV;*q&sd1Xt#0&=&Y1$I=Fz8iH zuf^oyO3g2t4#!LY@fBlLtWLz_gYK_lm-lhZRM03*mttms=4<*P=21|orkhN6T~lzZ zq-&pK=TaqhE@*+Kl-T*8bDA2*J_$-swmsX%mOA}aYfW8ampff*ho*k9&*6g*`!x-X zT`QlZscNSi9h>ber>1DikKO1DR4-PuZI8yj>>vLewHndt(PV zL)9%GW#h_7rpNZ&8@t09u8wLt8oS3Cp{{8<9s7n8-xaSRp3~F?~-hi}i(<=`2uceyT^U}lqscNjIF%_ry*Hc?GEe56IevR$fDXicGU zEBsri3!2`l_@aMHHKl>=StD+be;ak0RIED29q@0fe)G`@|8^?5q3t;^?yP@%^@yg) zarw@>)ObzBai96$rDkbb5|{1lpjK;oHZIHAQN`#byyolI+nJ$aG<5`Z zR(tGpuD9c+I=iT2BpGMF_;*oX*`&_I{q5gXMK+R}6{|}qubX;+G);XM=kMySHflP9 z(tD_3_&k{O%MFr?ZwnVIze<6w9;!KMnu@5DFTK(^S!@ms(PhZ&|&!` z9Lh_t6z}S#zR=X7QZ-j^^`oZFl~P=HtG_j6RjTjmqe7e8rQctvg)2+#)|6YRqw5}Z zl2oE{D|L1CRn76bxzuwS>XNPIX?mRWj;0l)$d) z2C9anV)a#}VXi@{y`~>4Jp!uV+V*r*p5nS+T_KgIsLFF)530~Mwyk>Qr(MHTayy&q zS6=BFsb*?w4|-Vb(bNx=qkhvgs`5J57&Tefdgt1y&T(qGrsJf=?Iq7*SM~Vgu5oIG zraJMbKx;KMivQ3xUTxOYI{qAJm!^#P&s`JL8=CsZe+4?G>EZbAT@%&&nkL8p1o~9d zqw&AFCaEtqEsg&Z^n<2N@s@kCx}j-D{2=FKrS4)qF$Pb$@>Kg{?p}*E9#VLe*Z=QrHSrS550-o2vR~+6~)OHBi$#uobBXHGKkG zk;>8ZZ9*gWG&MofZwW0xMVg$6?cLMWW16B8Ge9Lap+y<)8EU1r6(m07o~d3W&46tb z=%8&=#fiD@S?ZXNCb^5%X&=pSKc+tQ(c|tp>avfXcF$8k_-K{;3H6(g*0~obM+f#U zN_g45Pz~_WF83n!vX9Te&ZfEQFqN4sXQ1*}!^J_^T!=XHEkF<^sg<)h?)O{%+(Y6Wao zgM5@0@UqJBQImkJYO0S~2W(gKebg~vr+U^$-2!&0%|7ZAuv@+Eqk9APsuMnXFyM9d znU8V;-cZ*xElivka8R}HWVh&9&|y`oX+vU&|C?%?rdMD)sxE4J4Ys#cKnBxsn|w@# zYr2`3?L4L`YI0PGbiJdJG=)@g`@f@VYpPIXLBPAJzNTtb7J*u5N~@CQKCbT4)T&B| z|8dn#QzmRDRFB;cfaNYm&lD?p=3GIm!7yr+tNv?1VqwaoTZ)2mE% zo>8qkON)-EIaQ9k&Zq`mgi6$=Dz5~bQQ4%$7?H09e5fY+=#7B0YKxDK1$?YN_0gGt zb1E`Za*=eO1)Nu1eDqDg1vSw}KL&iR*7@jWz$NvukBoAc)t^3cm-|{JboJ&LR_eN?~PPs;4(&820z>k`D@k)RV*QvH9m0d%2CR=HnQ zQ+gJ=h9)flwbhi9G}Za5>a3|KDI3&VQweN0RDVq?l2ZL|s3Dp*B`q#@Lygk3Cux}L zH#Jt%@ubiEe^W)8E+jou?xuP{(~rpIrg~LVK=NwXJ|$gtORaCJYnr6iH&yxW(u`tP zLh>e1B~3MxUjcbE)lYu4-0$i!Qim*u}Nhozgg~=>7iApI{#L6HC3vb4ay{4bl0q!>aUFMnsQ0KG;JXD z(e!>*|3GC7)$~i%z(B*;qA9xCRHtRUs;PCgRDa9Zt!Y-Z1p$_^k7S>7S;l)l%0{|t zJ_-+X7_ECstuGtFk#T{3#xhO&s#OVe8XGjdSfepa^5TrbtkEW2dGHplD;4rljgw&RAm)>7XU&E3w8c(o9vWdbYEI zQTuMG%S9utdPZPHV~VEkNEc_!)bvR8Zh>*e0!<6xS;;u9>E-Hyft8JfK6WneRbLd4 zU<}suBT7g#hHHxT^bV|IOeGboR-Wv@WaCk7>*^T-TBK>RXBcP|>9YIl8jpe2**5p} z8VdrFjbkL)x;+lt*S4n-Uo+Les?j-1>T=nbk8|y+MnBRt<*6z3w6>*_R+1zavAyV{ zY|zW3L&~rEvcPJ_9!=#y9^*$%k)WE!Elm|bwT*O{L|@r?rW(zBlKUgsMS{|e(7uw(Ayom?z_^E0?5dk`+||fHsm?~m1Wj#I9so_%)S2|C zrd}x%VB4f=K+5jGM#gqc52Wk|?bS3ckgWlD&DCGp`jHdOZ3nXc6bJ$+) zC$&DJ-ayTo7<)9mo6;??iSawBSiPHaIZ>Y1$842jgW;M`7z=yr$`7omBsh#@m|C*QpcK(fE>NZ}mGGzi5)J zen%s8EPH|@xuX%|qc%t_ z6l$tncNnNxlkCSbj3-Dk3QmER+cwZ={+$ge+v1h4`-8e@I%4#$+tJn4N8{=a3+m>h zX?4d0^(0{|`OU36F$fn2`FF%`MctyHyUWn*pe!FfUw1*!J!NQVP(NcM>r$e=touSx zf5S0OvMEtkz4f4Zq{S+!-u9pY#%XP9QExXWa=dshR`=CA9CWXdO|r+}y}lCi>m7ql z{G^_9>Wy*_Dnqk_2K#71y)!}gm7&jqh8Ra;K&G zk1#6Q#9T%g$v*lvXrz%!I-(?(hmCrqnehA#)XnGlThM4@fK6&eT_ZTp*kqHd21*#~ ztxHe?(jH$f+0L=XVbT$o*v1)0?Q|$1A$Xh-Gg0a}O_iqA44z;#Cl#x;Y4w698sjzX zOlulE$(ZM(*1`G4DoqE|);bG}Et*b%3XT1mK1%BlJk_{Dnx;Na>lQrCNSMTaQP;#H_NcM1jOU}q1?`!iUeW(iqv8}P z;gE4K?Ud^=qXEh8>)A#-l6{0U+Zbw-T97_Ac((B@X_`8bw!=Bc*hV^}B$v5Ht%BRN zo@b={=(nJGMr)fe3Qh*kH)h-9s@fpmxxjc@Q%ZvmgBKVt_|mO~?Ij<58eC$$>Z41+ z3yp(5x)Qv|IBt__-C(M7vGIYXPAFlqah_!FffgHIYmzlzCU9WlBAacL!L37@KH?2a^nRbRSQ{Z9P&}akk!U_KI#;*&WOXz zzgXjt%g~U`#v`Q5#=9w#LtZtOX?i1NUdU_4DWC1>kln_wKHIvGy#_9H;7`(R3)yEh z)AUBl(UASd-6VTyzF`dT(QiR-7-Mb1QaKlL$asfz$e7;XT*zS~c$&grvFop7cjyr# z(I(XMx1cwTCN`*x$x*U%FLcmO0j!Zf%&KIm4Ik zr7)NIxG&xIuyW>$np#xa8x~?-^Lkb~5*B7wc+##*Zj%#X5oRq-Q=5DgR^IHXX&%}T zV-D5yRFg|#vF18W>zaHQR>9n*X;+hLVHM3Inht>C%qyCXHMtR1$&6fNmv^zrpJA2F zzM8H!afHX4rJAg!<-!xpbDCnCMusPv$xqqosyD41o@B1nl-{&zc(Qq1Q|qR+!>gKC zG-Whx5biMtFSgU&+q8Lj4RfldQBCg(uW2sOw61ApcrEiZsYIP`+9$lW+30CI-H%Q0 z3$J6g_tEh1y5`-QYE>T_UeAo?s4G$R*Z-ZCZuZdBXML^o2Ie76OV>|JZ)Eo6s4G$5 zuHTj3#4OR2y5Y<8X66)*vl5lFp)mI!`!P$?zwd~k7$y6Ze7e1n&h5arg>JA+;i({UeqLa(z==7Y6@#MH@v&)ER_}& ztK?=ooIT8nB)gtH&Dtc{f-Ma1WscSKM#|FgyUiEubZB3evyZvSCReLwss4S;13ufz z@IK}#A7wf3F>l($t<*iH-x9lYIcDf<#%OxGSnW^GNfx6d{QYdY8Le0YDeSkq6< zz6c*+mTC%X{$2P$^Q5M@=0AlGG9#DTCFIw;89vyo@(hVf6+eS2xjCj!WEVn%io5w{AGe>J$ z02*#?)U>Yoa_0!M_6pl`NAtvpk>)&2M^N4<^OmO5q!*vHJukv@l(}rBP1j+2*nDu6 zP>C{Icp@G)r;w&8>A}(F98J=LW6V-bAuY0;xn{x|Nw-*eTGWfkHHVU>pt#8|o2@ndf^_4}$29r392qg*+(KHc;#-aZoz%A4Ewh}H%+W8}xioD#HDZ$a z6RAWkiJKEK#VlH9+d9Fs&|I$Ro|bu_ZJI{Wmbu>cETnCzrr9XH(A=--DS95*WP7eB zo!0aQ(}lid+m6#VSkvb%7a*4(HC>8Z>nt+O&9>(cuuU@)eN-AT!)&JMW=k9onte5y ztr8<_I#@K4y1cb(>l-sbHAp;pb|6mH9OCXpoL~{ zl6_?Lq}kslwY1H95l@==KKdx)DRaJ$K949hpVzdi&6S9y=Bt|4xA`UF8S__7yW9K~ zvCItIE#(!f1EA$*OHJ>#@rztx-c6dOK7{RAGf&fnHi3~V&6PgSeCI0jj7{8rt}?&1 z$rai*Hgc8ulcxB#RX~4eN`>t?)7rz*T`gdH&J5I)**4YxdDCMP@~j>CyxEv!A1A+H zN-DW}KECZR*KK;N?PvZkn8R#Ow_LMYV~*A&=eKKo>DIM9?pkY3(zYFK8@bn-(=;7z z+X6I)blEK>yl5`eBqh9PE+frweT;gpGk5EBU$wm}a-Dff(@(UW(PXs~&ntF1_R>1@ zx{pq|)|r8OrA0GTLc8Ox^=4y|-CE54&A%f-y^+gpk`iu{lzy8=wd+}irnl=~hVD$) zD1J;C+t4JT)^_Q<>bKtPq)B>kz1i0$_f6DugE?4}fBRFQ(VEJ)PxaquPSjMj{o-;P z&6zg2q@J71S4bD#4cdQ)Gv1>2t@{-xZwz*_Uzhw5+Bun}wbC@O>6PwM~ZF0Yjbeqisn$D39Yx(W}e z9&*r%9IkUh^AG(${;QeP(k~vFpbUXCwES1)5aHsm^`oB2Dg&ss8)SQ+7I+ zjL3cF8BH=G_nGH3$#&v(^9M~*v)4_>8w!8ZTu~i`=8%rKWJ$knK2DOpZsC62TVY5F;mQj}TusM{pSdHk^8@9)MG`Rdx^Ma;HogOZK z%>3R*W6Qr|{^6s-^2bfrAt`UMn$)Sd{0TFLR01j~|DM^9RIKJ;M4mF+`)F$T`(`g6 zEiHfAyw69^mH)sTO|rM9XU#OWuSEU1sduBZ=0w|*WBy~aNRy2DkImVds%M-p|A|?m zsbR(?kknH4KzC()SN@#2RNJyLQvJ`F>og6?SX}O$`MRdjuzhMC*Hj4Gr{*P+^x%)> z&zrw%+q#T^s0*ffSV|~%?Z^lPl_MQ-NqHB|VB5xY7tI(SMMvRV_53>$bTGpcb=gNU z%5Rgj@3L8g=`M3m`IT8uli0p8+t_)!LOLIJeQjoFs@VAysGp|lots2`W8SAJy>lzj z7_Tj(L)5qCBux!7GC|Wdwd$Pe|DCx&Q;*Jz%YA3Qpy@u?u9#ajO@Zx-c~sNWuzhcS ztZ6-L-4;mNZTi{Vs!5)0`q|t=ve)VB<{?e8PG2|QCE4rPFXkDNY28>fNp`v$W^a=0JEle5)Fb4OUul;t=O5-|+oqoHGB@fEa{*}@ z*1x$?x6E^-#cD^Fg;9T+^^ZyECF;#CE29237ifCF%ZpKlb%-S8ZHuz3^Q1#cN^n@} z9Z9zsv^&aSZ6uYb%Uupc`B`T*UF-60l+zmhu3f^-E~lgXt^JxpGCzrOS&rkj&6D|g zl-ug0sYT|yQ32LTO`SmHtSKjK&$~0fi3+sNY8nDtkX8GnZOa7(TO%~BsQX=5h;^K` zo~9mqsdeK}YZPsEi^8oUlHH;RYdp#JjIdVP+FKj2$D_GH*u4M*BSF~ztx)fJ4IL;d8qw>*}tZk%XWp-^|KHj>esZ!TU(ec*Z@7sA+ z>zd_Eux^lwRlBa$q7$sp(_$-D*4y97)=5nrNzFeJ8=jo*Fch9+NyX~EZX=_sSt~V- z?v@)}-Ew?v=Td}p9xGSV;%+O$J=RK6iCWujYIIHOind+r@?><1wfYk~-M(&1qf@O9 zG=0?V`RF>RMMc{oZYTbUka)IZ0QnT-|p@*S8`+wR4H?p5<&{%_0@6l0rJCk}npvGb zv&&o2{akc&>nN#MZR`GJbPFr+f^9nj&lXlcO`mlCA-bhClvJ#~={_>LmGzjW8{L16 zZf#xHp3WXw&Nf!piwb|!RK*@vOdD%7saUnhEEm(xa(!;w>hy?-X>UEKsR`0`uoh|R z+~Z7i2Wvm6SoQ6Z9MjRN{e_+GfgZJDI$5JhC90rDT1;oF$0ghL1aj$OZ6RR{B3&2j zmbSeDTc$POOYtmLZ}k`%ooUU}l$+TkrmNNdvYpHOJvzj6vr096igZ1!-!xtA@qBa- z%k`C=%U{T)r`1@~kj!2&y{v1bX)3VipqSoP(bsmKu|07;(z>82wdeEEeXMJm+V&h7 zlVvUXRy<2oR?o39_gFhL4eD7G)6Y7qX=KlNG5xK$@9aDakmtSD6Qp9*Df5|_d#&X@ zS{*ac+NkOOWA07hvZ}Vm|NWeE_C61TW0Zi5iU@`Vg;QagX=+kAAfe%mhDPN;ib*Po zWX>p(8csz{;fzzEX`$)OSt=_mHB&1}ElSIw|5|IW2cCO<>+Rn6{eAv#eOT`AUTd#C zoIRcKc@1*tZ|>%FuXSJRJHV__p}nkvvJ5nRiO@^2?;vv(>-Kiv<2%^=nJ8Br?|#NN z)vWb{PFD`O4>RMKe(ZkHcbHkhln`I(`;6K7M{W6A_e$Sq%{-=BJ#P6vZ&oq|_E3H! z&DxjHGDpPpsOdM_%p=MY5A{e?>1Nnvt$Y39dVc9<0@H6@gZy4FONg>WLXW%s#+U=I z==`3CbmPo9Ow)U`@*8JH{e-$)QP88C-*|HlQI2@4#}K~>W(m`~J<|Lpnz27?FUP^l zBy$?mr5>j5B(sPpM|kxd=l8OClF7H{B)`dKe5Fno-V^ThnjbRV-_!KXHZKt6(3AE# z<~63rdd50mFGbpSQ_WROeR|IHd)1u!tJV$eneR8vEGB|A9B8^(!MZ6u7yHdH zeXr`=7Xr;RyD_ckS?D**T*kDs=i7d>&67+Y_uS%_Yld9Y=`I4zHMcX}=vm@7&%Dg! zlklNmzM1fwwv0(A@mpZdVCtHXs9rZqh;qcxgkyfMoAJME%NI$vn3ajy<%o#*tA5MOOrk9DRf6Te z+&oQ`E3PHf^?%c>aZ_8Gy&N?QO<$(^z5M;(GUpIwiB`Q5)e7@B);-ZH)PIHPdrPP5 z*DJz*r8$QvOFRdbtIXZ3+ute1f0cQesaAX||J7!~ADAvn%6W- zrhUD7`mZ%(g@Y_F^y=fk&MYN@l{s;c{|2)JKTQr^d=ks+Z7?I?y)dN6#5Dhn<|3k8 z(IN5sI-ATm?$?{vr8+m8bGXe;6QyyfYph3If%f8jHt_}j&E`5H+_8)YI?Fj^CazRl zOoyrSdnGZ|xfQ-=uW3o*WdE(^Jf=;FGyS)ltB7*Np~Tnx-!aRHa>SX$rT!)GOC37h zt;E&-yXcn}unxG6?K1nouN~m=yYtDG9`C`I*|p`JPp|9$f^6Td)<>2jVt<-gaw$huWe{^Y;kjEA=ev7a4y zQq}*5nMRZ)ety!o{zqmRlV4Jq|3NbZz94|*j7&7a@6#xftER9b5cb8V`ev|e!ZFj?S!ucp_c30(qSj0tEIhMO=@NzGt-Fjh1vTNup9?(5n}!7^zKo=%v{ejCnmZ6 zC*}yICTz(pe(i^`8;Pn@2304%y83vV>b4wPIumnCerE7oAcas7t8`T z-39YIH{C_E(oJ{KOoDGexytgbIei=v$PNaSQVkWT; zeg0yWR9TkQ|J6M1W_islceA`^M#9f&>T<5B|C`yCNc+5Qc4i&=yl$qu>28>rZn_)h zM{c^CW|^DrrrFA`x;<~1?TB=H-ZE#q>HaVmxas~due<4lW%=uJVp)VWjHzw!i}fAW zL?T^k)0*mLX<9$J=`8D-o6fSr>Q|RcT2Vy0WYS7<(J?Dkx}MfEM7o^bRyymjM&6cxV0Bq)SYbrEEH$ip__K99a%x&3L|RwVn(U^l zWzBHY)v_AEH9;_uw2J!H46@3Ja$vqrRKeC|){S}!>0Fr3VFJ;NMw(_2MZ=c|Fn2uH4z>m` zEd*VN)e62Ig1YrY3z$A2%8byuqfZ?R2(gYcoqg(LK&W+*=~u99VBwc7(2GyvR{;&I zI!!d$$%(3=70XnYD2*vNd980ltAgoXpfD@sZk;Y3sF5{^X&_LzRXYlGIbv+`#el|E zFj1DsP5wC`((1;v1gMEMm1%wQjextY{Y<5xYieC%Doa*@&8*m_I=^o~caN1ulq-Ht z_6dx(UaX>^z0_+b*z`6(6m2T_D~4Rw2`qKo3}_nT7zxS?yx9WjatBE1hXV-$w%9-77$C ztRo4_hah_5yXVVq>+g45*{EfGAg->DxW< z5o?`vtBfh6-|)bAE3bvNjOsTs@G+~DsSQ{@ zVfnVyx=#Hj26nT`nY#7M3G8n9w$i%fe)9qotN}#1BDLS*z(lLCHR_O71}0h2_iM|H ze(M8!TML+G^xGQP$GXf^*l%axQ&yt~wB^=*`vQ}#Cz%fPD+}yvO=T+Y_jO=@YbVpC zeieZOtRI+E|K9@#S$D)~FaG`QputuEQ*{3tK)s0I?d|?w)=jYnGxh6#SI`h^6jMh3 z(4e7KHm94}KO*R9>nPKk{hJ4+TGyDi^nWmDnB~((=eNIqr=a0hJkyu`y9GUC9cB8t zfA63)tAfcnU{KJr)_@0fy1)TxLC;&um|72bA!vkE!PI-egrJcYyx2hPIdZ@&L8Gh? zBDi|jb9T^ZOSD7Xc}Lsc3xd+EZbW+4A7dp|QMnpprD_th2D}k8)=FnuI^ei7!zyB0 zKVZB6IBWDnx@4sTRtLRkO(n_^rv|j~7;l9=taX%(5z(h78Q}eAyBmwU^9+{{EA#r-`z}TLX^-Wm{93 zJ{ywu=||8_wK_kd%i=lc>!4{?F;m!}JkJ@{{!Uug3Uo8AYfOoQ+IY;iGCJ%0 zUL54_KgU`|lq(hw`aUSvDksVkn+N?AG}rR(qP@I0=(nJGRx74Y2g%_1RwmPLgK7l7 zW|b4=h}wgD`Y*7e9@RNS0xh(XiE>59!9Kx@tY3(-ME}8UJYKh~uG(_c;QGM@R#v>u zZ}Q*nin5{~30`TPgnRbKgV&Hx*t^LeW0Hc4+-P9%S~q$&c)c5?2XC-W zYM-J;%5mo=>pW8k&}QozQ;U=-!Nu0yk73>SIev_J7N~UURL8uEGYG3yGI^SlR^?3i_n2}^d& z^6rH-I`4rcJ8t(0{n#pC!lxoWvEF3Dry@SF;93rpI)|Qk`PACRgwIHPY8@cb zcl`d8 zTa#!x^m_2;)uflGepRPO!-f*2{Gh={yN=q zuvBt8)264lgxK=>0ImDS)4M`EWRrnNdWH3p_iCc|Y`kQfDqZV9FWF6#Xp`DH&|AL3 zw7hPjsv!%R+NXXMQbUSCanu3n6u6uGT?+xph}vxr{AePQ4y-hb*ch z6?&)aHdvQ)W~xu9uS{iHml_!AFDEhWOKlt)Ag2;#i4))@Q2M6mbl;~o4GosBFd4&I zg@(#vqAYReu1Nk|$X=ci7O-rm|bA&Tr|k7eb?D4%4<_6GQKn z1w>im(6F4)`(*SmZTb7KxuMNvJE9!%a%w?nOIbpMWmy&4T80cq%PdiA_{PxtWhqma zVef=KAbp;3<+nGqjZ7lKRw@W>E5&oD%Ms5HI}-YkOkR2LOaR| zBK=H$C;9M5O6SD6r<3f;gmX_PnZSfkeRP(|OgLwCmP42tcexhYMLx^aqRTCyF-$m1 zJu2riZEY_bJSrD4?Qib|^d^y>!Me(~nQ#W{DvQ~&>F|jvUY0P$4Top>^+#qjYVbfpkyEAf^eB?g<&olnc6U@?oa8K-W$7 zX4(O|?lP6>An3Zw2~1ysu7{k-R0+Bs@=Yd>XPVhP3=Ff-XUR$}|Xc z3GxS~iJAIZ5K$k27 zn8t%HSvF^y3A((_w?WIKL=X`ZU z8^~cV>(J*j@+1>_c}Cu3!W^EFwZ~!|&U>KGXJm6Cy}NiucF^Q39Wkasnv7>UG9nYG z7t`n9)%4{$~o~fb*4Ms}u3~Eo|HPZAL zEng(cf)-3vqvb8K%oV3LPUt*Zj$qyQ8`pJyL9W&5oGpV}dW@A@n0hpw<2hFD)CBo` z9W+*+U>(kiF$?AWtIQ@|m(8>z0gc zW@pM^rnN+^m=26Q-5^sA=5%;eGG!(c9+gbFk_nGWrrgbhM&l1oit4ETf3<_vowe)5ucqN~XwcB77%1DR_!3Bgz){kGiX2j;xo7KJ^a%6&c2aJNQ@Ry-c`+pDNoj z;SPSPe2fWq@UO}~Ot^!8Ri-lG4t|<^feCl;)8xxcxPzZ2^O$f4KTWP=!X5l{SxmH# zp7ES6_b}mVI9={%!c}yJJi>&l=nVM@6F$2Fz zx#n5Y`z36bef0e9Ecq;vZqHeAq1MqnF-sOO;Zx4D6s;E`N`SPSr=Qup-M1uvgoax7yIbI8-n1nua zoL`a7Nu+zo0(mDB_K*cKfC<}kp^Rk0_FO2VneeQ2k!-_+$7qr4z=X%>b=jQ>kJ0Ng zi3wYxKn`KTmMD;EO!%(CVmXcp-&I&FCoy4A6Rx65<$FYW&RQz>6P>60mdTS$nBOvalha|lER&uu>pp?) zvP}9gq0i;=Ato%@a@m0ib6+kKiF7YtF8dK-?rl7l%ki3=jk^qQ_=cR!)S}A>pczb4 z;wP#%Wgb(@;HP}vlm$$KM~?*B!1U~Bc#BEao~--XB&friaukt%(*8~P8WTQg|EAnR zv=6?YH67>|CY)d1lsA~L?uF7LySna$vNlnUbI#}!4c?N0tivAimW*Y>74I!MnF;5* zx8yV?oa^3_xlGuCE962Ze4Ay3EMUSGTp^b-;d>e@J#s$26;7O?$@F58fvqqx^E5C&$Fr|4{Z~x-h0e@Q1RWCa7P7;QjJh z)_w9wZ2bfB1*S%08w4Ma6PTKhov8jHbC}}C_5qsBgx`?*NWR827<3=WWlU+1?x0-7 zG!=9Q5+cxF*W4OlG=SmdR{4%Q89B&GKW{v4v~t-#2up%7&k~ z>25asR4!pJ(=)unPRdnGIQN{C=c|0y0o@(1Vk_yZ^`FT=q8#V?jD}%f$VQr=oRL5s zi10f5_YKQs$TU5UN;9IvPRTr`Hcv!{eI?6@(6X}O85uAgEwjYIjJU9~GMOkBsB_pk zSww`EHyfUpm2CNOMpD=X89M{h<%^FqQo_EK6-2q>tBmxp?`6B0I`^+Ka>9O)JE~|- z*d=+eiWY@kk*BMuFzjd9c9tvMy0Bklw<_8mcGcB_HLgML`K^lZ-MQc74`g}XL+gGa z%5jE`YXiDlM0$7eyR0)CbI|+2-(?t)e$(uC`2g$ieYM}^gG~6o+V8R>Qx}+%uglI% zI4571{fTfL+aGpaP9V}{xhZqBj>>XV&gOKuBHWU1FyX9!OKu_3Ww|8}vJT5~OCDju zvfPrNFyR}Gf5^|6uq=Pb%S5^?f5=*MbZya#L)B$MFAn9$gzr8YDu76@#fG}Cik8(i zRR^M6@%xK*4XKKA(PzG>HNInAsl4ZEiXK0skx~gnxuWa%*BUuhI#G_mZy|cB(s^hJ zPn5%R@Sf@%Q~&X6eZABTCVcYUTLt84OVPKDM-3IrgwNB~R0&KY$3GfaOQkX4^R%_q z45sYyS5+NV$b`?#)>WlU2l~|syF-;TEf~M5k&pU?X~XzUjqXy`e4YDVD4DMcWI8o| zM7okW0@Y$JlrTmt)u@sBkm(JuY^+W*Z3oK;b&2Uiuxz57`MR8+fn}5mW%@qzyGBh_b0+6Ytpo2- zU6{gN`n6HC>dVybrS*aLs*y}jy<~*nr=~ECe`#xAbG49Z(MvVMTc}M;J6<~6sFm8o z^zlpn;rFZ0nJQlj4SzuW%;Y)YaHBTLcukixaKcs9R@G;^Z^FEK?Nk${EK=G;- zlRwboY7CKntFN0HM}#AwPk1*qt%_2@d#cxoF!$%6FPCVY7&qZX_;#o7LS4V<6HJdj zDuW1~m7XvWbeFWw`O$=y9#5&OOrK3?10)tH#Vle51U} zits_|VWt*cih$yo!Y9u08mxvf#ZJ7c2CGp_?Ln8KW;68!U5Z-3lmfaTY75f~pc|rg zG388bW)D>rOp7LN4j-!SejVFP@8E~3ZcMm?AF7^X!nzMtlbEpXL)AhitozgIZ6>Vy z)2fsS>z=BPF=5?P)#pU}ocPxMFm;Lud&ti4Vai#6WyuowPDPqpK!iKh-0(DYi!9;k z?@g;7O;fLvF2|WOsintr>P@D+No|0NbUHfoeqJ45!nyo;b(#o!U7~tkUDN5Phdi&s z7gMhTYSnP0>P&>|^iSdGDuW1q|6vlmi=mEaOXt~1@I^lLBNP6%K)R~8guFQMJJ#tc ziU__)3+Y}^nXLO`5`4E_y~Si_nI12wkC}Y4`h)Hprp8@vhL2G{FtzAnHXfsXB|7hc zyXLXVf2lrxxN9D(nlRz6IYY%U;jTGDb!5V~qQ|M>On9Wnsi{o3qaLT0G2xDSoZ7{N zJL+-jLn3%`I;)xeqWXlXeOA8Li>iVN-wYnFt~24A!Q)k(Wx8FSf^?ZGglROS%Tz6x zri1P!)sblt=w4D!F|7vO1T~y#E9fSuNlYJr4!&Q)^f~Azs<)W%-peFa%!Kz|CaHfg zU4e92>NBQWkSIk}Q)s?9? z=(1G`(RmLXM^n@oCLBjo)NHnV7SiRYcD2BoU53&&JbKFP#oX+)v>%RT}kc_>R)1 zbC1qcA=K+~#R#C;DoLlKcXM;q0H*$v4?A;JDpTs@<3J;|PkPULu1eQB$nVOXbJc_@ zs^2(I&E|BCyL4{+ntF|?MVH5cmNCuG?$vmKTE(;~`zfG}Oz&n7YP?WgVmgtX3S_;B zEiqYqpPi@{sa{0--Ty`EMJ9arf00_igrj4T+R22YW0CrTD94H8c9A;A^jkJsb}rO? z0)OXVkt$)5Q__HHzom6Gr@$366~z=f<@v_1t5=y~rn~@D$n+3c7AR|lPS;~fX5#`i zlxUw5zZg=WrZeHy$pW>SEpap!sO?NR8Vl56CLE26)hQ+%jf>UKOgI{sC}XA04@ct? z<;#Slaj9y|grjk(YQu!1ahZx|!qK=)4PwI4xLl27!qK=~y~2c}@eP&Fgro5dRm6m& z@lEwE6OP6=)iI_4&@P4QG*jA?e6K?FD^mvO-coXvu0sy!-ct3M@<6vjHDxLU-3s*x zQ!(gPs@_bcpj)X%GnIjEm72zM7IdrBDyGYzTdm$<^3H*)IO+rw-kDsZzG1>UlWWv1 zB0c)wR<&1SInR6G=zm*966H8?^cSfIm~iwLsRX8o9Qaa<8pQM<(m=;iFX6nt70a+8@OH_VoCs?8&o+{U+}p>{lqjBbQ_gp4fhGqZB+G`CV_5~ z3TK)Hx=kvMsQ`4FRad4W&}~)&nMy!ctVS^X19ZhIhv_8fwy60`--2$7dYkEY&}~&a znY>@g_u8sHVG4SsnY~S2WQqaZHu%WAF7>GJX7+Yfo2dinwySWaCn4Pq70WafbURcR zrWZi>j!I&h3c7dHb4;&;?p-yOX%*<+Ras11Kv$xsF})AE5|zhv1av#qVx})Zw^OZT zx&XReY6H{HpxdS1Vfq7f@2OIznp5+=-cv`I0;e{!cdO5sB0#rWog>oo{2q0M3FrAe z>UXxh57ND_?k&Pr((A+fsyUI~6TPnKe_hxgu**?XG)O z9L;sPV*aKMT|ZO}Xa>s_g`38AJ)jmcy|Zb3*N@b7remAF=z2&^(mBAdL2Pe)L``MF z`zuG(945TKazrg8n(Pdkw%zNf`jALJp>b4|G2s&$N7Y$Q*SO2B#>dnprWRdFfo`%T z&g{pP&sshHaArTQLWy#mxQZTEt(b5XJ+2;MOWbFjP<@$jpLIe#!-V^+GL^xE`>ZmR zLzLr;n%2zzSS@C1H!a`mWA!#$;y&vW^*$5svp!Krm~fxG14jSL0La876G&Q!1SakL{N#lj+>FiRw#LNTm0zU#de) z*q&diQ%u;NU#Uw>*q&dhYfO0jPOAp%tB>Dl)sYF?^Rybogzb4+O<}_JJgsICVfWSb(X0C=)P80nVN#`oRS-K%eMvH zIpxpP9dzHQNTvax`$n~8!d`b?b!Wm}cU}!=!rpU1Winy!xuE6~;W7HE@kRBv)&aHg z_)fi3Mc+35UY#exbEoZIKdNuF4vtujh#%DzrWRf90Q#LNzVl({C1q^Xb$F`taUd_I z3+??QE~`73%4dWC1-NuGn%P%W6Q*BhH3`o-Bs0;=_=^1sSZqDv+}*JsX#xp)syKa=x(XuOd+%3%B7mh z^zdxBR;iXUJq@}))J{#%LmEd2`*R|F)z-8tnD8oxY2RYPtD2_mD8_Q`bK+G^({?i9 zH{&eZiwM_;HXfGUK$COvoR%KaZo;%~P8%R_fnI9h{aa<;*fz|U1`9n2_?L^$p4 zoUU<~1fbqbExPmpN@0o^(#-a-H#6ZKX%Bl3k-m1}X`g4pncdU2w(yajGsnx*4rRJL z=c@9wn=su1otNE-$vgL|^0K=z;k6QPdlC~~EAh5>GvWPdZ~Km|x|Ohg-gZ1uuJF$t z2tRK#k4VpTHSKLoIM>y*KV-tWu9p276V7$D?6XXGrdZpqWWv2-ZM()c%unz6>e#_d zxaX^5w<6N(SY7*3CY({~+Jo5=&;RbQM=;^O;0}8nk=_aT*qKb&Cwy$5?bL#Bq@R!Q zvEzyKwV8T$84=Dek3`h7+Y#ZlnQrm*>`%3h)+#^yTPF1BXJ2Q+e&%Q2V#0prXUiSB zJ@HG0{{+cC=1M-?Iv^?_(W)=Q6;4fC<;Q0J{T`-suF| z$wZjLac7|Y43S>(g6z>%mTP^3?3b%(c0{l}mk6(ow)YOTUne>TS3}!-H?#|x@OOn8 z*=w2bmxLPI+nMl}gd%O{J6PK+@px{4cch&}lq-7Wz82BMP9@55?#^8qako8!>1gg+ zpm9uizbeYkVmh502{euAm)zorruJMW&$;gaz0MRo_eIznzsVFmcVb;Q^I&>t?w*Ky z>|&-qb3X*y$uxRyGdtSe%QSgzzE`w;SQE5hqKdIUt)jING4^@3JTmvYh&YbUPNRodk)hR^O^xI zWJ;aa%x-NjXBsyz->bE~hH2Wo=8^Z?o0yi(djRNNO;nZ#>W+pKHeVP_lLo2g&kaiDM}Y|jVnW=z~Op3U0`RLVN+1?}zgOnBVe z+ckIUmcVa)w6|lJu2Oz!Om*gm*K2PdV2YTJWwCbYbnWIh2VELdFVdZ48alr%=$gNW zmU_);Z}(!tHK)D(98r!lozksh%9_6oO09P59Hx`59n-S;gP@$NnDASc?QO>%ZHeEq zY;SuK={f6RyHynx-}SJ)LR*SW^Y=t{u#2l`Ut~wSjOl~<2O~S#=c?%A$S!u%_b~_j zD%PQT@%BI>{pG92?Zr&^4V%a9V@#zPUqwD{U#y}Fk=^Xj52&1?G~>s}?sf;JPv`#{ z+0#zni@IF#>3q?or=81mdVWRi1bYJ!e2@D63z5BSb01nxhLxnUVWM59if%T1(hjbo z?;9rBO^I?v+Wp_x>20@R`f>jEb^6$kG5rSgl--v}=GSSGY^O8T&9C32pPfepU)0YJ zYtr9dQbkcs2H5+msAZEu_R%V8*JQ9=Sw-bi&J_i8fK?p#F!o21&~t7v$W zVfLyj8q?$%`->`?*d)!i_q)7IZ}Oa7r;75LJa4yQ>eF*slaY2p70vV;Wxq%?*|`yZ zoo}?AtqFdSWMz}lwsk<=};m*an{n_-_L$`aF~;X6^b z?>{hIzDUkL-ejB|S4HJb#@qEiLS3#HmVdsnQR9TVY(W3XWQ|tTaoX3caA-pD2Kk1I?c|i zqKS2<+jFXD(Va8wgH`m#owMwLG{WJ#sGHWu&#`}F^51+jey%-`#&oV|zPamTdG-;e z(VNFUmTxbnahogFZQlFX0=or`P59lb&3`<$$X?78R{YrG1$I3e4{&$2IP38xc5kL7 z#d{xLX3uB(s<`eGZ`fVw80CsPx2=4l(7s0H+(%#WU148m!d=h`+c<>nvd@X%WL{}Y zBE1V*X$NS6^SEoFtL!i)eA8u>-IVF@!j>MZ?dD8hENlbRnMmKgT4V2J9p1fKV_##s zxNxjmV}~Bb+;g1Q7QO-0gvq&RqI%oz$#mDEK0v8VVT)k@VDD#YvFPE3MRx2F?WH5> z@|cnqZHp|juQH{QF7~Ll9J^?9c#-`Y6FyO1WS238jrjELBD>u&Z8@3JEn~`EbOv1+N)b|n*D^DnaNp1^c^E-$iMGT~faWcMP{SKW*37n$&? zdy&0>D94HK{1n+Mned&TB6}wjUg=(IA7sKS-D~Z$O!&^vI{OL}zVoxrw##%K@SUIa z_FYW)&d+)~iV5HO*6`Ppv2!h~1Wci0P=@XGoQdlM7B^Ye~f%7pLy zyknmt(pTNzwJ$N@nbfs&AZDU z!Gz!D-DSVZgzp2rXBRNx`#|s6Tbb~EpxyQ%CVU@gxBWd6z7Mp=Ha^uQ!}o#q*da{# zKG6I2y-fH%(ED~*B7HXaf!&u0&jvrR$FL>d0VuVnGT|M7QhPa50gR))b}5mbiT2td zCo%VZPW(RmUb__&J{P;!ev%3A+wZme5b0~pd+n#0@SJk5J%R}5tY7ZlXD_d!TX!F@ zi;3{Oai`BA`$3v}@D5|AZinn-nnQ9$=C=9Wj@a)pz!W(|0+9CRn_=}hl$ zlifeIBWRw;6(_g#?Ea~}pXs}8uXX>-Zb|b*uDA~AzOY|os%=7L-ix_y4P zuk680_iw+i#~FJYl@oVex9PRAC1&;rZW>b{Y|$|E=}?(LTb|3+R%4gD3}fRu>{K+X0_bpP+r#6}vqVz7>7z zuAlAhMDs*yLC2^{zN+$pJ+9zTyk^t;{e3*FD&E|~6f(@tU9 zTF}ztrahTy57Ba_e-ORL^a;@^rmu*uGkr_sSFUsTiKr#h4WeF5_F~L$G*ca-xl92> z8=1n1jxxm%U1EwOs(DK1*NLbpQxBqerhY`vFbyM`rit3~rkzLhfq^Y}%Z~UGeP)Td zix1Tk&Z$f*fehylM7iSK#oyPloVzJquE^NFqla`}A{~x^TX)&cYed?o(^>l~DyKNK z*z+z==We1bae8rUAfMAZzblY~r!$f$-`R1=kSK3wTO$3N&)&}VO!%A6-p-Cp_?yq( z&dx;GL*Vz4o!yAAEYE|NXR2tXcMaz(Z3%T~=3UddiRc3Zf7`gWa|e;W%2CI;n+f~w z9nKG#=+~2-hnesy$DPiPneci@J!d%)T-R7KDay}zovHtlSEA}W1I}P=bH(r_v!Vi> zNlec#nI9G8JomNMT1VfQXzrZf5;Eua z*qb{SYZ9YYc5*g%CeT?A{O0qP=bvcdEMUUlU~b_oWWwK4Zs9y#ius-Kn7w7EPYdTo zO^#Dr;QLF?%S^^rr0Bic5`Uk$g|ihA9=|@Idy*(ij0MY`d5c_43^3e#?tEeL!lVyNA)9}V*J%yW3AEZ$=Vef;e-1xRKGB;)JmnT1PB9yxMuu2^4{CKx zwKT+Nurb9%vYbIOp&?r4QMl<)3hfS-hB&a)0Ifbc)kn&tcuVNq z@%S2ie6>wOC>7dZNpy_v1OI*46j&-t+@Q4Xed*7_SAsB?KhxeGua=>`?uWXkp)|xV zc)j{n~ZW1n;g?K99VFWvKXyzc)Pc3HZY+`Y8!wfMhNa;&4l zquV{K`|#~Cw;#dVW3WFPqLEvRl~MadL5wS}KWj1fR&sB>|2r*qdwq3`F0Gc;qu%(Z zv2c5QEVa^^Fzi2VDC{oL-r#thR%_c+OLiuE9j|Ad+Uo^#OtzYFVip*N+yy>_|` z?(sTDT?QRK6^Z57b@@9vy4(C`sRmKKQmD*BN$MUooZ_FO827My`EL*RYKG-^kJo)T zo&3B^awf@zAYHSop0~B-GKe)E^ey%@8fVs!Wzg-<<< z9+t%zAU7<7l~`1JaPZ9kXKCHb|2Fg-^n@(0-n7Jg4fdeJS4gY(39pa9l3axtLumW!q}4GxY%fQf+9Y@O#;{K7?m_#} zF@IK0y~64l7^Ok^I%qX`Rn?;Gx6KPZDCf~X|bVN*2xFJmkb@fYz@H2rV2O5FQ5 zZEVpJES(|_q=$HjQr$iZ{!YxFwVpoK`WW4A^Jnoo6&^K1O!CEJ_Xw2D5c)Xkus$w2 zJO_Hd%LaRtD~zkEDRd0>Qdj)0N!9V%!=I%>tt%C-HLkF`JjcySE_~XOMm7$ zpi6Zw7&dth(VmmQgDKo?s$;BwvUIokpZL+oLg(%t?(5bv7xz$?jU(ZzTHah-&n88e%dGxq*`PVJkbRPO?IuB>Ir^`IZSye1vb^-NfOHem=H zgL)3fw74SZwLq6m=cq@Vk%z4`4%!pWEP7Br0fwQb)SkNhx^3U5RpWMv{$2LfVUy4Dbj&s?gD%NmOWiW=Jz*#L-%lRgcPuCko-uTxrH75bWhg1K7IAWee74yONO|IMwU*cd-7G9>u{X9 zW+xr5kCA(+>e1{SN_B}Hg{|~79VuNB?MK^3kd2o2QL6f|XEy1&kZT>$y9k|1OB@%5 zkdI~tIOc7 zy_d8Ts`kL{$Ijp@PH686ccr@Pn)aj;CX>|XmD+P4_;j_&AhO5fWeS|fEP);*ub9~x zXo>cQc#lemehe|R%BMl893p~jbS~Heu5%n6Af zqg~~3h?gn8S{fp+DtA|F=n^hs0kAmA2nhmDUhCtZS;} zF4AI2T;tchRJ%#5OQ^>(=H)um*E^+BveDi?r6c9ui?Fn=d06)=eFYLnfhly4#jwF) zJ;P|r+okq@h;r1k5YGH2uMs*%pE>Gq8q6v%x@m5SqSfRhxZ>*CLFqZieFxC~soZ1!+WudU0_-v9Sm>Gm_VaE%!|OA2EkCX5fv&m8 zy;pqm2JS*H{g*bbHO1XthjqWz{aKGq9Y*axr_v(}XBF2~h1LZx3!S4*t7m3C;v8>czt!=2uEsMg*9@usYfEk81baj5npB-id)89V*wxZi z>$@lyl()yY<{$Sv8ak|Nt;?W&>XPe{pmbfI)N_}fh1^S`XZ{A1Zy1$9kKzN5VEJ`F z(f+G_Iz)R~J@x#9magmh+Qxk+rt{S$=>pf0bW0lI&%*9$akg=lUwhWx+$HW~;XV|V zT!&jw*uB2G)>>*mAJWk|HU`Vnk?a@J9Hnde7{nO7+pG@5*$UWL|8xyd??|;wpj0o# zqfb4WP`YMdz2`*fiqYqHTHda8Z-+jUt5e@;*q{Str^UbS1>(^Do^u+`Z}WOXS%Vj~;Hf)G<@Yr#?oyBp5aY*4+}* zs!He@1@4ww>%J4i-srmKroHK_0lJT2d0c*UjJCnBDe|iFg8dkUwYTc{KTGR6M%CWj zV_e}NI(GUvE+hXq7a2mAqV2aaMHgKi$Ln=xaZimutq>G3e6}sdOBxrNR4ZoO@k9-NX6_>Yk(h{LiH>o1SN? z!>0JgtsVY4m+F4#n(?siuJB){{WGmzVRd1)Bd~hx<=Jw-y!s##C>J_nU0IL)HAAHJ$2aK1BP9z zus%=GmilFcn2j(DxcA@Ev_A#~VX`)6sjH$1n+nIB8;3S-P) zYrBs|dwmA&>d*gu%*%9Uq03VrYGeo<)>jxl2tW@y23x=t)@_2;J7>Zm-3k#o)|fhz>Ne^!{91>X}xD zbqSyN%NEc_C;2aJ+{@rzYwa1Y1GtX$?PaJgi9>YA#qomjKb;i^Q8~5Lp8r}7|J(KY zYd?QStM9+)^J{%K!F8^U>xe!suK4ORI~{ZCVQd+F&OV09tkYKS!1XGlZ5%?|yRS8_ z6&C%t$KyGOKKFF+8B?{T>&!*l>v^yG{77F>ciH@BsobwZ>)qqaR6Be^L!V`v;^o5X z`_a00={trxtnYJS7|teOR&nr?PXG1YK)C8V0XbcrIUSBc89u7}d!xc`4SPX6AI`7sox2JOV;2s`Idwchu_Sb3k^;LaG z=1dsotMBCMCprJl8K1iiKCj|>3f(=dbJ2I8^xfWn4eL8)uC#g-<8$V4H*FraiH>;- zTE-MRsLx=$AsPf%YxOhjXydZqOZIp#!{R4B^qx(ZA#iJL5hv;h1%ICKR}=pH;4cvV zLPcHrzbVKV5d?M(;NM2@7snJQ!o?$^iRdQc9Nposr|1BG_-|)NBK-R#{3VGb_)CVr zI7eUj>nGCTFU~Pc+$&~^xniE^43D$KIp&LQ#(enqb@*E%(v3IZ?=6UX3wQ*$YKzI#=*Fe5+Lw;{Vcpdz0fWIB0+;~@9G)mxaFX;9{+&QaH~hsp4nf=@h&u%3J_LLObVq=Xfc^;Zarip{d;;Q6K->x7 z&mhfb5ce6xeFl6A>Uj$O{TkxFhJPzSUjg9?@L2);Gqm^5(B3~od;bjW{WG-pby3s2 zPXE@0f13iw2p=&R-fD^wuanf_TVb|$jIbMdd$$&qVG~trf#3UUE%1H#7*W%w3uy5R z=`mtg_~Q`%FdSo!gnNU0Co~UiK7lVuw-(=o_w;^9w1u~I0zjsE_ZAo7otxzjd~<3w z$m7n9BzKV912W(10ELf{{EXxolHZcN0O@Mb46HAfa(}U?Srz9ilXBf zMaMCg;!*Zd$Bh1~Ux^+G_H&|(sFjLIUJ+TVH>0;M??(4_%v-%D`ddmh(s+IKJ_zIY zkiHd-A8mctx8lA>+k$*!wdwJ#C|=!PU4fFUsc}V|Zu&7;VtFvtDe$vz^*NBIn^u4< z&G;4kmx0Z1#)Z|+7__+qQ^47|C)jr4|DN~H)6_2TSnS4(vCEOdrwp&jfQJB#5h3PU)3?Ohm16uuK6IQ z+|jFfws*OsPjhFja}++u;r`8iYE@871;tc2bWBR~2DK_FzLMfADZbL7r%Cz(kyn`A7FqgWbop(cI@ zKhn%Ddbh?5N;`wnb|9M$G|I3iyxcs-#IYG;t}mJm;T=W$oiXM=ieMIk`26NwNc#{R z$JNdK96oCw4}QqeVC|OX4>|4&jILK;;OIUe?rwar`8epe6YGu>cdvah{EXth~-r^PHL`3A|AB>RvoBH5qhm(8=-&)oQp>Wm2P{fZh$B^f8)@g1$k ziN(G{ppU`t{InP+HuydZHdEqXf%qlS_e0F*z7rvQ$ycY!Xfe{9w01hkSABCq=B-`O zVw|~n?Q9ieoL*bm)ZsX{*7PVeF0X}eKY-6fRRl*Zz`KZAtcY3<uUx(b_UGmku1IE;aG_Gt`%qE=!-LP^hKFC>qe1%9BHFW93vx* z(=f_XAm2oVvJXf+3LVHY9^_hIl(QoeKn{Xljanbd#fN;ZHd{9hd%%ahC6hhM*%2vZ zUrzRE5QeY#lNROdh)mL!kv5yW&7jiGpwb?s@*HF>mb`%4wt(6;o4m~c>0K+^#C16j z!fSm|&W!*6hQmriuQ&|?)0)4`p?-uU0jzRdi)8T;it0As0$DO#h zIqt0ExbUdy;RC4#)kvoGD_Pvv`xmcdaoP{}08M(gX_riEYZ^SWn(duN;dHV|C;N1Y z$)uP73wvyUg*`UF!ebO*;d&8Z;d&8Z;d+rtsWK^5Hl+%qRAH1Vj8bKjO*YxgAe$(% zi6WaQvWX(kQRF#_JkOw1GbmLarHZ9gv6L#7Qst3N9@!L-O#y}DEUa}0vhP6l9mqb; z!Zp26wCz0tZi`@h7E!o}!o?IWrf@uYNFWahl%M`LqA?m%p=P@vdp9QpF#E&WM4t{mDEoP$i9H=3&_5J>zceH^`6Wz++lO zeu~IX5&5wkcuXxA1u#0urkHGs$)=cWiYc#R%FCPVy~*B(>`TbLgzQVmzJ%<3$kK-_ z1IV(JEKA9&%9KyKjjaWYsbR=p#<&rwVv+1wC12G^j26uv>)63~X%@*(>hN-ngY*71so zUy`h}@ErVxbun_P_iyHr^+7Sc1%5jt(oqJxAcyti`u954vGB|#(qV5HtNg4+8*rBr zx8d`S4h!uotX<)lBbK~^YBADybVKMPxJL@Oqr0(Ws7J_1%d0rAD{5$|(N*jjw{`pdqU};aUkZ1GR}aw25~u zT&WY455x?r5kS&{qn4<`IE-s?rHL|%Vq!tgjfta@$4T7b#7W!TSd-eNZR8A$zP zn00CE%TElm9NQ+UD6))IJ)2Gp}98L^l-wP z*+g(FtUn zhzHqDbO+f%B!cWLo&p&!27v4)hJZ{E!$BsA=RqdJwP&XoAjW}A5febBipe0;#8i+Y z#7vOsVlK!G@fyfXQ2=t1SPn8DCqZryr$82qvmm#N3m{8G1<2jv3dmCNE6DxgI>>`?E5Ip^3JJ1Ic!E4B zYJn_=Yt2q^TKIuHCxSp;6b(UEhzO9EMN^QK;$D!~L`#r2L>x%rcnGBBcm$-=(G{e( zqZ`QDj$R;r9DP9gI{JeQaHN0?aSQ_)=6DWdgkvp>;ReK*ab4x@d3y*$9|9_ z9EU)rJC1|QaC{0f(@_p`lH&}>Y{z+!Qyt%foZ+|(a*pE{ka>>ZK`wCo0kXhhS?f_Zj@CCWS5eTx_(E#LjM`MsBjwq139WfwF9W6lacRT>{prakgqmGUs z%N&n_Jn47>WVs^&!7|0IBCm=f;Ux17^PJ`@bd;>DU_zq-}aS3FyQ3-N@@f%3EmIgA_FeS9V z;RHFtr~xwFs0%W~s0T9B2mm?B2nCsKgoB)F+zoPu5e;&V(Hvx+aX-ifMq7{tMhB3~ zj4mJxjmJT*GJ1k6GLk@UF#3WlHU@#*ZafXL#7G0V+ZYM5)EEPDzcC)1%!kGQd0sGQ|8AWSIFQ$O!XikWuC}kkRH%kg=wrp#4o7 zWSr>@vYlB6WC!yuke$u?AmhytkloBiAQMdZ{Z)}<-UBk(j0HKsYz;ESd=O-+`7p>d zvopvM=3^i?m^ecgn>a(3Psczb&XO9iMd-6b9YM2(OaVD+7k2ik?7f1 zqUQjKorc=Hdly4^GJBjkmrhKPTzB4G_Ih1c6<-36LEuegt zQND!|*PvAr*PtSaYtROXYf!PoHE6q>3bI7v8nj#D8dNHA4f65CR`T`4RtoUMRtoXN zRtodPR*LY%R*Le(R*Lq-R*Ln+R%+#mtrX{pt<=sFTd9L*Cqs&O&+M8~bo0ysncz7U zWRmAJkjb7iKo0Pn1v15R4#-r`xggU#^FWU9%mzB>C?GX z(m&}L zz>Rt9fG6f13p_P%6Yz|@lY!^tZ3dp7cTPTLio6Sem*-sy&XmzPzL1(e`Z?rn*629} zAyqzlK|!vXH@Y5lC1}hqqpAO2JevCd<)f+pZy8Pff9q)K|JRSE{(sYG>i@Tnrv87& zXzKrWkEZ^A|7hy}+eTCWe`GXCiN{Bilz4hHNr^v=UXFC9?3@przBAR&tev-wM;>;j zoXp$#QP7n;KM7pKu8liC54vUNm&PL}V=hH0wv3^&Y#sCay%7Hx%ID)_^1T7|?U;S` z4k(qsA8=IuWMD9V3NSB!8ZbY925?+{DX=KN9JqUa1#qwY1;BmttAGdO*8->HHvp&S zF9y!aZ`wPgF3zWXUY<{>e9SR#&;Qjv0rgcrrT8tUsKU2_Gb&6e2E!D8UiglEAW6b3 zNy1cNCQS9YK1}s_Y?$hEW0>mm#4y$8sbQ+mGs0A#=Y**~ z&kvJKyEsg`@#Wzgfm^~)0Jnx;1zsN}Ieb%?r0%U@l6!ZAN$%YpCb@Tim?Yk|FiE^e z!X)t?50k`uI!s#kpTeYdKOepm_+t28;49$=fkWX(fd2?T2YfgD2JnOMJHU^_9{{(9 zFUtw2W5-gRY#h6JzkoV%>{-B@#!_wH%KSUVQeE9WmRjfjvD7--#!_89GL~BB@v+o8 zPmjF=G5l%ls|fr2*dgGHW8Vb6!f_6beH-*YIOcc9z6bh)u^#|G9{UmSfC5TuN&)3z zdI6<1tANrfFQByM6;N801(a580j0I5fYNF#ptM>FD6RGaO6$-9itWc7&kCly3aCUq z1yrKmg30>_RDS{GBvU}GyuN^Pa%{mA@HZBGupcB_0ZGC$3P=*3Q$UjN`~s4M7Z;Eu zyu5%U;g*7}JEJU|w|6->sbDp;||0~Y(w~T5Wm21>E%5!iWw)LI4b)*cCF+XYB^LR`)pyK?dxq^LmaVkCIsJy-7 zUO^czX8)IuqdMHeF>K|q*K^pLn13th=ZM|HSu+_&I7GLCBU@p0dS zetMku0JJ!#^*rb5#c@7xUg30yINj}>%2yo2w;WcDr?QV4UvmKF-|;lQW{s!uRX%<^ z#%bmFVqh&ekRjke17z0~OwXG@{wpVt|Jn)Ux@ZE8#1`haGyhQL|Csq*%;{lH?*tl^ z{S($5gwZ;I#@(?KXl1u?!m;3-IAI%P)Tt9Tfj(oxlc3M%I4|ZHF6S7wGUs~c+{Bz) zkxEG2J%RFkKU_m<8(c%`5x9ob zPB;Si0rD17A2WYD(_c;4JSwEVMGiws6&`y~NR2Ao1Pm4~fYi+^B&nNUcn&z@3Mmgo zg%^O{y>K0Hufj`#`xagaJfLtZa7y6~2cZuaQV-u+NIm@eLh9i+6;cnswUB!F9fdU4 z-(5&^{r!bB*KaGNx&Dztn(H4gq`Cg-LYnLUR7i9E^My3mzgS3f{VRnu*AEraT>p^+nYB#}-lRZ!97?d}0yF;Zuu94xdp(a`>DgYVq@nNDg0IL~{7@ zB9g;fibxJ`Euwkt`XZXwZYmU z4iWS0L&^M1eRkMBUZu|SPMVI6%4R1_%Eto9RonDqCegs;@* z3T#iv0=vby_YsCwYfr@8@0Jbo7=QGq)jznr>o5s+T5tkE!y0s%^_{7 z1v*`AR%&yFHaBW>i#CU}xz|FSo;Fu#b0bV@hb`LNrp+O3VoQ+S_tIviHdknKqc+u1 z;;$+uW>lM-w0V^_AJXRQ+VtSdT}pqFHmkI`v0L~<+MKjT?3)I}+;WVV+q5~P&5av{ z|N8M_Mo$#ebBdUgEb{`fUv;sV4{0;{bFpvI=2hB!NSm)~v+4%%7rj;c*XC8)d`O$G zYtwU^_?x87Ds4u!xk;N>X>;4%;(th+Rrl%iw7E%}S84MhZ4PPkb!}o}lefn=Jmr;=d9br_?Shw7KOUV&C|Im|L{D;@_ID%`Mv8rp+PC%=2)38}|}(i#E4u zb4Z(NlDO}s%}Q;q(B?*MZqep8%YCYjUz=OBxlNlx+Em3ler;B2bA>iHYIBP=x6Ks) zmE|7QwkzsGn_INGO`B?txbLM+kNVE9)Yr;`J#VG{tdjMsJN2ol z&rbcz)K{ned+L(nLyM0p?kZkiyt(+C;tPs@Q~W~l-;3WYe!uwR;;)OJ3i_t)G%Y-> zaN6F}4w$xJ+LCEUPV1j`+_axfyLH-~)9#%%%KPNBH>Uk-+BegRrZ-P-pWZip?eycO zUpW2g>EBM@xn!4;$t4vf%_Z$6hnGZ4;w8tF+*xv8N!g6H867jaXQXDFHsiN5*3GJFu*z zth#JTSzFoRWu0Xk%C0K=W!dAwUzgoo_DI>2WiA>@l+^ z%-(1Aiv`@`9J;jq~rB|GW9m z%>V0r&w{B7<}FyVpl!jb1sfKeyx@Wb*DQEo!Sf5gTHsw6UbyGN$qP#t_AESR;iU_I zx$uF7Pb~cN!WS2Qvha(A|E^NidDXjBPpxjM{z>(w>Mhm3s@_)pr|Orh->Lq(I#9Dq z&6Ju2HH&MGs99B$s##xiLd~T$H`Q#b`F+i^H80k@SMyQL7d4}63u^bOom@M;wybtx zZFB8WwLhs{Q+s^v&ujl$`)2LGYkhTN>UOJ}RChq#%(_V3+PdTG&Z+xl-S6w3t$VfZ zMyFlqJC@r&GpaJzgYiT{oD1v zh8Yd>8+sbfZn&l4&W3Fbe{R@kQPrX!FUl->aZx1F8aXP`6B&xU9r-8{TDsX{^{a#7yo?mD~mHrCN@rQtZ6)>@w3LNru&+{ZmL;&YV%pm=QUr|{7Lh7&7)g( zZP~A7N=tRi=9b98FCRR)bzSSlt=F{P-uj=`oVIY=)V9jDWo`X!r?p+tb{Js?A zOdX-F!AaLI;rk}|{*~%b52#M{Tby`3h>+V4jqxdr8KlmzRCwz&qv-btHr}r;v zy7xt#fxM*3ynn-K$E$SKp_;v~t7YCd)ZyMY)luH})CTVdYLoXPb(i-u^`!S3oW$XG zPWHS5+UA23gU~J8LwUf5Cx(H~PMiSz+r-^~?@inbxZk8^;55cE#%ji9#=|GI!?kPD z;lPI`ZQRL<`9{woXsh?^-2{ASZ;Ihb#@~Am2Is@QR{+1+y9*fK_i14NzLcNi7*F1p zT+iM2&%i79eGzyQa~|6Fbs;j58RoQxl=Nzc-C)<0Hn;rcti`Gp!tavs@;9<-Ui( zRcdD5bjn-9bgCJtAIa?(CDaNzGbr5&Gbqj~#>fuv;L`7~c6c<$JBDg(mwcrbS5T-! ztLKeVs*^EMO`JtJl$NA2t%g!Buc5Srf6pB9b9U(xgsQJ0da#`EGNy$iuD8}i;b-^U z)wa*}&^plZeF-K0YwIZfTkD)S@2?}*R~Wymqp%XQ#P+V|VQ|Xp$-m@Ea#+QjX2!!9 zyBK>JH!z;dxRp_A>@KGFpG&c=8}kHWo|!`>HS;DZN{J*bDX;jS)bLM)n$ke6P|`s0 zNLkF8(bzJvb_?DKKPp@y+o%Y8WYMxewm^?dT8+rT+%5!Lf0i)g$^D2c%x zmg3)9@iqJxjrksUMuc*50pp!zdrz?VlXor#EqN21zl6fR9!Y|~wPFBRw}isBGR7I# zGj3f(lHs%^gc6VB_Th=gAe6`r$+^&nEvNo=;+V?alsaNI)sOT~p#|^lq`V2f5ucbWc@F_0ks1jhXts~8Vw>}EWgaWmt2j8`)LlJR!NhZvt^ ze2MWb#_fzMNvVuw+@EnKqm*SqKh;uWKl%Btg>ZTQ;mH4yjHavb#gDiathow4cU?oF zrmwjUw2buj5XGsA9XZ*t<`KBQvF00~#Q7nI`kFDE^6X>fVR$O0^!WeYjxv5_JW37x zaGXCZTg*Ntv5DM}_&-Ted8LO)|1{H*o+%PZdYajLC59x=faM(aE4e+N1=NTEcM3oRv*vWPSmDJ^q> zlXbJ2bzV;=|Jd?d;98#fT%&G_gBs-G7& zJOfv=jfTe{Gwd%mIw?x7ZaJP}5FPJ<}UFk(N`l>ZX5A$KKcgGrq1wxE!PH)^AyH&8Lwcxf$?@m zk=tf@pJKi#nO|kj8;tKWe$MDQjq;hxSj4y=V<}@TV>9DXjNOd=jO!UUGHzy+TKyT* z(l_G!K7|?(Y1V!^>B%yGZLN3~e6v2KbS4e*rJ@YT8Q?D~)leChXslS== zn5mett=~*#KaTMP#?u)uW|aI$9=2A@IDj-C>L+KHmV@4WHif;A@jAvk8Gq0CA;<7M z({C|;&KNj{LhZ^pm2m-M3uBVe9J4aIMU#B+94fD9AX_VrMjk}wo27eUJ&odn&LuQQ zu_^z}nlVSTlvi3%+HSZEk^G2$EBO@dOIqQCou5IjMD7jcJ`ei5pZyKE*fE4`O=WMSY+}PhNZx%{Xn$m)esRf#`MDT}o{#((=|zX?=J9rPO=h zYo>Hp9Zj=jbScpd9RKexCA#=%lFXu6E$`oHic(Ls5dW^D$APx=s69dNNOqYL>Hkk1 zQndH~MU#A%ODZ*Hu8E{)N-sV33et)v=TjZ_%p&Y#9AJEt>-Igy4;i;Je#7XwjQj@~ zcV-;VxI5#aj2(;@b8IJELH?V6z81AQd|iL?Z)iTH^?Oi#GRlknrB8ug>=Wf+2P%c% zHt?!7Ko9OS2SBHR9<^45Ko0=%OGYXe^g6~t>{WTx(TvApzY6aSGX4~MRvxv1ag! z7=NSo0p~8pd+-j4SKZBcFLuT}IF}@RKure!exL`tSOYee6NdRg5*BW5B5f;*D<4aiD8~9@XI40JwOmZGwert zaf1B<@Ow4A^cC2t^s1kG z-vVCgeFwM&`0_$?|R>cRU7@LKF=;`gC|Ufity9C(BGOW-fP zUjuK%PA7hc#rq%N&ED^Uzw&xKUUiE%2Y9R32fWQ20RGw=0^aV;1>WHu4ZPPo26&%0 z?D61Mb{O;n-U86SW!&Z+56**(4|xkg|IWJ$@L}(6z(>4$03Y*C1U~Ma1bo7~5AaFv zj}XICKre1|?+^TgcQWu9??J#ndZz;a?41UD&RYU}-a8Zcg0~d-7w>F@{VNb7+B*mI z-@Fx|Ut)aOJ0J8b-i5$dy;X4iJJ73M^VR@|ymi3Wy$!%Oyb-v5>Rkf*6UNWHP2g+? zVmx~B$&UKcdobuPfFAX=w+-}HKo4$@F9ZDz=t4IJ;g2K)&? zjCbF4z#`ub;OqkQs$G3Ig5C}2#m(@WfqVFF0q*I$4g85fFYb!p4y^Ot3GDUV1%4l6 z(svIy3C4ckec-PFLN56p0H%Epf|CJamh?RYdMyxg#`iGj^*~51-=m<9W<1vS7&yl; z9_M=k{GS57YJ=}7&>Mk}Y`#B$KA!PJ-ygv_f$=2Yv*4f1c&hI?@J|7H)akw#K%d6A z+4om)&H!TG^t}Z7EFdJ3?`6>E03nfluY&#=5E9Av8tC(ZkVwAQL0<@jEb_ex`eGm? zlJ70hmjWS?eD8q190-Zzdk^%_fsjbP_d#y~LL&M81^O32NF?7!ptk}ck$j(kz82_J z*ZDpJeLWBo$@e+vUjiYKd|v`@^?ePz&G!xP*S`M%Z})u0Pr4P2zW2<>SNybjfT$$fSC7vV}K9(!oY350^sAg!w;F`D+E5}+XeWvZ#UpG zzC94?k3g^b6YlnV)w8}yz(4!;0Y2yZ5%786{=gS-+aEH=cM$NezNx?$ebaz1`AUHQ z!2N&d13<5O+gA$u9iUge>zfVwJs@-g-yGokz6#(6_(s5^{sr`^4}A+kf9$IQ{So6Q zz8Y{o1$xzIzB=G`d`EzHp@EP>z6kJ3-xA_#Pm} zrhgeQ$A1WLl>acG&wm8a?>`b4@OJ=%{wOfy??kAb81wuwaB>+(`@2E!?2iM-_*VnR z`}=?s{7LvP1Y!*0tr?6#AjY6S4SF{q#-M)y^d3NrLH|0?6B#G@2f^8kac}=Ip!e|~ z2i(`c0r(^TCg1`76M&QbCjk%ip8`C{e;RO#e=~5Z|4d-9|7_qi|GB{F{_}t{{1*Uc z`Y!^`@?U}!OMzZh=D!R$+kXYH+3OM-vji&{S$#6e7lQT9*B_@*awIYYrzQsF`5GV14Dty z;Oqp%I0_sDIuD5XE-)4J&OnT&z%1Rv_&IO$boCh2TTmW1fxCpo|a0zgI;4V;80ubXaa5LzWfLL({ZUKD?5bKw~ZJLG1nvQSF5`KD`@s1b4)l$THwRt-=O)Hq1^x>DEkHZ&078}qXMzqf<_1f_$z$9(I2-)YjAMdxz|RLlq6RBKj|F0-5S$OX2nfj;TnKts zAS7q73iR$k$jo33=skg083pS=?*)Y93^st?8wf2W7y-R65L!xb3F!TRUbTO)3G@L# zNYr36=mUY!Sb_(Go&to%5^Muq41~N5E(1NCaYpbEa7q|w1`h*&7SO9ogGYca143^J z9tpY}2)!lP0eUVF@-`R+&JT717X)MAF9dp3Ww0Aq9mG2nss;#+CAb>c5bOhI5fIWf zm;}8T2pFI4wZP)!-noHFylLEqENTJ-7k5Jh%yd4q-ej zcmgK6voqnH-K|G5UZ--jiAp0LO%)K4Eh`(R#m}UK>rMgRaNjd(B}i8 zw*+qoeIXEfOYlz6mjbbp3f=|!av)Yx!FxdeoN-I=K5(vN{6+8q@V5pZ1m|iXR!_l) zKwranUGQOWt_NZb6?_!*FM-gDf{%f|iSbv#C&0Ox@s{9Ipl=QS0j{?JA^n1X1l}He z7I;VSIpCea7l6MB{uOvv@Fn2g!Iy#e1YZT-8+;9TU+{I{{lPbZ4+P%={xW+8d3?}(LODKYK0xR^As^@oK*Q-Q^yX~1cr5~MpFh%p+OtWYU9GZ{-mv%xQ8EDy~Ae>MOj{5p)Z9RK-U8?qC*kTi+~u>p(UUf z12LjQO`sbYmxh|bX<}>+9SnX85F0#}A&z|K%NuqzY?#zL#%r#sXKdKKfz zp(N;2LTiAhhSI>(LIc3lL+gN>LxaFGLdO8l3>^nNE3^T4c4!muoX`otb3-Qqe-=6g zcwXo<;Q67=zzafW0xt}m4ZJ9HF7V>edBClq3xL;zE&^T~x&(M#=rZ7=p(}uohpzO6 z)!#iiINuoZ_<(PC0>FQGLcq5@xxjZlqk;eQi~)Y&2?L9~1;Aas1Fl3 zyt@JS_RktGxdC5cAL#p~N&!DpiwkmaqR?3211>EH;0^Ip3l8ypqfRc^2lR;r zXZycVrx%%@HtvFmoRUGf#ti$Qe#p-&T zuKWRKCI7^$F+R_D&pw_5J##&aJ%@W%drt6RH{Nrf=V{NYp0_;z@_g?3)^pNSZ}Ifv zOz|znj}(7jylC1_rX4iBc>3YfubF<+^cf{pC7VmGFL|=$`I4cM4@pPd<+6`oZwYt^iu&l;MQUwUZiuS*{--F~*s*n%!7_R{3@1 z50rmbK4s3VIkj`npYzO|cjtUF$2WK8+{(F&<~}y}^|}9?TUW8P;-?koR9sT=bj7O` z_4AtNrRH5Q@0xl3`8&_Ao&WayFXtb*;EDxzE_iyu&lcXX@JE$Rl}A*rs$5&Ssq);) z%PViHysPrj%4aHHs{BXg_R8-o^Q(5RnpRa=wWR9Ms;;U(RSi{rRP}l7QFTAB+gkVg z`rR8YUUcuGZx`(uDT^$OoEq5{DPFv2@#%{nS^VwdDNBx8a?z5mjY1 zTF+^Hwe?4B{f8^;WT+byb~1vmL9X~mZN$AZoYeV&bi4e`Da&){t$*haG8Fe%vw5?x zCEi%H`I&g9=puC?&ZIuViPT5xOPmLOjW+%_{=dN~7ya#xugl5YSDU@+ANiD8uX>01 z32jfnj{R@kIR7W}`!&B`^ZUU^_Ry#P#qKHXp3?3q?Vf@=l_7<%*J0pvQqs$4e;MsB zqy1&z&&U2gWB+Tl|FzoxTJ3+W_P*L_E9ivFWjD!Tf99dzj!FT0A@Y@znFHl8aw?l zRXzQSoa*V@bGA&M?O9xsmy^W*K*>;e-6@d^7(44tn2NL*ewSH^R5U{1?oL zrJuq7r#b&F+nzIR_8Z~TXAgysD1Xxb#hfSof16tt_zM3&t|$v!SFs<={a}^_j-2;J z&dm8k;aQa%kml3D{;H>gYw9{>B}zXAVU_&)~!*H>>q-kuJQu6a6Gfd6v**Wy2kFugF( z$N#nXzZd^+)?BUn>psnyP=C};6Y9S}yhrUc1$24+r#VybUtYgGr)SajoW!D`@U{4V z0`#93y%F9iG8CQ~*`6~Nb$BS~3nFiXpM(9#c|+mn77v9(ONPP~OWp|g;{RIE&%+$s zI21mn@oIGu{;$CQ)%d@m@s04?_@C7@6z*?&Bm67;e~kaKrEi4SFC7ZsjelSBP`DNU zf5!h$TZY2-w!9Jk3jgyCM*ZXe8T{|wigs%q3V+`w>>B8eEl^F#M6$Rh)*0_D?&|GTHOa1+$*YO?s_MZ^ta@P8s#wZ&X{lq+ zhos^eI8eCOShNddZL)KqFP6x(5BA4w%c5wyr>eI*3Ew?^Hn%aF=pKl6JKikD@>rrP z=|rXK)_2DGGx20%Q8dxj8%uHA*-RB_Y)K_MW9c-4MiS{vYM_(CsL1kYDjr?g8>@}2 ziYMa4gU7XT%576D)06C~PIe8V486TE4zZ#{m(=E@iyLBzSSsGB>JlhjDw;tW!=rVg zFf(9q>wA;yYLbaeD%q==`>EErD9!zdGSS6!TPE7Mx;oYqT^mmhq_i(>ERFWX(wa`I zw%D41SfVr5l8h%ZD$<9Vtc|T4=&p^YP>y73P_=a?(FjIev<>#HMAA}fv7}A+rf5I1 zq9Wp?ThwKw5Z0|3i1x-agEh&%{%8sn@8m#n(F7xj zRmoIelsmIsV#SGamvQG^HO1G*6RJ9%h^7V+VJzCG8`5OyhH?h?u)I*^IbDgnmvl0# zTTqA7(X`3HQSGtynYLIr)fCg{PpT@FiVoJs!AtXKbXA(&H=1I7D`P3AXGHXXYl)`N z=^6cYwL$VTNUq=8sqf2o+32^=}fY(DuceTav&3PqD1}&Ae#nj zW1YQ7&?O?O(rM(a7jBmHP!`LMDQ&adlFsUnwsT`Vu{zdevm;hz$Vj!~rE%^Q$>bWD z5D{)SMqjKe9?isDT=Rg%qM3n|CBMb5Zdc2%bjIdH44sx~5|Mgf zTK2YNDiiCnY!Z!x(=Fs!kT0>+$78(`M9U;$bE69xK_jPDMLT1WzW!ce*55C0UZ+uG8vG}iLR>NWFm$-lR$NA z(bLh%4V#eYS`eg}LEFt@h%@RA(@tBg5BZLFrcI_%PM)LD55(E(*t}KwYp}mdz(o)3qZ(1==Tc0CYeh$Gi6;^e@1)hYLT|@1LCb&S zGZX7mcEvkWl+grrnBBXeOi_+VK~p? zi>21aX$nV+ z5+O!f22F@dlbQPDK%&dhFC1zum8YXaElu{T>QpScS~Yf|n|4gsW{EauXmcja-ef1c zlS%Gmk~^6*u~ZayF;T^ApP@|(Pw}^j83h6LRWm3cIlvSLi;)<>9#CUfXGdgKM-wH< z6y=c#n?t!^4kg3HEQ=_$h%$?qZ4u=bL1|McF@)VJw$^f0JJ1hV)~^=#^|PYI5Xace zpyrV8YAgqO(=n#7$HPQy4OzRH?#>Y1%XBZ(iCD+7g!Z6`jOM_baNtu2=zx*{Op0Dr z$JS8P_(uk?!l>?r$x(8O%dpf&l4NjXb@5DR4~hsaup>fMN5nFVh)^9e$0E2s zm_t>;p{Qz@&?Z+BF;Gq70%?neWtL4LF<~JMP0X^0a?7{HK}=O$U8-$hrNS6ewehv| zPX%bjq>g_gtDwj>r_`a?^lIzr#Xp%Ta#k6rF=K9U4^_;Oq?yY&Tw02xvk|c>oRxPW$v)c++mlw z!$#aOk*ykqL7}6m6w1+yjitse2(`YbHl;HWM|u-e+?|9+{YiM#kA!Da5$ZVNY7yM2 zn8m$HDDF(!Ut2~9>Q+KgzY>bNkxX z@#64xw_?6QW8m0+tS-fEsJj{aFGpWq6-^965UZNiypsd9V0DU_$XkZD@Hn1jI&LfN zh!ed*E~9ZnUB@!1=`e(trA=aCWHC#d#HvelAp_{~gQ_tWT^kdGfYPH?(nA8N?p~TC zYaoGYAbs#p!D}FZ@J}RqdxnsPj!=;Cumh>1iv`jhEE4u$u?1u=5uA};=s#!%Y(#cL z!B@+Zy-@lg=h~y#{EuM2T#plsMXcfBqo#jl?`n1-b7_)9GmpKt_|dT>UX6(b zN;1c!&J)v;DVvQHEVf1Jd|7N{j7cXGx-?l_$r>}IHkj1eWLoF5fh1ukRO^nF*w0XX zdZh-*&dYS{3uAYhmfT%Y+Ro}oTRR(Rg{=o{&1cj~IuhYHWhui)B#|_$j4sZy1S*rZ zW4gqi4t#4?T4>7dEVUOC51i$Mx#cw~NkG=uGR+8Sc3aek2&jvSp>G@qSd{g3S> zQv91&t)lJ(yR$DI;XQn?tRo1UVXrBKqgTOcCkxal*eli<(l%SM)7wuNYMra8`;#!R z9UZO?W-|H*t8wPj*<wNy3R5p(n&O?QWIDMjqXtsFiYKHV97K0S?UU$U>jc^& zIpH`?e(bsFmqn`G4RVFpqA%lx36kV-iZ<^VI!HwhgEE{>l z*;;2$hptlb#1_hII~_aHfaPkkEZPNQ+u{>RT*;Xe#I#G{IRVFmBXp67;lqksyIb*d z`R#UdY(_}iRR?9eT@DZwmzghD7L4?q*v*(|y`pa;q&dTK;UE>Gjf%RyIQBsjI77%( z$8gZg2llX3t)lj-!ht-}ZjJT#;t&jGALJUA2$-FdGSMabX{J|n-h}2-&~51EKw2ee zM5Qqk&`EnoKVK4{7SY3wO0VS{bNMy`XU-CN!j@RccZ(G>IoK9*St?0sf;jHG2^7H1 zX~5J$(`9>7_PDJbA{GO}vW|zO1{$L)V{~UivSX*tDN};z>6RdtDt2rxCx@NsiKjdI zt>b0Y7hO;NymK|QA!LlTC#LAiNC#=py=lcp$J%JBBf}ChW?f84D=_(zNm^ke4V&bY zDLvCL8C{PKtd#_+k0z5rK1j-Posfm}Zq}F(o!d&TZe5BzxH%F-R-Z#P441*=b7U@W z`Eueykd;( zxi*&Kdk2*N8f?#r#E8(51=lPQ>=x~hcH#;Eb89Ti@Qq9BCQz}l-#M>+K{3S{VI3hJ-T>9X_!!7({Ip~LF9GfJe%K!sa)&D}yICO&M1Z{jZCq(puXv3@d8zqt2v~M)GI$09~aGv5c_|KT;TH^B=?I zzj)RMuEo~YJ{HG zT^*XnoDfwlJ-nlj<5FxcCz42l4_l*9*ws?#Jy?U#;Zq;xM5y}MrHikJ5r?XT^Jols zoYKasQ?lUKRzC67bi^{tHK8XW3CPO~At@h1wQ3W$JS>W@3|bc1&KJK}9%(i!io%3u zp_x_KgKO)-MG$eY^J(xRriWJ3LeUr=DK4!4rxTPgK$R0JPS&_%CCcH&%WY@&D10mBwrz^CN84i1 z0UZ{_Ow$itl#zLe<^$q1BRw%^u*qkZOp%Jign8drypj`l8nLoEYuho@jJv;R5{@K` zOBrg2WuO=Ja5{XLnMTPwtYb~0BME5!e7RI{&RMQej+;?KlGChsky;jqQc9rMY3$ST zMlCJ?(#E4+Hngux@;0QlcIk`XRD&sK%ow4XghU$XODL>kgiD0xQ7s_VR0j7m;N4}j z-5?VwyzQ#(~lHV!(zLt4G;N8kM7PE{Dz=uiH{?iDxT!){_W9zv-eV=5mU_7B5<1p|xX7&1 ze1W}VbsR;~Q&4McmAOsyK z)3Q+@8_9H^U#QkdEyYB_Q7-R00hmYb9Gqk2i~MZG?G8~h9Y@}{g|v)wha|5Q7jx~v z)@Xn>?=Z3M)JgE&1DY=#gpn72@WnWm-oVZQYOqbzl*g|(oW0yU{wEF@( zu~_ZVR|Ls!-fYH=BYmqLt9ClofxCSt4URPG?WDwSeKLiUXVe_sT$OJgL^sR2h02|d zdluiRWud}%V4G8Ryf{ll#Z@PhSdZb@68pFcR|IgZiqmQwvf|tp$F(?-#`%9MPU+~h zn7d31PW|~N8dh?2;E#@r2IcQ>XlsCz!4VxDJLxkXj~i z-4TkJRx07Z*BfzXR<3s`-RW`ajzZI?9ZL3gsP9u(A(KTP7y0lQG}QK_9L2RK^+6r^ z!;C?P)xC6j+&hzC7C|XN8NqAQd+FNkS7{F6hD<{tSj)*)jzm?<&L|gqG?Px&asYMbD~c<_`VY*%mfs2Ql|Kl zyG?VpG++0y>>fuQOPARyE*)8Lhoe+DySUAcd8@NA*-ZwqE%9v=dg{P#z2(&0W|I`N z#RfgxFPQL-JzbnQWZh}R?TfT^;oa(ZT<2DSD7WT4VXkR99nat>pHH|UOIYf#ln|*R zVnn`@knehUb4x^9ODxqFPxD5VbIlwVYqad{!T?_l0l73u!bDpj`g{UD3!2`Ys>a+TBYM$dV5n`7j>B@Yao4d35F9 zs!bZ+bP1py7tyR~8kx`b&XJGEgl8=a`A#fV5w7Rsvk$iNde)Wz@Jn4Wj$J?6J+vCv zItw@RU|jaZE|Fp51k(7V$Kb(7Q#6YQf6g#~2geejeQR3fu@{j^E!O=A&al1X%Kb%u zh=pl^Z)+kHWpwahQubHHV_jTr2$GIjw^g;N=P4~?5sp^>%P`fadIxc?$HBPh zLSQesiDB1BBu!S@d1JylaMTk8ZM4ZvZyfGRU*hPrzJ>!t{?^KUGqts?io}01(M<(d z5*uuZ#v#X{mStk>CVOnUEXBCO8b^VTmLwy#m2PR^xCZ4w6uP&edqvVqQAy1yzP`Z1 zm&TFvbsNw4Be3+xfy;5d2KB4;cC88VOb|)4!S{~c^^6@g;{r0t8EzSUe9FB|u2$;< z?K*rFI>-wF(X)*X#R?-2J5nh~tGDWjIt>dDRvlR4=+T*#IBZ#=LVwQr#Wzy+&0pkks_gbY$qv*TLjpK6HR~| z>>4vHtWuG^rZHly8Z5!bNmv#{MJosLZR>29{joV?X}S8Eg|0~ZTT96)7qdQ<>{I=* zjvhop=b^L(kd}sX@m8Ukal8x>!k<7|UK|crq1?)$j~6>qIL~IH4>MdBeZAY!g|9H= z^IdJHCF8nyV&;qv2zS;h)5r@h4fRCRVD;i67u`yy(<`h%DK?c#r#h85={&H=JcMGQ zt|0vgO~s|NIJ&0wsN*pKMU1}E(k_@8P?uQi>OL#OrnyZw0rkJ;Rqo~%O}nLz27vZP zJtT^;fdzkKG;Mc0j?5icU-zM|;U1jSNe5PnK#>%5mLv%s&dR1-1tE=s(;xy{iv7`) zyC8h_NSV`3S@~a z%wO1MbeM=vEbs1B3V6DE|2IAYX{US6W?jcc4ILL4Vmt{SZ)|V!q)PPlatPB zZMd*Nk=oQ!UJ`NSi&HwgB&0F04A+gG)k4{gBlbnm5@{xo_>Bt22{e@4E~t83^>SAW zZ7{6oQ~w2@cIY)});C?eaITxdLNgz&%W;PYd!mqDE9oNzH9%kbYq}dtoJMl1W~a2< zO0LVux8rJ9$rUFR82Y$&?ZjdDuw2QfRbw*8Q9^D`7k_{abwu_%D2T0fkVVv2OI@Mx zZVvfjy^dxoPEgiXL`JYSwm;z}#tyYny%e^TP&)_iw1&lpgoi7ol+gdiWhH6EIEIH$ zpa-RKV2$%_{<0(keN4p|S0UTvjN*}3B&TZ7d3Bq&v%W0NXkb)R!WuB4n=AL1BK zg;?KhQU#(H^5GGO`7eIZ*4S~750vE55i2GrtjHEt0@l_V$C+JjPDAo3YN}SnjL+6I zNAIX=o4wYTu(DAgbaoOtgl1do5zWp1MpCn_Ny}bYNYq(h#cI!vN=?4(-cRk<0G-@; zX2NNj|FIeVTNC_Wsz1A4IBuxXyfTJ9ZB{wf33R)N^=!MUBWbDT$gnYi(Am{X=c?|{ zPvL1;wc?1@{h_g<4-T-8;|L40{<^F;C#2uoPf&;z@^!UtlI5&#v84_7)N#~k_+@`+ z0P&;Usp*C-Zi$KEJB&Y!F_I@87%EHlLlk;Lev( zTTZDs+iXv~+GbYD{)(A%VAU6=Z&}F25+1zy%30{du?v0gYVAq)bNU^tQHu_#&v|H` zkmDbUt44>UL@b*4R!qdVXyT*mN#Ur4$kD|hA2jWc&~W5;2Tl^o)w1H-#S&jxO)mbj znB>!)Nyp}LbF>lLgRoGj9-Bq`uK1e5svTE>cTggdYeqkfq_c8p$1Tax8dVP~hqQJl z^;i;jUXYR>Ioh%oX5vVE^mQ_*SI9b+`vv&`vA@j>6Qs@o6shc@gj(RxJt@rMS!hjdCyANh7hBCNt^KcTeqFH7vv;h zwVNxRVNCQmT1Hz!hbzFcNYdhr54oXa;ijiWN{l$z)j!G1*RH zrd{@;Q5YwfTP3IZmcA*=C$4{1I@1n=ZgM#`%DO)FaI)nvx!rW})`b`pP zfMHXMWZCgO%!83#_KWwLy1FD3nn`=dGBeE|pXzoVfjukLq1P7gCH1-INc2-AlbFxciIkeAy=T4?dIWZ$A^U*PGEt6qSI$2r> zDW0Td7y}m<8mtRgwhEVycX#y4QFu30JL+(Hw_Y~m?E;Vs4;Lrf=*Zb}f(8q{6o8G( zVNQHT>Wptb|DfV&mbHcB#7~aAH^I4b$++PhtK+$YXDP+(i9Ya3(n;J{xf?A*h0gM-bAz|XtQ1GelHO7I0VkQ(DFJ(Q+B3b) zp_&~j4wi+@wC&fwBQJDL%|WfsZZE=_YrIiLdEi@a#$!p#+Uv`;AgPJs>kd-Lu|noU z59!m%9 zRYxE8_t}z$_-0!lOG(?Yk7tDr!fF=+yU^w0kEH8E4N*vuVF7jS7`8bdAJ$+(0uW z->83=U1!NEpyO=9`TG9Khu(QI~7Y|Na0A91+i^`15_8$WyIZC zcF|Fa>B7S}n~4F1?S6+V7c;DH%*9nAfgGcJxGc1;(MfdiJ_a#x#RZ=pld7bHpqj*! z{u&XnfQ9Q<E=xS^qQgz^}9%_P;v#Z!*pio@1#W7?^vTT3CD^sy~aKp83%-d|wE;|iqDiOvk@5|VOn|*Ux z?ZPu_1eK5ZJJb^;S$$vFDGQ_+y9~>*U6pcoi9K07TMv@bW{m>&m90NYcy~*<704g( zVJdYad9$>-k=#UiV;4Ky1}`h`q@C^9mHV)v-i?%=OJ(JO@8TF&Y_cD4clpzoezLOX z@*aN{bHVxAS%qz`W z-q}|lX;$Qk2ih*ScA*raTk&crN#}lvr0UW)%V-201-7+xQHS$fWW|K!N>PQ0q+>8-@Eya@4?UC2G-Dm@B5b^C`I-#&=;zN~k zt`3uV$g!{xEa`(6Ad;(;M)t@o1{;7aV7;H9Lpi}Hg6kW zU}3vxN;Fv0wjYU^W-OdXP|{jbTdP&gwc45jTk|)EL0U5JWJ!1$nW_z~$2X^qV9s!@ z>iP);?{M|6!MPnM8zfC~(M+G)=&Q%*rg6QYM|rS%r+nm*+zJ{HIlg6$BkA{=SCZPc%Lu?lAXihy0Kw8<|XMk?V*F2lwN1+8P}mNK z$XbOL%|+jV%D`xRtoIgpl+M-<` zXix~2wA$I==(M@dTM3KBidTQ?K{tJ@*bSEWs=}`endNfq;=U{q@5J)o^x|UaSkNY> z7ito-hU9@RJ+kp^mt-fKD{<-DNIY0wg&)CzLSQboR8WrBv`dWEx0xxOu46X_q&XNZ z38@F3ZMCl+i2&8Z#&WhhvBelZGTbgk*T$_sr(5Gv4E7;Nkk~yK9}H`~Nq5soTI!eH zY19YRkaKp|qA0jqfiU_Ed`lN0ccU*Lq}>l9X;%YF&aA|;n+z9q4O9aXizIq7Q(D=5+9c2_D4O5sJk~PZ&B?epHt_kiFjFX;*hS?#rTa zk}~M*0g=1mXt=oJK`8A_8-~xQb+1q^Xs)7358tjhiO~3QM@Ku>yt~aW%0k$P-mEVr z+7U{QgC=#Utbt_5E&fMfH^efu6{B=`qsfi1BZON^_oAUl>0i~MbS=G<-fiYH zAiC-ViOJ_ewpYoCvEt|Kn|6weE{?IHU_b6)_^{$17M0^*_{MOu<3jNaml3@?O#Hrr z@mz2x_J`>NryI9tV$MW|==h6H=pRx3h{9qlP1>wg`qr+TCy>6FMibL|M*2k$zGKSJ z7nm_E8^qQr>nD1}#auv%reiEn(1cn)6DQVK+#I)!Di}4Pl|rY$#2>~S$>T6j$#uAD zubW$ThAFOQ=IYd>-W|tmyKFmPy=W8yVm6u3n*v(q8w`pV;xoAx>O6@DnT#B}<&NW? zXtp1dr!#14t|T6u+;Oz1gdI8S(9rm-4^4PCXyi!#i!U9QUgk?4c=Qa<&JX&5ciib1 zwti!|CyjyvIdS5!#<*dU-4L!uFzcIWvmSq-lHl}TiVhz?SfpkBIQO$w!1kIz-t@o+ z)AYeHJ)diJ7N-}u^Qfmcr@S0+M{WCG^8AAt)@{itS-sP$b+VJY%h9&zkmha~u}nL4 zb<>WWcX}6$ycv6Hs82m`Uu&&Bd3bTr4A+ZhEw0AOYnfiW{CHQ(cx$+)9c|_3#51lxHTWOv|i* zJUqzB&5^q2sBIrjk`&v?y+#tCz?yW&Vfxn|`uNbBt49t5u;izkN-Cd+>mY* zWxcY09Ztf@w=>m)kfjt?)zY>IC(+KRM>)N$qN>{H$1^x{6q#&)>#>2lt4pP@1A_-x zjoPqp8KZo7c*Gw4*m^^a3K~qQRr+Gxb(1WupUIFgtvFmyrSWVay__K|TcL-1rFUFJ z_Xg@(h*Dq!QRwpttpGM^h@u4v_7{DiHQSDLllZwG9Xkm)gyeiZyr= znNx>Ndbh02yzy)?Ws`omXNhE3dsx8`*ACqz${jjO%yzRHF%IKNOvBiy2WNR8H{7fW z;nUD&DU}f&b(?3MCb`0m5NlZ+9y@eFOFNlM@z!?J7UK&@G@^O_;P&SHkkEE)4i&|*R3G0) z!Lw@g8;X`KC5KbmElEE`pq=yzv&*`CK~bas$(ZG2Mfhk2IlCC$U`SOOK3oj)0gZ@n zSBM`;)5UPb=?b15)D?`SO;sm7t;ZUk{tzyOenCGzPaAcRS-hu;-JPnXwLHHny%PkZ zxm7rN>j?K8@cVk0s^Zq>23B!+qZJyWwE;s>N^Y??!#_{}$;Q7jfShuE=$^|ezGr4P z9rNv`b8HSpFJ!P7jrNKpmt_{IkbQE21)3aw{!%LjdRs}?t=M=IUb|BsxM{ShCj?%z z$O=mC&kKWmlA6z75t^09%{`KXgc!bKCIN=?#lNN9=rx>eHDl9mx`|8|WB<)e#$bzY z-H75xTg1g~S8=ng;@U_@cW7*Jv~1$$?f~M$%@coS*AQPOhy0+ISRIBu7*>#GL!#we ztu|r<(eK^R`GC1&k1as!Xv=cO=7{(+Dhqpxy0>FbQulW}c&ICZmV;)W$7h>HuU|!1 zqp37}eoWrOT`Ogb*_h-c!a$%-E-tQQ4N^&ld2zdGR!z31RT3`Fav9DzPbI zDOD;?cQcKhH~o&2-Y~_p=Q27V2k2Kt>6ps?4Y4$Sq>e(;J2g@KWQA>4I0Ym*tdh2N z$NdCJ8T)SBQQR!@Wh;PLUPt2dd_w!K`~$DLpYhLUP~=Q#rqzrjOo(OL$**bGL9E)> za@$=L$UJ(*n#-VR3WnN|*QB(IWfM22CrCKQF7B-{t2>ChV;6U;lZdNj6St8&j`$qe zO~PgOC<&3x6~B>2T`UkfN3t~68FJR?_Kv#_pu3X}Wyh{v9lOM;7nIu7vWc7CsE7Kl zoehTgz(#tSzV@aOCmAz2;)iutG$0QR@iYR9UR`(n$iY%P4T)PHwBn;chLxgSn$(}7 zqaO5qkSvxY-WJP1i?}qHF4`h4Jpbz;LJJ>COS4=(f&61y_@YeMPPSEC>v2~| zN5-UZMXi(#ZJOnc0XWj&gW%>72GblpkhwfGoS_g&I~|?2tF2B>=S(8?Amr&?xnXjT zPI)l8quBV+0uN_HjgUdI@k5*6ari*0Pw<_dp^v1jK7eV#Y;2=t zvzn03q`3L$oeND!gIEnfMWmGnDxc~CHBEDvb5=li8A&PP833ixWod3{hs7$7E&=;- zN@kVID3z;BbjW6v$W@+x`z{AHwY^f}@rd?gg-ox`xnE@SoDjP7y6n>B?D9%!6RLRt zZ)J93-wGS~SfJxsavBjJmL<^m`qKkCDv;e6SDtKr(N2>&ZX1QLesf3*m54PAK#((@ z7(p)5HYGgHl`xqUuADa*Y9gADPB2V8(Jq6I(khaj4eC*7YDyIf1(lw9f)kDN<_Q#Q zv?TrfBt4sp8Wk;GXi`9M7-~7uk*7uLBTvgphq3qt(tgqephKlIvK>S+4gGDcM5--# znjnhb53t;7y6{1TZL^dG%axRdPEr~y1}P8BsKyRZeO&UZX?b)5F9C~_ex9RCezCVX zL7lh1pKe4^SvgPqTfW&YRx~3z+L2P-%f6OwW4k7$Rcx!YtFB(FO2tnW)8&(E+vSZp zEh;%Hj-)pkdRuUiU8y1ZWNU|-O_RiJunz>t!LgBBo6F6yHN|Pa+@4AB z)~fAsc|09o8ON>BK^9S+a_|i;4N6cHyZN;^0f!Ok!zY|^dOrjUEqqvxxs296PzdSq zCFjR@o#PGty`bJA(>4l&$q!Yt7K_6a$6Z#KeV8C;>cH<$#8s7vd*h*oD=bx+go0XZar6jneBv?vFZDG`#HHN7N&0Z3R72@;?LCQNqb z9l4>mOiFL$lx~$Rv+Hf8mhLjG(sf#SSJ`!1xm99kSKX>xwe=s~9yQ0?%^&VLPLHzg z=lk6IzB2%+gnLfT={Y$jG0%H{-{(H}xzBy>bMO0JE7Pxbr9$(GQ8gfFq)&&kI|!Zx zDV2m-yfXvuj_<)kZxl$F$7p7 z%&>tG2v4d{3FW`ouzBy3l`hiS#fA6`0r z=8$aqE0?f~PF*^S)pOpC%|Cwb*rCJj@#FTky1iYX&SuOqz-Ro2w)r#!R*(w^x$%Q< zG20u&E_rP@-7gN|V1IJ-WL2%;Icm>6!C%ueJp%5xB*Vr*@Pxev?+Yeu?@4-x0=0Ea zT)G>Ph9sL29d=RaJl@L`z3GrCU1YE3gm~M0PRtWFcc=T3di6+qA;}(wy_NyVnOGSE z&vI9|&ecf$@&`wQ>g7E`!Miq}CJl>k2t7Bu>bIW##s_v#R&~jRONnpAe}gbwJgcp8 z?_5ew#Og9%5hrY7dmV@4a@q#-!bCkThBXP9dL&1V`oeW~#3DQWiucq>V%t8&!PF_K zg4A!L6cYGOY74W?e#-Cy#~0A)*4Sz{p~J~3VSV!2Dp1eOUn@;UHX_fzT9FtG(ttHeJbBLB>COF|ZqPB;oDO@KOLKRa+~?Fj zADz0EteqBkvBQm%hNr=an_$|W1}E-SPYesMdy1Hw z4BqhZm+*Nc0>Y<`e7I6<2r#RPg&K?ct1jdWdl+)s1*;kLbnanRuzNc;g|-R9ssZz{ znTOkfi9qT6ycheR$qgXB%yu1*>h>!|Ci+*qBie}``FY2VyT94fjw9J|qT~Q!a$1Rv zeeNv4ET@~BbZ-;4HZ456!h3&evcFHm!*D6m^dYWC^5aWRPT@FxGl*MTm%@%STCN?r zPJ`_urJF+&|54%Ao&}RP{8H^$cUmc4I)d(}_0C7mT;%hHw#wQr+zg&x6wY;L`U0(6;kw1-zDPc^x_Tz@ zUA({*4R&|^s(W4^i8+b9zHlkH!{?Dg3MbSx#>-J)Uv5lTNjK!MH>QSqw>Y~N3JNvbFtdsmO-J;t(uI;TL%TWM|G-Q(Kg%?w z_dP-JSx&R_hPj9SY$Erx@>!a*3(xzhYu#}_{oLo>IWBoPr&ATQN3-<&f(h2}kr`76 z{cPqx@eo9xXkm8-Uho$QCNC~ua(w1S$jD&GV-dB{%JAJ8xZpXRhen25!~CaN>=HVs zPul1upl}DB<3#PO-M~RLrn3{v9bN!kNyi;tfSSNQf&Bsp1jYo$Y0>hc^yBt%!e^x| ztfsq-&+yGkes&G1*Sl6P&aL_dS)JbAya=;z_^dJ&uX26q>}ePaaciVIZP$r--N8QM z??1(lVK@0IKQ{D>zQv?^COt&yDQv2)IaMyDCttP)`vtv^;cX1E_(D6zfLAxXm|wDc z2zdcRi{fx<*6`AYd+10V3QS+>xa5@*r+HyTI|@PJk+3++%EDP2qzY{MHa#RwKJu6D z3Aew+%(xY5vnCeLX^7g$wO3mfP!+u8XrXhhYP`5+-+noFVTr3JZ7nz$u+wbKBLvwXOcPN1m`^GEGdVD_oH1CpMXuq({ z4q-w{rJ2>9&{>gZjjQHX_)gk$TypFe-~MJxG(gC@%-5EZFUyKN;Ux%^L8&?IsIYAB z_;j^#e%hPnON!JI#}3u5q~{|w3~WTH=TEP+Kk;N4O(>Yl`cqpn<}*>|2XkV-vvB)J zTk>J{#Po%Nvyj*zj1MKm+^n5Xa$L{F@nSoR;Q(nx5BNtCbY zV^4;)JF)JX8)#S~l zbeR5`jsW;bG(T`*Vzdg8q3wMyshHGAyagPpjXYD3tAP*i_~^~7k=%Gn=k{{ zQ)eZj^-7puKWJC^;klD6J5Rbtj*Uz_Jbsc7E6kta<9TP#oxSwzxr<@Zp|7HzM#~uu zO<%ZRN<1MQbmp*&4e|CTY5ZYHzqjWxIEE6WFDZ(2s(FuF3b<{K+3O}Ao-Ng> z>?K>SjJk;@Vff9sb8d*ap8K&lU8Qo{^=k*f@7ifwdw#)o5`7_es7_^X4#ubuTBX-= z+GQl6=mffdn8j#2F7z+PdJ5FwF$Pq3qA?jyTu^HC29~hl7*ROcln#f`CSFclYZojO z7}9=~)DAW#VbW&!`K5ZBm%QI>xnAWLInS{%+|E4_)Je>H9ru*V3cs|x`tUFA86P`1 zc4++2LkIUB+W%1P;Q0QB4vz0T@X#m6_I={up0V1#>b^&Q$(_{g(^x?5yuD6)Nd#%F z{PEEP<5f2@;wOdb`u=LQI=c73L!-(5`{9LU`fWAw+Wz=q)Ak@+`r&X>lftM{(IEvq zE}t~uc8Cc^1`HoK(?MBpKtT=ms?o9ALZ;6lLnU40XwyY+GIFpJ6Q0-l)8#6Zrc*;d z`X$S!FVN3Sj9jsa9wYIu)e&DzG>5FSoXa;uh?@W<6zMyhTwe7fQ3>8JmOD}JW|T5? z!u$joY-U!`+@N|lnfL2nnI*ORkZDba)-j(2tT!FiHjEG4U9n?U#+?cnzq`96U{L2*7F&BBB-Vg@&21z4z2%ne!r>R?ZCmHU`Fjw3f$c%a zEcfX}pQjx-#k8aA;{7OFn}3`S&dJYraL#f{W6pnEK{d{tTjRx_h52)5d0+a^kx_fb zHi@V`d+LZNUM**0)hudq&FW+9hWShtpblWxw{dWnT}TgV?a&s{_5~fPu}i-s_WfI^ zv}4sTq{DRbD6d!RQ!6&baT}R>>)6^QT@>zTMMK5Q5Xhc>g(`@{XXkWL;6z)d-fY?zidd`s3h%P2nkc|?=B zmd*y3CABcrA#^;B1ZrBabvL9)-JRy?b_XQ74Z0Y+c&l7{lUy8`y6ogTB{90t*Zml@ z^`}LoXr;9uI{VxbTDPq>$=2aDyO0@18NA1Id7@1*I#Xl@0J{vfOj%gH<0O4VTq6QXGeUW+oSZ3??Bhrc77+H4r0?f4s?Hgiz=)#^50cR+vv z)cN99xDq36VW&S;l+P|MoxbRmyWL^I(fQFdv$up9FEqbkJ!;uT*?!v9P;gp2R%~8g?$-Q`cZqHfOyUUMCq7mTbPl|vq z;x5(DQS?xX@FcIFJUPndkhictl78xbb$1wlyC2hD6)QM|0VYNIE0 zmoS#-iHDa@V)3)pj9(Q#M&~}f_hi_JoLG8zALN0%*XV6??{^d4cxXPD_u&I4Pdv(W+zSdR*r=W93tn-WbGN!<7|>3B<%ZJ$fH^e4*Z2kNEG+CvLN3q!P^5)-s_QYX^@V}}opCI|Cn3t?q$D;2+{c+C4|FpaM+ve@1bE4!U@{cBjH z(Hw>%J#HCB_93d|Mn488R=DOEijXao|iRH7en%8JACZPxN-r5IeX5X{L|9yVV} z@U=Y)#_rxDhUq!C+dV>xdGapfcHO&N#kt`p37a*1FVKw_Nc$Wqgg@nUk#6`iR-drH zLyG&_r9TPAXN@w##O04t${f!l{@MMs=ydOA-7mVT`z7}?z;)cCxIYJ7&Vq&I+kS{A z*EK-93gv~+t_iT&#qVL~?t9i~w&Xm`I9ij?xoamS?WT3Rozi~Px$U=8M^qGL)Dst= z#gecbd=5-@gVS!e*B#)wFAY<8jnF;(ciW!>`gHq9bpYQ13$3NOtE3%ueymu1 z;*>hv>U&gF+Su!oaI1t0GmULe&sFMN;lHTo+nCw@IAQ7;?Fp*wrx;PL@heAgihLu#jfZijYq(q5P zUx!bt8ri`oR2{y#>6aK5ofv2GbB3G5l?Emx#}x)&-isoam#CrP_N?;sLdN~{#v$?N zky5p~d)vZILQDT8!X!vHioq0v{?8yx9@ix9o@97z>_)`b{YSu_4OiN$HZMZ2-K6L6 z34`y5`!w!PBkmuCwI1Pllu{14Pg2@(S`kEUQN5skarx8G6JbBt+u3 z?c1-(Ht*v!U3$7`8a}B>X1n^r4=}7d3<{fs`#;8{AffbA?k5pS(51VA+uh&EHJ+W* zJY63m)rTDL!*|o?&L;JQL*0iq)9p#{YV*hiTC9O1bwP^5nq&G(L)3=z3MoEKtfpkQ z^%J)1OdPsdC##1$kF<*!=3a5Fz z@0fAyX{+D$Pl1UST-1q}XirXVIH4b}8iLUxKegs8eXO(|kE52uZB1$q{{BxhzCTYo zDOqlC!A6ttPRewHZB;1^V^W*991_B{O{S>VbOh)wmUpUzNL`jhl3-}QSHQYAb~YPCeYnM^jW zcnB(8RNUaxr145%iqXdsmumhCF!_k6>=jAzj%1lv7Al5oqVl=>-!C1iUopw!KAgA` z;VtS)Lau_Va50tgqfb%iGyKlE=YgGdCX=Hmrjn1j!^j3?+u#1RzxmPs^Y8w~r(XHY z4?p{NUO0Nf75>35oOt@a+IPR$vpwq13_2cV|Jd#yALWtX9!+JU#tkBQj&0cvC!NAsmjvEM=|!jeXb@7n3@N#jQ!u zJ6+}0P_eiz@xR+sEVstWtzDZFP32WTbs1v5gs;j&35_?4R%P&$RY}eFc6MXZcx6M< zyfuVUH)7Pc3BwZ`3u#Rjivvjw-_4a&B#4Teq@3g|41* zA?Ns)%Lrrzx&#!M>lWw{$O{w%iUPd?TLk(9`UOe?TLlIL$^wzVpujeP?E?1*+$*p{ z;68y52;46)Brq)SfWQX@Dgqx8_z8gr1x5ruEP(iMxsM1S#9fZXh|3{xT<&86y96E* zU^uuO3bV^GCA%DB!sYe|>=j_5b2%0xE{70zITjl(HzvRW!{yMmUGCozV149rsJ1SL z&~dq+6_^w_DDVk^M+Bw>4heix;8B6Y0*?uNO5o=Nn0#ICh`{3lpB6YO@PxpV0xU9I zZbslKfu{vNBfuo@az8Kd*92GsxZDYW&k6i>0cL5JJ0&nHFeiWp;Bs|=1%X9@(*kD% zmIOX8@QlE+0CLjh&I+JKxZH}sc>zSN%c1nT9FvI4T@-ju;CX>{0kjyG`vrkt6u2z# zO9Hl6ZrQ9t_gfe;BN{1 zy1|5o5N zfo}->LxF!J@Vdb73H)P$eP3;Uj+UIpsQ!NyQ|_dxk@He=mwZqK{!I(PWQO z#Z?}~s8#EBnJi&~t(rx(YP~K?+NdvTG*o1{ZUv743(*+G7fYlsXyQ{yYZ~;jTS$nc zeJUG`75ZJ4=`it?k)CbeKw+Rza$OxE=1mflJMVMbvwUixPy{!dV5`JXd^A?1E*~;j z=?bpx(a&cJ1`OG1UnN5u!USC~PZZC9Frh`YlPAP!UKQ8{Xw`}p&~EM`EMLh)lZ4RL zY(buBrLH)m#85Ow{t_WPXnjGC#*G4%P=kt3&=bXI&=v>QUPUOBKo~SX7eF^I0)OjZ(C09<*8=u_Sy=a4yvDRH zKXU#7ODKP@fAslBKRBq+F<$~ThoayeAJdvv5^=Z)HVJ*}*&g~bTA>H&rc6eC6|ES> zR#a-CT=#_!xg=c>u zlr!U566-`O#fl39lAvsHXX4Z7o6h!Rb3Jf+;Eig*^GM?c?OzvT z*>Ge$hC-m8&tDZyNC6l5bkhZB(3-XkE~<&|kaO@|8u3OTL}bFLP0&39qJ)bw1AXw+slV3 zKv+LyZO~Gpdncff+ev+%0E5gJmT1r=@&xZr=WCO^u>!|5 z7dRns3cR!BIvofst5Y<(dnl6RfEj_~0w)AcF=3Uu91~X0FsXZ@ofH!7G&1ibL9{d5 z(-Zn?J?V<|gskgAt`M#G1m(*i0S?~*<;$Y#&<+Gzv{ZhDK)NO4Pbq>P=kH`J8jn#culgQV9-fTcMIOfl1&*^=qY^k+($t(k#LITK|DGutxTGxub6WbVt{pBc&wXCBCW zFjL8VC^MNkm^qX=nt3Ag6d05nO{#F^W==HaA#`{Y!;^Uy+Be?f556dByfkz0U`FwS zZZLy8TZBGx4`%UoZDI29zQHd1x&BIb>K|0z?yZ%cj*vm7jKLm$d47fMmEwlDLBa<(?96;L^HZ6RWp-tIdg=CZ<2}nB zhJ&OU`5t?thzm}8gU&0tte7q3RC+aPo`6~JbzLTX?j;YQZH>2iM$Z<0%GkzV{R@W89-;Cnd z2lTMoq%H90OFimKJsQn+g9mm7C$mYG2cBY{CAPeZ%jXHiHehl2yyEZ`vlJllKUt8Y zaRZ0p*Q%9Ulf7!ExyXftijS)KLsm6I9oZ3`$5U>-EFHJRQ5Ai|H^W7S) zl8g+~Ax0rWBI+ZmAc$lU6SuAjyeROJ2`W_Ca_c&vIV7R@1A&(T&4OItkxSDWl&nBc zWF6%LQDgKVG-I+-=_*2?^&-qhHBgp12l4}2d6bxZ)V5u;oyL8&h`xZgBAJ|JAh-%c zqGwCNxk(t807|PdIju2|^ksYUTPo@WiBD@K1@*%f&7DbDFVg}z2|YSm-A>(jyyD)h zN(>EPE~=L3vEgngp9Pv!CNOH;1aoQ>6{;G?@p~!&57Td#e-?cJQ5xd$dy2%-9Ku24 zR5*_U4^c~#a=Gy(=5F?vLO`S)7sXdnUrxg=3%$z$z1GzP&nt<8nVm*l_6T223TR#JQxBga zhCy|$?TK11FiwamX?*dBT8+E~MCVzDD$99-Y!sfNvBH})R|-58bH&=3qK7!6)9Vas zu_4@-a}Dtyro~*BTsZ(3mRso046GK)G@ct)tbC%Ehd0zv(y{7kkLHy5nkW3@xQ}C`L@gVohZ&*U41J`$ zh5@P#!$N9-^cPKmMFNCMo2i@Yk_n}>uh$Y+bGg3~Y|Zht60)3}jju=ziCV8xHG<_P zVUnw?*KJBN2|GBD?HYc7fTyw&hzQ3AGRlh(w#p@i@iT0TeU&afz>7Z>BE6sotHdp( zY--^S-Z+rY7GNbb*9bQ(w=0pwT%#(T^h(h1wTjNH3AT&j8Tj9J3vIFNo%O# z`Ct{L(Gvyo_{`g*#&2c~`v;teAGNl1w5Mh)$JFSBrEEh+0;Wi-X@&r5f|OH9O|d3< zIzSzPD~fO3TVXPLN=k`@F7?aQfp43Wou(t=EuyWo_-0ZXRF4BU)RM6HI<>0$<^-jX z0fHMBVXcubeyIrBdPMPc1vDp72@y1tB!}VD^OH;?(`jE%l4=M|hl!(v5?;v;F_Wt- zQXWsMmA=zYUxTIfc6=pI|Ef)-q}nT%A%0z`nKI)GIFS}09cx1YejLY_15H!G7%v-j z#g8^DUh@f>%ow!mrlyM2RbVQniBkna^hEbko+dU4ys-M49=oGF)GQ$YuAX19Y0w;G z#q>6MEN{A5IesB|qCLxgH$|E>tn6$&bc7^j%%}#6QuVRP$oQMM%kd8cTW?69wO&Kv zp~F~YA*K_V6;~zu8@3FK8tOAd!YyXBg3a=*rUxBdL6Vbv~z3I%IB6V&CTYOh4O5t)!vj(E7yI#)MSr}h{P!=|KfnH*(|wGXuP#G3DBAZ z{}%J(;17v9pj=-Ucvavvfo}@DE^rIbyeVKVC21;gQ|X#Y(p2Im%fhJnrodYQ-xc_t zz`Fw97x)uEEI}Uc?3ZPb1v5kjW9ZC?-svA`F&dOnyxeOd{VmxULzo%f6p14d-n3C( zG%*{8Z^%Uwri6it#yXJ+Ev!GAQ^uf(hj^C-ASF%SOltzoOF3`8W)bo0KE7_O+MMvL zDmer0$V@~FvavaV6!1lU-6H~H;26p~+VN&|$v4G*bgPCQE7ZVmlMb9v@d$XXE!oWkc%}7bd{h~+j*#Oe9JW|DdL7mCA!4#5}>)y zXorA^Wk^9(%;1uo5e;qPir0MBHBAWJK@2EGH-q0tt&_0CiqZSNsRzT|9<4Vh7EKL_ zu#Q$5Ey;mVCr^XW-#&4Aye@`uw5=b&-P_kBoGH|0lC`kHW52I(wtkuJ^6mUMVnhy{bU6}C)bwI-xw5gL?m zLM5*zRF};n@d>RC>7WxmtTRgk1s)k5sFm3+be(J$>o(*iYqbYt$Qv%u)M1hr7#a{& zP_J*Zl4(|rE?F z%0lg}3Ryy-@%6<05_RBK=P%pr<;PY_D>Z^V?|B_xi#38o%#~~gdbn(tY(Fwb&>zqp zB2jHG`(ZBI=d$dCVUOAB0{=0X0?*;{y^%WnJW9dFvP@WkWn)`)5RUx5T3|@x9PSna z6O^nX*M(9;*!zK9l21t*NiB->+>M05DC*aNKDCr5mCVCRRsvr#1&B2oznf)Hoib81 zPpPhJkgJswVAL>_EUGnO3na0RWR4$lxB`}#LTq3YsUmE4n=+hV^=*C?zJz~ZM+AR? z6l$@Fc&(7t97{n0#+%T+iBW?0P8*pkrH3f_4{$b`s-n@fD)12Azy|7- z6recA%r)jf$v5%MW?YOF1=%aQH79-3CsjdnQmk^==y}+}P%y>|HmZhfgQ+ z8z~Mm08KjJmlb7!0OGFC2=PL*MH6aW+HxGeD-( z7t0n-0*gV46#J48Db2|SG)sbx0?I9E>0Xygbg!eF7_ubZ`b$X~Od>8i%9{g5km-S> z7VObJZWs-omDwPyBO+xNcUKFb&agcSOp_O-xT@QkS}&96lTgkL#Kth;?ZVi=D1nb6|!!!yXS+A zZ_svnloDDq0mJyZVYtf|waYwX-ZN$%8&+hp%Dwi|nn@ZGUk`QfN*c0DgSVxPWaSYp zW|F39uqsMI?x>YL5C%E@SO{30NE)i? zx}|BRwIU2|8AH+WOs{O2DEzW|>K!Z6G%`X|Tl|h;W-;uAnTL%rHU6@2i{H`K-FZ3L zDWja1t%z$Lt83r z>m`HD9{`s(56WRnxmaPOcNEA;L9Xed_82xjS)|EPZS2L z*{rN%%+SBr^#F9Z`atHMYPRcv%)sVg8UXULy#`lec)cvU7;Eq=2py%!+XF%6GoWSn zn#;_vB@Qi~=jhAtmmA+IH~zr*L7iM?_dz`6t+A)%rZfUu)2$q(qX(FEyja%Zwi~%n~dY4 zqvOn_9^m9av5*F!Nn%y(L7TJ((*aNVq45Qt>LNL|IP5FuwQth+qLvlWc{0&&%pHv{ zTC`>n;s*-0OgJB%S7}sMZv0u}h8ux`4d-TW3M)TYuA@*j~>bOj6C{Jez|n!^~SMt-=6r{fB4gX z`mIZU_>~tf{>z?s|1kdFKD%{a|L>K4{U7cAzrXz}KR5Dx-_hp(`p0XJ{@K6ye?Rhz zKk>gm`p9$ z-p+J)vGd*Qx^;L$=O=P`h(TDMUon?w$&RC2k}+C)x8Tg?2QilRzA->*5*ZiyY24F%*J0dUJyI zavlgUd0)N=R?Pf9hhgZmde*P@=W`ZcEksogS*ZnzNB#}Efx%3Hrs20D%QNhoGF5Wy zBcCasD&)Q8y9#P#1~E?4DP~s>6ov{Q4(!e6U@dll-w}-q(e(B_wDdS}6e&67R?K%7 z3d03z$_^LG`9f&TusO;n`p9HKG`c`l9ER)5ceANU4U}Hkme2X4*^L`kbmImQ!})%; z3#p{LyMP%2Rd}L&f^h$*?(GJ27q(J(nSD&f?;=uomQS#28qIbYWLCgEL{p+!PmZMV zW9sT^F_5Bhqi-OCP#w@3{{bfskSeE{LSg|)WM9K~&=zcA)IqmpAd@SYO#n9SB_OXs z>3NnTJ}|CcB(T#zHVB)u()KRVFFNzZ*)2-f;V)=imjwA9BcA-_=Ck0O8Sa9vFlJ%6 zOQlEazSsSud|5)_Qn`7tTeI-jR4`{_nD0s|{-XYyS>TdZ*Ifjgpl^IFx`@C)u6&I@ zQRY%<3zWG;dV(%7GKQi{;yyV`m}6)}DaZ1ho!4w>h|@|rLrLSsAB_=?EQ4KJ z@qMp5@eSt6_}}I9m5&|F4R+s4$oGq#A^x;Vo^ZYH0Wp9uAY`?mB11KtJFx~7OGqgc zjV?AFBxK+dp1pZa1s95RXyKl`HneltRI#?U|2>r7%J6$bF?aC?SAnye%t!21uydz_ zAaeZM{){C!G}64P1)n6Fd9u77()RQq<(eljZg@?Wvm};iurr5^Up76$lQ&w@{2{2% zN(r81?8TSCK)W;@7?=lZCCA1F5=256MZ{kpg8JDZkNNSAd`)?h4BlgyA8%u>-5wI9 zn9Jiax)LzIl3?BuWtbli=~B!?j^=c4-qQuEhewJvMw^`Sq)3^^keX^Eh4P{B6e)Rp zWj7OKI)V(DsSuwcKo}^~)QO)t|vRL`OEK*CaQBPR{LQ5OH1_;!~p2>Wl?x{uZ?jf zS9ugrEJ_+vCdccT<&Y87;uxIoF;IV~pR5?A=!q?e?B+<+{2g}o5qIV0@AiPQgd!U^ z&2QkRkwDy<#+$oTF{Igvbd^_=$Gf6q>qRBh?(8n}UISg7lwnpxQ#7b%BQ8OcovYT1 zUA>v^EqO4mu_4Dl8q5(ztAz9{eclTvVep{Z3SwN6{PyotagapGnw;bBie@=KqghRl zL{7*?cB+%HkS^$aam$g=-Icn?GFm}wXl#CsVO1K^?W)$B{eV6fFPJLJK1(DLK zarVj+qQ*GEiZ~JIQBRV$>O|B-=#DgW2cbJeoW{#Sukjuv0;)f0MmgVuI)=Git?ZV| z7r-`4J|TDktJyW}xbTPGN_v)Z{PYZI)_QHiQ#vtCL9f}Nt2UQ^GQY*Eh^*}OMxNfB zAUJBSv@@_Z*-xH!KySVqe0FK|lV>$1)~7r(OP0`rkO{QuRerZ@yqfnGsmWZ+%J52B!UCM{|^T394m5k}h58^~jQo{sFK3Uz5h zkziVrmcZCjmrZjn4gR}^tA}<%*Ai)Xc*-;JSiuUBe1iJeFKMIvfeIs9xr9?8NMh4+ zM<|6>B`J#5-XTuo5igFphN6Y+Vz-S>?h+Z1*AZM~wH1*Y!4XQ>v7wF~R>zJFb?hk8 zbr>quOjy+y1Pa0$se~gGRo_rl-HNJjD5_p$1%RDRhX=29Gt}ywYDlQ-EzVK|-{$C% ztj|McolAT)h3d(p$YxG!hX>rpHguTJ1|Ls~jGK#2hn$Vj1nb%ctZRmKZ3EUdu}{(u z90f%nvE!|V8}X;|jJ;`I{`C#f%fA@P!+?{M!9$}$c=4xfQMMs%fgIr5X0?#k_y&Wx z_=agBzNHGO_*K?e66kh%hnJbtqdPl7KU0`;@BoSwvZsC(3B_HXQF)R zrCPWlhO~)Zlvuu2jHV0yHtHvs6%QNv8MDT6(1O{7T`4x<<)UY!_^ZZ@ljNZ&b+@|A z1_YyK(x%XBGNDl?qeQFrNkj+i`Wiuuo=LqKZ0+*=5YC#w3%HU_r|5Pp5%`U}JHtz1 za4R1_Yj1jPNCpLD_;pUV2ya||_^Y4}S{6l;q-5lgj#^yXP|{^9sm!KdAnZDVSgFW` zoQ>BdAno{$vU$@&yiRyXzWiXmABI%YWw_xcx(HR`L8b`C%aG5;Ga{#%E9G-cT%>NX zC%wi3ojy8D$4r&u*Ams1nF})e`cZTDz@=$qii~(09&DhtvD;%uotQP$o&1Se z;`JRE2jU+@@f%V6ohYXDZ%6T)Y?l5&Ggis4xg1W+U~NF5GNrg`?zU1)#8rY4r8sy^ zDOS?0m;sn7oGc@UP(ZcVY`?;vj9T8_*SfRw#r-6TclJA9^cQ1>C^B5ne+t+r6H}gYcNwYLncuC))l2cC-nTb2Xz3E+jZOCnSO+VBaU(+WA zw73?-@z0mz-^=%I|4P0@V)LfKTL!;w@HK<48~mohHw?aMP$Gw8PzJwe@Lhx7H~1%l zvDt0nohCX##9jn}?diIw{ETeJwR(dfAVz%B_!AQ?Ca9Y)n@D*XWzP!iGr@v_dO3>w zEM(h#8qpdlFvT`_6}|5Y%Y2~458M;fC=R>C0}LUwEGeCeY`&N3bZdCXyk>cZ9?<41 zWuhm=L*!Wo`Q(EJWsWN&(c*0=xoYE%aNFXrt-PGb-b8Pm7D+>P_=G>Ogg-#u>bxW}4=5$TBvGE7p60*8@}>36zhZGqAB6LL z;)(dHQEVo=7%Qe)!jgx1MiY+6ACGk>B1}>Uzod{Xazn;K(ms&0wk#~r+8%mrDi~8) zGvALTSVy=-YMAdRGLk)i9o=fYIhNDoPc_$NMq$X}LdR9aSbh z1=6)fe27iFY57zS?Gv7EuH$27w*v--CW}vKuNhEG#Z=u|W>QnR9fc9CY0uC6oW=|$ zZT1bV+pgP#O06LH6(V!$$}GpP_+{}c9KX6JOwKP8m!L_>5RZKY9TiiCcssBh-v{4- zDQ08NddZ0%uMJFA)NF@p&xr!PAuOil!#%1o{%|Fa1~Ux?1j%pJ!2K4YQ(0EU@O>C0 zl#OIx?L@{OFlhXac(S$ZQ9!sh*8_7ie5^!9(b4=p5GiUMk6LG<_=i!8(fj=<{u2c@ zXOxO@6doE}m z&N}32*WrCu$CXgW6^s$e5bBVd5UWE`OoN!}8Hun+I5L*7m<$gXEYwmsDB;Ix&117r z$(RnxcGxN9N$r&8F+1hW)IuuaD?G7~nkNuB7?L`JWJn6^fWb;a?6rVgb6Wg`7Tiqi zOwxFx)>U}QW}#bFD$^=cs|_8_GixB}>lxUbhfJI3IIx5f4^n8a!Y}IKmh6D<^>!*& z4b*8n?WiYbWZtr2~~0v(YCch(~hp-DZ#YxVe7E!pMt zSvKyLP6jTv(xS<*TRI6zNk1u#n+g8*stE0@3a_sUhp~_4NcJntldzBXSW{{#`!F;u zJYgU6_>R6F*rzi{>=SI;uxsc5P7B-gnvD|6T&l3JV#5Aui2(mUM@kyJS z>q%)^`Q5oRVgi$-rM1>NO2asqu;`la8>LJ8MxL~9%wv6XHSHU;-uJ1Qn9Vgempf|a zTuG?8xokv#)t8hG4poQcFd=&I8qpPQV(Qg|0w~n)g9kC2@rXO|h*Labk4No}c+@uH z!AUT<3_NOJfS@#qAhjUr(RP659>ZWm5R^#$)7A=mzwM5#uo&bNi{`X2pU{pz@h+Po z6Fg~Q3~3Q<6N{;^$)vE!jkK}2&cY^PZ2~ziBZZBpoxw4e4#${7hWmJ*b;tKnqq4FM z4eN-F%t6L#n{Orr{BT4Dfkt9z#lFVZx=~jCrO+&8RYPOYS;2$6Fg@o^NKixGw z|7cx{QS{Db5ZsBqisd~-v5hZ-o=xPyEn^@hU?jXxX|>x+t96#9QQ;-($orNta(fvg zon?%q7>%T*F)O|gMmugVZAWKmJJQm2q@^Ld->08s(W@&};<*+Yk_g3LbAH|1cUL-I+ zsBJp?I>7lTeySY*JbBm#(wYe?NPGnKCw@ZPc=3^_`6cr`nsFc4{rI7o^rp{U;m*yE zKUdpb&A6G;wlpeS&8Q2e29&3g##CxsGp@INiwED~$hZ&boYf_c4_2$SF?)=A zU$wfw3O4%Z#z*&!j~_Tt-&3#dogG`)KesS@V0O>Kf!e}Y zeROtletvxK!r0ip(eVSd@qK&1cdR-)x@UfTbZ@P8pjM}}{d;iD?>(?kUD!W1UmdIN z+q-{pesS;o-o?3vJ&TLu^Wz7`=NHDu$7%=mE$plAUl^NT7~4~?@0+VG?%h|d&yQ9Y z#`n%G?pat^m|q+_04Zt*4pis&RmVo_!iVw~>-E{i**ymi%yEs`LhV3(|Kj4pY^^rF z|3GcFwm1%=i(|F=D8-Lg$Hw=LRk_EpK3A{r-M3iVKVM&59NjZJI#)k1woqGGggpD| z)zSU+#XC^=$d4)fmrUU~c=$vI4?oGZp{qaU;=fcb-b~{eu0Z}VjsH?5MS=JEB+4C* zf;k@0A?TUxJ)hy`na4XW>E+^}bI-4u+<#~C6Hh6vat;wP^tqfH`q>=EsHct{T$_2~ zSO4WVK6T}9eg3tNKljaVDZ~8FoCtS_otR&kUs^uFz4s^1axqWsWc4H$GcR!AWan5~ zsn4nSzf%8B{q)%zs8VrXhpY$E8Ss!$4}+lcm2>)5N^`zHtP~aIZoyc$n1~=DQPTj_{!leVk_%yL=q`5t;;$C4e?g4|U z8^iTb@Qu2CxIP6fD)g(a1y}+j{X6W0=chxt3f1TQ6FSLfxAgpl_>LKU{S8vO{y-Nn zv|IcBbgda(H|E<+U0qkwN!u~YbC4eFyiuqEcZt%;O+o6jjrpv>e-*&doa>_<*B<_> N(3l^$;op`5{~x`C!AAf9 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe deleted file mode 100644 index b1c416d5314029b540c5720c85122dd8fec09f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80384 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 cfJf}V$Db - - -

- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll deleted file mode 100644 index cb691377e090bc944deb1dfcd219763c23985093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11264 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 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll deleted file mode 100644 index 1accffc18dd5a1b62ef223bcffabc9cb156b3d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151040 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 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config deleted file mode 100644 index d6c61f707..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config +++ /dev/null @@ -1,39 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll deleted file mode 100644 index 47cd9ad41bd21c765693ef396831e01a13f80f8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301056 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 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt b/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt deleted file mode 100644 index e8367515a..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - -

Code Coverage Report

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Generated on: - - -
- Parser: - - Pawan Tiwari's Parser -
- Assemblies: - - -
- Files: - - -
- Coverage: - - % -
- Covered lines: - - -
- UnCovered lines: - - -
- Coverable lines: - - -
- Total lines: - - Yet To be discovered - -
-

- Assemblies -

-

- Collapse all classes | Expand all classes -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - Details -
- - - - - - - - - - - - - - - - - - - - - -
- Classes: - - -
- Covered lines: - - -
- Coverable lines: - - -
- Coverage: - - - - % - - - 0 - - -
-
-
- - % - - - - - - - - -
-   - -   -
-
-

- Class Name: -

-
- % - - - - - - - -
-   - -   -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Class: - - -
- Assembly: - - -
- File(s): - - - - - - - -
- Coverage: - - - % -
- Covered lines: - - -
- Coverable lines: - - -
- Total lines: - - 51 -
-
- - - - - - - - - - - - - - - - - -
- Method - - Cyclomatic Complexity - - Sequence Coverage - - Branch Coverage - - Static Method -
- - - - - - - - - - -
-
- - - diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 b/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 deleted file mode 100644 index 72008aafa..000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -[CmdletBinding()] -Param( - [Parameter(Mandatory=$True,Position=1)] - [string]$xsl, - - [Parameter(Mandatory=$True)] - [string]$xml, - - [Parameter(Mandatory=$True)] - [string]$output -) - -$xslt = New-Object System.Xml.Xsl.XslCompiledTransform; -$xslt.Load($xsl); -$xslt.Transform($xml, $output); - -Write-Host "The file has been transformed." From 1dac8dbfb003653a056ee03b831908f18094a4be Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Thu, 8 Jun 2017 18:15:45 +0100 Subject: [PATCH 010/136] [SL.Core] rename project from Primitives to Core --- README.md | 2 +- ...abors.Primitives.ruleset => SixLabors.Core.ruleset | 0 SixLabors.Primitives.sln => SixLabors.Core.sln | 4 ++-- ....sln.DotSettings => SixLabors.Core.sln.DotSettings | 0 appveyor.yml | 2 +- build.cmd | 6 +++--- src/Shared/AssemblyInfo.Common.cs | 6 +++--- .../Constants.cs | 2 +- .../HashHelpers.cs | 2 +- src/{SixLabors.Primitives => SixLabors.Core}/MathF.cs | 2 +- .../Primitives}/Matrix3x2Extensions.cs | 0 .../Primitives}/Point.cs | 0 .../Primitives}/PointF.cs | 0 .../Primitives}/Rectangle.cs | 0 .../Primitives}/RectangleF.cs | 0 .../Primitives}/Size.cs | 0 .../Primitives}/SizeF.cs | 0 .../SixLabors.Core.csproj} | 9 +++++---- .../stylecop.json | 0 tests/CodeCoverage/CodeCoverage.cmd | 8 ++++---- .../Primitives}/PointFTests.cs | 0 .../Primitives}/PointTests.cs | 0 .../Primitives}/RectangleFTests.cs | 0 .../Primitives}/RectangleTests.cs | 0 .../Primitives}/SizeFTests.cs | 0 .../Primitives}/SizeTests.cs | 0 .../SixLabors.Core.Tests.csproj} | 11 ++++++----- 27 files changed, 28 insertions(+), 26 deletions(-) rename SixLabors.Primitives.ruleset => SixLabors.Core.ruleset (100%) rename SixLabors.Primitives.sln => SixLabors.Core.sln (86%) rename SixLabors.Primitives.sln.DotSettings => SixLabors.Core.sln.DotSettings (100%) rename src/{SixLabors.Primitives => SixLabors.Core}/Constants.cs (93%) rename src/{SixLabors.Primitives => SixLabors.Core}/HashHelpers.cs (95%) rename src/{SixLabors.Primitives => SixLabors.Core}/MathF.cs (99%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/Matrix3x2Extensions.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/Point.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/PointF.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/Rectangle.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/RectangleF.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/Size.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/SizeF.cs (100%) rename src/{SixLabors.Primitives/SixLabors.Primitives.csproj => SixLabors.Core/SixLabors.Core.csproj} (87%) rename src/{SixLabors.Primitives => SixLabors.Core}/stylecop.json (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/PointFTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/PointTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/RectangleFTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/RectangleTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/SizeFTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/SizeTests.cs (100%) rename tests/{SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj => SixLabors.Core.Tests/SixLabors.Core.Tests.csproj} (87%) diff --git a/README.md b/README.md index 635228705..5b92ec28f 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# Primitives +# Core Point, Rectangle, Size Primitives for use across SixLabors libraries. diff --git a/SixLabors.Primitives.ruleset b/SixLabors.Core.ruleset similarity index 100% rename from SixLabors.Primitives.ruleset rename to SixLabors.Core.ruleset diff --git a/SixLabors.Primitives.sln b/SixLabors.Core.sln similarity index 86% rename from SixLabors.Primitives.sln rename to SixLabors.Core.sln index b1a03f64f..63fe397d4 100644 --- a/SixLabors.Primitives.sln +++ b/SixLabors.Core.sln @@ -21,9 +21,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A src\Shared\stylecop.json = src\Shared\stylecop.json EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives", "src\SixLabors.Primitives\SixLabors.Primitives.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core", "src\SixLabors.Core\SixLabors.Core.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives.Tests", "tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core.Tests", "tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/SixLabors.Primitives.sln.DotSettings b/SixLabors.Core.sln.DotSettings similarity index 100% rename from SixLabors.Primitives.sln.DotSettings rename to SixLabors.Core.sln.DotSettings diff --git a/appveyor.yml b/appveyor.yml index 0c1d45047..edb297ed4 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,7 @@ build_script: - cmd: tests\CodeCoverage\CodeCoverage.cmd after_build: - - cmd: appveyor PushArtifact "artifacts\SixLabors.Primitives.%GitVersion_NuGetVersion%.nupkg" + - cmd: appveyor PushArtifact "artifacts\SixLabors.Core.%GitVersion_NuGetVersion%.nupkg" deploy: - provider: NuGet diff --git a/build.cmd b/build.cmd index 727bdf880..d1eaa59b0 100644 --- a/build.cmd +++ b/build.cmd @@ -14,13 +14,13 @@ if not "%GitVersion_NuGetVersion%" == "" ( ) if not "%errorlevel%"=="0" goto failure -dotnet test ./tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj +dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Primitives.Tests.csproj if not "%GitVersion_NuGetVersion%" == "" ( - dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% + dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% )ELSE ( - dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build + dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build ) if not "%errorlevel%"=="0" goto failure diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/Shared/AssemblyInfo.Common.cs index b140dd917..c9cc15b73 100644 --- a/src/Shared/AssemblyInfo.Common.cs +++ b/src/Shared/AssemblyInfo.Common.cs @@ -12,8 +12,8 @@ using System.Runtime.CompilerServices; // associated with an assembly. [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Scott Williams")] -[assembly: AssemblyProduct("SixLabors.Primitives")] +[assembly: AssemblyCompany("Six Labors")] +[assembly: AssemblyProduct("SixLabors.Core")] [assembly: AssemblyCopyright("Copyright (c) Six Labors and contributors.")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -34,4 +34,4 @@ using System.Runtime.CompilerServices; [assembly: AssemblyInformationalVersion("1.0.0.0")] // Ensure the internals can be tested. -[assembly: InternalsVisibleTo("SixLabors.Primitives.Tests")] +[assembly: InternalsVisibleTo("SixLabors.Core.Tests")] diff --git a/src/SixLabors.Primitives/Constants.cs b/src/SixLabors.Core/Constants.cs similarity index 93% rename from src/SixLabors.Primitives/Constants.cs rename to src/SixLabors.Core/Constants.cs index 44f68f898..1d9dd24d9 100644 --- a/src/SixLabors.Primitives/Constants.cs +++ b/src/SixLabors.Core/Constants.cs @@ -3,7 +3,7 @@ // Licensed under the Apache License, Version 2.0. // -namespace SixLabors.Primitives +namespace SixLabors { /// /// Common constants used throughout the project diff --git a/src/SixLabors.Primitives/HashHelpers.cs b/src/SixLabors.Core/HashHelpers.cs similarity index 95% rename from src/SixLabors.Primitives/HashHelpers.cs rename to src/SixLabors.Core/HashHelpers.cs index d622d308c..e481e03da 100644 --- a/src/SixLabors.Primitives/HashHelpers.cs +++ b/src/SixLabors.Core/HashHelpers.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace SixLabors.Primitives +namespace SixLabors { // lifted from coreFX repo internal static class HashHelpers diff --git a/src/SixLabors.Primitives/MathF.cs b/src/SixLabors.Core/MathF.cs similarity index 99% rename from src/SixLabors.Primitives/MathF.cs rename to src/SixLabors.Core/MathF.cs index eeaca821b..b05914e74 100644 --- a/src/SixLabors.Primitives/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -3,7 +3,7 @@ // Licensed under the Apache License, Version 2.0. // -namespace SixLabors.Primitives +namespace SixLabors { using System; using System.Runtime.CompilerServices; diff --git a/src/SixLabors.Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs similarity index 100% rename from src/SixLabors.Primitives/Matrix3x2Extensions.cs rename to src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs similarity index 100% rename from src/SixLabors.Primitives/Point.cs rename to src/SixLabors.Core/Primitives/Point.cs diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs similarity index 100% rename from src/SixLabors.Primitives/PointF.cs rename to src/SixLabors.Core/Primitives/PointF.cs diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs similarity index 100% rename from src/SixLabors.Primitives/Rectangle.cs rename to src/SixLabors.Core/Primitives/Rectangle.cs diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs similarity index 100% rename from src/SixLabors.Primitives/RectangleF.cs rename to src/SixLabors.Core/Primitives/RectangleF.cs diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs similarity index 100% rename from src/SixLabors.Primitives/Size.cs rename to src/SixLabors.Core/Primitives/Size.cs diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs similarity index 100% rename from src/SixLabors.Primitives/SizeF.cs rename to src/SixLabors.Core/Primitives/SizeF.cs diff --git a/src/SixLabors.Primitives/SixLabors.Primitives.csproj b/src/SixLabors.Core/SixLabors.Core.csproj similarity index 87% rename from src/SixLabors.Primitives/SixLabors.Primitives.csproj rename to src/SixLabors.Core/SixLabors.Core.csproj index 3a1265cff..f7f25dfc1 100644 --- a/src/SixLabors.Primitives/SixLabors.Primitives.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -9,14 +9,14 @@ netstandard1.1 true true - SixLabors.Primitives - SixLabors.Primitives + SixLabors.Core + SixLabors.Core rectangle;point;size,primitives https://raw.githubusercontent.com/SixLabors/Home/master/logo.png - https://github.com/SixLabors/Primitives + https://github.com/SixLabors/Core http://www.apache.org/licenses/LICENSE-2.0 git - https://github.com/SixLabors/Primitives + https://github.com/SixLabors/Core false false false @@ -27,6 +27,7 @@ false false full + SixLabors diff --git a/src/SixLabors.Primitives/stylecop.json b/src/SixLabors.Core/stylecop.json similarity index 100% rename from src/SixLabors.Primitives/stylecop.json rename to src/SixLabors.Core/stylecop.json diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd index 2547eace1..7a89ab210 100644 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -7,15 +7,15 @@ nuget restore packages.config -PackagesDirectory . cd .. cd .. -dotnet restore SixLabors.Primitives.sln -dotnet build SixLabors.Primitives.sln --no-incremental -c debug /p:codecov=true +dotnet restore SixLabors.Core.sln +dotnet build SixLabors.Core.sln --no-incremental -c debug /p:codecov=true rem The -threshold options prevents this taking ages... rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Primitives.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Primitives.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" if %errorlevel% neq 0 exit /b %errorlevel% SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH% pip install codecov -codecov -f "SixLabors.Primitives.Coverage.xml" \ No newline at end of file +codecov -f "SixLabors.Core.Coverage.xml" \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/PointFTests.cs rename to tests/SixLabors.Core.Tests/Primitives/PointFTests.cs diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/PointTests.cs rename to tests/SixLabors.Core.Tests/Primitives/PointTests.cs diff --git a/tests/SixLabors.Primitives.Tests/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/RectangleFTests.cs rename to tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs diff --git a/tests/SixLabors.Primitives.Tests/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/RectangleTests.cs rename to tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs diff --git a/tests/SixLabors.Primitives.Tests/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/SizeFTests.cs rename to tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs diff --git a/tests/SixLabors.Primitives.Tests/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/SizeTests.cs rename to tests/SixLabors.Core.Tests/Primitives/SizeTests.cs diff --git a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj similarity index 87% rename from tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj rename to tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index 2dd674fdc..cd34a8421 100644 --- a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -3,7 +3,7 @@ 0.0.0 netcoreapp1.1 - SixLabors.Primitives.Tests + SixLabors.Core.Tests SixLabors.Shapes.Tests true false @@ -13,12 +13,9 @@ false false full + SixLabors.Tests - - - - @@ -26,6 +23,10 @@ + + + + From d563233bf47625750963edc31c495fc103d2fe09 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 9 Jun 2017 20:17:21 +0100 Subject: [PATCH 011/136] [SL.Core] add center property to rectangle --- src/SixLabors.Core/Primitives/Rectangle.cs | 10 ++++++++++ src/SixLabors.Core/Primitives/RectangleF.cs | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 735920f0a..e7fa21867 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -110,6 +110,16 @@ namespace SixLabors.Primitives } } + /// + /// Gets the coordinates of the center of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Point Center + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new Point(this.X + (this.Width / 2), this.Y + (this.Height / 2)); + } + /// /// Gets a value indicating whether this is empty. /// diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 36578a455..f914091b3 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -110,6 +110,16 @@ namespace SixLabors.Primitives } } + /// + /// Gets the coordinates of the center of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public PointF Center + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new PointF(this.X + (this.Width / 2), this.Y + (this.Height / 2)); + } + /// /// Gets a value indicating whether this is empty. /// From 90dff77ca3a0112dc47eb6e2355555054bdc00a5 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 9 Jun 2017 20:18:25 +0100 Subject: [PATCH 012/136] [SL.Core] add multiplication and divide operators to Point --- src/SixLabors.Core/Primitives/Point.cs | 34 +++++++++++++++++++++++++ src/SixLabors.Core/Primitives/PointF.cs | 34 +++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 5d37d01a6..f922711aa 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -127,6 +127,31 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point operator -(Point point, Size size) => Subtract(point, size); + /// + /// Multiplies by a producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static Point operator *(int left, Point right) => Multiply(right, left); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static Point operator *(Point left, int right) => Multiply(left, right); + + /// + /// Divides by a producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static Point operator /(Point left, int right) + => new Point(left.X / right, left.Y / right); + /// /// Compares two objects for equality. /// @@ -158,6 +183,15 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Add(Point point, Size size) => new Point(unchecked(point.X + size.Width), unchecked(point.Y + size.Height)); + /// + /// Translates a by the negative of a given value + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Multiply(Point point, int value) => new Point(unchecked(point.X * value), unchecked(point.Y * value)); + /// /// Translates a by the negative of a given . /// diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index ca011483e..032ba6726 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -145,6 +145,31 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator -(PointF point, SizeF size) => Subtract(point, size); + /// + /// Multiplies by a producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static PointF operator *(float left, PointF right) => Multiply(right, left); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static PointF operator *(PointF left, float right) => Multiply(left, right); + + /// + /// Divides by a producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static PointF operator /(PointF left, float right) + => new PointF(left.X / right, left.Y / right); + /// /// Compares two objects for equality. /// @@ -212,6 +237,15 @@ namespace SixLabors.Primitives public static PointF Subtract(PointF point, PointF pointb) => new PointF(point.X - pointb.X, point.Y - pointb.Y); /// + /// Translates a by the multiplying the X and Y by the given value. + /// + /// The point on the left hand of the operand. + /// The value on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Multiply(PointF point, float right) => new PointF(point.X * right, point.Y * right); + + /// PointF /// Rotates a point around the given rotation matrix. /// /// The point to rotate From cf9f6451b5e7f3fb2cd2659c8e5a144f8932a8a4 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 9 Jun 2017 20:19:57 +0100 Subject: [PATCH 013/136] [SL.Core] Revert "add center property to rectangle" This reverts commit bdd54d39b39e8c40e123587530dc489a54daddea. --- src/SixLabors.Core/Primitives/Rectangle.cs | 10 ---------- src/SixLabors.Core/Primitives/RectangleF.cs | 10 ---------- 2 files changed, 20 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index e7fa21867..735920f0a 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -110,16 +110,6 @@ namespace SixLabors.Primitives } } - /// - /// Gets the coordinates of the center of the rectangular region represented by this . - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public Point Center - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => new Point(this.X + (this.Width / 2), this.Y + (this.Height / 2)); - } - /// /// Gets a value indicating whether this is empty. /// diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index f914091b3..36578a455 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -110,16 +110,6 @@ namespace SixLabors.Primitives } } - /// - /// Gets the coordinates of the center of the rectangular region represented by this . - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public PointF Center - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => new PointF(this.X + (this.Width / 2), this.Y + (this.Height / 2)); - } - /// /// Gets a value indicating whether this is empty. /// From 39aafb1d7aa956162ad3c833ad8cf81907b8ac43 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 10 Jun 2017 10:10:45 +0100 Subject: [PATCH 014/136] [SL.Core] drop zero in favor of empty doing this to be consistent with System.Drawing.Primitives --- src/SixLabors.Core/Primitives/Point.cs | 5 ----- src/SixLabors.Core/Primitives/PointF.cs | 5 ----- src/SixLabors.Core/Primitives/Size.cs | 5 ----- src/SixLabors.Core/Primitives/SizeF.cs | 5 ----- 4 files changed, 20 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index f922711aa..04779ee9b 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -25,11 +25,6 @@ namespace SixLabors.Primitives /// public static readonly Point Empty = default(Point); - /// - /// Represents a that has X and Y values set to zero. - /// - public static readonly Point Zero = new Point(0, 0); - /// /// Initializes a new instance of the struct. /// diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 032ba6726..985eda0fe 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -25,11 +25,6 @@ namespace SixLabors.Primitives ///

public static readonly PointF Empty = default(PointF); - /// - /// Represents a that has X and Y values set to zero. - /// - public static readonly PointF Zero = new PointF(0, 0); - /// /// Initializes a new instance of the struct. /// diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index abc7ad4cb..799768a8f 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -23,11 +23,6 @@ namespace SixLabors.Primitives /// Represents a that has Width and Height values set to zero. ///
public static readonly Size Empty = default(Size); - /// - /// Represents a that has Width and Height values set to zero. - /// - public static readonly Size Zero = new Size(0, 0); - /// /// Initializes a new instance of the struct. diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index e356a4edb..d1d05e501 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -24,11 +24,6 @@ namespace SixLabors.Primitives /// public static readonly SizeF Empty = default(SizeF); - /// - /// Represents a that has Width and Height values set to zero. - /// - public static readonly SizeF Zero = new SizeF(0, 0); - /// /// Initializes a new instance of the struct. /// From 7e377e605dce6682ec81e90248db500c43fd20de Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 10 Jun 2017 13:13:30 +0100 Subject: [PATCH 015/136] [SL.Core] remove IsEmpty based ToString() branches --- src/SixLabors.Core/Primitives/Point.cs | 5 ----- src/SixLabors.Core/Primitives/PointF.cs | 5 ----- src/SixLabors.Core/Primitives/Rectangle.cs | 5 ----- src/SixLabors.Core/Primitives/RectangleF.cs | 5 ----- src/SixLabors.Core/Primitives/Size.cs | 5 ----- src/SixLabors.Core/Primitives/SizeF.cs | 5 ----- tests/SixLabors.Core.Tests/Primitives/PointFTests.cs | 7 ------- tests/SixLabors.Core.Tests/Primitives/PointTests.cs | 7 ------- tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs | 7 ------- tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs | 7 ------- tests/SixLabors.Core.Tests/Primitives/SizeTests.cs | 7 ------- 11 files changed, 65 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 04779ee9b..ca808c7ef 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -274,11 +274,6 @@ namespace SixLabors.Primitives /// public override string ToString() { - if (this.IsEmpty) - { - return "Point [ Empty ]"; - } - return $"Point [ X={this.X}, Y={this.Y} ]"; } diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 985eda0fe..e2bfa5e50 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -283,11 +283,6 @@ namespace SixLabors.Primitives /// public override string ToString() { - if (this.IsEmpty) - { - return "PointF [ Empty ]"; - } - return $"PointF [ X={this.X}, Y={this.Y} ]"; } diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 735920f0a..981eee523 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -437,11 +437,6 @@ namespace SixLabors.Primitives /// public override string ToString() { - if (this.IsEmpty) - { - return "Rectangle [ Empty ]"; - } - return $"Rectangle [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; } diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 36578a455..a126008bf 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -370,11 +370,6 @@ namespace SixLabors.Primitives /// public override string ToString() { - if (this.IsEmpty) - { - return "RectangleF [ Empty ]"; - } - return $"RectangleF [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; } diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 799768a8f..77aa037cf 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -264,11 +264,6 @@ namespace SixLabors.Primitives /// public override string ToString() { - if (this.IsEmpty) - { - return "Size [ Empty ]"; - } - return $"Size [ Width={this.Width}, Height={this.Height} ]"; } diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index d1d05e501..9c44e2355 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -194,11 +194,6 @@ namespace SixLabors.Primitives /// public override string ToString() { - if (this.IsEmpty) - { - return "SizeF [ Empty ]"; - } - return $"SizeF [ Width={this.Width}, Height={this.Height} ]"; } diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index 7406b10cd..b6294cb1a 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -181,12 +181,5 @@ namespace SixLabors.Primitives.Tests var p = new PointF(5.1F, -5.123F); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "PointF [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); } - - [Fact] - public void ToStringEmptyTest() - { - var p = new PointF(0, 0); - Assert.Equal("PointF [ Empty ]", p.ToString()); - } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 495a34ff6..3f17aebfc 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -241,12 +241,5 @@ namespace SixLabors.Primitives.Tests var p = new Point(5, -5); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Point [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); } - - [Fact] - public void ToStringEmptyTest() - { - var p = new Point(0, 0); - Assert.Equal("Point [ Empty ]", p.ToString()); - } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 24ac4fae1..640b27d67 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -297,12 +297,5 @@ namespace SixLabors.Primitives.Tests var r = new Rectangle(5, -5, 0, 1); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Rectangle [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); } - - [Fact] - public void ToStringTestEmpty() - { - var r = new Rectangle(0, 0, 0, 0); - Assert.Equal("Rectangle [ Empty ]", r.ToString()); - } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index e4dec3fd6..1cd3858c2 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -153,13 +153,6 @@ namespace SixLabors.Primitives.Tests Assert.Equal(string.Format(CultureInfo.CurrentCulture, "SizeF [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); } - [Fact] - public void ToStringTestEmpty() - { - var sz = new SizeF(0, 0); - Assert.Equal("SizeF [ Empty ]", sz.ToString()); - } - [Theory] [InlineData(1000.234f, 0.0f)] [InlineData(1000.234f, 1.0f)] diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs index 821cf1691..0117e5914 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs @@ -186,13 +186,6 @@ namespace SixLabors.Primitives.Tests Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Size [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); } - [Fact] - public void ToStringTestEmpty() - { - var sz = new Size(0, 0); - Assert.Equal("Size [ Empty ]", sz.ToString()); - } - [Theory] [InlineData(1000, 0)] [InlineData(1000, 1)] From a2349bf0b8ebe60e449031873d3cdad4f4afdefb Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:06:07 +0200 Subject: [PATCH 016/136] [SL.Core] Moved files in the Shared folder. --- SixLabors.Core.sln | 9 +-------- .../Properties/AssemblyInfo.cs} | 1 + src/SixLabors.Core/SixLabors.Core.csproj | 4 ++-- src/SixLabors.Core/stylecop.json | 9 --------- src/Shared/stylecop.json => stylecop.json | 0 5 files changed, 4 insertions(+), 19 deletions(-) rename src/{Shared/AssemblyInfo.Common.cs => SixLabors.Core/Properties/AssemblyInfo.cs} (96%) delete mode 100644 src/SixLabors.Core/stylecop.json rename src/Shared/stylecop.json => stylecop.json (100%) diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index 63fe397d4..dbd9600ee 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26430.12 +VisualStudioVersion = 15.0.26430.14 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject @@ -15,12 +15,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C06 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A07-F879-4811-9C41-5CBDC6BAFDB7}" - ProjectSection(SolutionItems) = preProject - src\Shared\AssemblyInfo.Common.cs = src\Shared\AssemblyInfo.Common.cs - src\Shared\stylecop.json = src\Shared\stylecop.json - EndProjectSection -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core", "src\SixLabors.Core\SixLabors.Core.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core.Tests", "tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" @@ -44,7 +38,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {9E574A07-F879-4811-9C41-5CBDC6BAFDB7} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} EndGlobalSection diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs similarity index 96% rename from src/Shared/AssemblyInfo.Common.cs rename to src/SixLabors.Core/Properties/AssemblyInfo.cs index c9cc15b73..8a219d50d 100644 --- a/src/Shared/AssemblyInfo.Common.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -10,6 +10,7 @@ using System.Runtime.CompilerServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. +[assembly: AssemblyTitle("SixLabors.Primitives")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Six Labors")] diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index f7f25dfc1..5d03d443a 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -2,7 +2,6 @@ Low level primitives for use across Six Labors projects.. - SixLabors.Primitives $(packageversion) 0.1.0-alpha1 Six Labors @@ -26,12 +25,13 @@ false false false + false full SixLabors - + diff --git a/src/SixLabors.Core/stylecop.json b/src/SixLabors.Core/stylecop.json deleted file mode 100644 index de88a8bfe..000000000 --- a/src/SixLabors.Core/stylecop.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", - "settings": { - "documentationRules": { - "companyName": "Six Labors", - "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." - } - } -} \ No newline at end of file diff --git a/src/Shared/stylecop.json b/stylecop.json similarity index 100% rename from src/Shared/stylecop.json rename to stylecop.json From 9b632f308bdce99a5d535c65a7be16d8e2da2c96 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:08:04 +0200 Subject: [PATCH 017/136] [SL.Core] Whitespace --- build.cmd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.cmd b/build.cmd index d1eaa59b0..eaa54e861 100644 --- a/build.cmd +++ b/build.cmd @@ -2,14 +2,14 @@ if not "%GitVersion_NuGetVersion%" == "" ( dotnet restore /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( - dotnet restore +)ELSE ( + dotnet restore ) ECHO Building nuget packages if not "%GitVersion_NuGetVersion%" == "" ( dotnet build -c Release /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( +)ELSE ( dotnet build -c Release ) if not "%errorlevel%"=="0" goto failure @@ -19,7 +19,7 @@ dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Primitives.Tests.csproj if not "%GitVersion_NuGetVersion%" == "" ( dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( +)ELSE ( dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build ) From 1e43e5096cc776da531168eeff2a3f29a8c853e6 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:15:03 +0200 Subject: [PATCH 018/136] [SL.Core] Fixed version numbers --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 6 +++--- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 8a219d50d..ab2cf3b4a 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -30,9 +30,9 @@ using System.Runtime.CompilerServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] -[assembly: AssemblyInformationalVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] +[assembly: AssemblyInformationalVersion("0.1.0-alpha02")] // Ensure the internals can be tested. [assembly: InternalsVisibleTo("SixLabors.Core.Tests")] diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 5d03d443a..66b67c535 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -3,7 +3,7 @@ Low level primitives for use across Six Labors projects.. $(packageversion) - 0.1.0-alpha1 + 0.1.0-alpha2 Six Labors netstandard1.1 true From b89b4cf4438c896c52eb2fd1235d7bf37e0a905b Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:17:30 +0200 Subject: [PATCH 019/136] [SL.Core] Renamed ruleset file. --- SixLabors.Core.ruleset => SixLabors.ruleset | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename SixLabors.Core.ruleset => SixLabors.ruleset (100%) diff --git a/SixLabors.Core.ruleset b/SixLabors.ruleset similarity index 100% rename from SixLabors.Core.ruleset rename to SixLabors.ruleset From 55a161570b2a2be87fc6573af745d8be52c1bcc2 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:21:59 +0200 Subject: [PATCH 020/136] [SL.Core] Enabled stylecop. --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 4 ++-- src/SixLabors.Core/SixLabors.Core.csproj | 8 ++++++++ stylecop.json | 18 ++++++++++++------ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index ab2cf3b4a..b7c0287db 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -1,5 +1,5 @@ -// -// Copyright (c) Scott Williams and contributors. +// +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. // diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 66b67c535..c479c3cc1 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -30,11 +30,19 @@ SixLabors + + ..\..\SixLabors.ruleset + + + + + All + diff --git a/stylecop.json b/stylecop.json index df3c8c9d8..02d23f59d 100644 --- a/stylecop.json +++ b/stylecop.json @@ -1,9 +1,15 @@ { - "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", - "settings": { - "documentationRules": { - "companyName": "Scott Williams", - "copyrightText": "Copyright (c) Scott Williams and contributors.\nLicensed under the Apache License, Version 2.0." + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": + { + "orderingRules": + { + "usingDirectivesPlacement": "outsideNamespace" + }, + "documentationRules": + { + "companyName": "Six Labors", + "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." + } } - } } \ No newline at end of file From f58afef9ef6457014c36c741ada3faee46fd8223 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:34:29 +0200 Subject: [PATCH 021/136] [SL.Core] Fixed all stylecop warnings. --- src/SixLabors.Core/HashHelpers.cs | 19 +++-- src/SixLabors.Core/MathF.cs | 6 +- .../Primitives/Matrix3x2Extensions.cs | 4 +- src/SixLabors.Core/Primitives/Point.cs | 38 +++++----- src/SixLabors.Core/Primitives/PointF.cs | 32 ++++----- src/SixLabors.Core/Primitives/Rectangle.cs | 36 +++++----- src/SixLabors.Core/Primitives/RectangleF.cs | 36 +++++----- src/SixLabors.Core/Primitives/Size.cs | 72 +++++++++---------- src/SixLabors.Core/Primitives/SizeF.cs | 64 ++++++++--------- 9 files changed, 157 insertions(+), 150 deletions(-) diff --git a/src/SixLabors.Core/HashHelpers.cs b/src/SixLabors.Core/HashHelpers.cs index e481e03da..39a94d989 100644 --- a/src/SixLabors.Core/HashHelpers.cs +++ b/src/SixLabors.Core/HashHelpers.cs @@ -1,14 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Text; +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// namespace SixLabors { - // lifted from coreFX repo + /// + /// Lifted from coreFX repo + /// internal static class HashHelpers { - public static readonly int RandomSeed = Guid.NewGuid().GetHashCode(); - + /// + /// Combines the two specified hash codes. + /// + /// Hash code one + /// Hash code two + /// Returns a hash code for the two specified has codes. public static int Combine(int h1, int h2) { unchecked diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index b05914e74..d099cb3b8 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -3,11 +3,11 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.Runtime.CompilerServices; + namespace SixLabors { - using System; - using System.Runtime.CompilerServices; - /// /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. /// diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs index 626be8ed7..c54ce6593 100644 --- a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs +++ b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs @@ -3,10 +3,10 @@ // Licensed under the Apache License, Version 2.0. // +using System.Numerics; + namespace SixLabors.Primitives { - using System.Numerics; - /// /// Extension methods for the struct. /// diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index ca808c7ef..f21657572 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Represents an ordered pair of integer x- and y-coordinates that defines a point in /// a two-dimensional plane. @@ -182,7 +182,7 @@ namespace SixLabors.Primitives /// Translates a by the negative of a given value /// /// The point on the left hand of the operand. - /// The size on the right hand of the operand. + /// The value on the right hand of the operand. /// The [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Multiply(Point point, int value) => new Point(unchecked(point.X * value), unchecked(point.Y * value)); @@ -212,6 +212,17 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); + /// + /// Transforms a point by the given matrix. + /// + /// The source point. + /// The transformation matrix. + /// A transformed point. + public static PointF Transform(Point position, Matrix3x2 matrix) + { + return Vector2.Transform(position, matrix); + } + /// /// Converts a to a by performing a truncate operation on all the coordinates. /// @@ -235,7 +246,7 @@ namespace SixLabors.Primitives /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Rotate(Point point, System.Numerics.Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); /// /// Skews a point using the given skew matrix. @@ -244,7 +255,7 @@ namespace SixLabors.Primitives /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Skew(Point point, System.Numerics.Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); /// /// Translates this by the specified amount. @@ -289,16 +300,5 @@ namespace SixLabors.Primitives private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); private int GetHashCode(Point point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); - - /// - /// Transforms a point by the given matrix. - /// - /// The source point - /// The transformation matrix. - /// - public static PointF Transform(Point position, Matrix3x2 matrix) - { - return Vector2.Transform(position, matrix); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index e2bfa5e50..b4ae390c3 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Represents an ordered pair of single precision floating point x- and y-coordinates that defines a point in /// a two-dimensional plane. @@ -258,6 +258,17 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Skew(PointF point, Matrix3x2 skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); + /// + /// Transforms a point by the given matrix. + /// + /// The source point. + /// The transformation matrix. + /// A transformed point. + public static PointF Transform(PointF position, Matrix3x2 matrix) + { + return Vector2.Transform(position, matrix); + } + /// /// Translates this by the specified amount. /// @@ -303,16 +314,5 @@ namespace SixLabors.Primitives /// A 32-bit signed integer that is the hash code for this instance. /// private int GetHashCode(PointF point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); - - /// - /// Transforms a point by the given matrix. - /// - /// The source point - /// The transformation matrix. - /// - public static PointF Transform(PointF position, Matrix3x2 matrix) - { - return Vector2.Transform(position, matrix); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 981eee523..9969e9ba6 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Stores a set of four integers that represent the location and size of a rectangle. /// @@ -276,6 +276,19 @@ namespace SixLabors.Primitives } } + /// + /// Transforms a rectangle by the given matrix. + /// + /// The source rectangle. + /// The transformation matrix. + /// A transformed rectangle. + public static RectangleF Transform(Rectangle rectangle, Matrix3x2 matrix) + { + PointF bottomRight = Point.Transform(new Point(rectangle.Right, rectangle.Bottom), matrix); + PointF topLeft = Point.Transform(rectangle.Location, matrix); + return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); + } + /// /// Converts a to a by performing a truncate operation on all the coordinates. /// @@ -455,18 +468,5 @@ namespace SixLabors.Primitives hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); return hashCode; } - - /// - /// Transforms a rectangle by the given matrix. - /// - /// The source rectangle - /// The transformation matrix. - /// - public static RectangleF Transform(Rectangle rectangle, Matrix3x2 matrix) - { - PointF bottomRight = Point.Transform(new Point(rectangle.Right, rectangle.Bottom), matrix); - PointF topLeft = Point.Transform(rectangle.Location, matrix); - return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index a126008bf..7069006e1 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Stores a set of four single precision floating points that represent the location and size of a rectangle. /// @@ -251,6 +251,19 @@ namespace SixLabors.Primitives return r; } + /// + /// Transforms a rectangle by the given matrix. + /// + /// The source rectangle. + /// The transformation matrix. + /// A transformed rectangle. + public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) + { + PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); + PointF topLeft = PointF.Transform(rectangle.Location, matrix); + return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); + } + /// /// Creates a rectangle that represents the union between and . /// @@ -388,18 +401,5 @@ namespace SixLabors.Primitives hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); return hashCode; } - - /// - /// Transforms a rectangle by the given matrix. - /// - /// The source rectangle - /// The transformation matrix. - /// - public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) - { - PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); - PointF topLeft = PointF.Transform(rectangle.Location, matrix); - return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 77aa037cf..893717a35 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Stores an ordered pair of integers, which specify a height and width. /// @@ -216,24 +216,6 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); - /// - /// Multiplies by an producing . - /// - /// Multiplicand of type . - /// Multiplier of type . - /// Product of type . - private static Size Multiply(Size size, int multiplier) => - new Size(unchecked(size.Width * multiplier), unchecked(size.Height * multiplier)); - - /// - /// Multiplies by a producing . - /// - /// Multiplicand of type . - /// Multiplier of type . - /// Product of type SizeF. - private static SizeF Multiply(Size size, float multiplier) => - new SizeF(size.Width * multiplier, size.Height * multiplier); - /// /// Converts a to a by performing a ceiling operation on all the dimensions. /// @@ -250,6 +232,19 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Round(SizeF size) => new Size(unchecked((int)MathF.Round(size.Width)), unchecked((int)MathF.Round(size.Height))); + /// + /// Transforms a size by the given matrix. + /// + /// The source size + /// The transformation matrix. + /// A transformed size. + public static SizeF Transform(Size size, Matrix3x2 matrix) + { + var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + + return new SizeF(v.X, v.Y); + } + /// /// Converts a to a by performing a round operation on all the dimensions. /// @@ -274,6 +269,24 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(Size other) => this.Width == other.Width && this.Height == other.Height; + /// + /// Multiplies by an producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + private static Size Multiply(Size size, int multiplier) => + new Size(unchecked(size.Width * multiplier), unchecked(size.Height * multiplier)); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type SizeF. + private static SizeF Multiply(Size size, float multiplier) => + new SizeF(size.Width * multiplier, size.Height * multiplier); + /// /// Returns the hash code for this instance. /// @@ -284,18 +297,5 @@ namespace SixLabors.Primitives /// A 32-bit signed integer that is the hash code for this instance. /// private int GetHashCode(Size size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); - - /// - /// Transforms a size by the given matrix. - /// - /// The source size - /// The transformation matrix. - /// - public static SizeF Transform(Size size, Matrix3x2 matrix) - { - var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); - - return new SizeF(v.X, v.Y); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index 9c44e2355..af5d8b0bd 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Stores an ordered pair of single precision floating points, which specify a height and width. /// @@ -72,6 +72,16 @@ namespace SixLabors.Primitives [EditorBrowsable(EditorBrowsableState.Never)] public bool IsEmpty => this.Equals(Empty); + /// + /// Creates a with the coordinates of the specified . + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); + /// /// Creates a with the dimensions of the specified by truncating each of the dimensions. /// @@ -177,13 +187,17 @@ namespace SixLabors.Primitives public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); /// - /// Multiplies by a producing . + /// Transforms a size by the given matrix. /// - /// Multiplicand of type . - /// Multiplier of type . - /// Product of type SizeF. - private static SizeF Multiply(SizeF size, float multiplier) => - new SizeF(size.Width * multiplier, size.Height * multiplier); + /// The source size. + /// The transformation matrix. + /// A transformed size. + public static SizeF Transform(SizeF size, Matrix3x2 matrix) + { + var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + + return new SizeF(v.X, v.Y); + } /// public override int GetHashCode() @@ -204,29 +218,15 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(SizeF other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); - private int GetHashCode(SizeF size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); - /// - /// Creates a with the coordinates of the specified . - /// - /// The point. - /// - /// The . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); - - /// - /// Transforms a size by the given matrix. + /// Multiplies by a producing . /// - /// The source size - /// The transformation matrix. - /// - public static SizeF Transform(SizeF size, Matrix3x2 matrix) - { - var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type SizeF. + private static SizeF Multiply(SizeF size, float multiplier) => + new SizeF(size.Width * multiplier, size.Height * multiplier); - return new SizeF(v.X, v.Y); - } + private int GetHashCode(SizeF size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); } } \ No newline at end of file From 0910b0ba36bfb337c104539380f43687b79a15d1 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:35:54 +0200 Subject: [PATCH 022/136] [SL.Core] Changed copyright header. --- src/SixLabors.Core/Constants.cs | 4 +--- src/SixLabors.Core/HashHelpers.cs | 4 +--- src/SixLabors.Core/MathF.cs | 4 +--- src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs | 4 +--- src/SixLabors.Core/Primitives/Point.cs | 4 +--- src/SixLabors.Core/Primitives/PointF.cs | 4 +--- src/SixLabors.Core/Primitives/Rectangle.cs | 4 +--- src/SixLabors.Core/Primitives/RectangleF.cs | 4 +--- src/SixLabors.Core/Primitives/Size.cs | 4 +--- src/SixLabors.Core/Primitives/SizeF.cs | 4 +--- src/SixLabors.Core/Properties/AssemblyInfo.cs | 4 +--- stylecop.json | 2 +- 12 files changed, 12 insertions(+), 34 deletions(-) diff --git a/src/SixLabors.Core/Constants.cs b/src/SixLabors.Core/Constants.cs index 1d9dd24d9..eda2f596f 100644 --- a/src/SixLabors.Core/Constants.cs +++ b/src/SixLabors.Core/Constants.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// namespace SixLabors { diff --git a/src/SixLabors.Core/HashHelpers.cs b/src/SixLabors.Core/HashHelpers.cs index 39a94d989..40a2b3f96 100644 --- a/src/SixLabors.Core/HashHelpers.cs +++ b/src/SixLabors.Core/HashHelpers.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// namespace SixLabors { diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index d099cb3b8..a4ad9ed66 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.Runtime.CompilerServices; diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs index c54ce6593..80c4f4600 100644 --- a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs +++ b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System.Numerics; diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index f21657572..1992d3922 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index b4ae390c3..454e69e5c 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 9969e9ba6..27cba5d15 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 7069006e1..09fa6f1ab 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 893717a35..57884cf5d 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index af5d8b0bd..13c6552ac 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index b7c0287db..8b0316071 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System.Reflection; using System.Resources; diff --git a/stylecop.json b/stylecop.json index 02d23f59d..c67c0db32 100644 --- a/stylecop.json +++ b/stylecop.json @@ -8,7 +8,7 @@ }, "documentationRules": { - "companyName": "Six Labors", + "xmlHeader": false, "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." } } From 3863e7ee57b1c37a37ec8658b4faa9a928fa8ed1 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:36:53 +0200 Subject: [PATCH 023/136] [SL.Core] Moved HashHelpers to a folder. --- src/SixLabors.Core/{ => Helpers}/HashHelpers.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/SixLabors.Core/{ => Helpers}/HashHelpers.cs (100%) diff --git a/src/SixLabors.Core/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs similarity index 100% rename from src/SixLabors.Core/HashHelpers.cs rename to src/SixLabors.Core/Helpers/HashHelpers.cs From d99554be37a59ee248970913bb1af54d73fa1b89 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:43:52 +0200 Subject: [PATCH 024/136] [SL.Core] Fixed value in attribute. --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 8b0316071..b24029bb0 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -8,7 +8,7 @@ using System.Runtime.CompilerServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("SixLabors.Primitives")] +[assembly: AssemblyTitle("SixLabors.Core")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Six Labors")] From 4b940f129420ca944a99a7e02135bb9cf8cb6c8c Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 15:08:07 +0200 Subject: [PATCH 025/136] [SL.Core] Added guards from the ImageSharp project and added InternalsVisibleTo to make sure they can be used. --- src/SixLabors.Core/Helpers/DebugGuard.cs | 201 ++++++++++++++ src/SixLabors.Core/Helpers/Guard.cs | 250 ++++++++++++++++++ src/SixLabors.Core/Properties/AssemblyInfo.cs | 6 + src/SixLabors.Core/SixLabors.Core.csproj | 1 + 4 files changed, 458 insertions(+) create mode 100644 src/SixLabors.Core/Helpers/DebugGuard.cs create mode 100644 src/SixLabors.Core/Helpers/Guard.cs diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs new file mode 100644 index 000000000..f20a763aa --- /dev/null +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -0,0 +1,201 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Diagnostics; + +namespace SixLabors +{ + /// + /// Provides methods to protect against invalid parameters for a DEBUG build. + /// + [DebuggerStepThrough] + internal static class DebugGuard + { + /// + /// Verifies, that the method parameter with specified object value is not null + /// and throws an exception if it is found to be so. + /// + /// The target object, which cannot be null. + /// The name of the parameter that is to be checked. + /// is null + [Conditional("DEBUG")] + public static void NotNull(object target, string parameterName) + { + if (target == null) + { + throw new ArgumentNullException(parameterName); + } + } + + /// + /// Verifies that the specified value is less than a maximum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is greater than the maximum value. + /// + [Conditional("DEBUG")] + public static void MustBeLessThan(TValue value, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(max) >= 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}."); + } + } + + /// + /// Verifies that the specified value is less than or equal to a maximum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is greater than the maximum value. + /// + [Conditional("DEBUG")] + public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(max) > 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}."); + } + } + + /// + /// Verifies that the specified value is greater than a minimum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value. + /// + [Conditional("DEBUG")] + public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) <= 0) + { + throw new ArgumentOutOfRangeException( + parameterName, + $"Value must be greater than {min}."); + } + } + + /// + /// Verifies that the specified value is greater than or equal to a minimum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value. + /// + [Conditional("DEBUG")] + public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) < 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); + } + } + + /// + /// Verifies, that the method parameter with specified target value is true + /// and throws an exception if it is found to be so. + /// + /// + /// The target value, which cannot be false. + /// + /// + /// The name of the parameter that is to be checked. + /// + /// + /// The error message, if any to add to the exception. + /// + /// + /// is false + /// + [Conditional("DEBUG")] + public static void IsTrue(bool target, string parameterName, string message) + { + if (!target) + { + throw new ArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the method parameter with specified target value is false + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be true. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void IsFalse(bool target, string parameterName, string message) + { + if (target) + { + throw new ArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the target span is of same size than the 'other' span. + /// + /// The element type of the spans + /// The target span. + /// The 'other' span to compare 'target' to. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSameSized(Span target, Span other, string parameterName) + where T : struct + { + if (target.Length != other.Length) + { + throw new ArgumentException("Span-s must be the same size!", parameterName); + } + } + + /// + /// Verifies, that the `target` span has the length of 'minSpan', or longer. + /// + /// The element type of the spans + /// The target span. + /// The 'minSpan' span to compare 'target' to. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSizedAtLeast(Span target, Span minSpan, string parameterName) + where T : struct + { + if (target.Length < minSpan.Length) + { + throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); + } + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs new file mode 100644 index 000000000..990187772 --- /dev/null +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -0,0 +1,250 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace SixLabors +{ + /// + /// Provides methods to protect against invalid parameters. + /// + [DebuggerStepThrough] + internal static class Guard + { + /// + /// Verifies, that the method parameter with specified object value is not null + /// and throws an exception if it is found to be so. + /// + /// The target object, which cannot be null. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// is null + public static void NotNull(object target, string parameterName, string message = "") + { + if (target == null) + { + if (!string.IsNullOrWhiteSpace(message)) + { + throw new ArgumentNullException(parameterName, message); + } + + throw new ArgumentNullException(parameterName); + } + } + + /// + /// Verifies, that the string method parameter with specified object value and message + /// is not null, not empty and does not contain only blanks and throws an exception + /// if the object is null. + /// + /// The target string, which should be checked against being null or empty. + /// Name of the parameter. + /// The error message, if any to add to the exception. + /// is null. + /// is empty or contains only blanks. + public static void NotNullOrEmpty(string target, string parameterName, string message = "") + { + NotNull(target, parameterName, message); + + if (string.IsNullOrWhiteSpace(target)) + { + if (!string.IsNullOrWhiteSpace(message)) + { + throw new ArgumentException(message, parameterName); + } + + throw new ArgumentException("Value cannot be null or empty and cannot contain only blanks.", parameterName); + } + } + + /// + /// Verifies, that the enumeration is not null and not empty. + /// + /// The type of objects in the + /// The target enumeration, which should be checked against being null or empty. + /// Name of the parameter. + /// The error message, if any to add to the exception. + /// is null. + /// is empty. + public static void NotNullOrEmpty(IEnumerable target, string parameterName, string message = "") + { + NotNull(target, parameterName, message); + + if (!target.Any()) + { + if (!string.IsNullOrWhiteSpace(message)) + { + throw new ArgumentException(message, parameterName); + } + + throw new ArgumentException("Value cannot be empty.", parameterName); + } + } + + /// + /// Verifies that the specified value is less than a maximum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is greater than the maximum value. + /// + public static void MustBeLessThan(TValue value, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(max) >= 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}."); + } + } + + /// + /// Verifies that the specified value is less than or equal to a maximum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is greater than the maximum value. + /// + public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(max) > 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}."); + } + } + + /// + /// Verifies that the specified value is greater than a minimum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value. + /// + public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) <= 0) + { + throw new ArgumentOutOfRangeException( + parameterName, + $"Value must be greater than {min}."); + } + } + + /// + /// Verifies that the specified value is greater than or equal to a minimum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value. + /// + public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) < 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); + } + } + + /// + /// Verifies that the specified value is greater than or equal to a minimum value and less than + /// or equal to a maximum value and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value of greater than the maximum value. + /// + public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min} and less than or equal to {max}."); + } + } + + /// + /// Verifies, that the method parameter with specified target value is true + /// and throws an exception if it is found to be so. + /// + /// + /// The target value, which cannot be false. + /// + /// + /// The name of the parameter that is to be checked. + /// + /// + /// The error message, if any to add to the exception. + /// + /// + /// is false + /// + public static void IsTrue(bool target, string parameterName, string message) + { + if (!target) + { + throw new ArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the method parameter with specified target value is false + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be true. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is true + /// + public static void IsFalse(bool target, string parameterName, string message) + { + if (target) + { + throw new ArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the `target` span has the length of 'minSpan', or longer. + /// + /// The element type of the spans + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + public static void MustBeSizedAtLeast(Span target, int minLength, string parameterName) + { + if (target.Length < minLength) + { + throw new ArgumentException($"Span-s must be at least of length {minLength}!", parameterName); + } + } + } +} diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index b24029bb0..559a161d5 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -34,3 +34,9 @@ using System.Runtime.CompilerServices; // Ensure the internals can be tested. [assembly: InternalsVisibleTo("SixLabors.Core.Tests")] + +// Ensure the internals are visible to the other projects. +[assembly: InternalsVisibleTo("SixLabors.Exif")] +[assembly: InternalsVisibleTo("SixLabors.Fonts")] +[assembly: InternalsVisibleTo("SixLabors.ImageSharp")] +[assembly: InternalsVisibleTo("SixLabors.Shapes")] diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index c479c3cc1..57422a9c1 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -44,6 +44,7 @@ All + \ No newline at end of file From 4f06b519a327035b16aafa94993281d344bae2f8 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 16:56:30 +0200 Subject: [PATCH 026/136] [SL.Core] Switch to ReadOnlySpan. --- src/SixLabors.Core/Helpers/DebugGuard.cs | 4 ++-- src/SixLabors.Core/Helpers/Guard.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index f20a763aa..7850545f3 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -169,7 +169,7 @@ namespace SixLabors /// is true /// [Conditional("DEBUG")] - public static void MustBeSameSized(Span target, Span other, string parameterName) + public static void MustBeSameSized(ReadOnlySpan target, ReadOnlySpan other, string parameterName) where T : struct { if (target.Length != other.Length) @@ -189,7 +189,7 @@ namespace SixLabors /// is true /// [Conditional("DEBUG")] - public static void MustBeSizedAtLeast(Span target, Span minSpan, string parameterName) + public static void MustBeSizedAtLeast(ReadOnlySpan target, ReadOnlySpan minSpan, string parameterName) where T : struct { if (target.Length < minSpan.Length) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 990187772..e433de44e 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -239,7 +239,7 @@ namespace SixLabors /// /// is true /// - public static void MustBeSizedAtLeast(Span target, int minLength, string parameterName) + public static void MustBeSizedAtLeast(ReadOnlySpan target, int minLength, string parameterName) { if (target.Length < minLength) { From d53a5ca0a5b799c6b16031a079c9e204bd3dec6d Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 16:57:46 +0200 Subject: [PATCH 027/136] [SL.Core] Added SixLabors.ImageSharp.Drawing to the InternalsVisibleTo. --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 559a161d5..368bab248 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -39,4 +39,5 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("SixLabors.Exif")] [assembly: InternalsVisibleTo("SixLabors.Fonts")] [assembly: InternalsVisibleTo("SixLabors.ImageSharp")] +[assembly: InternalsVisibleTo("SixLabors.ImageSharp.Drawing")] [assembly: InternalsVisibleTo("SixLabors.Shapes")] From cba462aa223b3d6bea24755e34a85be6054684d0 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sun, 25 Jun 2017 16:19:39 +0100 Subject: [PATCH 028/136] [SL.Core] push develop branch to an unstable feed for now --- appveyor.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index edb297ed4..fd038f953 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,6 +24,16 @@ deploy: artifact: /.*\.nupkg/ on: branch: master + +deploy: + - provider: NuGet + server: https://www.myget.org/F/sixlabors-unstable/api/v2/package + symbol_server: https://www.myget.org/F/sixlabors-unstable/symbols/api/v2/package + api_key: + secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4 + artifact: /.*\.nupkg/ + on: + branch: develop # prevent the double build when a branch has an active PR skip_branch_with_pr: true From 403a1bd94d570f41396f90a4897f5f23db970c2f Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sun, 25 Jun 2017 16:20:20 +0100 Subject: [PATCH 029/136] [SL.Core] woops added duplicate section --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index fd038f953..5a74728fa 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,8 +24,6 @@ deploy: artifact: /.*\.nupkg/ on: branch: master - -deploy: - provider: NuGet server: https://www.myget.org/F/sixlabors-unstable/api/v2/package symbol_server: https://www.myget.org/F/sixlabors-unstable/symbols/api/v2/package From 80e6911b7474238bfb9008503b212df0ef308f4f Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 17:40:45 +0200 Subject: [PATCH 030/136] [SL.Core] Move ruleset into src folder. --- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- SixLabors.ruleset => src/SixLabors.ruleset | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename SixLabors.ruleset => src/SixLabors.ruleset (100%) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 57422a9c1..37d4b9013 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -31,7 +31,7 @@ - ..\..\SixLabors.ruleset + ..\SixLabors.ruleset diff --git a/SixLabors.ruleset b/src/SixLabors.ruleset similarity index 100% rename from SixLabors.ruleset rename to src/SixLabors.ruleset From 5ac709d8890530e4dd4b1a07709f242825549dbc Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 17:50:15 +0200 Subject: [PATCH 031/136] [SL.Core] Added stylecop to the test project. --- .../Primitives/PointFTests.cs | 24 +++++------ .../Primitives/PointTests.cs | 23 +++++------ .../Primitives/RectangleFTests.cs | 41 +++++++++---------- .../Primitives/RectangleTests.cs | 33 +++++++-------- .../Primitives/SizeFTests.cs | 22 +++++----- .../Primitives/SizeTests.cs | 22 ++++------ .../SixLabors.Core.Tests.csproj | 10 +++++ tests/SixLabors.ruleset | 10 +++++ 8 files changed, 94 insertions(+), 91 deletions(-) create mode 100644 tests/SixLabors.ruleset diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index b6294cb1a..5a29d1cff 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -1,22 +1,20 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using System.Numerics; +using System.Reflection; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - using System.Numerics; - using System.Reflection; - using Xunit; - public class PointFTests { [Fact] public void DefaultConstructorTest() { - Assert.Equal(PointF.Empty, new PointF()); + Assert.Equal(PointF.Empty, default(PointF)); } [Theory] @@ -37,7 +35,7 @@ namespace SixLabors.Primitives.Tests public void IsEmptyDefaultsTest() { Assert.True(PointF.Empty.IsEmpty); - Assert.True(new PointF().IsEmpty); + Assert.True(default(PointF).IsEmpty); Assert.True(new PointF(0, 0).IsEmpty); } @@ -151,7 +149,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void EqualityTest_NotPointF() + public void EqualityTest_NotPointF() { var point = new PointF(0, 0); Assert.False(point.Equals(null)); @@ -167,7 +165,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var point = new PointF(10, 10); Assert.Equal(point.GetHashCode(), new PointF(10, 10).GetHashCode()); diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 3f17aebfc..a1880d0e1 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -1,21 +1,18 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System.Globalization; +using System.Numerics; +using Xunit; namespace SixLabors.Primitives.Tests { - using System.Globalization; - using System.Numerics; - - using Xunit; - public class PointTests { [Fact] public void DefaultConstructorTest() { - Assert.Equal(Point.Empty, new Point()); + Assert.Equal(Point.Empty, default(Point)); } [Theory] @@ -47,7 +44,7 @@ namespace SixLabors.Primitives.Tests public void IsEmptyDefaultsTest() { Assert.True(Point.Empty.IsEmpty); - Assert.True(new Point().IsEmpty); + Assert.True(default(Point).IsEmpty); Assert.True(new Point(0, 0).IsEmpty); } @@ -186,7 +183,7 @@ namespace SixLabors.Primitives.Tests public void EqualityTest(int x, int y) { var p1 = new Point(x, y); - var p2 = new Point(x / 2 - 1, y / 2 - 1); + var p2 = new Point((x / 2) - 1, (y / 2) - 1); var p3 = new Point(x, y); Assert.True(p1 == p3); @@ -205,7 +202,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void EqualityTest_NotPoint() + public void EqualityTest_NotPoint() { var point = new Point(0, 0); Assert.False(point.Equals(null)); @@ -214,7 +211,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var point = new Point(10, 10); Assert.Equal(point.GetHashCode(), new Point(10, 10).GetHashCode()); diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs index 4dc7d9d35..a202cc6de 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs @@ -1,16 +1,13 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using System.Reflection; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - using System.Reflection; - - using Xunit; - /// /// Tests the struct. /// @@ -19,7 +16,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(RectangleF.Empty, new RectangleF()); + Assert.Equal(RectangleF.Empty, default(RectangleF)); } [Theory] @@ -77,7 +74,7 @@ namespace SixLabors.Primitives.Tests public void IsEmptyTest() { Assert.True(RectangleF.Empty.IsEmpty); - Assert.True(new RectangleF().IsEmpty); + Assert.True(default(RectangleF).IsEmpty); Assert.True(new RectangleF(1, -2, -10, 10).IsEmpty); Assert.True(new RectangleF(1, -2, 10, -10).IsEmpty); Assert.True(new RectangleF(1, -2, 0, 0).IsEmpty); @@ -88,7 +85,7 @@ namespace SixLabors.Primitives.Tests [Theory] [InlineData(0, 0)] [InlineData(float.MaxValue, float.MinValue)] - public static void LocationSetTest(float x, float y) + public void LocationSetTest(float x, float y) { var point = new PointF(x, y); var rect = new RectangleF(10, 10, 10, 10) { Location = point }; @@ -100,7 +97,7 @@ namespace SixLabors.Primitives.Tests [Theory] [InlineData(0, 0)] [InlineData(float.MaxValue, float.MinValue)] - public static void SizeSetTest(float x, float y) + public void SizeSetTest(float x, float y) { var size = new SizeF(x, y); var rect = new RectangleF(10, 10, 10, 10) { Size = size }; @@ -125,7 +122,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void EqualityTestNotRectangleF() + public void EqualityTestNotRectangleF() { var rectangle = new RectangleF(0, 0, 0, 0); Assert.False(rectangle.Equals(null)); @@ -141,7 +138,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var rect1 = new RectangleF(10, 10, 10, 10); var rect2 = new RectangleF(10, 10, 10, 10); @@ -158,12 +155,12 @@ namespace SixLabors.Primitives.Tests public void ContainsTest(float x, float y, float width, float height) { var rect = new RectangleF(x, y, width, height); - float X = (x + width) / 2; - float Y = (y + height) / 2; - var p = new PointF(X, Y); - var r = new RectangleF(X, Y, width / 2, height / 2); + float x1 = (x + width) / 2; + float y1 = (y + height) / 2; + var p = new PointF(x1, y1); + var r = new RectangleF(x1, y1, width / 2, height / 2); - Assert.False(rect.Contains(X, Y)); + Assert.False(rect.Contains(x1, y1)); Assert.False(rect.Contains(p)); Assert.False(rect.Contains(r)); } @@ -175,7 +172,7 @@ namespace SixLabors.Primitives.Tests public void InflateTest(float x, float y, float width, float height) { var rect = new RectangleF(x, y, width, height); - var inflatedRect = new RectangleF(x - width, y - height, width + 2 * width, height + 2 * height); + var inflatedRect = new RectangleF(x - width, y - height, width + (2 * width), height + (2 * height)); rect.Inflate(width, height); Assert.Equal(inflatedRect, rect); @@ -201,7 +198,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void IntersectIntersectingRectsTest() + public void IntersectIntersectingRectsTest() { var rect1 = new RectangleF(0, 0, 5, 5); var rect2 = new RectangleF(1, 1, 3, 3); diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 640b27d67..90354bd72 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -1,15 +1,12 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - - using Xunit; - /// /// Tests the struct. /// @@ -18,7 +15,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Rectangle.Empty, new Rectangle()); + Assert.Equal(Rectangle.Empty, default(Rectangle)); } [Theory] @@ -51,8 +48,8 @@ namespace SixLabors.Primitives.Tests public void EmptyTest() { Assert.True(Rectangle.Empty.IsEmpty); + Assert.True(default(Rectangle).IsEmpty); Assert.True(new Rectangle(0, 0, 0, 0).IsEmpty); - Assert.True(new Rectangle().IsEmpty); } [Theory] @@ -107,7 +104,7 @@ namespace SixLabors.Primitives.Tests [Theory] [InlineData(0, 0)] [InlineData(int.MaxValue, int.MinValue)] - public static void LocationSetTest(int x, int y) + public void LocationSetTest(int x, int y) { var point = new Point(x, y); var rect = new Rectangle(10, 10, 10, 10) { Location = point }; @@ -119,7 +116,7 @@ namespace SixLabors.Primitives.Tests [Theory] [InlineData(0, 0)] [InlineData(int.MaxValue, int.MinValue)] - public static void SizeSetTest(int x, int y) + public void SizeSetTest(int x, int y) { var size = new Size(x, y); var rect = new Rectangle(10, 10, 10, 10) { Size = size }; @@ -145,7 +142,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void EqualityTestNotRectangle() + public void EqualityTestNotRectangle() { var rectangle = new Rectangle(0, 0, 0, 0); Assert.False(rectangle.Equals(null)); @@ -154,7 +151,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var rect1 = new Rectangle(10, 10, 10, 10); var rect2 = new Rectangle(10, 10, 10, 10); @@ -193,7 +190,7 @@ namespace SixLabors.Primitives.Tests [InlineData(0, int.MinValue, int.MaxValue, 0)] public void ContainsTest(int x, int y, int width, int height) { - var rect = new Rectangle(unchecked(2 * x - width), unchecked(2 * y - height), width, height); + var rect = new Rectangle(unchecked((2 * x) - width), unchecked((2 * y) - height), width, height); var p = new Point(x, y); var r = new Rectangle(x, y, width / 2, height / 2); @@ -211,7 +208,7 @@ namespace SixLabors.Primitives.Tests Rectangle inflatedRect, rect = new Rectangle(x, y, width, height); unchecked { - inflatedRect = new Rectangle(x - width, y - height, width + 2 * width, height + 2 * height); + inflatedRect = new Rectangle(x - width, y - height, width + (2 * width), height + (2 * height)); } Assert.Equal(inflatedRect, Rectangle.Inflate(rect, width, height)); @@ -222,7 +219,7 @@ namespace SixLabors.Primitives.Tests var s = new Size(x, y); unchecked { - inflatedRect = new Rectangle(rect.X - x, rect.Y - y, rect.Width + 2 * x, rect.Height + 2 * y); + inflatedRect = new Rectangle(rect.X - x, rect.Y - y, rect.Width + (2 * x), rect.Height + (2 * y)); } rect.Inflate(s); @@ -243,7 +240,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void IntersectIntersectingRectsTest() + public void IntersectIntersectingRectsTest() { var rect1 = new Rectangle(0, 0, 5, 5); var rect2 = new Rectangle(1, 1, 3, 3); diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index 1cd3858c2..04363fa94 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -1,21 +1,19 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using System.Reflection; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - using System.Reflection; - using Xunit; - public class SizeFTests { [Fact] public void DefaultConstructorTest() { - Assert.Equal(SizeF.Empty, new SizeF()); + Assert.Equal(SizeF.Empty, default(SizeF)); } [Theory] @@ -47,7 +45,7 @@ namespace SixLabors.Primitives.Tests public void IsEmptyDefaultsTest() { Assert.True(SizeF.Empty.IsEmpty); - Assert.True(new SizeF().IsEmpty); + Assert.True(default(SizeF).IsEmpty); Assert.True(new SizeF(0, 0).IsEmpty); } @@ -106,7 +104,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void EqualityTest_NotSizeF() + public void EqualityTest_NotSizeF() { var size = new SizeF(0, 0); Assert.False(size.Equals(null)); @@ -122,7 +120,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var size = new SizeF(10, 10); Assert.Equal(size.GetHashCode(), new SizeF(10, 10).GetHashCode()); diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs index 0117e5914..0cfb62dd5 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs @@ -1,14 +1,12 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - using Xunit; - /// /// Tests the struct. /// @@ -17,7 +15,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Size.Empty, new Size()); + Assert.Equal(Size.Empty, default(Size)); } [Theory] @@ -43,7 +41,7 @@ namespace SixLabors.Primitives.Tests public void IsEmptyDefaultsTest() { Assert.True(Size.Empty.IsEmpty); - Assert.True(new Size().IsEmpty); + Assert.True(default(Size).IsEmpty); Assert.True(new Size(0, 0).IsEmpty); } @@ -162,7 +160,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void EqualityTest_NotSize() + public void EqualityTest_NotSize() { var size = new Size(0, 0); Assert.False(size.Equals(null)); @@ -171,7 +169,7 @@ namespace SixLabors.Primitives.Tests } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var size = new Size(10, 10); Assert.Equal(size.GetHashCode(), new Size(10, 10).GetHashCode()); @@ -238,7 +236,6 @@ namespace SixLabors.Primitives.Tests Assert.Equal(mulExpected, multiplier * sz1); } - [Theory] [InlineData(1000, 0.0f)] [InlineData(1000, 1.0f)] @@ -285,7 +282,6 @@ namespace SixLabors.Primitives.Tests Assert.Equal(mulExpected, multiplier * sz1); } - [Fact] public void DivideByZeroChecks() { diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index cd34a8421..a80bf5a60 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -16,7 +16,17 @@ SixLabors.Tests + + ..\SixLabors.ruleset + + + + + + + + diff --git a/tests/SixLabors.ruleset b/tests/SixLabors.ruleset new file mode 100644 index 000000000..972915712 --- /dev/null +++ b/tests/SixLabors.ruleset @@ -0,0 +1,10 @@ + + + + + + + + + + From a3532338c374472c15930869d7fcf6e187772d44 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 17:56:45 +0200 Subject: [PATCH 032/136] [SL.Core] Added CodeCoverage.cmd to the solution. --- SixLabors.Core.sln | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index dbd9600ee..c1f05176c 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -19,6 +19,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core", "src\SixLa EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core.Tests", "tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeCoverage", "CodeCoverage", "{10A74B46-930F-49E3-A579-BC3A6A23321D}" + ProjectSection(SolutionItems) = preProject + tests\CodeCoverage\CodeCoverage.cmd = tests\CodeCoverage\CodeCoverage.cmd + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -40,6 +45,7 @@ Global GlobalSection(NestedProjects) = preSolution {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {10A74B46-930F-49E3-A579-BC3A6A23321D} = {C317F1B1-D75E-4C6D-83EB-80367343E0D7} EndGlobalSection GlobalSection(Performance) = preSolution HasPerformanceSessions = true From 4b5485f408c4e5962cccfb6ad66371f4f2fdf3b5 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 17:58:07 +0200 Subject: [PATCH 033/136] [SL.Core] Use release build for code coverage. --- tests/CodeCoverage/CodeCoverage.cmd | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd index 7a89ab210..d5318bf7a 100644 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -7,12 +7,10 @@ nuget restore packages.config -PackagesDirectory . cd .. cd .. -dotnet restore SixLabors.Core.sln -dotnet build SixLabors.Core.sln --no-incremental -c debug /p:codecov=true - -rem The -threshold options prevents this taking ages... -rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" +dotnet restore SixLabors.Core.sln +dotnet build SixLabors.Core.sln --no-incremental -c release /p:codecov=true + +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c release" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" if %errorlevel% neq 0 exit /b %errorlevel% From 9c71c0fc22f70cd8cda211689e851b95678f3261 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 18:11:07 +0200 Subject: [PATCH 034/136] [SL.Core] Removed old test. --- tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs index a202cc6de..463509eac 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs @@ -252,13 +252,5 @@ namespace SixLabors.Primitives.Tests var r = new RectangleF(5, 5.1F, 1.3F, 1); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "RectangleF [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); } - - [InlineData(0, 0, 0, 0)] - [InlineData(5, -5, 0.2, -1.3)] - public void ToStringTestEmpty(float x, float y, float width, float height) - { - var r = new RectangleF(x, y, width, height); - Assert.Equal("RectangleF [ Empty ]", r.ToString()); - } } } \ No newline at end of file From 5b38dc136282fa1fd82dc43699afa109fa1367c6 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 18:14:34 +0200 Subject: [PATCH 035/136] [SL.Core] Added yml files to the solution. --- SixLabors.Core.sln | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index c1f05176c..d10b17787 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -8,6 +8,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionIt .editorconfig = .editorconfig appveyor.yml = appveyor.yml build.cmd = build.cmd + codecov.yml = codecov.yml + gitversion.yml = gitversion.yml README.md = README.md EndProjectSection EndProject From 3b6d794dbe981ef6dca198d1257a02a4624a3b7b Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 18:14:51 +0200 Subject: [PATCH 036/136] [SL.Core] Changed codecov to use the develop branch. --- codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/codecov.yml b/codecov.yml index cadf5c5da..ad0b0be56 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,4 +1,5 @@ codecov: + branch: develop notify: require_ci_to_pass: true comment: off From 9b9306e73f14a7a6c7847161f5efe5b7e174897e Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 19:21:41 +0200 Subject: [PATCH 037/136] [SL.Core] Added unit tests for the Guard class. --- src/SixLabors.Core/Helpers/Guard.cs | 44 ++- .../Helpers/GuardTests.cs | 286 ++++++++++++++++++ 2 files changed, 307 insertions(+), 23 deletions(-) create mode 100644 tests/SixLabors.Core.Tests/Helpers/GuardTests.cs diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index e433de44e..4a738d8b3 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -56,7 +56,7 @@ namespace SixLabors throw new ArgumentException(message, parameterName); } - throw new ArgumentException("Value cannot be null or empty and cannot contain only blanks.", parameterName); + throw new ArgumentException("Value cannot be null, empty, or cannot contain only whitespace.", parameterName); } } @@ -92,7 +92,7 @@ namespace SixLabors /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is greater than the maximum value. /// public static void MustBeLessThan(TValue value, TValue max, string parameterName) @@ -112,7 +112,7 @@ namespace SixLabors /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is greater than the maximum value. /// public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) @@ -132,7 +132,7 @@ namespace SixLabors /// The minimum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value. /// public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) @@ -140,9 +140,7 @@ namespace SixLabors { if (value.CompareTo(min) <= 0) { - throw new ArgumentOutOfRangeException( - parameterName, - $"Value must be greater than {min}."); + throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than {min}."); } } @@ -154,7 +152,7 @@ namespace SixLabors /// The minimum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value. /// public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) @@ -175,7 +173,7 @@ namespace SixLabors /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value of greater than the maximum value. /// public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) @@ -191,7 +189,7 @@ namespace SixLabors /// Verifies, that the method parameter with specified target value is true /// and throws an exception if it is found to be so. /// - /// + /// /// The target value, which cannot be false. /// /// @@ -201,11 +199,11 @@ namespace SixLabors /// The error message, if any to add to the exception. /// /// - /// is false + /// is false /// - public static void IsTrue(bool target, string parameterName, string message) + public static void IsTrue(bool value, string parameterName, string message) { - if (!target) + if (!value) { throw new ArgumentException(message, parameterName); } @@ -215,35 +213,35 @@ namespace SixLabors /// Verifies, that the method parameter with specified target value is false /// and throws an exception if it is found to be so. /// - /// The target value, which cannot be true. + /// The target value, which cannot be true. /// The name of the parameter that is to be checked. /// The error message, if any to add to the exception. /// - /// is true + /// is true /// - public static void IsFalse(bool target, string parameterName, string message) + public static void IsFalse(bool value, string parameterName, string message) { - if (target) + if (value) { throw new ArgumentException(message, parameterName); } } /// - /// Verifies, that the `target` span has the length of 'minSpan', or longer. + /// Verifies, that the `target` span has the length of 'minLength', or longer. /// /// The element type of the spans - /// The target span. + /// The target span. /// The minimum length. /// The name of the parameter that is to be checked. /// - /// is true + /// The length of is less than . /// - public static void MustBeSizedAtLeast(ReadOnlySpan target, int minLength, string parameterName) + public static void MustBeSizedAtLeast(ReadOnlySpan value, int minLength, string parameterName) { - if (target.Length < minLength) + if (value.Length < minLength) { - throw new ArgumentException($"Span-s must be at least of length {minLength}!", parameterName); + throw new ArgumentException($"The size must be at least {minLength}.", parameterName); } } } diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs new file mode 100644 index 000000000..c91ebbcd6 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -0,0 +1,286 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace SixLabors.Helpers.Tests +{ + public class GuardTests + { + [Fact] + public void NotNull_TargetNotNull_ThrowsNoException() + { + Guard.NotNull("test", "myParamName"); + } + + [Fact] + public void NotNull_TargetNull_ThrowsException() + { + Assert.Throws(() => + { + Guard.NotNull(null, "myParamName"); + }); + } + + [Fact] + public void NotNull_TargetNullWithMessage_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNull(null, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void NotNullOrEmpty_TargetNotNullOrEmpty_ThrowsNoException() + { + Guard.NotNullOrEmpty("test", "myParamName"); + } + + [Fact] + public void NotNullOrEmpty_TargetNull_ThrowsException() + { + Assert.Throws(() => + { + Guard.NotNullOrEmpty(null, "myParamName"); + }); + } + + [Fact] + public void NotNullOrEmpty_TargetWhitespace_ThrowsException() + { + Assert.Throws(() => + { + Guard.NotNullOrEmpty("\n\n", "myParamName"); + }); + } + + [Fact] + public void NotNullOrEmpty_TargetEmpty_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNullOrEmpty(string.Empty, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("Value cannot be null, empty, or cannot contain only whitespace.")); + } + + [Fact] + public void NotNullOrEmpty_TargetEmptyWithMessage_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNullOrEmpty(string.Empty, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void NotNullOrEmptyIEnumerable_TargetNotNullOrEmpty_ThrowsNoException() + { + Guard.NotNullOrEmpty(new string[] { "test" }, "myParamName"); + } + + [Fact] + public void NotNullOrEmptyIEnumerable_TargetNull_ThrowsException() + { + Assert.Throws(() => + { + Guard.NotNullOrEmpty((IEnumerable)null, "myParamName"); + }); + } + + [Fact] + public void NotNullOrEmptyIEnumerable_TargetEmpty_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNullOrEmpty(new string[] { }, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("Value cannot be empty.")); + } + + [Fact] + public void NotNullOrEmptyIEnumerable_TargetEmptyWithMessage_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNullOrEmpty(new string[] { }, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void MustBeLessThan_IsLess_ThrowsNoException() + { + Guard.MustBeLessThan(0, 1, "myParamName"); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(1, 1)] + public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) + { + var exception = Assert.Throws(() => + { + Guard.MustBeLessThan(value, max, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be less than {max}.")); + } + + [Theory] + [InlineData(0, 1)] + [InlineData(1, 1)] + public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, int max) + { + Guard.MustBeLessThanOrEqualTo(value, max, "myParamName"); + } + + [Fact] + public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be less than or equal to 1.")); + } + + [Fact] + public void MustBeGreaterThan_IsGreater_ThrowsNoException() + { + Guard.MustBeGreaterThan(2, 1, "myParamName"); + } + + [Theory] + [InlineData(1, 2)] + [InlineData(1, 1)] + public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) + { + var exception = Assert.Throws(() => + { + Guard.MustBeGreaterThan(value, min, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than {min}.")); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(1, 1)] + public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int value, int min) + { + Guard.MustBeGreaterThanOrEqualTo(value, min, "myParamName"); + } + + [Fact] + public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); + } + + [Theory] + [InlineData(1, 1, 3)] + [InlineData(2, 1, 3)] + [InlineData(3, 1, 3)] + public void MustBeBetweenOrEqualTo_IsBetweenOrEqual_ThrowsNoException(int value, int min, int max) + { + Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); + } + + [Theory] + [InlineData(0, 1, 3)] + [InlineData(4, 1, 3)] + public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, int min, int max) + { + var exception = Assert.Throws(() => + { + Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.")); + } + + [Fact] + public void IsTrue_IsTrue_ThrowsNoException() + { + Guard.IsTrue(true, "myParamName", "myTestMessage"); + } + + [Fact] + public void IsTrue_IsFalse_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.IsTrue(false, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void IsFalse_IsFalse_ThrowsNoException() + { + Guard.IsFalse(false, "myParamName", "myTestMessage"); + } + + [Fact] + public void IsFalse_IsTrue_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.IsFalse(true, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Theory] + [InlineData(new int[] { 1, 2 }, 1)] + [InlineData(new int[] { 1, 2 }, 2)] + public void MustBeSizedAtLeast_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) + { + Guard.MustBeSizedAtLeast(value, minLength, "myParamName"); + } + + [Fact] + public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"The size must be at least 3.")); + } + } +} From 008d185271db23b1d52c28ec1ad34e730627e01f Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 19:37:50 +0200 Subject: [PATCH 038/136] [SL.Core] Added some of the badges to the README. --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5b92ec28f..71a287513 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ -# Core -Point, Rectangle, Size Primitives for use across SixLabors libraries. +# SixLabers.Core + +**SixLabors.Core** provides classes for use across SixLabors libraries. + +[![codecov](https://codecov.io/gh/SixLabors/Core/branch/develop/graph/badge.svg)](https://codecov.io/gh/SixLabors/Core) +[![GitHub license](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/SixLabors/Core/master/LICENSE) + +[![GitHub issues](https://img.shields.io/github/issues/SixLabors/Core.svg)](https://github.com/SixLabors/Core/issues) +[![GitHub stars](https://img.shields.io/github/stars/SixLabors/Core.svg)](https://github.com/SixLabors/Core/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/SixLabors/Core.svg)](https://github.com/SixLabors/Core/network) \ No newline at end of file From 2df68dc7a878659c8d1b9dcc18403f75996c2ab2 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 19:42:18 +0200 Subject: [PATCH 039/136] [SL.Core] Added build status badge. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 71a287513..a2f16a739 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ **SixLabors.Core** provides classes for use across SixLabors libraries. +[![Build status](https://ci.appveyor.com/api/projects/status/j1hvc99493b0jk3x/branch/develop?svg=true)](https://ci.appveyor.com/project/six-labors/core/branch/develop) [![codecov](https://codecov.io/gh/SixLabors/Core/branch/develop/graph/badge.svg)](https://codecov.io/gh/SixLabors/Core) [![GitHub license](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/SixLabors/Core/master/LICENSE) From d5407856baeb42a10fcd4ba1c0f1016af2105970 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Mon, 26 Jun 2017 20:55:00 +0100 Subject: [PATCH 040/136] [SL.Core] Add test for DebugGuard --- src/SixLabors.Core/Helpers/DebugGuard.cs | 60 ++++ .../Helpers/DebugGuardTests.cs | 260 ++++++++++++++++++ 2 files changed, 320 insertions(+) create mode 100644 tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index 7850545f3..e836a1bba 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -178,6 +178,26 @@ namespace SixLabors } } + /// + /// Verifies, that the target span is of same size than the 'other' span. + /// + /// The element type of the spans + /// The target span. + /// The 'other' span to compare 'target' to. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSameSized(Span target, Span other, string parameterName) + where T : struct + { + if (target.Length != other.Length) + { + throw new ArgumentException("Span-s must be the same size!", parameterName); + } + } + /// /// Verifies, that the `target` span has the length of 'minSpan', or longer. /// @@ -197,5 +217,45 @@ namespace SixLabors throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); } } + + /// + /// Verifies, that the `target` span has the length of 'minSpan', or longer. + /// + /// The element type of the spans + /// The target span. + /// The 'minSpan' span to compare 'target' to. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSizedAtLeast(Span target, Span minSpan, string parameterName) + where T : struct + { + if (target.Length < minSpan.Length) + { + throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); + } + } + + /// + /// Verifies, that the `target` array has declared the length or longer. + /// + /// The element type of the spans + /// The target array. + /// The min length the array must have. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSizedAtLeast(T[] target, int minLength, string parameterName) + where T : struct + { + if (target.Length < minLength) + { + throw new ArgumentException($"The size must be at least {minLength}.", parameterName); + } + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs new file mode 100644 index 000000000..71b6436ca --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -0,0 +1,260 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +// tell this file to enable debug conditional method calls, i.e. all the debug guard calls +#define DEBUG + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using Xunit; + +namespace SixLabors.Helpers.Tests +{ + public class DebugGuardTests + { + [Fact] + public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() + { + var methods = typeof(DebugGuard).GetTypeInfo().GetMethods() + .Where(x => x.IsStatic); + + foreach (var m in methods) + { + var attribs = m.GetCustomAttributes(); + Assert.True(attribs.Select(x => x.ConditionString).Contains("DEBUG"), $"Method '{m.Name}' does not have [Conditional(\"DEBUG\")] set."); + } + } + + [Fact] + public void NotNull_TargetNotNull_ThrowsNoException() + { + DebugGuard.NotNull("test", "myParamName"); + } + + [Fact] + public void NotNull_TargetNull_ThrowsException() + { + Assert.Throws(() => + { + DebugGuard.NotNull(null, "myParamName"); + }); + } + + + [Fact] + public void MustBeLessThan_IsLess_ThrowsNoException() + { + DebugGuard.MustBeLessThan(0, 1, "myParamName"); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(1, 1)] + public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeLessThan(value, max, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be less than {max}.")); + } + + [Theory] + [InlineData(0, 1)] + [InlineData(1, 1)] + public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, int max) + { + DebugGuard.MustBeLessThanOrEqualTo(value, max, "myParamName"); + } + + [Fact] + public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be less than or equal to 1.")); + } + + [Fact] + public void MustBeGreaterThan_IsGreater_ThrowsNoException() + { + DebugGuard.MustBeGreaterThan(2, 1, "myParamName"); + } + + [Theory] + [InlineData(1, 2)] + [InlineData(1, 1)] + public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeGreaterThan(value, min, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than {min}.")); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(1, 1)] + public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int value, int min) + { + DebugGuard.MustBeGreaterThanOrEqualTo(value, min, "myParamName"); + } + + [Fact] + public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); + } + + [Fact] + public void IsTrue_IsTrue_ThrowsNoException() + { + DebugGuard.IsTrue(true, "myParamName", "myTestMessage"); + } + + [Fact] + public void IsTrue_IsFalse_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.IsTrue(false, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void IsFalse_IsFalse_ThrowsNoException() + { + DebugGuard.IsFalse(false, "myParamName", "myTestMessage"); + } + + [Fact] + public void IsFalse_IsTrue_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.IsFalse(true, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Theory] + [InlineData(new int[] { 1, 2 }, 1)] + [InlineData(new int[] { 1, 2 }, 2)] + public void MustBeSizedAtLeast_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) + { + DebugGuard.MustBeSizedAtLeast(value, minLength, "myParamName"); + } + + [Fact] + public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"The size must be at least 3.", exception.Message); + } + + [Fact] + public void ReadOnlySpan_MustBeSizedAtLeast_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[3]), "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"Span-s must be at least of length 3!", exception.Message); + } + + [Fact] + public void Span_MustBeSizedAtLeast_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSizedAtLeast(new Span(new int[2]), new Span(new int[3]), "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"Span-s must be at least of length 3!", exception.Message); + } + + + [Fact] + public void ReadOnlySpan_MustBeSameSized_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[3]), "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"Span-s must be the same size!", exception.Message); + } + + [Fact] + public void Span_MustBeSameSized_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[3]), "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"Span-s must be the same size!", exception.Message); + } + + [Theory] + [InlineData(2, 2)] + [InlineData(2, 4)] + public void ReadOnlySpan_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) + { + DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); + } + + [Theory] + [InlineData(2, 2)] + [InlineData(2, 4)] + public void Span_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) + { + DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); + } + + [Fact] + public void ReadOnlySpan_MustBeSameSized_LengthIsEqual_DoesNotThrowException() + { + DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[2]), "myParamName"); + } + + [Fact] + public void Span_MustBeSameSized_LengthIsEqual_DoesNotThrowException() + { + DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[2]), "myParamName"); + } + } +} From 43fe6eaf893528bb5539458c54c55ef01873b2c7 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Mon, 26 Jun 2017 22:24:03 +0100 Subject: [PATCH 041/136] [SL.Core] fix order of paramaters --- tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 71b6436ca..f8b15f3fd 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -231,7 +231,7 @@ namespace SixLabors.Helpers.Tests [Theory] [InlineData(2, 2)] - [InlineData(2, 4)] + [InlineData(4, 3)] public void ReadOnlySpan_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); @@ -239,7 +239,7 @@ namespace SixLabors.Helpers.Tests [Theory] [InlineData(2, 2)] - [InlineData(2, 4)] + [InlineData(4, 3)] public void Span_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); From 05a9332216ddab261b3d033b001b1a723cdf8760 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Tue, 27 Jun 2017 07:53:25 +0100 Subject: [PATCH 042/136] [SL.Core] Fix test names + additional overloads --- src/SixLabors.Core/Helpers/DebugGuard.cs | 8 +-- src/SixLabors.Core/Helpers/Guard.cs | 18 +++++++ .../Helpers/DebugGuardTests.cs | 30 ++++++----- .../Helpers/GuardTests.cs | 50 +++++++++++++++++-- 4 files changed, 81 insertions(+), 25 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index e836a1bba..4a2ed9473 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -174,7 +174,7 @@ namespace SixLabors { if (target.Length != other.Length) { - throw new ArgumentException("Span-s must be the same size!", parameterName); + throw new ArgumentException("Span-s must be the same size.", parameterName); } } @@ -194,7 +194,7 @@ namespace SixLabors { if (target.Length != other.Length) { - throw new ArgumentException("Span-s must be the same size!", parameterName); + throw new ArgumentException("Span-s must be the same size.", parameterName); } } @@ -214,7 +214,7 @@ namespace SixLabors { if (target.Length < minSpan.Length) { - throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); + throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}.", parameterName); } } @@ -234,7 +234,7 @@ namespace SixLabors { if (target.Length < minSpan.Length) { - throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); + throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}.", parameterName); } } diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 4a738d8b3..ea92a85c0 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -227,6 +227,24 @@ namespace SixLabors } } + /// + /// Verifies, that the `target` span has the length of 'minLength', or longer. + /// + /// The element type of the spans + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// The length of is less than . + /// + public static void MustBeSizedAtLeast(T[] value, int minLength, string parameterName) + { + if (value.Length < minLength) + { + throw new ArgumentException($"The size must be at least {minLength}.", parameterName); + } + } + /// /// Verifies, that the `target` span has the length of 'minLength', or longer. /// diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index f8b15f3fd..e1d8b1f22 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -43,7 +43,6 @@ namespace SixLabors.Helpers.Tests }); } - [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { @@ -163,13 +162,13 @@ namespace SixLabors.Helpers.Tests [Theory] [InlineData(new int[] { 1, 2 }, 1)] [InlineData(new int[] { 1, 2 }, 2)] - public void MustBeSizedAtLeast_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) + public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) { DebugGuard.MustBeSizedAtLeast(value, minLength, "myParamName"); } [Fact] - public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() + public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -181,7 +180,7 @@ namespace SixLabors.Helpers.Tests } [Fact] - public void ReadOnlySpan_MustBeSizedAtLeast_LengthIsLess_ThrowsException() + public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -189,11 +188,11 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be at least of length 3!", exception.Message); + Assert.Contains($"Span-s must be at least of length 3.", exception.Message); } [Fact] - public void Span_MustBeSizedAtLeast_LengthIsLess_ThrowsException() + public void MustBeSizedAtLeast_Span_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -201,12 +200,11 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be at least of length 3!", exception.Message); + Assert.Contains($"Span-s must be at least of length 3.", exception.Message); } - [Fact] - public void ReadOnlySpan_MustBeSameSized_LengthIsLess_ThrowsException() + public void MustBeSameSized_ReadOnlySpan_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -214,11 +212,11 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be the same size!", exception.Message); + Assert.Contains($"Span-s must be the same size.", exception.Message); } [Fact] - public void Span_MustBeSameSized_LengthIsLess_ThrowsException() + public void MustBeSameSized_Span_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -226,13 +224,13 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be the same size!", exception.Message); + Assert.Contains($"Span-s must be the same size.", exception.Message); } [Theory] [InlineData(2, 2)] [InlineData(4, 3)] - public void ReadOnlySpan_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) + public void MustBeSizedAtLeast_ReadOnlySpan_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); } @@ -240,19 +238,19 @@ namespace SixLabors.Helpers.Tests [Theory] [InlineData(2, 2)] [InlineData(4, 3)] - public void Span_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) + public void MustBeSizedAtLeast_Span_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); } [Fact] - public void ReadOnlySpan_MustBeSameSized_LengthIsEqual_DoesNotThrowException() + public void MustBeSameSized_ReadOnlySpan_LengthIsEqual_DoesNotThrowException() { DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[2]), "myParamName"); } [Fact] - public void Span_MustBeSameSized_LengthIsEqual_DoesNotThrowException() + public void MustBeSameSized_Span_LengthIsEqual_DoesNotThrowException() { DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[2]), "myParamName"); } diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index c91ebbcd6..b7f859f35 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -264,15 +264,31 @@ namespace SixLabors.Helpers.Tests } [Theory] - [InlineData(new int[] { 1, 2 }, 1)] - [InlineData(new int[] { 1, 2 }, 2)] - public void MustBeSizedAtLeast_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) + [InlineData(2, 1)] + [InlineData(2, 2)] + public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) + { + Guard.MustBeSizedAtLeast(new int[valueLength], minLength, "myParamName"); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(2, 2)] + public void MustBeSizedAtLeast_Span_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) + { + Guard.MustBeSizedAtLeast(new Span(new int[valueLength]), minLength, "myParamName"); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(2, 2)] + public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) { - Guard.MustBeSizedAtLeast(value, minLength, "myParamName"); + Guard.MustBeSizedAtLeast(new ReadOnlySpan(new int[valueLength]), minLength, "myParamName"); } [Fact] - public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() + public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -282,5 +298,29 @@ namespace SixLabors.Helpers.Tests Assert.Equal("myParamName", exception.ParamName); Assert.True(exception.Message.Contains($"The size must be at least 3.")); } + + [Fact] + public void MustBeSizedAtLeast_Span_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeSizedAtLeast(new Span(new int[2]), 3, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"The size must be at least 3.")); + } + + [Fact] + public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeSizedAtLeast(new ReadOnlySpan(new int[2]), 3, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"The size must be at least 3.")); + } } } From a43dd3fe2965161f57d3f23373713fa7a302e909 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Tue, 27 Jun 2017 08:35:49 +0100 Subject: [PATCH 043/136] [SL.Core] add reason --- tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index e1d8b1f22..1e651f267 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -230,7 +230,7 @@ namespace SixLabors.Helpers.Tests [Theory] [InlineData(2, 2)] [InlineData(4, 3)] - public void MustBeSizedAtLeast_ReadOnlySpan_DoesNotThowException(int leftSize, int rightSize) + public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsEqualOrGreater_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); } @@ -238,7 +238,7 @@ namespace SixLabors.Helpers.Tests [Theory] [InlineData(2, 2)] [InlineData(4, 3)] - public void MustBeSizedAtLeast_Span_DoesNotThowException(int leftSize, int rightSize) + public void MustBeSizedAtLeast_Span_LengthIsEqualOrGreater_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); } From 3dadce9484530370f9e1de64c170ff5a51b4f2bb Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Wed, 13 Sep 2017 20:13:57 +0100 Subject: [PATCH 044/136] [SL.Core] Remove System.Memory from core --- src/SixLabors.Core/Helpers/DebugGuard.cs | 80 ------------------- src/SixLabors.Core/Helpers/Guard.cs | 18 ----- src/SixLabors.Core/SixLabors.Core.csproj | 3 +- .../Helpers/DebugGuardTests.cs | 76 ------------------ .../Helpers/GuardTests.cs | 40 ---------- 5 files changed, 1 insertion(+), 216 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index 4a2ed9473..c649372ee 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -158,86 +158,6 @@ namespace SixLabors } } - /// - /// Verifies, that the target span is of same size than the 'other' span. - /// - /// The element type of the spans - /// The target span. - /// The 'other' span to compare 'target' to. - /// The name of the parameter that is to be checked. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void MustBeSameSized(ReadOnlySpan target, ReadOnlySpan other, string parameterName) - where T : struct - { - if (target.Length != other.Length) - { - throw new ArgumentException("Span-s must be the same size.", parameterName); - } - } - - /// - /// Verifies, that the target span is of same size than the 'other' span. - /// - /// The element type of the spans - /// The target span. - /// The 'other' span to compare 'target' to. - /// The name of the parameter that is to be checked. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void MustBeSameSized(Span target, Span other, string parameterName) - where T : struct - { - if (target.Length != other.Length) - { - throw new ArgumentException("Span-s must be the same size.", parameterName); - } - } - - /// - /// Verifies, that the `target` span has the length of 'minSpan', or longer. - /// - /// The element type of the spans - /// The target span. - /// The 'minSpan' span to compare 'target' to. - /// The name of the parameter that is to be checked. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void MustBeSizedAtLeast(ReadOnlySpan target, ReadOnlySpan minSpan, string parameterName) - where T : struct - { - if (target.Length < minSpan.Length) - { - throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}.", parameterName); - } - } - - /// - /// Verifies, that the `target` span has the length of 'minSpan', or longer. - /// - /// The element type of the spans - /// The target span. - /// The 'minSpan' span to compare 'target' to. - /// The name of the parameter that is to be checked. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void MustBeSizedAtLeast(Span target, Span minSpan, string parameterName) - where T : struct - { - if (target.Length < minSpan.Length) - { - throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}.", parameterName); - } - } - /// /// Verifies, that the `target` array has declared the length or longer. /// diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index ea92a85c0..3a38551d8 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -244,23 +244,5 @@ namespace SixLabors throw new ArgumentException($"The size must be at least {minLength}.", parameterName); } } - - /// - /// Verifies, that the `target` span has the length of 'minLength', or longer. - /// - /// The element type of the spans - /// The target span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// The length of is less than . - /// - public static void MustBeSizedAtLeast(ReadOnlySpan value, int minLength, string parameterName) - { - if (value.Length < minLength) - { - throw new ArgumentException($"The size must be at least {minLength}.", parameterName); - } - } } } diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 37d4b9013..a5a174536 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -43,8 +43,7 @@ All - - + \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 1e651f267..99661dfe0 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -178,81 +178,5 @@ namespace SixLabors.Helpers.Tests Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"The size must be at least 3.", exception.Message); } - - [Fact] - public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[3]), "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be at least of length 3.", exception.Message); - } - - [Fact] - public void MustBeSizedAtLeast_Span_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSizedAtLeast(new Span(new int[2]), new Span(new int[3]), "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be at least of length 3.", exception.Message); - } - - [Fact] - public void MustBeSameSized_ReadOnlySpan_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[3]), "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be the same size.", exception.Message); - } - - [Fact] - public void MustBeSameSized_Span_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[3]), "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be the same size.", exception.Message); - } - - [Theory] - [InlineData(2, 2)] - [InlineData(4, 3)] - public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsEqualOrGreater_DoesNotThowException(int leftSize, int rightSize) - { - DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); - } - - [Theory] - [InlineData(2, 2)] - [InlineData(4, 3)] - public void MustBeSizedAtLeast_Span_LengthIsEqualOrGreater_DoesNotThowException(int leftSize, int rightSize) - { - DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); - } - - [Fact] - public void MustBeSameSized_ReadOnlySpan_LengthIsEqual_DoesNotThrowException() - { - DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[2]), "myParamName"); - } - - [Fact] - public void MustBeSameSized_Span_LengthIsEqual_DoesNotThrowException() - { - DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[2]), "myParamName"); - } } } diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index b7f859f35..95901c774 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -271,22 +271,6 @@ namespace SixLabors.Helpers.Tests Guard.MustBeSizedAtLeast(new int[valueLength], minLength, "myParamName"); } - [Theory] - [InlineData(2, 1)] - [InlineData(2, 2)] - public void MustBeSizedAtLeast_Span_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) - { - Guard.MustBeSizedAtLeast(new Span(new int[valueLength]), minLength, "myParamName"); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(2, 2)] - public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) - { - Guard.MustBeSizedAtLeast(new ReadOnlySpan(new int[valueLength]), minLength, "myParamName"); - } - [Fact] public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { @@ -298,29 +282,5 @@ namespace SixLabors.Helpers.Tests Assert.Equal("myParamName", exception.ParamName); Assert.True(exception.Message.Contains($"The size must be at least 3.")); } - - [Fact] - public void MustBeSizedAtLeast_Span_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.MustBeSizedAtLeast(new Span(new int[2]), 3, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"The size must be at least 3.")); - } - - [Fact] - public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.MustBeSizedAtLeast(new ReadOnlySpan(new int[2]), 3, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"The size must be at least 3.")); - } } } From a68b76f83df596dcaea789f8cf1021e9ffb2f6c7 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 14 Sep 2017 19:16:19 +1000 Subject: [PATCH 045/136] [SL.Core] Use MathF for Core 2.0 Also a little cleanup --- src/SixLabors.Core/MathF.cs | 72 +----------- src/SixLabors.Core/MathFExtensions.cs | 40 +++++++ .../Primitives/Matrix3x2Extensions.cs | 18 +-- src/SixLabors.Core/SixLabors.Core.csproj | 87 +++++++------- .../Helpers/FloatRoundingComparer.cs | 59 ++++++++++ .../Helpers/MathFTests.cs | 107 ++++++++++++++++++ .../Primitives/PointTests.cs | 1 + .../SixLabors.Core.Tests.csproj | 2 +- 8 files changed, 266 insertions(+), 120 deletions(-) create mode 100644 src/SixLabors.Core/MathFExtensions.cs create mode 100644 tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs create mode 100644 tests/SixLabors.Core.Tests/Helpers/MathFTests.cs diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index a4ad9ed66..836c8d482 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -1,14 +1,15 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System; +#if !NETCOREAPP2_0 using System.Runtime.CompilerServices; -namespace SixLabors +namespace System { /// /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. /// + /// MathF emulation on platforms that don't support it natively. // ReSharper disable InconsistentNaming internal static class MathF { @@ -84,19 +85,6 @@ namespace SixLabors return (float)Math.Cos(f); } - /// - /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. - /// - /// The angle in degrees. - /// - /// The representing the degree as radians. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float ToRadians(float degree) - { - return degree * (PI / 180F); - } - /// /// Returns e raised to the specified power. /// @@ -171,19 +159,6 @@ namespace SixLabors return (float)Math.Pow(x, y); } - /// - /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. - /// - /// The angle in radians. - /// - /// The representing the degree as radians. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float ToDegree(float radian) - { - return radian / (PI / 180F); - } - /// /// Rounds a single-precision floating-point value to the nearest integral value. /// @@ -233,26 +208,6 @@ namespace SixLabors return (float)Math.Sin(f); } - /// - /// Returns the result of a normalized sine cardinal function for the given value. - /// SinC(x) = sin(pi*x)/(pi*x). - /// - /// A single-precision floating-point number to calculate the result for. - /// - /// The sine cardinal of . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float SinC(float f) - { - if (Abs(f) > Constants.Epsilon) - { - f *= PI; - return Clean(Sin(f) / f); - } - - return 1F; - } - /// /// Returns the square root of a specified number. /// @@ -269,23 +224,6 @@ namespace SixLabors { return (float)Math.Sqrt(f); } - - /// - /// Ensures that any passed float is correctly rounded to zero - /// - /// The value to clean. - /// - /// The - /// . - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static float Clean(float x) - { - if (Abs(x) < Constants.Epsilon) - { - return 0F; - } - - return x; - } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/SixLabors.Core/MathFExtensions.cs b/src/SixLabors.Core/MathFExtensions.cs new file mode 100644 index 000000000..27d18d481 --- /dev/null +++ b/src/SixLabors.Core/MathFExtensions.cs @@ -0,0 +1,40 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Runtime.CompilerServices; + +namespace SixLabors +{ + /// + /// Provides common mathematical methods. + /// + internal static class MathFExtensions + { + /// + /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + /// + /// The angle in degrees. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float DegreeToRadian(float degree) + { + return degree * (MathF.PI / 180F); + } + + /// + /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + /// + /// The angle in radians. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float RadianToDegree(float radian) + { + return radian / (MathF.PI / 180F); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs index 80c4f4600..55d75b83d 100644 --- a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs +++ b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs @@ -50,12 +50,12 @@ namespace SixLabors.Primitives public static Matrix3x2 CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); /// - /// Creates a skew matrix from the given angles in radians. + /// Creates a skew matrix from the given angles in degrees. /// /// The X angle, in degrees. /// The Y angle, in degrees. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathFExtensions.DegreeToRadian(degreesX), MathFExtensions.DegreeToRadian(degreesY)); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -67,20 +67,20 @@ namespace SixLabors.Primitives public static Matrix3x2 CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); /// - /// Creates a skew matrix from the given angles in radians and a center point. + /// Creates a skew matrix from the given angles in degrees and a center point. /// /// The X angle, in degrees. /// The Y angle, in degrees. /// The center point. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathFExtensions.DegreeToRadian(degreesX), MathFExtensions.DegreeToRadian(degreesY), centerPoint); /// - /// Creates a rotation matrix using the given rotation in radians. + /// Creates a rotation matrix using the given rotation in degrees. /// /// The amount of rotation, in degrees. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); + public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(MathFExtensions.DegreeToRadian(degrees)); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -91,11 +91,11 @@ namespace SixLabors.Primitives public static Matrix3x2 CreateRotation(float radians, PointF centerPoint) => Matrix3x2.CreateRotation(radians, centerPoint); /// - /// Creates a rotation matrix using the given rotation in radians and a center point. + /// Creates a rotation matrix using the given rotation in degrees and a center point. /// /// The amount of rotation, in degrees. /// The center point. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); + public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathFExtensions.DegreeToRadian(degrees), centerPoint); } -} +} \ No newline at end of file diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index a5a174536..0998e722e 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -1,49 +1,50 @@  - - Low level primitives for use across Six Labors projects.. - $(packageversion) - 0.1.0-alpha2 - Six Labors - netstandard1.1 - true - true - SixLabors.Core - SixLabors.Core - rectangle;point;size,primitives - https://raw.githubusercontent.com/SixLabors/Home/master/logo.png - https://github.com/SixLabors/Core - http://www.apache.org/licenses/LICENSE-2.0 - git - https://github.com/SixLabors/Core - false - false - false - false - false - false - false - false - false - false - full - SixLabors - + + Low level primitives for use across Six Labors projects.. + $(packageversion) + 0.1.0-alpha2 + Six Labors + netstandard1.1;netcoreapp2.0; + true + true + SixLabors.Core + SixLabors.Core + rectangle;point;size,primitives + https://raw.githubusercontent.com/SixLabors/Home/master/logo.png + https://github.com/SixLabors/Core + http://www.apache.org/licenses/LICENSE-2.0 + git + https://github.com/SixLabors/Core + false + false + false + false + false + false + false + false + false + false + full + SixLabors + - - ..\SixLabors.ruleset - + + ..\SixLabors.ruleset + - - - - - - - - All - - - + + + + + + + All + + + + + \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs new file mode 100644 index 000000000..e3ef6a01b --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs @@ -0,0 +1,59 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace SixLabors.Tests.Helpers +{ + /// + /// Allows the comparison of single-precision floating point values by precision. + /// + public struct FloatRoundingComparer : IEqualityComparer, IEqualityComparer + { + /// + /// Initializes a new instance of the struct. + /// + /// The number of decimal places (valid values: 0-7) + public FloatRoundingComparer(int precision) + { + Guard.MustBeBetweenOrEqualTo(precision, 0, 7, nameof(precision)); + this.Precision = precision; + } + + /// + /// Gets the number of decimal places (valid values: 0-7) + /// + public int Precision { get; } + + /// + public bool Equals(float x, float y) + { + float xp = (float)Math.Round(x, this.Precision, MidpointRounding.AwayFromZero); + float yp = (float)Math.Round(y, this.Precision, MidpointRounding.AwayFromZero); + + return Comparer.Default.Compare(xp, yp) == 0; + } + + /// + public bool Equals(Vector4 x, Vector4 y) + { + return this.Equals(x.X, y.X) && this.Equals(x.Y, y.Y) && this.Equals(x.Z, y.Z) && this.Equals(x.W, y.W); + } + + /// + public int GetHashCode(float obj) + { + unchecked + { + int hashCode = obj.GetHashCode(); + hashCode = (hashCode * 397) ^ this.Precision.GetHashCode(); + return hashCode; + } + } + + /// + public int GetHashCode(Vector4 obj) => HashHelpers.Combine(obj.GetHashCode(), this.Precision.GetHashCode()); + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs new file mode 100644 index 000000000..477259983 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs @@ -0,0 +1,107 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using Xunit; + +namespace SixLabors.Tests.Helpers +{ + public class MathFTests + { + [Fact] + public void MathF_PI_Is_Equal() + { + Assert.Equal(MathF.PI, (float)Math.PI); + } + + [Fact] + public void MathF_Ceililng_Is_Equal() + { + Assert.Equal(MathF.Ceiling(0.3333F), (float)Math.Ceiling(0.3333F)); + } + + [Fact] + public void MathF_Cos_Is_Equal() + { + Assert.Equal(MathF.Cos(0.3333F), (float)Math.Cos(0.3333F)); + } + + [Fact] + public void MathF_Abs_Is_Equal() + { + Assert.Equal(MathF.Abs(-0.3333F), (float)Math.Abs(-0.3333F)); + } + + [Fact] + public void MathF_Atan2_Is_Equal() + { + Assert.Equal(MathF.Atan2(1.2345F, 1.2345F), (float)Math.Atan2(1.2345F, 1.2345F)); + } + + [Fact] + public void MathF_Exp_Is_Equal() + { + Assert.Equal(MathF.Exp(1.2345F), (float)Math.Exp(1.2345F)); + } + + [Fact] + public void MathF_Floor_Is_Equal() + { + Assert.Equal(MathF.Floor(1.2345F), (float)Math.Floor(1.2345F)); + } + + [Fact] + public void MathF_Min_Is_Equal() + { + Assert.Equal(MathF.Min(1.2345F, 5.4321F), (float)Math.Min(1.2345F, 5.4321F)); + } + + [Fact] + public void MathF_Max_Is_Equal() + { + Assert.Equal(MathF.Max(1.2345F, 5.4321F), (float)Math.Max(1.2345F, 5.4321F)); + } + + [Fact] + public void MathF_Pow_Is_Equal() + { + Assert.Equal(MathF.Pow(1.2345F, 5.4321F), (float)Math.Pow(1.2345F, 5.4321F)); + } + + [Fact] + public void MathF_Round_Is_Equal() + { + Assert.Equal(MathF.Round(1.2345F), (float)Math.Round(1.2345F)); + } + + [Fact] + public void MathF_Round_With_Midpoint_Is_Equal() + { + Assert.Equal(MathF.Round(1.2345F, MidpointRounding.AwayFromZero), (float)Math.Round(1.2345F, MidpointRounding.AwayFromZero)); + } + + [Fact] + public void MathF_Sin_Is_Equal() + { + Assert.Equal(MathF.Sin(1.2345F), (float)Math.Sin(1.2345F)); + } + + [Fact] + public void MathF_Sqrt_Is_Equal() + { + Assert.Equal(MathF.Sqrt(2F), (float)Math.Sqrt(2F)); + } + + [Fact] + public void Convert_Degree_To_Radian() + { + Assert.Equal((float)(Math.PI / 2D), MathFExtensions.DegreeToRadian(90F), new FloatRoundingComparer(6)); + } + + [Fact] + public void Convert_Radian_To_Degree() + { + Assert.Equal(60F, MathFExtensions.RadianToDegree((float)(Math.PI / 3D)), new FloatRoundingComparer(5)); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index a1880d0e1..79fd0bd4d 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; using System.Globalization; using System.Numerics; using Xunit; diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index a80bf5a60..6869491e3 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -2,7 +2,7 @@ 0.0.0 - netcoreapp1.1 + netcoreapp1.1;netcoreapp2.0; SixLabors.Core.Tests SixLabors.Shapes.Tests true From 548c0f50666f0ba2349b91a21fcd16db3cb7f8a3 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 16 Sep 2017 10:15:58 +0100 Subject: [PATCH 046/136] [SL.Core] prevent stylecop.json form being included in package --- src/SixLabors.Core/SixLabors.Core.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index a5a174536..e38298f84 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -36,7 +36,6 @@ - From 491b683c79585d474294fe36b08aec83827e43f2 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 16 Sep 2017 10:19:58 +0100 Subject: [PATCH 047/136] [SL.Core] fix gitversion rules to match IS --- gitversion.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gitversion.yml b/gitversion.yml index e07c90f0d..9fae0d8c2 100644 --- a/gitversion.yml +++ b/gitversion.yml @@ -9,5 +9,23 @@ branches: increment: Minor prevent-increment-of-merged-branch-version: false track-merge-target: true + pull-request: + regex: (pull|pull\-requests|pr)[/-] + mode: ContinuousDelivery + tag: PullRequest + increment: Inherit + prevent-increment-of-merged-branch-version: false + tag-number-pattern: '[/-](?\d+)[-/]' + track-merge-target: false + tracks-release-branches: false + is-release-branch: false + otherbranches: + regex: '.*' + mode: ContinuousDeployment + tag: ci + increment: Patch + prevent-increment-of-merged-branch-version: false + track-merge-target: true + is-release-branch: false ignore: sha: [] \ No newline at end of file From 570deb1e084d24608081242d12fbd4c19f56b0ce Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 16 Sep 2017 10:23:00 +0100 Subject: [PATCH 048/136] [SL.Core] fix appveyor.yml to user correct version of gitversion --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 5a74728fa..893839448 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,7 +6,7 @@ install: before_build: - cmd: dotnet --version - - ps: gitversion /l console /output buildserver + - ps: c:\ProgramData\chocolatey\lib\gitversion.portable\tools\gitversion.exe /l console /output buildserver build_script: - cmd: build.cmd From 4596853b37168cb64dd7d02ccd4f2b04a481c154 Mon Sep 17 00:00:00 2001 From: JimBobSquarePants Date: Thu, 5 Oct 2017 15:59:29 +1100 Subject: [PATCH 049/136] [SL.Core] Use type forwarding as per example --- src/SixLabors.Core/MathF.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index 836c8d482..3079c9100 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -1,9 +1,11 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -#if !NETCOREAPP2_0 using System.Runtime.CompilerServices; +#if NETCOREAPP2_0 +[assembly: TypeForwardedTo(typeof(System.MathF))] +#else namespace System { /// From 96c30120a0cfc678798b6aebf09a2d19794a71e1 Mon Sep 17 00:00:00 2001 From: JimBobSquarePants Date: Thu, 5 Oct 2017 15:59:57 +1100 Subject: [PATCH 050/136] [SL.Core] Remove incorrect include --- src/SixLabors.Core/SixLabors.Core.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 0998e722e..dee1f1ad2 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -36,7 +36,6 @@ - From f63535f3014ad8b15dcbb3a006366b469fefadf5 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Nov 2017 19:44:56 +1100 Subject: [PATCH 051/136] [SL.Core] Fix test path in build command --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index eaa54e861..e55aad06f 100644 --- a/build.cmd +++ b/build.cmd @@ -14,7 +14,7 @@ if not "%GitVersion_NuGetVersion%" == "" ( ) if not "%errorlevel%"=="0" goto failure -dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Primitives.Tests.csproj +dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj if not "%GitVersion_NuGetVersion%" == "" ( From 9d4acb054eb15b3b6b52dd985e0afe2f9066ccc8 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 24 Nov 2017 16:56:29 +1100 Subject: [PATCH 052/136] [SL.Core] Replace skew and rotate with single transform --- src/SixLabors.Core/Primitives/Point.cs | 41 +++++++------------ src/SixLabors.Core/Primitives/PointF.cs | 30 +++----------- src/SixLabors.Core/Primitives/RectangleF.cs | 2 +- .../Primitives/PointFTests.cs | 4 +- .../Primitives/PointTests.cs | 4 +- 5 files changed, 25 insertions(+), 56 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 1992d3922..8bbb812e6 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -211,15 +211,12 @@ namespace SixLabors.Primitives public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); /// - /// Transforms a point by the given matrix. + /// Converts a to a by performing a round operation on all the coordinates. /// - /// The source point. - /// The transformation matrix. - /// A transformed point. - public static PointF Transform(Point position, Matrix3x2 matrix) - { - return Vector2.Transform(position, matrix); - } + /// The vector + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); /// /// Converts a to a by performing a truncate operation on all the coordinates. @@ -230,30 +227,22 @@ namespace SixLabors.Primitives public static Point Truncate(PointF point) => new Point(unchecked((int)point.X), unchecked((int)point.Y)); /// - /// Converts a to a by performing a round operation on all the coordinates. - /// - /// The vector - /// The - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); - - /// - /// Rotates a point around the given rotation matrix. + /// Transforms a point by a specified 3x2 matrix. /// - /// The point to rotate - /// Rotation matrix used - /// The rotated + /// The point to transform + /// The transformation matrix used + /// The transformed [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + public static Point Transform(Point point, Matrix3x2 matrix) => Transform(new Vector2(point.X, point.Y), matrix); /// - /// Skews a point using the given skew matrix. + /// Transforms a vector by a specified 3x2 matrix. /// - /// The point to rotate - /// Rotation matrix used - /// The rotated + /// The vector to transform + /// The transformation matrix used + /// The transformed [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + public static Point Transform(Vector2 position, Matrix3x2 matrix) => Round(Vector2.Transform(position, matrix)); /// /// Translates this by the specified amount. diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 454e69e5c..7c0431556 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -238,34 +238,14 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Multiply(PointF point, float right) => new PointF(point.X * right, point.Y * right); - /// PointF - /// Rotates a point around the given rotation matrix. - /// - /// The point to rotate - /// Rotation matrix used - /// The rotated - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static PointF Rotate(PointF point, Matrix3x2 rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); - /// - /// Skews a point using the given skew matrix. + /// Transforms a point by a specified 3x2 matrix. /// - /// The point to rotate - /// Rotation matrix used - /// The rotated + /// The point to transform + /// The transformation matrix used + /// The transformed [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static PointF Skew(PointF point, Matrix3x2 skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); - - /// - /// Transforms a point by the given matrix. - /// - /// The source point. - /// The transformation matrix. - /// A transformed point. - public static PointF Transform(PointF position, Matrix3x2 matrix) - { - return Vector2.Transform(position, matrix); - } + public static PointF Transform(PointF point, Matrix3x2 matrix) => Vector2.Transform(point, matrix); /// /// Translates this by the specified amount. diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 09fa6f1ab..d5ee6a61b 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -254,7 +254,7 @@ namespace SixLabors.Primitives /// /// The source rectangle. /// The transformation matrix. - /// A transformed rectangle. + /// A transformed . public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) { PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index 5a29d1cff..6fdf1bbc3 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -106,7 +106,7 @@ namespace SixLabors.Primitives.Tests var p = new PointF(13, 17); Matrix3x2 matrix = Matrix3x2Extensions.CreateRotationDegrees(45, PointF.Empty); - var pout = PointF.Rotate(p, matrix); + var pout = PointF.Transform(p, matrix); Assert.Equal(new PointF(-2.82842732F, 21.2132034F), pout); } @@ -117,7 +117,7 @@ namespace SixLabors.Primitives.Tests var p = new PointF(13, 17); Matrix3x2 matrix = Matrix3x2Extensions.CreateSkewDegrees(45, 45, PointF.Empty); - var pout = PointF.Skew(p, matrix); + var pout = PointF.Transform(p, matrix); Assert.Equal(new PointF(30, 30), pout); } diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 79fd0bd4d..43d662572 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -161,7 +161,7 @@ namespace SixLabors.Primitives.Tests var p = new Point(13, 17); Matrix3x2 matrix = Matrix3x2Extensions.CreateRotationDegrees(45, Point.Empty); - var pout = Point.Rotate(p, matrix); + var pout = Point.Transform(p, matrix); Assert.Equal(new Point(-3, 21), pout); } @@ -172,7 +172,7 @@ namespace SixLabors.Primitives.Tests var p = new Point(13, 17); Matrix3x2 matrix = Matrix3x2Extensions.CreateSkewDegrees(45, 45, Point.Empty); - var pout = Point.Skew(p, matrix); + var pout = Point.Transform(p, matrix); Assert.Equal(new Point(30, 30), pout); } From a993b77feb8158fa2e22116e8893236046039738 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 20 Nov 2017 20:38:36 +1100 Subject: [PATCH 053/136] [SL.Core] Add missing library internal --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 368bab248..96a40f6f6 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -41,3 +41,4 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("SixLabors.ImageSharp")] [assembly: InternalsVisibleTo("SixLabors.ImageSharp.Drawing")] [assembly: InternalsVisibleTo("SixLabors.Shapes")] +[assembly: InternalsVisibleTo("SixLabors.Shapes.Text")] From ceb18ee72fca8b3f4e54fa55c5c7c96d7dc81bfb Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 25 Nov 2017 10:40:49 +1100 Subject: [PATCH 054/136] [SL.Core] Remove Vector2 overload --- src/SixLabors.Core/Primitives/Point.cs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 8bbb812e6..ab12e28ff 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -233,16 +233,7 @@ namespace SixLabors.Primitives /// The transformation matrix used /// The transformed [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Transform(Point point, Matrix3x2 matrix) => Transform(new Vector2(point.X, point.Y), matrix); - - /// - /// Transforms a vector by a specified 3x2 matrix. - /// - /// The vector to transform - /// The transformation matrix used - /// The transformed - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Transform(Vector2 position, Matrix3x2 matrix) => Round(Vector2.Transform(position, matrix)); + public static Point Transform(Point point, Matrix3x2 matrix) => Round(Vector2.Transform(new Vector2(point.X, point.Y), matrix)); /// /// Translates this by the specified amount. From 9ff9dafb1393e9aa2eaffe33a2aac10458a4c1e7 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 22 Mar 2018 23:22:33 +1100 Subject: [PATCH 055/136] [SL.Core] Update logo and readme. --- README.md | 14 +++++++++++--- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a2f16a739..159761bd6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ -# SixLabers.Core +

-**SixLabors.Core** provides classes for use across SixLabors libraries. +SixLabors.Core +
+SixLabors.Core +

+ +
[![Build status](https://ci.appveyor.com/api/projects/status/j1hvc99493b0jk3x/branch/develop?svg=true)](https://ci.appveyor.com/project/six-labors/core/branch/develop) [![codecov](https://codecov.io/gh/SixLabors/Core/branch/develop/graph/badge.svg)](https://codecov.io/gh/SixLabors/Core) @@ -8,4 +13,7 @@ [![GitHub issues](https://img.shields.io/github/issues/SixLabors/Core.svg)](https://github.com/SixLabors/Core/issues) [![GitHub stars](https://img.shields.io/github/stars/SixLabors/Core.svg)](https://github.com/SixLabors/Core/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/SixLabors/Core.svg)](https://github.com/SixLabors/Core/network) \ No newline at end of file +[![GitHub forks](https://img.shields.io/github/forks/SixLabors/Core.svg)](https://github.com/SixLabors/Core/network) +
+ +**SixLabors.Core** provides core primitives and helper methods for use across SixLabors libraries. diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index dee1f1ad2..d14738dd5 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -11,7 +11,7 @@ SixLabors.Core SixLabors.Core rectangle;point;size,primitives - https://raw.githubusercontent.com/SixLabors/Home/master/logo.png + https://raw.githubusercontent.com/SixLabors/Branding/master/icons/core/sixlabors.core.128.png https://github.com/SixLabors/Core http://www.apache.org/licenses/LICENSE-2.0 git From a5bfedd97cd7af5eb593985209c52709fb96f5e1 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 26 Jul 2018 00:17:34 +0200 Subject: [PATCH 056/136] [SL.Core] Make Guard.NotNull() and DebugGuard.NotNull() generic --- src/SixLabors.Core/Helpers/DebugGuard.cs | 4 +++- src/SixLabors.Core/Helpers/Guard.cs | 4 +++- src/SixLabors.Core/SixLabors.Core.csproj.DotSettings | 2 ++ tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 2 +- tests/SixLabors.Core.Tests/Helpers/GuardTests.cs | 4 ++-- 5 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 src/SixLabors.Core/SixLabors.Core.csproj.DotSettings diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index c649372ee..f41d7eacf 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -19,8 +19,10 @@ namespace SixLabors /// The target object, which cannot be null. /// The name of the parameter that is to be checked. /// is null + /// The type of the object to verify [Conditional("DEBUG")] - public static void NotNull(object target, string parameterName) + public static void NotNull(T target, string parameterName) + where T : class { if (target == null) { diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 3a38551d8..41db42fc1 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -22,7 +22,9 @@ namespace SixLabors /// The name of the parameter that is to be checked. /// The error message, if any to add to the exception. /// is null - public static void NotNull(object target, string parameterName, string message = "") + /// The type of the object to verify + public static void NotNull(T target, string parameterName, string message = "") + where T : class { if (target == null) { diff --git a/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings b/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings new file mode 100644 index 000000000..8b01856ae --- /dev/null +++ b/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 99661dfe0..843b74ded 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -39,7 +39,7 @@ namespace SixLabors.Helpers.Tests { Assert.Throws(() => { - DebugGuard.NotNull(null, "myParamName"); + DebugGuard.NotNull((object)null, "myParamName"); }); } diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index 95901c774..ed2e0b5c7 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -21,7 +21,7 @@ namespace SixLabors.Helpers.Tests { Assert.Throws(() => { - Guard.NotNull(null, "myParamName"); + Guard.NotNull((object)null, "myParamName"); }); } @@ -30,7 +30,7 @@ namespace SixLabors.Helpers.Tests { var exception = Assert.Throws(() => { - Guard.NotNull(null, "myParamName", "myTestMessage"); + Guard.NotNull((object)null, "myParamName", "myTestMessage"); }); Assert.Equal("myParamName", exception.ParamName); From 9f51d65d950fa691ec70eeb129aad5db35c49fee Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 26 Jul 2018 01:15:12 +0200 Subject: [PATCH 057/136] [SL.Core] Add MemoryAllocator-s with tests --- SixLabors.Core.sln.DotSettings | 3 +- .../Memory/AllocationOptions.cs | 21 ++ .../ArrayPoolMemoryAllocator.Buffer{T}.cs | 84 +++++ ...oolMemoryAllocator.CommonFactoryMethods.cs | 72 ++++ .../Memory/ArrayPoolMemoryAllocator.cs | 140 ++++++++ src/SixLabors.Core/Memory/BasicArrayBuffer.cs | 78 +++++ src/SixLabors.Core/Memory/BasicByteBuffer.cs | 20 ++ .../Memory/IManagedByteBuffer.cs | 18 + .../Memory/ManagedBufferBase.cs | 45 +++ src/SixLabors.Core/Memory/MemoryAllocator.cs | 39 +++ .../Memory/SimpleGcMemoryAllocator.cs | 25 ++ src/SixLabors.Core/SixLabors.Core.csproj | 3 + .../Memory/ArrayPoolMemoryManagerTests.cs | 240 +++++++++++++ .../Memory/BufferExtensions.cs | 25 ++ .../Memory/BufferTestSuite.cs | 318 ++++++++++++++++++ .../Memory/SimpleGcMemoryManagerTests.cs | 16 + .../SixLabors.Core.Tests.csproj | 1 + tests/SixLabors.Core.Tests/TestEnvironment.cs | 12 + 18 files changed, 1159 insertions(+), 1 deletion(-) create mode 100644 src/SixLabors.Core/Memory/AllocationOptions.cs create mode 100644 src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs create mode 100644 src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs create mode 100644 src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs create mode 100644 src/SixLabors.Core/Memory/BasicArrayBuffer.cs create mode 100644 src/SixLabors.Core/Memory/BasicByteBuffer.cs create mode 100644 src/SixLabors.Core/Memory/IManagedByteBuffer.cs create mode 100644 src/SixLabors.Core/Memory/ManagedBufferBase.cs create mode 100644 src/SixLabors.Core/Memory/MemoryAllocator.cs create mode 100644 src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs create mode 100644 tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs create mode 100644 tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs create mode 100644 tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs create mode 100644 tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs create mode 100644 tests/SixLabors.Core.Tests/TestEnvironment.cs diff --git a/SixLabors.Core.sln.DotSettings b/SixLabors.Core.sln.DotSettings index 613ba3882..82961f0d0 100644 --- a/SixLabors.Core.sln.DotSettings +++ b/SixLabors.Core.sln.DotSettings @@ -2,4 +2,5 @@ DO_NOT_SHOW DO_NOT_SHOW DO_NOT_SHOW - DO_NOT_SHOW \ No newline at end of file + DO_NOT_SHOW + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/AllocationOptions.cs b/src/SixLabors.Core/Memory/AllocationOptions.cs new file mode 100644 index 000000000..5eda00505 --- /dev/null +++ b/src/SixLabors.Core/Memory/AllocationOptions.cs @@ -0,0 +1,21 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.Memory +{ + /// + /// Options for allocating buffers. + /// + public enum AllocationOptions + { + /// + /// Indicates that the buffer should just be allocated. + /// + None, + + /// + /// Indicates that the allocated buffer should be cleaned following allocation. + /// + Clean + } +} diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs new file mode 100644 index 000000000..b563d4a79 --- /dev/null +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -0,0 +1,84 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Buffers; +using System.Runtime.InteropServices; + +namespace SixLabors.Memory +{ + /// + /// Contains and + /// + public partial class ArrayPoolMemoryAllocator + { + /// + /// The buffer implementation of . + /// + private class Buffer : ManagedBufferBase + where T : struct + { + /// + /// The length of the buffer + /// + private readonly int length; + + /// + /// A weak reference to the source pool. + /// + /// + /// By using a weak reference here, we are making sure that array pools and their retained arrays are always GC-ed + /// after a call to , regardless of having buffer instances still being in use. + /// + private WeakReference> sourcePoolReference; + + public Buffer(byte[] data, int length, ArrayPool sourcePool) + { + this.Data = data; + this.length = length; + this.sourcePoolReference = new WeakReference>(sourcePool); + } + + /// + /// Gets the buffer as a byte array. + /// + protected byte[] Data { get; private set; } + + /// + public override Span GetSpan() => MemoryMarshal.Cast(this.Data.AsSpan()).Slice(0, this.length); + + /// + protected override void Dispose(bool disposing) + { + if (!disposing || this.Data == null || this.sourcePoolReference == null) + { + return; + } + + if (this.sourcePoolReference.TryGetTarget(out ArrayPool pool)) + { + pool.Return(this.Data); + } + + this.sourcePoolReference = null; + this.Data = null; + } + + protected override object GetPinnableObject() => this.Data; + } + + /// + /// The implementation of . + /// + private class ManagedByteBuffer : Buffer, IManagedByteBuffer + { + public ManagedByteBuffer(byte[] data, int length, ArrayPool sourcePool) + : base(data, length, sourcePool) + { + } + + /// + public byte[] Array => this.Data; + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs new file mode 100644 index 000000000..a82948ebc --- /dev/null +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -0,0 +1,72 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.Memory +{ + /// + /// Contains common factory methods and configuration constants. + /// + public partial class ArrayPoolMemoryAllocator + { + /// + /// The default value for: maximum size of pooled arrays in bytes. + /// Currently set to 24MB, which is equivalent to 8 megapixels of raw RGBA32 data. + /// + internal const int DefaultMaxPooledBufferSizeInBytes = 24 * 1024 * 1024; + + /// + /// The value for: The threshold to pool arrays in which has less buckets for memory safety. + /// + private const int DefaultBufferSelectorThresholdInBytes = 8 * 1024 * 1024; + + /// + /// The default bucket count for . + /// + private const int DefaultLargePoolBucketCount = 6; + + /// + /// The default bucket count for . + /// + private const int DefaultNormalPoolBucketCount = 16; + + /// + /// This is the default. Should be good for most use cases. + /// + /// The memory manager + public static ArrayPoolMemoryAllocator CreateDefault() + { + return new ArrayPoolMemoryAllocator( + DefaultMaxPooledBufferSizeInBytes, + DefaultBufferSelectorThresholdInBytes, + DefaultLargePoolBucketCount, + DefaultNormalPoolBucketCount); + } + + /// + /// For environments with limited memory capabilities. Only small images are pooled, which can result in reduced througput. + /// + /// The memory manager + public static ArrayPoolMemoryAllocator CreateWithModeratePooling() + { + return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); + } + + /// + /// Only pool small buffers like image rows. + /// + /// The memory manager + public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() + { + return new ArrayPoolMemoryAllocator(64 * 1024, 32 * 1024, 8, 24); + } + + /// + /// RAM is not an issue for me, gimme maximum througput! + /// + /// The memory manager + public static ArrayPoolMemoryAllocator CreateWithAggressivePooling() + { + return new ArrayPoolMemoryAllocator(128 * 1024 * 1024, 32 * 1024 * 1024, 16, 32); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs new file mode 100644 index 000000000..8681a594b --- /dev/null +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs @@ -0,0 +1,140 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; +using System.Runtime.CompilerServices; + +namespace SixLabors.Memory +{ + /// + /// Implements by allocating memory from . + /// + public sealed partial class ArrayPoolMemoryAllocator : MemoryAllocator + { + private readonly int maxArraysPerBucketNormalPool; + + private readonly int maxArraysPerBucketLargePool; + + /// + /// The for small-to-medium buffers which is not kept clean. + /// + private ArrayPool normalArrayPool; + + /// + /// The for huge buffers, which is not kept clean. + /// + private ArrayPool largeArrayPool; + + /// + /// Initializes a new instance of the class. + /// + public ArrayPoolMemoryAllocator() + : this(DefaultMaxPooledBufferSizeInBytes, DefaultBufferSelectorThresholdInBytes) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The maximum size of pooled arrays. Arrays over the thershold are gonna be always allocated. + public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes) + : this(maxPoolSizeInBytes, GetLargeBufferThresholdInBytes(maxPoolSizeInBytes)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The maximum size of pooled arrays. Arrays over the thershold are gonna be always allocated. + /// Arrays over this threshold will be pooled in which has less buckets for memory safety. + public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes, int poolSelectorThresholdInBytes) + : this(maxPoolSizeInBytes, poolSelectorThresholdInBytes, DefaultLargePoolBucketCount, DefaultNormalPoolBucketCount) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The maximum size of pooled arrays. Arrays over the thershold are gonna be always allocated. + /// The threshold to pool arrays in which has less buckets for memory safety. + /// Max arrays per bucket for the large array pool + /// Max arrays per bucket for the normal array pool + public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes, int poolSelectorThresholdInBytes, int maxArraysPerBucketLargePool, int maxArraysPerBucketNormalPool) + { + Guard.MustBeGreaterThan(maxPoolSizeInBytes, 0, nameof(maxPoolSizeInBytes)); + Guard.MustBeLessThanOrEqualTo(poolSelectorThresholdInBytes, maxPoolSizeInBytes, nameof(poolSelectorThresholdInBytes)); + + this.MaxPoolSizeInBytes = maxPoolSizeInBytes; + this.PoolSelectorThresholdInBytes = poolSelectorThresholdInBytes; + this.maxArraysPerBucketLargePool = maxArraysPerBucketLargePool; + this.maxArraysPerBucketNormalPool = maxArraysPerBucketNormalPool; + + this.InitArrayPools(); + } + + /// + /// Gets the maximum size of pooled arrays in bytes. + /// + public int MaxPoolSizeInBytes { get; } + + /// + /// Gets the threshold to pool arrays in which has less buckets for memory safety. + /// + public int PoolSelectorThresholdInBytes { get; } + + /// + public override void ReleaseRetainedResources() + { + this.InitArrayPools(); + } + + /// + public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) + { + int itemSizeBytes = Unsafe.SizeOf(); + int bufferSizeInBytes = length * itemSizeBytes; + + ArrayPool pool = this.GetArrayPool(bufferSizeInBytes); + byte[] byteArray = pool.Rent(bufferSizeInBytes); + + var buffer = new Buffer(byteArray, length, pool); + if (options == AllocationOptions.Clean) + { + buffer.GetSpan().Clear(); + } + + return buffer; + } + + /// + public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) + { + ArrayPool pool = this.GetArrayPool(length); + byte[] byteArray = pool.Rent(length); + + var buffer = new ManagedByteBuffer(byteArray, length, pool); + if (options == AllocationOptions.Clean) + { + buffer.GetSpan().Clear(); + } + + return buffer; + } + + private static int GetLargeBufferThresholdInBytes(int maxPoolSizeInBytes) + { + return maxPoolSizeInBytes / 4; + } + + private ArrayPool GetArrayPool(int bufferSizeInBytes) + { + return bufferSizeInBytes <= this.PoolSelectorThresholdInBytes ? this.normalArrayPool : this.largeArrayPool; + } + + private void InitArrayPools() + { + this.largeArrayPool = ArrayPool.Create(this.MaxPoolSizeInBytes, this.maxArraysPerBucketLargePool); + this.normalArrayPool = ArrayPool.Create(this.PoolSelectorThresholdInBytes, this.maxArraysPerBucketNormalPool); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/BasicArrayBuffer.cs b/src/SixLabors.Core/Memory/BasicArrayBuffer.cs new file mode 100644 index 000000000..a3e2d02cc --- /dev/null +++ b/src/SixLabors.Core/Memory/BasicArrayBuffer.cs @@ -0,0 +1,78 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Runtime.CompilerServices; + +namespace SixLabors.Memory +{ + /// + /// Wraps an array as an instance. + /// + /// + internal class BasicArrayBuffer : ManagedBufferBase + where T : struct + { + /// + /// Initializes a new instance of the class + /// + /// The array + /// The length of the buffer + public BasicArrayBuffer(T[] array, int length) + { + DebugGuard.MustBeLessThanOrEqualTo(length, array.Length, nameof(length)); + this.Array = array; + this.Length = length; + } + + /// + /// Initializes a new instance of the class + /// + /// The array + public BasicArrayBuffer(T[] array) + : this(array, array.Length) + { + } + + /// + /// Gets the array + /// + public T[] Array { get; } + + /// + /// Gets the length + /// + public int Length { get; } + + /// + /// Returns a reference to specified element of the buffer. + /// + /// The index + /// The reference to the specified element + public ref T this[int index] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + DebugGuard.MustBeLessThan(index, this.Length, nameof(index)); + + Span span = this.GetSpan(); + return ref span[index]; + } + } + + /// + public override Span GetSpan() => this.Array.AsSpan(0, this.Length); + + /// + protected override void Dispose(bool disposing) + { + } + + /// + protected override object GetPinnableObject() + { + return this.Array; + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/BasicByteBuffer.cs b/src/SixLabors.Core/Memory/BasicByteBuffer.cs new file mode 100644 index 000000000..5706ca87a --- /dev/null +++ b/src/SixLabors.Core/Memory/BasicByteBuffer.cs @@ -0,0 +1,20 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.Memory +{ + /// + /// Provides an based on . + /// + internal sealed class BasicByteBuffer : BasicArrayBuffer, IManagedByteBuffer + { + /// + /// Initializes a new instance of the class + /// + /// The byte array + internal BasicByteBuffer(byte[] array) + : base(array) + { + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/IManagedByteBuffer.cs b/src/SixLabors.Core/Memory/IManagedByteBuffer.cs new file mode 100644 index 000000000..b6d956c10 --- /dev/null +++ b/src/SixLabors.Core/Memory/IManagedByteBuffer.cs @@ -0,0 +1,18 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; + +namespace SixLabors.Memory +{ + /// + /// Represents a byte buffer backed by a managed array. Useful for interop with classic .NET API-s. + /// + public interface IManagedByteBuffer : IMemoryOwner + { + /// + /// Gets the managed array backing this buffer instance. + /// + byte[] Array { get; } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/ManagedBufferBase.cs b/src/SixLabors.Core/Memory/ManagedBufferBase.cs new file mode 100644 index 000000000..1d07b2dac --- /dev/null +++ b/src/SixLabors.Core/Memory/ManagedBufferBase.cs @@ -0,0 +1,45 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; +using System.Runtime.InteropServices; + +namespace SixLabors.Memory +{ + /// + /// Provides a base class for implementations by implementing pinning logic for adaption. + /// + /// The element type + internal abstract class ManagedBufferBase : MemoryManager + where T : struct + { + private GCHandle pinHandle; + + /// + public override unsafe MemoryHandle Pin(int elementIndex = 0) + { + if (!this.pinHandle.IsAllocated) + { + this.pinHandle = GCHandle.Alloc(this.GetPinnableObject(), GCHandleType.Pinned); + } + + void* ptr = (void*)this.pinHandle.AddrOfPinnedObject(); + return new MemoryHandle(ptr, this.pinHandle); + } + + /// + public override void Unpin() + { + if (this.pinHandle.IsAllocated) + { + this.pinHandle.Free(); + } + } + + /// + /// Gets the object that should be pinned. + /// + /// The pinnable + protected abstract object GetPinnableObject(); + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/MemoryAllocator.cs b/src/SixLabors.Core/Memory/MemoryAllocator.cs new file mode 100644 index 000000000..36ce8fcce --- /dev/null +++ b/src/SixLabors.Core/Memory/MemoryAllocator.cs @@ -0,0 +1,39 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; + +namespace SixLabors.Memory +{ + /// + /// Memory managers are used to allocate memory for image processing operations. + /// + public abstract class MemoryAllocator + { + /// + /// Allocates an , holding a of length . + /// + /// Type of the data stored in the buffer + /// Size of the buffer to allocate + /// The allocation options. + /// A buffer of values of type . + public abstract IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) + where T : struct; + + /// + /// Allocates an . + /// + /// The requested buffer length + /// The allocation options. + /// The + public abstract IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None); + + /// + /// Releases all retained resources not being in use. + /// Eg: by resetting array pools and letting GC to free the arrays. + /// + public virtual void ReleaseRetainedResources() + { + } + } +} diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs new file mode 100644 index 000000000..9b4c0fda0 --- /dev/null +++ b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs @@ -0,0 +1,25 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; + +namespace SixLabors.Memory +{ + /// + /// Implements by newing up arrays by the GC on every allocation requests. + /// + public sealed class SimpleGcMemoryAllocator : MemoryAllocator + { + /// + public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) + { + return new BasicArrayBuffer(new T[length]); + } + + /// + public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) + { + return new BasicByteBuffer(new byte[length]); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index d14738dd5..bc37cd2e2 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -42,6 +42,9 @@ All + + + diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs new file mode 100644 index 000000000..0068fce91 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs @@ -0,0 +1,240 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +// ReSharper disable InconsistentNaming + +using System; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using SixLabors.Tests; +using Xunit; + +namespace SixLabors.Memory.Tests +{ + public class ArrayPoolMemoryManagerTests + { + private const int MaxPooledBufferSizeInBytes = 2048; + + private const int PoolSelectorThresholdInBytes = MaxPooledBufferSizeInBytes / 2; + + private MemoryAllocator MemoryAllocator { get; set; } = + new ArrayPoolMemoryAllocator(MaxPooledBufferSizeInBytes, PoolSelectorThresholdInBytes); + + /// + /// Rent a buffer -> return it -> re-rent -> verify if it's span points to the previous location + /// + private bool CheckIsRentingPooledBuffer(int length) + where T : struct + { + IMemoryOwner buffer = this.MemoryAllocator.Allocate(length); + ref T ptrToPrevPosition0 = ref buffer.GetReference(); + buffer.Dispose(); + + buffer = this.MemoryAllocator.Allocate(length); + bool sameBuffers = Unsafe.AreSame(ref ptrToPrevPosition0, ref buffer.GetReference()); + buffer.Dispose(); + + return sameBuffers; + } + + public class BufferTests : BufferTestSuite + { + public BufferTests() + : base(new ArrayPoolMemoryAllocator(MaxPooledBufferSizeInBytes, PoolSelectorThresholdInBytes)) + { + } + } + + public class Constructor + { + [Fact] + public void WhenBothParametersPassedByUser() + { + var mgr = new ArrayPoolMemoryAllocator(1111, 666); + Assert.Equal(1111, mgr.MaxPoolSizeInBytes); + Assert.Equal(666, mgr.PoolSelectorThresholdInBytes); + } + + [Fact] + public void WhenPassedOnly_MaxPooledBufferSizeInBytes_SmallerThresholdValueIsAutoCalculated() + { + var mgr = new ArrayPoolMemoryAllocator(5000); + Assert.Equal(5000, mgr.MaxPoolSizeInBytes); + Assert.True(mgr.PoolSelectorThresholdInBytes < mgr.MaxPoolSizeInBytes); + } + + [Fact] + public void When_PoolSelectorThresholdInBytes_IsGreaterThan_MaxPooledBufferSizeInBytes_ExceptionIsThrown() + { + Assert.ThrowsAny(() => { new ArrayPoolMemoryAllocator(100, 200); }); + } + } + + [Theory] + [InlineData(32)] + [InlineData(512)] + [InlineData(MaxPooledBufferSizeInBytes - 1)] + public void SmallBuffersArePooled_OfByte(int size) + { + Assert.True(this.CheckIsRentingPooledBuffer(size)); + } + + + [Theory] + [InlineData(128 * 1024 * 1024)] + [InlineData(MaxPooledBufferSizeInBytes + 1)] + public void LargeBuffersAreNotPooled_OfByte(int size) + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + Assert.False(this.CheckIsRentingPooledBuffer(size)); + } + + [Fact] + public unsafe void SmallBuffersArePooled_OfBigValueType() + { + int count = (MaxPooledBufferSizeInBytes / sizeof(LargeStruct)) - 1; + + Assert.True(this.CheckIsRentingPooledBuffer(count)); + } + + [Fact] + public unsafe void LaregeBuffersAreNotPooled_OfBigValueType() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + int count = (MaxPooledBufferSizeInBytes / sizeof(LargeStruct)) + 1; + + Assert.False(this.CheckIsRentingPooledBuffer(count)); + } + + [Theory] + [InlineData(AllocationOptions.None)] + [InlineData(AllocationOptions.Clean)] + public void CleaningRequests_AreControlledByAllocationParameter_Clean(AllocationOptions options) + { + using (IMemoryOwner firstAlloc = this.MemoryAllocator.Allocate(42)) + { + firstAlloc.GetSpan().Fill(666); + } + + using (IMemoryOwner secondAlloc = this.MemoryAllocator.Allocate(42, options)) + { + int expected = options == AllocationOptions.Clean ? 0 : 666; + Assert.Equal(expected, secondAlloc.GetSpan()[0]); + } + } + + [Theory] + [InlineData(false)] + [InlineData(true)] + public void ReleaseRetainedResources_ReplacesInnerArrayPool(bool keepBufferAlive) + { + IMemoryOwner buffer = this.MemoryAllocator.Allocate(32); + ref int ptrToPrev0 = ref MemoryMarshal.GetReference(buffer.GetSpan()); + + if (!keepBufferAlive) + { + buffer.Dispose(); + } + + this.MemoryAllocator.ReleaseRetainedResources(); + + buffer = this.MemoryAllocator.Allocate(32); + + Assert.False(Unsafe.AreSame(ref ptrToPrev0, ref buffer.GetReference())); + } + + [Fact] + public void ReleaseRetainedResources_DisposingPreviouslyAllocatedBuffer_IsAllowed() + { + IMemoryOwner buffer = this.MemoryAllocator.Allocate(32); + this.MemoryAllocator.ReleaseRetainedResources(); + buffer.Dispose(); + } + + [Fact] + public void AllocationOverLargeArrayThreshold_UsesDifferentPool() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + int arrayLengthThreshold = PoolSelectorThresholdInBytes / sizeof(int); + + IMemoryOwner small = this.MemoryAllocator.Allocate(arrayLengthThreshold - 1); + ref int ptr2Small = ref small.GetReference(); + small.Dispose(); + + IMemoryOwner large = this.MemoryAllocator.Allocate(arrayLengthThreshold + 1); + + Assert.False(Unsafe.AreSame(ref ptr2Small, ref large.GetReference())); + } + + [Fact] + public void CreateWithAggressivePooling() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + this.MemoryAllocator = ArrayPoolMemoryAllocator.CreateWithAggressivePooling(); + + Assert.True(this.CheckIsRentingPooledBuffer(4096 * 4096)); + } + + [Fact] + public void CreateDefault() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + this.MemoryAllocator = ArrayPoolMemoryAllocator.CreateDefault(); + + Assert.False(this.CheckIsRentingPooledBuffer(2 * 4096 * 4096)); + Assert.True(this.CheckIsRentingPooledBuffer(2048 * 2048)); + } + + [Fact] + public void CreateWithModeratePooling() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + this.MemoryAllocator = ArrayPoolMemoryAllocator.CreateWithModeratePooling(); + + Assert.False(this.CheckIsRentingPooledBuffer(2048 * 2048)); + Assert.True(this.CheckIsRentingPooledBuffer(1024 * 16)); + } + + [StructLayout(LayoutKind.Sequential)] + private struct Rgba32 + { + private uint dummy; + } + + [StructLayout(LayoutKind.Explicit, Size = MaxPooledBufferSizeInBytes / 5)] + private struct LargeStruct + { + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs b/tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs new file mode 100644 index 000000000..fd53db1d8 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs @@ -0,0 +1,25 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace SixLabors.Memory.Tests +{ + internal static class BufferExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Span GetSpan(this IMemoryOwner buffer) + => buffer.Memory.Span; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Length(this IMemoryOwner buffer) + => buffer.GetSpan().Length; + + public static ref T GetReference(this IMemoryOwner buffer) + where T : struct => + ref MemoryMarshal.GetReference(buffer.GetSpan()); + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs b/tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs new file mode 100644 index 000000000..eca184264 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs @@ -0,0 +1,318 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Xunit; + +// ReSharper disable InconsistentNaming +namespace SixLabors.Memory.Tests +{ + /// + /// Inherit this class to test an implementation (provided by ). + /// + public abstract class BufferTestSuite + { + protected BufferTestSuite(MemoryAllocator memoryAllocator) + { + this.MemoryAllocator = memoryAllocator; + } + + protected MemoryAllocator MemoryAllocator { get; } + + public struct CustomStruct : IEquatable + { + public long A; + + public byte B; + + public float C; + + public CustomStruct(long a, byte b, float c) + { + this.A = a; + this.B = b; + this.C = c; + } + + public bool Equals(CustomStruct other) + { + return this.A == other.A && this.B == other.B && this.C.Equals(other.C); + } + + public override bool Equals(object obj) + { + return obj is CustomStruct other && this.Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = this.A.GetHashCode(); + hashCode = (hashCode * 397) ^ this.B.GetHashCode(); + hashCode = (hashCode * 397) ^ this.C.GetHashCode(); + return hashCode; + } + } + } + + public static readonly TheoryData LenthValues = new TheoryData { 0, 1, 7, 1023, 1024 }; + + [Theory] + [MemberData(nameof(LenthValues))] + public void HasCorrectLength_byte(int desiredLength) + { + this.TestHasCorrectLength(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void HasCorrectLength_float(int desiredLength) + { + this.TestHasCorrectLength(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void HasCorrectLength_CustomStruct(int desiredLength) + { + this.TestHasCorrectLength(desiredLength); + } + + private void TestHasCorrectLength(int desiredLength) + where T : struct + { + using (IMemoryOwner buffer = this.MemoryAllocator.Allocate(desiredLength)) + { + Assert.Equal(desiredLength, buffer.GetSpan().Length); + } + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void CanAllocateCleanBuffer_byte(int desiredLength) + { + this.TestCanAllocateCleanBuffer(desiredLength, false); + this.TestCanAllocateCleanBuffer(desiredLength, true); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void CanAllocateCleanBuffer_double(int desiredLength) + { + this.TestCanAllocateCleanBuffer(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void CanAllocateCleanBuffer_CustomStruct(int desiredLength) + { + this.TestCanAllocateCleanBuffer(desiredLength); + } + + private IMemoryOwner Allocate(int desiredLength, AllocationOptions options, bool managedByteBuffer) + where T : struct + { + if (managedByteBuffer) + { + if (!(this.MemoryAllocator.AllocateManagedByteBuffer(desiredLength, options) is IMemoryOwner buffer)) + { + throw new InvalidOperationException("typeof(T) != typeof(byte)"); + } + + return buffer; + } + + return this.MemoryAllocator.Allocate(desiredLength, options); + } + + private void TestCanAllocateCleanBuffer(int desiredLength, bool testManagedByteBuffer = false) + where T : struct, IEquatable + { + ReadOnlySpan expected = new T[desiredLength]; + + for (int i = 0; i < 10; i++) + { + using (IMemoryOwner buffer = this.Allocate(desiredLength, AllocationOptions.Clean, testManagedByteBuffer)) + { + Assert.True(buffer.GetSpan().SequenceEqual(expected)); + } + } + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void SpanPropertyIsAlwaysTheSame_int(int desiredLength) + { + this.TestSpanPropertyIsAlwaysTheSame(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void SpanPropertyIsAlwaysTheSame_byte(int desiredLength) + { + this.TestSpanPropertyIsAlwaysTheSame(desiredLength, false); + this.TestSpanPropertyIsAlwaysTheSame(desiredLength, true); + } + + private void TestSpanPropertyIsAlwaysTheSame(int desiredLength, bool testManagedByteBuffer = false) + where T : struct + { + using (IMemoryOwner buffer = this.Allocate(desiredLength, AllocationOptions.None, testManagedByteBuffer)) + { + ref T a = ref MemoryMarshal.GetReference(buffer.GetSpan()); + ref T b = ref MemoryMarshal.GetReference(buffer.GetSpan()); + ref T c = ref MemoryMarshal.GetReference(buffer.GetSpan()); + + Assert.True(Unsafe.AreSame(ref a, ref b)); + Assert.True(Unsafe.AreSame(ref b, ref c)); + } + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void WriteAndReadElements_float(int desiredLength) + { + this.TestWriteAndReadElements(desiredLength, x => x * 1.2f); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void WriteAndReadElements_byte(int desiredLength) + { + this.TestWriteAndReadElements(desiredLength, x => (byte)(x + 1), false); + this.TestWriteAndReadElements(desiredLength, x => (byte)(x + 1), true); + } + + private void TestWriteAndReadElements(int desiredLength, Func getExpectedValue, bool testManagedByteBuffer = false) + where T : struct + { + using (IMemoryOwner buffer = this.Allocate(desiredLength, AllocationOptions.None, testManagedByteBuffer)) + { + T[] expectedVals = new T[buffer.Length()]; + + for (int i = 0; i < buffer.Length(); i++) + { + Span span = buffer.GetSpan(); + expectedVals[i] = getExpectedValue(i); + span[i] = expectedVals[i]; + } + + for (int i = 0; i < buffer.Length(); i++) + { + Span span = buffer.GetSpan(); + Assert.Equal(expectedVals[i], span[i]); + } + } + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void IndexingSpan_WhenOutOfRange_Throws_byte(int desiredLength) + { + this.TestIndexOutOfRangeShouldThrow(desiredLength, false); + this.TestIndexOutOfRangeShouldThrow(desiredLength, true); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void IndexingSpan_WhenOutOfRange_Throws_long(int desiredLength) + { + this.TestIndexOutOfRangeShouldThrow(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void IndexingSpan_WhenOutOfRange_Throws_CustomStruct(int desiredLength) + { + this.TestIndexOutOfRangeShouldThrow(desiredLength); + } + + private T TestIndexOutOfRangeShouldThrow(int desiredLength, bool testManagedByteBuffer = false) + where T : struct, IEquatable + { + var dummy = default(T); + + using (IMemoryOwner buffer = this.Allocate(desiredLength, AllocationOptions.None, testManagedByteBuffer)) + { + Assert.ThrowsAny( + () => + { + Span span = buffer.GetSpan(); + dummy = span[desiredLength]; + }); + + Assert.ThrowsAny( + () => + { + Span span = buffer.GetSpan(); + dummy = span[desiredLength + 1]; + }); + + Assert.ThrowsAny( + () => + { + Span span = buffer.GetSpan(); + dummy = span[desiredLength + 42]; + }); + } + + return dummy; + } + + [Theory] + [InlineData(1)] + [InlineData(7)] + [InlineData(1024)] + [InlineData(6666)] + public void ManagedByteBuffer_ArrayIsCorrect(int desiredLength) + { + using (IManagedByteBuffer buffer = this.MemoryAllocator.AllocateManagedByteBuffer(desiredLength)) + { + ref byte array0 = ref buffer.Array[0]; + ref byte span0 = ref buffer.GetReference(); + + Assert.True(Unsafe.AreSame(ref span0, ref array0)); + Assert.True(buffer.Array.Length >= buffer.GetSpan().Length); + } + } + + [Fact] + public void GetMemory_ReturnsValidMemory() + { + using (IMemoryOwner buffer = this.MemoryAllocator.Allocate(42)) + { + Span span0 = buffer.GetSpan(); + span0[10].A = 30; + Memory memory = buffer.Memory; + + Assert.Equal(42, memory.Length); + Span span1 = memory.Span; + + Assert.Equal(42, span1.Length); + Assert.Equal(30, span1[10].A); + } + } + + [Fact] + public unsafe void GetMemory_ResultIsPinnable() + { + using (IMemoryOwner buffer = this.MemoryAllocator.Allocate(42)) + { + Span span0 = buffer.GetSpan(); + span0[10] = 30; + + Memory memory = buffer.Memory; + + using (MemoryHandle h = memory.Pin()) + { + int* ptr = (int*)h.Pointer; + Assert.Equal(30, ptr[10]); + } + } + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs new file mode 100644 index 000000000..a6ddeb050 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.Memory.Tests +{ + public class SimpleGcMemoryManagerTests + { + public class BufferTests : BufferTestSuite + { + public BufferTests() + : base(new SimpleGcMemoryAllocator()) + { + } + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index 6869491e3..d23fb956a 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -14,6 +14,7 @@ false full SixLabors.Tests + true diff --git a/tests/SixLabors.Core.Tests/TestEnvironment.cs b/tests/SixLabors.Core.Tests/TestEnvironment.cs new file mode 100644 index 000000000..77be7bfe1 --- /dev/null +++ b/tests/SixLabors.Core.Tests/TestEnvironment.cs @@ -0,0 +1,12 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; + +namespace SixLabors.Tests +{ + internal class TestEnvironment + { + internal static bool Is64BitProcess => IntPtr.Size == 8; + } +} \ No newline at end of file From fb58b5f2ef7df55af53a9bd3cfb9df419646d510 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 26 Jul 2018 01:21:32 +0200 Subject: [PATCH 058/136] [SL.Core] move internals into a nested namespace --- src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs | 1 + src/SixLabors.Core/Memory/{ => Internals}/BasicArrayBuffer.cs | 2 +- src/SixLabors.Core/Memory/{ => Internals}/BasicByteBuffer.cs | 2 +- src/SixLabors.Core/Memory/{ => Internals}/ManagedBufferBase.cs | 2 +- src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) rename src/SixLabors.Core/Memory/{ => Internals}/BasicArrayBuffer.cs (98%) rename src/SixLabors.Core/Memory/{ => Internals}/BasicByteBuffer.cs (94%) rename src/SixLabors.Core/Memory/{ => Internals}/ManagedBufferBase.cs (97%) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs index b563d4a79..31096d3a9 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -4,6 +4,7 @@ using System; using System.Buffers; using System.Runtime.InteropServices; +using SixLabors.Memory.Internals; namespace SixLabors.Memory { diff --git a/src/SixLabors.Core/Memory/BasicArrayBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs similarity index 98% rename from src/SixLabors.Core/Memory/BasicArrayBuffer.cs rename to src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs index a3e2d02cc..5e9f17c4f 100644 --- a/src/SixLabors.Core/Memory/BasicArrayBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs @@ -4,7 +4,7 @@ using System; using System.Runtime.CompilerServices; -namespace SixLabors.Memory +namespace SixLabors.Memory.Internals { /// /// Wraps an array as an instance. diff --git a/src/SixLabors.Core/Memory/BasicByteBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs similarity index 94% rename from src/SixLabors.Core/Memory/BasicByteBuffer.cs rename to src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs index 5706ca87a..ee76c2ee3 100644 --- a/src/SixLabors.Core/Memory/BasicByteBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -namespace SixLabors.Memory +namespace SixLabors.Memory.Internals { /// /// Provides an based on . diff --git a/src/SixLabors.Core/Memory/ManagedBufferBase.cs b/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs similarity index 97% rename from src/SixLabors.Core/Memory/ManagedBufferBase.cs rename to src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs index 1d07b2dac..9dadcf5a2 100644 --- a/src/SixLabors.Core/Memory/ManagedBufferBase.cs +++ b/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs @@ -4,7 +4,7 @@ using System.Buffers; using System.Runtime.InteropServices; -namespace SixLabors.Memory +namespace SixLabors.Memory.Internals { /// /// Provides a base class for implementations by implementing pinning logic for adaption. diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs index 9b4c0fda0..cc1157979 100644 --- a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System.Buffers; +using SixLabors.Memory.Internals; namespace SixLabors.Memory { From 3450a4cfa07ca02ec579bfddb0f6113da7d47534 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 27 Jul 2018 01:08:08 +0200 Subject: [PATCH 059/136] [SL.Core] remove unused indexer --- .../Memory/Internals/BasicArrayBuffer.cs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs index 5e9f17c4f..bc12d7c2f 100644 --- a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs @@ -44,23 +44,6 @@ namespace SixLabors.Memory.Internals /// public int Length { get; } - /// - /// Returns a reference to specified element of the buffer. - /// - /// The index - /// The reference to the specified element - public ref T this[int index] - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - DebugGuard.MustBeLessThan(index, this.Length, nameof(index)); - - Span span = this.GetSpan(); - return ref span[index]; - } - } - /// public override Span GetSpan() => this.Array.AsSpan(0, this.Length); From 890d49daa026996fd21a469b41b53597131aecec Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Wed, 1 Aug 2018 18:18:32 +0100 Subject: [PATCH 060/136] [SL.Core] fix build version number generation --- appveyor.yml | 13 +----- build.cmd | 23 +---------- build.ps1 | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 34 deletions(-) create mode 100644 build.ps1 diff --git a/appveyor.yml b/appveyor.yml index 893839448..016a9ee37 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,19 +1,16 @@ version: 0.0.{build} image: Visual Studio 2017 -install: - - choco install gitversion.portable -pre -y before_build: - cmd: dotnet --version - - ps: c:\ProgramData\chocolatey\lib\gitversion.portable\tools\gitversion.exe /l console /output buildserver build_script: - cmd: build.cmd - cmd: tests\CodeCoverage\CodeCoverage.cmd after_build: - - cmd: appveyor PushArtifact "artifacts\SixLabors.Core.%GitVersion_NuGetVersion%.nupkg" + - cmd: appveyor PushArtifact "artifacts\SixLabors.Core.%APPVEYOR_BUILD_VERSION%.nupkg" deploy: - provider: NuGet @@ -24,14 +21,6 @@ deploy: artifact: /.*\.nupkg/ on: branch: master - - provider: NuGet - server: https://www.myget.org/F/sixlabors-unstable/api/v2/package - symbol_server: https://www.myget.org/F/sixlabors-unstable/symbols/api/v2/package - api_key: - secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4 - artifact: /.*\.nupkg/ - on: - branch: develop # prevent the double build when a branch has an active PR skip_branch_with_pr: true diff --git a/build.cmd b/build.cmd index e55aad06f..6372b4125 100644 --- a/build.cmd +++ b/build.cmd @@ -1,27 +1,6 @@ @echo Off -if not "%GitVersion_NuGetVersion%" == "" ( - dotnet restore /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( - dotnet restore -) - -ECHO Building nuget packages -if not "%GitVersion_NuGetVersion%" == "" ( - dotnet build -c Release /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( - dotnet build -c Release -) -if not "%errorlevel%"=="0" goto failure - -dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj - - -if not "%GitVersion_NuGetVersion%" == "" ( - dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( - dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build -) +PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '.\build.ps1'" if not "%errorlevel%"=="0" goto failure diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 000000000..fcd63aea2 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,110 @@ + +# lets calulat the correct version here +$fallbackVersion = "1.0.0"; +$version = '' + +$tagRegex = '^v?(\d+\.\d+\.\d+)(-([a-zA-Z]+)\.?(\d*))?$' + +# we are running on the build server +$isVersionTag = $env:APPVEYOR_REPO_TAG_NAME -match $tagRegex + + if($isVersionTag){ + + Write-Debug "Building commit tagged with a compatable version number" + + $version = $matches[1] + $postTag = $matches[3] + $count = $matches[4] + Write-Debug "version number: ${version} post tag: ${postTag} count: ${count}" + if("$postTag" -ne ""){ + $version = "${version}-${postTag}" + } + if("$count" -ne ""){ + # for consistancy with previous releases we pad the counter to only 4 places + $padded = $count.Trim().Trim('0').PadLeft(4,"0"); + Write-Debug "count '$count', padded '${padded}'" + + $version = "${version}${padded}" + } + }else { + + Write-Debug "Untagged" + $lastTag = (git tag --list --sort=-taggerdate) | Out-String + $list = $lastTag.Split("`n") + foreach ($tag in $list) { + + Write-Debug "testing ${tag}" + $tag = $tag.Trim(); + if($tag -match $tagRegex){ + Write-Debug "matched ${tag}" + $version = $matches[1]; + break; + } + } + + if("$version" -eq ""){ + $version = $fallbackVersion + Write-Debug "Failed to discover base version Fallback to '${version}'" + }else{ + + Write-Debug "Discovered base version from tags '${version}'" + } + + $buildNumber = $env:APPVEYOR_BUILD_NUMBER + + # build number replacement is padded to 6 places + $buildNumber = "$buildNumber".Trim().Trim('0').PadLeft(6,"0"); + if("$env:APPVEYOR_PULL_REQUEST_NUMBER" -ne ""){ + Write-Debug "building a PR" + + $prNumber = "$env:APPVEYOR_PULL_REQUEST_NUMBER".Trim().Trim('0').PadLeft(5,"0"); + # this is a PR + $version = "${version}-PullRequest${prNumber}${buildNumber}"; + }else{ + Write-Debug "building a branch commit" + + # this is a general branch commit + $branch = $env:APPVEYOR_REPO_BRANCH + + if("$branch" -eq ""){ + $branch = ((git rev-parse --abbrev-ref HEAD) | Out-String).Trim() + + if("$branch" -eq ""){ + $branch = "unknown" + } + } + + $branch = $branch.Replace("/","-").ToLower() + + if($branch.ToLower() -eq "master"){ + $branch = "dev" + } + + $version = "${version}-${branch}${buildNumber}"; + } + } + +if("$env:APPVEYOR_API_URL" -ne ""){ + # update appveyor build number for this build + Invoke-RestMethod -Method "PUT" ` + -Uri "${env:APPVEYOR_API_URL}api/build" ` + -Body "{version:'${version}'}" ` + -ContentType "application/json" +} + +Write-Host "Building version '${version}'" +dotnet restore /p:packageversion=$version + +Write-Host "Building projects" +dotnet build -c Release /p:packageversion=$version + +if ($LASTEXITCODE ){ Exit $LASTEXITCODE } + +if ( $env:CI -ne "True") { + dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj --no-build -c Release +} +if ($LASTEXITCODE ){ Exit $LASTEXITCODE } + +Write-Host "Packaging projects" +dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=$version +if ($LASTEXITCODE ){ Exit $LASTEXITCODE } \ No newline at end of file From 87c124eee4e700182444980981f9adc187e95274 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:31:08 -0700 Subject: [PATCH 061/136] [SL.Core] Cross target .NETCOREAPP2.1 --- src/SixLabors.Core/MathF.cs | 2 +- src/SixLabors.Core/SixLabors.Core.csproj | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index 3079c9100..1329dbdae 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -3,7 +3,7 @@ using System.Runtime.CompilerServices; -#if NETCOREAPP2_0 +#if NETCOREAPP2_0 || NETCOREAPP2_1 [assembly: TypeForwardedTo(typeof(System.MathF))] #else namespace System diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index bc37cd2e2..65955529d 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -5,7 +5,7 @@ $(packageversion) 0.1.0-alpha2 Six Labors - netstandard1.1;netcoreapp2.0; + netstandard1.1;netcoreapp2.0;netcoreapp2.1; true true SixLabors.Core @@ -39,13 +39,18 @@ - - All - + + All + + + + + + - + From 480b35a636a17b3963f778a34ad9ccf2e479f209 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:31:18 -0700 Subject: [PATCH 062/136] [SL.Core] Use pattern matching --- src/SixLabors.Core/Primitives/Point.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index ab12e28ff..f302b8218 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -267,7 +267,7 @@ namespace SixLabors.Primitives } /// - public override bool Equals(object obj) => obj is Point && this.Equals((Point)obj); + public override bool Equals(object obj) => obj is Point other && this.Equals(other); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] From d4ac432d9fe6ac196b5514dff7ee6d61af5fcb2f Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:31:37 -0700 Subject: [PATCH 063/136] [SL.Core] Remove unused Gaurd overloads --- src/SixLabors.Core/Helpers/Guard.cs | 32 ++++------------ .../Helpers/GuardTests.cs | 37 ------------------- 2 files changed, 7 insertions(+), 62 deletions(-) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 41db42fc1..069c4eb05 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -20,19 +20,13 @@ namespace SixLabors /// /// The target object, which cannot be null. /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. /// is null /// The type of the object to verify - public static void NotNull(T target, string parameterName, string message = "") + public static void NotNull(T target, string parameterName) where T : class { - if (target == null) + if (target is null) { - if (!string.IsNullOrWhiteSpace(message)) - { - throw new ArgumentNullException(parameterName, message); - } - throw new ArgumentNullException(parameterName); } } @@ -44,20 +38,14 @@ namespace SixLabors /// /// The target string, which should be checked against being null or empty. /// Name of the parameter. - /// The error message, if any to add to the exception. /// is null. /// is empty or contains only blanks. - public static void NotNullOrEmpty(string target, string parameterName, string message = "") + public static void NotNullOrEmpty(string target, string parameterName) { - NotNull(target, parameterName, message); + NotNull(target, parameterName); if (string.IsNullOrWhiteSpace(target)) { - if (!string.IsNullOrWhiteSpace(message)) - { - throw new ArgumentException(message, parameterName); - } - throw new ArgumentException("Value cannot be null, empty, or cannot contain only whitespace.", parameterName); } } @@ -68,20 +56,14 @@ namespace SixLabors /// The type of objects in the /// The target enumeration, which should be checked against being null or empty. /// Name of the parameter. - /// The error message, if any to add to the exception. /// is null. /// is empty. - public static void NotNullOrEmpty(IEnumerable target, string parameterName, string message = "") + public static void NotNullOrEmpty(IEnumerable target, string parameterName) { - NotNull(target, parameterName, message); + NotNull(target, parameterName); if (!target.Any()) { - if (!string.IsNullOrWhiteSpace(message)) - { - throw new ArgumentException(message, parameterName); - } - throw new ArgumentException("Value cannot be empty.", parameterName); } } @@ -247,4 +229,4 @@ namespace SixLabors } } } -} +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index ed2e0b5c7..b3f1b96a0 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using Xunit; namespace SixLabors.Helpers.Tests @@ -25,18 +24,6 @@ namespace SixLabors.Helpers.Tests }); } - [Fact] - public void NotNull_TargetNullWithMessage_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNull((object)null, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Fact] public void NotNullOrEmpty_TargetNotNullOrEmpty_ThrowsNoException() { @@ -73,18 +60,6 @@ namespace SixLabors.Helpers.Tests Assert.True(exception.Message.Contains("Value cannot be null, empty, or cannot contain only whitespace.")); } - [Fact] - public void NotNullOrEmpty_TargetEmptyWithMessage_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNullOrEmpty(string.Empty, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Fact] public void NotNullOrEmptyIEnumerable_TargetNotNullOrEmpty_ThrowsNoException() { @@ -112,18 +87,6 @@ namespace SixLabors.Helpers.Tests Assert.True(exception.Message.Contains("Value cannot be empty.")); } - [Fact] - public void NotNullOrEmptyIEnumerable_TargetEmptyWithMessage_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNullOrEmpty(new string[] { }, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { From 14780a70c40c16115a51f7b3e59dfedd02d81ba6 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:32:58 -0700 Subject: [PATCH 064/136] [SL.Core] Seal ManagedByteBuffer --- .../Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs index 31096d3a9..0b0d6c4d4 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -51,7 +51,7 @@ namespace SixLabors.Memory /// protected override void Dispose(bool disposing) { - if (!disposing || this.Data == null || this.sourcePoolReference == null) + if (!disposing || this.Data is null || this.sourcePoolReference is null) { return; } @@ -71,7 +71,7 @@ namespace SixLabors.Memory /// /// The implementation of . /// - private class ManagedByteBuffer : Buffer, IManagedByteBuffer + private sealed class ManagedByteBuffer : Buffer, IManagedByteBuffer { public ManagedByteBuffer(byte[] data, int length, ArrayPool sourcePool) : base(data, length, sourcePool) From 9f2ae5eaf9477524aeae34c89a80432616f40558 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:43:50 -0700 Subject: [PATCH 065/136] [SL.Core] Extend HashHelper.Combine to accept 2, 3, or 4 args --- src/SixLabors.Core/Helpers/HashHelpers.cs | 36 ++++++++++++++++++++- src/SixLabors.Core/Primitives/Rectangle.cs | 11 ++++--- src/SixLabors.Core/Primitives/RectangleF.cs | 11 ++++--- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index 40a2b3f96..a453a53de 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -13,7 +13,7 @@ namespace SixLabors ///
/// Hash code one /// Hash code two - /// Returns a hash code for the two specified has codes. + /// Returns a hash code for the provided hash codes. public static int Combine(int h1, int h2) { unchecked @@ -24,5 +24,39 @@ namespace SixLabors return ((int)rol5 + h1) ^ h2; } } + + /// + /// Combines the three specified hash codes. + /// + /// The first + /// Hash code two + /// Hash code three + /// Returns a hash code for the provided hash codes. + public static int Combine(int h1, int h2, int h3) + { + int hash = Combine(h1, h2); + + hash = Combine(hash, h3); + + return hash; + } + + /// + /// Combines the four specified hash codes. + /// + /// The first + /// Hash code two + /// Hash code three + /// Hash code four + /// Returns a hash code for the provided hash codes. + public static int Combine(int h1, int h2, int h3, int h4) + { + int hash = Combine(h1, h2); + + hash = Combine(hash, h3); + hash = Combine(hash, h4); + + return hash; + } } } diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 27cba5d15..b68732c40 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -460,11 +460,12 @@ namespace SixLabors.Primitives private int GetHashCode(Rectangle rectangle) { - int hashCode = rectangle.X.GetHashCode(); - hashCode = HashHelpers.Combine(hashCode, rectangle.Y.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, rectangle.Width.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); - return hashCode; + return HashHelpers.Combine( + rectangle.X.GetHashCode(), + rectangle.Y.GetHashCode(), + rectangle.Width.GetHashCode(), + rectangle.Height.GetHashCode() + ); } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index d5ee6a61b..a33d227e0 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -393,11 +393,12 @@ namespace SixLabors.Primitives private int GetHashCode(RectangleF rectangle) { - int hashCode = rectangle.X.GetHashCode(); - hashCode = HashHelpers.Combine(hashCode, rectangle.Y.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, rectangle.Width.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); - return hashCode; + return HashHelpers.Combine( + rectangle.X.GetHashCode(), + rectangle.Y.GetHashCode(), + rectangle.Width.GetHashCode(), + rectangle.Height.GetHashCode() + ); } } } \ No newline at end of file From 1c29c7fc323c65440ce47a021fff09b1204a5f25 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:46:21 -0700 Subject: [PATCH 066/136] [SL.Core] Update Moq & xunit --- tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index d23fb956a..da61cd0b8 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -28,10 +28,10 @@ - - - - + + + + From 7b54e5602f29c4ed0b824b1c191186e7fbfd9a23 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:46:30 -0700 Subject: [PATCH 067/136] [SL.Core] Update System.Numerics.Vectors --- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 65955529d..8215664dc 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -52,6 +52,6 @@ - + \ No newline at end of file From 187d0a16c0e100984f532344061c4113f83c6407 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:53:44 -0700 Subject: [PATCH 068/136] [SL.Core] Remove unused Gaurd.IsTrue and Gaurd.IsFalse --- src/SixLabors.Core/Helpers/Guard.cs | 42 ------------------- .../Helpers/GuardTests.cs | 36 ---------------- 2 files changed, 78 deletions(-) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 069c4eb05..0e4ef336d 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -169,48 +169,6 @@ namespace SixLabors } } - /// - /// Verifies, that the method parameter with specified target value is true - /// and throws an exception if it is found to be so. - /// - /// - /// The target value, which cannot be false. - /// - /// - /// The name of the parameter that is to be checked. - /// - /// - /// The error message, if any to add to the exception. - /// - /// - /// is false - /// - public static void IsTrue(bool value, string parameterName, string message) - { - if (!value) - { - throw new ArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the method parameter with specified target value is false - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be true. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is true - /// - public static void IsFalse(bool value, string parameterName, string message) - { - if (value) - { - throw new ArgumentException(message, parameterName); - } - } - /// /// Verifies, that the `target` span has the length of 'minLength', or longer. /// diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index b3f1b96a0..fee12db17 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -190,42 +190,6 @@ namespace SixLabors.Helpers.Tests Assert.True(exception.Message.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.")); } - [Fact] - public void IsTrue_IsTrue_ThrowsNoException() - { - Guard.IsTrue(true, "myParamName", "myTestMessage"); - } - - [Fact] - public void IsTrue_IsFalse_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.IsTrue(false, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - - [Fact] - public void IsFalse_IsFalse_ThrowsNoException() - { - Guard.IsFalse(false, "myParamName", "myTestMessage"); - } - - [Fact] - public void IsFalse_IsTrue_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.IsFalse(true, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Theory] [InlineData(2, 1)] [InlineData(2, 2)] From 1729bd662bdabc5c1b722fbfe49bc54e1f236bf0 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:54:29 -0700 Subject: [PATCH 069/136] [SL.Core] Remove private implementations of GetHashCode (and it's call overhead) --- src/SixLabors.Core/Primitives/Point.cs | 6 ++- src/SixLabors.Core/Primitives/PointF.cs | 16 ++------ src/SixLabors.Core/Primitives/Rectangle.cs | 19 ++++------ src/SixLabors.Core/Primitives/RectangleF.cs | 41 +++++++-------------- src/SixLabors.Core/Primitives/SizeF.cs | 4 +- 5 files changed, 30 insertions(+), 56 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index f302b8218..e42e2bf69 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -258,7 +258,10 @@ namespace SixLabors.Primitives public void Offset(Point point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() + { + return HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); + } /// public override string ToString() @@ -277,6 +280,5 @@ namespace SixLabors.Primitives private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); - private int GetHashCode(Point point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 7c0431556..699cec8c6 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -267,7 +267,10 @@ namespace SixLabors.Primitives public void Offset(PointF point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() + { + return HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); + } /// public override string ToString() @@ -281,16 +284,5 @@ namespace SixLabors.Primitives /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(PointF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y); - - /// - /// Returns the hash code for this instance. - /// - /// - /// The instance of to return the hash code for. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - private int GetHashCode(PointF point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index b68732c40..5b4ac10a7 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -443,7 +443,14 @@ namespace SixLabors.Primitives } /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() + { + return HashHelpers.Combine( + this.X.GetHashCode(), + this.Y.GetHashCode(), + this.Width.GetHashCode(), + this.Height.GetHashCode()); + } /// public override string ToString() @@ -457,15 +464,5 @@ namespace SixLabors.Primitives /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(Rectangle other) => this.X == other.X && this.Y == other.Y && this.Width == other.Width && this.Height == other.Height; - - private int GetHashCode(Rectangle rectangle) - { - return HashHelpers.Combine( - rectangle.X.GetHashCode(), - rectangle.Y.GetHashCode(), - rectangle.Width.GetHashCode(), - rectangle.Height.GetHashCode() - ); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index a33d227e0..a7f46db0a 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -120,10 +120,7 @@ namespace SixLabors.Primitives public float Top { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.Y; - } + get => this.Y; } /// @@ -132,10 +129,7 @@ namespace SixLabors.Primitives public float Right { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.X + this.Width; - } + get => this.X + this.Width; } /// @@ -144,10 +138,7 @@ namespace SixLabors.Primitives public float Bottom { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.Y + this.Height; - } + get => this.Y + this.Height; } /// @@ -156,10 +147,7 @@ namespace SixLabors.Primitives public float Left { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.X; - } + get => this.X; } /// @@ -376,7 +364,14 @@ namespace SixLabors.Primitives } /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() + { + return HashHelpers.Combine( + this.X.GetHashCode(), + this.Y.GetHashCode(), + this.Width.GetHashCode(), + this.Height.GetHashCode()); + } /// public override string ToString() @@ -385,20 +380,10 @@ namespace SixLabors.Primitives } /// - public override bool Equals(object obj) => obj is RectangleF && this.Equals((RectangleF)obj); + public override bool Equals(object obj) => obj is RectangleF other && this.Equals(other); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(RectangleF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y) && this.Width.Equals(other.Width) && this.Height.Equals(other.Height); - - private int GetHashCode(RectangleF rectangle) - { - return HashHelpers.Combine( - rectangle.X.GetHashCode(), - rectangle.Y.GetHashCode(), - rectangle.Width.GetHashCode(), - rectangle.Height.GetHashCode() - ); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index 13c6552ac..365efdc2a 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -200,7 +200,7 @@ namespace SixLabors.Primitives /// public override int GetHashCode() { - return this.GetHashCode(this); + return HashHelpers.Combine(this.Width.GetHashCode(), this.Height.GetHashCode()); } /// @@ -224,7 +224,5 @@ namespace SixLabors.Primitives /// Product of type SizeF. private static SizeF Multiply(SizeF size, float multiplier) => new SizeF(size.Width * multiplier, size.Height * multiplier); - - private int GetHashCode(SizeF size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); } } \ No newline at end of file From 43693a96f5054aec5d798b177ebdb38ff0010ede Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:55:52 -0700 Subject: [PATCH 070/136] [SL.Core] Use expressions --- src/SixLabors.Core/Primitives/Point.cs | 6 +----- src/SixLabors.Core/Primitives/PointF.cs | 5 +---- src/SixLabors.Core/Primitives/Size.cs | 5 +---- src/SixLabors.Core/Primitives/SizeF.cs | 5 +---- 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index e42e2bf69..8f9db05b8 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -264,10 +264,7 @@ namespace SixLabors.Primitives } /// - public override string ToString() - { - return $"Point [ X={this.X}, Y={this.Y} ]"; - } + public override string ToString() => $"Point [ X={this.X}, Y={this.Y} ]"; /// public override bool Equals(object obj) => obj is Point other && this.Equals(other); @@ -279,6 +276,5 @@ namespace SixLabors.Primitives private static short HighInt16(int n) => unchecked((short)((n >> 16) & 0xffff)); private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); - } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 699cec8c6..c163da7cd 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -273,10 +273,7 @@ namespace SixLabors.Primitives } /// - public override string ToString() - { - return $"PointF [ X={this.X}, Y={this.Y} ]"; - } + public override string ToString() => $"PointF [ X={this.X}, Y={this.Y} ]"; /// public override bool Equals(object obj) => obj is PointF && this.Equals((PointF)obj); diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 57884cf5d..d5ff95ad5 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -255,10 +255,7 @@ namespace SixLabors.Primitives public override int GetHashCode() => this.GetHashCode(this); /// - public override string ToString() - { - return $"Size [ Width={this.Width}, Height={this.Height} ]"; - } + public override string ToString() => $"Size [ Width={this.Width}, Height={this.Height} ]"; /// public override bool Equals(object obj) => obj is Size && this.Equals((Size)obj); diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index 365efdc2a..8dbdd7424 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -204,10 +204,7 @@ namespace SixLabors.Primitives } /// - public override string ToString() - { - return $"SizeF [ Width={this.Width}, Height={this.Height} ]"; - } + public override string ToString() => $"SizeF [ Width={this.Width}, Height={this.Height} ]"; /// public override bool Equals(object obj) => obj is SizeF && this.Equals((SizeF)obj); From 177e1e2373d3e62026a6203554fa3a1a036714d9 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 12:00:01 -0700 Subject: [PATCH 071/136] [SL.Core] Update tests to target netcoreapp2.1 --- tests/CodeCoverage/CodeCoverage.cmd | 2 +- tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd index d5318bf7a..347e0338c 100644 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -10,7 +10,7 @@ cd .. dotnet restore SixLabors.Core.sln dotnet build SixLabors.Core.sln --no-incremental -c release /p:codecov=true -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c release" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c release" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp2.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" if %errorlevel% neq 0 exit /b %errorlevel% diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index da61cd0b8..64545d082 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -2,7 +2,7 @@ 0.0.0 - netcoreapp1.1;netcoreapp2.0; + netcoreapp1.1;netcoreapp2.1; SixLabors.Core.Tests SixLabors.Shapes.Tests true @@ -38,8 +38,4 @@ - - - - From a543ce637161350abd2e3e9c8a602814be1883c9 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 12:02:47 -0700 Subject: [PATCH 072/136] [SL.Core] Remove additional unused Guard methods --- src/SixLabors.Core/Helpers/Guard.cs | 58 +------------- .../Helpers/GuardTests.cs | 79 ------------------- 2 files changed, 2 insertions(+), 135 deletions(-) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 0e4ef336d..b50cd4ab0 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -14,60 +14,6 @@ namespace SixLabors [DebuggerStepThrough] internal static class Guard { - /// - /// Verifies, that the method parameter with specified object value is not null - /// and throws an exception if it is found to be so. - /// - /// The target object, which cannot be null. - /// The name of the parameter that is to be checked. - /// is null - /// The type of the object to verify - public static void NotNull(T target, string parameterName) - where T : class - { - if (target is null) - { - throw new ArgumentNullException(parameterName); - } - } - - /// - /// Verifies, that the string method parameter with specified object value and message - /// is not null, not empty and does not contain only blanks and throws an exception - /// if the object is null. - /// - /// The target string, which should be checked against being null or empty. - /// Name of the parameter. - /// is null. - /// is empty or contains only blanks. - public static void NotNullOrEmpty(string target, string parameterName) - { - NotNull(target, parameterName); - - if (string.IsNullOrWhiteSpace(target)) - { - throw new ArgumentException("Value cannot be null, empty, or cannot contain only whitespace.", parameterName); - } - } - - /// - /// Verifies, that the enumeration is not null and not empty. - /// - /// The type of objects in the - /// The target enumeration, which should be checked against being null or empty. - /// Name of the parameter. - /// is null. - /// is empty. - public static void NotNullOrEmpty(IEnumerable target, string parameterName) - { - NotNull(target, parameterName); - - if (!target.Any()) - { - throw new ArgumentException("Value cannot be empty.", parameterName); - } - } - /// /// Verifies that the specified value is less than a maximum value /// and throws an exception if it is not. @@ -80,7 +26,7 @@ namespace SixLabors /// is greater than the maximum value. /// public static void MustBeLessThan(TValue value, TValue max, string parameterName) - where TValue : IComparable + where TValue : IComparable { if (value.CompareTo(max) >= 0) { @@ -100,7 +46,7 @@ namespace SixLabors /// is greater than the maximum value. /// public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) - where TValue : IComparable + where TValue : IComparable { if (value.CompareTo(max) > 0) { diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index fee12db17..f95e46e35 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -2,91 +2,12 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Collections.Generic; using Xunit; namespace SixLabors.Helpers.Tests { public class GuardTests { - [Fact] - public void NotNull_TargetNotNull_ThrowsNoException() - { - Guard.NotNull("test", "myParamName"); - } - - [Fact] - public void NotNull_TargetNull_ThrowsException() - { - Assert.Throws(() => - { - Guard.NotNull((object)null, "myParamName"); - }); - } - - [Fact] - public void NotNullOrEmpty_TargetNotNullOrEmpty_ThrowsNoException() - { - Guard.NotNullOrEmpty("test", "myParamName"); - } - - [Fact] - public void NotNullOrEmpty_TargetNull_ThrowsException() - { - Assert.Throws(() => - { - Guard.NotNullOrEmpty(null, "myParamName"); - }); - } - - [Fact] - public void NotNullOrEmpty_TargetWhitespace_ThrowsException() - { - Assert.Throws(() => - { - Guard.NotNullOrEmpty("\n\n", "myParamName"); - }); - } - - [Fact] - public void NotNullOrEmpty_TargetEmpty_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNullOrEmpty(string.Empty, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("Value cannot be null, empty, or cannot contain only whitespace.")); - } - - [Fact] - public void NotNullOrEmptyIEnumerable_TargetNotNullOrEmpty_ThrowsNoException() - { - Guard.NotNullOrEmpty(new string[] { "test" }, "myParamName"); - } - - [Fact] - public void NotNullOrEmptyIEnumerable_TargetNull_ThrowsException() - { - Assert.Throws(() => - { - Guard.NotNullOrEmpty((IEnumerable)null, "myParamName"); - }); - } - - [Fact] - public void NotNullOrEmptyIEnumerable_TargetEmpty_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNullOrEmpty(new string[] { }, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("Value cannot be empty.")); - } - [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { From ea9c9e9c8e29b1dec7c3996657046ab7233454d4 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 12:03:38 -0700 Subject: [PATCH 073/136] [SL.Core] Remove unused DebugGuard methods --- src/SixLabors.Core/Helpers/DebugGuard.cs | 47 +----------------------- 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index f41d7eacf..210b13c99 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -24,7 +24,7 @@ namespace SixLabors public static void NotNull(T target, string parameterName) where T : class { - if (target == null) + if (target is null) { throw new ArgumentNullException(parameterName); } @@ -115,50 +115,7 @@ namespace SixLabors throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); } } - - /// - /// Verifies, that the method parameter with specified target value is true - /// and throws an exception if it is found to be so. - /// - /// - /// The target value, which cannot be false. - /// - /// - /// The name of the parameter that is to be checked. - /// - /// - /// The error message, if any to add to the exception. - /// - /// - /// is false - /// - [Conditional("DEBUG")] - public static void IsTrue(bool target, string parameterName, string message) - { - if (!target) - { - throw new ArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the method parameter with specified target value is false - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be true. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void IsFalse(bool target, string parameterName, string message) - { - if (target) - { - throw new ArgumentException(message, parameterName); - } - } + /// /// Verifies, that the `target` array has declared the length or longer. From fb46544e0a9dd3a63c1b853a1aaef0af7f23d65c Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 12:12:43 -0700 Subject: [PATCH 074/136] [SL.Core] Remove whitespace --- src/SixLabors.Core/Helpers/DebugGuard.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index 210b13c99..f1fc1c64c 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -115,7 +115,6 @@ namespace SixLabors throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); } } - /// /// Verifies, that the `target` array has declared the length or longer. From 9b97df58c4385858ad86d88660a1778c6214df62 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 14:45:41 -0700 Subject: [PATCH 075/136] [SL.Core] Remove unused DebugGaurd tests --- .../Helpers/DebugGuardTests.cs | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 843b74ded..f3db76ef5 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -5,7 +5,6 @@ #define DEBUG using System; -using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; @@ -123,42 +122,6 @@ namespace SixLabors.Helpers.Tests Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); } - [Fact] - public void IsTrue_IsTrue_ThrowsNoException() - { - DebugGuard.IsTrue(true, "myParamName", "myTestMessage"); - } - - [Fact] - public void IsTrue_IsFalse_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.IsTrue(false, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - - [Fact] - public void IsFalse_IsFalse_ThrowsNoException() - { - DebugGuard.IsFalse(false, "myParamName", "myTestMessage"); - } - - [Fact] - public void IsFalse_IsTrue_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.IsFalse(true, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Theory] [InlineData(new int[] { 1, 2 }, 1)] [InlineData(new int[] { 1, 2 }, 2)] From 2f61cafab168ac79216847fe6fa001581b172fce Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 07:58:38 -0700 Subject: [PATCH 076/136] [SL.Core] Cleanup AssemblyInfo add SUPPORT_MATHF symbol --- src/SixLabors.Core/MathF.cs | 2 +- src/SixLabors.Core/Properties/AssemblyInfo.cs | 29 ------------------- src/SixLabors.Core/SixLabors.Core.csproj | 29 ++++++++----------- 3 files changed, 13 insertions(+), 47 deletions(-) diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index 1329dbdae..b0d760ade 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -3,7 +3,7 @@ using System.Runtime.CompilerServices; -#if NETCOREAPP2_0 || NETCOREAPP2_1 +#if SUPPORTS_MATHF [assembly: TypeForwardedTo(typeof(System.MathF))] #else namespace System diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 96a40f6f6..5402a1af1 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -1,37 +1,8 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Reflection; -using System.Resources; using System.Runtime.CompilerServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("SixLabors.Core")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Six Labors")] -[assembly: AssemblyProduct("SixLabors.Core")] -[assembly: AssemblyCopyright("Copyright (c) Six Labors and contributors.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: NeutralResourcesLanguage("en")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] -[assembly: AssemblyInformationalVersion("0.1.0-alpha02")] - // Ensure the internals can be tested. [assembly: InternalsVisibleTo("SixLabors.Core.Tests")] diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 8215664dc..b03eac761 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -16,16 +16,7 @@ http://www.apache.org/licenses/LICENSE-2.0 git https://github.com/SixLabors/Core - false - false - false - false - false - false - false - false - false - false + Copyright (c) Six Labors and contributors. full SixLabors @@ -34,24 +25,28 @@ ..\SixLabors.ruleset + + $(DefineConstants);SUPPORTS_MATHF + + - - - - - + All + + + + - + - + \ No newline at end of file From d073bf833cb40903d8daaf292417a3219e5b797c Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 07:59:53 -0700 Subject: [PATCH 077/136] [SL.Core] Add HashHelpersTests --- src/SixLabors.Core/Helpers/HashHelpers.cs | 2 +- .../Helpers/HashHelpersTests.cs | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index a453a53de..b1e7ce660 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -59,4 +59,4 @@ namespace SixLabors return hash; } } -} +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs b/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs new file mode 100644 index 000000000..7091038ad --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs @@ -0,0 +1,28 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using Xunit; + +namespace SixLabors.Tests.Helpers +{ + public class HashHelpersTests + { + [Fact] + public void CanCombineTwoValues() + { + Assert.Equal(35, HashHelpers.Combine(1, 2)); + } + + [Fact] + public void CanCombineThreeValues() + { + Assert.Equal(1152, HashHelpers.Combine(1, 2, 3)); + } + + [Fact] + public void CanCombineFourValues() + { + Assert.Equal(38020, HashHelpers.Combine(1, 2, 3, 4)); + } + } +} \ No newline at end of file From e154df465445beccf70838320f6b3f351619bbb8 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 08:00:37 -0700 Subject: [PATCH 078/136] [SL.Core] Add test to ensure PointF has the same layout as Vector2 --- tests/SixLabors.Core.Tests/Primitives/PointFTests.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index 6fdf1bbc3..cdd7410d5 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -5,12 +5,24 @@ using System; using System.Globalization; using System.Numerics; using System.Reflection; +using System.Runtime.CompilerServices; using Xunit; namespace SixLabors.Primitives.Tests { public class PointFTests { + [Fact] + public void CanReinterpretCastFromVector2() + { + var vector = new Vector2(1, 2); + + PointF point = Unsafe.As(ref vector); + + Assert.Equal(vector.X, point.X); + Assert.Equal(vector.Y, point.Y); + } + [Fact] public void DefaultConstructorTest() { From 383bd7b147a640c72a4dcdef7a80deec031c7734 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 08:06:05 -0700 Subject: [PATCH 079/136] [SL.Core] Format Rectangle --- src/SixLabors.Core/Primitives/Rectangle.cs | 23 ++++++---------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 5b4ac10a7..2c9eec269 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -120,10 +120,7 @@ namespace SixLabors.Primitives public int Top { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.Y; - } + get => this.Y; } /// @@ -132,10 +129,7 @@ namespace SixLabors.Primitives public int Right { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return unchecked(this.X + this.Width); - } + get => unchecked(this.X + this.Width); } /// @@ -144,10 +138,8 @@ namespace SixLabors.Primitives public int Bottom { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return unchecked(this.Y + this.Height); - } + get => unchecked(this.Y + this.Height); + } /// @@ -156,10 +148,7 @@ namespace SixLabors.Primitives public int Left { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.X; - } + get => this.X; } /// @@ -459,7 +448,7 @@ namespace SixLabors.Primitives } /// - public override bool Equals(object obj) => obj is Rectangle && this.Equals((Rectangle)obj); + public override bool Equals(object obj) => obj is Rectangle other && this.Equals(other); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] From 302bb885357d42b99318305a2a4da24492c2a174 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 08:11:59 -0700 Subject: [PATCH 080/136] [SL.Core] Remove whitespace --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 2 +- tests/SixLabors.Core.Tests/Helpers/MathFTests.cs | 1 + .../SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 5402a1af1..92c683b13 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -12,4 +12,4 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("SixLabors.ImageSharp")] [assembly: InternalsVisibleTo("SixLabors.ImageSharp.Drawing")] [assembly: InternalsVisibleTo("SixLabors.Shapes")] -[assembly: InternalsVisibleTo("SixLabors.Shapes.Text")] +[assembly: InternalsVisibleTo("SixLabors.Shapes.Text")] \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs index 477259983..1d9ea1523 100644 --- a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs @@ -6,6 +6,7 @@ using Xunit; namespace SixLabors.Tests.Helpers { + public class MathFTests { [Fact] diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs index 0068fce91..6e7efebb8 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs @@ -80,7 +80,6 @@ namespace SixLabors.Memory.Tests Assert.True(this.CheckIsRentingPooledBuffer(size)); } - [Theory] [InlineData(128 * 1024 * 1024)] [InlineData(MaxPooledBufferSizeInBytes + 1)] From 6c3502976e12a4280809551307fdd9dcb4dce2be Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:08:56 -0700 Subject: [PATCH 081/136] [SL.Core] Remove aggressive inlining hint from trival accessors --- src/SixLabors.Core/Primitives/Rectangle.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 2c9eec269..61dc79916 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -117,11 +117,7 @@ namespace SixLabors.Primitives /// /// Gets the y-coordinate of the top edge of this . /// - public int Top - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.Y; - } + public int Top => this.Y; /// /// Gets the x-coordinate of the right edge of this . @@ -145,11 +141,7 @@ namespace SixLabors.Primitives /// /// Gets the x-coordinate of the left edge of this . /// - public int Left - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.X; - } + public int Left => this.X; /// /// Creates a with the coordinates of the specified . From 81e2185583d4ec72cd6ca7f69a74bb3f05defa03 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:09:16 -0700 Subject: [PATCH 082/136] [SL.Core] Format Point --- src/SixLabors.Core/Primitives/Point.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 8f9db05b8..112d8fea2 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -258,10 +258,7 @@ namespace SixLabors.Primitives public void Offset(Point point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() - { - return HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); - } + public override int GetHashCode() => HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); /// public override string ToString() => $"Point [ X={this.X}, Y={this.Y} ]"; From d32149ae7bed158b10a4f1c327adfb9fdf2e7f47 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:09:25 -0700 Subject: [PATCH 083/136] [SL.Core] Format HashHelpers --- src/SixLabors.Core/Helpers/HashHelpers.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index b1e7ce660..934384238 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -1,10 +1,12 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; + namespace SixLabors { /// - /// Lifted from coreFX repo + /// Provides a set of helpers for combining object hashes. /// internal static class HashHelpers { @@ -16,6 +18,8 @@ namespace SixLabors /// Returns a hash code for the provided hash codes. public static int Combine(int h1, int h2) { + // Lifted from coreFX repo + unchecked { // RyuJIT optimizes this to use the ROL instruction @@ -54,9 +58,8 @@ namespace SixLabors int hash = Combine(h1, h2); hash = Combine(hash, h3); - hash = Combine(hash, h4); - return hash; + return Combine(hash, h4); } } } \ No newline at end of file From c31eb7e601b13743862e6f918690551344d6b7ca Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:10:07 -0700 Subject: [PATCH 084/136] [SL.Core] Use Assert.Contains when checking for substrings --- tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 4 ++-- tests/SixLabors.Core.Tests/Helpers/GuardTests.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index f3db76ef5..68416b47d 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -99,7 +99,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than {min}.")); + Assert.Contains($"Value must be greater than {min}.", exception.Message); } [Theory] @@ -119,7 +119,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); + Assert.Contains($"Value must be greater than or equal to 2.", exception.Message); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index f95e46e35..ecffd79da 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -65,7 +65,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than {min}.")); + Assert.Contains($"Value must be greater than {min}.", exception.Message); } [Theory] @@ -108,7 +108,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.")); + Assert.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.", exception.Message); } [Theory] @@ -128,7 +128,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"The size must be at least 3.")); + Assert.Contains("The size must be at least 3.", exception.Message); } } } From aada342517a5c9952414d1953c6a1c74ac21567c Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:15:41 -0700 Subject: [PATCH 085/136] [SL.Core] Remove AggressiveInlining hint from trival accessors --- src/SixLabors.Core/Primitives/RectangleF.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index a7f46db0a..1a275b623 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -117,11 +117,7 @@ namespace SixLabors.Primitives /// /// Gets the y-coordinate of the top edge of this . /// - public float Top - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.Y; - } + public float Top => this.Y; /// /// Gets the x-coordinate of the right edge of this . @@ -144,11 +140,7 @@ namespace SixLabors.Primitives /// /// Gets the x-coordinate of the left edge of this . /// - public float Left - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.X; - } + public float Left => this.X; /// /// Creates a with the coordinates of the specified by truncating each coordinate. From 3589057ca9c70634248d6922bc55a528c0388f44 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:15:48 -0700 Subject: [PATCH 086/136] [SL.Core] Format Size --- src/SixLabors.Core/Primitives/Size.cs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index d5ff95ad5..86412a137 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -252,17 +252,17 @@ namespace SixLabors.Primitives public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() => HashHelpers.Combine(this.Width.GetHashCode(), this.Height.GetHashCode()); /// public override string ToString() => $"Size [ Width={this.Width}, Height={this.Height} ]"; /// - public override bool Equals(object obj) => obj is Size && this.Equals((Size)obj); + public override bool Equals(object obj) => obj is Size other && this.Equals(other); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(Size other) => this.Width == other.Width && this.Height == other.Height; + public bool Equals(Size other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); /// /// Multiplies by an producing . @@ -281,16 +281,5 @@ namespace SixLabors.Primitives /// Product of type SizeF. private static SizeF Multiply(Size size, float multiplier) => new SizeF(size.Width * multiplier, size.Height * multiplier); - - /// - /// Returns the hash code for this instance. - /// - /// - /// The instance of to return the hash code for. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - private int GetHashCode(Size size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); } } \ No newline at end of file From 8c101f093b9a4d162a849a692faf73bbafa189fb Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:16:03 -0700 Subject: [PATCH 087/136] [SL.Core] Replace == with Equals --- src/SixLabors.Core/Primitives/Point.cs | 2 +- src/SixLabors.Core/Primitives/Rectangle.cs | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 112d8fea2..de0171796 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -268,7 +268,7 @@ namespace SixLabors.Primitives /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(Point other) => this.X == other.X && this.Y == other.Y; + public bool Equals(Point other) => this.X.Equals(other.X) && this.Y.Equals(other.Y); private static short HighInt16(int n) => unchecked((short)((n >> 16) & 0xffff)); diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 61dc79916..441c251eb 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -444,6 +444,10 @@ namespace SixLabors.Primitives /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(Rectangle other) => this.X == other.X && this.Y == other.Y && this.Width == other.Width && this.Height == other.Height; + public bool Equals(Rectangle other) => + this.X.Equals(other.X) && + this.Y.Equals(other.Y) && + this.Width.Equals(other.Width) && + this.Height.Equals(other.Height); } } \ No newline at end of file From be099d3f831daec89e607a13c5df963f3f3ac469 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:17:38 -0700 Subject: [PATCH 088/136] [SL.Core] Format long statement onto multiple lines --- src/SixLabors.Core/Primitives/RectangleF.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 1a275b623..535705a28 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -376,6 +376,10 @@ namespace SixLabors.Primitives /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(RectangleF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y) && this.Width.Equals(other.Width) && this.Height.Equals(other.Height); + public bool Equals(RectangleF other) => + this.X.Equals(other.X) && + this.Y.Equals(other.Y) && + this.Width.Equals(other.Width) && + this.Height.Equals(other.Height); } } \ No newline at end of file From 876ec6db8a3e9c0dd36ccbbd0e41693ee8958b17 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 3 Sep 2018 19:22:54 -0700 Subject: [PATCH 089/136] [SL.Core] Cross target netstandard2.0 --- src/SixLabors.Core/SixLabors.Core.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index b03eac761..f1ba5c22e 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -5,7 +5,7 @@ $(packageversion) 0.1.0-alpha2 Six Labors - netstandard1.1;netcoreapp2.0;netcoreapp2.1; + netstandard1.1;netstandard2.0;netcoreapp2.0;netcoreapp2.1; true true SixLabors.Core @@ -45,8 +45,8 @@ - - - + + + \ No newline at end of file From 2c8f6202796f51b4c2f7fc8010fe9fc8b85691ff Mon Sep 17 00:00:00 2001 From: daniaal Date: Mon, 24 Sep 2018 14:43:24 +0100 Subject: [PATCH 090/136] [SL.Core] Update descriptions on the ArrayPoolMemoryAllocator class --- ...ayPoolMemoryAllocator.CommonFactoryMethods.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs index a82948ebc..f35547810 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -42,26 +42,28 @@ namespace SixLabors.Memory DefaultNormalPoolBucketCount); } + /// - /// For environments with limited memory capabilities. Only small images are pooled, which can result in reduced througput. + /// For environments with very limited memory capabilities, only small buffers like image rows are pooled. /// /// The memory manager - public static ArrayPoolMemoryAllocator CreateWithModeratePooling() + public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() { - return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); + return new ArrayPoolMemoryAllocator(64 * 1024, 32 * 1024, 8, 24); } /// - /// Only pool small buffers like image rows. + /// For environments with limited memory capabilities, only small array requests are pooled, which can result in reduced throughput. /// /// The memory manager - public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() + public static ArrayPoolMemoryAllocator CreateWithModeratePooling() { - return new ArrayPoolMemoryAllocator(64 * 1024, 32 * 1024, 8, 24); + return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); } + /// - /// RAM is not an issue for me, gimme maximum througput! + /// For environments where memory capabilities are not an issue, the maximum amount of array requests are pooled which results in optimal throughput. /// /// The memory manager public static ArrayPoolMemoryAllocator CreateWithAggressivePooling() From ff6bf5804bbadc36d70063a31af458cd41b4623a Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 15 Oct 2018 09:08:38 -0700 Subject: [PATCH 091/136] [SL.Core] Increase minimium netstandard support to v1.3 --- src/SixLabors.Core/Helpers/HashHelpers.cs | 2 -- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index 934384238..896b6be10 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System; - namespace SixLabors { /// diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index f1ba5c22e..44f107599 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -5,7 +5,7 @@ $(packageversion) 0.1.0-alpha2 Six Labors - netstandard1.1;netstandard2.0;netcoreapp2.0;netcoreapp2.1; + netstandard1.3;netstandard2.0;netcoreapp2.0;netcoreapp2.1; true true SixLabors.Core From bc0e52126504d6aab1e106cc80cbcade5efd3995 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 26 Nov 2018 20:27:24 +0000 Subject: [PATCH 092/136] [SL.Core] Make deg - rad conversion public --- ...athFExtensions.cs => GeometryUtilities.cs} | 14 ++++---------- src/SixLabors.Core/Helpers/HashHelpers.cs | 1 - .../Primitives/Matrix3x2Extensions.cs | 8 ++++---- src/SixLabors.Core/Primitives/Rectangle.cs | 1 - .../Helpers/GeometryUtilitiesTests.cs | 19 +++++++++++++++++++ .../Helpers/MathFTests.cs | 13 ------------- 6 files changed, 27 insertions(+), 29 deletions(-) rename src/SixLabors.Core/{MathFExtensions.cs => GeometryUtilities.cs} (74%) create mode 100644 tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs diff --git a/src/SixLabors.Core/MathFExtensions.cs b/src/SixLabors.Core/GeometryUtilities.cs similarity index 74% rename from src/SixLabors.Core/MathFExtensions.cs rename to src/SixLabors.Core/GeometryUtilities.cs index 27d18d481..43c46f181 100644 --- a/src/SixLabors.Core/MathFExtensions.cs +++ b/src/SixLabors.Core/GeometryUtilities.cs @@ -7,9 +7,9 @@ using System.Runtime.CompilerServices; namespace SixLabors { /// - /// Provides common mathematical methods. + /// Utility class for common geometric functions. /// - internal static class MathFExtensions + public static class GeometryUtilities { /// /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. @@ -19,10 +19,7 @@ namespace SixLabors /// The representing the degree as radians. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float DegreeToRadian(float degree) - { - return degree * (MathF.PI / 180F); - } + public static float DegreeToRadian(float degree) => degree * (MathF.PI / 180F); /// /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. @@ -32,9 +29,6 @@ namespace SixLabors /// The representing the degree as radians. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float RadianToDegree(float radian) - { - return radian / (MathF.PI / 180F); - } + public static float RadianToDegree(float radian) => radian / (MathF.PI / 180F); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index 896b6be10..d45d75bf0 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -17,7 +17,6 @@ namespace SixLabors public static int Combine(int h1, int h2) { // Lifted from coreFX repo - unchecked { // RyuJIT optimizes this to use the ROL instruction diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs index 55d75b83d..2d33ea70d 100644 --- a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs +++ b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs @@ -55,7 +55,7 @@ namespace SixLabors.Primitives /// The X angle, in degrees. /// The Y angle, in degrees. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathFExtensions.DegreeToRadian(degreesX), MathFExtensions.DegreeToRadian(degreesY)); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY)); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -73,14 +73,14 @@ namespace SixLabors.Primitives /// The Y angle, in degrees. /// The center point. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathFExtensions.DegreeToRadian(degreesX), MathFExtensions.DegreeToRadian(degreesY), centerPoint); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), centerPoint); /// /// Creates a rotation matrix using the given rotation in degrees. /// /// The amount of rotation, in degrees. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(MathFExtensions.DegreeToRadian(degrees)); + public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(GeometryUtilities.DegreeToRadian(degrees)); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -96,6 +96,6 @@ namespace SixLabors.Primitives /// The amount of rotation, in degrees. /// The center point. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathFExtensions.DegreeToRadian(degrees), centerPoint); + public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(GeometryUtilities.DegreeToRadian(degrees), centerPoint); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 441c251eb..6b1b48d1f 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -135,7 +135,6 @@ namespace SixLabors.Primitives { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => unchecked(this.Y + this.Height); - } /// diff --git a/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs b/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs new file mode 100644 index 000000000..93e4cec60 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs @@ -0,0 +1,19 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using Xunit; + +namespace SixLabors.Tests.Helpers +{ + public class GeometryUtilitiesTests + { + [Fact] + public void Convert_Degree_To_Radian() + => Assert.Equal((float)(Math.PI / 2D), GeometryUtilities.DegreeToRadian(90F), new FloatRoundingComparer(6)); + + [Fact] + public void Convert_Radian_To_Degree() + => Assert.Equal(60F, GeometryUtilities.RadianToDegree((float)(Math.PI / 3D)), new FloatRoundingComparer(5)); + } +} diff --git a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs index 1d9ea1523..9ae95f014 100644 --- a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs @@ -6,7 +6,6 @@ using Xunit; namespace SixLabors.Tests.Helpers { - public class MathFTests { [Fact] @@ -92,17 +91,5 @@ namespace SixLabors.Tests.Helpers { Assert.Equal(MathF.Sqrt(2F), (float)Math.Sqrt(2F)); } - - [Fact] - public void Convert_Degree_To_Radian() - { - Assert.Equal((float)(Math.PI / 2D), MathFExtensions.DegreeToRadian(90F), new FloatRoundingComparer(6)); - } - - [Fact] - public void Convert_Radian_To_Degree() - { - Assert.Equal(60F, MathFExtensions.RadianToDegree((float)(Math.PI / 3D)), new FloatRoundingComparer(5)); - } } } \ No newline at end of file From 51212108493b2221668429976860c209f94028c9 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 7 Dec 2018 18:53:47 -0800 Subject: [PATCH 093/136] [SL.Core] Add and use HashCode polyfill --- src/SixLabors.Core/HashCode.cs | 443 ++++++++++++++++++ src/SixLabors.Core/Primitives/Point.cs | 4 +- src/SixLabors.Core/Primitives/PointF.cs | 7 +- src/SixLabors.Core/Primitives/Rectangle.cs | 8 +- src/SixLabors.Core/Primitives/RectangleF.cs | 8 +- src/SixLabors.Core/Primitives/Size.cs | 4 +- src/SixLabors.Core/Primitives/SizeF.cs | 7 +- src/SixLabors.Core/SixLabors.Core.csproj | 8 +- .../Helpers/FloatRoundingComparer.cs | 2 +- 9 files changed, 463 insertions(+), 28 deletions(-) create mode 100644 src/SixLabors.Core/HashCode.cs diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs new file mode 100644 index 000000000..ae3e83c52 --- /dev/null +++ b/src/SixLabors.Core/HashCode.cs @@ -0,0 +1,443 @@ +#pragma warning disable SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512 + +// SOURCE: https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/HashCode.cs + +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/* +The xxHash32 implementation is based on the code published by Yann Collet: +https://raw.githubusercontent.com/Cyan4973/xxHash/5c174cfa4e45a42f94082dc0d4539b39696afea1/xxhash.c + xxHash - Fast Hash algorithm + Copyright (C) 2012-2016, Yann Collet + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - xxHash homepage: http://www.xxhash.com + - xxHash source repository : https://github.com/Cyan4973/xxHash +*/ + +#if SUPPORTS_HASHCODE +using System.Runtime.CompilerServices; +[assembly: TypeForwardedTo(typeof(System.HashCode))] +#else +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Security.Cryptography; + +namespace System +{ + // xxHash32 is used for the hash code. + // https://github.com/Cyan4973/xxHash + internal struct HashCode + { + private static readonly uint s_seed = GenerateGlobalSeed(); + + private const uint Prime1 = 2654435761U; + private const uint Prime2 = 2246822519U; + private const uint Prime3 = 3266489917U; + private const uint Prime4 = 668265263U; + private const uint Prime5 = 374761393U; + + private uint _v1, _v2, _v3, _v4; + private uint _queue1, _queue2, _queue3; + private uint _length; + + private static uint GenerateGlobalSeed() + { + byte[] data = new byte[4]; + + using (var rng = RandomNumberGenerator.Create()) + { + rng.GetBytes(data); + } + + return Convert.ToUInt32(data); + } + + public static int Combine(T1 value1) + { + // Provide a way of diffusing bits from something with a limited + // input hash space. For example, many enums only have a few + // possible hashes, only using the bottom few bits of the code. Some + // collections are built on the assumption that hashes are spread + // over a larger space, so diffusing the bits may help the + // collection work more efficiently. + + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 4; + + hash = QueueRound(hash, hc1); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 8; + + hash = QueueRound(hash, hc1); + hash = QueueRound(hash, hc2); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 12; + + hash = QueueRound(hash, hc1); + hash = QueueRound(hash, hc2); + hash = QueueRound(hash, hc3); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 16; + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + var hc5 = (uint)(value5?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 20; + + hash = QueueRound(hash, hc5); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + var hc5 = (uint)(value5?.GetHashCode() ?? 0); + var hc6 = (uint)(value6?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 24; + + hash = QueueRound(hash, hc5); + hash = QueueRound(hash, hc6); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + var hc5 = (uint)(value5?.GetHashCode() ?? 0); + var hc6 = (uint)(value6?.GetHashCode() ?? 0); + var hc7 = (uint)(value7?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 28; + + hash = QueueRound(hash, hc5); + hash = QueueRound(hash, hc6); + hash = QueueRound(hash, hc7); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + var hc5 = (uint)(value5?.GetHashCode() ?? 0); + var hc6 = (uint)(value6?.GetHashCode() ?? 0); + var hc7 = (uint)(value7?.GetHashCode() ?? 0); + var hc8 = (uint)(value8?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + v1 = Round(v1, hc5); + v2 = Round(v2, hc6); + v3 = Round(v3, hc7); + v4 = Round(v4, hc8); + + uint hash = MixState(v1, v2, v3, v4); + hash += 32; + + hash = MixFinal(hash); + return (int)hash; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint Rol(uint value, int count) + => (value << count) | (value >> (32 - count)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void Initialize(out uint v1, out uint v2, out uint v3, out uint v4) + { + v1 = s_seed + Prime1 + Prime2; + v2 = s_seed + Prime2; + v3 = s_seed; + v4 = s_seed - Prime1; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint Round(uint hash, uint input) + { + hash += input * Prime2; + hash = Rol(hash, 13); + hash *= Prime1; + return hash; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint QueueRound(uint hash, uint queuedValue) + { + hash += queuedValue * Prime3; + return Rol(hash, 17) * Prime4; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint MixState(uint v1, uint v2, uint v3, uint v4) + { + return Rol(v1, 1) + Rol(v2, 7) + Rol(v3, 12) + Rol(v4, 18); + } + + private static uint MixEmptyState() + { + return s_seed + Prime5; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint MixFinal(uint hash) + { + hash ^= hash >> 15; + hash *= Prime2; + hash ^= hash >> 13; + hash *= Prime3; + hash ^= hash >> 16; + return hash; + } + + public void Add(T value) + { + Add(value?.GetHashCode() ?? 0); + } + + public void Add(T value, IEqualityComparer comparer) + { + Add(comparer != null ? comparer.GetHashCode(value) : (value?.GetHashCode() ?? 0)); + } + + private void Add(int value) + { + // The original xxHash works as follows: + // 0. Initialize immediately. We can't do this in a struct (no + // default ctor). + // 1. Accumulate blocks of length 16 (4 uints) into 4 accumulators. + // 2. Accumulate remaining blocks of length 4 (1 uint) into the + // hash. + // 3. Accumulate remaining blocks of length 1 into the hash. + + // There is no need for #3 as this type only accepts ints. _queue1, + // _queue2 and _queue3 are basically a buffer so that when + // ToHashCode is called we can execute #2 correctly. + + // We need to initialize the xxHash32 state (_v1 to _v4) lazily (see + // #0) nd the last place that can be done if you look at the + // original code is just before the first block of 16 bytes is mixed + // in. The xxHash32 state is never used for streams containing fewer + // than 16 bytes. + + // To see what's really going on here, have a look at the Combine + // methods. + + var val = (uint)value; + + // Storing the value of _length locally shaves of quite a few bytes + // in the resulting machine code. + uint previousLength = _length++; + uint position = previousLength % 4; + + // Switch can't be inlined. + + if (position == 0) + _queue1 = val; + else if (position == 1) + _queue2 = val; + else if (position == 2) + _queue3 = val; + else // position == 3 + { + if (previousLength == 3) + Initialize(out _v1, out _v2, out _v3, out _v4); + + _v1 = Round(_v1, _queue1); + _v2 = Round(_v2, _queue2); + _v3 = Round(_v3, _queue3); + _v4 = Round(_v4, val); + } + } + + public int ToHashCode() + { + // Storing the value of _length locally shaves of quite a few bytes + // in the resulting machine code. + uint length = _length; + + // position refers to the *next* queue position in this method, so + // position == 1 means that _queue1 is populated; _queue2 would have + // been populated on the next call to Add. + uint position = length % 4; + + // If the length is less than 4, _v1 to _v4 don't contain anything + // yet. xxHash32 treats this differently. + + uint hash = length < 4 ? MixEmptyState() : MixState(_v1, _v2, _v3, _v4); + + // _length is incremented once per Add(Int32) and is therefore 4 + // times too small (xxHash length is in bytes, not ints). + + hash += length * 4; + + // Mix what remains in the queue + + // Switch can't be inlined right now, so use as few branches as + // possible by manually excluding impossible scenarios (position > 1 + // is always false if position is not > 0). + if (position > 0) + { + hash = QueueRound(hash, _queue1); + if (position > 1) + { + hash = QueueRound(hash, _queue2); + if (position > 2) + hash = QueueRound(hash, _queue3); + } + } + + hash = MixFinal(hash); + return (int)hash; + } + +#pragma warning disable 0809 + // Obsolete member 'memberA' overrides non-obsolete member 'memberB'. + // Disallowing GetHashCode and Equals is by design + + // * We decided to not override GetHashCode() to produce the hash code + // as this would be weird, both naming-wise as well as from a + // behavioral standpoint (GetHashCode() should return the object's + // hash code, not the one being computed). + + // * Even though ToHashCode() can be called safely multiple times on + // this implementation, it is not part of the contract. If the + // implementation has to change in the future we don't want to worry + // about people who might have incorrectly used this type. + + [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes. Use ToHashCode to retrieve the computed hash code.", error: true)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => throw new NotSupportedException("Equality not supported"); + + [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes.", error: true)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) => throw new NotSupportedException("Equality not supported"); +#pragma warning restore 0809 + } +} +#endif + +#pragma warning restore SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512 \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index de0171796..6b9e129d8 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -21,7 +21,7 @@ namespace SixLabors.Primitives /// /// Represents a that has X and Y values set to zero. /// - public static readonly Point Empty = default(Point); + public static readonly Point Empty = default; /// /// Initializes a new instance of the struct. @@ -258,7 +258,7 @@ namespace SixLabors.Primitives public void Offset(Point point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() => HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); + public override int GetHashCode() => HashCode.Combine(this.X, this.Y); /// public override string ToString() => $"Point [ X={this.X}, Y={this.Y} ]"; diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index c163da7cd..a214b32e5 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -21,7 +21,7 @@ namespace SixLabors.Primitives /// /// Represents a that has X and Y values set to zero. /// - public static readonly PointF Empty = default(PointF); + public static readonly PointF Empty = default; /// /// Initializes a new instance of the struct. @@ -267,10 +267,7 @@ namespace SixLabors.Primitives public void Offset(PointF point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() - { - return HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); - } + public override int GetHashCode() => HashCode.Combine(this.X, this.Y); /// public override string ToString() => $"PointF [ X={this.X}, Y={this.Y} ]"; diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 6b1b48d1f..26694a028 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -20,7 +20,7 @@ namespace SixLabors.Primitives /// /// Represents a that has X, Y, Width, and Height values set to zero. /// - public static readonly Rectangle Empty = default(Rectangle); + public static readonly Rectangle Empty = default; /// /// Initializes a new instance of the struct. @@ -425,11 +425,7 @@ namespace SixLabors.Primitives /// public override int GetHashCode() { - return HashHelpers.Combine( - this.X.GetHashCode(), - this.Y.GetHashCode(), - this.Width.GetHashCode(), - this.Height.GetHashCode()); + return HashCode.Combine(this.X, this.Y, this.Width, this.Height); } /// diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 535705a28..b5b96efc8 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -20,7 +20,7 @@ namespace SixLabors.Primitives /// /// Represents a that has X, Y, Width, and Height values set to zero. /// - public static readonly RectangleF Empty = default(RectangleF); + public static readonly RectangleF Empty = default; /// /// Initializes a new instance of the struct. @@ -358,11 +358,7 @@ namespace SixLabors.Primitives /// public override int GetHashCode() { - return HashHelpers.Combine( - this.X.GetHashCode(), - this.Y.GetHashCode(), - this.Width.GetHashCode(), - this.Height.GetHashCode()); + return HashCode.Combine(this.X, this.Y, this.Width, this.Height); } /// diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 86412a137..4c6c37979 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -20,7 +20,7 @@ namespace SixLabors.Primitives /// /// Represents a that has Width and Height values set to zero. /// - public static readonly Size Empty = default(Size); + public static readonly Size Empty = default; /// /// Initializes a new instance of the struct. @@ -252,7 +252,7 @@ namespace SixLabors.Primitives public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); /// - public override int GetHashCode() => HashHelpers.Combine(this.Width.GetHashCode(), this.Height.GetHashCode()); + public override int GetHashCode() => HashCode.Combine(this.Width, this.Height); /// public override string ToString() => $"Size [ Width={this.Width}, Height={this.Height} ]"; diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index 8dbdd7424..a2bd687be 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -20,7 +20,7 @@ namespace SixLabors.Primitives /// /// Represents a that has Width and Height values set to zero. /// - public static readonly SizeF Empty = default(SizeF); + public static readonly SizeF Empty = default; /// /// Initializes a new instance of the struct. @@ -198,10 +198,7 @@ namespace SixLabors.Primitives } /// - public override int GetHashCode() - { - return HashHelpers.Combine(this.Width.GetHashCode(), this.Height.GetHashCode()); - } + public override int GetHashCode() => HashCode.Combine(this.Width, this.Height); /// public override string ToString() => $"SizeF [ Width={this.Width}, Height={this.Height} ]"; diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 44f107599..7454cc238 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -19,16 +19,22 @@ Copyright (c) Six Labors and contributors. full SixLabors + 7.3 ..\SixLabors.ruleset + $(DefineConstants);SUPPORTS_MATHF - + + + $(DefineConstants);SUPPORTS_HASHCODE + + All diff --git a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs index e3ef6a01b..a5c965b10 100644 --- a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs +++ b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs @@ -54,6 +54,6 @@ namespace SixLabors.Tests.Helpers } /// - public int GetHashCode(Vector4 obj) => HashHelpers.Combine(obj.GetHashCode(), this.Precision.GetHashCode()); + public int GetHashCode(Vector4 obj) => HashCode.Combine(obj, this.Precision); } } \ No newline at end of file From 00eafc937b03f070f4f0b13a34712d7848fdba1c Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 7 Dec 2018 19:00:04 -0800 Subject: [PATCH 094/136] [SL.Core] Obsolete HashHelpers --- src/SixLabors.Core/Helpers/HashHelpers.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index d45d75bf0..b6241789b 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -1,6 +1,8 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; + namespace SixLabors { /// @@ -14,6 +16,7 @@ namespace SixLabors /// Hash code one /// Hash code two /// Returns a hash code for the provided hash codes. + [Obsolete("Use HashCode.Combine instead")] public static int Combine(int h1, int h2) { // Lifted from coreFX repo @@ -33,6 +36,7 @@ namespace SixLabors /// Hash code two /// Hash code three /// Returns a hash code for the provided hash codes. + [Obsolete("Use HashCode.Combine instead")] public static int Combine(int h1, int h2, int h3) { int hash = Combine(h1, h2); @@ -50,6 +54,7 @@ namespace SixLabors /// Hash code three /// Hash code four /// Returns a hash code for the provided hash codes. + [Obsolete("Use HashCode.Combine instead")] public static int Combine(int h1, int h2, int h3, int h4) { int hash = Combine(h1, h2); From 78ca048ff6a61a2bb8e5c7ac6740f6201f38b0fc Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Sat, 8 Dec 2018 16:36:48 -0800 Subject: [PATCH 095/136] [SL.Core] Update supressions --- src/SixLabors.Core/HashCode.cs | 7 +++++-- .../ArrayPoolMemoryAllocator.CommonFactoryMethods.cs | 2 -- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs index ae3e83c52..be0e8bd3a 100644 --- a/src/SixLabors.Core/HashCode.cs +++ b/src/SixLabors.Core/HashCode.cs @@ -1,4 +1,4 @@ -#pragma warning disable SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512 +#pragma warning disable SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512, SA1308 // SOURCE: https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/HashCode.cs @@ -57,7 +57,9 @@ namespace System // https://github.com/Cyan4973/xxHash internal struct HashCode { +#pragma warning disable SA1311 // Static readonly fields should begin with upper-case letter private static readonly uint s_seed = GenerateGlobalSeed(); +#pragma warning restore SA1311 // Static readonly fields should begin with upper-case letter private const uint Prime1 = 2654435761U; private const uint Prime2 = 2246822519U; @@ -415,6 +417,7 @@ namespace System } #pragma warning disable 0809 + // Obsolete member 'memberA' overrides non-obsolete member 'memberB'. // Disallowing GetHashCode and Equals is by design @@ -440,4 +443,4 @@ namespace System } #endif -#pragma warning restore SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512 \ No newline at end of file +#pragma warning restore SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512, SA1308 \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs index f35547810..c56453b00 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -42,7 +42,6 @@ namespace SixLabors.Memory DefaultNormalPoolBucketCount); } - /// /// For environments with very limited memory capabilities, only small buffers like image rows are pooled. /// @@ -61,7 +60,6 @@ namespace SixLabors.Memory return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); } - /// /// For environments where memory capabilities are not an issue, the maximum amount of array requests are pooled which results in optimal throughput. /// From 1c6a07fc364c213aad0b755154449af0afe420b6 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Sat, 8 Dec 2018 16:47:27 -0800 Subject: [PATCH 096/136] [SL.Core] Fix mistake. :( --- src/SixLabors.Core/HashCode.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs index be0e8bd3a..73d4b3574 100644 --- a/src/SixLabors.Core/HashCode.cs +++ b/src/SixLabors.Core/HashCode.cs @@ -46,6 +46,7 @@ https://raw.githubusercontent.com/Cyan4973/xxHash/5c174cfa4e45a42f94082dc0d4539b using System.Runtime.CompilerServices; [assembly: TypeForwardedTo(typeof(System.HashCode))] #else +using System.Buffers.Binary; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; @@ -80,7 +81,7 @@ namespace System rng.GetBytes(data); } - return Convert.ToUInt32(data); + return BinaryPrimitives.ReadUInt32LittleEndian(data); } public static int Combine(T1 value1) From 5334e39a6428ef23fb896baf47c79b1546cad693 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Tue, 11 Dec 2018 18:05:48 -0800 Subject: [PATCH 097/136] [SL.Core] Downgrade System.Buffers to 4.4.0 --- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 7454cc238..7dd934b2f 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -48,7 +48,7 @@ - + From 8100c04f3f219f3069d20cc096234e5a1acba941 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Tue, 11 Dec 2018 18:05:58 -0800 Subject: [PATCH 098/136] [SL.Core] Remove HashHelpers --- src/SixLabors.Core/Helpers/HashHelpers.cs | 67 ------------------- .../Helpers/HashHelpersTests.cs | 28 -------- 2 files changed, 95 deletions(-) delete mode 100644 src/SixLabors.Core/Helpers/HashHelpers.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs deleted file mode 100644 index b6241789b..000000000 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; - -namespace SixLabors -{ - /// - /// Provides a set of helpers for combining object hashes. - /// - internal static class HashHelpers - { - /// - /// Combines the two specified hash codes. - /// - /// Hash code one - /// Hash code two - /// Returns a hash code for the provided hash codes. - [Obsolete("Use HashCode.Combine instead")] - public static int Combine(int h1, int h2) - { - // Lifted from coreFX repo - unchecked - { - // RyuJIT optimizes this to use the ROL instruction - // Related GitHub pull request: dotnet/coreclr#1830 - uint rol5 = ((uint)h1 << 5) | ((uint)h1 >> 27); - return ((int)rol5 + h1) ^ h2; - } - } - - /// - /// Combines the three specified hash codes. - /// - /// The first - /// Hash code two - /// Hash code three - /// Returns a hash code for the provided hash codes. - [Obsolete("Use HashCode.Combine instead")] - public static int Combine(int h1, int h2, int h3) - { - int hash = Combine(h1, h2); - - hash = Combine(hash, h3); - - return hash; - } - - /// - /// Combines the four specified hash codes. - /// - /// The first - /// Hash code two - /// Hash code three - /// Hash code four - /// Returns a hash code for the provided hash codes. - [Obsolete("Use HashCode.Combine instead")] - public static int Combine(int h1, int h2, int h3, int h4) - { - int hash = Combine(h1, h2); - - hash = Combine(hash, h3); - - return Combine(hash, h4); - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs b/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs deleted file mode 100644 index 7091038ad..000000000 --- a/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using Xunit; - -namespace SixLabors.Tests.Helpers -{ - public class HashHelpersTests - { - [Fact] - public void CanCombineTwoValues() - { - Assert.Equal(35, HashHelpers.Combine(1, 2)); - } - - [Fact] - public void CanCombineThreeValues() - { - Assert.Equal(1152, HashHelpers.Combine(1, 2, 3)); - } - - [Fact] - public void CanCombineFourValues() - { - Assert.Equal(38020, HashHelpers.Combine(1, 2, 3, 4)); - } - } -} \ No newline at end of file From 4671658b7bbd8bbdedd52e086b07641965bd26c4 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sat, 20 Apr 2019 16:38:27 +0200 Subject: [PATCH 099/136] [SL.Core] Throw better exceptions from MemoryAllocators --- .../Memory/ArrayPoolMemoryAllocator.cs | 11 +++++ .../Memory/SimpleGcMemoryAllocator.cs | 7 +++ ...ts.cs => ArrayPoolMemoryAllocatorTests.cs} | 24 +++++++++- .../Memory/SimpleGcMemoryAllocatorTests.cs | 45 +++++++++++++++++++ .../Memory/SimpleGcMemoryManagerTests.cs | 16 ------- 5 files changed, 85 insertions(+), 18 deletions(-) rename tests/SixLabors.Core.Tests/Memory/{ArrayPoolMemoryManagerTests.cs => ArrayPoolMemoryAllocatorTests.cs} (88%) create mode 100644 tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs delete mode 100644 tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs index 8681a594b..0a5e47f28 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; using System.Buffers; using System.Runtime.CompilerServices; @@ -91,8 +92,15 @@ namespace SixLabors.Memory /// public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) { + Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); int itemSizeBytes = Unsafe.SizeOf(); int bufferSizeInBytes = length * itemSizeBytes; + if (bufferSizeInBytes < 0) + { + throw new ArgumentOutOfRangeException( + nameof(length), + $"{nameof(ArrayPoolMemoryAllocator)} can not allocate {length} elements of {typeof(T).Name}."); + } ArrayPool pool = this.GetArrayPool(bufferSizeInBytes); byte[] byteArray = pool.Rent(bufferSizeInBytes); @@ -109,6 +117,9 @@ namespace SixLabors.Memory /// public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) { + Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); + Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); + ArrayPool pool = this.GetArrayPool(length); byte[] byteArray = pool.Rent(length); diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs index cc1157979..fc7fb607f 100644 --- a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; using System.Buffers; using SixLabors.Memory.Internals; @@ -14,12 +15,18 @@ namespace SixLabors.Memory /// public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) { + Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); + Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); + return new BasicArrayBuffer(new T[length]); } /// public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) { + Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); + Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); + return new BasicByteBuffer(new byte[length]); } } diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs similarity index 88% rename from tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs rename to tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index 6e7efebb8..5226c9b01 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -12,7 +12,7 @@ using Xunit; namespace SixLabors.Memory.Tests { - public class ArrayPoolMemoryManagerTests + public class ArrayPoolMemoryAllocatorTests { private const int MaxPooledBufferSizeInBytes = 2048; @@ -231,9 +231,29 @@ namespace SixLabors.Memory.Tests private uint dummy; } - [StructLayout(LayoutKind.Explicit, Size = MaxPooledBufferSizeInBytes / 5)] + private const int SizeOfLargeStruct = MaxPooledBufferSizeInBytes / 5; + + [StructLayout(LayoutKind.Explicit, Size = SizeOfLargeStruct)] private struct LargeStruct { } + + [Theory] + [InlineData(-1)] + [InlineData((int.MaxValue / SizeOfLargeStruct) + 1)] + public void AllocateIncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) + { + var ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); + Assert.Equal("length", ex.ParamName); + } + + [Theory] + [InlineData(-1)] + [InlineData(int.MaxValue)] + public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) + { + var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); + Assert.Equal("length", ex.ParamName); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs new file mode 100644 index 000000000..96f92e682 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs @@ -0,0 +1,45 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Runtime.InteropServices; +using Xunit; + +namespace SixLabors.Memory.Tests +{ + public class SimpleGcMemoryAllocatorTests + { + public class BufferTests : BufferTestSuite + { + public BufferTests() + : base(new SimpleGcMemoryAllocator()) + { + } + } + + protected SimpleGcMemoryAllocator MemoryAllocator { get; } = new SimpleGcMemoryAllocator(); + + [Theory] + [InlineData(-1)] + [InlineData(int.MaxValue)] + public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) + { + var ex = Assert.Throws(() => this.MemoryAllocator.Allocate( length)); + Assert.Equal("length", ex.ParamName); + } + + [Theory] + [InlineData(-1)] + [InlineData(int.MaxValue)] + public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) + { + var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); + Assert.Equal("length", ex.ParamName); + } + + [StructLayout(LayoutKind.Explicit, Size = 512)] + private struct BigStruct + { + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs deleted file mode 100644 index a6ddeb050..000000000 --- a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.Memory.Tests -{ - public class SimpleGcMemoryManagerTests - { - public class BufferTests : BufferTestSuite - { - public BufferTests() - : base(new SimpleGcMemoryAllocator()) - { - } - } - } -} \ No newline at end of file From 18b9f182253f0740ec9c38d70646606d88ea45b6 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 21 Apr 2019 00:56:40 +0200 Subject: [PATCH 100/136] [SL.Core] drop meaningless upper limit check --- src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs | 1 - src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs | 2 -- .../Memory/ArrayPoolMemoryAllocatorTests.cs | 1 - .../SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs | 2 -- 4 files changed, 6 deletions(-) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs index 0a5e47f28..113e12785 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs @@ -118,7 +118,6 @@ namespace SixLabors.Memory public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) { Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); - Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); ArrayPool pool = this.GetArrayPool(length); byte[] byteArray = pool.Rent(length); diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs index fc7fb607f..acf17ad63 100644 --- a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs @@ -16,7 +16,6 @@ namespace SixLabors.Memory public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) { Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); - Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); return new BasicArrayBuffer(new T[length]); } @@ -25,7 +24,6 @@ namespace SixLabors.Memory public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) { Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); - Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); return new BasicByteBuffer(new byte[length]); } diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index 5226c9b01..e59590bae 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -249,7 +249,6 @@ namespace SixLabors.Memory.Tests [Theory] [InlineData(-1)] - [InlineData(int.MaxValue)] public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs index 96f92e682..86e71717e 100644 --- a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs @@ -21,7 +21,6 @@ namespace SixLabors.Memory.Tests [Theory] [InlineData(-1)] - [InlineData(int.MaxValue)] public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { var ex = Assert.Throws(() => this.MemoryAllocator.Allocate( length)); @@ -30,7 +29,6 @@ namespace SixLabors.Memory.Tests [Theory] [InlineData(-1)] - [InlineData(int.MaxValue)] public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); From fb38a57fd12a293f608e47763f85523893e2ffd4 Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Wed, 1 May 2019 17:17:50 +0200 Subject: [PATCH 101/136] [SL.Core] Added deconstructors --- src/SixLabors.Core/Primitives/Point.cs | 13 ++++++++++++- src/SixLabors.Core/Primitives/PointF.cs | 13 ++++++++++++- src/SixLabors.Core/Primitives/Rectangle.cs | 17 ++++++++++++++++- src/SixLabors.Core/Primitives/RectangleF.cs | 17 ++++++++++++++++- src/SixLabors.Core/Primitives/Size.cs | 13 ++++++++++++- src/SixLabors.Core/Primitives/SizeF.cs | 13 ++++++++++++- 6 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 6b9e129d8..77ebb62f6 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -235,6 +235,17 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Transform(Point point, Matrix3x2 matrix) => Round(Vector2.Transform(new Vector2(point.X, point.Y), matrix)); + /// + /// Deconstructs this point into two integers + /// + /// The out value for X + /// The out value for Y + public void Deconstruct(out int x, out int y) + { + x = this.X; + y = this.Y; + } + /// /// Translates this by the specified amount. /// diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index a214b32e5..844a5f264 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -247,6 +247,17 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Transform(PointF point, Matrix3x2 matrix) => Vector2.Transform(point, matrix); + /// + /// Deconstructs this point into two floats + /// + /// The out value for X + /// The out value for Y + public void Deconstruct(out float x, out float y) + { + x = this.X; + y = this.Y; + } + /// /// Translates this by the specified amount. /// diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 26694a028..239813ac7 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -320,6 +320,21 @@ namespace SixLabors.Primitives return new Rectangle(x1, y1, x2 - x1, y2 - y1); } + /// + /// Deconstructs this rectangle into four integers + /// + /// The out value for X + /// The out value for Y + /// The out value for the width + /// The out value for the height + public void Deconstruct(out int x, out int y, out int width, out int height) + { + x = this.X; + y = this.Y; + width = this.Width; + height = this.Height; + } + /// /// Creates a Rectangle that represents the intersection between this Rectangle and the . /// diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index b5b96efc8..f212e5bcc 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -259,6 +259,21 @@ namespace SixLabors.Primitives return new RectangleF(x1, y1, x2 - x1, y2 - y1); } + /// + /// Deconstructs this rectangle into four floats + /// + /// The out value for X + /// The out value for Y + /// The out value for the width + /// The out value for the height + public void Deconstruct(out float x, out float y, out float width, out float height) + { + x = this.X; + y = this.Y; + width = this.Width; + height = this.Height; + } + /// /// Creates a RectangleF that represents the intersection between this RectangleF and the . /// diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 4c6c37979..0c468a80b 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -251,6 +251,17 @@ namespace SixLabors.Primitives [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); + /// + /// Deconstructs this size into two integers + /// + /// The out value for the width + /// The out value for the height + public void Deconstruct(out int width, out int height) + { + width = this.Width; + height = this.Height; + } + /// public override int GetHashCode() => HashCode.Combine(this.Width, this.Height); diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index a2bd687be..b7e15b5e3 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -197,6 +197,17 @@ namespace SixLabors.Primitives return new SizeF(v.X, v.Y); } + /// + /// Deconstructs this size into two floats + /// + /// The out value for the width + /// The out value for the height + public void Deconstruct(out float width, out float height) + { + width = this.Width; + height = this.Height; + } + /// public override int GetHashCode() => HashCode.Combine(this.Width, this.Height); From 6c6baa441e001717cdab9218a6bb08561333af5f Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Wed, 1 May 2019 17:18:06 +0200 Subject: [PATCH 102/136] [SL.Core] Added small tests for deconstructors --- .../Primitives/PointFTests.cs | 17 +++++++++- .../Primitives/PointTests.cs | 17 +++++++++- .../Primitives/RectangleFTests.cs | 32 ++++++++++++++++++- .../Primitives/RectangleTests.cs | 32 ++++++++++++++++++- .../Primitives/SizeFTests.cs | 17 +++++++++- .../Primitives/SizeTests.cs | 17 +++++++++- 6 files changed, 126 insertions(+), 6 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index cdd7410d5..8535b3fb0 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -191,5 +191,20 @@ namespace SixLabors.Primitives.Tests var p = new PointF(5.1F, -5.123F); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "PointF [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void DeconstructTest(float x, float y) + { + PointF p = new PointF(x, y); + + (float deconstructedX, float deconstructedY) = p; + + Assert.Equal(x, deconstructedX); + Assert.Equal(y, deconstructedY); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 43d662572..6a873567b 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -239,5 +239,20 @@ namespace SixLabors.Primitives.Tests var p = new Point(5, -5); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Point [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void DeconstructTest(int x, int y) + { + Point p = new Point(x, y); + + (int deconstructedX, int deconstructedY) = p; + + Assert.Equal(x, deconstructedX); + Assert.Equal(y, deconstructedY); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs index 463509eac..926416ae5 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -252,5 +252,35 @@ namespace SixLabors.Primitives.Tests var r = new RectangleF(5, 5.1F, 1.3F, 1); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "RectangleF [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); } + + [Theory] + [InlineData(float.MinValue, float.MaxValue, float.MaxValue, float.MaxValue)] + [InlineData(float.MinValue, float.MaxValue, float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue, float.MaxValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue, float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue, float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MaxValue, float.MaxValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MaxValue, float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MinValue)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MinValue)] + [InlineData(0, 0, 0, 0)] + public void DeconstructTest(float x, float y, float width, float height) + { + RectangleF r = new RectangleF(x, y, width, height); + + (float dx, float dy, float dw, float dh) = r; + + Assert.Equal(x, dx); + Assert.Equal(y, dy); + Assert.Equal(width, dw); + Assert.Equal(height, dh); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 90354bd72..8a00cd1fc 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -294,5 +294,35 @@ namespace SixLabors.Primitives.Tests var r = new Rectangle(5, -5, 0, 1); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Rectangle [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); } + + [Theory] + [InlineData(int.MinValue, int.MaxValue, int.MaxValue, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue, int.MaxValue, int.MaxValue)] + [InlineData(int.MinValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MinValue, int.MinValue, int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue, int.MaxValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MaxValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MinValue)] + [InlineData(0, 0, 0, 0)] + public void DeconstructTest(int x, int y, int width, int height) + { + Rectangle r = new Rectangle(x, y, width, height); + + (int dx, int dy, int dw, int dh) = r; + + Assert.Equal(x, dx); + Assert.Equal(y, dy); + Assert.Equal(width, dw); + Assert.Equal(height, dh); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index 04363fa94..a0a0ff6fe 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -231,5 +231,20 @@ namespace SixLabors.Primitives.Tests SizeF expected = new SizeF(width / divisor, height / divisor); Assert.Equal(expected, size / divisor); } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void DeconstructTest(float width, float height) + { + SizeF s = new SizeF(width, height); + + (float deconstructedWidth, float deconstructedHeight) = s; + + Assert.Equal(width, deconstructedWidth); + Assert.Equal(height, deconstructedHeight); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs index 0cfb62dd5..05f690603 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -360,5 +360,20 @@ namespace SixLabors.Primitives.Tests expected = new SizeF(width / divisor, height / divisor); Assert.Equal(expected, size / divisor); } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void DeconstructTest(int width, int height) + { + Size s = new Size(width, height); + + (int deconstructedWidth, int deconstructedHeight) = s; + + Assert.Equal(width, deconstructedWidth); + Assert.Equal(height, deconstructedHeight); + } } } \ No newline at end of file From e55f1b1e83bc99c0698e485b0e2ffe72df2300db Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Thu, 2 May 2019 11:04:44 +0200 Subject: [PATCH 103/136] [SL.Core] Changed double InlineData from MinValue to MaxValue --- tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index 04363fa94..71f856646 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -213,9 +213,9 @@ namespace SixLabors.Primitives.Tests [InlineData(float.MinValue, -1.0f)] [InlineData(float.MinValue, 0.0f)] [InlineData(1.0f, float.MinValue)] - [InlineData(1.0f, float.MinValue)] - [InlineData(-1.0f, float.MinValue)] + [InlineData(1.0f, float.MaxValue)] [InlineData(-1.0f, float.MinValue)] + [InlineData(-1.0f, float.MaxValue)] public void DivideTestSizeFloat(float dimension, float divisor) { SizeF size = new SizeF(dimension, dimension); From 597c49d31232b05a8f5d5e404e3e3b3cd9638529 Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Thu, 2 May 2019 11:20:16 +0200 Subject: [PATCH 104/136] [SL.Core] Added .github folder based upon ImageSharp .github folder. --- .github/CONTRIBUTING.md | 35 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/ask-question.md | 13 +++++++++ .github/ISSUE_TEMPLATE/bug-report.md | 29 +++++++++++++++++++ .github/ISSUE_TEMPLATE/feature-request.md | 13 +++++++++ .github/PULL_REQUEST_TEMPLATE.md | 11 +++++++ SixLabors.Core.sln | 12 ++++++-- 6 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/ask-question.md create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 000000000..9d83b43b5 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# How to contribute to SixLabors.Core + +#### **Did you find a bug?** + +- Please **ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/SixLabors/Core/issues). + +- If you're unable to find an open issue addressing the problem, please [open a new one](https://github.com/SixLabors/Core/issues/new). Be sure to include a **title, the applicable version, a clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. Please do not hijack existing issues. + +#### **Did you write a patch that fixes a bug?** + +* Open a new GitHub pull request with the patch. + +* Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. + +* Before submitting, please ensure that your code matches the existing coding patterns and practise as demonstrated in the repository. These follow strict Stylecop rules :cop:. + +#### **Do you intend to add a new feature or change an existing one?** + +* Suggest your change in the [ImageSharp Gitter Chat Room](https://gitter.im/ImageSharp/General) and start writing code. + +* Do not open an issue on GitHub until you have collected positive feedback about the change. GitHub issues are primarily intended for bug reports and fixes. + +#### **Running tests and Debugging** + +* Debugging (running tests in Debug mode) is only supported on .NET Core 2.1, because of JIT Code Generation bugs like [dotnet/coreclr#16443](https://github.com/dotnet/coreclr/issues/16443) or [dotnet/coreclr#20657](https://github.com/dotnet/coreclr/issues/20657) + +#### **Do you have questions about consuming the library or the source code?** + +* Ask any question about how to use SixLabors.Core in the [ImageSharp Gitter Chat Room](https://gitter.im/ImageSharp/General). + +And please remember. SixLabors.Core is the work of a very, very, small number of developers who struggle balancing time to contribute to the project with family time and work commitments. We encourage you to pitch in and help make our vision of simple accessible imageprocessing available to all. Open Source can only exist with your help. + +Thanks for reading! + +James Jackson-South :heart: diff --git a/.github/ISSUE_TEMPLATE/ask-question.md b/.github/ISSUE_TEMPLATE/ask-question.md new file mode 100644 index 000000000..c8313fba9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ask-question.md @@ -0,0 +1,13 @@ +--- +name: Ask question +about: Ask a question about this project. + +--- + +You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General + +You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General + +You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General + +You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 000000000..c1bf768fa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,29 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +### Prerequisites + +- [ ] I have written a descriptive issue title +- [ ] I have verified that I am running the latest version of ImageSharp +- [ ] I have verified if the problem exist in both `DEBUG` and `RELEASE` mode +- [ ] I have searched [open](https://github.com/SixLabors/Core/issues) and [closed](https://github.com/SixLabors/Core/issues?q=is%3Aissue+is%3Aclosed) issues to ensure it has not already been reported + +### Description + + +### Steps to Reproduce + + +### System Configuration + + +- SixLabors.Core version: +- Other SixLabors packages and versions: +- Environment (Operating system, version and so on): +- .NET Framework version: +- Additional information: + + diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 000000000..be1e593be --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,13 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General + +You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General + +You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General + +You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000..a717a05a1 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +### Prerequisites + +- [ ] I have written a descriptive pull-request title +- [ ] I have verified that there are no overlapping [pull-requests](https://github.com/SixLabors/Core/pulls) open +- [ ] I have verified that I am following matches the existing coding patterns and practice as demonstrated in the repository. These follow strict Stylecop rules :cop:. +- [ ] I have provided test coverage for my change (where applicable) + +### Description + + + diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index d10b17787..040ce0688 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -1,15 +1,20 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26430.14 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.352 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig appveyor.yml = appveyor.yml + .github\ISSUE_TEMPLATE\ask-question.md = .github\ISSUE_TEMPLATE\ask-question.md + .github\ISSUE_TEMPLATE\bug-report.md = .github\ISSUE_TEMPLATE\bug-report.md build.cmd = build.cmd codecov.yml = codecov.yml + .github\CONTRIBUTING.md = .github\CONTRIBUTING.md + .github\ISSUE_TEMPLATE\feature-request.md = .github\ISSUE_TEMPLATE\feature-request.md gitversion.yml = gitversion.yml + .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md README.md = README.md EndProjectSection EndProject @@ -49,6 +54,9 @@ Global {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} {10A74B46-930F-49E3-A579-BC3A6A23321D} = {C317F1B1-D75E-4C6D-83EB-80367343E0D7} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0DED1AC8-37DA-4EC2-8CAE-40E31CD439DE} + EndGlobalSection GlobalSection(Performance) = preSolution HasPerformanceSessions = true EndGlobalSection From 3cdd259c6aeb2ffea9c1deee0463e4e30c6e3762 Mon Sep 17 00:00:00 2001 From: Mertsch Date: Fri, 28 Jun 2019 16:23:35 +0200 Subject: [PATCH 105/136] [SL.Core] Remove typo in NuGet package description --- src/SixLabors.Core/SixLabors.Core.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 7dd934b2f..e733ee2fc 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -1,7 +1,7 @@  - Low level primitives for use across Six Labors projects.. + Low level primitives for use across Six Labors projects. $(packageversion) 0.1.0-alpha2 Six Labors @@ -55,4 +55,4 @@ - \ No newline at end of file + From 9af8343e0134b8091fbf53f3a931863ca82434d8 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:31:38 +0200 Subject: [PATCH 106/136] [SL.Core] Upgraded StyleCop. --- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 7dd934b2f..cbdee57cc 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -36,7 +36,7 @@ - + All diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index 64545d082..f1b5839fc 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -27,7 +27,10 @@ - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + From 901929bdf590c91300fcb62794c6957f6917d187 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:32:59 +0200 Subject: [PATCH 107/136] [SL.Core] Fixed new StyleCop issues. --- src/SixLabors.Core/Constants.cs | 2 +- src/SixLabors.Core/Helpers/DebugGuard.cs | 8 +- src/SixLabors.Core/Helpers/Guard.cs | 2 +- src/SixLabors.Core/MathF.cs | 2 +- .../ArrayPoolMemoryAllocator.Buffer{T}.cs | 4 +- ...oolMemoryAllocator.CommonFactoryMethods.cs | 8 +- .../Memory/ArrayPoolMemoryAllocator.cs | 4 +- .../Memory/Internals/BasicArrayBuffer.cs | 14 +-- .../Memory/Internals/BasicByteBuffer.cs | 4 +- .../Memory/Internals/ManagedBufferBase.cs | 4 +- src/SixLabors.Core/Memory/MemoryAllocator.cs | 8 +- src/SixLabors.Core/Primitives/Point.cs | 48 +++++------ src/SixLabors.Core/Primitives/PointF.cs | 32 +++---- src/SixLabors.Core/Primitives/Rectangle.cs | 86 +++++++++---------- src/SixLabors.Core/Primitives/RectangleF.cs | 72 ++++++++-------- src/SixLabors.Core/Primitives/Size.cs | 40 ++++----- src/SixLabors.Core/Primitives/SizeF.cs | 22 ++--- .../Helpers/FloatRoundingComparer.cs | 4 +- .../Memory/ArrayPoolMemoryAllocatorTests.cs | 2 +- 19 files changed, 183 insertions(+), 183 deletions(-) diff --git a/src/SixLabors.Core/Constants.cs b/src/SixLabors.Core/Constants.cs index eda2f596f..b8699e2d1 100644 --- a/src/SixLabors.Core/Constants.cs +++ b/src/SixLabors.Core/Constants.cs @@ -4,7 +4,7 @@ namespace SixLabors { /// - /// Common constants used throughout the project + /// Common constants used throughout the project. /// internal static class Constants { diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index f1fc1c64c..bfc2a7a8d 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -18,8 +18,8 @@ namespace SixLabors /// /// The target object, which cannot be null. /// The name of the parameter that is to be checked. - /// is null - /// The type of the object to verify + /// is null. + /// The type of the object to verify. [Conditional("DEBUG")] public static void NotNull(T target, string parameterName) where T : class @@ -119,12 +119,12 @@ namespace SixLabors /// /// Verifies, that the `target` array has declared the length or longer. /// - /// The element type of the spans + /// The element type of the spans. /// The target array. /// The min length the array must have. /// The name of the parameter that is to be checked. /// - /// is true + /// is true. /// [Conditional("DEBUG")] public static void MustBeSizedAtLeast(T[] target, int minLength, string parameterName) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index b50cd4ab0..d6616aa78 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -118,7 +118,7 @@ namespace SixLabors /// /// Verifies, that the `target` span has the length of 'minLength', or longer. /// - /// The element type of the spans + /// The element type of the spans. /// The target span. /// The minimum length. /// The name of the parameter that is to be checked. diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index b0d760ade..d4a493a4f 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -219,7 +219,7 @@ namespace System /// parameter Return value Zero or positive The positive square root of . /// Negative Equals /// Equals - /// + /// . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sqrt(float f) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs index 0b0d6c4d4..5676ab23f 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -9,7 +9,7 @@ using SixLabors.Memory.Internals; namespace SixLabors.Memory { /// - /// Contains and + /// Contains and . /// public partial class ArrayPoolMemoryAllocator { @@ -20,7 +20,7 @@ namespace SixLabors.Memory where T : struct { /// - /// The length of the buffer + /// The length of the buffer. /// private readonly int length; diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs index c56453b00..dd6e9a8f0 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -32,7 +32,7 @@ namespace SixLabors.Memory /// /// This is the default. Should be good for most use cases. /// - /// The memory manager + /// The memory manager. public static ArrayPoolMemoryAllocator CreateDefault() { return new ArrayPoolMemoryAllocator( @@ -45,7 +45,7 @@ namespace SixLabors.Memory /// /// For environments with very limited memory capabilities, only small buffers like image rows are pooled. /// - /// The memory manager + /// The memory manager. public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() { return new ArrayPoolMemoryAllocator(64 * 1024, 32 * 1024, 8, 24); @@ -54,7 +54,7 @@ namespace SixLabors.Memory /// /// For environments with limited memory capabilities, only small array requests are pooled, which can result in reduced throughput. /// - /// The memory manager + /// The memory manager. public static ArrayPoolMemoryAllocator CreateWithModeratePooling() { return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); @@ -63,7 +63,7 @@ namespace SixLabors.Memory /// /// For environments where memory capabilities are not an issue, the maximum amount of array requests are pooled which results in optimal throughput. /// - /// The memory manager + /// The memory manager. public static ArrayPoolMemoryAllocator CreateWithAggressivePooling() { return new ArrayPoolMemoryAllocator(128 * 1024 * 1024, 32 * 1024 * 1024, 16, 32); diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs index 113e12785..0905948e0 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs @@ -58,8 +58,8 @@ namespace SixLabors.Memory /// /// The maximum size of pooled arrays. Arrays over the thershold are gonna be always allocated. /// The threshold to pool arrays in which has less buckets for memory safety. - /// Max arrays per bucket for the large array pool - /// Max arrays per bucket for the normal array pool + /// Max arrays per bucket for the large array pool. + /// Max arrays per bucket for the normal array pool. public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes, int poolSelectorThresholdInBytes, int maxArraysPerBucketLargePool, int maxArraysPerBucketNormalPool) { Guard.MustBeGreaterThan(maxPoolSizeInBytes, 0, nameof(maxPoolSizeInBytes)); diff --git a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs index bc12d7c2f..c0d36afd5 100644 --- a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs @@ -14,10 +14,10 @@ namespace SixLabors.Memory.Internals where T : struct { /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class. /// - /// The array - /// The length of the buffer + /// The array. + /// The length of the buffer. public BasicArrayBuffer(T[] array, int length) { DebugGuard.MustBeLessThanOrEqualTo(length, array.Length, nameof(length)); @@ -26,21 +26,21 @@ namespace SixLabors.Memory.Internals } /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class. /// - /// The array + /// The array. public BasicArrayBuffer(T[] array) : this(array, array.Length) { } /// - /// Gets the array + /// Gets the array. /// public T[] Array { get; } /// - /// Gets the length + /// Gets the length. /// public int Length { get; } diff --git a/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs index ee76c2ee3..fa6a5de4c 100644 --- a/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs @@ -9,9 +9,9 @@ namespace SixLabors.Memory.Internals internal sealed class BasicByteBuffer : BasicArrayBuffer, IManagedByteBuffer { /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class. /// - /// The byte array + /// The byte array. internal BasicByteBuffer(byte[] array) : base(array) { diff --git a/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs b/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs index 9dadcf5a2..e1f131693 100644 --- a/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs +++ b/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs @@ -9,7 +9,7 @@ namespace SixLabors.Memory.Internals /// /// Provides a base class for implementations by implementing pinning logic for adaption. /// - /// The element type + /// The element type. internal abstract class ManagedBufferBase : MemoryManager where T : struct { @@ -39,7 +39,7 @@ namespace SixLabors.Memory.Internals /// /// Gets the object that should be pinned. /// - /// The pinnable + /// The pinnable . protected abstract object GetPinnableObject(); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/MemoryAllocator.cs b/src/SixLabors.Core/Memory/MemoryAllocator.cs index 36ce8fcce..24ed7bef3 100644 --- a/src/SixLabors.Core/Memory/MemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/MemoryAllocator.cs @@ -13,8 +13,8 @@ namespace SixLabors.Memory /// /// Allocates an , holding a of length . /// - /// Type of the data stored in the buffer - /// Size of the buffer to allocate + /// Type of the data stored in the buffer. + /// Size of the buffer to allocate. /// The allocation options. /// A buffer of values of type . public abstract IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) @@ -23,9 +23,9 @@ namespace SixLabors.Memory /// /// Allocates an . /// - /// The requested buffer length + /// The requested buffer length. /// The allocation options. - /// The + /// The . public abstract IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None); /// diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 77ebb62f6..ec5733041 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -49,7 +49,7 @@ namespace SixLabors.Primitives /// /// Initializes a new instance of the struct from the given . /// - /// The size + /// The size. public Point(Size size) { this.X = size.Width; @@ -75,21 +75,21 @@ namespace SixLabors.Primitives /// /// Creates a with the coordinates of the specified . /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator PointF(Point point) => new PointF(point.X, point.Y); /// /// Creates a with the coordinates of the specified . /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Vector2(Point point) => new Vector2(point.X, point.Y); /// /// Creates a with the coordinates of the specified . /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Size(Point point) => new Size(point.X, point.Y); @@ -106,7 +106,7 @@ namespace SixLabors.Primitives /// The point on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point operator +(Point point, Size size) => Add(point, size); @@ -116,7 +116,7 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point operator -(Point point, Size size) => Subtract(point, size); @@ -172,16 +172,16 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Add(Point point, Size size) => new Point(unchecked(point.X + size.Width), unchecked(point.Y + size.Height)); /// - /// Translates a by the negative of a given value + /// Translates a by the negative of a given value. /// /// The point on the left hand of the operand. /// The value on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Multiply(Point point, int value) => new Point(unchecked(point.X * value), unchecked(point.Y * value)); @@ -190,56 +190,56 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Subtract(Point point, Size size) => new Point(unchecked(point.X - size.Width), unchecked(point.Y - size.Height)); /// /// Converts a to a by performing a ceiling operation on all the coordinates. /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Ceiling(PointF point) => new Point(unchecked((int)MathF.Ceiling(point.X)), unchecked((int)MathF.Ceiling(point.Y))); /// /// Converts a to a by performing a round operation on all the coordinates. /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); /// /// Converts a to a by performing a round operation on all the coordinates. /// - /// The vector - /// The + /// The vector. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); /// /// Converts a to a by performing a truncate operation on all the coordinates. /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Truncate(PointF point) => new Point(unchecked((int)point.X), unchecked((int)point.Y)); /// /// Transforms a point by a specified 3x2 matrix. /// - /// The point to transform - /// The transformation matrix used - /// The transformed + /// The point to transform. + /// The transformation matrix used. + /// The transformed . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Transform(Point point, Matrix3x2 matrix) => Round(Vector2.Transform(new Vector2(point.X, point.Y), matrix)); /// - /// Deconstructs this point into two integers + /// Deconstructs this point into two integers. /// - /// The out value for X - /// The out value for Y + /// The out value for X. + /// The out value for Y. public void Deconstruct(out int x, out int y) { x = this.X; diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 844a5f264..4a2da5cdc 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -38,7 +38,7 @@ namespace SixLabors.Primitives /// /// Initializes a new instance of the struct from the given . /// - /// The size + /// The size. public PointF(SizeF size) { this.X = size.Width; @@ -104,7 +104,7 @@ namespace SixLabors.Primitives /// The point on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator +(PointF point, SizeF size) => Add(point, size); @@ -114,7 +114,7 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator -(PointF point, PointF size) => Subtract(point, size); @@ -124,7 +124,7 @@ namespace SixLabors.Primitives /// The point on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator +(PointF point, PointF size) => Add(point, size); @@ -134,7 +134,7 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator -(PointF point, SizeF size) => Subtract(point, size); @@ -198,7 +198,7 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Add(PointF point, SizeF size) => new PointF(point.X + size.Width, point.Y + size.Height); @@ -207,7 +207,7 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The point on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Add(PointF point, PointF pointb) => new PointF(point.X + pointb.X, point.Y + pointb.Y); @@ -216,7 +216,7 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Subtract(PointF point, SizeF size) => new PointF(point.X - size.Width, point.Y - size.Height); @@ -225,7 +225,7 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The point on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Subtract(PointF point, PointF pointb) => new PointF(point.X - pointb.X, point.Y - pointb.Y); @@ -234,24 +234,24 @@ namespace SixLabors.Primitives /// /// The point on the left hand of the operand. /// The value on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Multiply(PointF point, float right) => new PointF(point.X * right, point.Y * right); /// /// Transforms a point by a specified 3x2 matrix. /// - /// The point to transform - /// The transformation matrix used - /// The transformed + /// The point to transform. + /// The transformation matrix used. + /// The transformed . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Transform(PointF point, Matrix3x2 matrix) => Vector2.Transform(point, matrix); /// - /// Deconstructs this point into two floats + /// Deconstructs this point into two floats. /// - /// The out value for X - /// The out value for Y + /// The out value for X. + /// The out value for Y. public void Deconstruct(out float x, out float y) { x = this.X; diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 239813ac7..8600e2e4c 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -145,14 +145,14 @@ namespace SixLabors.Primitives /// /// Creates a with the coordinates of the specified . /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator RectangleF(Rectangle rectangle) => new RectangleF(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); /// /// Creates a with the coordinates of the specified . /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Vector4(Rectangle rectangle) => new Vector4(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); @@ -180,21 +180,21 @@ namespace SixLabors.Primitives /// /// Creates a new with the specified location and size. - /// The left coordinate of the rectangle - /// The top coordinate of the rectangle - /// The right coordinate of the rectangle - /// The bottom coordinate of the rectangle - /// The + /// The left coordinate of the rectangle. + /// The top coordinate of the rectangle. + /// The right coordinate of the rectangle. + /// The bottom coordinate of the rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] // ReSharper disable once InconsistentNaming public static Rectangle FromLTRB(int left, int top, int right, int bottom) => new Rectangle(left, top, unchecked(right - left), unchecked(bottom - top)); /// - /// Returns the center point of the given + /// Returns the center point of the given . /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Center(Rectangle rectangle) => new Point(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); @@ -202,9 +202,9 @@ namespace SixLabors.Primitives /// Creates a rectangle that represents the intersection between and /// . If there is no intersection, an empty rectangle is returned. /// - /// The first rectangle - /// The second rectangle - /// The + /// The first rectangle. + /// The second rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Intersect(Rectangle a, Rectangle b) { @@ -224,10 +224,10 @@ namespace SixLabors.Primitives /// /// Creates a that is inflated by the specified amount. /// - /// The rectangle - /// The amount to inflate the width by - /// The amount to inflate the height by - /// A new + /// The rectangle. + /// The amount to inflate the width by. + /// The amount to inflate the height by. + /// A new . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Inflate(Rectangle rectangle, int x, int y) { @@ -239,8 +239,8 @@ namespace SixLabors.Primitives /// /// Converts a to a by performing a ceiling operation on all the coordinates. /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Ceiling(RectangleF rectangle) { @@ -270,8 +270,8 @@ namespace SixLabors.Primitives /// /// Converts a to a by performing a truncate operation on all the coordinates. /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Truncate(RectangleF rectangle) { @@ -288,8 +288,8 @@ namespace SixLabors.Primitives /// /// Converts a to a by performing a round operation on all the coordinates. /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Round(RectangleF rectangle) { @@ -306,9 +306,9 @@ namespace SixLabors.Primitives /// /// Creates a rectangle that represents the union between and . /// - /// The first rectangle - /// The second rectangle - /// The + /// The first rectangle. + /// The second rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Union(Rectangle a, Rectangle b) { @@ -321,12 +321,12 @@ namespace SixLabors.Primitives } /// - /// Deconstructs this rectangle into four integers + /// Deconstructs this rectangle into four integers. /// - /// The out value for X - /// The out value for Y - /// The out value for the width - /// The out value for the height + /// The out value for X. + /// The out value for Y. + /// The out value for the width. + /// The out value for the height. public void Deconstruct(out int x, out int y, out int width, out int height) { x = this.X; @@ -338,7 +338,7 @@ namespace SixLabors.Primitives /// /// Creates a Rectangle that represents the intersection between this Rectangle and the . /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Intersect(Rectangle rectangle) { @@ -353,8 +353,8 @@ namespace SixLabors.Primitives /// /// Inflates this by the specified amount. /// - /// The width - /// The height + /// The width. + /// The height. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Inflate(int width, int height) { @@ -371,7 +371,7 @@ namespace SixLabors.Primitives /// /// Inflates this by the specified amount. /// - /// The size + /// The size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Inflate(Size size) => this.Inflate(size.Width, size.Height); @@ -381,15 +381,15 @@ namespace SixLabors.Primitives /// /// The x-coordinate of the given point. /// The y-coordinate of the given point. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(int x, int y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; /// /// Determines if the specified point is contained within the rectangular region defined by this . /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(Point point) => this.Contains(point.X, point.Y); @@ -397,8 +397,8 @@ namespace SixLabors.Primitives /// Determines if the rectangular region represented by is entirely contained /// within the rectangular region represented by this . /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(Rectangle rectangle) => (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && @@ -408,8 +408,8 @@ namespace SixLabors.Primitives /// Determines if the specfied intersects the rectangular region defined by /// this . /// - /// The other Rectange - /// The + /// The other Rectange. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool IntersectsWith(Rectangle rectangle) => (rectangle.X < this.Right) && (this.X < rectangle.Right) && @@ -418,7 +418,7 @@ namespace SixLabors.Primitives /// /// Adjusts the location of this rectangle by the specified amount. /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Offset(Point point) => this.Offset(point.X, point.Y); diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index f212e5bcc..c8b58f4ed 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -145,7 +145,7 @@ namespace SixLabors.Primitives /// /// Creates a with the coordinates of the specified by truncating each coordinate. /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Rectangle(RectangleF rectangle) => Rectangle.Truncate(rectangle); @@ -173,21 +173,21 @@ namespace SixLabors.Primitives /// /// Creates a new with the specified location and size. - /// The left coordinate of the rectangle - /// The top coordinate of the rectangle - /// The right coordinate of the rectangle - /// The bottom coordinate of the rectangle - /// The + /// The left coordinate of the rectangle. + /// The top coordinate of the rectangle. + /// The right coordinate of the rectangle. + /// The bottom coordinate of the rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] // ReSharper disable once InconsistentNaming public static RectangleF FromLTRB(float left, float top, float right, float bottom) => new RectangleF(left, top, right - left, bottom - top); /// - /// Returns the center point of the given + /// Returns the center point of the given . /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Center(RectangleF rectangle) => new PointF(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); @@ -195,9 +195,9 @@ namespace SixLabors.Primitives /// Creates a rectangle that represents the intersection between and /// . If there is no intersection, an empty rectangle is returned. /// - /// The first rectangle - /// The second rectangle - /// The + /// The first rectangle. + /// The second rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RectangleF Intersect(RectangleF a, RectangleF b) { @@ -217,10 +217,10 @@ namespace SixLabors.Primitives /// /// Creates a that is inflated by the specified amount. /// - /// The rectangle - /// The amount to inflate the width by - /// The amount to inflate the height by - /// A new + /// The rectangle. + /// The amount to inflate the width by. + /// The amount to inflate the height by. + /// A new . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RectangleF Inflate(RectangleF rectangle, float x, float y) { @@ -245,9 +245,9 @@ namespace SixLabors.Primitives /// /// Creates a rectangle that represents the union between and . /// - /// The first rectangle - /// The second rectangle - /// The + /// The first rectangle. + /// The second rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RectangleF Union(RectangleF a, RectangleF b) { @@ -260,12 +260,12 @@ namespace SixLabors.Primitives } /// - /// Deconstructs this rectangle into four floats + /// Deconstructs this rectangle into four floats. /// - /// The out value for X - /// The out value for Y - /// The out value for the width - /// The out value for the height + /// The out value for X. + /// The out value for Y. + /// The out value for the width. + /// The out value for the height. public void Deconstruct(out float x, out float y, out float width, out float height) { x = this.X; @@ -277,7 +277,7 @@ namespace SixLabors.Primitives /// /// Creates a RectangleF that represents the intersection between this RectangleF and the . /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Intersect(RectangleF rectangle) { @@ -292,8 +292,8 @@ namespace SixLabors.Primitives /// /// Inflates this by the specified amount. /// - /// The width - /// The height + /// The width. + /// The height. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Inflate(float width, float height) { @@ -307,7 +307,7 @@ namespace SixLabors.Primitives /// /// Inflates this by the specified amount. /// - /// The size + /// The size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Inflate(SizeF size) => this.Inflate(size.Width, size.Height); @@ -317,15 +317,15 @@ namespace SixLabors.Primitives /// /// The x-coordinate of the given point. /// The y-coordinate of the given point. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(float x, float y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; /// /// Determines if the specified point is contained within the rectangular region defined by this . /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(PointF point) => this.Contains(point.X, point.Y); @@ -333,8 +333,8 @@ namespace SixLabors.Primitives /// Determines if the rectangular region represented by is entirely contained /// within the rectangular region represented by this . /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(RectangleF rectangle) => (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && @@ -344,8 +344,8 @@ namespace SixLabors.Primitives /// Determines if the specfied intersects the rectangular region defined by /// this . /// - /// The other Rectange - /// The + /// The other Rectange. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool IntersectsWith(RectangleF rectangle) => (rectangle.X < this.Right) && (this.X < rectangle.Right) && @@ -354,7 +354,7 @@ namespace SixLabors.Primitives /// /// Adjusts the location of this rectangle by the specified amount. /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Offset(PointF point) => this.Offset(point.X, point.Y); diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 0c468a80b..e0eb6484c 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -25,7 +25,7 @@ namespace SixLabors.Primitives /// /// Initializes a new instance of the struct. /// - /// The width and height of the size + /// The width and height of the size. public Size(int value) : this() { @@ -47,7 +47,7 @@ namespace SixLabors.Primitives /// /// Initializes a new instance of the struct. /// - /// The size + /// The size. public Size(Size size) : this() { @@ -58,7 +58,7 @@ namespace SixLabors.Primitives /// /// Initializes a new instance of the struct from the given . /// - /// The point + /// The point. public Size(Point point) { this.Width = point.X; @@ -84,14 +84,14 @@ namespace SixLabors.Primitives /// /// Creates a with the dimensions of the specified . /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator SizeF(Size size) => new SizeF(size.Width, size.Height); /// /// Converts the given into a . /// - /// The size + /// The size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Point(Size size) => new Point(size.Width, size.Height); @@ -101,7 +101,7 @@ namespace SixLabors.Primitives /// The size on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size operator +(Size left, Size right) => Add(left, right); @@ -112,7 +112,7 @@ namespace SixLabors.Primitives /// The size on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size operator -(Size left, Size right) => Subtract(left, right); @@ -201,39 +201,39 @@ namespace SixLabors.Primitives /// /// The size on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Add(Size left, Size right) => new Size(unchecked(left.Width + right.Width), unchecked(left.Height + right.Height)); /// - /// Contracts a by another + /// Contracts a by another . /// /// The size on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); /// /// Converts a to a by performing a ceiling operation on all the dimensions. /// - /// The size - /// The + /// The size. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Ceiling(SizeF size) => new Size(unchecked((int)MathF.Ceiling(size.Width)), unchecked((int)MathF.Ceiling(size.Height))); /// /// Converts a to a by performing a round operation on all the dimensions. /// - /// The size - /// The + /// The size. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Round(SizeF size) => new Size(unchecked((int)MathF.Round(size.Width)), unchecked((int)MathF.Round(size.Height))); /// /// Transforms a size by the given matrix. /// - /// The source size + /// The source size. /// The transformation matrix. /// A transformed size. public static SizeF Transform(Size size, Matrix3x2 matrix) @@ -246,16 +246,16 @@ namespace SixLabors.Primitives /// /// Converts a to a by performing a round operation on all the dimensions. /// - /// The size - /// The + /// The size. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); /// - /// Deconstructs this size into two integers + /// Deconstructs this size into two integers. /// - /// The out value for the width - /// The out value for the height + /// The out value for the width. + /// The out value for the height. public void Deconstruct(out int width, out int height) { width = this.Width; diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index b7e15b5e3..5d503a705 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -36,7 +36,7 @@ namespace SixLabors.Primitives /// /// Initializes a new instance of the struct. /// - /// The size + /// The size. public SizeF(SizeF size) : this() { @@ -47,7 +47,7 @@ namespace SixLabors.Primitives /// /// Initializes a new instance of the struct from the given . /// - /// The point + /// The point. public SizeF(PointF point) { this.Width = point.X; @@ -93,7 +93,7 @@ namespace SixLabors.Primitives /// /// Converts the given into a . /// - /// The size + /// The size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator PointF(SizeF size) => new PointF(size.Width, size.Height); @@ -103,7 +103,7 @@ namespace SixLabors.Primitives /// The size on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF operator +(SizeF left, SizeF right) => Add(left, right); @@ -114,7 +114,7 @@ namespace SixLabors.Primitives /// The size on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF operator -(SizeF left, SizeF right) => Subtract(left, right); @@ -171,16 +171,16 @@ namespace SixLabors.Primitives /// /// The size on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF Add(SizeF left, SizeF right) => new SizeF(left.Width + right.Width, left.Height + right.Height); /// - /// Contracts a by another + /// Contracts a by another . /// /// The size on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); @@ -198,10 +198,10 @@ namespace SixLabors.Primitives } /// - /// Deconstructs this size into two floats + /// Deconstructs this size into two floats. /// - /// The out value for the width - /// The out value for the height + /// The out value for the width. + /// The out value for the height. public void Deconstruct(out float width, out float height) { width = this.Width; diff --git a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs index a5c965b10..15220d4b1 100644 --- a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs +++ b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs @@ -15,7 +15,7 @@ namespace SixLabors.Tests.Helpers /// /// Initializes a new instance of the struct. /// - /// The number of decimal places (valid values: 0-7) + /// The number of decimal places (valid values: 0-7). public FloatRoundingComparer(int precision) { Guard.MustBeBetweenOrEqualTo(precision, 0, 7, nameof(precision)); @@ -23,7 +23,7 @@ namespace SixLabors.Tests.Helpers } /// - /// Gets the number of decimal places (valid values: 0-7) + /// Gets the number of decimal places (valid values: 0-7). /// public int Precision { get; } diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index e59590bae..6f95a4d78 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -22,7 +22,7 @@ namespace SixLabors.Memory.Tests new ArrayPoolMemoryAllocator(MaxPooledBufferSizeInBytes, PoolSelectorThresholdInBytes); /// - /// Rent a buffer -> return it -> re-rent -> verify if it's span points to the previous location + /// Rent a buffer -> return it -> re-rent -> verify if it's span points to the previous location. /// private bool CheckIsRentingPooledBuffer(int length) where T : struct From 124d34df96240083ad8c88fc1303e0a793f095a8 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:38:42 +0200 Subject: [PATCH 108/136] [SL.Core] Ignore StyleCop rules that demand a certain order. --- tests/SixLabors.ruleset | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/SixLabors.ruleset b/tests/SixLabors.ruleset index 972915712..a4fa8c4f7 100644 --- a/tests/SixLabors.ruleset +++ b/tests/SixLabors.ruleset @@ -5,6 +5,8 @@ + + From 55e8063645139f81a8b4d8c3194ebee4c49a99a1 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:41:42 +0200 Subject: [PATCH 109/136] [SL.Core] Correct the Assert.Equals order. --- tests/SixLabors.Core.Tests/Primitives/PointFTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/PointTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/SizeTests.cs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index 8535b3fb0..f78a18fc1 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -26,7 +26,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(PointF.Empty, default(PointF)); + Assert.Equal(default, PointF.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 6a873567b..7ad7f0b62 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -13,7 +13,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Point.Empty, default(Point)); + Assert.Equal(default, Point.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs index 926416ae5..f83f6435a 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs @@ -16,7 +16,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(RectangleF.Empty, default(RectangleF)); + Assert.Equal(default, RectangleF.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 8a00cd1fc..2f56b9ecd 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -15,7 +15,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Rectangle.Empty, default(Rectangle)); + Assert.Equal(default, Rectangle.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index 0545a93db..5bfc8f5ef 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -13,7 +13,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(SizeF.Empty, default(SizeF)); + Assert.Equal(default, SizeF.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs index 05f690603..af4b8430d 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs @@ -15,7 +15,7 @@ namespace SixLabors.Primitives.Tests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Size.Empty, default(Size)); + Assert.Equal(default, Size.Empty); } [Theory] From 930f3573ebeab62150b3397af92bfc7b45e9be27 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:43:25 +0200 Subject: [PATCH 110/136] [SL.Core] Use Assert.Contains instead. --- tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 4 ++-- tests/SixLabors.Core.Tests/Helpers/GuardTests.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 68416b47d..9b14fc8ca 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -59,7 +59,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be less than {max}.")); + Assert.Contains($"Value must be less than {max}.", exception.Message); } [Theory] @@ -79,7 +79,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be less than or equal to 1.")); + Assert.Contains($"Value must be less than or equal to 1.", exception.Message); } [Fact] diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index ecffd79da..d6ef967b8 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -25,7 +25,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be less than {max}.")); + Assert.Contains($"Value must be less than {max}.", exception.Message); } [Theory] @@ -45,7 +45,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be less than or equal to 1.")); + Assert.Contains($"Value must be less than or equal to 1.", exception.Message); } [Fact] @@ -85,7 +85,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); + Assert.Contains($"Value must be greater than or equal to 2.", exception.Message); } [Theory] From 5b32cb9a395bc28553d0a2034bbb0c3831440317 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:43:58 +0200 Subject: [PATCH 111/136] [SL.Core] Fixed StyleCop issues. --- .../Memory/ArrayPoolMemoryAllocatorTests.cs | 1 - .../SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index 6f95a4d78..6f72a076e 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. // ReSharper disable InconsistentNaming - using System; using System.Buffers; using System.Runtime.CompilerServices; diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs index 86e71717e..7b431126d 100644 --- a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs @@ -23,7 +23,7 @@ namespace SixLabors.Memory.Tests [InlineData(-1)] public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.Allocate( length)); + var ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); Assert.Equal("length", ex.ParamName); } From 3b84a040136ba4d60ec24ba9153686d85364f3a8 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 18:03:52 +0200 Subject: [PATCH 112/136] [SL.Core] Silence warning. --- src/SixLabors.Core/HashCode.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs index 73d4b3574..b93d4a97f 100644 --- a/src/SixLabors.Core/HashCode.cs +++ b/src/SixLabors.Core/HashCode.cs @@ -44,6 +44,7 @@ https://raw.githubusercontent.com/Cyan4973/xxHash/5c174cfa4e45a42f94082dc0d4539b #if SUPPORTS_HASHCODE using System.Runtime.CompilerServices; + [assembly: TypeForwardedTo(typeof(System.HashCode))] #else using System.Buffers.Binary; From 38cfae872c46b34c41bb4542cd17683dfee69b45 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 18:04:24 +0200 Subject: [PATCH 113/136] [SL.Core] Added LangVersion to the unit test project. --- tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index f1b5839fc..55951fb43 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -15,6 +15,7 @@ full SixLabors.Tests true + 7.3 From 20aef1b6da6ec581b2402a2ed648c63baf225172 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:04:35 +0200 Subject: [PATCH 114/136] [SL.Core] Extend Guard and DebugGuard --- src/SixLabors.Core/Helpers/DebugGuard.cs | 217 ++++++++++++++++-- src/SixLabors.Core/Helpers/Guard.cs | 217 ++++++++++++++++-- .../Helpers/GuardTests.cs | 102 +++++++- 3 files changed, 484 insertions(+), 52 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index bfc2a7a8d..c7fb796b3 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using System.Runtime.CompilerServices; namespace SixLabors { @@ -13,26 +14,47 @@ namespace SixLabors internal static class DebugGuard { /// - /// Verifies, that the method parameter with specified object value is not null - /// and throws an exception if it is found to be so. + /// Ensures that the value is not null. /// - /// The target object, which cannot be null. + /// The target object, which cannot be null. /// The name of the parameter that is to be checked. - /// is null. - /// The type of the object to verify. + /// The type of the value. + /// is null. [Conditional("DEBUG")] - public static void NotNull(T target, string parameterName) - where T : class + [DebuggerStepThrough] + public static void NotNull(TValue value, string parameterName) + where TValue : class { - if (target is null) + if (value is null) { - throw new ArgumentNullException(parameterName); + ThrowArgumentNullException(parameterName); } } /// - /// Verifies that the specified value is less than a maximum value - /// and throws an exception if it is not. + /// Ensures that the target value is not null, empty, or whitespace. + /// + /// The target string, which should be checked against being null or empty. + /// Name of the parameter. + /// is null. + /// is empty or contains only blanks. + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void NotNullOrWhiteSpace(string value, string parameterName) + { + if (value is null) + { + ThrowArgumentNullException(parameterName); + } + + if (string.IsNullOrWhiteSpace(value)) + { + ThrowArgumentException("Must not be empty or whitespace.", parameterName); + } + } + + /// + /// Ensures that the specified value is less than a maximum value. /// /// The target value, which should be validated. /// The maximum value. @@ -42,12 +64,13 @@ namespace SixLabors /// is greater than the maximum value. /// [Conditional("DEBUG")] + [DebuggerStepThrough] public static void MustBeLessThan(TValue value, TValue max, string parameterName) where TValue : IComparable { if (value.CompareTo(max) >= 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than {max}."); } } @@ -63,12 +86,13 @@ namespace SixLabors /// is greater than the maximum value. /// [Conditional("DEBUG")] + [DebuggerStepThrough] public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) where TValue : IComparable { if (value.CompareTo(max) > 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than or equal to {max}."); } } @@ -84,14 +108,15 @@ namespace SixLabors /// is less than the minimum value. /// [Conditional("DEBUG")] + [DebuggerStepThrough] public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) where TValue : IComparable { if (value.CompareTo(min) <= 0) { - throw new ArgumentOutOfRangeException( + ThrowArgumentOutOfRangeException( parameterName, - $"Value must be greater than {min}."); + $"Value {value} must be greater than {min}."); } } @@ -107,33 +132,177 @@ namespace SixLabors /// is less than the minimum value. /// [Conditional("DEBUG")] + [DebuggerStepThrough] public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) where TValue : IComparable { if (value.CompareTo(min) < 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min}."); } } /// - /// Verifies, that the `target` array has declared the length or longer. + /// Verifies that the specified value is greater than or equal to a minimum value and less than + /// or equal to a maximum value and throws an exception if it is not. /// - /// The element type of the spans. - /// The target array. - /// The min length the array must have. + /// The target value, which should be validated. + /// The minimum value. + /// The maximum value. /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value of greater than the maximum value. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) + { + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min} and less than or equal to {max}."); + } + } + + /// + /// Verifies, that the method parameter with specified target value is true + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be false. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is false. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void IsTrue(bool target, string parameterName, string message) + { + if (!target) + { + ThrowArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the method parameter with specified target value is false + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be true. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. /// /// is true. /// [Conditional("DEBUG")] - public static void MustBeSizedAtLeast(T[] target, int minLength, string parameterName) - where T : struct + [DebuggerStepThrough] + public static void IsFalse(bool target, string parameterName, string message) { - if (target.Length < minLength) + if (target) { - throw new ArgumentException($"The size must be at least {minLength}.", parameterName); + ThrowArgumentException(message, parameterName); } } + + /// + /// Verifies, that the `source` span has the length of 'minLength', or longer. + /// + /// The element type of the spans. + /// The source span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// has less than items. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName) + { + if (source.Length < minLength) + { + ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); + } + } + + /// + /// Verifies that the 'destination' span is not shorter than 'source'. + /// + /// The source element type. + /// The destination element type. + /// The source span. + /// The destination span. + /// The name of the argument for 'destination'. + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void DestinationShouldNotBeTooShort( + ReadOnlySpan source, + Span destination, + string destinationParamName) + { + if (destination.Length < source.Length) + { + ThrowArgumentException($"Destination span is too short!", destinationParamName); + } + } + + /// + /// Verifies that the 'destination' span is not shorter than 'source'. + /// + /// The source element type. + /// The destination element type. + /// The source span. + /// The destination span. + /// The name of the argument for 'destination'. + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void DestinationShouldNotBeTooShort( + Span source, + Span destination, + string destinationParamName) + { + if (destination.Length < source.Length) + { + ThrowArgumentException($"Destination span is too short!", destinationParamName); + } + } + + /// + /// Verifies, that the `source` span has the length of 'minLength', or longer. + /// + /// The element type of the spans. + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// has less than items. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) + { + if (source.Length < minLength) + { + ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentException(string message, string parameterName) + { + throw new ArgumentException(message, parameterName); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentOutOfRangeException(string parameterName, string message) + { + throw new ArgumentOutOfRangeException(parameterName, message); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentNullException(string parameterName) + { + throw new ArgumentNullException(parameterName); + } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index d6616aa78..09c8675d3 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; +using System.Runtime.CompilerServices; namespace SixLabors { @@ -15,22 +15,63 @@ namespace SixLabors internal static class Guard { /// - /// Verifies that the specified value is less than a maximum value - /// and throws an exception if it is not. + /// Ensures that the value is not null. + /// + /// The target object, which cannot be null. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// is null. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void NotNull(TValue value, string parameterName) + where TValue : class + { + if (value is null) + { + ThrowArgumentNullException(parameterName); + } + } + + /// + /// Ensures that the target value is not null, empty, or whitespace. + /// + /// The target string, which should be checked against being null or empty. + /// Name of the parameter. + /// is null. + /// is empty or contains only blanks. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void NotNullOrWhiteSpace(string value, string parameterName) + { + if (value is null) + { + ThrowArgumentNullException(parameterName); + } + + if (string.IsNullOrWhiteSpace(value)) + { + ThrowArgumentException("Must not be empty or whitespace.", parameterName); + } + } + + /// + /// Ensures that the specified value is less than a maximum value. /// /// The target value, which should be validated. /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is greater than the maximum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeLessThan(TValue value, TValue max, string parameterName) - where TValue : IComparable + where TValue : IComparable { if (value.CompareTo(max) >= 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than {max}."); } } @@ -42,15 +83,17 @@ namespace SixLabors /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is greater than the maximum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) - where TValue : IComparable + where TValue : IComparable { if (value.CompareTo(max) > 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than or equal to {max}."); } } @@ -62,15 +105,19 @@ namespace SixLabors /// The minimum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) where TValue : IComparable { if (value.CompareTo(min) <= 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than {min}."); + ThrowArgumentOutOfRangeException( + parameterName, + $"Value {value} must be greater than {min}."); } } @@ -82,15 +129,17 @@ namespace SixLabors /// The minimum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) where TValue : IComparable { if (value.CompareTo(min) < 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min}."); } } @@ -103,34 +152,158 @@ namespace SixLabors /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value of greater than the maximum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) where TValue : IComparable { if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min} and less than or equal to {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min} and less than or equal to {max}."); + } + } + + /// + /// Verifies, that the method parameter with specified target value is true + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be false. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void IsTrue(bool target, string parameterName, string message) + { + if (!target) + { + ThrowArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the method parameter with specified target value is false + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be true. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is true. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void IsFalse(bool target, string parameterName, string message) + { + if (target) + { + ThrowArgumentException(message, parameterName); } } /// - /// Verifies, that the `target` span has the length of 'minLength', or longer. + /// Verifies, that the `source` span has the length of 'minLength', or longer. /// /// The element type of the spans. - /// The target span. + /// The source span. /// The minimum length. /// The name of the parameter that is to be checked. /// - /// The length of is less than . + /// has less than items. /// - public static void MustBeSizedAtLeast(T[] value, int minLength, string parameterName) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName) { - if (value.Length < minLength) + if (source.Length < minLength) { - throw new ArgumentException($"The size must be at least {minLength}.", parameterName); + ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); } } + + /// + /// Verifies, that the `source` span has the length of 'minLength', or longer. + /// + /// The element type of the spans. + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// has less than items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) + { + if (source.Length < minLength) + { + ThrowArgumentException($"The size must be at least {minLength}.", parameterName); + } + } + + /// + /// Verifies that the 'destination' span is not shorter than 'source'. + /// + /// The source element type. + /// The destination element type. + /// The source span. + /// The destination span. + /// The name of the argument for 'destination'. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void DestinationShouldNotBeTooShort( + ReadOnlySpan source, + Span destination, + string destinationParamName) + { + if (destination.Length < source.Length) + { + ThrowArgumentException($"Destination span is too short!", destinationParamName); + } + } + + /// + /// Verifies that the 'destination' span is not shorter than 'source'. + /// + /// The source element type. + /// The destination element type. + /// The source span. + /// The destination span. + /// The name of the argument for 'destination'. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void DestinationShouldNotBeTooShort( + Span source, + Span destination, + string destinationParamName) + { + if (destination.Length < source.Length) + { + ThrowArgumentException($"Destination span is too short!", destinationParamName); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentException(string message, string parameterName) + { + throw new ArgumentException(message, parameterName); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentOutOfRangeException(string parameterName, string message) + { + throw new ArgumentOutOfRangeException(parameterName, message); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentNullException(string parameterName) + { + throw new ArgumentNullException(parameterName); + } } -} \ No newline at end of file +} diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index d6ef967b8..bed743767 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -8,6 +8,96 @@ namespace SixLabors.Helpers.Tests { public class GuardTests { + private class Foo + { + } + + [Fact] + public void NotNull_WhenNull_Throws() + { + Foo foo = null; + Assert.Throws(() => Guard.NotNull(foo, nameof(foo))); + } + + [Fact] + public void NotNull_NotNull() + { + Foo foo = new Foo(); + Guard.NotNull(foo, nameof(foo)); + } + + [Theory] + [InlineData(null, true)] + [InlineData("", true)] + [InlineData(" ", true)] + [InlineData("$", false)] + [InlineData("lol", false)] + public void NotNullOrWhiteSpace(string str, bool shouldThrow) + { + if (shouldThrow) + { + Assert.ThrowsAny(() => Guard.NotNullOrWhiteSpace(str, nameof(str))); + } + else + { + Guard.NotNullOrWhiteSpace(str, nameof(str)); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void IsTrue(bool value) + { + if (!value) + { + Assert.Throws(() => Guard.IsTrue(value, nameof(value), "Boo!")); + } + else + { + Guard.IsTrue(value, nameof(value), "Boo."); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void IsFalse(bool value) + { + if (value) + { + Assert.Throws(() => Guard.IsFalse(value, nameof(value), "Boo!")); + } + else + { + Guard.IsFalse(value, nameof(value), "Boo."); + } + } + + [Theory] + [InlineData(0, 0, false)] + [InlineData(1, 1, false)] + [InlineData(1, 0, false)] + [InlineData(13, 13, false)] + [InlineData(20, 13, false)] + [InlineData(12, 13, true)] + [InlineData(0, 1, true)] + public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) + { + int[] data = new int[length]; + + if (shouldThrow) + { + Assert.Throws(() => Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data))); + Assert.Throws(() => Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data))); + } + else + { + Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data)); + Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data)); + } + } + [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { @@ -25,7 +115,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be less than {max}.", exception.Message); + Assert.Contains($"Value {value} must be less than {max}.", exception.Message); } [Theory] @@ -45,7 +135,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be less than or equal to 1.", exception.Message); + Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); } [Fact] @@ -65,7 +155,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than {min}.", exception.Message); + Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); } [Theory] @@ -85,7 +175,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than or equal to 2.", exception.Message); + Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); } [Theory] @@ -108,7 +198,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.", exception.Message); + Assert.Contains($"Value {value} must be greater than or equal to {min} and less than or equal to {max}.", exception.Message); } [Theory] @@ -128,7 +218,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains("The size must be at least 3.", exception.Message); + Assert.Contains("The size must be at least 3", exception.Message); } } } From ff972defaf9c18288519e0dc3a9cca9e19c1a921 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:17:30 +0200 Subject: [PATCH 115/136] [SL.Core] harmonize Guard + DebugGuard code and tests --- src/SixLabors.Core/Helpers/DebugGuard.cs | 42 +++---- .../Helpers/DebugGuardTests.cs | 119 ++++++++++++++++-- .../Helpers/GuardTests.cs | 40 ++++-- 3 files changed, 162 insertions(+), 39 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index c7fb796b3..31d7d23f2 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -13,7 +13,7 @@ namespace SixLabors [DebuggerStepThrough] internal static class DebugGuard { - /// + /// /// Ensures that the value is not null. /// /// The target object, which cannot be null. @@ -225,6 +225,26 @@ namespace SixLabors } } + /// + /// Verifies, that the `source` span has the length of 'minLength', or longer. + /// + /// The element type of the spans. + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// has less than items. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) + { + if (source.Length < minLength) + { + ThrowArgumentException($"The size must be at least {minLength}.", parameterName); + } + } + /// /// Verifies that the 'destination' span is not shorter than 'source'. /// @@ -267,26 +287,6 @@ namespace SixLabors } } - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The target span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); - } - } - [MethodImpl(MethodImplOptions.NoInlining)] private static void ThrowArgumentException(string message, string parameterName) { diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 9b14fc8ca..3db5642d1 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -14,6 +14,10 @@ namespace SixLabors.Helpers.Tests { public class DebugGuardTests { + private class Foo + { + } + [Fact] public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() { @@ -28,18 +32,113 @@ namespace SixLabors.Helpers.Tests } [Fact] - public void NotNull_TargetNotNull_ThrowsNoException() + public void NotNull_WhenNull_Throws() { - DebugGuard.NotNull("test", "myParamName"); + Foo foo = null; + Assert.Throws(() => Guard.NotNull(foo, nameof(foo))); } [Fact] - public void NotNull_TargetNull_ThrowsException() + public void NotNull_WhenNotNull() + { + Foo foo = new Foo(); + Guard.NotNull(foo, nameof(foo)); + } + + [Theory] + [InlineData(null, true)] + [InlineData("", true)] + [InlineData(" ", true)] + [InlineData("$", false)] + [InlineData("lol", false)] + public void NotNullOrWhiteSpace(string str, bool shouldThrow) { - Assert.Throws(() => + if (shouldThrow) { - DebugGuard.NotNull((object)null, "myParamName"); - }); + Assert.ThrowsAny(() => Guard.NotNullOrWhiteSpace(str, nameof(str))); + } + else + { + Guard.NotNullOrWhiteSpace(str, nameof(str)); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void IsTrue(bool value) + { + if (!value) + { + Assert.Throws(() => Guard.IsTrue(value, nameof(value), "Boo!")); + } + else + { + Guard.IsTrue(value, nameof(value), "Boo."); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void IsFalse(bool value) + { + if (value) + { + Assert.Throws(() => Guard.IsFalse(value, nameof(value), "Boo!")); + } + else + { + Guard.IsFalse(value, nameof(value), "Boo."); + } + } + + public static readonly TheoryData SizeCheckData = new TheoryData + { + { 0, 0, false }, + { 1, 1, false }, + { 1, 0, false }, + { 13, 13, false }, + { 20, 13, false }, + { 12, 13, true }, + { 0, 1, true }, + }; + + [Theory] + [MemberData(nameof(SizeCheckData))] + public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) + { + int[] data = new int[length]; + + if (shouldThrow) + { + Assert.Throws(() => Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data))); + Assert.Throws(() => Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data))); + } + else + { + Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data)); + Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data)); + } + } + + [Theory] + [MemberData(nameof(SizeCheckData))] + public void DestinationShouldNotBeTooShort(int destLength, int sourceLength, bool shouldThrow) + { + int[] dest = new int[destLength]; + int[] source = new int[sourceLength]; + + if (shouldThrow) + { + Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest))); + Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest))); + } + else + { + Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest)); + Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest)); + } } [Fact] @@ -59,7 +158,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be less than {max}.", exception.Message); + Assert.Contains($"Value {value} must be less than {max}.", exception.Message); } [Theory] @@ -79,7 +178,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be less than or equal to 1.", exception.Message); + Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); } [Fact] @@ -99,7 +198,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than {min}.", exception.Message); + Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); } [Theory] @@ -119,7 +218,7 @@ namespace SixLabors.Helpers.Tests }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than or equal to 2.", exception.Message); + Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index bed743767..a35668c38 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -20,7 +20,7 @@ namespace SixLabors.Helpers.Tests } [Fact] - public void NotNull_NotNull() + public void NotNull_WhenNotNull() { Foo foo = new Foo(); Guard.NotNull(foo, nameof(foo)); @@ -74,14 +74,19 @@ namespace SixLabors.Helpers.Tests } } + public static readonly TheoryData SizeCheckData = new TheoryData + { + { 0, 0, false }, + { 1, 1, false }, + { 1, 0, false }, + { 13, 13, false }, + { 20, 13, false }, + { 12, 13, true }, + { 0, 1, true }, + }; + [Theory] - [InlineData(0, 0, false)] - [InlineData(1, 1, false)] - [InlineData(1, 0, false)] - [InlineData(13, 13, false)] - [InlineData(20, 13, false)] - [InlineData(12, 13, true)] - [InlineData(0, 1, true)] + [MemberData(nameof(SizeCheckData))] public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) { int[] data = new int[length]; @@ -98,6 +103,25 @@ namespace SixLabors.Helpers.Tests } } + [Theory] + [MemberData(nameof(SizeCheckData))] + public void DestinationShouldNotBeTooShort(int destLength, int sourceLength, bool shouldThrow) + { + int[] dest = new int[destLength]; + int[] source = new int[sourceLength]; + + if (shouldThrow) + { + Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest))); + Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest))); + } + else + { + Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest)); + Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest)); + } + } + [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { From e4beee618d8a561ecee9f2bd85717d1f7192522a Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:32:46 +0200 Subject: [PATCH 116/136] [SL.Core] import standards submodule --- .gitmodules | 3 +++ standards | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 standards diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..b82e14d8d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "standards"] + path = standards + url = https://github.com/SixLabors/Standards.git diff --git a/standards b/standards new file mode 160000 index 000000000..8b085c0ec --- /dev/null +++ b/standards @@ -0,0 +1 @@ +Subproject commit 8b085c0ec4fb64797b9965741f7138f8f66a6b44 From b169e9252f4220b1722eeb9b53371ea7de9db7cd Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:34:04 +0200 Subject: [PATCH 117/136] [SL.Core] temporarily redirect "standards" to af/shared-guard branch --- standards | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/standards b/standards index 8b085c0ec..4e6ebb923 160000 --- a/standards +++ b/standards @@ -1 +1 @@ -Subproject commit 8b085c0ec4fb64797b9965741f7138f8f66a6b44 +Subproject commit 4e6ebb923f20a5280ada67aad1fa7478f45c44cc From eb40549006149c0f4be019d0131ec82ffab66b28 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:41:28 +0200 Subject: [PATCH 118/136] [SL.Core] use shared guards from standards --- src/SixLabors.Core/Helpers/DebugGuard.cs | 308 ---------------------- src/SixLabors.Core/Helpers/Guard.cs | 309 ----------------------- src/SixLabors.Core/SixLabors.Core.csproj | 10 +- standards | 2 +- 4 files changed, 10 insertions(+), 619 deletions(-) delete mode 100644 src/SixLabors.Core/Helpers/DebugGuard.cs delete mode 100644 src/SixLabors.Core/Helpers/Guard.cs diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs deleted file mode 100644 index 31d7d23f2..000000000 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace SixLabors -{ - /// - /// Provides methods to protect against invalid parameters for a DEBUG build. - /// - [DebuggerStepThrough] - internal static class DebugGuard - { - /// - /// Ensures that the value is not null. - /// - /// The target object, which cannot be null. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// is null. - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void NotNull(TValue value, string parameterName) - where TValue : class - { - if (value is null) - { - ThrowArgumentNullException(parameterName); - } - } - - /// - /// Ensures that the target value is not null, empty, or whitespace. - /// - /// The target string, which should be checked against being null or empty. - /// Name of the parameter. - /// is null. - /// is empty or contains only blanks. - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void NotNullOrWhiteSpace(string value, string parameterName) - { - if (value is null) - { - ThrowArgumentNullException(parameterName); - } - - if (string.IsNullOrWhiteSpace(value)) - { - ThrowArgumentException("Must not be empty or whitespace.", parameterName); - } - } - - /// - /// Ensures that the specified value is less than a maximum value. - /// - /// The target value, which should be validated. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is greater than the maximum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeLessThan(TValue value, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(max) >= 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than {max}."); - } - } - - /// - /// Verifies that the specified value is less than or equal to a maximum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is greater than the maximum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(max) > 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than or equal to {max}."); - } - } - - /// - /// Verifies that the specified value is greater than a minimum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) <= 0) - { - ThrowArgumentOutOfRangeException( - parameterName, - $"Value {value} must be greater than {min}."); - } - } - - /// - /// Verifies that the specified value is greater than or equal to a minimum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) < 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min}."); - } - } - - /// - /// Verifies that the specified value is greater than or equal to a minimum value and less than - /// or equal to a maximum value and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value of greater than the maximum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min} and less than or equal to {max}."); - } - } - - /// - /// Verifies, that the method parameter with specified target value is true - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be false. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is false. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void IsTrue(bool target, string parameterName, string message) - { - if (!target) - { - ThrowArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the method parameter with specified target value is false - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be true. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is true. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void IsFalse(bool target, string parameterName, string message) - { - if (target) - { - ThrowArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The source span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); - } - } - - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The target span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"The size must be at least {minLength}.", parameterName); - } - } - - /// - /// Verifies that the 'destination' span is not shorter than 'source'. - /// - /// The source element type. - /// The destination element type. - /// The source span. - /// The destination span. - /// The name of the argument for 'destination'. - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void DestinationShouldNotBeTooShort( - ReadOnlySpan source, - Span destination, - string destinationParamName) - { - if (destination.Length < source.Length) - { - ThrowArgumentException($"Destination span is too short!", destinationParamName); - } - } - - /// - /// Verifies that the 'destination' span is not shorter than 'source'. - /// - /// The source element type. - /// The destination element type. - /// The source span. - /// The destination span. - /// The name of the argument for 'destination'. - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void DestinationShouldNotBeTooShort( - Span source, - Span destination, - string destinationParamName) - { - if (destination.Length < source.Length) - { - ThrowArgumentException($"Destination span is too short!", destinationParamName); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentException(string message, string parameterName) - { - throw new ArgumentException(message, parameterName); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentOutOfRangeException(string parameterName, string message) - { - throw new ArgumentOutOfRangeException(parameterName, message); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentNullException(string parameterName) - { - throw new ArgumentNullException(parameterName); - } - } -} \ No newline at end of file diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs deleted file mode 100644 index 09c8675d3..000000000 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace SixLabors -{ - /// - /// Provides methods to protect against invalid parameters. - /// - [DebuggerStepThrough] - internal static class Guard - { - /// - /// Ensures that the value is not null. - /// - /// The target object, which cannot be null. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// is null. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void NotNull(TValue value, string parameterName) - where TValue : class - { - if (value is null) - { - ThrowArgumentNullException(parameterName); - } - } - - /// - /// Ensures that the target value is not null, empty, or whitespace. - /// - /// The target string, which should be checked against being null or empty. - /// Name of the parameter. - /// is null. - /// is empty or contains only blanks. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void NotNullOrWhiteSpace(string value, string parameterName) - { - if (value is null) - { - ThrowArgumentNullException(parameterName); - } - - if (string.IsNullOrWhiteSpace(value)) - { - ThrowArgumentException("Must not be empty or whitespace.", parameterName); - } - } - - /// - /// Ensures that the specified value is less than a maximum value. - /// - /// The target value, which should be validated. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is greater than the maximum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeLessThan(TValue value, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(max) >= 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than {max}."); - } - } - - /// - /// Verifies that the specified value is less than or equal to a maximum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is greater than the maximum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(max) > 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than or equal to {max}."); - } - } - - /// - /// Verifies that the specified value is greater than a minimum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) <= 0) - { - ThrowArgumentOutOfRangeException( - parameterName, - $"Value {value} must be greater than {min}."); - } - } - - /// - /// Verifies that the specified value is greater than or equal to a minimum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) < 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min}."); - } - } - - /// - /// Verifies that the specified value is greater than or equal to a minimum value and less than - /// or equal to a maximum value and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value of greater than the maximum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min} and less than or equal to {max}."); - } - } - - /// - /// Verifies, that the method parameter with specified target value is true - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be false. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is false. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void IsTrue(bool target, string parameterName, string message) - { - if (!target) - { - ThrowArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the method parameter with specified target value is false - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be true. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is true. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void IsFalse(bool target, string parameterName, string message) - { - if (target) - { - ThrowArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The source span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); - } - } - - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The target span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"The size must be at least {minLength}.", parameterName); - } - } - - /// - /// Verifies that the 'destination' span is not shorter than 'source'. - /// - /// The source element type. - /// The destination element type. - /// The source span. - /// The destination span. - /// The name of the argument for 'destination'. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void DestinationShouldNotBeTooShort( - ReadOnlySpan source, - Span destination, - string destinationParamName) - { - if (destination.Length < source.Length) - { - ThrowArgumentException($"Destination span is too short!", destinationParamName); - } - } - - /// - /// Verifies that the 'destination' span is not shorter than 'source'. - /// - /// The source element type. - /// The destination element type. - /// The source span. - /// The destination span. - /// The name of the argument for 'destination'. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void DestinationShouldNotBeTooShort( - Span source, - Span destination, - string destinationParamName) - { - if (destination.Length < source.Length) - { - ThrowArgumentException($"Destination span is too short!", destinationParamName); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentException(string message, string parameterName) - { - throw new ArgumentException(message, parameterName); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentOutOfRangeException(string parameterName, string message) - { - throw new ArgumentOutOfRangeException(parameterName, message); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentNullException(string parameterName) - { - throw new ArgumentNullException(parameterName); - } - } -} diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 0c6c537f4..61b8fa4b6 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -34,7 +34,11 @@ $(DefineConstants);SUPPORTS_HASHCODE - + + + + + All @@ -55,4 +59,8 @@ + + + + diff --git a/standards b/standards index 4e6ebb923..948a02984 160000 --- a/standards +++ b/standards @@ -1 +1 @@ -Subproject commit 4e6ebb923f20a5280ada67aad1fa7478f45c44cc +Subproject commit 948a02984c6b62dca1c40b02b289f6d1c13d79b1 From 56277c4735ac19dab2db03cdfe40a415cd582616 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 18:08:43 +0200 Subject: [PATCH 119/136] [SL.Core] do not share internals across SixLabors projects --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 92c683b13..241c0fe99 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -4,12 +4,4 @@ using System.Runtime.CompilerServices; // Ensure the internals can be tested. -[assembly: InternalsVisibleTo("SixLabors.Core.Tests")] - -// Ensure the internals are visible to the other projects. -[assembly: InternalsVisibleTo("SixLabors.Exif")] -[assembly: InternalsVisibleTo("SixLabors.Fonts")] -[assembly: InternalsVisibleTo("SixLabors.ImageSharp")] -[assembly: InternalsVisibleTo("SixLabors.ImageSharp.Drawing")] -[assembly: InternalsVisibleTo("SixLabors.Shapes")] -[assembly: InternalsVisibleTo("SixLabors.Shapes.Text")] \ No newline at end of file +[assembly: InternalsVisibleTo("SixLabors.Core.Tests")] \ No newline at end of file From 4de4e5bfebed9a884fccd05877503a1891ac0533 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 18:23:27 +0200 Subject: [PATCH 120/136] [SL.Core] hope we can drop travis soon --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 016a9ee37..3c301a196 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,6 +3,7 @@ image: Visual Studio 2017 before_build: + - git submodule -q update --init - cmd: dotnet --version build_script: From bfbda9863306a98c9dea8dd5c94e9d0334b79d76 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 20:34:17 +0200 Subject: [PATCH 121/136] [SL.Core] update submodule --- standards | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/standards b/standards index 948a02984..30e6fe889 160000 --- a/standards +++ b/standards @@ -1 +1 @@ -Subproject commit 948a02984c6b62dca1c40b02b289f6d1c13d79b1 +Subproject commit 30e6fe889dd8005634496c4d8aac85ab01f62c1d From c97def9117284aea55f635616a2aea745fc866a0 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 20:42:35 +0200 Subject: [PATCH 122/136] [SL.Core] update submodule --- standards | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/standards b/standards index 30e6fe889..10fa2a5d9 160000 --- a/standards +++ b/standards @@ -1 +1 @@ -Subproject commit 30e6fe889dd8005634496c4d8aac85ab01f62c1d +Subproject commit 10fa2a5d9f3e16ff01faa857b6eaf7833a7163ca From 29046532a299ac497f875e8987b43a0e649ae050 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 29 Aug 2019 22:52:42 +0200 Subject: [PATCH 123/136] [SL.Core] Standards -> SharedInfrastructure --- .gitmodules | 6 +++--- standards => shared-infrastructure | 0 src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename standards => shared-infrastructure (100%) diff --git a/.gitmodules b/.gitmodules index b82e14d8d..f560cd590 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "standards"] - path = standards - url = https://github.com/SixLabors/Standards.git +[submodule "shared-infrastructure"] + path = shared-infrastructure + url = https://github.com/SixLabors/SharedInfrastructure.git diff --git a/standards b/shared-infrastructure similarity index 100% rename from standards rename to shared-infrastructure diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 61b8fa4b6..eafe9824e 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -36,7 +36,7 @@ - + From 278a79e5009149f72e03e13d9b025395e6d810f7 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 29 Aug 2019 23:37:46 +0200 Subject: [PATCH 124/136] [SL.Core] use shared .editorconfig and stylecop.json --- .editorconfig | 3 --- SixLabors.Core.sln | 2 +- src/SixLabors.Core/SixLabors.Core.csproj | 14 +++++++++----- stylecop.json | 15 --------------- .../SixLabors.Core.Tests.csproj | 3 +-- 5 files changed, 11 insertions(+), 26 deletions(-) delete mode 100644 .editorconfig delete mode 100644 stylecop.json diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index f39b26725..000000000 --- a/.editorconfig +++ /dev/null @@ -1,3 +0,0 @@ -[*.cs] -indent_style = space -indent_size = 4 diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index 040ce0688..a796a9eba 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -5,7 +5,6 @@ VisualStudioVersion = 16.0.28803.352 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig appveyor.yml = appveyor.yml .github\ISSUE_TEMPLATE\ask-question.md = .github\ISSUE_TEMPLATE\ask-question.md .github\ISSUE_TEMPLATE\bug-report.md = .github\ISSUE_TEMPLATE\bug-report.md @@ -16,6 +15,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionIt gitversion.yml = gitversion.yml .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md README.md = README.md + shared-infrastructure\.editorconfig = shared-infrastructure\.editorconfig EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C0625-CD3D-440F-9F80-2D83856AB7AE}" diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index eafe9824e..2fb64cdf3 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -37,15 +37,19 @@ + - + + ..\..\shared-infrastructure\SixLabors.ruleset + + - All - - - + All + + + diff --git a/stylecop.json b/stylecop.json deleted file mode 100644 index c67c0db32..000000000 --- a/stylecop.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", - "settings": - { - "orderingRules": - { - "usingDirectivesPlacement": "outsideNamespace" - }, - "documentationRules": - { - "xmlHeader": false, - "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index 55951fb43..f33dde1c6 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -23,8 +23,7 @@ - - + From 68dca4fddbd4cd5661cb2c93c1588ad2f736253c Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 31 Aug 2019 14:00:48 +1000 Subject: [PATCH 125/136] [SL.Core] Update submodule and fix warnings. --- .editorconfig | 372 ++++++++++++++++++ .gitattributes | 108 +++++ shared-infrastructure | 2 +- src/SixLabors.Core/SixLabors.Core.csproj | 5 +- src/SixLabors.ruleset | 6 - .../Helpers/DebugGuardTests.cs | 40 +- .../Helpers/GuardTests.cs | 12 +- .../Memory/ArrayPoolMemoryAllocatorTests.cs | 16 +- .../Memory/SimpleGcMemoryAllocatorTests.cs | 4 +- .../Primitives/RectangleTests.cs | 20 +- .../SixLabors.Core.Tests.csproj | 2 +- 11 files changed, 528 insertions(+), 59 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes delete mode 100644 src/SixLabors.ruleset diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..b0d0662bf --- /dev/null +++ b/.editorconfig @@ -0,0 +1,372 @@ +############################################################################### +# EditorConfig is awesome: http://EditorConfig.org +############################################################################### + +############################################################################### +# Top-most EditorConfig file +############################################################################### +root = true + +############################################################################### +# Set default behavior to: +# a UTF-8 encoding, +# Unix-style line endings, +# a newline ending the file, +# 4 space indentation, and +# trimming of trailing whitespace +############################################################################### +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +############################################################################### +# Set file behavior to: +# 2 space indentation +############################################################################### +[*.{cmd,config,csproj,json,props,ps1,resx,sh,targets}] +indent_size = 2 + +############################################################################### +# Set file behavior to: +# Windows-style line endings, and +# tabular indentation +############################################################################### +[*.sln] +end_of_line = crlf +indent_style = tab + +############################################################################### +# Set dotnet naming rules to: +# suggest async members be pascal case suffixed with Async +# suggest const declarations be pascal case +# suggest interfaces be pascal case prefixed with I +# suggest parameters be camel case +# suggest private and internal static fields be camel case +# suggest private and internal fields be camel case +# suggest public and protected declarations be pascal case +# suggest static readonly declarations be pascal case +# suggest type parameters be prefixed with T +############################################################################### +[*.cs] +dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.severity = suggestion +dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.style = pascal_case_suffixed_with_async +dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.symbols = async_members + +dotnet_naming_rule.const_declarations_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.const_declarations_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.const_declarations_should_be_pascal_case.symbols = const_declarations + +dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.severity = suggestion +dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.style = pascal_case_prefixed_with_i +dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.symbols = interfaces + +dotnet_naming_rule.parameters_should_be_camel_case.severity = suggestion +dotnet_naming_rule.parameters_should_be_camel_case.style = camel_case +dotnet_naming_rule.parameters_should_be_camel_case.symbols = parameters + +dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.severity = suggestion +dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.style = camel_case +dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.symbols = private_and_internal_static_fields + +dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.severity = suggestion +dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.style = camel_case +dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.symbols = private_and_internal_fields + +dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.symbols = public_and_protected_declarations +dotnet_naming_symbols.public_and_protected_declarations.applicable_kinds = method, field, event, property + +dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.symbols = static_readonly_declarations + +dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.severity = suggestion +dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.style = pascal_case_prefixed_with_t +dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.symbols = type_parameters + +############################################################################### +# Set dotnet naming styles to define: +# camel case +# pascal case +# pascal case suffixed with Async +# pascal case prefixed with I +# pascal case prefixed with T +############################################################################### +[*.cs] +dotnet_naming_style.camel_case.capitalization = camel_case + +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.pascal_case_suffixed_with_async.capitalization = pascal_case +dotnet_naming_style.pascal_case_suffixed_with_async.required_suffix = Async + +dotnet_naming_style.pascal_case_prefixed_with_i.capitalization = pascal_case +dotnet_naming_style.pascal_case_prefixed_with_i.required_prefix = I + +dotnet_naming_style.pascal_case_prefixed_with_t.capitalization = pascal_case +dotnet_naming_style.pascal_case_prefixed_with_t.required_prefix = T + +############################################################################### +# Set dotnet naming symbols to: +# async members +# const declarations +# interfaces +# private and internal fields +# private and internal static fields +# public and protected declarations +# static readonly declarations +# type parameters +############################################################################### +[*.cs] +dotnet_naming_symbols.async_members.required_modifiers = async + +dotnet_naming_symbols.const_declarations.required_modifiers = const + +dotnet_naming_symbols.interfaces.applicable_kinds = interface + +dotnet_naming_symbols.parameters.applicable_kinds = parameter + +dotnet_naming_symbols.private_and_internal_fields.applicable_accessibilities = private, internal +dotnet_naming_symbols.private_and_internal_fields.applicable_kinds = field + +dotnet_naming_symbols.private_and_internal_static_fields.applicable_accessibilities = private, internal +dotnet_naming_symbols.private_and_internal_static_fields.applicable_kinds = field +dotnet_naming_symbols.private_and_internal_static_fields.required_modifiers = static + +dotnet_naming_symbols.public_and_protected_declarations.applicable_accessibilities = public, protected + +dotnet_naming_symbols.static_readonly_declarations.required_modifiers = static, readonly + +dotnet_naming_symbols.type_parameters.applicable_kinds = type_parameter + +############################################################################### +# Set dotnet sort options to: +# do not separate import directives into groups, and +# sort system directives first +############################################################################### +[*.cs] +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = true + +############################################################################### +# Set dotnet style options to: +# suggest null-coalescing expressions, +# suggest collection-initializers, +# suggest explicit tuple names, +# suggest null-propogation +# suggest object-initializers, +# generate parentheses in arithmetic binary operators for clarity, +# generate parentheses in other binary operators for clarity, +# don't generate parentheses in other operators if unnecessary, +# generate parentheses in relational binary operators for clarity, +# warn when not using predefined-types for locals, parameters, and members, +# generate predefined-types of type names for member access, +# generate auto properties, +# suggest compound assignment, +# generate conditional expression over assignment, +# generate conditional expression over return, +# suggest inferred anonymous types, +# suggest inferred tuple names, +# suggest 'is null' checks over '== null', +# don't generate 'this.' and 'Me.' for events, +# warn when not using 'this.' and 'Me.' for fields, +# warn when not using 'this.' and 'Me.' for methods, +# warn when not using 'this.' and 'Me.' for properties, +# suggest readonly fields, and +# generate accessibility modifiers for non interface members +############################################################################### +[*.cs] +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion + +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent + +dotnet_style_predefined_type_for_locals_parameters_members = true:warning +dotnet_style_predefined_type_for_member_access = true:silent + +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion + +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = true:warning +dotnet_style_qualification_for_method = true:warning +dotnet_style_qualification_for_property = true:warning + +dotnet_style_readonly_field = true:suggestion +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +############################################################################### +# Set dotnet style options to: +# suggest removing all unused parameters +############################################################################### +[*.cs] +dotnet_code_quality_unused_parameters = all:suggestion + +############################################################################### +# Set csharp indent options to: +# indent block contents, +# not indent braces, +# indent case contents, +# not indent case contents when block, +# indent labels one less than the current, and +# indent switch labels +############################################################################### +[*.cs] +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +############################################################################### +# Set csharp new-line options to: +# insert a new-line before "catch", +# insert a new-line before "else", +# insert a new-line before "finally", +# insert a new-line before members in anonymous-types, +# insert a new-line before members in object-initializers, and +# insert a new-line before all open braces +############################################################################### +[*.cs] +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true + +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true + +csharp_new_line_before_open_brace = all + +############################################################################### +# Set csharp preserve options to: +# preserve single-line blocks, and +# preserve single-line statements +############################################################################### +[*.cs] +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +############################################################################### +# Set csharp space options to: +# remove any space after a cast, +# add a space after the colon in an inheritance clause, +# add a space after a comma, +# remove any space after a dot, +# add a space after keywords in control flow statements, +# add a space after a semicolon in a "for" statement, +# add a space before and after binary operators, +# remove space around declaration statements, +# add a space before the colon in an inheritance clause, +# remove any space before a comma, +# remove any space before a dot, +# remove any space before an open square-bracket, +# remove any space before a semicolon in a "for" statement, +# remove any space between empty square-brackets, +# remove any space between a method call's empty parameter list parenthesis, +# remove any space between a method call's name and its opening parenthesis, +# remove any space between a method call's parameter list parenthesis, +# remove any space between a method declaration's empty parameter list parenthesis, +# remove any space between a method declaration's name and its openening parenthesis, +# remove any space between a method declaration's parameter list parenthesis, +# remove any space between parentheses, and +# remove any space between square brackets +############################################################################### +[*.cs] +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true + +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = do_not_ignore + +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false + +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +############################################################################### +# Set csharp style options to: +# generate braces, +# suggest simple default expressions, +# generate a preferred modifier order, +# suggest conditional delegate calls, +# suggest deconstructed variable declarations, +# generate expression-bodied accessors, +# generate expression-bodied constructors, +# generate expression-bodied indexers, +# generate expression-bodied lambdas, +# generate expression-bodied methods, +# generate expression-bodied operators, +# generate expression-bodied properties, +# suggest inlined variable declarations, +# suggest local over anonymous functions, +# suggest pattern-matching over "as" with "null" check, +# suggest pattern-matching over "is" with "cast" check, +# suggest throw expressions, +# generate a discard variable for unused value expression statements, +# suggest a discard variable for unused assignments, +# warn when using var for built-in types, +# warn when using var when the type is not apparent, and +# warn when not using var when the type is apparent +############################################################################### +[*.cs] +csharp_prefer_braces = true:silent +csharp_prefer_simple_default_expression = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent + +csharp_style_conditional_delegate_call = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion + +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_methods = true:silent +csharp_style_expression_bodied_operators = true:silent +csharp_style_expression_bodied_properties = true:silent + +csharp_style_inlined_variable_declaration = true:suggestion + +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion + +csharp_style_throw_expression = true:suggestion + +csharp_style_unused_value_expression_statement_preference = discard_variable:silent +csharp_style_unused_value_assignment_preference = discard_variable:suggestion + +csharp_style_var_for_built_in_types = false:warning +csharp_style_var_elsewhere = false:warning +csharp_style_var_when_type_is_apparent = true:warning diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..537d9cef1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,108 @@ +############################################################################### +# Set default behavior to: +# treat as text and +# normalize to Unix-style line endings +############################################################################### +* text eol=lf + +############################################################################### +# Set explicit file behavior to: +# treat as text and +# normalize to Unix-style line endings +############################################################################### +*.asm text eol=lf +*.c text eol=lf +*.clj text eol=lf +*.cmd text eol=lf +*.cpp text eol=lf +*.css text eol=lf +*.cxx text eol=lf +*.config text eol=lf +*.DotSettings text eol=lf +*.erl text eol=lf +*.fs text eol=lf +*.fsx text eol=lf +*.h text eol=lf +*.htm text eol=lf +*.html text eol=lf +*.hs text eol=lf +*.hxx text eol=lf +*.java text eol=lf +*.js text eol=lf +*.json text eol=lf +*.less text eol=lf +*.lisp text eol=lf +*.lua text eol=lf +*.m text eol=lf +*.md text eol=lf +*.php text eol=lf +*.props text eol=lf +*.ps1 text eol=lf +*.py text eol=lf +*.rb text eol=lf +*.resx text eol=lf +*.runsettings text eol=lf +*.ruleset text eol=lf +*.sass text eol=lf +*.scss text eol=lf +*.sh text eol=lf +*.sql text eol=lf +*.svg text eol=lf +*.targets text eol=lf +*.tt text eol=crlf +*.ttinclude text eol=crlf +*.txt text eol=lf +*.vb text eol=lf +*.yml text eol=lf + +############################################################################### +# Set explicit file behavior to: +# treat as text +# normalize to Unix-style line endings and +# diff as csharp +############################################################################### +*.cs text eol=lf diff=csharp + +############################################################################### +# Set explicit file behavior to: +# treat as text +# normalize to Unix-style line endings and +# use a union merge when resoling conflicts +############################################################################### +*.csproj text eol=lf merge=union +*.dbproj text eol=lf merge=union +*.fsproj text eol=lf merge=union +*.ncrunchproject text eol=lf merge=union +*.vbproj text eol=lf merge=union + +############################################################################### +# Set explicit file behavior to: +# treat as text +# normalize to Windows-style line endings and +# use a union merge when resoling conflicts +############################################################################### +*.sln text eol=crlf merge=union + +############################################################################### +# Set explicit file behavior to: +# treat as binary +############################################################################### +*.bmp binary +*.dll binary +*.exe binary +*.gif binary +*.jpg binary +*.png binary +*.ttf binary +*.snk binary + +############################################################################### +# Set explicit file behavior to: +# diff as plain text +############################################################################### +*.doc diff=astextplain +*.docx diff=astextplain +*.dot diff=astextplain +*.pdf diff=astextplain +*.pptx diff=astextplain +*.rtf diff=astextplain diff --git a/shared-infrastructure b/shared-infrastructure index 10fa2a5d9..9b5a5b70b 160000 --- a/shared-infrastructure +++ b/shared-infrastructure @@ -1 +1 @@ -Subproject commit 10fa2a5d9f3e16ff01faa857b6eaf7833a7163ca +Subproject commit 9b5a5b70b46bc23b9d8d8645cd691d5bc5a2d84f diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 2fb64cdf3..4611693b7 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -23,7 +23,7 @@ - ..\SixLabors.ruleset + ..\..\shared-infrastructure\SixLabors.ruleset @@ -39,9 +39,6 @@ - - ..\..\shared-infrastructure\SixLabors.ruleset - diff --git a/src/SixLabors.ruleset b/src/SixLabors.ruleset deleted file mode 100644 index 4106b892c..000000000 --- a/src/SixLabors.ruleset +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 3db5642d1..0b0d33090 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -1,10 +1,11 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. // tell this file to enable debug conditional method calls, i.e. all the debug guard calls #define DEBUG using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; @@ -21,12 +22,12 @@ namespace SixLabors.Helpers.Tests [Fact] public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() { - var methods = typeof(DebugGuard).GetTypeInfo().GetMethods() + IEnumerable methods = typeof(DebugGuard).GetTypeInfo().GetMethods() .Where(x => x.IsStatic); - foreach (var m in methods) + foreach (MethodInfo m in methods) { - var attribs = m.GetCustomAttributes(); + IEnumerable attribs = m.GetCustomAttributes(); Assert.True(attribs.Select(x => x.ConditionString).Contains("DEBUG"), $"Method '{m.Name}' does not have [Conditional(\"DEBUG\")] set."); } } @@ -41,7 +42,7 @@ namespace SixLabors.Helpers.Tests [Fact] public void NotNull_WhenNotNull() { - Foo foo = new Foo(); + var foo = new Foo(); Guard.NotNull(foo, nameof(foo)); } @@ -152,10 +153,8 @@ namespace SixLabors.Helpers.Tests [InlineData(1, 1)] public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeLessThan(value, max, "myParamName"); - }); + ArgumentOutOfRangeException exception = Assert.Throws( + () => DebugGuard.MustBeLessThan(value, max, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"Value {value} must be less than {max}.", exception.Message); @@ -172,10 +171,7 @@ namespace SixLabors.Helpers.Tests [Fact] public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); - }); + ArgumentOutOfRangeException exception = Assert.Throws(() => DebugGuard.MustBeLessThanOrEqualTo(2, 1, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); @@ -192,10 +188,8 @@ namespace SixLabors.Helpers.Tests [InlineData(1, 1)] public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeGreaterThan(value, min, "myParamName"); - }); + ArgumentOutOfRangeException exception = Assert.Throws( + () => DebugGuard.MustBeGreaterThan(value, min, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); @@ -212,10 +206,8 @@ namespace SixLabors.Helpers.Tests [Fact] public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); - }); + ArgumentOutOfRangeException exception = Assert.Throws( + () => DebugGuard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); @@ -232,10 +224,8 @@ namespace SixLabors.Helpers.Tests [Fact] public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); - }); + ArgumentException exception = Assert.Throws( + () => DebugGuard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"The size must be at least 3.", exception.Message); diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index a35668c38..4b5ebbdfd 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -133,7 +133,7 @@ namespace SixLabors.Helpers.Tests [InlineData(1, 1)] public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeLessThan(value, max, "myParamName"); }); @@ -153,7 +153,7 @@ namespace SixLabors.Helpers.Tests [Fact] public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); }); @@ -173,7 +173,7 @@ namespace SixLabors.Helpers.Tests [InlineData(1, 1)] public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeGreaterThan(value, min, "myParamName"); }); @@ -193,7 +193,7 @@ namespace SixLabors.Helpers.Tests [Fact] public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); }); @@ -216,7 +216,7 @@ namespace SixLabors.Helpers.Tests [InlineData(4, 1, 3)] public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, int min, int max) { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); }); @@ -236,7 +236,7 @@ namespace SixLabors.Helpers.Tests [Fact] public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { - var exception = Assert.Throws(() => + ArgumentException exception = Assert.Throws(() => { Guard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); }); diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index 6f72a076e..1c1d72167 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -66,7 +66,7 @@ namespace SixLabors.Memory.Tests [Fact] public void When_PoolSelectorThresholdInBytes_IsGreaterThan_MaxPooledBufferSizeInBytes_ExceptionIsThrown() { - Assert.ThrowsAny(() => { new ArrayPoolMemoryAllocator(100, 200); }); + Assert.ThrowsAny(() => new ArrayPoolMemoryAllocator(100, 200)); } } @@ -169,13 +169,13 @@ namespace SixLabors.Memory.Tests return; } - int arrayLengthThreshold = PoolSelectorThresholdInBytes / sizeof(int); + const int ArrayLengthThreshold = PoolSelectorThresholdInBytes / sizeof(int); - IMemoryOwner small = this.MemoryAllocator.Allocate(arrayLengthThreshold - 1); + IMemoryOwner small = this.MemoryAllocator.Allocate(ArrayLengthThreshold - 1); ref int ptr2Small = ref small.GetReference(); small.Dispose(); - IMemoryOwner large = this.MemoryAllocator.Allocate(arrayLengthThreshold + 1); + IMemoryOwner large = this.MemoryAllocator.Allocate(ArrayLengthThreshold + 1); Assert.False(Unsafe.AreSame(ref ptr2Small, ref large.GetReference())); } @@ -227,7 +227,7 @@ namespace SixLabors.Memory.Tests [StructLayout(LayoutKind.Sequential)] private struct Rgba32 { - private uint dummy; + private readonly uint dummy; } private const int SizeOfLargeStruct = MaxPooledBufferSizeInBytes / 5; @@ -242,7 +242,7 @@ namespace SixLabors.Memory.Tests [InlineData((int.MaxValue / SizeOfLargeStruct) + 1)] public void AllocateIncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); + ArgumentOutOfRangeException ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); Assert.Equal("length", ex.ParamName); } @@ -250,8 +250,8 @@ namespace SixLabors.Memory.Tests [InlineData(-1)] public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); + ArgumentOutOfRangeException ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); Assert.Equal("length", ex.ParamName); } } -} \ No newline at end of file +} diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs index 7b431126d..a22e9e375 100644 --- a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs @@ -23,7 +23,7 @@ namespace SixLabors.Memory.Tests [InlineData(-1)] public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); + ArgumentOutOfRangeException ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); Assert.Equal("length", ex.ParamName); } @@ -31,7 +31,7 @@ namespace SixLabors.Memory.Tests [InlineData(-1)] public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); + ArgumentOutOfRangeException ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); Assert.Equal("length", ex.ParamName); } diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 2f56b9ecd..84b15d36e 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -173,11 +173,19 @@ namespace SixLabors.Primitives.Tests unchecked { - rCeiling = new Rectangle((int)Math.Ceiling(x), (int)Math.Ceiling(y), - (int)Math.Ceiling(width), (int)Math.Ceiling(height)); + rCeiling = new Rectangle( + (int)Math.Ceiling(x), + (int)Math.Ceiling(y), + (int)Math.Ceiling(width), + (int)Math.Ceiling(height)); + rTruncate = new Rectangle((int)x, (int)y, (int)width, (int)height); - rRound = new Rectangle((int)Math.Round(x), (int)Math.Round(y), - (int)Math.Round(width), (int)Math.Round(height)); + + rRound = new Rectangle( + (int)Math.Round(x), + (int)Math.Round(y), + (int)Math.Round(width), + (int)Math.Round(height)); } Assert.Equal(rCeiling, Rectangle.Ceiling(rect)); @@ -315,7 +323,7 @@ namespace SixLabors.Primitives.Tests [InlineData(0, 0, 0, 0)] public void DeconstructTest(int x, int y, int width, int height) { - Rectangle r = new Rectangle(x, y, width, height); + var r = new Rectangle(x, y, width, height); (int dx, int dy, int dw, int dh) = r; @@ -325,4 +333,4 @@ namespace SixLabors.Primitives.Tests Assert.Equal(height, dh); } } -} \ No newline at end of file +} diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index f33dde1c6..45eeef1b7 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -19,7 +19,7 @@ - ..\SixLabors.ruleset + ..\..\shared-infrastructure\SixLabors.Tests.ruleset From 25daf98fa84894c6e9657ae952f9e47662bc0d38 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sun, 1 Sep 2019 19:27:45 +1000 Subject: [PATCH 126/136] [SL.Core] Use shared source MathF and HashCode --- shared-infrastructure | 2 +- src/SixLabors.Core/HashCode.cs | 448 --------------------------------- src/SixLabors.Core/MathF.cs | 231 ----------------- 3 files changed, 1 insertion(+), 680 deletions(-) delete mode 100644 src/SixLabors.Core/HashCode.cs delete mode 100644 src/SixLabors.Core/MathF.cs diff --git a/shared-infrastructure b/shared-infrastructure index 9b5a5b70b..faf84e44e 160000 --- a/shared-infrastructure +++ b/shared-infrastructure @@ -1 +1 @@ -Subproject commit 9b5a5b70b46bc23b9d8d8645cd691d5bc5a2d84f +Subproject commit faf84e44ec90e8a42a7271bcd04fea76279efb08 diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs deleted file mode 100644 index b93d4a97f..000000000 --- a/src/SixLabors.Core/HashCode.cs +++ /dev/null @@ -1,448 +0,0 @@ -#pragma warning disable SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512, SA1308 - -// SOURCE: https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/HashCode.cs - -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -/* -The xxHash32 implementation is based on the code published by Yann Collet: -https://raw.githubusercontent.com/Cyan4973/xxHash/5c174cfa4e45a42f94082dc0d4539b39696afea1/xxhash.c - xxHash - Fast Hash algorithm - Copyright (C) 2012-2016, Yann Collet - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - You can contact the author at : - - xxHash homepage: http://www.xxhash.com - - xxHash source repository : https://github.com/Cyan4973/xxHash -*/ - -#if SUPPORTS_HASHCODE -using System.Runtime.CompilerServices; - -[assembly: TypeForwardedTo(typeof(System.HashCode))] -#else -using System.Buffers.Binary; -using System.Collections.Generic; -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Security.Cryptography; - -namespace System -{ - // xxHash32 is used for the hash code. - // https://github.com/Cyan4973/xxHash - internal struct HashCode - { -#pragma warning disable SA1311 // Static readonly fields should begin with upper-case letter - private static readonly uint s_seed = GenerateGlobalSeed(); -#pragma warning restore SA1311 // Static readonly fields should begin with upper-case letter - - private const uint Prime1 = 2654435761U; - private const uint Prime2 = 2246822519U; - private const uint Prime3 = 3266489917U; - private const uint Prime4 = 668265263U; - private const uint Prime5 = 374761393U; - - private uint _v1, _v2, _v3, _v4; - private uint _queue1, _queue2, _queue3; - private uint _length; - - private static uint GenerateGlobalSeed() - { - byte[] data = new byte[4]; - - using (var rng = RandomNumberGenerator.Create()) - { - rng.GetBytes(data); - } - - return BinaryPrimitives.ReadUInt32LittleEndian(data); - } - - public static int Combine(T1 value1) - { - // Provide a way of diffusing bits from something with a limited - // input hash space. For example, many enums only have a few - // possible hashes, only using the bottom few bits of the code. Some - // collections are built on the assumption that hashes are spread - // over a larger space, so diffusing the bits may help the - // collection work more efficiently. - - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - - uint hash = MixEmptyState(); - hash += 4; - - hash = QueueRound(hash, hc1); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - - uint hash = MixEmptyState(); - hash += 8; - - hash = QueueRound(hash, hc1); - hash = QueueRound(hash, hc2); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - - uint hash = MixEmptyState(); - hash += 12; - - hash = QueueRound(hash, hc1); - hash = QueueRound(hash, hc2); - hash = QueueRound(hash, hc3); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - uint hash = MixState(v1, v2, v3, v4); - hash += 16; - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - var hc5 = (uint)(value5?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - uint hash = MixState(v1, v2, v3, v4); - hash += 20; - - hash = QueueRound(hash, hc5); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - var hc5 = (uint)(value5?.GetHashCode() ?? 0); - var hc6 = (uint)(value6?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - uint hash = MixState(v1, v2, v3, v4); - hash += 24; - - hash = QueueRound(hash, hc5); - hash = QueueRound(hash, hc6); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - var hc5 = (uint)(value5?.GetHashCode() ?? 0); - var hc6 = (uint)(value6?.GetHashCode() ?? 0); - var hc7 = (uint)(value7?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - uint hash = MixState(v1, v2, v3, v4); - hash += 28; - - hash = QueueRound(hash, hc5); - hash = QueueRound(hash, hc6); - hash = QueueRound(hash, hc7); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - var hc5 = (uint)(value5?.GetHashCode() ?? 0); - var hc6 = (uint)(value6?.GetHashCode() ?? 0); - var hc7 = (uint)(value7?.GetHashCode() ?? 0); - var hc8 = (uint)(value8?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - v1 = Round(v1, hc5); - v2 = Round(v2, hc6); - v3 = Round(v3, hc7); - v4 = Round(v4, hc8); - - uint hash = MixState(v1, v2, v3, v4); - hash += 32; - - hash = MixFinal(hash); - return (int)hash; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint Rol(uint value, int count) - => (value << count) | (value >> (32 - count)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void Initialize(out uint v1, out uint v2, out uint v3, out uint v4) - { - v1 = s_seed + Prime1 + Prime2; - v2 = s_seed + Prime2; - v3 = s_seed; - v4 = s_seed - Prime1; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint Round(uint hash, uint input) - { - hash += input * Prime2; - hash = Rol(hash, 13); - hash *= Prime1; - return hash; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint QueueRound(uint hash, uint queuedValue) - { - hash += queuedValue * Prime3; - return Rol(hash, 17) * Prime4; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint MixState(uint v1, uint v2, uint v3, uint v4) - { - return Rol(v1, 1) + Rol(v2, 7) + Rol(v3, 12) + Rol(v4, 18); - } - - private static uint MixEmptyState() - { - return s_seed + Prime5; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint MixFinal(uint hash) - { - hash ^= hash >> 15; - hash *= Prime2; - hash ^= hash >> 13; - hash *= Prime3; - hash ^= hash >> 16; - return hash; - } - - public void Add(T value) - { - Add(value?.GetHashCode() ?? 0); - } - - public void Add(T value, IEqualityComparer comparer) - { - Add(comparer != null ? comparer.GetHashCode(value) : (value?.GetHashCode() ?? 0)); - } - - private void Add(int value) - { - // The original xxHash works as follows: - // 0. Initialize immediately. We can't do this in a struct (no - // default ctor). - // 1. Accumulate blocks of length 16 (4 uints) into 4 accumulators. - // 2. Accumulate remaining blocks of length 4 (1 uint) into the - // hash. - // 3. Accumulate remaining blocks of length 1 into the hash. - - // There is no need for #3 as this type only accepts ints. _queue1, - // _queue2 and _queue3 are basically a buffer so that when - // ToHashCode is called we can execute #2 correctly. - - // We need to initialize the xxHash32 state (_v1 to _v4) lazily (see - // #0) nd the last place that can be done if you look at the - // original code is just before the first block of 16 bytes is mixed - // in. The xxHash32 state is never used for streams containing fewer - // than 16 bytes. - - // To see what's really going on here, have a look at the Combine - // methods. - - var val = (uint)value; - - // Storing the value of _length locally shaves of quite a few bytes - // in the resulting machine code. - uint previousLength = _length++; - uint position = previousLength % 4; - - // Switch can't be inlined. - - if (position == 0) - _queue1 = val; - else if (position == 1) - _queue2 = val; - else if (position == 2) - _queue3 = val; - else // position == 3 - { - if (previousLength == 3) - Initialize(out _v1, out _v2, out _v3, out _v4); - - _v1 = Round(_v1, _queue1); - _v2 = Round(_v2, _queue2); - _v3 = Round(_v3, _queue3); - _v4 = Round(_v4, val); - } - } - - public int ToHashCode() - { - // Storing the value of _length locally shaves of quite a few bytes - // in the resulting machine code. - uint length = _length; - - // position refers to the *next* queue position in this method, so - // position == 1 means that _queue1 is populated; _queue2 would have - // been populated on the next call to Add. - uint position = length % 4; - - // If the length is less than 4, _v1 to _v4 don't contain anything - // yet. xxHash32 treats this differently. - - uint hash = length < 4 ? MixEmptyState() : MixState(_v1, _v2, _v3, _v4); - - // _length is incremented once per Add(Int32) and is therefore 4 - // times too small (xxHash length is in bytes, not ints). - - hash += length * 4; - - // Mix what remains in the queue - - // Switch can't be inlined right now, so use as few branches as - // possible by manually excluding impossible scenarios (position > 1 - // is always false if position is not > 0). - if (position > 0) - { - hash = QueueRound(hash, _queue1); - if (position > 1) - { - hash = QueueRound(hash, _queue2); - if (position > 2) - hash = QueueRound(hash, _queue3); - } - } - - hash = MixFinal(hash); - return (int)hash; - } - -#pragma warning disable 0809 - - // Obsolete member 'memberA' overrides non-obsolete member 'memberB'. - // Disallowing GetHashCode and Equals is by design - - // * We decided to not override GetHashCode() to produce the hash code - // as this would be weird, both naming-wise as well as from a - // behavioral standpoint (GetHashCode() should return the object's - // hash code, not the one being computed). - - // * Even though ToHashCode() can be called safely multiple times on - // this implementation, it is not part of the contract. If the - // implementation has to change in the future we don't want to worry - // about people who might have incorrectly used this type. - - [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes. Use ToHashCode to retrieve the computed hash code.", error: true)] - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() => throw new NotSupportedException("Equality not supported"); - - [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes.", error: true)] - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => throw new NotSupportedException("Equality not supported"); -#pragma warning restore 0809 - } -} -#endif - -#pragma warning restore SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512, SA1308 \ No newline at end of file diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs deleted file mode 100644 index d4a493a4f..000000000 --- a/src/SixLabors.Core/MathF.cs +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System.Runtime.CompilerServices; - -#if SUPPORTS_MATHF -[assembly: TypeForwardedTo(typeof(System.MathF))] -#else -namespace System -{ - /// - /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. - /// - /// MathF emulation on platforms that don't support it natively. - // ReSharper disable InconsistentNaming - internal static class MathF - { - /// - /// Represents the ratio of the circumference of a circle to its diameter, specified by the constant, π. - /// - public const float PI = (float)Math.PI; - - /// - /// Returns the absolute value of a single-precision floating-point number. - /// - /// - /// A number that is greater than or equal to , but less than or equal to . - /// - /// - /// A single-precision floating-point number, x, such that 0 ≤ x ≤. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Abs(float f) - { - return Math.Abs(f); - } - - /// - /// Returns the angle whose tangent is the quotient of two specified numbers. - /// - /// The y coordinate of a point. - /// The x coordinate of a point. - /// - /// An angle, θ, measured in radians, such that -π≤θ≤π, and tan(θ) = y / x, where - /// (x, y) is a point in the Cartesian plane. Observe the following: For (x, y) in - /// quadrant 1, 0 < θ < π/2.For (x, y) in quadrant 2, π/2 < θ≤π.For (x, y) in quadrant - /// 3, -π < θ < -π/2.For (x, y) in quadrant 4, -π/2 < θ < 0.For points on the boundaries - /// of the quadrants, the return value is the following:If y is 0 and x is not negative, - /// θ = 0.If y is 0 and x is negative, θ = π.If y is positive and x is 0, θ = π/2.If - /// y is negative and x is 0, θ = -π/2.If y is 0 and x is 0, θ = 0. If x or y is - /// , or if x and y are either or - /// , the method returns . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Atan2(float y, float x) - { - return (float)Math.Atan2(y, x); - } - - /// - /// Returns the smallest integral value that is greater than or equal to the specified single-precision floating-point number. - /// - /// A single-precision floating-point number. - /// - /// The smallest integral value that is greater than or equal to . - /// If is equal to , , - /// or , that value is returned. - /// Note that this method returns a instead of an integral type. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Ceiling(float f) - { - return (float)Math.Ceiling(f); - } - - /// - /// Returns the cosine of the specified angle. - /// - /// An angle, measured in radians. - /// - /// The cosine of . If is equal to , , - /// or , this method returns . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Cos(float f) - { - return (float)Math.Cos(f); - } - - /// - /// Returns e raised to the specified power. - /// - /// A number specifying a power. - /// - /// The number e raised to the power . - /// If equals or , that value is returned. - /// If equals , 0 is returned. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Exp(float f) - { - return (float)Math.Exp(f); - } - - /// - /// Returns the largest integer less than or equal to the specified single-precision floating-point number. - /// - /// A single-precision floating-point number. - /// - /// The largest integer less than or equal to . - /// If is equal to , , - /// or , that value is returned. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Floor(float f) - { - return (float)Math.Floor(f); - } - - /// - /// Returns the larger of two single-precision floating-point numbers. - /// - /// The first of two single-precision floating-point numbers to compare. - /// The second of two single-precision floating-point numbers to compare. - /// - /// Parameter or , whichever is larger. - /// If , or , or both and are - /// equal to , is returned. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Max(float val1, float val2) - { - return Math.Max(val1, val2); - } - - /// - /// Returns the smaller of two single-precision floating-point numbers. - /// - /// The first of two single-precision floating-point numbers to compare. - /// The second of two single-precision floating-point numbers to compare. - /// - /// Parameter or , whichever is smaller. - /// If , , or both and are equal - /// to , is returned. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Min(float val1, float val2) - { - return Math.Min(val1, val2); - } - - /// - /// Returns a specified number raised to the specified power. - /// - /// A single-precision floating-point number to be raised to a power. - /// A single-precision floating-point number that specifies a power. - /// The number raised to the power . - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Pow(float x, float y) - { - return (float)Math.Pow(x, y); - } - - /// - /// Rounds a single-precision floating-point value to the nearest integral value. - /// - /// A single-precision floating-point number to be rounded. - /// - /// The integer nearest . - /// If the fractional component of is halfway between two integers, one of which is even and the other odd, then the even number is returned. - /// Note that this method returns a instead of an integral type. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Round(float f) - { - return (float)Math.Round(f); - } - - /// - /// Rounds a single-precision floating-point value to the nearest integer. - /// A parameter specifies how to round the value if it is midway between two numbers. - /// - /// A single-precision floating-point number to be rounded. - /// Specification for how to round if it is midway between two other numbers. - /// - /// The integer nearest . If is halfway between two integers, one of which is even - /// and the other odd, then determines which of the two is returned. - /// Note that this method returns a instead of an integral type. - /// - /// - /// is not a valid value of . - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Round(float f, MidpointRounding mode) - { - return (float)Math.Round(f, mode); - } - - /// - /// Returns the sine of the specified angle. - /// - /// An angle, measured in radians. - /// - /// The sine of . - /// If is equal to , , - /// or , this method returns . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sin(float f) - { - return (float)Math.Sin(f); - } - - /// - /// Returns the square root of a specified number. - /// - /// The number whose square root is to be found. - /// - /// One of the values in the following table. - /// parameter Return value Zero or positive The positive square root of . - /// Negative Equals - /// Equals - /// . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sqrt(float f) - { - return (float)Math.Sqrt(f); - } - } -} -#endif \ No newline at end of file From 46ba50241f549909b2fa6a0e9dd3b14a688561d7 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 19 Jan 2020 23:48:17 +0100 Subject: [PATCH 127/136] Keep only necessary stuff from SL.Core --- .editorconfig | 372 ------------------ .gitattributes | 108 ----- .github/CONTRIBUTING.md | 35 -- .github/ISSUE_TEMPLATE/ask-question.md | 13 - .github/ISSUE_TEMPLATE/bug-report.md | 29 -- .github/ISSUE_TEMPLATE/feature-request.md | 13 - .github/PULL_REQUEST_TEMPLATE.md | 11 - .gitignore | 288 -------------- .gitmodules | 3 - LICENSE | 201 ---------- README.md | 19 - SixLabors.Core.sln | 63 --- SixLabors.Core.sln.DotSettings | 6 - appveyor.yml | 29 -- build.cmd | 17 - build.ps1 | 110 ------ codecov.yml | 22 -- gitversion.yml | 31 -- shared-infrastructure | 1 - src/SixLabors.Core/Properties/AssemblyInfo.cs | 7 - src/SixLabors.Core/SixLabors.Core.csproj | 67 ---- .../SixLabors.Core.csproj.DotSettings | 2 - tests/CodeCoverage/.gitignore | 1 - tests/CodeCoverage/CodeCoverage.cmd | 19 - tests/CodeCoverage/packages.config | 4 - .../SixLabors.Core.Tests.csproj | 44 --- tests/SixLabors.Core.Tests/TestEnvironment.cs | 12 - tests/SixLabors.ruleset | 12 - 28 files changed, 1539 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .gitattributes delete mode 100644 .github/CONTRIBUTING.md delete mode 100644 .github/ISSUE_TEMPLATE/ask-question.md delete mode 100644 .github/ISSUE_TEMPLATE/bug-report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature-request.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .gitignore delete mode 100644 .gitmodules delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 SixLabors.Core.sln delete mode 100644 SixLabors.Core.sln.DotSettings delete mode 100644 appveyor.yml delete mode 100644 build.cmd delete mode 100644 build.ps1 delete mode 100644 codecov.yml delete mode 100644 gitversion.yml delete mode 160000 shared-infrastructure delete mode 100644 src/SixLabors.Core/Properties/AssemblyInfo.cs delete mode 100644 src/SixLabors.Core/SixLabors.Core.csproj delete mode 100644 src/SixLabors.Core/SixLabors.Core.csproj.DotSettings delete mode 100644 tests/CodeCoverage/.gitignore delete mode 100644 tests/CodeCoverage/CodeCoverage.cmd delete mode 100644 tests/CodeCoverage/packages.config delete mode 100644 tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj delete mode 100644 tests/SixLabors.Core.Tests/TestEnvironment.cs delete mode 100644 tests/SixLabors.ruleset diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index b0d0662bf..000000000 --- a/.editorconfig +++ /dev/null @@ -1,372 +0,0 @@ -############################################################################### -# EditorConfig is awesome: http://EditorConfig.org -############################################################################### - -############################################################################### -# Top-most EditorConfig file -############################################################################### -root = true - -############################################################################### -# Set default behavior to: -# a UTF-8 encoding, -# Unix-style line endings, -# a newline ending the file, -# 4 space indentation, and -# trimming of trailing whitespace -############################################################################### -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true - -############################################################################### -# Set file behavior to: -# 2 space indentation -############################################################################### -[*.{cmd,config,csproj,json,props,ps1,resx,sh,targets}] -indent_size = 2 - -############################################################################### -# Set file behavior to: -# Windows-style line endings, and -# tabular indentation -############################################################################### -[*.sln] -end_of_line = crlf -indent_style = tab - -############################################################################### -# Set dotnet naming rules to: -# suggest async members be pascal case suffixed with Async -# suggest const declarations be pascal case -# suggest interfaces be pascal case prefixed with I -# suggest parameters be camel case -# suggest private and internal static fields be camel case -# suggest private and internal fields be camel case -# suggest public and protected declarations be pascal case -# suggest static readonly declarations be pascal case -# suggest type parameters be prefixed with T -############################################################################### -[*.cs] -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.severity = suggestion -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.style = pascal_case_suffixed_with_async -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.symbols = async_members - -dotnet_naming_rule.const_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.const_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.const_declarations_should_be_pascal_case.symbols = const_declarations - -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.severity = suggestion -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.style = pascal_case_prefixed_with_i -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.symbols = interfaces - -dotnet_naming_rule.parameters_should_be_camel_case.severity = suggestion -dotnet_naming_rule.parameters_should_be_camel_case.style = camel_case -dotnet_naming_rule.parameters_should_be_camel_case.symbols = parameters - -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.severity = suggestion -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.style = camel_case -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.symbols = private_and_internal_static_fields - -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.severity = suggestion -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.style = camel_case -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.symbols = private_and_internal_fields - -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.symbols = public_and_protected_declarations -dotnet_naming_symbols.public_and_protected_declarations.applicable_kinds = method, field, event, property - -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.symbols = static_readonly_declarations - -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.severity = suggestion -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.style = pascal_case_prefixed_with_t -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.symbols = type_parameters - -############################################################################### -# Set dotnet naming styles to define: -# camel case -# pascal case -# pascal case suffixed with Async -# pascal case prefixed with I -# pascal case prefixed with T -############################################################################### -[*.cs] -dotnet_naming_style.camel_case.capitalization = camel_case - -dotnet_naming_style.pascal_case.capitalization = pascal_case - -dotnet_naming_style.pascal_case_suffixed_with_async.capitalization = pascal_case -dotnet_naming_style.pascal_case_suffixed_with_async.required_suffix = Async - -dotnet_naming_style.pascal_case_prefixed_with_i.capitalization = pascal_case -dotnet_naming_style.pascal_case_prefixed_with_i.required_prefix = I - -dotnet_naming_style.pascal_case_prefixed_with_t.capitalization = pascal_case -dotnet_naming_style.pascal_case_prefixed_with_t.required_prefix = T - -############################################################################### -# Set dotnet naming symbols to: -# async members -# const declarations -# interfaces -# private and internal fields -# private and internal static fields -# public and protected declarations -# static readonly declarations -# type parameters -############################################################################### -[*.cs] -dotnet_naming_symbols.async_members.required_modifiers = async - -dotnet_naming_symbols.const_declarations.required_modifiers = const - -dotnet_naming_symbols.interfaces.applicable_kinds = interface - -dotnet_naming_symbols.parameters.applicable_kinds = parameter - -dotnet_naming_symbols.private_and_internal_fields.applicable_accessibilities = private, internal -dotnet_naming_symbols.private_and_internal_fields.applicable_kinds = field - -dotnet_naming_symbols.private_and_internal_static_fields.applicable_accessibilities = private, internal -dotnet_naming_symbols.private_and_internal_static_fields.applicable_kinds = field -dotnet_naming_symbols.private_and_internal_static_fields.required_modifiers = static - -dotnet_naming_symbols.public_and_protected_declarations.applicable_accessibilities = public, protected - -dotnet_naming_symbols.static_readonly_declarations.required_modifiers = static, readonly - -dotnet_naming_symbols.type_parameters.applicable_kinds = type_parameter - -############################################################################### -# Set dotnet sort options to: -# do not separate import directives into groups, and -# sort system directives first -############################################################################### -[*.cs] -dotnet_separate_import_directive_groups = false -dotnet_sort_system_directives_first = true - -############################################################################### -# Set dotnet style options to: -# suggest null-coalescing expressions, -# suggest collection-initializers, -# suggest explicit tuple names, -# suggest null-propogation -# suggest object-initializers, -# generate parentheses in arithmetic binary operators for clarity, -# generate parentheses in other binary operators for clarity, -# don't generate parentheses in other operators if unnecessary, -# generate parentheses in relational binary operators for clarity, -# warn when not using predefined-types for locals, parameters, and members, -# generate predefined-types of type names for member access, -# generate auto properties, -# suggest compound assignment, -# generate conditional expression over assignment, -# generate conditional expression over return, -# suggest inferred anonymous types, -# suggest inferred tuple names, -# suggest 'is null' checks over '== null', -# don't generate 'this.' and 'Me.' for events, -# warn when not using 'this.' and 'Me.' for fields, -# warn when not using 'this.' and 'Me.' for methods, -# warn when not using 'this.' and 'Me.' for properties, -# suggest readonly fields, and -# generate accessibility modifiers for non interface members -############################################################################### -[*.cs] -dotnet_style_coalesce_expression = true:suggestion -dotnet_style_collection_initializer = true:suggestion -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_null_propagation = true:suggestion -dotnet_style_object_initializer = true:suggestion - -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent - -dotnet_style_predefined_type_for_locals_parameters_members = true:warning -dotnet_style_predefined_type_for_member_access = true:silent - -dotnet_style_prefer_auto_properties = true:silent -dotnet_style_prefer_compound_assignment = true:suggestion -dotnet_style_prefer_conditional_expression_over_assignment = true:silent -dotnet_style_prefer_conditional_expression_over_return = true:silent -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion - -dotnet_style_qualification_for_event = false:silent -dotnet_style_qualification_for_field = true:warning -dotnet_style_qualification_for_method = true:warning -dotnet_style_qualification_for_property = true:warning - -dotnet_style_readonly_field = true:suggestion -dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent - -############################################################################### -# Set dotnet style options to: -# suggest removing all unused parameters -############################################################################### -[*.cs] -dotnet_code_quality_unused_parameters = all:suggestion - -############################################################################### -# Set csharp indent options to: -# indent block contents, -# not indent braces, -# indent case contents, -# not indent case contents when block, -# indent labels one less than the current, and -# indent switch labels -############################################################################### -[*.cs] -csharp_indent_block_contents = true -csharp_indent_braces = false -csharp_indent_case_contents = true -csharp_indent_case_contents_when_block = false -csharp_indent_labels = one_less_than_current -csharp_indent_switch_labels = true - -############################################################################### -# Set csharp new-line options to: -# insert a new-line before "catch", -# insert a new-line before "else", -# insert a new-line before "finally", -# insert a new-line before members in anonymous-types, -# insert a new-line before members in object-initializers, and -# insert a new-line before all open braces -############################################################################### -[*.cs] -csharp_new_line_before_catch = true -csharp_new_line_before_else = true -csharp_new_line_before_finally = true - -csharp_new_line_before_members_in_anonymous_types = true -csharp_new_line_before_members_in_object_initializers = true - -csharp_new_line_before_open_brace = all - -############################################################################### -# Set csharp preserve options to: -# preserve single-line blocks, and -# preserve single-line statements -############################################################################### -[*.cs] -csharp_preserve_single_line_blocks = true -csharp_preserve_single_line_statements = true - -############################################################################### -# Set csharp space options to: -# remove any space after a cast, -# add a space after the colon in an inheritance clause, -# add a space after a comma, -# remove any space after a dot, -# add a space after keywords in control flow statements, -# add a space after a semicolon in a "for" statement, -# add a space before and after binary operators, -# remove space around declaration statements, -# add a space before the colon in an inheritance clause, -# remove any space before a comma, -# remove any space before a dot, -# remove any space before an open square-bracket, -# remove any space before a semicolon in a "for" statement, -# remove any space between empty square-brackets, -# remove any space between a method call's empty parameter list parenthesis, -# remove any space between a method call's name and its opening parenthesis, -# remove any space between a method call's parameter list parenthesis, -# remove any space between a method declaration's empty parameter list parenthesis, -# remove any space between a method declaration's name and its openening parenthesis, -# remove any space between a method declaration's parameter list parenthesis, -# remove any space between parentheses, and -# remove any space between square brackets -############################################################################### -[*.cs] -csharp_space_after_cast = false -csharp_space_after_colon_in_inheritance_clause = true -csharp_space_after_comma = true -csharp_space_after_dot = false -csharp_space_after_keywords_in_control_flow_statements = true -csharp_space_after_semicolon_in_for_statement = true - -csharp_space_around_binary_operators = before_and_after -csharp_space_around_declaration_statements = do_not_ignore - -csharp_space_before_colon_in_inheritance_clause = true -csharp_space_before_comma = false -csharp_space_before_dot = false -csharp_space_before_open_square_brackets = false -csharp_space_before_semicolon_in_for_statement = false - -csharp_space_between_empty_square_brackets = false -csharp_space_between_method_call_empty_parameter_list_parentheses = false -csharp_space_between_method_call_name_and_opening_parenthesis = false -csharp_space_between_method_call_parameter_list_parentheses = false -csharp_space_between_method_declaration_empty_parameter_list_parentheses = false -csharp_space_between_method_declaration_name_and_open_parenthesis = false -csharp_space_between_method_declaration_parameter_list_parentheses = false -csharp_space_between_parentheses = false -csharp_space_between_square_brackets = false - -############################################################################### -# Set csharp style options to: -# generate braces, -# suggest simple default expressions, -# generate a preferred modifier order, -# suggest conditional delegate calls, -# suggest deconstructed variable declarations, -# generate expression-bodied accessors, -# generate expression-bodied constructors, -# generate expression-bodied indexers, -# generate expression-bodied lambdas, -# generate expression-bodied methods, -# generate expression-bodied operators, -# generate expression-bodied properties, -# suggest inlined variable declarations, -# suggest local over anonymous functions, -# suggest pattern-matching over "as" with "null" check, -# suggest pattern-matching over "is" with "cast" check, -# suggest throw expressions, -# generate a discard variable for unused value expression statements, -# suggest a discard variable for unused assignments, -# warn when using var for built-in types, -# warn when using var when the type is not apparent, and -# warn when not using var when the type is apparent -############################################################################### -[*.cs] -csharp_prefer_braces = true:silent -csharp_prefer_simple_default_expression = true:suggestion -csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent - -csharp_style_conditional_delegate_call = true:suggestion -csharp_style_deconstructed_variable_declaration = true:suggestion - -csharp_style_expression_bodied_accessors = true:silent -csharp_style_expression_bodied_constructors = true:silent -csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_lambdas = true:silent -csharp_style_expression_bodied_methods = true:silent -csharp_style_expression_bodied_operators = true:silent -csharp_style_expression_bodied_properties = true:silent - -csharp_style_inlined_variable_declaration = true:suggestion - -csharp_style_pattern_local_over_anonymous_function = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion - -csharp_style_throw_expression = true:suggestion - -csharp_style_unused_value_expression_statement_preference = discard_variable:silent -csharp_style_unused_value_assignment_preference = discard_variable:suggestion - -csharp_style_var_for_built_in_types = false:warning -csharp_style_var_elsewhere = false:warning -csharp_style_var_when_type_is_apparent = true:warning diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 537d9cef1..000000000 --- a/.gitattributes +++ /dev/null @@ -1,108 +0,0 @@ -############################################################################### -# Set default behavior to: -# treat as text and -# normalize to Unix-style line endings -############################################################################### -* text eol=lf - -############################################################################### -# Set explicit file behavior to: -# treat as text and -# normalize to Unix-style line endings -############################################################################### -*.asm text eol=lf -*.c text eol=lf -*.clj text eol=lf -*.cmd text eol=lf -*.cpp text eol=lf -*.css text eol=lf -*.cxx text eol=lf -*.config text eol=lf -*.DotSettings text eol=lf -*.erl text eol=lf -*.fs text eol=lf -*.fsx text eol=lf -*.h text eol=lf -*.htm text eol=lf -*.html text eol=lf -*.hs text eol=lf -*.hxx text eol=lf -*.java text eol=lf -*.js text eol=lf -*.json text eol=lf -*.less text eol=lf -*.lisp text eol=lf -*.lua text eol=lf -*.m text eol=lf -*.md text eol=lf -*.php text eol=lf -*.props text eol=lf -*.ps1 text eol=lf -*.py text eol=lf -*.rb text eol=lf -*.resx text eol=lf -*.runsettings text eol=lf -*.ruleset text eol=lf -*.sass text eol=lf -*.scss text eol=lf -*.sh text eol=lf -*.sql text eol=lf -*.svg text eol=lf -*.targets text eol=lf -*.tt text eol=crlf -*.ttinclude text eol=crlf -*.txt text eol=lf -*.vb text eol=lf -*.yml text eol=lf - -############################################################################### -# Set explicit file behavior to: -# treat as text -# normalize to Unix-style line endings and -# diff as csharp -############################################################################### -*.cs text eol=lf diff=csharp - -############################################################################### -# Set explicit file behavior to: -# treat as text -# normalize to Unix-style line endings and -# use a union merge when resoling conflicts -############################################################################### -*.csproj text eol=lf merge=union -*.dbproj text eol=lf merge=union -*.fsproj text eol=lf merge=union -*.ncrunchproject text eol=lf merge=union -*.vbproj text eol=lf merge=union - -############################################################################### -# Set explicit file behavior to: -# treat as text -# normalize to Windows-style line endings and -# use a union merge when resoling conflicts -############################################################################### -*.sln text eol=crlf merge=union - -############################################################################### -# Set explicit file behavior to: -# treat as binary -############################################################################### -*.bmp binary -*.dll binary -*.exe binary -*.gif binary -*.jpg binary -*.png binary -*.ttf binary -*.snk binary - -############################################################################### -# Set explicit file behavior to: -# diff as plain text -############################################################################### -*.doc diff=astextplain -*.docx diff=astextplain -*.dot diff=astextplain -*.pdf diff=astextplain -*.pptx diff=astextplain -*.rtf diff=astextplain diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index 9d83b43b5..000000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,35 +0,0 @@ -# How to contribute to SixLabors.Core - -#### **Did you find a bug?** - -- Please **ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/SixLabors/Core/issues). - -- If you're unable to find an open issue addressing the problem, please [open a new one](https://github.com/SixLabors/Core/issues/new). Be sure to include a **title, the applicable version, a clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. Please do not hijack existing issues. - -#### **Did you write a patch that fixes a bug?** - -* Open a new GitHub pull request with the patch. - -* Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. - -* Before submitting, please ensure that your code matches the existing coding patterns and practise as demonstrated in the repository. These follow strict Stylecop rules :cop:. - -#### **Do you intend to add a new feature or change an existing one?** - -* Suggest your change in the [ImageSharp Gitter Chat Room](https://gitter.im/ImageSharp/General) and start writing code. - -* Do not open an issue on GitHub until you have collected positive feedback about the change. GitHub issues are primarily intended for bug reports and fixes. - -#### **Running tests and Debugging** - -* Debugging (running tests in Debug mode) is only supported on .NET Core 2.1, because of JIT Code Generation bugs like [dotnet/coreclr#16443](https://github.com/dotnet/coreclr/issues/16443) or [dotnet/coreclr#20657](https://github.com/dotnet/coreclr/issues/20657) - -#### **Do you have questions about consuming the library or the source code?** - -* Ask any question about how to use SixLabors.Core in the [ImageSharp Gitter Chat Room](https://gitter.im/ImageSharp/General). - -And please remember. SixLabors.Core is the work of a very, very, small number of developers who struggle balancing time to contribute to the project with family time and work commitments. We encourage you to pitch in and help make our vision of simple accessible imageprocessing available to all. Open Source can only exist with your help. - -Thanks for reading! - -James Jackson-South :heart: diff --git a/.github/ISSUE_TEMPLATE/ask-question.md b/.github/ISSUE_TEMPLATE/ask-question.md deleted file mode 100644 index c8313fba9..000000000 --- a/.github/ISSUE_TEMPLATE/ask-question.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: Ask question -about: Ask a question about this project. - ---- - -You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General - -You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General - -You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General - -You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index c1bf768fa..000000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- - -### Prerequisites - -- [ ] I have written a descriptive issue title -- [ ] I have verified that I am running the latest version of ImageSharp -- [ ] I have verified if the problem exist in both `DEBUG` and `RELEASE` mode -- [ ] I have searched [open](https://github.com/SixLabors/Core/issues) and [closed](https://github.com/SixLabors/Core/issues?q=is%3Aissue+is%3Aclosed) issues to ensure it has not already been reported - -### Description - - -### Steps to Reproduce - - -### System Configuration - - -- SixLabors.Core version: -- Other SixLabors packages and versions: -- Environment (Operating system, version and so on): -- .NET Framework version: -- Additional information: - - diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md deleted file mode 100644 index be1e593be..000000000 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - -You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General - -You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General - -You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General - -You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index a717a05a1..000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,11 +0,0 @@ -### Prerequisites - -- [ ] I have written a descriptive pull-request title -- [ ] I have verified that there are no overlapping [pull-requests](https://github.com/SixLabors/Core/pulls) open -- [ ] I have verified that I am following matches the existing coding patterns and practice as demonstrated in the repository. These follow strict Stylecop rules :cop:. -- [ ] I have provided test coverage for my change (where applicable) - -### Description - - - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 940794e60..000000000 --- a/.gitignore +++ /dev/null @@ -1,288 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ -**/Properties/launchSettings.json - -*_i.c -*_p.c -*_i.h -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Typescript v1 declaration files -typings/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush -.cr/ - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f560cd590..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "shared-infrastructure"] - path = shared-infrastructure - url = https://github.com/SixLabors/SharedInfrastructure.git diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8dada3eda..000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index 159761bd6..000000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -

- -SixLabors.Core -
-SixLabors.Core -

- -
- -[![Build status](https://ci.appveyor.com/api/projects/status/j1hvc99493b0jk3x/branch/develop?svg=true)](https://ci.appveyor.com/project/six-labors/core/branch/develop) -[![codecov](https://codecov.io/gh/SixLabors/Core/branch/develop/graph/badge.svg)](https://codecov.io/gh/SixLabors/Core) -[![GitHub license](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/SixLabors/Core/master/LICENSE) - -[![GitHub issues](https://img.shields.io/github/issues/SixLabors/Core.svg)](https://github.com/SixLabors/Core/issues) -[![GitHub stars](https://img.shields.io/github/stars/SixLabors/Core.svg)](https://github.com/SixLabors/Core/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/SixLabors/Core.svg)](https://github.com/SixLabors/Core/network) -
- -**SixLabors.Core** provides core primitives and helper methods for use across SixLabors libraries. diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln deleted file mode 100644 index a796a9eba..000000000 --- a/SixLabors.Core.sln +++ /dev/null @@ -1,63 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.352 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" - ProjectSection(SolutionItems) = preProject - appveyor.yml = appveyor.yml - .github\ISSUE_TEMPLATE\ask-question.md = .github\ISSUE_TEMPLATE\ask-question.md - .github\ISSUE_TEMPLATE\bug-report.md = .github\ISSUE_TEMPLATE\bug-report.md - build.cmd = build.cmd - codecov.yml = codecov.yml - .github\CONTRIBUTING.md = .github\CONTRIBUTING.md - .github\ISSUE_TEMPLATE\feature-request.md = .github\ISSUE_TEMPLATE\feature-request.md - gitversion.yml = gitversion.yml - .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md - README.md = README.md - shared-infrastructure\.editorconfig = shared-infrastructure\.editorconfig - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C0625-CD3D-440F-9F80-2D83856AB7AE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core", "src\SixLabors.Core\SixLabors.Core.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core.Tests", "tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeCoverage", "CodeCoverage", "{10A74B46-930F-49E3-A579-BC3A6A23321D}" - ProjectSection(SolutionItems) = preProject - tests\CodeCoverage\CodeCoverage.cmd = tests\CodeCoverage\CodeCoverage.cmd - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.Build.0 = Debug|Any CPU - {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.ActiveCfg = Release|Any CPU - {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.Build.0 = Release|Any CPU - {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} - {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} - {10A74B46-930F-49E3-A579-BC3A6A23321D} = {C317F1B1-D75E-4C6D-83EB-80367343E0D7} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0DED1AC8-37DA-4EC2-8CAE-40E31CD439DE} - EndGlobalSection - GlobalSection(Performance) = preSolution - HasPerformanceSessions = true - EndGlobalSection -EndGlobal diff --git a/SixLabors.Core.sln.DotSettings b/SixLabors.Core.sln.DotSettings deleted file mode 100644 index 82961f0d0..000000000 --- a/SixLabors.Core.sln.DotSettings +++ /dev/null @@ -1,6 +0,0 @@ - - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 3c301a196..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: 0.0.{build} -image: Visual Studio 2017 - - -before_build: - - git submodule -q update --init - - cmd: dotnet --version - -build_script: - - cmd: build.cmd - - cmd: tests\CodeCoverage\CodeCoverage.cmd - -after_build: - - cmd: appveyor PushArtifact "artifacts\SixLabors.Core.%APPVEYOR_BUILD_VERSION%.nupkg" - -deploy: - - provider: NuGet - server: https://www.myget.org/F/sixlabors/api/v2/package - symbol_server: https://www.myget.org/F/sixlabors/symbols/api/v2/package - api_key: - secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4 - artifact: /.*\.nupkg/ - on: - branch: master - -# prevent the double build when a branch has an active PR -skip_branch_with_pr: true - -test: off diff --git a/build.cmd b/build.cmd deleted file mode 100644 index 6372b4125..000000000 --- a/build.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@echo Off - -PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '.\build.ps1'" - -if not "%errorlevel%"=="0" goto failure - -:success -ECHO successfully built project -REM exit 0 -goto end - -:failure -ECHO failed to build. -REM exit -1 -goto end - -:end \ No newline at end of file diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index fcd63aea2..000000000 --- a/build.ps1 +++ /dev/null @@ -1,110 +0,0 @@ - -# lets calulat the correct version here -$fallbackVersion = "1.0.0"; -$version = '' - -$tagRegex = '^v?(\d+\.\d+\.\d+)(-([a-zA-Z]+)\.?(\d*))?$' - -# we are running on the build server -$isVersionTag = $env:APPVEYOR_REPO_TAG_NAME -match $tagRegex - - if($isVersionTag){ - - Write-Debug "Building commit tagged with a compatable version number" - - $version = $matches[1] - $postTag = $matches[3] - $count = $matches[4] - Write-Debug "version number: ${version} post tag: ${postTag} count: ${count}" - if("$postTag" -ne ""){ - $version = "${version}-${postTag}" - } - if("$count" -ne ""){ - # for consistancy with previous releases we pad the counter to only 4 places - $padded = $count.Trim().Trim('0').PadLeft(4,"0"); - Write-Debug "count '$count', padded '${padded}'" - - $version = "${version}${padded}" - } - }else { - - Write-Debug "Untagged" - $lastTag = (git tag --list --sort=-taggerdate) | Out-String - $list = $lastTag.Split("`n") - foreach ($tag in $list) { - - Write-Debug "testing ${tag}" - $tag = $tag.Trim(); - if($tag -match $tagRegex){ - Write-Debug "matched ${tag}" - $version = $matches[1]; - break; - } - } - - if("$version" -eq ""){ - $version = $fallbackVersion - Write-Debug "Failed to discover base version Fallback to '${version}'" - }else{ - - Write-Debug "Discovered base version from tags '${version}'" - } - - $buildNumber = $env:APPVEYOR_BUILD_NUMBER - - # build number replacement is padded to 6 places - $buildNumber = "$buildNumber".Trim().Trim('0').PadLeft(6,"0"); - if("$env:APPVEYOR_PULL_REQUEST_NUMBER" -ne ""){ - Write-Debug "building a PR" - - $prNumber = "$env:APPVEYOR_PULL_REQUEST_NUMBER".Trim().Trim('0').PadLeft(5,"0"); - # this is a PR - $version = "${version}-PullRequest${prNumber}${buildNumber}"; - }else{ - Write-Debug "building a branch commit" - - # this is a general branch commit - $branch = $env:APPVEYOR_REPO_BRANCH - - if("$branch" -eq ""){ - $branch = ((git rev-parse --abbrev-ref HEAD) | Out-String).Trim() - - if("$branch" -eq ""){ - $branch = "unknown" - } - } - - $branch = $branch.Replace("/","-").ToLower() - - if($branch.ToLower() -eq "master"){ - $branch = "dev" - } - - $version = "${version}-${branch}${buildNumber}"; - } - } - -if("$env:APPVEYOR_API_URL" -ne ""){ - # update appveyor build number for this build - Invoke-RestMethod -Method "PUT" ` - -Uri "${env:APPVEYOR_API_URL}api/build" ` - -Body "{version:'${version}'}" ` - -ContentType "application/json" -} - -Write-Host "Building version '${version}'" -dotnet restore /p:packageversion=$version - -Write-Host "Building projects" -dotnet build -c Release /p:packageversion=$version - -if ($LASTEXITCODE ){ Exit $LASTEXITCODE } - -if ( $env:CI -ne "True") { - dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj --no-build -c Release -} -if ($LASTEXITCODE ){ Exit $LASTEXITCODE } - -Write-Host "Packaging projects" -dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=$version -if ($LASTEXITCODE ){ Exit $LASTEXITCODE } \ No newline at end of file diff --git a/codecov.yml b/codecov.yml deleted file mode 100644 index ad0b0be56..000000000 --- a/codecov.yml +++ /dev/null @@ -1,22 +0,0 @@ -codecov: - branch: develop - notify: - require_ci_to_pass: true -comment: off -coverage: - precision: 2 - range: - - 70.0 - - 100.0 - round: down - status: - changes: false - patch: true - project: true -parsers: - gcov: - branch_detection: - conditional: true - loop: true - macro: false - method: false \ No newline at end of file diff --git a/gitversion.yml b/gitversion.yml deleted file mode 100644 index 9fae0d8c2..000000000 --- a/gitversion.yml +++ /dev/null @@ -1,31 +0,0 @@ -# to create a new package you create a new release/tag -# in github appveyor will build it without the -cixxx tag -# it will then be deployable cleanly to nuget.org - -branches: - master: - tag: ci - mode: ContinuousDeployment - increment: Minor - prevent-increment-of-merged-branch-version: false - track-merge-target: true - pull-request: - regex: (pull|pull\-requests|pr)[/-] - mode: ContinuousDelivery - tag: PullRequest - increment: Inherit - prevent-increment-of-merged-branch-version: false - tag-number-pattern: '[/-](?\d+)[-/]' - track-merge-target: false - tracks-release-branches: false - is-release-branch: false - otherbranches: - regex: '.*' - mode: ContinuousDeployment - tag: ci - increment: Patch - prevent-increment-of-merged-branch-version: false - track-merge-target: true - is-release-branch: false -ignore: - sha: [] \ No newline at end of file diff --git a/shared-infrastructure b/shared-infrastructure deleted file mode 160000 index faf84e44e..000000000 --- a/shared-infrastructure +++ /dev/null @@ -1 +0,0 @@ -Subproject commit faf84e44ec90e8a42a7271bcd04fea76279efb08 diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs deleted file mode 100644 index 241c0fe99..000000000 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System.Runtime.CompilerServices; - -// Ensure the internals can be tested. -[assembly: InternalsVisibleTo("SixLabors.Core.Tests")] \ No newline at end of file diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj deleted file mode 100644 index 4611693b7..000000000 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - Low level primitives for use across Six Labors projects. - $(packageversion) - 0.1.0-alpha2 - Six Labors - netstandard1.3;netstandard2.0;netcoreapp2.0;netcoreapp2.1; - true - true - SixLabors.Core - SixLabors.Core - rectangle;point;size,primitives - https://raw.githubusercontent.com/SixLabors/Branding/master/icons/core/sixlabors.core.128.png - https://github.com/SixLabors/Core - http://www.apache.org/licenses/LICENSE-2.0 - git - https://github.com/SixLabors/Core - Copyright (c) Six Labors and contributors. - full - SixLabors - 7.3 - - - - ..\..\shared-infrastructure\SixLabors.ruleset - - - - - $(DefineConstants);SUPPORTS_MATHF - - - - $(DefineConstants);SUPPORTS_HASHCODE - - - - - - - - - - All - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings b/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings deleted file mode 100644 index 8b01856ae..000000000 --- a/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - True \ No newline at end of file diff --git a/tests/CodeCoverage/.gitignore b/tests/CodeCoverage/.gitignore deleted file mode 100644 index 6a14856d0..000000000 --- a/tests/CodeCoverage/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/OpenCover* \ No newline at end of file diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd deleted file mode 100644 index 347e0338c..000000000 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ /dev/null @@ -1,19 +0,0 @@ -@echo off - -cd tests\CodeCoverage - -nuget restore packages.config -PackagesDirectory . - -cd .. -cd .. - -dotnet restore SixLabors.Core.sln -dotnet build SixLabors.Core.sln --no-incremental -c release /p:codecov=true - -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c release" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp2.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" - -if %errorlevel% neq 0 exit /b %errorlevel% - -SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH% -pip install codecov -codecov -f "SixLabors.Core.Coverage.xml" \ No newline at end of file diff --git a/tests/CodeCoverage/packages.config b/tests/CodeCoverage/packages.config deleted file mode 100644 index 973b7f81b..000000000 --- a/tests/CodeCoverage/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj deleted file mode 100644 index 45eeef1b7..000000000 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ /dev/null @@ -1,44 +0,0 @@ - - - - 0.0.0 - netcoreapp1.1;netcoreapp2.1; - SixLabors.Core.Tests - SixLabors.Shapes.Tests - true - false - false - false - false - false - false - full - SixLabors.Tests - true - 7.3 - - - - ..\..\shared-infrastructure\SixLabors.Tests.ruleset - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - diff --git a/tests/SixLabors.Core.Tests/TestEnvironment.cs b/tests/SixLabors.Core.Tests/TestEnvironment.cs deleted file mode 100644 index 77be7bfe1..000000000 --- a/tests/SixLabors.Core.Tests/TestEnvironment.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; - -namespace SixLabors.Tests -{ - internal class TestEnvironment - { - internal static bool Is64BitProcess => IntPtr.Size == 8; - } -} \ No newline at end of file diff --git a/tests/SixLabors.ruleset b/tests/SixLabors.ruleset deleted file mode 100644 index a4fa8c4f7..000000000 --- a/tests/SixLabors.ruleset +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - From 812b4e5c845f5b23bed64adc2cc97729f8b49a8a Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 00:01:40 +0100 Subject: [PATCH 128/136] move product sources --- src/{SixLabors.Core => ImageSharp}/Constants.cs | 0 src/{SixLabors.Core => ImageSharp}/GeometryUtilities.cs | 0 .../Memory => ImageSharp/Memory/Allocators}/AllocationOptions.cs | 0 .../Memory/Allocators}/ArrayPoolMemoryAllocator.Buffer{T}.cs | 0 .../Allocators}/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs | 0 .../Memory/Allocators}/ArrayPoolMemoryAllocator.cs | 0 .../Memory => ImageSharp/Memory/Allocators}/IManagedByteBuffer.cs | 0 .../Memory/Allocators}/Internals/BasicArrayBuffer.cs | 0 .../Memory/Allocators}/Internals/BasicByteBuffer.cs | 0 .../Memory/Allocators}/Internals/ManagedBufferBase.cs | 0 .../Memory => ImageSharp/Memory/Allocators}/MemoryAllocator.cs | 0 .../Memory/Allocators}/SimpleGcMemoryAllocator.cs | 0 .../Primitives/Matrix3x2Extensions.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/Point.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/PointF.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/Rectangle.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/RectangleF.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/Size.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/SizeF.cs | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename src/{SixLabors.Core => ImageSharp}/Constants.cs (100%) rename src/{SixLabors.Core => ImageSharp}/GeometryUtilities.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/AllocationOptions.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/ArrayPoolMemoryAllocator.Buffer{T}.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/ArrayPoolMemoryAllocator.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/IManagedByteBuffer.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/Internals/BasicArrayBuffer.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/Internals/BasicByteBuffer.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/Internals/ManagedBufferBase.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/MemoryAllocator.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/SimpleGcMemoryAllocator.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/Matrix3x2Extensions.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/Point.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/PointF.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/Rectangle.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/RectangleF.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/Size.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/SizeF.cs (100%) diff --git a/src/SixLabors.Core/Constants.cs b/src/ImageSharp/Constants.cs similarity index 100% rename from src/SixLabors.Core/Constants.cs rename to src/ImageSharp/Constants.cs diff --git a/src/SixLabors.Core/GeometryUtilities.cs b/src/ImageSharp/GeometryUtilities.cs similarity index 100% rename from src/SixLabors.Core/GeometryUtilities.cs rename to src/ImageSharp/GeometryUtilities.cs diff --git a/src/SixLabors.Core/Memory/AllocationOptions.cs b/src/ImageSharp/Memory/Allocators/AllocationOptions.cs similarity index 100% rename from src/SixLabors.Core/Memory/AllocationOptions.cs rename to src/ImageSharp/Memory/Allocators/AllocationOptions.cs diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs similarity index 100% rename from src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs rename to src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs similarity index 100% rename from src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs rename to src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs similarity index 100% rename from src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs rename to src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs diff --git a/src/SixLabors.Core/Memory/IManagedByteBuffer.cs b/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs similarity index 100% rename from src/SixLabors.Core/Memory/IManagedByteBuffer.cs rename to src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs diff --git a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs b/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs similarity index 100% rename from src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs rename to src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs diff --git a/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs b/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs similarity index 100% rename from src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs rename to src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs diff --git a/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs b/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs similarity index 100% rename from src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs rename to src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs diff --git a/src/SixLabors.Core/Memory/MemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs similarity index 100% rename from src/SixLabors.Core/Memory/MemoryAllocator.cs rename to src/ImageSharp/Memory/Allocators/MemoryAllocator.cs diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs similarity index 100% rename from src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs rename to src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/ImageSharp/Primitives/Matrix3x2Extensions.cs similarity index 100% rename from src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs rename to src/ImageSharp/Primitives/Matrix3x2Extensions.cs diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/ImageSharp/Primitives/Point.cs similarity index 100% rename from src/SixLabors.Core/Primitives/Point.cs rename to src/ImageSharp/Primitives/Point.cs diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/ImageSharp/Primitives/PointF.cs similarity index 100% rename from src/SixLabors.Core/Primitives/PointF.cs rename to src/ImageSharp/Primitives/PointF.cs diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/ImageSharp/Primitives/Rectangle.cs similarity index 100% rename from src/SixLabors.Core/Primitives/Rectangle.cs rename to src/ImageSharp/Primitives/Rectangle.cs diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/ImageSharp/Primitives/RectangleF.cs similarity index 100% rename from src/SixLabors.Core/Primitives/RectangleF.cs rename to src/ImageSharp/Primitives/RectangleF.cs diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/ImageSharp/Primitives/Size.cs similarity index 100% rename from src/SixLabors.Core/Primitives/Size.cs rename to src/ImageSharp/Primitives/Size.cs diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/ImageSharp/Primitives/SizeF.cs similarity index 100% rename from src/SixLabors.Core/Primitives/SizeF.cs rename to src/ImageSharp/Primitives/SizeF.cs From 27e59ab824721800b15ac7deaff7131e14da39fa Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 00:05:16 +0100 Subject: [PATCH 129/136] update ImageSharp.csproj --- Directory.Build.targets | 3 +-- src/ImageSharp/ImageSharp.csproj | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index eb0764d89..3b903d36c 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -23,10 +23,9 @@ - - + diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index a6beac725..6c7269698 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -19,6 +19,23 @@ SixLabors.ImageSharp + + + + + + + + + + + + + + + + + True @@ -187,18 +204,6 @@ - - - - - - - - - - - - From f1d7c5fa949c74876f036c0626998416530601b3 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 00:51:36 +0100 Subject: [PATCH 130/136] move test code & delete shared code tests --- .../ArrayPoolMemoryAllocatorTests.cs | 0 .../Memory/Alocators}/BufferExtensions.cs | 0 .../Memory/Alocators}/BufferTestSuite.cs | 0 .../SimpleGcMemoryAllocatorTests.cs | 0 .../Primitives/PointFTests.cs | 0 .../Primitives/PointTests.cs | 0 .../Primitives/RectangleFTests.cs | 0 .../Primitives/RectangleTests.cs | 0 .../Primitives/SizeFTests.cs | 0 .../Primitives/SizeTests.cs | 0 .../Helpers/DebugGuardTests.cs | 234 ----------------- .../Helpers/FloatRoundingComparer.cs | 59 ----- .../Helpers/GeometryUtilitiesTests.cs | 19 -- .../Helpers/GuardTests.cs | 248 ------------------ .../Helpers/MathFTests.cs | 95 ------- 15 files changed, 655 deletions(-) rename tests/{SixLabors.Core.Tests/Memory => ImageSharp.Tests/Memory/Alocators}/ArrayPoolMemoryAllocatorTests.cs (100%) rename tests/{SixLabors.Core.Tests/Memory => ImageSharp.Tests/Memory/Alocators}/BufferExtensions.cs (100%) rename tests/{SixLabors.Core.Tests/Memory => ImageSharp.Tests/Memory/Alocators}/BufferTestSuite.cs (100%) rename tests/{SixLabors.Core.Tests/Memory => ImageSharp.Tests/Memory/Alocators}/SimpleGcMemoryAllocatorTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/PointFTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/PointTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/RectangleFTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/RectangleTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/SizeFTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/SizeTests.cs (100%) delete mode 100644 tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/GuardTests.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/MathFTests.cs diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs rename to tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs diff --git a/tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs b/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs rename to tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs diff --git a/tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs b/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs rename to tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs rename to tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/ImageSharp.Tests/Primitives/PointFTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/PointFTests.cs rename to tests/ImageSharp.Tests/Primitives/PointFTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/ImageSharp.Tests/Primitives/PointTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/PointTests.cs rename to tests/ImageSharp.Tests/Primitives/PointTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs rename to tests/ImageSharp.Tests/Primitives/RectangleFTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/ImageSharp.Tests/Primitives/RectangleTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs rename to tests/ImageSharp.Tests/Primitives/RectangleTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/ImageSharp.Tests/Primitives/SizeFTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs rename to tests/ImageSharp.Tests/Primitives/SizeFTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/ImageSharp.Tests/Primitives/SizeTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/SizeTests.cs rename to tests/ImageSharp.Tests/Primitives/SizeTests.cs diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs deleted file mode 100644 index 0b0d33090..000000000 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -// tell this file to enable debug conditional method calls, i.e. all the debug guard calls -#define DEBUG - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using Xunit; - -namespace SixLabors.Helpers.Tests -{ - public class DebugGuardTests - { - private class Foo - { - } - - [Fact] - public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() - { - IEnumerable methods = typeof(DebugGuard).GetTypeInfo().GetMethods() - .Where(x => x.IsStatic); - - foreach (MethodInfo m in methods) - { - IEnumerable attribs = m.GetCustomAttributes(); - Assert.True(attribs.Select(x => x.ConditionString).Contains("DEBUG"), $"Method '{m.Name}' does not have [Conditional(\"DEBUG\")] set."); - } - } - - [Fact] - public void NotNull_WhenNull_Throws() - { - Foo foo = null; - Assert.Throws(() => Guard.NotNull(foo, nameof(foo))); - } - - [Fact] - public void NotNull_WhenNotNull() - { - var foo = new Foo(); - Guard.NotNull(foo, nameof(foo)); - } - - [Theory] - [InlineData(null, true)] - [InlineData("", true)] - [InlineData(" ", true)] - [InlineData("$", false)] - [InlineData("lol", false)] - public void NotNullOrWhiteSpace(string str, bool shouldThrow) - { - if (shouldThrow) - { - Assert.ThrowsAny(() => Guard.NotNullOrWhiteSpace(str, nameof(str))); - } - else - { - Guard.NotNullOrWhiteSpace(str, nameof(str)); - } - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void IsTrue(bool value) - { - if (!value) - { - Assert.Throws(() => Guard.IsTrue(value, nameof(value), "Boo!")); - } - else - { - Guard.IsTrue(value, nameof(value), "Boo."); - } - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void IsFalse(bool value) - { - if (value) - { - Assert.Throws(() => Guard.IsFalse(value, nameof(value), "Boo!")); - } - else - { - Guard.IsFalse(value, nameof(value), "Boo."); - } - } - - public static readonly TheoryData SizeCheckData = new TheoryData - { - { 0, 0, false }, - { 1, 1, false }, - { 1, 0, false }, - { 13, 13, false }, - { 20, 13, false }, - { 12, 13, true }, - { 0, 1, true }, - }; - - [Theory] - [MemberData(nameof(SizeCheckData))] - public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) - { - int[] data = new int[length]; - - if (shouldThrow) - { - Assert.Throws(() => Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data))); - Assert.Throws(() => Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data))); - } - else - { - Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data)); - Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data)); - } - } - - [Theory] - [MemberData(nameof(SizeCheckData))] - public void DestinationShouldNotBeTooShort(int destLength, int sourceLength, bool shouldThrow) - { - int[] dest = new int[destLength]; - int[] source = new int[sourceLength]; - - if (shouldThrow) - { - Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest))); - Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest))); - } - else - { - Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest)); - Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest)); - } - } - - [Fact] - public void MustBeLessThan_IsLess_ThrowsNoException() - { - DebugGuard.MustBeLessThan(0, 1, "myParamName"); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(1, 1)] - public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) - { - ArgumentOutOfRangeException exception = Assert.Throws( - () => DebugGuard.MustBeLessThan(value, max, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be less than {max}.", exception.Message); - } - - [Theory] - [InlineData(0, 1)] - [InlineData(1, 1)] - public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, int max) - { - DebugGuard.MustBeLessThanOrEqualTo(value, max, "myParamName"); - } - - [Fact] - public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() - { - ArgumentOutOfRangeException exception = Assert.Throws(() => DebugGuard.MustBeLessThanOrEqualTo(2, 1, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); - } - - [Fact] - public void MustBeGreaterThan_IsGreater_ThrowsNoException() - { - DebugGuard.MustBeGreaterThan(2, 1, "myParamName"); - } - - [Theory] - [InlineData(1, 2)] - [InlineData(1, 1)] - public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) - { - ArgumentOutOfRangeException exception = Assert.Throws( - () => DebugGuard.MustBeGreaterThan(value, min, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(1, 1)] - public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int value, int min) - { - DebugGuard.MustBeGreaterThanOrEqualTo(value, min, "myParamName"); - } - - [Fact] - public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() - { - ArgumentOutOfRangeException exception = Assert.Throws( - () => DebugGuard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); - } - - [Theory] - [InlineData(new int[] { 1, 2 }, 1)] - [InlineData(new int[] { 1, 2 }, 2)] - public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) - { - DebugGuard.MustBeSizedAtLeast(value, minLength, "myParamName"); - } - - [Fact] - public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() - { - ArgumentException exception = Assert.Throws( - () => DebugGuard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"The size must be at least 3.", exception.Message); - } - } -} diff --git a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs deleted file mode 100644 index 15220d4b1..000000000 --- a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Collections.Generic; -using System.Numerics; - -namespace SixLabors.Tests.Helpers -{ - /// - /// Allows the comparison of single-precision floating point values by precision. - /// - public struct FloatRoundingComparer : IEqualityComparer, IEqualityComparer - { - /// - /// Initializes a new instance of the struct. - /// - /// The number of decimal places (valid values: 0-7). - public FloatRoundingComparer(int precision) - { - Guard.MustBeBetweenOrEqualTo(precision, 0, 7, nameof(precision)); - this.Precision = precision; - } - - /// - /// Gets the number of decimal places (valid values: 0-7). - /// - public int Precision { get; } - - /// - public bool Equals(float x, float y) - { - float xp = (float)Math.Round(x, this.Precision, MidpointRounding.AwayFromZero); - float yp = (float)Math.Round(y, this.Precision, MidpointRounding.AwayFromZero); - - return Comparer.Default.Compare(xp, yp) == 0; - } - - /// - public bool Equals(Vector4 x, Vector4 y) - { - return this.Equals(x.X, y.X) && this.Equals(x.Y, y.Y) && this.Equals(x.Z, y.Z) && this.Equals(x.W, y.W); - } - - /// - public int GetHashCode(float obj) - { - unchecked - { - int hashCode = obj.GetHashCode(); - hashCode = (hashCode * 397) ^ this.Precision.GetHashCode(); - return hashCode; - } - } - - /// - public int GetHashCode(Vector4 obj) => HashCode.Combine(obj, this.Precision); - } -} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs b/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs deleted file mode 100644 index 93e4cec60..000000000 --- a/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using Xunit; - -namespace SixLabors.Tests.Helpers -{ - public class GeometryUtilitiesTests - { - [Fact] - public void Convert_Degree_To_Radian() - => Assert.Equal((float)(Math.PI / 2D), GeometryUtilities.DegreeToRadian(90F), new FloatRoundingComparer(6)); - - [Fact] - public void Convert_Radian_To_Degree() - => Assert.Equal(60F, GeometryUtilities.RadianToDegree((float)(Math.PI / 3D)), new FloatRoundingComparer(5)); - } -} diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs deleted file mode 100644 index 4b5ebbdfd..000000000 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using Xunit; - -namespace SixLabors.Helpers.Tests -{ - public class GuardTests - { - private class Foo - { - } - - [Fact] - public void NotNull_WhenNull_Throws() - { - Foo foo = null; - Assert.Throws(() => Guard.NotNull(foo, nameof(foo))); - } - - [Fact] - public void NotNull_WhenNotNull() - { - Foo foo = new Foo(); - Guard.NotNull(foo, nameof(foo)); - } - - [Theory] - [InlineData(null, true)] - [InlineData("", true)] - [InlineData(" ", true)] - [InlineData("$", false)] - [InlineData("lol", false)] - public void NotNullOrWhiteSpace(string str, bool shouldThrow) - { - if (shouldThrow) - { - Assert.ThrowsAny(() => Guard.NotNullOrWhiteSpace(str, nameof(str))); - } - else - { - Guard.NotNullOrWhiteSpace(str, nameof(str)); - } - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void IsTrue(bool value) - { - if (!value) - { - Assert.Throws(() => Guard.IsTrue(value, nameof(value), "Boo!")); - } - else - { - Guard.IsTrue(value, nameof(value), "Boo."); - } - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void IsFalse(bool value) - { - if (value) - { - Assert.Throws(() => Guard.IsFalse(value, nameof(value), "Boo!")); - } - else - { - Guard.IsFalse(value, nameof(value), "Boo."); - } - } - - public static readonly TheoryData SizeCheckData = new TheoryData - { - { 0, 0, false }, - { 1, 1, false }, - { 1, 0, false }, - { 13, 13, false }, - { 20, 13, false }, - { 12, 13, true }, - { 0, 1, true }, - }; - - [Theory] - [MemberData(nameof(SizeCheckData))] - public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) - { - int[] data = new int[length]; - - if (shouldThrow) - { - Assert.Throws(() => Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data))); - Assert.Throws(() => Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data))); - } - else - { - Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data)); - Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data)); - } - } - - [Theory] - [MemberData(nameof(SizeCheckData))] - public void DestinationShouldNotBeTooShort(int destLength, int sourceLength, bool shouldThrow) - { - int[] dest = new int[destLength]; - int[] source = new int[sourceLength]; - - if (shouldThrow) - { - Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest))); - Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest))); - } - else - { - Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest)); - Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest)); - } - } - - [Fact] - public void MustBeLessThan_IsLess_ThrowsNoException() - { - Guard.MustBeLessThan(0, 1, "myParamName"); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(1, 1)] - public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeLessThan(value, max, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be less than {max}.", exception.Message); - } - - [Theory] - [InlineData(0, 1)] - [InlineData(1, 1)] - public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, int max) - { - Guard.MustBeLessThanOrEqualTo(value, max, "myParamName"); - } - - [Fact] - public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); - } - - [Fact] - public void MustBeGreaterThan_IsGreater_ThrowsNoException() - { - Guard.MustBeGreaterThan(2, 1, "myParamName"); - } - - [Theory] - [InlineData(1, 2)] - [InlineData(1, 1)] - public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeGreaterThan(value, min, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(1, 1)] - public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int value, int min) - { - Guard.MustBeGreaterThanOrEqualTo(value, min, "myParamName"); - } - - [Fact] - public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); - } - - [Theory] - [InlineData(1, 1, 3)] - [InlineData(2, 1, 3)] - [InlineData(3, 1, 3)] - public void MustBeBetweenOrEqualTo_IsBetweenOrEqual_ThrowsNoException(int value, int min, int max) - { - Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); - } - - [Theory] - [InlineData(0, 1, 3)] - [InlineData(4, 1, 3)] - public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, int min, int max) - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be greater than or equal to {min} and less than or equal to {max}.", exception.Message); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(2, 2)] - public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) - { - Guard.MustBeSizedAtLeast(new int[valueLength], minLength, "myParamName"); - } - - [Fact] - public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() - { - ArgumentException exception = Assert.Throws(() => - { - Guard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains("The size must be at least 3", exception.Message); - } - } -} diff --git a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs deleted file mode 100644 index 9ae95f014..000000000 --- a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using Xunit; - -namespace SixLabors.Tests.Helpers -{ - public class MathFTests - { - [Fact] - public void MathF_PI_Is_Equal() - { - Assert.Equal(MathF.PI, (float)Math.PI); - } - - [Fact] - public void MathF_Ceililng_Is_Equal() - { - Assert.Equal(MathF.Ceiling(0.3333F), (float)Math.Ceiling(0.3333F)); - } - - [Fact] - public void MathF_Cos_Is_Equal() - { - Assert.Equal(MathF.Cos(0.3333F), (float)Math.Cos(0.3333F)); - } - - [Fact] - public void MathF_Abs_Is_Equal() - { - Assert.Equal(MathF.Abs(-0.3333F), (float)Math.Abs(-0.3333F)); - } - - [Fact] - public void MathF_Atan2_Is_Equal() - { - Assert.Equal(MathF.Atan2(1.2345F, 1.2345F), (float)Math.Atan2(1.2345F, 1.2345F)); - } - - [Fact] - public void MathF_Exp_Is_Equal() - { - Assert.Equal(MathF.Exp(1.2345F), (float)Math.Exp(1.2345F)); - } - - [Fact] - public void MathF_Floor_Is_Equal() - { - Assert.Equal(MathF.Floor(1.2345F), (float)Math.Floor(1.2345F)); - } - - [Fact] - public void MathF_Min_Is_Equal() - { - Assert.Equal(MathF.Min(1.2345F, 5.4321F), (float)Math.Min(1.2345F, 5.4321F)); - } - - [Fact] - public void MathF_Max_Is_Equal() - { - Assert.Equal(MathF.Max(1.2345F, 5.4321F), (float)Math.Max(1.2345F, 5.4321F)); - } - - [Fact] - public void MathF_Pow_Is_Equal() - { - Assert.Equal(MathF.Pow(1.2345F, 5.4321F), (float)Math.Pow(1.2345F, 5.4321F)); - } - - [Fact] - public void MathF_Round_Is_Equal() - { - Assert.Equal(MathF.Round(1.2345F), (float)Math.Round(1.2345F)); - } - - [Fact] - public void MathF_Round_With_Midpoint_Is_Equal() - { - Assert.Equal(MathF.Round(1.2345F, MidpointRounding.AwayFromZero), (float)Math.Round(1.2345F, MidpointRounding.AwayFromZero)); - } - - [Fact] - public void MathF_Sin_Is_Equal() - { - Assert.Equal(MathF.Sin(1.2345F), (float)Math.Sin(1.2345F)); - } - - [Fact] - public void MathF_Sqrt_Is_Equal() - { - Assert.Equal(MathF.Sqrt(2F), (float)Math.Sqrt(2F)); - } - } -} \ No newline at end of file From 82a40f7f1046e11a82d3e47878a12e2417354a47 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 00:56:55 +0100 Subject: [PATCH 131/136] skip memory-intensive allocator tests --- .../Alocators/ArrayPoolMemoryAllocatorTests.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs index 1c1d72167..6495ca21d 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs @@ -6,11 +6,13 @@ using System; using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.Tests; +using SixLabors.ImageSharp.Tests; using Xunit; namespace SixLabors.Memory.Tests { + // TODO: Re-enable memory-intensive tests with arcade RemoteExecutor: + // https://github.com/dotnet/runtime/blob/master/docs/project/writing-tests.md#remoteexecutor public class ArrayPoolMemoryAllocatorTests { private const int MaxPooledBufferSizeInBytes = 2048; @@ -79,7 +81,7 @@ namespace SixLabors.Memory.Tests Assert.True(this.CheckIsRentingPooledBuffer(size)); } - [Theory] + [Theory(Skip = "Should be executed from a separate process.")] [InlineData(128 * 1024 * 1024)] [InlineData(MaxPooledBufferSizeInBytes + 1)] public void LargeBuffersAreNotPooled_OfByte(int size) @@ -101,7 +103,7 @@ namespace SixLabors.Memory.Tests Assert.True(this.CheckIsRentingPooledBuffer(count)); } - [Fact] + [Fact(Skip = "Should be executed from a separate process.")] public unsafe void LaregeBuffersAreNotPooled_OfBigValueType() { if (!TestEnvironment.Is64BitProcess) @@ -160,7 +162,8 @@ namespace SixLabors.Memory.Tests buffer.Dispose(); } - [Fact] + + [Fact(Skip = "Should be executed from a separate process.")] public void AllocationOverLargeArrayThreshold_UsesDifferentPool() { if (!TestEnvironment.Is64BitProcess) @@ -180,7 +183,7 @@ namespace SixLabors.Memory.Tests Assert.False(Unsafe.AreSame(ref ptr2Small, ref large.GetReference())); } - [Fact] + [Fact(Skip = "Should be executed from a separate process.")] public void CreateWithAggressivePooling() { if (!TestEnvironment.Is64BitProcess) @@ -194,7 +197,7 @@ namespace SixLabors.Memory.Tests Assert.True(this.CheckIsRentingPooledBuffer(4096 * 4096)); } - [Fact] + [Fact(Skip = "Should be executed from a separate process.")] public void CreateDefault() { if (!TestEnvironment.Is64BitProcess) From aa09911e00d0668c7555fb54647271f29f406240 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 01:07:35 +0100 Subject: [PATCH 132/136] move Core primitives to a subfolder for now --- src/ImageSharp/Primitives/{ => Core}/Matrix3x2Extensions.cs | 0 src/ImageSharp/Primitives/{ => Core}/Point.cs | 0 src/ImageSharp/Primitives/{ => Core}/PointF.cs | 0 src/ImageSharp/Primitives/{ => Core}/Rectangle.cs | 0 src/ImageSharp/Primitives/{ => Core}/RectangleF.cs | 0 src/ImageSharp/Primitives/{ => Core}/Size.cs | 0 src/ImageSharp/Primitives/{ => Core}/SizeF.cs | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename src/ImageSharp/Primitives/{ => Core}/Matrix3x2Extensions.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/Point.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/PointF.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/Rectangle.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/RectangleF.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/Size.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/SizeF.cs (100%) diff --git a/src/ImageSharp/Primitives/Matrix3x2Extensions.cs b/src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs similarity index 100% rename from src/ImageSharp/Primitives/Matrix3x2Extensions.cs rename to src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs diff --git a/src/ImageSharp/Primitives/Point.cs b/src/ImageSharp/Primitives/Core/Point.cs similarity index 100% rename from src/ImageSharp/Primitives/Point.cs rename to src/ImageSharp/Primitives/Core/Point.cs diff --git a/src/ImageSharp/Primitives/PointF.cs b/src/ImageSharp/Primitives/Core/PointF.cs similarity index 100% rename from src/ImageSharp/Primitives/PointF.cs rename to src/ImageSharp/Primitives/Core/PointF.cs diff --git a/src/ImageSharp/Primitives/Rectangle.cs b/src/ImageSharp/Primitives/Core/Rectangle.cs similarity index 100% rename from src/ImageSharp/Primitives/Rectangle.cs rename to src/ImageSharp/Primitives/Core/Rectangle.cs diff --git a/src/ImageSharp/Primitives/RectangleF.cs b/src/ImageSharp/Primitives/Core/RectangleF.cs similarity index 100% rename from src/ImageSharp/Primitives/RectangleF.cs rename to src/ImageSharp/Primitives/Core/RectangleF.cs diff --git a/src/ImageSharp/Primitives/Size.cs b/src/ImageSharp/Primitives/Core/Size.cs similarity index 100% rename from src/ImageSharp/Primitives/Size.cs rename to src/ImageSharp/Primitives/Core/Size.cs diff --git a/src/ImageSharp/Primitives/SizeF.cs b/src/ImageSharp/Primitives/Core/SizeF.cs similarity index 100% rename from src/ImageSharp/Primitives/SizeF.cs rename to src/ImageSharp/Primitives/Core/SizeF.cs From 3d5cd5c4c74f545fc2e52a230ebaa77a954619d6 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 01:12:12 +0100 Subject: [PATCH 133/136] cherry pick CI improvements from @JimBobSquarePants --- GitVersion.yml | 1 + ci-test.ps1 | 6 +----- src/Directory.Build.targets | 2 +- tests/Directory.Build.props | 3 +++ tests/Directory.Build.targets | 2 +- tests/ImageSharp.Tests/ImageSharp.Tests.csproj | 2 ++ 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index 0cd51a4ad..f2a251c55 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -2,5 +2,6 @@ continuous-delivery-fallback-tag: ci branches: master: tag: unstable + mode: ContinuousDeployment pull-request: tag: pr diff --git a/ci-test.ps1 b/ci-test.ps1 index fc368b22f..35a9b4646 100644 --- a/ci-test.ps1 +++ b/ci-test.ps1 @@ -34,8 +34,4 @@ elseif ($platform -eq '-x86' -and $targetFramework -match $netFxRegex) { else { dotnet test --no-build -c Release -f $targetFramework -} - -# Explicitly exit with 0 to ignore errors caused by coverlet attempting to read -# project files that dotnet test is set to ignore. -exit 0 +} \ No newline at end of file diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index c0e01ae58..68d4f8949 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -50,6 +50,6 @@ - + diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 22c634d9b..3d8286971 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -28,6 +28,9 @@ +
+ + diff --git a/tests/Directory.Build.targets b/tests/Directory.Build.targets index 26baee07e..9ee9c226d 100644 --- a/tests/Directory.Build.targets +++ b/tests/Directory.Build.targets @@ -25,7 +25,7 @@ - + true true opencover diff --git a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj index 41e6749be..4aabc2f4e 100644 --- a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj +++ b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj @@ -8,6 +8,8 @@ SixLabors.ImageSharp.Tests AnyCPU;x64;x86 SixLabors.ImageSharp.Tests + + true From a83eb3a471d314f6c9d3fc93bdf53d600111102e Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 01:32:23 +0100 Subject: [PATCH 134/136] fix PointFTests robustness issue --- tests/ImageSharp.Tests/Primitives/PointFTests.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/ImageSharp.Tests/Primitives/PointFTests.cs b/tests/ImageSharp.Tests/Primitives/PointFTests.cs index f78a18fc1..f02433d9a 100644 --- a/tests/ImageSharp.Tests/Primitives/PointFTests.cs +++ b/tests/ImageSharp.Tests/Primitives/PointFTests.cs @@ -6,12 +6,16 @@ using System.Globalization; using System.Numerics; using System.Reflection; using System.Runtime.CompilerServices; +using SixLabors.ImageSharp.Tests; using Xunit; namespace SixLabors.Primitives.Tests { public class PointFTests { + private static readonly ApproximateFloatComparer ApproximateFloatComparer = + new ApproximateFloatComparer(1e-6f); + [Fact] public void CanReinterpretCastFromVector2() { @@ -120,7 +124,8 @@ namespace SixLabors.Primitives.Tests var pout = PointF.Transform(p, matrix); - Assert.Equal(new PointF(-2.82842732F, 21.2132034F), pout); + Assert.Equal(-2.82842732F, pout.X, ApproximateFloatComparer); + Assert.Equal(21.2132034F, pout.Y, ApproximateFloatComparer); } [Fact] @@ -207,4 +212,4 @@ namespace SixLabors.Primitives.Tests Assert.Equal(y, deconstructedY); } } -} \ No newline at end of file +} From 6384f44501014c7c78889444496a2619df82dbb6 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 20 Jan 2020 21:08:21 +1100 Subject: [PATCH 135/136] Merge namespaces --- Directory.Build.targets | 3 + .../Advanced/AdvancedImageExtensions.cs | 1 - .../ParallelExecutionSettings.cs | 2 +- .../Advanced/ParallelUtils/ParallelHelper.cs | 2 - .../Common/Extensions/StreamExtensions.cs | 1 - .../Common/Helpers/Buffer2DUtils.cs | 1 - .../Common/Helpers/DenseMatrixUtils.cs | 1 - src/ImageSharp/Common/Helpers/ImageMaths.cs | 1 - src/ImageSharp/Common/Helpers/Vector4Utils.cs | 1 - src/ImageSharp/Configuration.cs | 2 +- src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs | 1 - src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs | 1 - src/ImageSharp/Formats/Gif/GifDecoderCore.cs | 2 - src/ImageSharp/Formats/Gif/GifEncoderCore.cs | 1 - src/ImageSharp/Formats/Gif/LzwDecoder.cs | 1 - src/ImageSharp/Formats/Gif/LzwEncoder.cs | 1 - .../Jpeg/Components/Decoder/IJpegComponent.cs | 1 - .../Jpeg/Components/Decoder/IRawJpegData.cs | 2 - .../Decoder/JpegBlockPostProcessor.cs | 1 - .../Jpeg/Components/Decoder/JpegComponent.cs | 2 - .../Decoder/JpegComponentPostProcessor.cs | 2 - .../Decoder/JpegImagePostProcessor.cs | 2 - .../Formats/Jpeg/Components/SizeExtensions.cs | 2 - .../Formats/Jpeg/JpegDecoderCore.cs | 3 - src/ImageSharp/Formats/Png/PngChunk.cs | 2 +- src/ImageSharp/Formats/Png/PngDecoderCore.cs | 1 - src/ImageSharp/Formats/Png/PngEncoderCore.cs | 1 - src/ImageSharp/Formats/Png/PngThrowHelper.cs | 1 - src/ImageSharp/Formats/Png/Zlib/Deflater.cs | 2 +- .../Formats/Png/Zlib/DeflaterEngine.cs | 2 +- .../Formats/Png/Zlib/DeflaterHuffman.cs | 2 +- .../Formats/Png/Zlib/DeflaterOutputStream.cs | 2 +- .../Formats/Png/Zlib/DeflaterPendingBuffer.cs | 2 +- .../Formats/Png/Zlib/ZlibDeflateStream.cs | 2 +- src/ImageSharp/Formats/Tga/TgaDecoderCore.cs | 1 - src/ImageSharp/Formats/Tga/TgaEncoderCore.cs | 2 - .../IO/DoubleBufferedStreamReader.cs | 2 +- src/ImageSharp/Image.Decode.cs | 1 - src/ImageSharp/Image.cs | 1 - src/ImageSharp/ImageFrame.cs | 4 +- src/ImageSharp/ImageFrame{TPixel}.cs | 2 - src/ImageSharp/ImageInfoExtensions.cs | 2 - src/ImageSharp/ImageSharp.csproj | 6 +- src/ImageSharp/Image{TPixel}.cs | 1 - .../Memory/Allocators/AllocationOptions.cs | 4 +- .../ArrayPoolMemoryAllocator.Buffer{T}.cs | 8 +- ...oolMemoryAllocator.CommonFactoryMethods.cs | 2 +- .../Allocators/ArrayPoolMemoryAllocator.cs | 2 +- .../Memory/Allocators/IManagedByteBuffer.cs | 2 +- .../Allocators/Internals/BasicArrayBuffer.cs | 3 +- .../Allocators/Internals/BasicByteBuffer.cs | 2 +- .../Allocators/Internals/ManagedBufferBase.cs | 2 +- .../Memory/Allocators/MemoryAllocator.cs | 2 +- .../Allocators/SimpleGcMemoryAllocator.cs | 5 +- src/ImageSharp/Memory/Buffer2DExtensions.cs | 2 - src/ImageSharp/Memory/Buffer2D{T}.cs | 4 +- src/ImageSharp/Memory/BufferArea{T}.cs | 2 - .../Memory/MemoryAllocatorExtensions.cs | 3 - src/ImageSharp/Memory/MemorySource.cs | 2 - src/ImageSharp/Memory/RowInterval.cs | 5 +- .../Metadata/Profiles/Exif/ExifProfile.cs | 1 - .../Metadata/Profiles/Exif/ExifReader.cs | 1 - .../Metadata/Profiles/Exif/ExifWriter.cs | 1 - .../Profiles/Exif/Tags/ExifTag.Number.cs | 2 - .../Profiles/Exif/Tags/ExifTag.NumberArray.cs | 2 - .../Profiles/Exif/Tags/ExifTag.Rational.cs | 2 - .../Exif/Tags/ExifTag.RationalArray.cs | 2 - .../Exif/Tags/ExifTag.SignedRational.cs | 2 - .../Exif/Tags/ExifTag.SignedRationalArray.cs | 2 - .../Profiles/Exif/Values/ExifNumber.cs | 1 - .../Profiles/Exif/Values/ExifNumberArray.cs | 2 - .../Profiles/Exif/Values/ExifRational.cs | 1 - .../Profiles/Exif/Values/ExifRationalArray.cs | 1 - .../Exif/Values/ExifSignedRational.cs | 1 - .../Exif/Values/ExifSignedRationalArray.cs | 2 - .../ICC/DataWriter/IccDataWriter.Matrix.cs | 1 - .../IccMatrixProcessElement.cs | 2 - .../DefaultPixelBlenders.Generated.cs | 112 ------------------ .../DefaultPixelBlenders.Generated.tt | 4 - src/ImageSharp/Primitives/ColorMatrix.cs | 2 +- src/ImageSharp/Primitives/Complex64.cs | 2 +- src/ImageSharp/Primitives/ComplexVector4.cs | 2 +- src/ImageSharp/Primitives/DenseMatrix{T}.cs | 3 +- src/ImageSharp/Primitives/LongRational.cs | 2 +- .../{Core => }/Matrix3x2Extensions.cs | 6 +- src/ImageSharp/Primitives/Number.cs | 2 +- src/ImageSharp/Primitives/{Core => }/Point.cs | 2 +- .../Primitives/{Core => }/PointF.cs | 2 +- src/ImageSharp/Primitives/Rational.cs | 2 +- .../Primitives/{Core => }/Rectangle.cs | 2 +- .../Primitives/{Core => }/RectangleF.cs | 2 +- src/ImageSharp/Primitives/SignedRational.cs | 2 +- src/ImageSharp/Primitives/{Core => }/Size.cs | 2 +- src/ImageSharp/Primitives/{Core => }/SizeF.cs | 2 +- src/ImageSharp/Primitives/ValueSize.cs | 3 +- .../Processing/AffineTransformBuilder.cs | 1 - .../DefaultImageProcessorContext{TPixel}.cs | 1 - .../Binarization/BinaryDiffuseExtensions.cs | 1 - .../Binarization/BinaryDitherExtensions.cs | 1 - .../Binarization/BinaryThresholdExtensions.cs | 1 - .../Convolution/BokehBlurExtensions.cs | 1 - .../Convolution/BoxBlurExtensions.cs | 1 - .../Convolution/DetectEdgesExtensions.cs | 1 - .../Convolution/GaussianBlurExtensions.cs | 1 - .../Convolution/GaussianSharpenExtensions.cs | 1 - .../Extensions/Dithering/DiffuseExtensions.cs | 1 - .../Extensions/Dithering/DitherExtensions.cs | 1 - .../Extensions/Drawing/DrawImageExtensions.cs | 1 - .../Extensions/Effects/OilPaintExtensions.cs | 1 - .../Effects/PixelShaderExtensions.cs | 1 - .../Extensions/Effects/PixelateExtensions.cs | 1 - .../Filters/BlackWhiteExtensions.cs | 1 - .../Filters/BrightnessExtensions.cs | 1 - .../Filters/ColorBlindnessExtensions.cs | 1 - .../Extensions/Filters/ContrastExtensions.cs | 1 - .../Extensions/Filters/FilterExtensions.cs | 2 - .../Extensions/Filters/GrayscaleExtensions.cs | 1 - .../Extensions/Filters/HueExtensions.cs | 1 - .../Extensions/Filters/InvertExtensions.cs | 1 - .../Filters/KodachromeExtensions.cs | 1 - .../Extensions/Filters/LightnessExtensions.cs | 1 - .../Extensions/Filters/LomographExtensions.cs | 1 - .../Extensions/Filters/OpacityExtensions.cs | 1 - .../Extensions/Filters/PolaroidExtensions.cs | 1 - .../Extensions/Filters/SaturateExtensions.cs | 1 - .../Extensions/Filters/SepiaExtensions.cs | 1 - .../Overlays/BackgroundColorExtensions.cs | 1 - .../Extensions/Overlays/GlowExtensions.cs | 2 - .../Extensions/Overlays/VignetteExtensions.cs | 2 - .../Extensions/Transforms/CropExtensions.cs | 1 - .../Extensions/Transforms/PadExtensions.cs | 2 - .../Extensions/Transforms/ResizeExtensions.cs | 1 - .../Transforms/TransformExtensions.cs | 1 - .../Processing/IImageProcessingContext.cs | 2 - .../Processing/KnownFilterMatrices.cs | 1 - .../Processing/PositionAwarePixelShader.cs | 1 - .../BinaryErrorDiffusionProcessor.cs | 1 - .../BinaryErrorDiffusionProcessor{TPixel}.cs | 1 - .../BinaryOrderedDitherProcessor.cs | 1 - .../BinaryOrderedDitherProcessor{TPixel}.cs | 1 - .../Binarization/BinaryThresholdProcessor.cs | 1 - .../BinaryThresholdProcessor{TPixel}.cs | 1 - .../Processors/CloningImageProcessor.cs | 1 - .../CloningImageProcessor{TPixel}.cs | 3 - .../Convolution/BokehBlurProcessor.cs | 1 - .../Convolution/BokehBlurProcessor{TPixel}.cs | 3 - .../Convolution/BoxBlurProcessor.cs | 1 - .../Convolution/BoxBlurProcessor{TPixel}.cs | 2 - .../Convolution2DProcessor{TPixel}.cs | 2 - .../Convolution2PassProcessor{TPixel}.cs | 2 - .../ConvolutionProcessorHelpers.cs | 2 - .../ConvolutionProcessor{TPixel}.cs | 2 - .../EdgeDetector2DProcessor{TPixel}.cs | 2 - .../EdgeDetectorCompassProcessor{TPixel}.cs | 2 - .../Convolution/EdgeDetectorProcessor.cs | 1 - .../EdgeDetectorProcessor{TPixel}.cs | 2 - .../Convolution/GaussianBlurProcessor.cs | 1 - .../GaussianBlurProcessor{TPixel}.cs | 2 - .../Convolution/GaussianSharpenProcessor.cs | 1 - .../GaussianSharpenProcessor{TPixel}.cs | 2 - .../Convolution/KayyaliProcessor.cs | 2 - .../Convolution/Kernels/CompassKernels.cs | 2 - .../Convolution/Kernels/KayyaliKernels.cs | 2 - .../Convolution/Kernels/KirschKernels.cs | 2 - .../Kernels/LaplacianKernelFactory.cs | 2 - .../Convolution/Kernels/LaplacianKernels.cs | 2 - .../Convolution/Kernels/PrewittKernels.cs | 2 - .../Kernels/RobertsCrossKernels.cs | 2 - .../Convolution/Kernels/RobinsonKernels.cs | 2 - .../Convolution/Kernels/ScharrKernels.cs | 2 - .../Convolution/Kernels/SobelKernels.cs | 2 - .../Processors/Convolution/KirschProcessor.cs | 2 - .../Convolution/Laplacian3x3Processor.cs | 2 - .../Convolution/Laplacian5x5Processor.cs | 2 - .../LaplacianOfGaussianProcessor.cs | 2 - .../Parameters/BokehBlurKernelData.cs | 2 - .../Convolution/PrewittProcessor.cs | 2 - .../Convolution/RobertsCrossProcessor.cs | 2 - .../Convolution/RobinsonProcessor.cs | 2 - .../Processors/Convolution/ScharrProcessor.cs | 2 - .../Processors/Convolution/SobelProcessor.cs | 2 - .../Processors/Dithering/AtkinsonDiffuser.cs | 2 - .../Processors/Dithering/BurksDiffuser.cs | 2 - .../Processors/Dithering/ErrorDiffuser.cs | 1 - .../ErrorDiffusionPaletteProcessor.cs | 1 - .../ErrorDiffusionPaletteProcessor{TPixel}.cs | 1 - .../Dithering/FloydSteinbergDiffuser.cs | 2 - .../Dithering/JarvisJudiceNinkeDiffuser.cs | 2 - .../Processors/Dithering/OrderedDither.cs | 1 - .../Dithering/OrderedDitherFactory.cs | 1 - .../OrderedDitherPaletteProcessor.cs | 1 - .../OrderedDitherPaletteProcessor{TPixel}.cs | 1 - .../Dithering/PaletteDitherProcessor.cs | 1 - .../PaletteDitherProcessor{TPixel}.cs | 1 - .../Processors/Dithering/Sierra2Diffuser.cs | 2 - .../Processors/Dithering/Sierra3Diffuser.cs | 2 - .../Dithering/SierraLiteDiffuser.cs | 2 - .../Dithering/StevensonArceDiffuser.cs | 2 - .../Processors/Dithering/StuckiDiffuser.cs | 2 - .../Processors/Drawing/DrawImageProcessor.cs | 1 - .../DrawImageProcessor{TPixelBg,TPixelFg}.cs | 1 - .../Effects/OilPaintingProcessor.cs | 1 - .../Effects/OilPaintingProcessor{TPixel}.cs | 1 - .../Effects/PixelShaderProcessor.cs | 1 - .../Effects/PixelShaderProcessorBase.cs | 1 - .../Effects/PixelShaderProcessor{TPixel}.cs | 1 - .../Processors/Effects/PixelateProcessor.cs | 1 - .../Effects/PixelateProcessor{TPixel}.cs | 1 - .../PositionAwarePixelShaderProcessor.cs | 1 - ...sitionAwarePixelShaderProcessor{TPixel}.cs | 1 - .../Processors/Filters/FilterProcessor.cs | 2 - .../Filters/FilterProcessor{TPixel}.cs | 2 - .../Processors/Filters/LomographProcessor.cs | 2 - .../Filters/LomographProcessor{TPixel}.cs | 1 - .../Processors/Filters/PolaroidProcessor.cs | 2 - .../Filters/PolaroidProcessor{TPixel}.cs | 1 - .../Processors/ICloningImageProcessor.cs | 1 - .../Processing/Processors/IImageProcessor.cs | 1 - .../Processors/ImageProcessorExtensions.cs | 1 - .../Processors/ImageProcessor{TPixel}.cs | 2 - .../AdaptiveHistogramEqualizationProcessor.cs | 2 - ...eHistogramEqualizationProcessor{TPixel}.cs | 2 - ...ogramEqualizationSlidingWindowProcessor.cs | 2 - ...alizationSlidingWindowProcessor{TPixel}.cs | 2 - .../GlobalHistogramEqualizationProcessor.cs | 2 - ...lHistogramEqualizationProcessor{TPixel}.cs | 2 - .../HistogramEqualizationProcessor.cs | 1 - .../HistogramEqualizationProcessor{TPixel}.cs | 1 - .../Overlays/BackgroundColorProcessor.cs | 1 - .../BackgroundColorProcessor{TPixel}.cs | 1 - .../Processors/Overlays/GlowProcessor.cs | 2 - .../Overlays/GlowProcessor{TPixel}.cs | 1 - .../Processors/Overlays/VignetteProcessor.cs | 2 - .../Overlays/VignetteProcessor{TPixel}.cs | 1 - .../Quantization/QuantizeProcessor.cs | 1 - .../Quantization/QuantizeProcessor{TPixel}.cs | 1 - .../Quantization/QuantizedFrame{TPixel}.cs | 1 - .../Quantization/WuFrameQuantizer{TPixel}.cs | 1 - .../Transforms/AffineTransformProcessor.cs | 1 - .../AffineTransformProcessor{TPixel}.cs | 1 - .../Transforms/AutoOrientProcessor.cs | 1 - .../Transforms/AutoOrientProcessor{TPixel}.cs | 1 - .../Processors/Transforms/CropProcessor.cs | 2 - .../Transforms/CropProcessor{TPixel}.cs | 1 - .../Transforms/EntropyCropProcessor.cs | 1 - .../EntropyCropProcessor{TPixel}.cs | 1 - .../Processors/Transforms/FlipProcessor.cs | 1 - .../Transforms/FlipProcessor{TPixel}.cs | 1 - .../ProjectiveTransformProcessor.cs | 1 - .../ProjectiveTransformProcessor{TPixel}.cs | 1 - .../Transforms/Resize/ResizeHelper.cs | 1 - .../ResizeKernelMap.PeriodicKernelMap.cs | 2 +- .../Transforms/Resize/ResizeKernelMap.cs | 1 - .../Transforms/Resize/ResizeProcessor.cs | 2 - .../Resize/ResizeProcessor{TPixel}.cs | 2 - .../Transforms/Resize/ResizeWorker.cs | 2 - .../Processors/Transforms/RotateProcessor.cs | 1 - .../Transforms/RotateProcessor{TPixel}.cs | 1 - .../Processors/Transforms/SkewProcessor.cs | 1 - .../Transforms/TransformKernelMap.cs | 1 - .../Transforms/TransformProcessor.cs | 1 - .../Transforms/TransformProcessorHelpers.cs | 1 - .../Processors/Transforms/TransformUtils.cs | 1 - .../Processing/ProjectiveTransformBuilder.cs | 1 - src/ImageSharp/Processing/ResizeOptions.cs | 1 - .../ImageSharp.Benchmarks/Codecs/DecodeBmp.cs | 13 +- .../Codecs/DecodeFilteredPng.cs | 2 +- .../ImageSharp.Benchmarks/Codecs/DecodeGif.cs | 11 +- .../ImageSharp.Benchmarks/Codecs/DecodePng.cs | 9 +- .../Codecs/Jpeg/DecodeJpegParseStreamOnly.cs | 6 +- .../Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs | 9 +- .../ImageSharp.Benchmarks/General/Array2D.cs | 2 +- .../PixelBlenders/PorterDuffBulkVsPixel.cs | 2 +- tests/ImageSharp.Benchmarks/Samplers/Crop.cs | 14 ++- .../ImageSharp.Benchmarks/Samplers/Diffuse.cs | 2 +- .../ImageSharp.Benchmarks/Samplers/Rotate.cs | 2 +- tests/ImageSharp.Benchmarks/Samplers/Skew.cs | 2 +- .../Drawing/DrawImageTests.cs | 1 - .../Formats/Bmp/BmpFileHeaderTests.cs | 4 - .../Formats/GeneralFormatTests.cs | 2 +- .../Jpg/Block8x8FTests.CopyToBufferArea.cs | 2 - .../Formats/Jpg/JpegDecoderTests.cs | 2 +- .../Formats/Jpg/ParseStreamTests.cs | 1 - .../Jpg/Utils/LibJpegTools.ComponentData.cs | 1 - .../Formats/Jpg/Utils/VerifyJpeg.cs | 1 - .../Helpers/ImageMathsTests.cs | 3 - .../Helpers/ParallelHelperTests.cs | 2 - .../IO/DoubleBufferedStreamReaderTests.cs | 2 +- .../Image/ImageRotationTests.cs | 1 - ..._FileSystemPath_UseDefaultConfiguration.cs | 1 - ...s.Load_FromBytes_UseGlobalConfiguration.cs | 1 - ...Load_FromStream_UseDefaultConfiguration.cs | 1 - .../Image/ImageTests.WrapMemory.cs | 3 +- tests/ImageSharp.Tests/ImageInfoTests.cs | 1 - .../ArrayPoolMemoryAllocatorTests.cs | 2 +- .../Memory/Alocators/BufferExtensions.cs | 2 +- .../Memory/Alocators/BufferTestSuite.cs | 2 +- .../Alocators/SimpleGcMemoryAllocatorTests.cs | 2 +- .../ImageSharp.Tests/Memory/Buffer2DTests.cs | 2 - .../Memory/BufferAreaTests.cs | 1 - .../Memory/MemorySourceTests.cs | 1 - .../Metadata/ImageMetadataTests.cs | 1 - .../Profiles/Exif/ExifProfileTests.cs | 3 - .../Profiles/Exif/Values/ExifValuesTests.cs | 1 - .../DataWriter/IccDataWriter.MatrixTests.cs | 2 +- .../Numerics/RationalTests.cs | 2 - .../Numerics/SignedRationalTests.cs | 2 - .../Primitives/ColorMatrixTests.cs | 1 - .../Primitives/DenseMatrixTests.cs | 2 - .../Primitives/PointFTests.cs | 4 +- .../ImageSharp.Tests/Primitives/PointTests.cs | 2 +- .../Primitives/RectangleFTests.cs | 3 +- .../Primitives/RectangleTests.cs | 2 +- .../ImageSharp.Tests/Primitives/SizeFTests.cs | 3 +- .../ImageSharp.Tests/Primitives/SizeTests.cs | 4 +- .../BaseImageOperationsExtensionTest.cs | 1 - .../Binarization/OrderedDitherFactoryTests.cs | 1 - .../Processors/LaplacianKernelFactoryTests.cs | 1 - .../Processing/FakeImageOperationsProvider.cs | 1 - .../Processing/ImageProcessingContextTests.cs | 1 - .../Processing/Overlays/GlowTest.cs | 2 - .../Processing/Overlays/VignetteTest.cs | 2 - .../Binarization/BinaryDitherTests.cs | 1 - .../Binarization/BinaryThresholdTest.cs | 2 - .../Basic1ParameterConvolutionTests.cs | 1 - .../Processors/Convolution/BokehBlurTest.cs | 2 - .../Processors/Convolution/BoxBlurTest.cs | 1 - .../Processors/Convolution/DetectEdgesTest.cs | 1 - .../Convolution/GaussianBlurTest.cs | 1 - .../Convolution/GaussianSharpenTest.cs | 1 - .../Processors/Filters/FilterTest.cs | 2 +- .../Processors/Overlays/GlowTest.cs | 1 - .../Processors/Overlays/OverlayTestBase.cs | 1 - .../Processors/Overlays/VignetteTest.cs | 1 - .../Processors/Transforms/CropTest.cs | 1 - .../Transforms/ResizeHelperTests.cs | 1 - .../Processors/Transforms/ResizeTests.cs | 1 - .../Transforms/AffineTransformBuilderTests.cs | 1 - .../Transforms/AffineTransformTests.cs | 1 - .../Processing/Transforms/CropTest.cs | 1 - .../ProjectiveTransformBuilderTests.cs | 1 - .../Processing/Transforms/ResizeTests.cs | 1 - .../Transforms/TransformBuilderTestBase.cs | 1 - .../TestDataIcc/IccTestDataMatrix.cs | 2 +- .../TestUtilities/ApproximateFloatComparer.cs | 1 - .../ImageComparison/ExactImageComparer.cs | 2 - .../ImageDimensionsMismatchException.cs | 2 - .../ImageComparison/ImageComparer.cs | 2 - .../ImageComparison/PixelDifference.cs | 1 - .../ImageComparison/TolerantImageComparer.cs | 2 - .../ImageProviders/SolidProvider.cs | 1 - .../ReferenceCodecs/SystemDrawingBridge.cs | 10 +- .../TestUtilities/TestImageExtensions.cs | 1 - .../TestUtilities/TestMemoryAllocator.cs | 2 +- .../TestUtilities/TestUtils.cs | 1 - .../TestUtilities/Tests/ImageComparerTests.cs | 1 - .../Tests/TestEnvironmentTests.cs | 2 - 357 files changed, 113 insertions(+), 640 deletions(-) rename src/ImageSharp/Primitives/{Core => }/Matrix3x2Extensions.cs (98%) rename src/ImageSharp/Primitives/{Core => }/Point.cs (99%) rename src/ImageSharp/Primitives/{Core => }/PointF.cs (99%) rename src/ImageSharp/Primitives/{Core => }/Rectangle.cs (99%) rename src/ImageSharp/Primitives/{Core => }/RectangleF.cs (99%) rename src/ImageSharp/Primitives/{Core => }/Size.cs (99%) rename src/ImageSharp/Primitives/{Core => }/SizeF.cs (99%) diff --git a/Directory.Build.targets b/Directory.Build.targets index 3b903d36c..e5c44f776 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -23,8 +23,11 @@ + + + diff --git a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs index 22e6d47e9..9bf8943b7 100644 --- a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs +++ b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs @@ -6,7 +6,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Advanced { diff --git a/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs b/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs index 431656ef9..f17d70a2a 100644 --- a/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs +++ b/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs @@ -4,7 +4,7 @@ using System; using System.Threading.Tasks; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Advanced.ParallelUtils { diff --git a/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs b/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs index c56337bff..4833dbafd 100644 --- a/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs +++ b/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs @@ -7,8 +7,6 @@ using System.Runtime.CompilerServices; using System.Threading.Tasks; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Advanced.ParallelUtils { diff --git a/src/ImageSharp/Common/Extensions/StreamExtensions.cs b/src/ImageSharp/Common/Extensions/StreamExtensions.cs index cee3e2414..971bff322 100644 --- a/src/ImageSharp/Common/Extensions/StreamExtensions.cs +++ b/src/ImageSharp/Common/Extensions/StreamExtensions.cs @@ -5,7 +5,6 @@ using System; using System.Buffers; using System.IO; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs b/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs index b678e798f..f82774601 100644 --- a/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs +++ b/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs @@ -8,7 +8,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs index c5c9ddebe..ff6e3a4ec 100644 --- a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs +++ b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs @@ -6,7 +6,6 @@ using System.Numerics; using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Common/Helpers/ImageMaths.cs b/src/ImageSharp/Common/Helpers/ImageMaths.cs index 122952cae..e7b14be42 100644 --- a/src/ImageSharp/Common/Helpers/ImageMaths.cs +++ b/src/ImageSharp/Common/Helpers/ImageMaths.cs @@ -6,7 +6,6 @@ using System.Numerics; using System.Runtime.CompilerServices; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Common/Helpers/Vector4Utils.cs b/src/ImageSharp/Common/Helpers/Vector4Utils.cs index a4e0921d0..594a5ff10 100644 --- a/src/ImageSharp/Common/Helpers/Vector4Utils.cs +++ b/src/ImageSharp/Common/Helpers/Vector4Utils.cs @@ -5,7 +5,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Configuration.cs b/src/ImageSharp/Configuration.cs index 4dba7a7e8..9f26df300 100644 --- a/src/ImageSharp/Configuration.cs +++ b/src/ImageSharp/Configuration.cs @@ -10,8 +10,8 @@ using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.Formats.Tga; using SixLabors.ImageSharp.IO; +using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Processing; -using SixLabors.Memory; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs index eda5f1f78..8d82d28fb 100644 --- a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs @@ -11,7 +11,6 @@ using SixLabors.ImageSharp.Common.Helpers; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Bmp { diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs index 41be71d2b..1c7c606ca 100644 --- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs @@ -12,7 +12,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Quantization; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Bmp { diff --git a/src/ImageSharp/Formats/Gif/GifDecoderCore.cs b/src/ImageSharp/Formats/Gif/GifDecoderCore.cs index b4d92b15d..722c9c899 100644 --- a/src/ImageSharp/Formats/Gif/GifDecoderCore.cs +++ b/src/ImageSharp/Formats/Gif/GifDecoderCore.cs @@ -10,8 +10,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Gif { diff --git a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs index f8b40306b..b4aae0744 100644 --- a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs +++ b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs @@ -12,7 +12,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Quantization; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Gif { diff --git a/src/ImageSharp/Formats/Gif/LzwDecoder.cs b/src/ImageSharp/Formats/Gif/LzwDecoder.cs index 2ae8a834e..0129db0e3 100644 --- a/src/ImageSharp/Formats/Gif/LzwDecoder.cs +++ b/src/ImageSharp/Formats/Gif/LzwDecoder.cs @@ -8,7 +8,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Gif { diff --git a/src/ImageSharp/Formats/Gif/LzwEncoder.cs b/src/ImageSharp/Formats/Gif/LzwEncoder.cs index d80910614..eda0c5fb8 100644 --- a/src/ImageSharp/Formats/Gif/LzwEncoder.cs +++ b/src/ImageSharp/Formats/Gif/LzwEncoder.cs @@ -8,7 +8,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Gif { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs index 2492a985a..169b02e9f 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IRawJpegData.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IRawJpegData.cs index 2f393fada..8075fd4ba 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IRawJpegData.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IRawJpegData.cs @@ -3,8 +3,6 @@ using System; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { /// diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs index c5efb812e..44f9048a5 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs @@ -4,7 +4,6 @@ using System; using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs index 9fa4ce6d8..622c34e9b 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs @@ -4,8 +4,6 @@ using System; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs index e1a9380a0..39c8be312 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs @@ -6,8 +6,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs index f3f2952b1..0400978d2 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs @@ -7,8 +7,6 @@ using System.Numerics; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; using JpegColorConverter = SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters.JpegColorConverter; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder diff --git a/src/ImageSharp/Formats/Jpeg/Components/SizeExtensions.cs b/src/ImageSharp/Formats/Jpeg/Components/SizeExtensions.cs index 48ad18856..94771aa64 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/SizeExtensions.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/SizeExtensions.cs @@ -4,8 +4,6 @@ using System; using System.Numerics; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Formats.Jpeg.Components { /// diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs index 62765a884..9b6a72cc9 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs @@ -15,9 +15,6 @@ using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.Metadata.Profiles.Icc; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg { diff --git a/src/ImageSharp/Formats/Png/PngChunk.cs b/src/ImageSharp/Formats/Png/PngChunk.cs index 1fee4a837..7d8498ab7 100644 --- a/src/ImageSharp/Formats/Png/PngChunk.cs +++ b/src/ImageSharp/Formats/Png/PngChunk.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png { diff --git a/src/ImageSharp/Formats/Png/PngDecoderCore.cs b/src/ImageSharp/Formats/Png/PngDecoderCore.cs index 016179712..69b341c8d 100644 --- a/src/ImageSharp/Formats/Png/PngDecoderCore.cs +++ b/src/ImageSharp/Formats/Png/PngDecoderCore.cs @@ -17,7 +17,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Png { diff --git a/src/ImageSharp/Formats/Png/PngEncoderCore.cs b/src/ImageSharp/Formats/Png/PngEncoderCore.cs index 22e3f252d..57a596bcd 100644 --- a/src/ImageSharp/Formats/Png/PngEncoderCore.cs +++ b/src/ImageSharp/Formats/Png/PngEncoderCore.cs @@ -17,7 +17,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Quantization; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Png { diff --git a/src/ImageSharp/Formats/Png/PngThrowHelper.cs b/src/ImageSharp/Formats/Png/PngThrowHelper.cs index 00b40c50b..dd3a05464 100644 --- a/src/ImageSharp/Formats/Png/PngThrowHelper.cs +++ b/src/ImageSharp/Formats/Png/PngThrowHelper.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; namespace SixLabors.ImageSharp.Formats.Png diff --git a/src/ImageSharp/Formats/Png/Zlib/Deflater.cs b/src/ImageSharp/Formats/Png/Zlib/Deflater.cs index 6c4ea44d1..7398b089b 100644 --- a/src/ImageSharp/Formats/Png/Zlib/Deflater.cs +++ b/src/ImageSharp/Formats/Png/Zlib/Deflater.cs @@ -3,7 +3,7 @@ using System; using System.Runtime.CompilerServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/DeflaterEngine.cs b/src/ImageSharp/Formats/Png/Zlib/DeflaterEngine.cs index 0163eec0b..7be794b5e 100644 --- a/src/ImageSharp/Formats/Png/Zlib/DeflaterEngine.cs +++ b/src/ImageSharp/Formats/Png/Zlib/DeflaterEngine.cs @@ -4,7 +4,7 @@ using System; using System.Buffers; using System.Runtime.CompilerServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/DeflaterHuffman.cs b/src/ImageSharp/Formats/Png/Zlib/DeflaterHuffman.cs index 96ff6b657..e8dd8a520 100644 --- a/src/ImageSharp/Formats/Png/Zlib/DeflaterHuffman.cs +++ b/src/ImageSharp/Formats/Png/Zlib/DeflaterHuffman.cs @@ -5,7 +5,7 @@ using System; using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/DeflaterOutputStream.cs b/src/ImageSharp/Formats/Png/Zlib/DeflaterOutputStream.cs index 9eeb12cb0..a777e6f7d 100644 --- a/src/ImageSharp/Formats/Png/Zlib/DeflaterOutputStream.cs +++ b/src/ImageSharp/Formats/Png/Zlib/DeflaterOutputStream.cs @@ -3,7 +3,7 @@ using System; using System.IO; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/DeflaterPendingBuffer.cs b/src/ImageSharp/Formats/Png/Zlib/DeflaterPendingBuffer.cs index a5f00f03c..731c9e80f 100644 --- a/src/ImageSharp/Formats/Png/Zlib/DeflaterPendingBuffer.cs +++ b/src/ImageSharp/Formats/Png/Zlib/DeflaterPendingBuffer.cs @@ -4,7 +4,7 @@ using System; using System.Buffers; using System.Runtime.CompilerServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs b/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs index 3c52d306f..c723b463f 100644 --- a/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs +++ b/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs @@ -3,7 +3,7 @@ using System; using System.IO; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs b/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs index d4f42a6c3..91cc93e19 100644 --- a/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs +++ b/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs @@ -9,7 +9,6 @@ using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Tga { diff --git a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs index 9dcea142f..a4b141f38 100644 --- a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs +++ b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs @@ -4,14 +4,12 @@ using System; using System.Buffers.Binary; using System.IO; -using System.Numerics; using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Tga { diff --git a/src/ImageSharp/IO/DoubleBufferedStreamReader.cs b/src/ImageSharp/IO/DoubleBufferedStreamReader.cs index 07f892806..0345717d2 100644 --- a/src/ImageSharp/IO/DoubleBufferedStreamReader.cs +++ b/src/ImageSharp/IO/DoubleBufferedStreamReader.cs @@ -6,7 +6,7 @@ using System.Buffers; using System.IO; using System.Runtime.CompilerServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.IO { diff --git a/src/ImageSharp/Image.Decode.cs b/src/ImageSharp/Image.Decode.cs index db6a5e165..e1376b4a2 100644 --- a/src/ImageSharp/Image.Decode.cs +++ b/src/ImageSharp/Image.Decode.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Image.cs b/src/ImageSharp/Image.cs index d7fed9016..a62bfed1e 100644 --- a/src/ImageSharp/Image.cs +++ b/src/ImageSharp/Image.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/ImageFrame.cs b/src/ImageSharp/ImageFrame.cs index 91872b21d..fe2a2b762 100644 --- a/src/ImageSharp/ImageFrame.cs +++ b/src/ImageSharp/ImageFrame.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. using System; - +using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/ImageFrame{TPixel}.cs b/src/ImageSharp/ImageFrame{TPixel}.cs index 64f37a340..85454e150 100644 --- a/src/ImageSharp/ImageFrame{TPixel}.cs +++ b/src/ImageSharp/ImageFrame{TPixel}.cs @@ -10,8 +10,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/ImageInfoExtensions.cs b/src/ImageSharp/ImageInfoExtensions.cs index dca5502d0..abaa7c4bc 100644 --- a/src/ImageSharp/ImageInfoExtensions.cs +++ b/src/ImageSharp/ImageInfoExtensions.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp { /// diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index 6c7269698..0fd449d90 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -24,9 +24,9 @@ - - - + + + diff --git a/src/ImageSharp/Image{TPixel}.cs b/src/ImageSharp/Image{TPixel}.cs index 29184522f..b7e63dc25 100644 --- a/src/ImageSharp/Image{TPixel}.cs +++ b/src/ImageSharp/Image{TPixel}.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Memory/Allocators/AllocationOptions.cs b/src/ImageSharp/Memory/Allocators/AllocationOptions.cs index 5eda00505..4edb702ed 100644 --- a/src/ImageSharp/Memory/Allocators/AllocationOptions.cs +++ b/src/ImageSharp/Memory/Allocators/AllocationOptions.cs @@ -1,7 +1,7 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Options for allocating buffers. diff --git a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs index 5676ab23f..0d7e0b784 100644 --- a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs +++ b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -1,12 +1,12 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; using System.Buffers; using System.Runtime.InteropServices; -using SixLabors.Memory.Internals; +using SixLabors.ImageSharp.Memory.Internals; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Contains and . @@ -82,4 +82,4 @@ namespace SixLabors.Memory public byte[] Array => this.Data; } } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs index dd6e9a8f0..1ce2525b8 100644 --- a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs +++ b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Contains common factory methods and configuration constants. diff --git a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs index 0905948e0..c4d92ca3c 100644 --- a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs +++ b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs @@ -5,7 +5,7 @@ using System; using System.Buffers; using System.Runtime.CompilerServices; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Implements by allocating memory from . diff --git a/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs b/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs index b6d956c10..cb1f58ddb 100644 --- a/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs +++ b/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs @@ -3,7 +3,7 @@ using System.Buffers; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Represents a byte buffer backed by a managed array. Useful for interop with classic .NET API-s. diff --git a/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs b/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs index c0d36afd5..56057f372 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs +++ b/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Runtime.CompilerServices; -namespace SixLabors.Memory.Internals +namespace SixLabors.ImageSharp.Memory.Internals { /// /// Wraps an array as an instance. diff --git a/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs b/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs index fa6a5de4c..571ad70c5 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs +++ b/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -namespace SixLabors.Memory.Internals +namespace SixLabors.ImageSharp.Memory.Internals { /// /// Provides an based on . diff --git a/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs b/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs index e1f131693..890963860 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs +++ b/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs @@ -4,7 +4,7 @@ using System.Buffers; using System.Runtime.InteropServices; -namespace SixLabors.Memory.Internals +namespace SixLabors.ImageSharp.Memory.Internals { /// /// Provides a base class for implementations by implementing pinning logic for adaption. diff --git a/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs index 24ed7bef3..20598c3e3 100644 --- a/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs +++ b/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs @@ -3,7 +3,7 @@ using System.Buffers; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Memory managers are used to allocate memory for image processing operations. diff --git a/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs index acf17ad63..54b64b131 100644 --- a/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs +++ b/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs @@ -1,11 +1,10 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System; using System.Buffers; -using SixLabors.Memory.Internals; +using SixLabors.ImageSharp.Memory.Internals; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Implements by newing up arrays by the GC on every allocation requests. diff --git a/src/ImageSharp/Memory/Buffer2DExtensions.cs b/src/ImageSharp/Memory/Buffer2DExtensions.cs index 35d55ba59..ba4f9c925 100644 --- a/src/ImageSharp/Memory/Buffer2DExtensions.cs +++ b/src/ImageSharp/Memory/Buffer2DExtensions.cs @@ -6,8 +6,6 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// diff --git a/src/ImageSharp/Memory/Buffer2D{T}.cs b/src/ImageSharp/Memory/Buffer2D{T}.cs index 69dff78c1..6b7f3bf42 100644 --- a/src/ImageSharp/Memory/Buffer2D{T}.cs +++ b/src/ImageSharp/Memory/Buffer2D{T}.cs @@ -4,8 +4,6 @@ using System; using System.Runtime.CompilerServices; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// @@ -16,7 +14,7 @@ namespace SixLabors.ImageSharp.Memory /// Before RC1, this class might be target of API changes, use it on your own risk! /// /// The value type. - // TODO: Consider moving this type to the SixLabors.Memory namespace (SixLabors.Core). + // TODO: Consider moving this type to the SixLabors.ImageSharp.Memory namespace (SixLabors.Core). public sealed class Buffer2D : IDisposable where T : struct { diff --git a/src/ImageSharp/Memory/BufferArea{T}.cs b/src/ImageSharp/Memory/BufferArea{T}.cs index 38f0b8129..08731846e 100644 --- a/src/ImageSharp/Memory/BufferArea{T}.cs +++ b/src/ImageSharp/Memory/BufferArea{T}.cs @@ -3,8 +3,6 @@ using System; using System.Runtime.CompilerServices; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// diff --git a/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs b/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs index a3fa0e1ff..6e317bb8f 100644 --- a/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs +++ b/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs @@ -3,9 +3,6 @@ using System.Buffers; -using SixLabors.Memory; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// diff --git a/src/ImageSharp/Memory/MemorySource.cs b/src/ImageSharp/Memory/MemorySource.cs index f0b0ab028..54f1bb0d1 100644 --- a/src/ImageSharp/Memory/MemorySource.cs +++ b/src/ImageSharp/Memory/MemorySource.cs @@ -4,8 +4,6 @@ using System; using System.Buffers; -using SixLabors.Memory; - namespace SixLabors.ImageSharp.Memory { /// diff --git a/src/ImageSharp/Memory/RowInterval.cs b/src/ImageSharp/Memory/RowInterval.cs index 13037c889..c2962cfe9 100644 --- a/src/ImageSharp/Memory/RowInterval.cs +++ b/src/ImageSharp/Memory/RowInterval.cs @@ -1,10 +1,8 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// @@ -13,7 +11,6 @@ namespace SixLabors.ImageSharp.Memory /// /// Before RC1, this class might be target of API changes, use it on your own risk! /// - // TODO: Consider moving this type to the SixLabors.Memory namespace (SixLabors.Core). public readonly struct RowInterval : IEquatable { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifProfile.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifProfile.cs index f98a1f3c7..c2a731825 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifProfile.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifProfile.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.IO; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs index 00410fb59..6ad8d24fa 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs @@ -7,7 +7,6 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Runtime.CompilerServices; using System.Text; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs index 48b0fddca..c068461b2 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs @@ -5,7 +5,6 @@ using System; using System.Buffers.Binary; using System.Collections.Generic; using System.Text; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Number.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Number.cs index 7f6be3c4d..6cea52b1a 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Number.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Number.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.NumberArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.NumberArray.cs index b4feba056..b515ab36a 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.NumberArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.NumberArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Rational.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Rational.cs index db52bbb22..f1364b2c3 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Rational.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Rational.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.RationalArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.RationalArray.cs index ece06c247..63b10e3e2 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.RationalArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.RationalArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRational.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRational.cs index 58a713411..29d61db88 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRational.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRational.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRationalArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRationalArray.cs index 4022f5c1a..9a6e3063b 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRationalArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRationalArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumber.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumber.cs index 8d886d21c..ef7d20c85 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumber.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumber.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Globalization; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumberArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumberArray.cs index a7ecf7bc8..521cfc085 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumberArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumberArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { internal sealed class ExifNumberArray : ExifArrayValue diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRational.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRational.cs index 2806386b5..3ab77ab32 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRational.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRational.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Globalization; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRationalArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRationalArray.cs index ae4fb0c57..f78e363da 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRationalArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRationalArray.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRational.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRational.cs index 2a4051601..61fba979b 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRational.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRational.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Globalization; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRationalArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRationalArray.cs index 6c6bb0a4a..2545bd9b2 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRationalArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRationalArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { internal sealed class ExifSignedRationalArray : ExifArrayValue diff --git a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Matrix.cs b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Matrix.cs index b0bd377cb..585892e96 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Matrix.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Matrix.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Icc { diff --git a/src/ImageSharp/Metadata/Profiles/ICC/MultiProcessElements/IccMatrixProcessElement.cs b/src/ImageSharp/Metadata/Profiles/ICC/MultiProcessElements/IccMatrixProcessElement.cs index 0d8683397..668883e1a 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/MultiProcessElements/IccMatrixProcessElement.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/MultiProcessElements/IccMatrixProcessElement.cs @@ -3,8 +3,6 @@ using System; -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Icc { /// diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs index 51ee5d12d..4075b664c 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs @@ -4,10 +4,6 @@ // using System; using System.Numerics; -using System.Buffers; - -using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { @@ -26,7 +22,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders where TPixel : struct, IPixel { - /// /// A pixel blender that implements the "NormalSrc" composition equation. /// @@ -65,7 +60,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplySrc" composition equation. /// @@ -104,7 +98,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddSrc" composition equation. /// @@ -143,7 +136,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractSrc" composition equation. /// @@ -182,7 +174,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenSrc" composition equation. /// @@ -221,7 +212,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenSrc" composition equation. /// @@ -260,7 +250,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenSrc" composition equation. /// @@ -299,7 +288,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlaySrc" composition equation. /// @@ -338,7 +326,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightSrc" composition equation. /// @@ -377,7 +364,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalSrcAtop" composition equation. /// @@ -416,7 +402,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplySrcAtop" composition equation. /// @@ -455,7 +440,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddSrcAtop" composition equation. /// @@ -494,7 +478,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractSrcAtop" composition equation. /// @@ -533,7 +516,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenSrcAtop" composition equation. /// @@ -572,7 +554,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenSrcAtop" composition equation. /// @@ -611,7 +592,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenSrcAtop" composition equation. /// @@ -650,7 +630,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlaySrcAtop" composition equation. /// @@ -689,7 +668,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightSrcAtop" composition equation. /// @@ -728,7 +706,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalSrcOver" composition equation. /// @@ -767,7 +744,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplySrcOver" composition equation. /// @@ -806,7 +782,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddSrcOver" composition equation. /// @@ -845,7 +820,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractSrcOver" composition equation. /// @@ -884,7 +858,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenSrcOver" composition equation. /// @@ -923,7 +896,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenSrcOver" composition equation. /// @@ -962,7 +934,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenSrcOver" composition equation. /// @@ -1001,7 +972,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlaySrcOver" composition equation. /// @@ -1040,7 +1010,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightSrcOver" composition equation. /// @@ -1079,7 +1048,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalSrcIn" composition equation. /// @@ -1118,7 +1086,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplySrcIn" composition equation. /// @@ -1157,7 +1124,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddSrcIn" composition equation. /// @@ -1196,7 +1162,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractSrcIn" composition equation. /// @@ -1235,7 +1200,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenSrcIn" composition equation. /// @@ -1274,7 +1238,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenSrcIn" composition equation. /// @@ -1313,7 +1276,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenSrcIn" composition equation. /// @@ -1352,7 +1314,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlaySrcIn" composition equation. /// @@ -1391,7 +1352,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightSrcIn" composition equation. /// @@ -1430,7 +1390,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalSrcOut" composition equation. /// @@ -1469,7 +1428,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplySrcOut" composition equation. /// @@ -1508,7 +1466,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddSrcOut" composition equation. /// @@ -1547,7 +1504,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractSrcOut" composition equation. /// @@ -1586,7 +1542,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenSrcOut" composition equation. /// @@ -1625,7 +1580,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenSrcOut" composition equation. /// @@ -1664,7 +1618,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenSrcOut" composition equation. /// @@ -1703,7 +1656,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlaySrcOut" composition equation. /// @@ -1742,7 +1694,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightSrcOut" composition equation. /// @@ -1781,7 +1732,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalDest" composition equation. /// @@ -1820,7 +1770,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplyDest" composition equation. /// @@ -1859,7 +1808,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddDest" composition equation. /// @@ -1898,7 +1846,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractDest" composition equation. /// @@ -1937,7 +1884,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenDest" composition equation. /// @@ -1976,7 +1922,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenDest" composition equation. /// @@ -2015,7 +1960,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenDest" composition equation. /// @@ -2054,7 +1998,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlayDest" composition equation. /// @@ -2093,7 +2036,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightDest" composition equation. /// @@ -2132,7 +2074,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalDestAtop" composition equation. /// @@ -2171,7 +2112,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplyDestAtop" composition equation. /// @@ -2210,7 +2150,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddDestAtop" composition equation. /// @@ -2249,7 +2188,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractDestAtop" composition equation. /// @@ -2288,7 +2226,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenDestAtop" composition equation. /// @@ -2327,7 +2264,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenDestAtop" composition equation. /// @@ -2366,7 +2302,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenDestAtop" composition equation. /// @@ -2405,7 +2340,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlayDestAtop" composition equation. /// @@ -2444,7 +2378,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightDestAtop" composition equation. /// @@ -2483,7 +2416,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalDestOver" composition equation. /// @@ -2522,7 +2454,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplyDestOver" composition equation. /// @@ -2561,7 +2492,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddDestOver" composition equation. /// @@ -2600,7 +2530,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractDestOver" composition equation. /// @@ -2639,7 +2568,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenDestOver" composition equation. /// @@ -2678,7 +2606,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenDestOver" composition equation. /// @@ -2717,7 +2644,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenDestOver" composition equation. /// @@ -2756,7 +2682,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlayDestOver" composition equation. /// @@ -2795,7 +2720,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightDestOver" composition equation. /// @@ -2834,7 +2758,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalDestIn" composition equation. /// @@ -2873,7 +2796,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplyDestIn" composition equation. /// @@ -2912,7 +2834,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddDestIn" composition equation. /// @@ -2951,7 +2872,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractDestIn" composition equation. /// @@ -2990,7 +2910,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenDestIn" composition equation. /// @@ -3029,7 +2948,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenDestIn" composition equation. /// @@ -3068,7 +2986,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenDestIn" composition equation. /// @@ -3107,7 +3024,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlayDestIn" composition equation. /// @@ -3146,7 +3062,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightDestIn" composition equation. /// @@ -3185,7 +3100,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalDestOut" composition equation. /// @@ -3224,7 +3138,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplyDestOut" composition equation. /// @@ -3263,7 +3176,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddDestOut" composition equation. /// @@ -3302,7 +3214,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractDestOut" composition equation. /// @@ -3341,7 +3252,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenDestOut" composition equation. /// @@ -3380,7 +3290,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenDestOut" composition equation. /// @@ -3419,7 +3328,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenDestOut" composition equation. /// @@ -3458,7 +3366,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlayDestOut" composition equation. /// @@ -3497,7 +3404,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightDestOut" composition equation. /// @@ -3536,7 +3442,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalClear" composition equation. /// @@ -3575,7 +3480,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplyClear" composition equation. /// @@ -3614,7 +3518,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddClear" composition equation. /// @@ -3653,7 +3556,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractClear" composition equation. /// @@ -3692,7 +3594,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenClear" composition equation. /// @@ -3731,7 +3632,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenClear" composition equation. /// @@ -3770,7 +3670,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenClear" composition equation. /// @@ -3809,7 +3708,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlayClear" composition equation. /// @@ -3848,7 +3746,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightClear" composition equation. /// @@ -3887,7 +3784,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "NormalXor" composition equation. /// @@ -3926,7 +3822,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "MultiplyXor" composition equation. /// @@ -3965,7 +3860,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "AddXor" composition equation. /// @@ -4004,7 +3898,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "SubtractXor" composition equation. /// @@ -4043,7 +3936,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "ScreenXor" composition equation. /// @@ -4082,7 +3974,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "DarkenXor" composition equation. /// @@ -4121,7 +4012,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "LightenXor" composition equation. /// @@ -4160,7 +4050,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "OverlayXor" composition equation. /// @@ -4199,7 +4088,6 @@ namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders } } - /// /// A pixel blender that implements the "HardLightXor" composition equation. /// diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt index 55eb01df3..ccb98c495 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt @@ -14,10 +14,6 @@ // using System; using System.Numerics; -using System.Buffers; - -using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { diff --git a/src/ImageSharp/Primitives/ColorMatrix.cs b/src/ImageSharp/Primitives/ColorMatrix.cs index 11886c9c2..477d120fa 100644 --- a/src/ImageSharp/Primitives/ColorMatrix.cs +++ b/src/ImageSharp/Primitives/ColorMatrix.cs @@ -6,7 +6,7 @@ using System; using System.Globalization; using System.Runtime.InteropServices; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// A structure encapsulating a 5x4 matrix used for transforming the color and alpha components of an image. diff --git a/src/ImageSharp/Primitives/Complex64.cs b/src/ImageSharp/Primitives/Complex64.cs index 96883229c..a5af3f2f7 100644 --- a/src/ImageSharp/Primitives/Complex64.cs +++ b/src/ImageSharp/Primitives/Complex64.cs @@ -5,7 +5,7 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a complex number, where the real and imaginary parts are stored as values. diff --git a/src/ImageSharp/Primitives/ComplexVector4.cs b/src/ImageSharp/Primitives/ComplexVector4.cs index b90da65b2..5287ab23f 100644 --- a/src/ImageSharp/Primitives/ComplexVector4.cs +++ b/src/ImageSharp/Primitives/ComplexVector4.cs @@ -5,7 +5,7 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// A vector with 4 values of type . diff --git a/src/ImageSharp/Primitives/DenseMatrix{T}.cs b/src/ImageSharp/Primitives/DenseMatrix{T}.cs index cc5e4a90a..4229e69e7 100644 --- a/src/ImageSharp/Primitives/DenseMatrix{T}.cs +++ b/src/ImageSharp/Primitives/DenseMatrix{T}.cs @@ -4,9 +4,8 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; -using SixLabors.Primitives; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a dense matrix with arbitrary elements. diff --git a/src/ImageSharp/Primitives/LongRational.cs b/src/ImageSharp/Primitives/LongRational.cs index b15aa4022..d0f56917e 100644 --- a/src/ImageSharp/Primitives/LongRational.cs +++ b/src/ImageSharp/Primitives/LongRational.cs @@ -5,7 +5,7 @@ using System; using System.Globalization; using System.Text; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a number that can be expressed as a fraction. diff --git a/src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs b/src/ImageSharp/Primitives/Matrix3x2Extensions.cs similarity index 98% rename from src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs rename to src/ImageSharp/Primitives/Matrix3x2Extensions.cs index 2d33ea70d..4ddbcc017 100644 --- a/src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs +++ b/src/ImageSharp/Primitives/Matrix3x2Extensions.cs @@ -1,9 +1,9 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System.Numerics; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Extension methods for the struct. @@ -98,4 +98,4 @@ namespace SixLabors.Primitives /// A rotation matrix. public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(GeometryUtilities.DegreeToRadian(degrees), centerPoint); } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Primitives/Number.cs b/src/ImageSharp/Primitives/Number.cs index 88974e72b..3d575e866 100644 --- a/src/ImageSharp/Primitives/Number.cs +++ b/src/ImageSharp/Primitives/Number.cs @@ -5,7 +5,7 @@ using System; using System.Globalization; using System.Runtime.InteropServices; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents an integral number. diff --git a/src/ImageSharp/Primitives/Core/Point.cs b/src/ImageSharp/Primitives/Point.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/Point.cs rename to src/ImageSharp/Primitives/Point.cs index ec5733041..96e73766b 100644 --- a/src/ImageSharp/Primitives/Core/Point.cs +++ b/src/ImageSharp/Primitives/Point.cs @@ -6,7 +6,7 @@ using System.ComponentModel; using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Represents an ordered pair of integer x- and y-coordinates that defines a point in diff --git a/src/ImageSharp/Primitives/Core/PointF.cs b/src/ImageSharp/Primitives/PointF.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/PointF.cs rename to src/ImageSharp/Primitives/PointF.cs index 4a2da5cdc..e43ad4daf 100644 --- a/src/ImageSharp/Primitives/Core/PointF.cs +++ b/src/ImageSharp/Primitives/PointF.cs @@ -6,7 +6,7 @@ using System.ComponentModel; using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Represents an ordered pair of single precision floating point x- and y-coordinates that defines a point in diff --git a/src/ImageSharp/Primitives/Rational.cs b/src/ImageSharp/Primitives/Rational.cs index f9299bc17..212178a24 100644 --- a/src/ImageSharp/Primitives/Rational.cs +++ b/src/ImageSharp/Primitives/Rational.cs @@ -4,7 +4,7 @@ using System; using System.Globalization; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a number that can be expressed as a fraction. diff --git a/src/ImageSharp/Primitives/Core/Rectangle.cs b/src/ImageSharp/Primitives/Rectangle.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/Rectangle.cs rename to src/ImageSharp/Primitives/Rectangle.cs index 8600e2e4c..95b01fd9d 100644 --- a/src/ImageSharp/Primitives/Core/Rectangle.cs +++ b/src/ImageSharp/Primitives/Rectangle.cs @@ -6,7 +6,7 @@ using System.ComponentModel; using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Stores a set of four integers that represent the location and size of a rectangle. diff --git a/src/ImageSharp/Primitives/Core/RectangleF.cs b/src/ImageSharp/Primitives/RectangleF.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/RectangleF.cs rename to src/ImageSharp/Primitives/RectangleF.cs index c8b58f4ed..354daa446 100644 --- a/src/ImageSharp/Primitives/Core/RectangleF.cs +++ b/src/ImageSharp/Primitives/RectangleF.cs @@ -6,7 +6,7 @@ using System.ComponentModel; using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Stores a set of four single precision floating points that represent the location and size of a rectangle. diff --git a/src/ImageSharp/Primitives/SignedRational.cs b/src/ImageSharp/Primitives/SignedRational.cs index 395a24b14..93a0ffe39 100644 --- a/src/ImageSharp/Primitives/SignedRational.cs +++ b/src/ImageSharp/Primitives/SignedRational.cs @@ -4,7 +4,7 @@ using System; using System.Globalization; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a number that can be expressed as a fraction. diff --git a/src/ImageSharp/Primitives/Core/Size.cs b/src/ImageSharp/Primitives/Size.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/Size.cs rename to src/ImageSharp/Primitives/Size.cs index e0eb6484c..effd657a6 100644 --- a/src/ImageSharp/Primitives/Core/Size.cs +++ b/src/ImageSharp/Primitives/Size.cs @@ -6,7 +6,7 @@ using System.ComponentModel; using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Stores an ordered pair of integers, which specify a height and width. diff --git a/src/ImageSharp/Primitives/Core/SizeF.cs b/src/ImageSharp/Primitives/SizeF.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/SizeF.cs rename to src/ImageSharp/Primitives/SizeF.cs index 5d503a705..7d9bc5814 100644 --- a/src/ImageSharp/Primitives/Core/SizeF.cs +++ b/src/ImageSharp/Primitives/SizeF.cs @@ -6,7 +6,7 @@ using System.ComponentModel; using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Stores an ordered pair of single precision floating points, which specify a height and width. diff --git a/src/ImageSharp/Primitives/ValueSize.cs b/src/ImageSharp/Primitives/ValueSize.cs index 577e9187a..be2ccb725 100644 --- a/src/ImageSharp/Primitives/ValueSize.cs +++ b/src/ImageSharp/Primitives/ValueSize.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.Primitives; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a value in relation to a value on the image. diff --git a/src/ImageSharp/Processing/AffineTransformBuilder.cs b/src/ImageSharp/Processing/AffineTransformBuilder.cs index c3d01241c..90e00924a 100644 --- a/src/ImageSharp/Processing/AffineTransformBuilder.cs +++ b/src/ImageSharp/Processing/AffineTransformBuilder.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Numerics; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs b/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs index 5d986b6cc..a4a3f9b3d 100644 --- a/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs +++ b/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Binarization/BinaryDiffuseExtensions.cs b/src/ImageSharp/Processing/Extensions/Binarization/BinaryDiffuseExtensions.cs index 760102aac..66337f669 100644 --- a/src/ImageSharp/Processing/Extensions/Binarization/BinaryDiffuseExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Binarization/BinaryDiffuseExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors.Binarization; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Binarization/BinaryDitherExtensions.cs b/src/ImageSharp/Processing/Extensions/Binarization/BinaryDitherExtensions.cs index e8ce252a2..afd4a4941 100644 --- a/src/ImageSharp/Processing/Extensions/Binarization/BinaryDitherExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Binarization/BinaryDitherExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors.Binarization; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Binarization/BinaryThresholdExtensions.cs b/src/ImageSharp/Processing/Extensions/Binarization/BinaryThresholdExtensions.cs index 35aa681e3..d4fe9b562 100644 --- a/src/ImageSharp/Processing/Extensions/Binarization/BinaryThresholdExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Binarization/BinaryThresholdExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Binarization; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/BokehBlurExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/BokehBlurExtensions.cs index 2bbdd03b0..7e0b3df39 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/BokehBlurExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/BokehBlurExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/BoxBlurExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/BoxBlurExtensions.cs index 42dfd425c..4534e474a 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/BoxBlurExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/BoxBlurExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/DetectEdgesExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/DetectEdgesExtensions.cs index 837b26910..53b2d40b0 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/DetectEdgesExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/DetectEdgesExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors; using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/GaussianBlurExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/GaussianBlurExtensions.cs index 858e3213b..9c40d94ed 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/GaussianBlurExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/GaussianBlurExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/GaussianSharpenExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/GaussianSharpenExtensions.cs index 79f4a0cc3..007fffb1a 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/GaussianSharpenExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/GaussianSharpenExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Dithering/DiffuseExtensions.cs b/src/ImageSharp/Processing/Extensions/Dithering/DiffuseExtensions.cs index 45eb932fe..92d312fdf 100644 --- a/src/ImageSharp/Processing/Extensions/Dithering/DiffuseExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Dithering/DiffuseExtensions.cs @@ -4,7 +4,6 @@ using System; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs b/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs index f83a9e9e8..f58b025f3 100644 --- a/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs @@ -4,7 +4,6 @@ using System; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs b/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs index 6c7998437..4717c09ea 100644 --- a/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Drawing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Effects/OilPaintExtensions.cs b/src/ImageSharp/Processing/Extensions/Effects/OilPaintExtensions.cs index 1aa98c8c1..521617281 100644 --- a/src/ImageSharp/Processing/Extensions/Effects/OilPaintExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Effects/OilPaintExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Effects; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Effects/PixelShaderExtensions.cs b/src/ImageSharp/Processing/Extensions/Effects/PixelShaderExtensions.cs index b866e7fb1..00fd54267 100644 --- a/src/ImageSharp/Processing/Extensions/Effects/PixelShaderExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Effects/PixelShaderExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Effects; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Effects/PixelateExtensions.cs b/src/ImageSharp/Processing/Extensions/Effects/PixelateExtensions.cs index bf40af91a..f2a10532d 100644 --- a/src/ImageSharp/Processing/Extensions/Effects/PixelateExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Effects/PixelateExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Effects; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/BlackWhiteExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/BlackWhiteExtensions.cs index c148ccbcb..788677fc8 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/BlackWhiteExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/BlackWhiteExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/BrightnessExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/BrightnessExtensions.cs index 8e43f06c5..7bc441297 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/BrightnessExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/BrightnessExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/ColorBlindnessExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/ColorBlindnessExtensions.cs index b8d503955..e214c5a16 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/ColorBlindnessExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/ColorBlindnessExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/ContrastExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/ContrastExtensions.cs index bdfd7c98a..4a3e460b8 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/ContrastExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/ContrastExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/FilterExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/FilterExtensions.cs index 662e3a6e1..088f61884 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/FilterExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/FilterExtensions.cs @@ -1,9 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/GrayscaleExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/GrayscaleExtensions.cs index d87c40226..4125de832 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/GrayscaleExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/GrayscaleExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/HueExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/HueExtensions.cs index 3955ea7f6..ef1fa2a6e 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/HueExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/HueExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/InvertExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/InvertExtensions.cs index 16c7a8917..0642db849 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/InvertExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/InvertExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/KodachromeExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/KodachromeExtensions.cs index 6c9b27983..eadbde7bc 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/KodachromeExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/KodachromeExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/LightnessExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/LightnessExtensions.cs index 86db9509e..d68cb6aac 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/LightnessExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/LightnessExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs index c2b6ac080..84b11c5e7 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/OpacityExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/OpacityExtensions.cs index 9c67113ec..2cf6085f3 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/OpacityExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/OpacityExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs index 6b6d43d5b..94ced7108 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/SaturateExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/SaturateExtensions.cs index a94a9a407..f68c424bd 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/SaturateExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/SaturateExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/SepiaExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/SepiaExtensions.cs index df32307f4..629ba03e7 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/SepiaExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/SepiaExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs index 4241721f4..d068ba10b 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs index 48ecb5108..d5114e30a 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs @@ -1,9 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs index a1f3a6e8a..799b30e01 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs @@ -1,9 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Transforms/CropExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/CropExtensions.cs index 7ec85169e..5fc8125ea 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/CropExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/CropExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Transforms/PadExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/PadExtensions.cs index 270380084..33a6fc36d 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/PadExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/PadExtensions.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing { /// diff --git a/src/ImageSharp/Processing/Extensions/Transforms/ResizeExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/ResizeExtensions.cs index f494ed909..882b17721 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/ResizeExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/ResizeExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs index 7fffb71d2..630564955 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs @@ -4,7 +4,6 @@ using System.Numerics; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/IImageProcessingContext.cs b/src/ImageSharp/Processing/IImageProcessingContext.cs index e10c14088..8b57a289d 100644 --- a/src/ImageSharp/Processing/IImageProcessingContext.cs +++ b/src/ImageSharp/Processing/IImageProcessingContext.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/KnownFilterMatrices.cs b/src/ImageSharp/Processing/KnownFilterMatrices.cs index 31b19433c..268281e4f 100644 --- a/src/ImageSharp/Processing/KnownFilterMatrices.cs +++ b/src/ImageSharp/Processing/KnownFilterMatrices.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Primitives; // Many of these matrices are translated from Chromium project where // SkScalar[] is memory-mapped to a row-major matrix. diff --git a/src/ImageSharp/Processing/PositionAwarePixelShader.cs b/src/ImageSharp/Processing/PositionAwarePixelShader.cs index 1ae3ba295..c87d3ada6 100644 --- a/src/ImageSharp/Processing/PositionAwarePixelShader.cs +++ b/src/ImageSharp/Processing/PositionAwarePixelShader.cs @@ -3,7 +3,6 @@ using System; using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor.cs index caedf87ba..287853979 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor{TPixel}.cs index cdea1780f..262e9d024 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using System; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor.cs index 6a2ee7623..1626bbe80 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor.cs @@ -5,7 +5,6 @@ using System; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor{TPixel}.cs index 64fb617c6..66b92d1ce 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using System; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs index 102232b13..7bfb02446 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs index 45cb1d9f7..380ce64d2 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using System; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/CloningImageProcessor.cs b/src/ImageSharp/Processing/Processors/CloningImageProcessor.cs index 3b88cf7f0..92c84a945 100644 --- a/src/ImageSharp/Processing/Processors/CloningImageProcessor.cs +++ b/src/ImageSharp/Processing/Processors/CloningImageProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs index 780bec22c..c539861f9 100644 --- a/src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs @@ -2,10 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Collections.Generic; -using System.Linq; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs index 477c3da9a..6bb02f1d1 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs index 6ffda59a8..316579da7 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs @@ -11,10 +11,7 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Convolution.Parameters; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs index 94ecce9d1..7ca4b6c6f 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor{TPixel}.cs index f127fc1a8..095c91bac 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor{TPixel}.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor{TPixel}.cs index 44faf3eb1..c2b85a4ab 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor{TPixel}.cs @@ -8,8 +8,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor{TPixel}.cs index 5182d90b1..32bdf6bc5 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor{TPixel}.cs @@ -8,8 +8,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs index 661ab523d..34b085fc6 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs @@ -3,8 +3,6 @@ using System; -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { internal static class ConvolutionProcessorHelpers diff --git a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs index 6f0e7914b..285bcab27 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs @@ -8,8 +8,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor{TPixel}.cs index dbd82191c..31c4fad79 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor{TPixel}.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor{TPixel}.cs index f3940bb73..c1897bed8 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor{TPixel}.cs @@ -9,9 +9,7 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs index f369d60dd..eb7f07905 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs index e6411f8cb..ce19ba82d 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs index bdba8f4ca..9f511a754 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor{TPixel}.cs index 2ccd8d577..3c1f82caa 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor{TPixel}.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs index d1b2b3072..b1f47863d 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor{TPixel}.cs index d61d8e6c5..f4f27a42d 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor{TPixel}.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs index cc29be983..90ed15aa3 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs index f44de9105..423fc6591 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { internal abstract class CompassKernels diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs index dd4d02302..50d5bfafe 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs index 882b87075..58568ce40 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs index 19f2d1161..8371212fe 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs index e7b7f965b..f72e95ee8 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs index 381e028d4..cae9ecb5b 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs index f61220e1e..8ffd624d2 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs index 699d669ec..ba60bfdf6 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs index f0662c667..ec583862f 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs index 113957c83..3dbd54a2c 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs index 182a30c08..7207f95c4 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs b/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs index 163420f3d..b147a87cc 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs b/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs index 77cfffced..663ebf051 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs index a8d3ff6f1..8b0cfc6ff 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelData.cs b/src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelData.cs index 4338bcf6b..5f03396ba 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelData.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelData.cs @@ -3,8 +3,6 @@ using System.Numerics; -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution.Parameters { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs index dcb20573a..7fc54ff96 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs index 84b685467..74d5094f5 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs index 34c4ab35a..18ac90614 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs index 76a4ae08d..24248204b 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs index 185ac891d..1ab56d120 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/AtkinsonDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/AtkinsonDiffuser.cs index f167ac5cb..9cf10ce59 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/AtkinsonDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/AtkinsonDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/BurksDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/BurksDiffuser.cs index 3c1ff75f4..152704ec2 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/BurksDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/BurksDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffuser.cs index 7911c6ca9..d6ccfb369 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffuser.cs @@ -6,7 +6,6 @@ using System.Numerics; using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor.cs b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor.cs index 48ad546f2..059816065 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor{TPixel}.cs index ff4b6de52..f0c8610ed 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/FloydSteinbergDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/FloydSteinbergDiffuser.cs index ca0e3c647..b3137337b 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/FloydSteinbergDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/FloydSteinbergDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/JarvisJudiceNinkeDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/JarvisJudiceNinkeDiffuser.cs index 682db8352..40cf79266 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/JarvisJudiceNinkeDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/JarvisJudiceNinkeDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs index 174732f80..34eff4fe9 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherFactory.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherFactory.cs index 4b93c4259..f4835f421 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherFactory.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherFactory.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Runtime.CompilerServices; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor.cs index d66ce2192..e28c662f8 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor{TPixel}.cs index 6568033ea..29baa9750 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs index a8f46f3ad..0a1552c11 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs @@ -4,7 +4,6 @@ using System; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor{TPixel}.cs index 10c9a421e..c9f09fc62 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor{TPixel}.cs @@ -8,7 +8,6 @@ using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/Sierra2Diffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/Sierra2Diffuser.cs index 03791bff2..001df19af 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/Sierra2Diffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/Sierra2Diffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/Sierra3Diffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/Sierra3Diffuser.cs index c7d7acc82..3e56c63b3 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/Sierra3Diffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/Sierra3Diffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/SierraLiteDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/SierraLiteDiffuser.cs index e969f1b70..763695d66 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/SierraLiteDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/SierraLiteDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/StevensonArceDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/StevensonArceDiffuser.cs index 61727325a..72ff30c11 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/StevensonArceDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/StevensonArceDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/StuckiDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/StuckiDiffuser.cs index 76203201c..78e8fb4e4 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/StuckiDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/StuckiDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor.cs b/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor.cs index e1dbefdb6..032a0aab0 100644 --- a/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Drawing { diff --git a/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs b/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs index 55f72c7fc..a8b9093e5 100644 --- a/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs +++ b/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs @@ -6,7 +6,6 @@ using System; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Drawing { diff --git a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs index 0e11020eb..a35e4d828 100644 --- a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs index f143e5643..3bc6e7eac 100644 --- a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor.cs index 2d43fd53c..fef80dfc4 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessorBase.cs b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessorBase.cs index 9cee3779d..681f44651 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessorBase.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessorBase.cs @@ -7,7 +7,6 @@ using System.Numerics; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor{TPixel}.cs index a4338423e..244cfe3a7 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System; using System.Numerics; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs index 9b67545e5..a71f8424f 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor{TPixel}.cs index d15bfc007..df85afc5e 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor{TPixel}.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Common; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor.cs index 46d2e31cf..7494f6ffc 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor{TPixel}.cs index db2d85bfc..a539b5105 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System; using System.Numerics; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor.cs b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor.cs index 028060f66..1542c6836 100644 --- a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Filters { diff --git a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs index 86d990a38..28a5837de 100644 --- a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs @@ -6,8 +6,6 @@ using System.Numerics; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Filters { diff --git a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs index 8836bd62c..3c150d7eb 100644 --- a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Filters { /// diff --git a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs index 30731fcbf..8e3759fba 100644 --- a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Filters { diff --git a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs index 9a8c2b518..a5cf26862 100644 --- a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Filters { /// diff --git a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs index 08235e1bf..24ee16296 100644 --- a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Filters { diff --git a/src/ImageSharp/Processing/Processors/ICloningImageProcessor.cs b/src/ImageSharp/Processing/Processors/ICloningImageProcessor.cs index 7ffa5bcc0..ad8051e6b 100644 --- a/src/ImageSharp/Processing/Processors/ICloningImageProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ICloningImageProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/IImageProcessor.cs b/src/ImageSharp/Processing/Processors/IImageProcessor.cs index 6b9b82b10..a9d5b20ec 100644 --- a/src/ImageSharp/Processing/Processors/IImageProcessor.cs +++ b/src/ImageSharp/Processing/Processors/IImageProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/ImageProcessorExtensions.cs b/src/ImageSharp/Processing/Processors/ImageProcessorExtensions.cs index 7956ecd9a..6f486e74b 100644 --- a/src/ImageSharp/Processing/Processors/ImageProcessorExtensions.cs +++ b/src/ImageSharp/Processing/Processors/ImageProcessorExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/ImageProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/ImageProcessor{TPixel}.cs index 21d245a11..be8bc8e12 100644 --- a/src/ImageSharp/Processing/Processors/ImageProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/ImageProcessor{TPixel}.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor.cs index 6d8ccdca3..1fdb10661 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Normalization { /// diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs index 0e664a598..b5b8cfe56 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs @@ -11,8 +11,6 @@ using System.Threading.Tasks; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor.cs index cd29b18b9..ff8a6b73d 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Normalization { /// diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs index 901668e1f..987e4e392 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs @@ -11,8 +11,6 @@ using System.Threading.Tasks; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs index 288b59d6b..3b984578b 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Normalization { /// diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs index f75655006..ff34457fb 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs @@ -11,8 +11,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs index 7c1969ae2..8bd619095 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs index 8c25448d1..d7d72d4c8 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs index 6531c7461..c9123bbbf 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs index 0d9ee263a..1c974612e 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs index 13936232a..4f7ce7ba7 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs index 3f52a1c88..d6aa6f894 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs index ebec16062..9915a5f52 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs index 41f11f5af..fd782261b 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs index 0ac6b9b9c..8e1dffeed 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Quantization { diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs index 29b4c70c1..5e732982c 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Quantization { diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizedFrame{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizedFrame{TPixel}.cs index cbea82c1f..4938f0e12 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/QuantizedFrame{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizedFrame{TPixel}.cs @@ -6,7 +6,6 @@ using System.Buffers; using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Processing.Processors.Quantization { diff --git a/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs index ee2751eaf..9b5e89427 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs @@ -9,7 +9,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; // TODO: Isn't an AOS ("array of structures") layout more efficient & more readable than SOA ("structure of arrays") for this particular use case? // (T, R, G, B, A, M2) could be grouped together! Investigate a ColorMoment struct. diff --git a/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs index ffd5bc2d7..849f06166 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor{TPixel}.cs index 9251b95fc..1b9ff82bf 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using System.Numerics; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor.cs index e17588cd0..a059fb819 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor{TPixel}.cs index ebc81b604..90edcfac5 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs index 39f00e9a1..9aa21e4dc 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Transforms { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor{TPixel}.cs index b63036a01..a286e8fa2 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs index fdba6ed4f..d5aaaf515 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs index 62cd24fa0..74d719fbe 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Binarization; using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs index 455edf668..60e22e2d0 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor{TPixel}.cs index cbae932b8..d3afc7205 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor{TPixel}.cs @@ -7,7 +7,6 @@ using System.Buffers; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs index 93ff800c8..d8a9c3ed9 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor{TPixel}.cs index f924ef3c9..56df606a7 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor{TPixel}.cs @@ -7,7 +7,6 @@ using System.Numerics; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs index eacd3834f..de44d32e4 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs @@ -3,7 +3,6 @@ using System; using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.PeriodicKernelMap.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.PeriodicKernelMap.cs index 6d6e22a6a..be2546369 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.PeriodicKernelMap.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.PeriodicKernelMap.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs index 64c74a8b4..1b653a92c 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs @@ -7,7 +7,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs index 87b202ff7..ec1f94c14 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Transforms { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor{TPixel}.cs index 24752ae48..2e94f88ac 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor{TPixel}.cs @@ -7,8 +7,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs index 52faac0cd..4f5faa38e 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs @@ -9,8 +9,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs index 016395317..aae66e9ea 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor{TPixel}.cs index 6adab8bdf..8f1cf28ce 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor{TPixel}.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs index fb2114e03..4d0733334 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformKernelMap.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformKernelMap.cs index 573120888..a0d44cb7a 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformKernelMap.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformKernelMap.cs @@ -7,7 +7,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformProcessor.cs index 513e6962e..3a0a7e54e 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformProcessorHelpers.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformProcessorHelpers.cs index abc8c9d43..14eeca7cc 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformProcessorHelpers.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformProcessorHelpers.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs index 794645550..e0fb55438 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs @@ -4,7 +4,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs b/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs index c29941d07..0ff693d81 100644 --- a/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs +++ b/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Numerics; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/ResizeOptions.cs b/src/ImageSharp/Processing/ResizeOptions.cs index ef88dc35b..b54d2eae1 100644 --- a/src/ImageSharp/Processing/ResizeOptions.cs +++ b/src/ImageSharp/Processing/ResizeOptions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs index 1ab5ed309..6be1998fb 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs @@ -1,13 +1,12 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Drawing; using System.IO; using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs { @@ -31,7 +30,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs public string TestImage { get; set; } [Benchmark(Baseline = true, Description = "System.Drawing Bmp")] - public Size BmpSystemDrawing() + public SDSize BmpSystemDrawing() { using (var memoryStream = new MemoryStream(this.bmpBytes)) { @@ -43,15 +42,15 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs } [Benchmark(Description = "ImageSharp Bmp")] - public CoreSize BmpCore() + public Size BmpCore() { using (var memoryStream = new MemoryStream(this.bmpBytes)) { using (var image = Image.Load(memoryStream)) { - return new CoreSize(image.Width, image.Height); + return new Size(image.Width, image.Height); } } } } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs index cc946e05a..e4723d3a0 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs @@ -6,7 +6,7 @@ using System.Runtime.CompilerServices; using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; +using CoreSize = SixLabors.ImageSharp.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs { diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs index be7e85300..82dd57c29 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs @@ -1,13 +1,12 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Drawing; using System.IO; using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs { @@ -31,7 +30,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs public string TestImage { get; set; } [Benchmark(Baseline = true, Description = "System.Drawing Gif")] - public Size GifSystemDrawing() + public SDSize GifSystemDrawing() { using (var memoryStream = new MemoryStream(this.gifBytes)) { @@ -43,13 +42,13 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs } [Benchmark(Description = "ImageSharp Gif")] - public CoreSize GifCore() + public Size GifCore() { using (var memoryStream = new MemoryStream(this.gifBytes)) { using (var image = Image.Load(memoryStream)) { - return new CoreSize(image.Width, image.Height); + return new Size(image.Width, image.Height); } } } diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs index a19d8fa91..b69dd36d7 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs @@ -1,13 +1,12 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Drawing; using System.IO; using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs { @@ -31,7 +30,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs } [Benchmark(Baseline = true, Description = "System.Drawing Png")] - public Size PngSystemDrawing() + public SDSize PngSystemDrawing() { using (var memoryStream = new MemoryStream(this.pngBytes)) { @@ -43,7 +42,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs } [Benchmark(Description = "ImageSharp Png")] - public CoreSize PngCore() + public Size PngCore() { using (var memoryStream = new MemoryStream(this.pngBytes)) { diff --git a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs index f40c15cc1..5b783dddc 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs @@ -1,11 +1,11 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using BenchmarkDotNet.Attributes; -using System.Drawing; using System.IO; +using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Tests; +using SDSize = System.Drawing.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg { @@ -26,7 +26,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg } [Benchmark(Baseline = true, Description = "System.Drawing FULL")] - public Size JpegSystemDrawing() + public SDSize JpegSystemDrawing() { using (var memoryStream = new MemoryStream(this.jpegBytes)) { diff --git a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs index 17ad79e58..6a2040afc 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs @@ -1,7 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Drawing; using System.IO; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; @@ -12,8 +11,8 @@ using BenchmarkDotNet.Jobs; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; // ReSharper disable InconsistentNaming namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg @@ -72,7 +71,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg } [Benchmark(Baseline = true, Description = "Decode Jpeg - System.Drawing")] - public Size JpegSystemDrawing() + public SDSize JpegSystemDrawing() { using (var memoryStream = new MemoryStream(this.jpegBytes)) { @@ -84,13 +83,13 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg } [Benchmark(Description = "Decode Jpeg - ImageSharp")] - public CoreSize JpegImageSharp() + public Size JpegImageSharp() { using (var memoryStream = new MemoryStream(this.jpegBytes)) { using (var image = Image.Load(memoryStream, new JpegDecoder { IgnoreMetadata = true })) { - return new CoreSize(image.Width, image.Height); + return new Size(image.Width, image.Height); } } } diff --git a/tests/ImageSharp.Benchmarks/General/Array2D.cs b/tests/ImageSharp.Benchmarks/General/Array2D.cs index 1f8961fcd..fe7fd2090 100644 --- a/tests/ImageSharp.Benchmarks/General/Array2D.cs +++ b/tests/ImageSharp.Benchmarks/General/Array2D.cs @@ -5,7 +5,7 @@ using System; using BenchmarkDotNet.Attributes; -using SixLabors.ImageSharp.Primitives; +using SixLabors.ImageSharp; namespace SixLabors.ImageSharp.Benchmarks.General { diff --git a/tests/ImageSharp.Benchmarks/PixelBlenders/PorterDuffBulkVsPixel.cs b/tests/ImageSharp.Benchmarks/PixelBlenders/PorterDuffBulkVsPixel.cs index ce4e16c44..4241a12f6 100644 --- a/tests/ImageSharp.Benchmarks/PixelBlenders/PorterDuffBulkVsPixel.cs +++ b/tests/ImageSharp.Benchmarks/PixelBlenders/PorterDuffBulkVsPixel.cs @@ -13,7 +13,7 @@ using SixLabors.ImageSharp.PixelFormats.PixelBlenders; namespace SixLabors.ImageSharp.Benchmarks { - using CoreSize = SixLabors.Primitives.Size; + using CoreSize = SixLabors.ImageSharp.Size; public class PorterDuffBulkVsPixel : BenchmarkBase { diff --git a/tests/ImageSharp.Benchmarks/Samplers/Crop.cs b/tests/ImageSharp.Benchmarks/Samplers/Crop.cs index 4fe7a365f..e60ff8f02 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Crop.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Crop.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; @@ -9,14 +9,16 @@ using System.Drawing.Drawing2D; using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.Processing; -using CoreSize = SixLabors.Primitives.Size; +using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; +using SDRectangle = System.Drawing.Rectangle; namespace SixLabors.ImageSharp.Benchmarks { public class Crop : BenchmarkBase { [Benchmark(Baseline = true, Description = "System.Drawing Crop")] - public Size CropSystemDrawing() + public SDSize CropSystemDrawing() { using (var source = new Bitmap(800, 800)) using (var destination = new Bitmap(100, 100)) @@ -25,19 +27,19 @@ namespace SixLabors.ImageSharp.Benchmarks graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; - graphics.DrawImage(source, new Rectangle(0, 0, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel); + graphics.DrawImage(source, new SDRectangle(0, 0, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel); return destination.Size; } } [Benchmark(Description = "ImageSharp Crop")] - public CoreSize CropResizeCore() + public Size CropResizeCore() { using (var image = new Image(800, 800)) { image.Mutate(x => x.Crop(100, 100)); - return new CoreSize(image.Width, image.Height); + return new Size(image.Width, image.Height); } } } diff --git a/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs b/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs index c2b9cdc19..e5b12a0a2 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs @@ -1,7 +1,7 @@ using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; +using SixLabors.ImageSharp; namespace SixLabors.ImageSharp.Benchmarks.Samplers { diff --git a/tests/ImageSharp.Benchmarks/Samplers/Rotate.cs b/tests/ImageSharp.Benchmarks/Samplers/Rotate.cs index 69ff1549b..244a0bb41 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Rotate.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Rotate.cs @@ -4,7 +4,7 @@ using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; +using SixLabors.ImageSharp; namespace SixLabors.ImageSharp.Benchmarks.Samplers { diff --git a/tests/ImageSharp.Benchmarks/Samplers/Skew.cs b/tests/ImageSharp.Benchmarks/Samplers/Skew.cs index 559e49704..4061120b7 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Skew.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Skew.cs @@ -4,7 +4,7 @@ using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; +using SixLabors.ImageSharp; namespace SixLabors.ImageSharp.Benchmarks.Samplers { diff --git a/tests/ImageSharp.Tests/Drawing/DrawImageTests.cs b/tests/ImageSharp.Tests/Drawing/DrawImageTests.cs index 202cd04c9..d1fb54703 100644 --- a/tests/ImageSharp.Tests/Drawing/DrawImageTests.cs +++ b/tests/ImageSharp.Tests/Drawing/DrawImageTests.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Formats/Bmp/BmpFileHeaderTests.cs b/tests/ImageSharp.Tests/Formats/Bmp/BmpFileHeaderTests.cs index 4c3fe3149..ccb57c35f 100644 --- a/tests/ImageSharp.Tests/Formats/Bmp/BmpFileHeaderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Bmp/BmpFileHeaderTests.cs @@ -2,10 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.IO; -using System.Linq; - -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using Xunit; diff --git a/tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs b/tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs index 1e2846910..ba3587a7a 100644 --- a/tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs +++ b/tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs @@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.Tests using System.Reflection; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Quantization; - using SixLabors.Memory; + using SixLabors.ImageSharp.Memory; public class GeneralFormatTests : FileTestBase { diff --git a/tests/ImageSharp.Tests/Formats/Jpg/Block8x8FTests.CopyToBufferArea.cs b/tests/ImageSharp.Tests/Formats/Jpg/Block8x8FTests.CopyToBufferArea.cs index 4b1abf909..6b803c3ae 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/Block8x8FTests.CopyToBufferArea.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/Block8x8FTests.CopyToBufferArea.cs @@ -7,8 +7,6 @@ using SixLabors.ImageSharp.Formats.Jpeg.Components; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Tests.Formats.Jpg.Utils; -using SixLabors.Memory; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs index a9cddebc8..009f86483 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs @@ -6,7 +6,7 @@ using System.IO; using System.Linq; using SixLabors.ImageSharp.Formats.Jpeg; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests.Formats.Jpg.Utils; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; diff --git a/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs index 1d7ca746f..44545092f 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Formats.Jpeg.Components; using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder; using SixLabors.ImageSharp.Tests.Formats.Jpg.Utils; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Formats/Jpg/Utils/LibJpegTools.ComponentData.cs b/tests/ImageSharp.Tests/Formats/Jpg/Utils/LibJpegTools.ComponentData.cs index 91cd80d14..a4929fe80 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/Utils/LibJpegTools.ComponentData.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/Utils/LibJpegTools.ComponentData.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Formats.Jpeg.Components; using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Formats.Jpg.Utils { diff --git a/tests/ImageSharp.Tests/Formats/Jpg/Utils/VerifyJpeg.cs b/tests/ImageSharp.Tests/Formats/Jpg/Utils/VerifyJpeg.cs index 296f424fa..16fd352a9 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/Utils/VerifyJpeg.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/Utils/VerifyJpeg.cs @@ -3,7 +3,6 @@ using System.Linq; using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs b/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs index 817672f34..16a27a9ce 100644 --- a/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs +++ b/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs @@ -4,9 +4,6 @@ using System; using System.Numerics; -using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; - using Xunit; namespace SixLabors.ImageSharp.Tests.Helpers diff --git a/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs b/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs index 4b5c87c7f..93ddaefe6 100644 --- a/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs +++ b/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs @@ -10,8 +10,6 @@ using System.Threading; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs b/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs index 2d5e81173..57e9dbad6 100644 --- a/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs +++ b/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs @@ -4,7 +4,7 @@ using System; using System.IO; using SixLabors.ImageSharp.IO; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; using Xunit; namespace SixLabors.ImageSharp.Tests.IO diff --git a/tests/ImageSharp.Tests/Image/ImageRotationTests.cs b/tests/ImageSharp.Tests/Image/ImageRotationTests.cs index e1c4a419e..28196c0da 100644 --- a/tests/ImageSharp.Tests/Image/ImageRotationTests.cs +++ b/tests/ImageSharp.Tests/Image/ImageRotationTests.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests diff --git a/tests/ImageSharp.Tests/Image/ImageTests.Load_FileSystemPath_UseDefaultConfiguration.cs b/tests/ImageSharp.Tests/Image/ImageTests.Load_FileSystemPath_UseDefaultConfiguration.cs index 4d3a229c5..39795fbf3 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.Load_FileSystemPath_UseDefaultConfiguration.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.Load_FileSystemPath_UseDefaultConfiguration.cs @@ -6,7 +6,6 @@ using System; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Image/ImageTests.Load_FromBytes_UseGlobalConfiguration.cs b/tests/ImageSharp.Tests/Image/ImageTests.Load_FromBytes_UseGlobalConfiguration.cs index 19887d9bc..0632d7440 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.Load_FromBytes_UseGlobalConfiguration.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.Load_FromBytes_UseGlobalConfiguration.cs @@ -6,7 +6,6 @@ using System; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Image/ImageTests.Load_FromStream_UseDefaultConfiguration.cs b/tests/ImageSharp.Tests/Image/ImageTests.Load_FromStream_UseDefaultConfiguration.cs index 980ed17ce..d9d1eb7c4 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.Load_FromStream_UseDefaultConfiguration.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.Load_FromStream_UseDefaultConfiguration.cs @@ -7,7 +7,6 @@ using System.IO; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs b/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs index 04d05f6dc..a018af6ed 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs @@ -11,7 +11,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Common.Helpers; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Processing; using Xunit; // ReSharper disable InconsistentNaming @@ -41,7 +40,7 @@ namespace SixLabors.ImageSharp.Tests } this.bitmap = bitmap; - var rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + var rectangle = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height); this.bmpData = bitmap.LockBits(rectangle, ImageLockMode.ReadWrite, bitmap.PixelFormat); this.length = bitmap.Width * bitmap.Height; } diff --git a/tests/ImageSharp.Tests/ImageInfoTests.cs b/tests/ImageSharp.Tests/ImageInfoTests.cs index 67804a18f..bde5f7b6a 100644 --- a/tests/ImageSharp.Tests/ImageInfoTests.cs +++ b/tests/ImageSharp.Tests/ImageInfoTests.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Metadata; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs index 6495ca21d..d38b5b9dd 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs @@ -9,7 +9,7 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Tests; using Xunit; -namespace SixLabors.Memory.Tests +namespace SixLabors.ImageSharp.Memory.Tests { // TODO: Re-enable memory-intensive tests with arcade RemoteExecutor: // https://github.com/dotnet/runtime/blob/master/docs/project/writing-tests.md#remoteexecutor diff --git a/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs b/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs index fd53db1d8..8073d069d 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs @@ -6,7 +6,7 @@ using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace SixLabors.Memory.Tests +namespace SixLabors.ImageSharp.Memory.Tests { internal static class BufferExtensions { diff --git a/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs b/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs index eca184264..4590bbe97 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs @@ -8,7 +8,7 @@ using System.Runtime.InteropServices; using Xunit; // ReSharper disable InconsistentNaming -namespace SixLabors.Memory.Tests +namespace SixLabors.ImageSharp.Memory.Tests { /// /// Inherit this class to test an implementation (provided by ). diff --git a/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs index a22e9e375..8e3b82be5 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs @@ -5,7 +5,7 @@ using System; using System.Runtime.InteropServices; using Xunit; -namespace SixLabors.Memory.Tests +namespace SixLabors.ImageSharp.Memory.Tests { public class SimpleGcMemoryAllocatorTests { diff --git a/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs b/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs index a0e4f54ac..3b296f926 100644 --- a/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs +++ b/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs @@ -7,8 +7,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs b/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs index 919279862..7c93128b4 100644 --- a/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs +++ b/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; using SixLabors.ImageSharp.Memory; -using SixLabors.Primitives; using Xunit; // ReSharper disable InconsistentNaming diff --git a/tests/ImageSharp.Tests/Memory/MemorySourceTests.cs b/tests/ImageSharp.Tests/Memory/MemorySourceTests.cs index 535204e8d..d940aa987 100644 --- a/tests/ImageSharp.Tests/Memory/MemorySourceTests.cs +++ b/tests/ImageSharp.Tests/Memory/MemorySourceTests.cs @@ -5,7 +5,6 @@ using System; using System.Buffers; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; using Xunit; // ReSharper disable InconsistentNaming diff --git a/tests/ImageSharp.Tests/Metadata/ImageMetadataTests.cs b/tests/ImageSharp.Tests/Metadata/ImageMetadataTests.cs index bdca87ef7..60d791e91 100644 --- a/tests/ImageSharp.Tests/Metadata/ImageMetadataTests.cs +++ b/tests/ImageSharp.Tests/Metadata/ImageMetadataTests.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Metadata/Profiles/Exif/ExifProfileTests.cs b/tests/ImageSharp.Tests/Metadata/Profiles/Exif/ExifProfileTests.cs index 9c86d060a..d2448f3d2 100644 --- a/tests/ImageSharp.Tests/Metadata/Profiles/Exif/ExifProfileTests.cs +++ b/tests/ImageSharp.Tests/Metadata/Profiles/Exif/ExifProfileTests.cs @@ -2,16 +2,13 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Reflection; using System.Text; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Metadata/Profiles/Exif/Values/ExifValuesTests.cs b/tests/ImageSharp.Tests/Metadata/Profiles/Exif/Values/ExifValuesTests.cs index d015fefc4..5d8770acf 100644 --- a/tests/ImageSharp.Tests/Metadata/Profiles/Exif/Values/ExifValuesTests.cs +++ b/tests/ImageSharp.Tests/Metadata/Profiles/Exif/Values/ExifValuesTests.cs @@ -1,5 +1,4 @@ using SixLabors.ImageSharp.Metadata.Profiles.Exif; -using SixLabors.ImageSharp.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Metadata.Profiles.Exif.Values diff --git a/tests/ImageSharp.Tests/Metadata/Profiles/ICC/DataWriter/IccDataWriter.MatrixTests.cs b/tests/ImageSharp.Tests/Metadata/Profiles/ICC/DataWriter/IccDataWriter.MatrixTests.cs index 15bf762e2..3667fda14 100644 --- a/tests/ImageSharp.Tests/Metadata/Profiles/ICC/DataWriter/IccDataWriter.MatrixTests.cs +++ b/tests/ImageSharp.Tests/Metadata/Profiles/ICC/DataWriter/IccDataWriter.MatrixTests.cs @@ -8,7 +8,7 @@ using Xunit; namespace SixLabors.ImageSharp.Tests.Icc { - using SixLabors.ImageSharp.Primitives; + using SixLabors.ImageSharp; public class IccDataWriterMatrixTests { diff --git a/tests/ImageSharp.Tests/Numerics/RationalTests.cs b/tests/ImageSharp.Tests/Numerics/RationalTests.cs index 7cdae7f60..7b3bd86fc 100644 --- a/tests/ImageSharp.Tests/Numerics/RationalTests.cs +++ b/tests/ImageSharp.Tests/Numerics/RationalTests.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - using Xunit; namespace SixLabors.ImageSharp.Tests diff --git a/tests/ImageSharp.Tests/Numerics/SignedRationalTests.cs b/tests/ImageSharp.Tests/Numerics/SignedRationalTests.cs index f828cf74f..2931ab391 100644 --- a/tests/ImageSharp.Tests/Numerics/SignedRationalTests.cs +++ b/tests/ImageSharp.Tests/Numerics/SignedRationalTests.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - using Xunit; namespace SixLabors.ImageSharp.Tests diff --git a/tests/ImageSharp.Tests/Primitives/ColorMatrixTests.cs b/tests/ImageSharp.Tests/Primitives/ColorMatrixTests.cs index 2fbe260ec..80fcb4370 100644 --- a/tests/ImageSharp.Tests/Primitives/ColorMatrixTests.cs +++ b/tests/ImageSharp.Tests/Primitives/ColorMatrixTests.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing; using Xunit; diff --git a/tests/ImageSharp.Tests/Primitives/DenseMatrixTests.cs b/tests/ImageSharp.Tests/Primitives/DenseMatrixTests.cs index d684198fa..3e37cb30b 100644 --- a/tests/ImageSharp.Tests/Primitives/DenseMatrixTests.cs +++ b/tests/ImageSharp.Tests/Primitives/DenseMatrixTests.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Primitives diff --git a/tests/ImageSharp.Tests/Primitives/PointFTests.cs b/tests/ImageSharp.Tests/Primitives/PointFTests.cs index f02433d9a..2bb4cc6dd 100644 --- a/tests/ImageSharp.Tests/Primitives/PointFTests.cs +++ b/tests/ImageSharp.Tests/Primitives/PointFTests.cs @@ -4,12 +4,10 @@ using System; using System.Globalization; using System.Numerics; -using System.Reflection; using System.Runtime.CompilerServices; -using SixLabors.ImageSharp.Tests; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { public class PointFTests { diff --git a/tests/ImageSharp.Tests/Primitives/PointTests.cs b/tests/ImageSharp.Tests/Primitives/PointTests.cs index 7ad7f0b62..8e86c7218 100644 --- a/tests/ImageSharp.Tests/Primitives/PointTests.cs +++ b/tests/ImageSharp.Tests/Primitives/PointTests.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.Numerics; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { public class PointTests { diff --git a/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs b/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs index f83f6435a..f0ba75716 100644 --- a/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs +++ b/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs @@ -3,10 +3,9 @@ using System; using System.Globalization; -using System.Reflection; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { /// /// Tests the struct. diff --git a/tests/ImageSharp.Tests/Primitives/RectangleTests.cs b/tests/ImageSharp.Tests/Primitives/RectangleTests.cs index 84b15d36e..acfbe9e61 100644 --- a/tests/ImageSharp.Tests/Primitives/RectangleTests.cs +++ b/tests/ImageSharp.Tests/Primitives/RectangleTests.cs @@ -5,7 +5,7 @@ using System; using System.Globalization; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { /// /// Tests the struct. diff --git a/tests/ImageSharp.Tests/Primitives/SizeFTests.cs b/tests/ImageSharp.Tests/Primitives/SizeFTests.cs index 5bfc8f5ef..8cda5d4eb 100644 --- a/tests/ImageSharp.Tests/Primitives/SizeFTests.cs +++ b/tests/ImageSharp.Tests/Primitives/SizeFTests.cs @@ -3,10 +3,9 @@ using System; using System.Globalization; -using System.Reflection; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { public class SizeFTests { diff --git a/tests/ImageSharp.Tests/Primitives/SizeTests.cs b/tests/ImageSharp.Tests/Primitives/SizeTests.cs index af4b8430d..4aea06036 100644 --- a/tests/ImageSharp.Tests/Primitives/SizeTests.cs +++ b/tests/ImageSharp.Tests/Primitives/SizeTests.cs @@ -5,7 +5,7 @@ using System; using System.Globalization; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { /// /// Tests the struct. @@ -376,4 +376,4 @@ namespace SixLabors.Primitives.Tests Assert.Equal(height, deconstructedHeight); } } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Tests/Processing/BaseImageOperationsExtensionTest.cs b/tests/ImageSharp.Tests/Processing/BaseImageOperationsExtensionTest.cs index e97978198..82c22245d 100644 --- a/tests/ImageSharp.Tests/Processing/BaseImageOperationsExtensionTest.cs +++ b/tests/ImageSharp.Tests/Processing/BaseImageOperationsExtensionTest.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Binarization/OrderedDitherFactoryTests.cs b/tests/ImageSharp.Tests/Processing/Binarization/OrderedDitherFactoryTests.cs index c98f91046..680db5a15 100644 --- a/tests/ImageSharp.Tests/Processing/Binarization/OrderedDitherFactoryTests.cs +++ b/tests/ImageSharp.Tests/Processing/Binarization/OrderedDitherFactoryTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Dithering; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Convolution/Processors/LaplacianKernelFactoryTests.cs b/tests/ImageSharp.Tests/Processing/Convolution/Processors/LaplacianKernelFactoryTests.cs index 8b3524fe6..7dc0ff567 100644 --- a/tests/ImageSharp.Tests/Processing/Convolution/Processors/LaplacianKernelFactoryTests.cs +++ b/tests/ImageSharp.Tests/Processing/Convolution/Processors/LaplacianKernelFactoryTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Convolution; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs b/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs index aecac22c0..bd7c0245b 100644 --- a/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs +++ b/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs @@ -6,7 +6,6 @@ using System.Linq; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing { diff --git a/tests/ImageSharp.Tests/Processing/ImageProcessingContextTests.cs b/tests/ImageSharp.Tests/Processing/ImageProcessingContextTests.cs index 6c2a142af..1c6a1c7dd 100644 --- a/tests/ImageSharp.Tests/Processing/ImageProcessingContextTests.cs +++ b/tests/ImageSharp.Tests/Processing/ImageProcessingContextTests.cs @@ -5,7 +5,6 @@ using Moq; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing diff --git a/tests/ImageSharp.Tests/Processing/Overlays/GlowTest.cs b/tests/ImageSharp.Tests/Processing/Overlays/GlowTest.cs index 32c4c6fe7..f7d6eba97 100644 --- a/tests/ImageSharp.Tests/Processing/Overlays/GlowTest.cs +++ b/tests/ImageSharp.Tests/Processing/Overlays/GlowTest.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Overlays; using SixLabors.ImageSharp.Tests.TestUtilities; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Overlays diff --git a/tests/ImageSharp.Tests/Processing/Overlays/VignetteTest.cs b/tests/ImageSharp.Tests/Processing/Overlays/VignetteTest.cs index ebf4fee31..da11edf73 100644 --- a/tests/ImageSharp.Tests/Processing/Overlays/VignetteTest.cs +++ b/tests/ImageSharp.Tests/Processing/Overlays/VignetteTest.cs @@ -1,11 +1,9 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Overlays; using SixLabors.ImageSharp.Tests.TestUtilities; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Overlays diff --git a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs index d3507ed4c..13be1dd2d 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Dithering; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; // ReSharper disable InconsistentNaming diff --git a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryThresholdTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryThresholdTest.cs index 4ae5d6051..4fe501237 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryThresholdTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryThresholdTest.cs @@ -3,8 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; - -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Binarization diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/Basic1ParameterConvolutionTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/Basic1ParameterConvolutionTests.cs index 0a10d0755..05595eece 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/Basic1ParameterConvolutionTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/Basic1ParameterConvolutionTests.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/BokehBlurTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/BokehBlurTest.cs index cf97ae4af..cd3f74f8e 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/BokehBlurTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/BokehBlurTest.cs @@ -8,10 +8,8 @@ using System.Linq; using System.Text.RegularExpressions; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/BoxBlurTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/BoxBlurTest.cs index a7cf9360c..66e9ba2df 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/BoxBlurTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/BoxBlurTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs index 05524b20b..0e8013a64 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; // ReSharper disable InconsistentNaming diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianBlurTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianBlurTest.cs index 24ed090d8..d1a3baa5a 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianBlurTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianBlurTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianSharpenTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianSharpenTest.cs index 96d223ee9..535520cb8 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianSharpenTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianSharpenTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Filters/FilterTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Filters/FilterTest.cs index 68daa80ea..eca3da58a 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Filters/FilterTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Filters/FilterTest.cs @@ -7,7 +7,7 @@ using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Filters { - using SixLabors.ImageSharp.Primitives; + using SixLabors.ImageSharp; using SixLabors.ImageSharp.Processing; [GroupOutput("Filters")] diff --git a/tests/ImageSharp.Tests/Processing/Processors/Overlays/GlowTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Overlays/GlowTest.cs index 5462a8b2d..e6a960f9e 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Overlays/GlowTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Overlays/GlowTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Overlays { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Overlays/OverlayTestBase.cs b/tests/ImageSharp.Tests/Processing/Processors/Overlays/OverlayTestBase.cs index c1c6bbd7c..0c09b6872 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Overlays/OverlayTestBase.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Overlays/OverlayTestBase.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Overlays/VignetteTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Overlays/VignetteTest.cs index 9448feefe..470f48f78 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Overlays/VignetteTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Overlays/VignetteTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Overlays { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/CropTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/CropTest.cs index 50217e892..b49ac3ea9 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/CropTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/CropTest.cs @@ -6,7 +6,6 @@ using System; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeHelperTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeHelperTests.cs index b351ec235..cdc96f042 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeHelperTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeHelperTests.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index c683a51dc..763db47f9 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -12,7 +12,6 @@ using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; using SixLabors.ImageSharp.Tests.Memory; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs index 70159e18a..42017f3af 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs @@ -3,7 +3,6 @@ using System.Numerics; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Transforms { diff --git a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs index ed6d3ef2b..1c63d923a 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Processing/Transforms/CropTest.cs b/tests/ImageSharp.Tests/Processing/Transforms/CropTest.cs index 5350bd4a3..edf6a6440 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/CropTest.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/CropTest.cs @@ -5,7 +5,6 @@ using System; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Transforms diff --git a/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs index d82cd1689..309a73fb4 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs @@ -3,7 +3,6 @@ using System.Numerics; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Transforms { diff --git a/tests/ImageSharp.Tests/Processing/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/ResizeTests.cs index f268eda86..f87e17e06 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/ResizeTests.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Transforms diff --git a/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs b/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs index 71e3b7179..c13d4affd 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs @@ -4,7 +4,6 @@ using System; using System.Numerics; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/TestDataIcc/IccTestDataMatrix.cs b/tests/ImageSharp.Tests/TestDataIcc/IccTestDataMatrix.cs index 799794ca4..c8ddc8f75 100644 --- a/tests/ImageSharp.Tests/TestDataIcc/IccTestDataMatrix.cs +++ b/tests/ImageSharp.Tests/TestDataIcc/IccTestDataMatrix.cs @@ -5,7 +5,7 @@ using System.Numerics; namespace SixLabors.ImageSharp.Tests { - using SixLabors.ImageSharp.Primitives; + using SixLabors.ImageSharp; internal static class IccTestDataMatrix { diff --git a/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs index 872a935ff..2ed4d9382 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Numerics; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Tests { diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ExactImageComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ExactImageComparer.cs index 59167cc88..f5f709ce8 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ExactImageComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ExactImageComparer.cs @@ -3,8 +3,6 @@ using System.Collections.Generic; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { public class ExactImageComparer : ImageComparer diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/Exceptions/ImageDimensionsMismatchException.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/Exceptions/ImageDimensionsMismatchException.cs index 024c2ee21..c44b89568 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/Exceptions/ImageDimensionsMismatchException.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/Exceptions/ImageDimensionsMismatchException.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { public class ImageDimensionsMismatchException : ImagesSimilarityException diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs index 38dada063..95b3eb024 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs @@ -6,8 +6,6 @@ using System.Collections.Generic; using System.Linq; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { public abstract class ImageComparer diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/PixelDifference.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/PixelDifference.cs index 1ffeb60ad..30380218c 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/PixelDifference.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/PixelDifference.cs @@ -1,5 +1,4 @@ using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs index 8bed3a715..cbcc6b845 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs @@ -5,8 +5,6 @@ using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { public class TolerantImageComparer : ImageComparer diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageProviders/SolidProvider.cs b/tests/ImageSharp.Tests/TestUtilities/ImageProviders/SolidProvider.cs index e44de307f..7da9707ef 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageProviders/SolidProvider.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageProviders/SolidProvider.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Processing; using Xunit.Abstractions; namespace SixLabors.ImageSharp.Tests diff --git a/tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs b/tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs index 79c19f2be..1547edeeb 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -29,7 +29,7 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs int w = bmp.Width; int h = bmp.Height; - var fullRect = new Rectangle(0, 0, w, h); + var fullRect = new System.Drawing.Rectangle(0, 0, w, h); if (bmp.PixelFormat != PixelFormat.Format32bppArgb) { @@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs int w = bmp.Width; int h = bmp.Height; - var fullRect = new Rectangle(0, 0, w, h); + var fullRect = new System.Drawing.Rectangle(0, 0, w, h); if (bmp.PixelFormat != PixelFormat.Format24bppRgb) { @@ -139,7 +139,7 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs int h = image.Height; var resultBitmap = new Bitmap(w, h, PixelFormat.Format32bppArgb); - var fullRect = new Rectangle(0, 0, w, h); + var fullRect = new System.Drawing.Rectangle(0, 0, w, h); BitmapData data = resultBitmap.LockBits(fullRect, ImageLockMode.ReadWrite, resultBitmap.PixelFormat); try { @@ -171,4 +171,4 @@ namespace SixLabors.ImageSharp.Tests.TestUtilities.ReferenceCodecs return resultBitmap; } } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs b/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs index f2bb7bdee..dcbc4f0c3 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs @@ -14,7 +14,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/TestUtilities/TestMemoryAllocator.cs b/tests/ImageSharp.Tests/TestUtilities/TestMemoryAllocator.cs index e1209a0c6..fcda2eaa1 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestMemoryAllocator.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestMemoryAllocator.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Numerics; using System.Runtime.InteropServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Tests.Memory { diff --git a/tests/ImageSharp.Tests/TestUtilities/TestUtils.cs b/tests/ImageSharp.Tests/TestUtilities/TestUtils.cs index a6ca00899..9ac8054ea 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestUtils.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestUtils.cs @@ -12,7 +12,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests { diff --git a/tests/ImageSharp.Tests/TestUtilities/Tests/ImageComparerTests.cs b/tests/ImageSharp.Tests/TestUtilities/Tests/ImageComparerTests.cs index 61db99298..97c87d486 100644 --- a/tests/ImageSharp.Tests/TestUtilities/Tests/ImageComparerTests.cs +++ b/tests/ImageSharp.Tests/TestUtilities/Tests/ImageComparerTests.cs @@ -6,7 +6,6 @@ using Moq; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/TestUtilities/Tests/TestEnvironmentTests.cs b/tests/ImageSharp.Tests/TestUtilities/Tests/TestEnvironmentTests.cs index 07523f617..30a47062b 100644 --- a/tests/ImageSharp.Tests/TestUtilities/Tests/TestEnvironmentTests.cs +++ b/tests/ImageSharp.Tests/TestUtilities/Tests/TestEnvironmentTests.cs @@ -3,8 +3,6 @@ using System; using System.IO; - -using SixLabors.ImageSharp.Common.Helpers; using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.Formats.Gif; From 815aeb1ca525c09d4a7bec09cdd7cf26849bbec0 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 20 Jan 2020 21:13:49 +1100 Subject: [PATCH 136/136] Remove duplicate Constants --- src/ImageSharp/Constants.cs | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 src/ImageSharp/Constants.cs diff --git a/src/ImageSharp/Constants.cs b/src/ImageSharp/Constants.cs deleted file mode 100644 index b8699e2d1..000000000 --- a/src/ImageSharp/Constants.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors -{ - /// - /// Common constants used throughout the project. - /// - internal static class Constants - { - /// - /// The epsilon for comparing floating point numbers. - /// - public static readonly float Epsilon = 0.001f; - } -} \ No newline at end of file